@secrecy/lib 1.0.0-dev.9 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/dist/BaseClient.d.ts +111 -0
  4. package/dist/BaseClient.js +506 -0
  5. package/{lib → dist}/PopupTools.d.ts +4 -4
  6. package/dist/PopupTools.js +195 -0
  7. package/{lib → dist}/ZeusThunder.d.ts +0 -0
  8. package/dist/ZeusThunder.js +65 -0
  9. package/dist/cache.d.ts +6 -0
  10. package/dist/cache.js +4 -0
  11. package/dist/client/SecrecyAppClient.d.ts +17 -0
  12. package/dist/client/SecrecyAppClient.js +226 -0
  13. package/dist/client/SecrecyCloudClient.d.ts +89 -0
  14. package/dist/client/SecrecyCloudClient.js +1405 -0
  15. package/dist/client/SecrecyDbClient.d.ts +21 -0
  16. package/dist/client/SecrecyDbClient.js +177 -0
  17. package/dist/client/SecrecyMailClient.d.ts +42 -0
  18. package/dist/client/SecrecyMailClient.js +1022 -0
  19. package/dist/client/SecrecyPayClient.d.ts +28 -0
  20. package/dist/client/SecrecyPayClient.js +68 -0
  21. package/dist/client/SecrecyWalletClient.d.ts +30 -0
  22. package/dist/client/SecrecyWalletClient.js +73 -0
  23. package/{lib → dist}/client/convert/file.d.ts +3 -3
  24. package/dist/client/convert/file.js +33 -0
  25. package/dist/client/convert/mail.d.ts +3 -0
  26. package/dist/client/convert/mail.js +42 -0
  27. package/dist/client/convert/node.d.ts +9 -0
  28. package/dist/client/convert/node.js +87 -0
  29. package/{lib → dist}/client/helpers.d.ts +9 -4
  30. package/dist/client/helpers.js +119 -0
  31. package/dist/client/index.d.ts +34 -0
  32. package/dist/client/index.js +46 -0
  33. package/{lib → dist}/client/storage.d.ts +0 -0
  34. package/dist/client/storage.js +12 -0
  35. package/dist/client/types/File.d.ts +14 -0
  36. package/dist/client/types/File.js +3 -0
  37. package/dist/client/types/Inputs.d.ts +16 -0
  38. package/dist/client/types/Inputs.js +3 -0
  39. package/dist/client/types/Node.d.ts +56 -0
  40. package/dist/client/types/Node.js +3 -0
  41. package/dist/client/types/UserAppNotifications.d.ts +6 -0
  42. package/dist/client/types/UserAppNotifications.js +3 -0
  43. package/dist/client/types/UserAppSettings.d.ts +5 -0
  44. package/dist/client/types/UserAppSettings.js +3 -0
  45. package/{lib → dist}/client/types/index.d.ts +25 -59
  46. package/dist/client/types/index.js +8 -0
  47. package/dist/client/types/selectors.d.ts +400 -0
  48. package/dist/client/types/selectors.js +135 -0
  49. package/{lib → dist}/crypto/file.d.ts +2 -2
  50. package/dist/crypto/file.js +195 -0
  51. package/{lib → dist}/crypto/index.d.ts +0 -0
  52. package/dist/crypto/index.js +45 -0
  53. package/dist/error.d.ts +33 -0
  54. package/dist/error.js +3 -0
  55. package/dist/index.d.ts +14 -0
  56. package/dist/index.js +10 -0
  57. package/{lib → dist}/minify/index.d.ts +0 -0
  58. package/dist/minify/index.js +23 -0
  59. package/{lib → dist}/minify/lz4.d.ts +0 -0
  60. package/dist/minify/lz4.js +539 -0
  61. package/{lib → dist}/sodium.d.ts +0 -0
  62. package/dist/sodium.js +6 -0
  63. package/{lib → dist}/utils/store-buddy.d.ts +1 -1
  64. package/dist/utils/store-buddy.js +58 -0
  65. package/{lib → dist}/utils/time.d.ts +0 -0
  66. package/dist/utils/time.js +12 -0
  67. package/{lib → dist/utils}/utils.d.ts +0 -0
  68. package/dist/utils/utils.js +47 -0
  69. package/{lib → dist}/worker/md5.d.ts +0 -0
  70. package/dist/worker/md5.js +24 -0
  71. package/{lib → dist}/worker/sodium.d.ts +0 -0
  72. package/dist/worker/sodium.js +118 -0
  73. package/{lib → dist}/worker/workerCodes.d.ts +0 -0
  74. package/dist/worker/workerCodes.js +255 -0
  75. package/{lib → dist}/zeus/const.d.ts +5 -0
  76. package/dist/zeus/const.js +1679 -0
  77. package/dist/zeus/index.d.ts +7941 -0
  78. package/dist/zeus/index.js +599 -0
  79. package/package.json +64 -54
  80. package/lib/BaseClient.d.ts +0 -266
  81. package/lib/BaseClient.js +0 -1332
  82. package/lib/PopupTools.js +0 -213
  83. package/lib/ZeusThunder.js +0 -115
  84. package/lib/cache.d.ts +0 -7
  85. package/lib/cache.js +0 -5
  86. package/lib/client/admin/index.d.ts +0 -10
  87. package/lib/client/admin/index.js +0 -145
  88. package/lib/client/convert/file.js +0 -39
  89. package/lib/client/convert/folder.d.ts +0 -8
  90. package/lib/client/convert/folder.js +0 -264
  91. package/lib/client/convert/mail.d.ts +0 -3
  92. package/lib/client/convert/mail.js +0 -46
  93. package/lib/client/convert/vFile.d.ts +0 -5
  94. package/lib/client/convert/vFile.js +0 -164
  95. package/lib/client/helpers.js +0 -116
  96. package/lib/client/index.d.ts +0 -169
  97. package/lib/client/index.js +0 -3803
  98. package/lib/client/storage.js +0 -12
  99. package/lib/client/types/File.d.ts +0 -21
  100. package/lib/client/types/File.js +0 -2
  101. package/lib/client/types/FilesOnUsersOnApplications.d.ts +0 -9
  102. package/lib/client/types/FilesOnUsersOnApplications.js +0 -2
  103. package/lib/client/types/Folder.d.ts +0 -68
  104. package/lib/client/types/Folder.js +0 -7
  105. package/lib/client/types/Inputs.d.ts +0 -21
  106. package/lib/client/types/Inputs.js +0 -2
  107. package/lib/client/types/UserAppNotifications.d.ts +0 -6
  108. package/lib/client/types/UserAppNotifications.js +0 -2
  109. package/lib/client/types/UserAppSettings.d.ts +0 -7
  110. package/lib/client/types/UserAppSettings.js +0 -2
  111. package/lib/client/types/VFile.d.ts +0 -62
  112. package/lib/client/types/VFile.js +0 -4
  113. package/lib/client/types/index.js +0 -9
  114. package/lib/client/types/queries.d.ts +0 -535
  115. package/lib/client/types/queries.js +0 -192
  116. package/lib/crypto/file.js +0 -291
  117. package/lib/crypto/index.js +0 -37
  118. package/lib/index.d.ts +0 -12
  119. package/lib/index.js +0 -41
  120. package/lib/minify/index.js +0 -28
  121. package/lib/minify/lz4.js +0 -633
  122. package/lib/sodium.js +0 -28
  123. package/lib/utils/store-buddy.js +0 -69
  124. package/lib/utils/time.js +0 -22
  125. package/lib/utils.js +0 -188
  126. package/lib/worker/__mock__/sodium.worker.d.ts +0 -19
  127. package/lib/worker/__mock__/sodium.worker.js +0 -57
  128. package/lib/worker/md5.js +0 -43
  129. package/lib/worker/sodium.js +0 -155
  130. package/lib/worker/workerCodes.js +0 -3
  131. package/lib/zeus/const.js +0 -1671
  132. package/lib/zeus/index.d.ts +0 -33302
  133. package/lib/zeus/index.js +0 -558
@@ -1,3803 +0,0 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
- import _createClass from "@babel/runtime/helpers/createClass";
3
- import _assertThisInitialized from "@babel/runtime/helpers/assertThisInitialized";
4
- import _inheritsLoose from "@babel/runtime/helpers/inheritsLoose";
5
- import _classPrivateFieldLooseBase from "@babel/runtime/helpers/classPrivateFieldLooseBase";
6
- import _classPrivateFieldLooseKey from "@babel/runtime/helpers/classPrivateFieldLooseKey";
7
- import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
8
-
9
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
10
-
11
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
12
-
13
- function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
14
-
15
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
16
-
17
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
18
-
19
- import _regeneratorRuntime from "@babel/runtime/regenerator";
20
- import ky from "ky";
21
- import axios from "axios";
22
- import { BaseClient } from "../BaseClient.js";
23
- import { vFilesCache, foldersCache, filesCache, usersCache } from "../cache.js";
24
- import { secretstreamKeygen, encryptSecretstream } from "../crypto/file.js";
25
- import { compress, uncompress } from "../minify/index.js";
26
- import { gqlFolderToExternal, gqlFolderToExternalFolderFull } from "./convert/folder.js";
27
- import { gqlVFileToExternal, gqlVFileToInternal, internalVFileToVFile } from "./convert/vFile.js";
28
- import { gqlFileToExternal } from "./convert/file.js";
29
- import { sodium } from "../sodium.js";
30
- import { decryptCryptoBox, encryptCryptoBox } from "../crypto/index.js";
31
- import { generate } from "shortid";
32
- import { md5 } from "../worker/md5.js";
33
- import { encrypt, decrypt } from "../worker/sodium.js";
34
- import { chunks, concatenate, enumerate, promiseAllLimit } from "../utils.js";
35
- import { gqlFileQuery, gqlFolderQuery, gqlFolderFullQuery, gqlMailQuery, gqlVFileQuery, gqlVFileWithFolderQuery } from "./types/queries.js";
36
- import { convertInternalMailToExternal } from "./convert/mail.js"; // import { md5 } from "../worker/index.js";
37
- // import { firstValueFrom, of } from "rxjs";
38
-
39
- var encryptName = /*#__PURE__*/function () {
40
- var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(name, nameKey) {
41
- var _yield$encryptSecrets, data, nameEncrypted;
42
-
43
- return _regeneratorRuntime.wrap(function _callee$(_context) {
44
- while (1) {
45
- switch (_context.prev = _context.next) {
46
- case 0:
47
- _context.next = 2;
48
- return encryptSecretstream(sodium.from_hex(nameKey), sodium.from_string(name));
49
-
50
- case 2:
51
- _yield$encryptSecrets = _context.sent;
52
- data = _yield$encryptSecrets.data;
53
- nameEncrypted = sodium.to_hex(data);
54
- return _context.abrupt("return", nameEncrypted);
55
-
56
- case 6:
57
- case "end":
58
- return _context.stop();
59
- }
60
- }
61
- }, _callee);
62
- }));
63
-
64
- return function encryptName(_x, _x2) {
65
- return _ref.apply(this, arguments);
66
- };
67
- }();
68
-
69
- var _keys = /*#__PURE__*/_classPrivateFieldLooseKey("keys");
70
-
71
- export var SecrecyClient = /*#__PURE__*/function (_BaseClient) {
72
- _inheritsLoose(SecrecyClient, _BaseClient);
73
-
74
- function SecrecyClient(uaSession, uaKeys, uaJwt, env) {
75
- var _this;
76
-
77
- _this = _BaseClient.call(this, uaSession, env) || this;
78
- _this.jwt = void 0;
79
- Object.defineProperty(_assertThisInitialized(_this), _keys, {
80
- writable: true,
81
- value: void 0
82
- });
83
-
84
- _this.perFolder = /*#__PURE__*/function () {
85
- var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(folderId, publicKey) {
86
- var _folder$userApp;
87
-
88
- var folder;
89
- return _regeneratorRuntime.wrap(function _callee2$(_context2) {
90
- while (1) {
91
- switch (_context2.prev = _context2.next) {
92
- case 0:
93
- folder = foldersCache.get(folderId);
94
-
95
- if (folder) {
96
- _context2.next = 7;
97
- break;
98
- }
99
-
100
- _context2.next = 4;
101
- return _this.folder({
102
- id: folderId
103
- });
104
-
105
- case 4:
106
- folder = foldersCache.get(folderId);
107
-
108
- if (folder) {
109
- _context2.next = 7;
110
- break;
111
- }
112
-
113
- return _context2.abrupt("return", null);
114
-
115
- case 7:
116
- if ((_folder$userApp = folder.userApp) != null && _folder$userApp.nameKey) {
117
- _context2.next = 9;
118
- break;
119
- }
120
-
121
- return _context2.abrupt("return", null);
122
-
123
- case 9:
124
- return _context2.abrupt("return", {
125
- id: folderId,
126
- nameKey: sodium.to_hex(encryptCryptoBox(sodium.from_hex(folder.userApp.nameKey), publicKey, _classPrivateFieldLooseBase(_assertThisInitialized(_this), _keys)[_keys].privateKey))
127
- });
128
-
129
- case 10:
130
- case "end":
131
- return _context2.stop();
132
- }
133
- }
134
- }, _callee2);
135
- }));
136
-
137
- return function (_x3, _x4) {
138
- return _ref2.apply(this, arguments);
139
- };
140
- }();
141
-
142
- _this.perVFile = /*#__PURE__*/function () {
143
- var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(vFileId, publicKey) {
144
- var vFile;
145
- return _regeneratorRuntime.wrap(function _callee3$(_context3) {
146
- while (1) {
147
- switch (_context3.prev = _context3.next) {
148
- case 0:
149
- vFile = vFilesCache.get(vFileId);
150
-
151
- if (vFile) {
152
- _context3.next = 7;
153
- break;
154
- }
155
-
156
- _context3.next = 4;
157
- return _this.vFile({
158
- id: vFileId
159
- });
160
-
161
- case 4:
162
- vFile = vFilesCache.get(vFileId);
163
-
164
- if (vFile) {
165
- _context3.next = 7;
166
- break;
167
- }
168
-
169
- return _context3.abrupt("return", null);
170
-
171
- case 7:
172
- return _context3.abrupt("return", {
173
- id: vFile.id,
174
- nameKey: sodium.to_hex(encryptCryptoBox(sodium.from_hex(vFile.userApp.nameKey), publicKey, _classPrivateFieldLooseBase(_assertThisInitialized(_this), _keys)[_keys].privateKey)),
175
- files: vFile.history.map(function (f) {
176
- return {
177
- id: f.id,
178
- key: sodium.to_hex(encryptCryptoBox(sodium.from_hex(f.user.key), publicKey, _classPrivateFieldLooseBase(_assertThisInitialized(_this), _keys)[_keys].privateKey))
179
- };
180
- })
181
- });
182
-
183
- case 8:
184
- case "end":
185
- return _context3.stop();
186
- }
187
- }
188
- }, _callee3);
189
- }));
190
-
191
- return function (_x5, _x6) {
192
- return _ref3.apply(this, arguments);
193
- };
194
- }();
195
-
196
- _this._eachUser = /*#__PURE__*/function () {
197
- var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(files, subject, body, idOrMail) {
198
- var u, _yield$_this$user, recipientsFiles, _iterator, _step, _fileInHistory$user, f, fileInHistory, key;
199
-
200
- return _regeneratorRuntime.wrap(function _callee4$(_context4) {
201
- while (1) {
202
- switch (_context4.prev = _context4.next) {
203
- case 0:
204
- u = usersCache.get(idOrMail);
205
-
206
- if (!(!u || !("publicKey" in u))) {
207
- _context4.next = 13;
208
- break;
209
- }
210
-
211
- _context4.next = 4;
212
- return _this.user({
213
- userId: idOrMail,
214
- withPublicKey: true
215
- });
216
-
217
- case 4:
218
- _context4.t0 = _yield$_this$user = _context4.sent;
219
-
220
- if (!(_context4.t0 != null)) {
221
- _context4.next = 9;
222
- break;
223
- }
224
-
225
- _context4.t1 = _yield$_this$user;
226
- _context4.next = 10;
227
- break;
228
-
229
- case 9:
230
- _context4.t1 = undefined;
231
-
232
- case 10:
233
- u = _context4.t1;
234
-
235
- if (u) {
236
- _context4.next = 13;
237
- break;
238
- }
239
-
240
- return _context4.abrupt("return", null);
241
-
242
- case 13:
243
- if ("publicKey" in u) {
244
- _context4.next = 15;
245
- break;
246
- }
247
-
248
- throw new Error("User " + idOrMail + " have no public key");
249
-
250
- case 15:
251
- recipientsFiles = new Array();
252
- _iterator = _createForOfIteratorHelperLoose(files);
253
-
254
- case 17:
255
- if ((_step = _iterator()).done) {
256
- _context4.next = 32;
257
- break;
258
- }
259
-
260
- f = _step.value;
261
- fileInHistory = filesCache.get(f.id);
262
-
263
- if (fileInHistory) {
264
- _context4.next = 26;
265
- break;
266
- }
267
-
268
- _context4.next = 23;
269
- return _this.file({
270
- id: f.id
271
- });
272
-
273
- case 23:
274
- fileInHistory = filesCache.get(f.id);
275
-
276
- if (fileInHistory) {
277
- _context4.next = 26;
278
- break;
279
- }
280
-
281
- throw new Error("File " + f.name + " (" + f.id + ") does not exists");
282
-
283
- case 26:
284
- key = (_fileInHistory$user = fileInHistory.user) == null ? void 0 : _fileInHistory$user.key;
285
-
286
- if (key) {
287
- _context4.next = 29;
288
- break;
289
- }
290
-
291
- return _context4.abrupt("continue", 30);
292
-
293
- case 29:
294
- recipientsFiles.push({
295
- id: f.id,
296
- name: sodium.to_hex(encryptCryptoBox(sodium.from_string(f.name), u.publicKey, _classPrivateFieldLooseBase(_assertThisInitialized(_this), _keys)[_keys].privateKey)),
297
- fileKey: sodium.to_hex(encryptCryptoBox(sodium.from_hex(key), u.publicKey, _classPrivateFieldLooseBase(_assertThisInitialized(_this), _keys)[_keys].privateKey))
298
- });
299
-
300
- case 30:
301
- _context4.next = 17;
302
- break;
303
-
304
- case 32:
305
- return _context4.abrupt("return", {
306
- recipientId: u.id,
307
- body: sodium.to_hex(encryptCryptoBox(sodium.from_string(body), u.publicKey, _classPrivateFieldLooseBase(_assertThisInitialized(_this), _keys)[_keys].privateKey)),
308
- subject: sodium.to_hex(encryptCryptoBox(sodium.from_string(subject), u.publicKey, _classPrivateFieldLooseBase(_assertThisInitialized(_this), _keys)[_keys].privateKey)),
309
- files: recipientsFiles
310
- });
311
-
312
- case 33:
313
- case "end":
314
- return _context4.stop();
315
- }
316
- }
317
- }, _callee4);
318
- }));
319
-
320
- return function (_x7, _x8, _x9, _x10) {
321
- return _ref4.apply(this, arguments);
322
- };
323
- }();
324
-
325
- _this.jwt = uaJwt;
326
- _classPrivateFieldLooseBase(_assertThisInitialized(_this), _keys)[_keys] = uaKeys;
327
- return _this;
328
- }
329
-
330
- var _proto = SecrecyClient.prototype;
331
-
332
- _proto.addFileToHistory = /*#__PURE__*/function () {
333
- var _addFileToHistory = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5(_ref5) {
334
- var _this2 = this;
335
-
336
- var fileId, vFileId, _yield$this$client$mu, addFileToHistory, vFile, file, users, input;
337
-
338
- return _regeneratorRuntime.wrap(function _callee5$(_context5) {
339
- while (1) {
340
- switch (_context5.prev = _context5.next) {
341
- case 0:
342
- fileId = _ref5.fileId, vFileId = _ref5.vFileId;
343
- _context5.next = 3;
344
- return this.client.mutation({
345
- addFileToHistory: [{
346
- fileId: fileId,
347
- vFileId: vFileId
348
- }, gqlVFileQuery]
349
- });
350
-
351
- case 3:
352
- _yield$this$client$mu = _context5.sent;
353
- addFileToHistory = _yield$this$client$mu.addFileToHistory;
354
- _context5.next = 7;
355
- return gqlVFileToInternal(addFileToHistory, _classPrivateFieldLooseBase(this, _keys)[_keys]);
356
-
357
- case 7:
358
- vFile = _context5.sent;
359
- file = vFile.history.find(function (f) {
360
- return f.id === fileId;
361
- });
362
-
363
- if (!file) {
364
- _context5.next = 14;
365
- break;
366
- }
367
-
368
- users = vFile.users.filter(function (_ref6) {
369
- var u = _ref6[0];
370
- return u.publicKey !== _classPrivateFieldLooseBase(_this2, _keys)[_keys].publicKey;
371
- });
372
- input = {
373
- fileId: file.id,
374
- users: users.map(function (_ref7) {
375
- var u = _ref7[0];
376
- return {
377
- id: u.id,
378
- key: sodium.to_hex(encryptCryptoBox(sodium.from_hex(file.user.key), _classPrivateFieldLooseBase(_this2, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(_this2, _keys)[_keys].privateKey))
379
- };
380
- })
381
- };
382
- _context5.next = 14;
383
- return this.client.mutation({
384
- shareFileInHistory: [{
385
- input: input,
386
- vFileId: vFileId
387
- }, true]
388
- });
389
-
390
- case 14:
391
- return _context5.abrupt("return", internalVFileToVFile(vFile));
392
-
393
- case 15:
394
- case "end":
395
- return _context5.stop();
396
- }
397
- }
398
- }, _callee5, this);
399
- }));
400
-
401
- function addFileToHistory(_x11) {
402
- return _addFileToHistory.apply(this, arguments);
403
- }
404
-
405
- return addFileToHistory;
406
- }();
407
-
408
- _proto.uploadFile = /*#__PURE__*/function () {
409
- var _uploadFile = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee9(_ref8) {
410
- var _this3 = this;
411
-
412
- var file, encryptProgress, uploadProgress, signal, fileKey, fileBuffer, compressed, _yield$encrypt, encryptedFile, md5File, md5Encrypted, encryptedFileKey, _yield$this$client$mu2, uploadFile, uploadPartEnded, uploadEnded, chunkParts, _iterator2, _step2, _step2$value, index, chunk, progressParts, onProgress, byPart;
413
-
414
- return _regeneratorRuntime.wrap(function _callee9$(_context9) {
415
- while (1) {
416
- switch (_context9.prev = _context9.next) {
417
- case 0:
418
- file = _ref8.file, encryptProgress = _ref8.encryptProgress, uploadProgress = _ref8.uploadProgress, signal = _ref8.signal;
419
- fileKey = secretstreamKeygen();
420
-
421
- if (!(file instanceof File)) {
422
- _context9.next = 10;
423
- break;
424
- }
425
-
426
- _context9.t1 = Uint8Array;
427
- _context9.next = 6;
428
- return file.arrayBuffer();
429
-
430
- case 6:
431
- _context9.t2 = _context9.sent;
432
- _context9.t0 = new _context9.t1(_context9.t2);
433
- _context9.next = 11;
434
- break;
435
-
436
- case 10:
437
- _context9.t0 = file;
438
-
439
- case 11:
440
- fileBuffer = _context9.t0;
441
- compressed = compress(fileBuffer);
442
- _context9.next = 15;
443
- return encrypt(fileKey, compressed, encryptProgress, signal);
444
-
445
- case 15:
446
- _yield$encrypt = _context9.sent;
447
- encryptedFile = _yield$encrypt.data;
448
- md5File = _yield$encrypt.md5;
449
- md5Encrypted = _yield$encrypt.md5Encrypted;
450
- encryptedFileKey = encryptCryptoBox(fileKey, _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
451
- _context9.next = 22;
452
- return this.client.mutation({
453
- uploadFile: [{
454
- fileSize: encryptedFile.byteLength,
455
- fileSizeBefore: fileBuffer.byteLength,
456
- fileKey: sodium.to_hex(encryptedFileKey),
457
- md5Encrypted: md5Encrypted,
458
- md5: md5File
459
- }, {
460
- fileId: true,
461
- filePartSize: true,
462
- parts: {
463
- fields: true,
464
- order: true,
465
- url: true
466
- }
467
- }]
468
- });
469
-
470
- case 22:
471
- _yield$this$client$mu2 = _context9.sent;
472
- uploadFile = _yield$this$client$mu2.uploadFile;
473
-
474
- if (uploadFile) {
475
- _context9.next = 26;
476
- break;
477
- }
478
-
479
- return _context9.abrupt("return", null);
480
-
481
- case 26:
482
- uploadProgress == null ? void 0 : uploadProgress({
483
- total: encryptedFile.byteLength,
484
- current: 0,
485
- percent: 0
486
- });
487
-
488
- if (!(uploadFile.parts.length === 0)) {
489
- _context9.next = 30;
490
- break;
491
- }
492
-
493
- uploadProgress == null ? void 0 : uploadProgress({
494
- total: encryptedFile.byteLength,
495
- current: encryptedFile.byteLength,
496
- percent: 1
497
- });
498
- return _context9.abrupt("return", uploadFile.fileId);
499
-
500
- case 30:
501
- uploadPartEnded = /*#__PURE__*/function () {
502
- var _ref9 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee6(md5, order) {
503
- var _yield$_this3$client$, uploadFilePartEnd;
504
-
505
- return _regeneratorRuntime.wrap(function _callee6$(_context6) {
506
- while (1) {
507
- switch (_context6.prev = _context6.next) {
508
- case 0:
509
- _context6.next = 2;
510
- return _this3.client.mutation({
511
- uploadFilePartEnd: [{
512
- fileId: uploadFile.fileId,
513
- md5: md5,
514
- order: order
515
- }, true]
516
- });
517
-
518
- case 2:
519
- _yield$_this3$client$ = _context6.sent;
520
- uploadFilePartEnd = _yield$_this3$client$.uploadFilePartEnd;
521
- return _context6.abrupt("return", uploadFilePartEnd);
522
-
523
- case 5:
524
- case "end":
525
- return _context6.stop();
526
- }
527
- }
528
- }, _callee6);
529
- }));
530
-
531
- return function uploadPartEnded(_x13, _x14) {
532
- return _ref9.apply(this, arguments);
533
- };
534
- }();
535
-
536
- uploadEnded = /*#__PURE__*/function () {
537
- var _ref10 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee7() {
538
- var _yield$_this3$client$2, uploadFileEnd;
539
-
540
- return _regeneratorRuntime.wrap(function _callee7$(_context7) {
541
- while (1) {
542
- switch (_context7.prev = _context7.next) {
543
- case 0:
544
- _context7.next = 2;
545
- return _this3.client.mutation({
546
- uploadFileEnd: [{
547
- fileId: uploadFile.fileId
548
- }, true]
549
- });
550
-
551
- case 2:
552
- _yield$_this3$client$2 = _context7.sent;
553
- uploadFileEnd = _yield$_this3$client$2.uploadFileEnd;
554
- return _context7.abrupt("return", uploadFileEnd != null ? uploadFileEnd : null);
555
-
556
- case 5:
557
- case "end":
558
- return _context7.stop();
559
- }
560
- }
561
- }, _callee7);
562
- }));
563
-
564
- return function uploadEnded() {
565
- return _ref10.apply(this, arguments);
566
- };
567
- }();
568
-
569
- chunkParts = new Array();
570
- _iterator2 = _createForOfIteratorHelperLoose(enumerate(chunks(encryptedFile, Number(uploadFile.filePartSize))));
571
-
572
- case 34:
573
- if ((_step2 = _iterator2()).done) {
574
- _context9.next = 46;
575
- break;
576
- }
577
-
578
- _step2$value = _step2.value, index = _step2$value[0], chunk = _step2$value[1];
579
- _context9.t3 = chunkParts;
580
- _context9.t4 = index + 1;
581
- _context9.t5 = chunk;
582
- _context9.next = 41;
583
- return md5(chunk);
584
-
585
- case 41:
586
- _context9.t6 = _context9.sent;
587
- _context9.t7 = {
588
- order: _context9.t4,
589
- data: _context9.t5,
590
- md5: _context9.t6
591
- };
592
-
593
- _context9.t3.push.call(_context9.t3, _context9.t7);
594
-
595
- case 44:
596
- _context9.next = 34;
597
- break;
598
-
599
- case 46:
600
- progressParts = {};
601
-
602
- onProgress = function onProgress(part, progressEvent) {
603
- progressParts[part] = progressEvent;
604
- var current = Object.values(progressParts).reduce(function (prv, cur) {
605
- return prv + cur.loaded;
606
- }, 0);
607
- uploadProgress == null ? void 0 : uploadProgress({
608
- percent: current / encryptedFile.byteLength,
609
- total: encryptedFile.byteLength,
610
- current: current
611
- });
612
- };
613
-
614
- byPart = /*#__PURE__*/function () {
615
- var _ref11 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee8(part) {
616
- var formData, chunk, _i, _Object$entries, _Object$entries$_i, key, value;
617
-
618
- return _regeneratorRuntime.wrap(function _callee8$(_context8) {
619
- while (1) {
620
- switch (_context8.prev = _context8.next) {
621
- case 0:
622
- formData = new FormData();
623
- chunk = chunkParts.find(function (p) {
624
- return p.order === part.order;
625
- });
626
-
627
- if (chunk) {
628
- _context8.next = 4;
629
- break;
630
- }
631
-
632
- return _context8.abrupt("return");
633
-
634
- case 4:
635
- for (_i = 0, _Object$entries = Object.entries(part.fields); _i < _Object$entries.length; _i++) {
636
- _Object$entries$_i = _Object$entries[_i], key = _Object$entries$_i[0], value = _Object$entries$_i[1];
637
- formData.append(key, value);
638
- }
639
-
640
- formData.append("file", new Blob([chunk.data]), uploadFile.fileId + "-" + chunk.order);
641
- _context8.prev = 6;
642
- _context8.next = 9;
643
- return axios.post(part.url, formData, {
644
- onUploadProgress: function onUploadProgress(progressEvent) {
645
- return onProgress(part.order, progressEvent);
646
- },
647
- signal: signal
648
- });
649
-
650
- case 9:
651
- _context8.next = 11;
652
- return uploadPartEnded(chunk.md5, chunk.order);
653
-
654
- case 11:
655
- _context8.next = 19;
656
- break;
657
-
658
- case 13:
659
- _context8.prev = 13;
660
- _context8.t0 = _context8["catch"](6);
661
-
662
- if (!(_context8.t0.response.status === 0)) {
663
- _context8.next = 18;
664
- break;
665
- }
666
-
667
- _context8.next = 19;
668
- break;
669
-
670
- case 18:
671
- throw _context8.t0;
672
-
673
- case 19:
674
- case "end":
675
- return _context8.stop();
676
- }
677
- }
678
- }, _callee8, null, [[6, 13]]);
679
- }));
680
-
681
- return function byPart(_x15) {
682
- return _ref11.apply(this, arguments);
683
- };
684
- }();
685
-
686
- _context9.next = 51;
687
- return promiseAllLimit(3, uploadFile.parts.map(function (p) {
688
- return function () {
689
- return byPart(p);
690
- };
691
- }));
692
-
693
- case 51:
694
- return _context9.abrupt("return", uploadEnded());
695
-
696
- case 52:
697
- case "end":
698
- return _context9.stop();
699
- }
700
- }
701
- }, _callee9, this);
702
- }));
703
-
704
- function uploadFile(_x12) {
705
- return _uploadFile.apply(this, arguments);
706
- }
707
-
708
- return uploadFile;
709
- }();
710
-
711
- _proto.uploadFileInCloud = /*#__PURE__*/function () {
712
- var _uploadFileInCloud = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee10(_ref12) {
713
- var file, name, folderId, encryptProgress, uploadProgress, signal, fileId;
714
- return _regeneratorRuntime.wrap(function _callee10$(_context10) {
715
- while (1) {
716
- switch (_context10.prev = _context10.next) {
717
- case 0:
718
- file = _ref12.file, name = _ref12.name, folderId = _ref12.folderId, encryptProgress = _ref12.encryptProgress, uploadProgress = _ref12.uploadProgress, signal = _ref12.signal;
719
- _context10.next = 3;
720
- return this.uploadFile({
721
- file: file,
722
- encryptProgress: encryptProgress,
723
- uploadProgress: uploadProgress,
724
- signal: signal
725
- });
726
-
727
- case 3:
728
- fileId = _context10.sent;
729
-
730
- if (fileId) {
731
- _context10.next = 6;
732
- break;
733
- }
734
-
735
- throw "Can't upload file";
736
-
737
- case 6:
738
- return _context10.abrupt("return", this.saveInCloud({
739
- fileId: fileId,
740
- name: name,
741
- folderId: folderId
742
- }));
743
-
744
- case 7:
745
- case "end":
746
- return _context10.stop();
747
- }
748
- }
749
- }, _callee10, this);
750
- }));
751
-
752
- function uploadFileInCloud(_x16) {
753
- return _uploadFileInCloud.apply(this, arguments);
754
- }
755
-
756
- return uploadFileInCloud;
757
- }();
758
-
759
- _proto.logout = /*#__PURE__*/function () {
760
- var _logout = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee11(sessionId) {
761
- return _regeneratorRuntime.wrap(function _callee11$(_context11) {
762
- while (1) {
763
- switch (_context11.prev = _context11.next) {
764
- case 0:
765
- vFilesCache.clear();
766
- filesCache.clear();
767
- foldersCache.clear();
768
- _context11.next = 5;
769
- return _BaseClient.prototype.logout.call(this, sessionId);
770
-
771
- case 5:
772
- case "end":
773
- return _context11.stop();
774
- }
775
- }
776
- }, _callee11, this);
777
- }));
778
-
779
- function logout(_x17) {
780
- return _logout.apply(this, arguments);
781
- }
782
-
783
- return logout;
784
- }();
785
-
786
- _proto.createFolder = /*#__PURE__*/function () {
787
- var _createFolder = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee12(_ref13) {
788
- var _folder$parentFolder$,
789
- _folder$parentFolder,
790
- _folder$parentFolder$2,
791
- _this4 = this;
792
-
793
- var name, parentFolderId, key, encryptedName, encryptedKey, _yield$this$client$mu3, createFolder, folder, users;
794
-
795
- return _regeneratorRuntime.wrap(function _callee12$(_context12) {
796
- while (1) {
797
- switch (_context12.prev = _context12.next) {
798
- case 0:
799
- name = _ref13.name, parentFolderId = _ref13.parentFolderId;
800
- key = secretstreamKeygen();
801
- _context12.next = 4;
802
- return encryptName(name, sodium.to_hex(key));
803
-
804
- case 4:
805
- encryptedName = _context12.sent;
806
- encryptedKey = encryptCryptoBox(key, _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
807
- _context12.next = 8;
808
- return this.client.mutation({
809
- createFolder: [{
810
- name: encryptedName,
811
- parentFolderId: parentFolderId,
812
- key: sodium.to_hex(encryptedKey)
813
- }, gqlFolderFullQuery]
814
- });
815
-
816
- case 8:
817
- _yield$this$client$mu3 = _context12.sent;
818
- createFolder = _yield$this$client$mu3.createFolder;
819
-
820
- if (createFolder) {
821
- _context12.next = 12;
822
- break;
823
- }
824
-
825
- throw new Error("Can't create folder");
826
-
827
- case 12:
828
- _context12.next = 14;
829
- return gqlFolderToExternalFolderFull(createFolder, _classPrivateFieldLooseBase(this, _keys)[_keys]);
830
-
831
- case 14:
832
- folder = _context12.sent;
833
- users = (_folder$parentFolder$ = (_folder$parentFolder = folder.parentFolder) == null ? void 0 : (_folder$parentFolder$2 = _folder$parentFolder.users) == null ? void 0 : _folder$parentFolder$2.filter(function (_ref14) {
834
- var u = _ref14[0];
835
- return u.publicKey !== _classPrivateFieldLooseBase(_this4, _keys)[_keys].publicKey;
836
- })) != null ? _folder$parentFolder$ : [];
837
-
838
- if (!users.length) {
839
- _context12.next = 19;
840
- break;
841
- }
842
-
843
- _context12.next = 19;
844
- return Promise.all(users.map(function (_ref15) {
845
- var u = _ref15[0],
846
- rights = _ref15[1];
847
- return _this4.shareFolder({
848
- folderId: folder.id,
849
- rights: rights,
850
- userId: u.id
851
- });
852
- }));
853
-
854
- case 19:
855
- return _context12.abrupt("return", folder);
856
-
857
- case 20:
858
- case "end":
859
- return _context12.stop();
860
- }
861
- }
862
- }, _callee12, this);
863
- }));
864
-
865
- function createFolder(_x18) {
866
- return _createFolder.apply(this, arguments);
867
- }
868
-
869
- return createFolder;
870
- }();
871
-
872
- _proto.folder = /*#__PURE__*/function () {
873
- var _folder = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee13(_temp) {
874
- var _ref16, id, deleted, _yield$this$client$qu, folder;
875
-
876
- return _regeneratorRuntime.wrap(function _callee13$(_context13) {
877
- while (1) {
878
- switch (_context13.prev = _context13.next) {
879
- case 0:
880
- _ref16 = _temp === void 0 ? {} : _temp, id = _ref16.id, deleted = _ref16.deleted;
881
- _context13.next = 3;
882
- return this.client.query({
883
- folder: [{
884
- deleted: deleted,
885
- id: id
886
- }, gqlFolderFullQuery]
887
- });
888
-
889
- case 3:
890
- _yield$this$client$qu = _context13.sent;
891
- folder = _yield$this$client$qu.folder;
892
-
893
- if (folder) {
894
- _context13.next = 7;
895
- break;
896
- }
897
-
898
- return _context13.abrupt("return", null);
899
-
900
- case 7:
901
- return _context13.abrupt("return", gqlFolderToExternalFolderFull(folder, _classPrivateFieldLooseBase(this, _keys)[_keys]));
902
-
903
- case 8:
904
- case "end":
905
- return _context13.stop();
906
- }
907
- }
908
- }, _callee13, this);
909
- }));
910
-
911
- function folder(_x19) {
912
- return _folder.apply(this, arguments);
913
- }
914
-
915
- return folder;
916
- }();
917
-
918
- _proto.file = /*#__PURE__*/function () {
919
- var _file = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee14(_ref17) {
920
- var id, _yield$this$client$qu2, file;
921
-
922
- return _regeneratorRuntime.wrap(function _callee14$(_context14) {
923
- while (1) {
924
- switch (_context14.prev = _context14.next) {
925
- case 0:
926
- id = _ref17.id;
927
- _context14.next = 3;
928
- return this.client.query({
929
- file: [{
930
- id: id
931
- }, gqlFileQuery]
932
- });
933
-
934
- case 3:
935
- _yield$this$client$qu2 = _context14.sent;
936
- file = _yield$this$client$qu2.file;
937
-
938
- if (file) {
939
- _context14.next = 7;
940
- break;
941
- }
942
-
943
- return _context14.abrupt("return", null);
944
-
945
- case 7:
946
- return _context14.abrupt("return", gqlFileToExternal(file, _classPrivateFieldLooseBase(this, _keys)[_keys]));
947
-
948
- case 8:
949
- case "end":
950
- return _context14.stop();
951
- }
952
- }
953
- }, _callee14, this);
954
- }));
955
-
956
- function file(_x20) {
957
- return _file.apply(this, arguments);
958
- }
959
-
960
- return file;
961
- }();
962
-
963
- _proto.vFile = /*#__PURE__*/function () {
964
- var _vFile = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee15(_ref18) {
965
- var id, _yield$this$client$qu3, vFile;
966
-
967
- return _regeneratorRuntime.wrap(function _callee15$(_context15) {
968
- while (1) {
969
- switch (_context15.prev = _context15.next) {
970
- case 0:
971
- id = _ref18.id;
972
- _context15.next = 3;
973
- return this.client.query({
974
- vFile: [{
975
- id: id
976
- }, gqlVFileWithFolderQuery]
977
- });
978
-
979
- case 3:
980
- _yield$this$client$qu3 = _context15.sent;
981
- vFile = _yield$this$client$qu3.vFile;
982
-
983
- if (vFile) {
984
- _context15.next = 7;
985
- break;
986
- }
987
-
988
- return _context15.abrupt("return", null);
989
-
990
- case 7:
991
- return _context15.abrupt("return", gqlVFileToExternal(vFile, _classPrivateFieldLooseBase(this, _keys)[_keys]));
992
-
993
- case 8:
994
- case "end":
995
- return _context15.stop();
996
- }
997
- }
998
- }, _callee15, this);
999
- }));
1000
-
1001
- function vFile(_x21) {
1002
- return _vFile.apply(this, arguments);
1003
- }
1004
-
1005
- return vFile;
1006
- }();
1007
-
1008
- _proto.mail = /*#__PURE__*/function () {
1009
- var _mail = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee16(_ref19) {
1010
- var id, _yield$this$client$qu4, mail;
1011
-
1012
- return _regeneratorRuntime.wrap(function _callee16$(_context16) {
1013
- while (1) {
1014
- switch (_context16.prev = _context16.next) {
1015
- case 0:
1016
- id = _ref19.id;
1017
- _context16.next = 3;
1018
- return this.client.query({
1019
- mail: [{
1020
- id: id
1021
- }, gqlMailQuery]
1022
- });
1023
-
1024
- case 3:
1025
- _yield$this$client$qu4 = _context16.sent;
1026
- mail = _yield$this$client$qu4.mail;
1027
-
1028
- if (mail) {
1029
- _context16.next = 7;
1030
- break;
1031
- }
1032
-
1033
- return _context16.abrupt("return", null);
1034
-
1035
- case 7:
1036
- return _context16.abrupt("return", convertInternalMailToExternal(mail, _classPrivateFieldLooseBase(this, _keys)[_keys]));
1037
-
1038
- case 8:
1039
- case "end":
1040
- return _context16.stop();
1041
- }
1042
- }
1043
- }, _callee16, this);
1044
- }));
1045
-
1046
- function mail(_x22) {
1047
- return _mail.apply(this, arguments);
1048
- }
1049
-
1050
- return mail;
1051
- }();
1052
-
1053
- _proto.shareVFile = /*#__PURE__*/function () {
1054
- var _shareVFile = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee17(_ref20) {
1055
- var vFileId, userId, rights, vFile, user, nameKey, history, _iterator3, _step3, h, _yield$this$client$mu4, shareVFile;
1056
-
1057
- return _regeneratorRuntime.wrap(function _callee17$(_context17) {
1058
- while (1) {
1059
- switch (_context17.prev = _context17.next) {
1060
- case 0:
1061
- vFileId = _ref20.vFileId, userId = _ref20.userId, rights = _ref20.rights;
1062
- vFile = vFilesCache.get(vFileId);
1063
-
1064
- if (vFile) {
1065
- _context17.next = 8;
1066
- break;
1067
- }
1068
-
1069
- _context17.next = 5;
1070
- return this.vFile({
1071
- id: vFileId
1072
- });
1073
-
1074
- case 5:
1075
- vFile = vFilesCache.get(vFileId);
1076
-
1077
- if (vFile) {
1078
- _context17.next = 8;
1079
- break;
1080
- }
1081
-
1082
- return _context17.abrupt("return", false);
1083
-
1084
- case 8:
1085
- _context17.next = 10;
1086
- return this.user({
1087
- userId: userId,
1088
- withPublicKey: true
1089
- });
1090
-
1091
- case 10:
1092
- user = _context17.sent;
1093
-
1094
- if (user) {
1095
- _context17.next = 13;
1096
- break;
1097
- }
1098
-
1099
- return _context17.abrupt("return", false);
1100
-
1101
- case 13:
1102
- nameKey = sodium.to_hex(encryptCryptoBox(sodium.from_hex(vFile.userApp.nameKey), user.publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey));
1103
- history = new Array();
1104
- _iterator3 = _createForOfIteratorHelperLoose(vFile.history);
1105
-
1106
- case 16:
1107
- if ((_step3 = _iterator3()).done) {
1108
- _context17.next = 23;
1109
- break;
1110
- }
1111
-
1112
- h = _step3.value;
1113
-
1114
- if (h.user) {
1115
- _context17.next = 20;
1116
- break;
1117
- }
1118
-
1119
- return _context17.abrupt("continue", 21);
1120
-
1121
- case 20:
1122
- history.push({
1123
- id: h.id,
1124
- key: sodium.to_hex(encryptCryptoBox(sodium.from_hex(h.user.key), user.publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
1125
- });
1126
-
1127
- case 21:
1128
- _context17.next = 16;
1129
- break;
1130
-
1131
- case 23:
1132
- _context17.next = 25;
1133
- return this.client.mutation({
1134
- shareVFile: [{
1135
- vFileId: vFileId,
1136
- userId: userId,
1137
- rights: rights,
1138
- nameKey: nameKey,
1139
- history: history
1140
- }, true]
1141
- });
1142
-
1143
- case 25:
1144
- _yield$this$client$mu4 = _context17.sent;
1145
- shareVFile = _yield$this$client$mu4.shareVFile;
1146
- return _context17.abrupt("return", shareVFile != null ? shareVFile : false);
1147
-
1148
- case 28:
1149
- case "end":
1150
- return _context17.stop();
1151
- }
1152
- }
1153
- }, _callee17, this);
1154
- }));
1155
-
1156
- function shareVFile(_x23) {
1157
- return _shareVFile.apply(this, arguments);
1158
- }
1159
-
1160
- return shareVFile;
1161
- }();
1162
-
1163
- _proto.sharedVFiles = /*#__PURE__*/function () {
1164
- var _sharedVFiles = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee18() {
1165
- var _yield$this$client$qu5, sharedVFiles, vFiles, _iterator4, _step4, vFile;
1166
-
1167
- return _regeneratorRuntime.wrap(function _callee18$(_context18) {
1168
- while (1) {
1169
- switch (_context18.prev = _context18.next) {
1170
- case 0:
1171
- _context18.next = 2;
1172
- return this.client.query({
1173
- sharedVFiles: gqlVFileWithFolderQuery
1174
- });
1175
-
1176
- case 2:
1177
- _yield$this$client$qu5 = _context18.sent;
1178
- sharedVFiles = _yield$this$client$qu5.sharedVFiles;
1179
- vFiles = new Array();
1180
- _iterator4 = _createForOfIteratorHelperLoose(sharedVFiles);
1181
-
1182
- case 6:
1183
- if ((_step4 = _iterator4()).done) {
1184
- _context18.next = 15;
1185
- break;
1186
- }
1187
-
1188
- vFile = _step4.value;
1189
- _context18.t0 = vFiles;
1190
- _context18.next = 11;
1191
- return gqlVFileToExternal(vFile, _classPrivateFieldLooseBase(this, _keys)[_keys]);
1192
-
1193
- case 11:
1194
- _context18.t1 = _context18.sent;
1195
-
1196
- _context18.t0.push.call(_context18.t0, _context18.t1);
1197
-
1198
- case 13:
1199
- _context18.next = 6;
1200
- break;
1201
-
1202
- case 15:
1203
- return _context18.abrupt("return", vFiles);
1204
-
1205
- case 16:
1206
- case "end":
1207
- return _context18.stop();
1208
- }
1209
- }
1210
- }, _callee18, this);
1211
- }));
1212
-
1213
- function sharedVFiles() {
1214
- return _sharedVFiles.apply(this, arguments);
1215
- }
1216
-
1217
- return sharedVFiles;
1218
- }();
1219
-
1220
- _proto.vFilesSharedWithMe = /*#__PURE__*/function () {
1221
- var _vFilesSharedWithMe = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee19() {
1222
- var _yield$this$client$qu6, vFilesSharedWithMe, vFiles, _iterator5, _step5, vFile;
1223
-
1224
- return _regeneratorRuntime.wrap(function _callee19$(_context19) {
1225
- while (1) {
1226
- switch (_context19.prev = _context19.next) {
1227
- case 0:
1228
- _context19.next = 2;
1229
- return this.client.query({
1230
- vFilesSharedWithMe: gqlVFileWithFolderQuery
1231
- });
1232
-
1233
- case 2:
1234
- _yield$this$client$qu6 = _context19.sent;
1235
- vFilesSharedWithMe = _yield$this$client$qu6.vFilesSharedWithMe;
1236
- vFiles = new Array();
1237
- _iterator5 = _createForOfIteratorHelperLoose(vFilesSharedWithMe);
1238
-
1239
- case 6:
1240
- if ((_step5 = _iterator5()).done) {
1241
- _context19.next = 15;
1242
- break;
1243
- }
1244
-
1245
- vFile = _step5.value;
1246
- _context19.t0 = vFiles;
1247
- _context19.next = 11;
1248
- return gqlVFileToExternal(vFile, _classPrivateFieldLooseBase(this, _keys)[_keys]);
1249
-
1250
- case 11:
1251
- _context19.t1 = _context19.sent;
1252
-
1253
- _context19.t0.push.call(_context19.t0, _context19.t1);
1254
-
1255
- case 13:
1256
- _context19.next = 6;
1257
- break;
1258
-
1259
- case 15:
1260
- return _context19.abrupt("return", vFiles);
1261
-
1262
- case 16:
1263
- case "end":
1264
- return _context19.stop();
1265
- }
1266
- }
1267
- }, _callee19, this);
1268
- }));
1269
-
1270
- function vFilesSharedWithMe() {
1271
- return _vFilesSharedWithMe.apply(this, arguments);
1272
- }
1273
-
1274
- return vFilesSharedWithMe;
1275
- }();
1276
-
1277
- _proto.deletedVFiles = /*#__PURE__*/function () {
1278
- var _deletedVFiles = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee20() {
1279
- var _yield$this$client$qu7, deletedVFiles, vFiles, _iterator6, _step6, vFile;
1280
-
1281
- return _regeneratorRuntime.wrap(function _callee20$(_context20) {
1282
- while (1) {
1283
- switch (_context20.prev = _context20.next) {
1284
- case 0:
1285
- _context20.next = 2;
1286
- return this.client.query({
1287
- deletedVFiles: gqlVFileQuery
1288
- });
1289
-
1290
- case 2:
1291
- _yield$this$client$qu7 = _context20.sent;
1292
- deletedVFiles = _yield$this$client$qu7.deletedVFiles;
1293
- vFiles = new Array();
1294
- _iterator6 = _createForOfIteratorHelperLoose(deletedVFiles);
1295
-
1296
- case 6:
1297
- if ((_step6 = _iterator6()).done) {
1298
- _context20.next = 15;
1299
- break;
1300
- }
1301
-
1302
- vFile = _step6.value;
1303
- _context20.t0 = vFiles;
1304
- _context20.next = 11;
1305
- return gqlVFileToExternal(vFile, _classPrivateFieldLooseBase(this, _keys)[_keys]);
1306
-
1307
- case 11:
1308
- _context20.t1 = _context20.sent;
1309
-
1310
- _context20.t0.push.call(_context20.t0, _context20.t1);
1311
-
1312
- case 13:
1313
- _context20.next = 6;
1314
- break;
1315
-
1316
- case 15:
1317
- return _context20.abrupt("return", vFiles);
1318
-
1319
- case 16:
1320
- case "end":
1321
- return _context20.stop();
1322
- }
1323
- }
1324
- }, _callee20, this);
1325
- }));
1326
-
1327
- function deletedVFiles() {
1328
- return _deletedVFiles.apply(this, arguments);
1329
- }
1330
-
1331
- return deletedVFiles;
1332
- }();
1333
-
1334
- _proto.sharedFolders = /*#__PURE__*/function () {
1335
- var _sharedFolders = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee21() {
1336
- var _yield$this$client$qu8, sharedFolders, folders, _iterator7, _step7, folder;
1337
-
1338
- return _regeneratorRuntime.wrap(function _callee21$(_context21) {
1339
- while (1) {
1340
- switch (_context21.prev = _context21.next) {
1341
- case 0:
1342
- _context21.next = 2;
1343
- return this.client.query({
1344
- sharedFolders: gqlFolderQuery
1345
- });
1346
-
1347
- case 2:
1348
- _yield$this$client$qu8 = _context21.sent;
1349
- sharedFolders = _yield$this$client$qu8.sharedFolders;
1350
- folders = new Array();
1351
- _iterator7 = _createForOfIteratorHelperLoose(sharedFolders);
1352
-
1353
- case 6:
1354
- if ((_step7 = _iterator7()).done) {
1355
- _context21.next = 15;
1356
- break;
1357
- }
1358
-
1359
- folder = _step7.value;
1360
- _context21.t0 = folders;
1361
- _context21.next = 11;
1362
- return gqlFolderToExternal(folder, _classPrivateFieldLooseBase(this, _keys)[_keys]);
1363
-
1364
- case 11:
1365
- _context21.t1 = _context21.sent;
1366
-
1367
- _context21.t0.push.call(_context21.t0, _context21.t1);
1368
-
1369
- case 13:
1370
- _context21.next = 6;
1371
- break;
1372
-
1373
- case 15:
1374
- return _context21.abrupt("return", folders);
1375
-
1376
- case 16:
1377
- case "end":
1378
- return _context21.stop();
1379
- }
1380
- }
1381
- }, _callee21, this);
1382
- }));
1383
-
1384
- function sharedFolders() {
1385
- return _sharedFolders.apply(this, arguments);
1386
- }
1387
-
1388
- return sharedFolders;
1389
- }();
1390
-
1391
- _proto.foldersSharedWithMe = /*#__PURE__*/function () {
1392
- var _foldersSharedWithMe = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee22() {
1393
- var _yield$this$client$qu9, foldersSharedWithMe, folders, _iterator8, _step8, folder;
1394
-
1395
- return _regeneratorRuntime.wrap(function _callee22$(_context22) {
1396
- while (1) {
1397
- switch (_context22.prev = _context22.next) {
1398
- case 0:
1399
- _context22.next = 2;
1400
- return this.client.query({
1401
- foldersSharedWithMe: gqlFolderQuery
1402
- });
1403
-
1404
- case 2:
1405
- _yield$this$client$qu9 = _context22.sent;
1406
- foldersSharedWithMe = _yield$this$client$qu9.foldersSharedWithMe;
1407
- folders = new Array();
1408
- _iterator8 = _createForOfIteratorHelperLoose(foldersSharedWithMe);
1409
-
1410
- case 6:
1411
- if ((_step8 = _iterator8()).done) {
1412
- _context22.next = 15;
1413
- break;
1414
- }
1415
-
1416
- folder = _step8.value;
1417
- _context22.t0 = folders;
1418
- _context22.next = 11;
1419
- return gqlFolderToExternal(folder, _classPrivateFieldLooseBase(this, _keys)[_keys]);
1420
-
1421
- case 11:
1422
- _context22.t1 = _context22.sent;
1423
-
1424
- _context22.t0.push.call(_context22.t0, _context22.t1);
1425
-
1426
- case 13:
1427
- _context22.next = 6;
1428
- break;
1429
-
1430
- case 15:
1431
- return _context22.abrupt("return", folders);
1432
-
1433
- case 16:
1434
- case "end":
1435
- return _context22.stop();
1436
- }
1437
- }
1438
- }, _callee22, this);
1439
- }));
1440
-
1441
- function foldersSharedWithMe() {
1442
- return _foldersSharedWithMe.apply(this, arguments);
1443
- }
1444
-
1445
- return foldersSharedWithMe;
1446
- }();
1447
-
1448
- _proto.deletedFolders = /*#__PURE__*/function () {
1449
- var _deletedFolders = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee23() {
1450
- var _yield$this$client$qu10, deletedFolders, folders, _iterator9, _step9, folder;
1451
-
1452
- return _regeneratorRuntime.wrap(function _callee23$(_context23) {
1453
- while (1) {
1454
- switch (_context23.prev = _context23.next) {
1455
- case 0:
1456
- _context23.next = 2;
1457
- return this.client.query({
1458
- deletedFolders: gqlFolderQuery
1459
- });
1460
-
1461
- case 2:
1462
- _yield$this$client$qu10 = _context23.sent;
1463
- deletedFolders = _yield$this$client$qu10.deletedFolders;
1464
- folders = new Array();
1465
- _iterator9 = _createForOfIteratorHelperLoose(deletedFolders);
1466
-
1467
- case 6:
1468
- if ((_step9 = _iterator9()).done) {
1469
- _context23.next = 15;
1470
- break;
1471
- }
1472
-
1473
- folder = _step9.value;
1474
- _context23.t0 = folders;
1475
- _context23.next = 11;
1476
- return gqlFolderToExternal(folder, _classPrivateFieldLooseBase(this, _keys)[_keys]);
1477
-
1478
- case 11:
1479
- _context23.t1 = _context23.sent;
1480
-
1481
- _context23.t0.push.call(_context23.t0, _context23.t1);
1482
-
1483
- case 13:
1484
- _context23.next = 6;
1485
- break;
1486
-
1487
- case 15:
1488
- return _context23.abrupt("return", folders);
1489
-
1490
- case 16:
1491
- case "end":
1492
- return _context23.stop();
1493
- }
1494
- }
1495
- }, _callee23, this);
1496
- }));
1497
-
1498
- function deletedFolders() {
1499
- return _deletedFolders.apply(this, arguments);
1500
- }
1501
-
1502
- return deletedFolders;
1503
- }();
1504
-
1505
- _proto.deletedMails = /*#__PURE__*/function () {
1506
- var _deletedMails = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee24(_ref21) {
1507
- var mailType, _yield$this$client$qu11, deletedMails, mails, _iterator10, _step10, m, mail;
1508
-
1509
- return _regeneratorRuntime.wrap(function _callee24$(_context24) {
1510
- while (1) {
1511
- switch (_context24.prev = _context24.next) {
1512
- case 0:
1513
- mailType = _ref21.mailType;
1514
- _context24.next = 3;
1515
- return this.client.query({
1516
- deletedMails: [{
1517
- mailType: mailType
1518
- }, gqlMailQuery]
1519
- });
1520
-
1521
- case 3:
1522
- _yield$this$client$qu11 = _context24.sent;
1523
- deletedMails = _yield$this$client$qu11.deletedMails;
1524
- mails = new Array();
1525
-
1526
- for (_iterator10 = _createForOfIteratorHelperLoose(deletedMails); !(_step10 = _iterator10()).done;) {
1527
- m = _step10.value;
1528
- mail = convertInternalMailToExternal(m, _classPrivateFieldLooseBase(this, _keys)[_keys]);
1529
-
1530
- if (mail) {
1531
- mails.push(mail);
1532
- }
1533
- }
1534
-
1535
- return _context24.abrupt("return", mails);
1536
-
1537
- case 8:
1538
- case "end":
1539
- return _context24.stop();
1540
- }
1541
- }
1542
- }, _callee24, this);
1543
- }));
1544
-
1545
- function deletedMails(_x24) {
1546
- return _deletedMails.apply(this, arguments);
1547
- }
1548
-
1549
- return deletedMails;
1550
- }();
1551
-
1552
- _proto.shareFolder = /*#__PURE__*/function () {
1553
- var _shareFolder = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee25(_ref22) {
1554
- var folderId, userId, rights, user, _yield$this$client$mu5, shareFolder, shareFolders, _iterator11, _step11, id, nameKey, _iterator12, _step12, _id, vFileInput, _yield$this$client$mu6, shareFolderFinish;
1555
-
1556
- return _regeneratorRuntime.wrap(function _callee25$(_context25) {
1557
- while (1) {
1558
- switch (_context25.prev = _context25.next) {
1559
- case 0:
1560
- folderId = _ref22.folderId, userId = _ref22.userId, rights = _ref22.rights;
1561
- _context25.next = 3;
1562
- return this.user({
1563
- userId: userId,
1564
- withPublicKey: true
1565
- });
1566
-
1567
- case 3:
1568
- user = _context25.sent;
1569
-
1570
- if (user) {
1571
- _context25.next = 6;
1572
- break;
1573
- }
1574
-
1575
- return _context25.abrupt("return", false);
1576
-
1577
- case 6:
1578
- _context25.next = 8;
1579
- return this.client.mutation({
1580
- shareFolder: [{
1581
- folderId: folderId,
1582
- userId: userId
1583
- }, {
1584
- vFiles: true,
1585
- folders: true
1586
- }]
1587
- });
1588
-
1589
- case 8:
1590
- _yield$this$client$mu5 = _context25.sent;
1591
- shareFolder = _yield$this$client$mu5.shareFolder;
1592
- shareFolders = {
1593
- vFiles: [],
1594
- folders: []
1595
- };
1596
- _iterator11 = _createForOfIteratorHelperLoose(shareFolder.folders);
1597
-
1598
- case 12:
1599
- if ((_step11 = _iterator11()).done) {
1600
- _context25.next = 20;
1601
- break;
1602
- }
1603
-
1604
- id = _step11.value;
1605
- _context25.next = 16;
1606
- return this.perFolder(id, user.publicKey);
1607
-
1608
- case 16:
1609
- nameKey = _context25.sent;
1610
-
1611
- if (nameKey) {
1612
- shareFolders.folders.push(nameKey);
1613
- }
1614
-
1615
- case 18:
1616
- _context25.next = 12;
1617
- break;
1618
-
1619
- case 20:
1620
- _iterator12 = _createForOfIteratorHelperLoose(shareFolder.vFiles);
1621
-
1622
- case 21:
1623
- if ((_step12 = _iterator12()).done) {
1624
- _context25.next = 29;
1625
- break;
1626
- }
1627
-
1628
- _id = _step12.value;
1629
- _context25.next = 25;
1630
- return this.perVFile(_id, user.publicKey);
1631
-
1632
- case 25:
1633
- vFileInput = _context25.sent;
1634
-
1635
- if (vFileInput) {
1636
- shareFolders.vFiles.push(vFileInput);
1637
- }
1638
-
1639
- case 27:
1640
- _context25.next = 21;
1641
- break;
1642
-
1643
- case 29:
1644
- _context25.next = 31;
1645
- return this.client.mutation({
1646
- shareFolderFinish: [{
1647
- rights: rights,
1648
- userId: userId,
1649
- shareFolders: shareFolders
1650
- }, true]
1651
- });
1652
-
1653
- case 31:
1654
- _yield$this$client$mu6 = _context25.sent;
1655
- shareFolderFinish = _yield$this$client$mu6.shareFolderFinish;
1656
- return _context25.abrupt("return", shareFolderFinish != null ? shareFolderFinish : false);
1657
-
1658
- case 34:
1659
- case "end":
1660
- return _context25.stop();
1661
- }
1662
- }
1663
- }, _callee25, this);
1664
- }));
1665
-
1666
- function shareFolder(_x25) {
1667
- return _shareFolder.apply(this, arguments);
1668
- }
1669
-
1670
- return shareFolder;
1671
- }();
1672
-
1673
- _proto.updateFolder = /*#__PURE__*/function () {
1674
- var _updateFolder = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee26(_ref23) {
1675
- var _folder$userApp2;
1676
-
1677
- var folderId, name, isFavorite, deletedAt, folder, _yield$this$client$mu7, updateFolder;
1678
-
1679
- return _regeneratorRuntime.wrap(function _callee26$(_context26) {
1680
- while (1) {
1681
- switch (_context26.prev = _context26.next) {
1682
- case 0:
1683
- folderId = _ref23.folderId, name = _ref23.name, isFavorite = _ref23.isFavorite, deletedAt = _ref23.deletedAt;
1684
- folder = foldersCache.get(folderId);
1685
-
1686
- if (folder) {
1687
- _context26.next = 8;
1688
- break;
1689
- }
1690
-
1691
- _context26.next = 5;
1692
- return this.folder({
1693
- id: folderId
1694
- });
1695
-
1696
- case 5:
1697
- folder = foldersCache.get(folderId);
1698
-
1699
- if (folder) {
1700
- _context26.next = 8;
1701
- break;
1702
- }
1703
-
1704
- throw "Can't find folder " + folderId;
1705
-
1706
- case 8:
1707
- if (!name) {
1708
- _context26.next = 19;
1709
- break;
1710
- }
1711
-
1712
- if (!((_folder$userApp2 = folder.userApp) != null && _folder$userApp2.nameKey)) {
1713
- _context26.next = 15;
1714
- break;
1715
- }
1716
-
1717
- _context26.next = 12;
1718
- return encryptName(name, folder.userApp.nameKey);
1719
-
1720
- case 12:
1721
- _context26.t1 = _context26.sent;
1722
- _context26.next = 16;
1723
- break;
1724
-
1725
- case 15:
1726
- _context26.t1 = name;
1727
-
1728
- case 16:
1729
- _context26.t0 = _context26.t1;
1730
- _context26.next = 20;
1731
- break;
1732
-
1733
- case 19:
1734
- _context26.t0 = null;
1735
-
1736
- case 20:
1737
- name = _context26.t0;
1738
- _context26.next = 23;
1739
- return this.client.mutation({
1740
- updateFolder: [{
1741
- folderId: folderId,
1742
- name: name,
1743
- isFavorite: isFavorite,
1744
- deletedAt: deletedAt
1745
- }, gqlFolderFullQuery]
1746
- });
1747
-
1748
- case 23:
1749
- _yield$this$client$mu7 = _context26.sent;
1750
- updateFolder = _yield$this$client$mu7.updateFolder;
1751
-
1752
- if (updateFolder) {
1753
- _context26.next = 27;
1754
- break;
1755
- }
1756
-
1757
- throw new Error("Can't update folder");
1758
-
1759
- case 27:
1760
- return _context26.abrupt("return", gqlFolderToExternalFolderFull(updateFolder, _classPrivateFieldLooseBase(this, _keys)[_keys]));
1761
-
1762
- case 28:
1763
- case "end":
1764
- return _context26.stop();
1765
- }
1766
- }
1767
- }, _callee26, this);
1768
- }));
1769
-
1770
- function updateFolder(_x26) {
1771
- return _updateFolder.apply(this, arguments);
1772
- }
1773
-
1774
- return updateFolder;
1775
- }();
1776
-
1777
- _proto.updateAppNotifications = /*#__PURE__*/function () {
1778
- var _updateAppNotifications = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee27(notifications) {
1779
- var _yield$this$client$mu8, updateAppNotifications;
1780
-
1781
- return _regeneratorRuntime.wrap(function _callee27$(_context27) {
1782
- while (1) {
1783
- switch (_context27.prev = _context27.next) {
1784
- case 0:
1785
- _context27.next = 2;
1786
- return this.client.mutation({
1787
- updateAppNotifications: [notifications, {
1788
- enableAll: true,
1789
- mail: true,
1790
- cloud: true,
1791
- disableAllUntil: true
1792
- }]
1793
- });
1794
-
1795
- case 2:
1796
- _yield$this$client$mu8 = _context27.sent;
1797
- updateAppNotifications = _yield$this$client$mu8.updateAppNotifications;
1798
-
1799
- if (updateAppNotifications) {
1800
- _context27.next = 6;
1801
- break;
1802
- }
1803
-
1804
- return _context27.abrupt("return", null);
1805
-
1806
- case 6:
1807
- return _context27.abrupt("return", _objectSpread(_objectSpread({}, updateAppNotifications), {}, {
1808
- disableAllUntil: updateAppNotifications.disableAllUntil ? new Date(updateAppNotifications.disableAllUntil) : null
1809
- }));
1810
-
1811
- case 7:
1812
- case "end":
1813
- return _context27.stop();
1814
- }
1815
- }
1816
- }, _callee27, this);
1817
- }));
1818
-
1819
- function updateAppNotifications(_x27) {
1820
- return _updateAppNotifications.apply(this, arguments);
1821
- }
1822
-
1823
- return updateAppNotifications;
1824
- }();
1825
-
1826
- _proto.appNotifications = /*#__PURE__*/function () {
1827
- var _appNotifications = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee28() {
1828
- var _yield$this$client$qu12, appNotifications;
1829
-
1830
- return _regeneratorRuntime.wrap(function _callee28$(_context28) {
1831
- while (1) {
1832
- switch (_context28.prev = _context28.next) {
1833
- case 0:
1834
- _context28.next = 2;
1835
- return this.client.query({
1836
- appNotifications: {
1837
- enableAll: true,
1838
- mail: true,
1839
- cloud: true,
1840
- disableAllUntil: true
1841
- }
1842
- });
1843
-
1844
- case 2:
1845
- _yield$this$client$qu12 = _context28.sent;
1846
- appNotifications = _yield$this$client$qu12.appNotifications;
1847
-
1848
- if (appNotifications) {
1849
- _context28.next = 6;
1850
- break;
1851
- }
1852
-
1853
- return _context28.abrupt("return", null);
1854
-
1855
- case 6:
1856
- return _context28.abrupt("return", _objectSpread(_objectSpread({}, appNotifications), {}, {
1857
- disableAllUntil: appNotifications.disableAllUntil ? new Date(appNotifications.disableAllUntil) : null
1858
- }));
1859
-
1860
- case 7:
1861
- case "end":
1862
- return _context28.stop();
1863
- }
1864
- }
1865
- }, _callee28, this);
1866
- }));
1867
-
1868
- function appNotifications() {
1869
- return _appNotifications.apply(this, arguments);
1870
- }
1871
-
1872
- return appNotifications;
1873
- }();
1874
-
1875
- _proto.createMail = /*#__PURE__*/function () {
1876
- var _createMail = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee29(data, customMessage) {
1877
- var mail;
1878
- return _regeneratorRuntime.wrap(function _callee29$(_context29) {
1879
- while (1) {
1880
- switch (_context29.prev = _context29.next) {
1881
- case 0:
1882
- _context29.next = 2;
1883
- return this.createDraftMail(data);
1884
-
1885
- case 2:
1886
- mail = _context29.sent;
1887
-
1888
- if (mail) {
1889
- _context29.next = 5;
1890
- break;
1891
- }
1892
-
1893
- return _context29.abrupt("return", false);
1894
-
1895
- case 5:
1896
- return _context29.abrupt("return", this.sendDraftMail(mail.mailIntegrityId, customMessage));
1897
-
1898
- case 6:
1899
- case "end":
1900
- return _context29.stop();
1901
- }
1902
- }
1903
- }, _callee29, this);
1904
- }));
1905
-
1906
- function createMail(_x28, _x29) {
1907
- return _createMail.apply(this, arguments);
1908
- }
1909
-
1910
- return createMail;
1911
- }();
1912
-
1913
- _proto.waitingReceivedMails = /*#__PURE__*/function () {
1914
- var _waitingReceivedMails = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee30() {
1915
- var _yield$this$client$qu13, user;
1916
-
1917
- return _regeneratorRuntime.wrap(function _callee30$(_context30) {
1918
- while (1) {
1919
- switch (_context30.prev = _context30.next) {
1920
- case 0:
1921
- _context30.next = 2;
1922
- return this.client.query({
1923
- user: [{}, {
1924
- waitingReceivedMails: {
1925
- date: true,
1926
- attachmentsCount: true,
1927
- sender: {
1928
- id: true,
1929
- firstname: true,
1930
- lastname: true,
1931
- email: true,
1932
- publicKey: true
1933
- },
1934
- recipients: {
1935
- id: true,
1936
- firstname: true,
1937
- lastname: true,
1938
- email: true,
1939
- publicKey: true
1940
- },
1941
- temporaryRecipients: {
1942
- email: true
1943
- }
1944
- }
1945
- }]
1946
- });
1947
-
1948
- case 2:
1949
- _yield$this$client$qu13 = _context30.sent;
1950
- user = _yield$this$client$qu13.user;
1951
-
1952
- if (user) {
1953
- _context30.next = 6;
1954
- break;
1955
- }
1956
-
1957
- throw new Error("Can't get waiting received mails");
1958
-
1959
- case 6:
1960
- return _context30.abrupt("return", user.waitingReceivedMails.map(function (m) {
1961
- return _objectSpread(_objectSpread({
1962
- id: generate()
1963
- }, m), {}, {
1964
- date: new Date(m.date)
1965
- });
1966
- }));
1967
-
1968
- case 7:
1969
- case "end":
1970
- return _context30.stop();
1971
- }
1972
- }
1973
- }, _callee30, this);
1974
- }));
1975
-
1976
- function waitingReceivedMails() {
1977
- return _waitingReceivedMails.apply(this, arguments);
1978
- }
1979
-
1980
- return waitingReceivedMails;
1981
- }();
1982
-
1983
- _proto.updateDraftMail = /*#__PURE__*/function () {
1984
- var _updateDraftMail = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee31(draftId, _ref24) {
1985
- var body, subject, files, recipientsIds, replyTo, drafts, draft, hashKey, hash, senderFiles, _iterator13, _step13, f, file, _yield$this$client$mu9, updateDraftMail;
1986
-
1987
- return _regeneratorRuntime.wrap(function _callee31$(_context31) {
1988
- while (1) {
1989
- switch (_context31.prev = _context31.next) {
1990
- case 0:
1991
- body = _ref24.body, subject = _ref24.subject, files = _ref24.files, recipientsIds = _ref24.recipientsIds, replyTo = _ref24.replyTo;
1992
- _context31.next = 3;
1993
- return this.draftMails();
1994
-
1995
- case 3:
1996
- drafts = _context31.sent;
1997
- draft = drafts.find(function (d) {
1998
- return d.mailIntegrityId === draftId;
1999
- });
2000
-
2001
- if (draft) {
2002
- _context31.next = 7;
2003
- break;
2004
- }
2005
-
2006
- throw new Error("Invalid draft " + draftId);
2007
-
2008
- case 7:
2009
- hashKey = null;
2010
- hash = null;
2011
-
2012
- if (body || subject) {
2013
- hashKey = sodium.randombytes_buf(sodium.crypto_generichash_KEYBYTES, "hex");
2014
- hash = sodium.crypto_generichash(sodium.crypto_generichash_BYTES, JSON.stringify({
2015
- body: body,
2016
- subject: subject
2017
- }), hashKey, "hex");
2018
- }
2019
-
2020
- senderFiles = new Array();
2021
-
2022
- if (!files) {
2023
- _context31.next = 27;
2024
- break;
2025
- }
2026
-
2027
- _iterator13 = _createForOfIteratorHelperLoose(files);
2028
-
2029
- case 13:
2030
- if ((_step13 = _iterator13()).done) {
2031
- _context31.next = 27;
2032
- break;
2033
- }
2034
-
2035
- f = _step13.value;
2036
- file = filesCache.get(f.id);
2037
-
2038
- if (file) {
2039
- _context31.next = 22;
2040
- break;
2041
- }
2042
-
2043
- _context31.next = 19;
2044
- return this.file({
2045
- id: f.id
2046
- });
2047
-
2048
- case 19:
2049
- file = filesCache.get(f.id);
2050
-
2051
- if (file) {
2052
- _context31.next = 22;
2053
- break;
2054
- }
2055
-
2056
- throw new Error("File " + f.name + " (" + f.id + ") does not exists");
2057
-
2058
- case 22:
2059
- if (file.user) {
2060
- _context31.next = 24;
2061
- break;
2062
- }
2063
-
2064
- return _context31.abrupt("continue", 25);
2065
-
2066
- case 24:
2067
- senderFiles.push({
2068
- id: file.id,
2069
- fileKey: sodium.to_hex(encryptCryptoBox(sodium.from_string(file.user.key), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
2070
- name: sodium.to_hex(encryptCryptoBox(sodium.from_string(f.name), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
2071
- });
2072
-
2073
- case 25:
2074
- _context31.next = 13;
2075
- break;
2076
-
2077
- case 27:
2078
- _context31.next = 29;
2079
- return this.client.mutation({
2080
- updateDraftMail: [{
2081
- draftId: draftId,
2082
- recipients: recipientsIds,
2083
- replyTo: replyTo,
2084
- body: body ? sodium.to_hex(encryptCryptoBox(sodium.from_string(body), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)) : null,
2085
- subject: subject ? sodium.to_hex(encryptCryptoBox(sodium.from_string(subject), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)) : null,
2086
- senderFiles: senderFiles,
2087
- hash: hash,
2088
- hashKey: hashKey
2089
- }, gqlMailQuery]
2090
- });
2091
-
2092
- case 29:
2093
- _yield$this$client$mu9 = _context31.sent;
2094
- updateDraftMail = _yield$this$client$mu9.updateDraftMail;
2095
-
2096
- if (updateDraftMail) {
2097
- _context31.next = 33;
2098
- break;
2099
- }
2100
-
2101
- return _context31.abrupt("return", null);
2102
-
2103
- case 33:
2104
- return _context31.abrupt("return", convertInternalMailToExternal(updateDraftMail, _classPrivateFieldLooseBase(this, _keys)[_keys]));
2105
-
2106
- case 34:
2107
- case "end":
2108
- return _context31.stop();
2109
- }
2110
- }
2111
- }, _callee31, this);
2112
- }));
2113
-
2114
- function updateDraftMail(_x30, _x31) {
2115
- return _updateDraftMail.apply(this, arguments);
2116
- }
2117
-
2118
- return updateDraftMail;
2119
- }();
2120
-
2121
- _proto.deleteDraftMail = /*#__PURE__*/function () {
2122
- var _deleteDraftMail = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee32(draftId) {
2123
- var _yield$this$client$mu10, deleteDraftMail;
2124
-
2125
- return _regeneratorRuntime.wrap(function _callee32$(_context32) {
2126
- while (1) {
2127
- switch (_context32.prev = _context32.next) {
2128
- case 0:
2129
- _context32.next = 2;
2130
- return this.client.mutation({
2131
- deleteDraftMail: [{
2132
- draftId: draftId
2133
- }, true]
2134
- });
2135
-
2136
- case 2:
2137
- _yield$this$client$mu10 = _context32.sent;
2138
- deleteDraftMail = _yield$this$client$mu10.deleteDraftMail;
2139
- return _context32.abrupt("return", deleteDraftMail != null ? deleteDraftMail : false);
2140
-
2141
- case 5:
2142
- case "end":
2143
- return _context32.stop();
2144
- }
2145
- }
2146
- }, _callee32, this);
2147
- }));
2148
-
2149
- function deleteDraftMail(_x32) {
2150
- return _deleteDraftMail.apply(this, arguments);
2151
- }
2152
-
2153
- return deleteDraftMail;
2154
- }();
2155
-
2156
- _proto.deleteVFileSharing = /*#__PURE__*/function () {
2157
- var _deleteVFileSharing = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee33(_ref25) {
2158
- var vFileId, userId, _yield$this$client$mu11, deleteVFileSharing;
2159
-
2160
- return _regeneratorRuntime.wrap(function _callee33$(_context33) {
2161
- while (1) {
2162
- switch (_context33.prev = _context33.next) {
2163
- case 0:
2164
- vFileId = _ref25.vFileId, userId = _ref25.userId;
2165
- _context33.next = 3;
2166
- return this.client.mutation({
2167
- deleteVFileSharing: [{
2168
- vFileId: vFileId,
2169
- userId: userId
2170
- }, true]
2171
- });
2172
-
2173
- case 3:
2174
- _yield$this$client$mu11 = _context33.sent;
2175
- deleteVFileSharing = _yield$this$client$mu11.deleteVFileSharing;
2176
- return _context33.abrupt("return", deleteVFileSharing);
2177
-
2178
- case 6:
2179
- case "end":
2180
- return _context33.stop();
2181
- }
2182
- }
2183
- }, _callee33, this);
2184
- }));
2185
-
2186
- function deleteVFileSharing(_x33) {
2187
- return _deleteVFileSharing.apply(this, arguments);
2188
- }
2189
-
2190
- return deleteVFileSharing;
2191
- }();
2192
-
2193
- _proto.deleteFolderSharing = /*#__PURE__*/function () {
2194
- var _deleteFolderSharing = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee34(_ref26) {
2195
- var folderId, userId, _yield$this$client$mu12, deleteFolderSharing;
2196
-
2197
- return _regeneratorRuntime.wrap(function _callee34$(_context34) {
2198
- while (1) {
2199
- switch (_context34.prev = _context34.next) {
2200
- case 0:
2201
- folderId = _ref26.folderId, userId = _ref26.userId;
2202
- _context34.next = 3;
2203
- return this.client.mutation({
2204
- deleteFolderSharing: [{
2205
- folderId: folderId,
2206
- userId: userId
2207
- }, true]
2208
- });
2209
-
2210
- case 3:
2211
- _yield$this$client$mu12 = _context34.sent;
2212
- deleteFolderSharing = _yield$this$client$mu12.deleteFolderSharing;
2213
- return _context34.abrupt("return", deleteFolderSharing);
2214
-
2215
- case 6:
2216
- case "end":
2217
- return _context34.stop();
2218
- }
2219
- }
2220
- }, _callee34, this);
2221
- }));
2222
-
2223
- function deleteFolderSharing(_x34) {
2224
- return _deleteFolderSharing.apply(this, arguments);
2225
- }
2226
-
2227
- return deleteFolderSharing;
2228
- }();
2229
-
2230
- _proto.duplicateVFile = /*#__PURE__*/function () {
2231
- var _duplicateVFile = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee35(_ref27) {
2232
- var vFileId, folderId, customName, file, _yield$this$client$mu13, duplicateVFile;
2233
-
2234
- return _regeneratorRuntime.wrap(function _callee35$(_context35) {
2235
- while (1) {
2236
- switch (_context35.prev = _context35.next) {
2237
- case 0:
2238
- vFileId = _ref27.vFileId, folderId = _ref27.folderId, customName = _ref27.customName;
2239
- file = vFilesCache.get(vFileId);
2240
-
2241
- if (file) {
2242
- _context35.next = 8;
2243
- break;
2244
- }
2245
-
2246
- _context35.next = 5;
2247
- return this.vFile({
2248
- id: vFileId
2249
- });
2250
-
2251
- case 5:
2252
- file = vFilesCache.get(vFileId);
2253
-
2254
- if (file) {
2255
- _context35.next = 8;
2256
- break;
2257
- }
2258
-
2259
- throw new Error("File (" + vFileId + ") does not exists");
2260
-
2261
- case 8:
2262
- if (!customName) {
2263
- _context35.next = 14;
2264
- break;
2265
- }
2266
-
2267
- _context35.next = 11;
2268
- return encryptName(customName, file.userApp.nameKey);
2269
-
2270
- case 11:
2271
- _context35.t0 = _context35.sent;
2272
- _context35.next = 15;
2273
- break;
2274
-
2275
- case 14:
2276
- _context35.t0 = null;
2277
-
2278
- case 15:
2279
- customName = _context35.t0;
2280
- _context35.next = 18;
2281
- return this.client.mutation({
2282
- duplicateVFile: [{
2283
- vFileId: vFileId,
2284
- folderId: folderId,
2285
- customName: customName
2286
- }, true]
2287
- });
2288
-
2289
- case 18:
2290
- _yield$this$client$mu13 = _context35.sent;
2291
- duplicateVFile = _yield$this$client$mu13.duplicateVFile;
2292
- return _context35.abrupt("return", duplicateVFile);
2293
-
2294
- case 21:
2295
- case "end":
2296
- return _context35.stop();
2297
- }
2298
- }
2299
- }, _callee35, this);
2300
- }));
2301
-
2302
- function duplicateVFile(_x35) {
2303
- return _duplicateVFile.apply(this, arguments);
2304
- }
2305
-
2306
- return duplicateVFile;
2307
- }();
2308
-
2309
- _proto.deleteFolderCloudTrash = /*#__PURE__*/function () {
2310
- var _deleteFolderCloudTrash = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee36(_ref28) {
2311
- var ids, _yield$this$client$mu14, deleteFolderCloudTrash;
2312
-
2313
- return _regeneratorRuntime.wrap(function _callee36$(_context36) {
2314
- while (1) {
2315
- switch (_context36.prev = _context36.next) {
2316
- case 0:
2317
- ids = _ref28.ids;
2318
- _context36.next = 3;
2319
- return this.client.mutation({
2320
- deleteFolderCloudTrash: [{
2321
- ids: ids
2322
- }, true]
2323
- });
2324
-
2325
- case 3:
2326
- _yield$this$client$mu14 = _context36.sent;
2327
- deleteFolderCloudTrash = _yield$this$client$mu14.deleteFolderCloudTrash;
2328
- return _context36.abrupt("return", deleteFolderCloudTrash != null ? deleteFolderCloudTrash : false);
2329
-
2330
- case 6:
2331
- case "end":
2332
- return _context36.stop();
2333
- }
2334
- }
2335
- }, _callee36, this);
2336
- }));
2337
-
2338
- function deleteFolderCloudTrash(_x36) {
2339
- return _deleteFolderCloudTrash.apply(this, arguments);
2340
- }
2341
-
2342
- return deleteFolderCloudTrash;
2343
- }();
2344
-
2345
- _proto.deleteVFileCloudTrash = /*#__PURE__*/function () {
2346
- var _deleteVFileCloudTrash = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee37(_ref29) {
2347
- var ids, _yield$this$client$mu15, deleteVFileCloudTrash;
2348
-
2349
- return _regeneratorRuntime.wrap(function _callee37$(_context37) {
2350
- while (1) {
2351
- switch (_context37.prev = _context37.next) {
2352
- case 0:
2353
- ids = _ref29.ids;
2354
- _context37.next = 3;
2355
- return this.client.mutation({
2356
- deleteVFileCloudTrash: [{
2357
- ids: ids
2358
- }, true]
2359
- });
2360
-
2361
- case 3:
2362
- _yield$this$client$mu15 = _context37.sent;
2363
- deleteVFileCloudTrash = _yield$this$client$mu15.deleteVFileCloudTrash;
2364
- return _context37.abrupt("return", deleteVFileCloudTrash != null ? deleteVFileCloudTrash : false);
2365
-
2366
- case 6:
2367
- case "end":
2368
- return _context37.stop();
2369
- }
2370
- }
2371
- }, _callee37, this);
2372
- }));
2373
-
2374
- function deleteVFileCloudTrash(_x37) {
2375
- return _deleteVFileCloudTrash.apply(this, arguments);
2376
- }
2377
-
2378
- return deleteVFileCloudTrash;
2379
- }();
2380
-
2381
- _proto.deleteMailTrash = /*#__PURE__*/function () {
2382
- var _deleteMailTrash = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee38(_ref30) {
2383
- var ids, _yield$this$client$mu16, deleteMailTrash;
2384
-
2385
- return _regeneratorRuntime.wrap(function _callee38$(_context38) {
2386
- while (1) {
2387
- switch (_context38.prev = _context38.next) {
2388
- case 0:
2389
- ids = _ref30.ids;
2390
- _context38.next = 3;
2391
- return this.client.mutation({
2392
- deleteMailTrash: [{
2393
- ids: ids
2394
- }, true]
2395
- });
2396
-
2397
- case 3:
2398
- _yield$this$client$mu16 = _context38.sent;
2399
- deleteMailTrash = _yield$this$client$mu16.deleteMailTrash;
2400
- return _context38.abrupt("return", deleteMailTrash);
2401
-
2402
- case 6:
2403
- case "end":
2404
- return _context38.stop();
2405
- }
2406
- }
2407
- }, _callee38, this);
2408
- }));
2409
-
2410
- function deleteMailTrash(_x38) {
2411
- return _deleteMailTrash.apply(this, arguments);
2412
- }
2413
-
2414
- return deleteMailTrash;
2415
- }();
2416
-
2417
- _proto.emptyMailTrash = /*#__PURE__*/function () {
2418
- var _emptyMailTrash = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee39() {
2419
- var _yield$this$client$mu17, emptyMailTrash;
2420
-
2421
- return _regeneratorRuntime.wrap(function _callee39$(_context39) {
2422
- while (1) {
2423
- switch (_context39.prev = _context39.next) {
2424
- case 0:
2425
- _context39.next = 2;
2426
- return this.client.mutation({
2427
- emptyMailTrash: true
2428
- });
2429
-
2430
- case 2:
2431
- _yield$this$client$mu17 = _context39.sent;
2432
- emptyMailTrash = _yield$this$client$mu17.emptyMailTrash;
2433
- return _context39.abrupt("return", emptyMailTrash != null ? emptyMailTrash : false);
2434
-
2435
- case 5:
2436
- case "end":
2437
- return _context39.stop();
2438
- }
2439
- }
2440
- }, _callee39, this);
2441
- }));
2442
-
2443
- function emptyMailTrash() {
2444
- return _emptyMailTrash.apply(this, arguments);
2445
- }
2446
-
2447
- return emptyMailTrash;
2448
- }();
2449
-
2450
- _proto.emptyCloudTrash = /*#__PURE__*/function () {
2451
- var _emptyCloudTrash = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee40() {
2452
- var _yield$this$client$mu18, emptyCloudTrash;
2453
-
2454
- return _regeneratorRuntime.wrap(function _callee40$(_context40) {
2455
- while (1) {
2456
- switch (_context40.prev = _context40.next) {
2457
- case 0:
2458
- _context40.next = 2;
2459
- return this.client.mutation({
2460
- emptyCloudTrash: true
2461
- });
2462
-
2463
- case 2:
2464
- _yield$this$client$mu18 = _context40.sent;
2465
- emptyCloudTrash = _yield$this$client$mu18.emptyCloudTrash;
2466
- return _context40.abrupt("return", emptyCloudTrash != null ? emptyCloudTrash : false);
2467
-
2468
- case 5:
2469
- case "end":
2470
- return _context40.stop();
2471
- }
2472
- }
2473
- }, _callee40, this);
2474
- }));
2475
-
2476
- function emptyCloudTrash() {
2477
- return _emptyCloudTrash.apply(this, arguments);
2478
- }
2479
-
2480
- return emptyCloudTrash;
2481
- }();
2482
-
2483
- _proto.recoverVFile = /*#__PURE__*/function () {
2484
- var _recoverVFile = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee41(_ref31) {
2485
- var vFileId, _yield$this$client$mu19, recoverVFile;
2486
-
2487
- return _regeneratorRuntime.wrap(function _callee41$(_context41) {
2488
- while (1) {
2489
- switch (_context41.prev = _context41.next) {
2490
- case 0:
2491
- vFileId = _ref31.vFileId;
2492
- _context41.next = 3;
2493
- return this.client.mutation({
2494
- recoverVFile: [{
2495
- vFileId: vFileId
2496
- }, true]
2497
- });
2498
-
2499
- case 3:
2500
- _yield$this$client$mu19 = _context41.sent;
2501
- recoverVFile = _yield$this$client$mu19.recoverVFile;
2502
- return _context41.abrupt("return", recoverVFile);
2503
-
2504
- case 6:
2505
- case "end":
2506
- return _context41.stop();
2507
- }
2508
- }
2509
- }, _callee41, this);
2510
- }));
2511
-
2512
- function recoverVFile(_x39) {
2513
- return _recoverVFile.apply(this, arguments);
2514
- }
2515
-
2516
- return recoverVFile;
2517
- }();
2518
-
2519
- _proto.recoverFolder = /*#__PURE__*/function () {
2520
- var _recoverFolder = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee42(_ref32) {
2521
- var id, _yield$this$client$mu20, recoverFolder;
2522
-
2523
- return _regeneratorRuntime.wrap(function _callee42$(_context42) {
2524
- while (1) {
2525
- switch (_context42.prev = _context42.next) {
2526
- case 0:
2527
- id = _ref32.id;
2528
- _context42.next = 3;
2529
- return this.client.mutation({
2530
- recoverFolder: [{
2531
- id: id
2532
- }, true]
2533
- });
2534
-
2535
- case 3:
2536
- _yield$this$client$mu20 = _context42.sent;
2537
- recoverFolder = _yield$this$client$mu20.recoverFolder;
2538
- return _context42.abrupt("return", recoverFolder != null ? recoverFolder : false);
2539
-
2540
- case 6:
2541
- case "end":
2542
- return _context42.stop();
2543
- }
2544
- }
2545
- }, _callee42, this);
2546
- }));
2547
-
2548
- function recoverFolder(_x40) {
2549
- return _recoverFolder.apply(this, arguments);
2550
- }
2551
-
2552
- return recoverFolder;
2553
- }();
2554
-
2555
- _proto.recoverMail = /*#__PURE__*/function () {
2556
- var _recoverMail = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee43(_ref33) {
2557
- var mailId, _yield$this$client$mu21, recoverMail;
2558
-
2559
- return _regeneratorRuntime.wrap(function _callee43$(_context43) {
2560
- while (1) {
2561
- switch (_context43.prev = _context43.next) {
2562
- case 0:
2563
- mailId = _ref33.mailId;
2564
- _context43.next = 3;
2565
- return this.client.mutation({
2566
- recoverMail: [{
2567
- mailId: mailId
2568
- }, true]
2569
- });
2570
-
2571
- case 3:
2572
- _yield$this$client$mu21 = _context43.sent;
2573
- recoverMail = _yield$this$client$mu21.recoverMail;
2574
- return _context43.abrupt("return", recoverMail);
2575
-
2576
- case 6:
2577
- case "end":
2578
- return _context43.stop();
2579
- }
2580
- }
2581
- }, _callee43, this);
2582
- }));
2583
-
2584
- function recoverMail(_x41) {
2585
- return _recoverMail.apply(this, arguments);
2586
- }
2587
-
2588
- return recoverMail;
2589
- }();
2590
-
2591
- _proto.deleteFile = /*#__PURE__*/function () {
2592
- var _deleteFile = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee44(_ref34) {
2593
- var fileId, vFileId, _yield$this$client$mu22, deleteFile;
2594
-
2595
- return _regeneratorRuntime.wrap(function _callee44$(_context44) {
2596
- while (1) {
2597
- switch (_context44.prev = _context44.next) {
2598
- case 0:
2599
- fileId = _ref34.fileId, vFileId = _ref34.vFileId;
2600
- _context44.next = 3;
2601
- return this.client.mutation({
2602
- deleteFile: [{
2603
- fileId: fileId,
2604
- vFileId: vFileId
2605
- }, true]
2606
- });
2607
-
2608
- case 3:
2609
- _yield$this$client$mu22 = _context44.sent;
2610
- deleteFile = _yield$this$client$mu22.deleteFile;
2611
- return _context44.abrupt("return", deleteFile);
2612
-
2613
- case 6:
2614
- case "end":
2615
- return _context44.stop();
2616
- }
2617
- }
2618
- }, _callee44, this);
2619
- }));
2620
-
2621
- function deleteFile(_x42) {
2622
- return _deleteFile.apply(this, arguments);
2623
- }
2624
-
2625
- return deleteFile;
2626
- }();
2627
-
2628
- _proto.deleteVFile = /*#__PURE__*/function () {
2629
- var _deleteVFile = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee45(_ref35) {
2630
- var fileId, _yield$this$client$mu23, deleteVFile;
2631
-
2632
- return _regeneratorRuntime.wrap(function _callee45$(_context45) {
2633
- while (1) {
2634
- switch (_context45.prev = _context45.next) {
2635
- case 0:
2636
- fileId = _ref35.fileId;
2637
- _context45.next = 3;
2638
- return this.client.mutation({
2639
- deleteVFile: [{
2640
- fileId: fileId
2641
- }, true]
2642
- });
2643
-
2644
- case 3:
2645
- _yield$this$client$mu23 = _context45.sent;
2646
- deleteVFile = _yield$this$client$mu23.deleteVFile;
2647
- return _context45.abrupt("return", deleteVFile);
2648
-
2649
- case 6:
2650
- case "end":
2651
- return _context45.stop();
2652
- }
2653
- }
2654
- }, _callee45, this);
2655
- }));
2656
-
2657
- function deleteVFile(_x43) {
2658
- return _deleteVFile.apply(this, arguments);
2659
- }
2660
-
2661
- return deleteVFile;
2662
- }();
2663
-
2664
- _proto.deleteMail = /*#__PURE__*/function () {
2665
- var _deleteMail = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee46(_ref36) {
2666
- var mailId, _yield$this$client$mu24, deleteMail;
2667
-
2668
- return _regeneratorRuntime.wrap(function _callee46$(_context46) {
2669
- while (1) {
2670
- switch (_context46.prev = _context46.next) {
2671
- case 0:
2672
- mailId = _ref36.mailId;
2673
- _context46.next = 3;
2674
- return this.client.mutation({
2675
- deleteMail: [{
2676
- mailId: mailId
2677
- }, true]
2678
- });
2679
-
2680
- case 3:
2681
- _yield$this$client$mu24 = _context46.sent;
2682
- deleteMail = _yield$this$client$mu24.deleteMail;
2683
- return _context46.abrupt("return", deleteMail);
2684
-
2685
- case 6:
2686
- case "end":
2687
- return _context46.stop();
2688
- }
2689
- }
2690
- }, _callee46, this);
2691
- }));
2692
-
2693
- function deleteMail(_x44) {
2694
- return _deleteMail.apply(this, arguments);
2695
- }
2696
-
2697
- return deleteMail;
2698
- }();
2699
-
2700
- _proto.saveInCloud = /*#__PURE__*/function () {
2701
- var _saveInCloud = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee47(_ref37) {
2702
- var _this5 = this;
2703
-
2704
- var fileId, name, folderId, key, file, _filesCache$get, _file2, receivedMails, mail, fileMail, fileKey, nameKey, encryptedName, encryptedNameKey, _yield$this$client$mu25, saveInCloud, vFile, me, others;
2705
-
2706
- return _regeneratorRuntime.wrap(function _callee47$(_context47) {
2707
- while (1) {
2708
- switch (_context47.prev = _context47.next) {
2709
- case 0:
2710
- fileId = _ref37.fileId, name = _ref37.name, folderId = _ref37.folderId;
2711
-
2712
- if (!(folderId && !foldersCache.has(folderId))) {
2713
- _context47.next = 6;
2714
- break;
2715
- }
2716
-
2717
- _context47.next = 4;
2718
- return this.folder({
2719
- id: folderId
2720
- });
2721
-
2722
- case 4:
2723
- if (foldersCache.has(folderId)) {
2724
- _context47.next = 6;
2725
- break;
2726
- }
2727
-
2728
- throw new Error("The folder " + folderId + " does not exists");
2729
-
2730
- case 6:
2731
- key = "";
2732
- file = filesCache.get(fileId);
2733
-
2734
- if (file) {
2735
- _context47.next = 31;
2736
- break;
2737
- }
2738
-
2739
- _context47.next = 11;
2740
- return this.file({
2741
- id: fileId
2742
- });
2743
-
2744
- case 11:
2745
- _file2 = (_filesCache$get = filesCache.get(fileId)) != null ? _filesCache$get : null;
2746
-
2747
- if (_file2) {
2748
- _context47.next = 26;
2749
- break;
2750
- }
2751
-
2752
- _context47.next = 15;
2753
- return this.receivedMails();
2754
-
2755
- case 15:
2756
- receivedMails = _context47.sent;
2757
- mail = receivedMails.find(function (m) {
2758
- return m.files.some(function (f) {
2759
- return f.id === fileId;
2760
- });
2761
- });
2762
-
2763
- if (mail) {
2764
- _context47.next = 19;
2765
- break;
2766
- }
2767
-
2768
- throw new Error("Can't find mail with the file " + fileId);
2769
-
2770
- case 19:
2771
- fileMail = mail.files.find(function (f) {
2772
- return f.id === fileId;
2773
- });
2774
-
2775
- if (fileMail) {
2776
- _context47.next = 22;
2777
- break;
2778
- }
2779
-
2780
- throw new Error("Can't find mail with the file " + fileId);
2781
-
2782
- case 22:
2783
- fileKey = decryptCryptoBox(sodium.from_hex(fileMail.key), mail.sender.publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
2784
- key = sodium.to_hex(fileKey);
2785
- _context47.next = 29;
2786
- break;
2787
-
2788
- case 26:
2789
- if (_file2.user) {
2790
- _context47.next = 28;
2791
- break;
2792
- }
2793
-
2794
- throw new Error("Unexpected error 1");
2795
-
2796
- case 28:
2797
- key = _file2.user.key;
2798
-
2799
- case 29:
2800
- _context47.next = 34;
2801
- break;
2802
-
2803
- case 31:
2804
- if (file.user) {
2805
- _context47.next = 33;
2806
- break;
2807
- }
2808
-
2809
- throw new Error("Unexpected error 2");
2810
-
2811
- case 33:
2812
- key = file.user.key;
2813
-
2814
- case 34:
2815
- if (!(key === "")) {
2816
- _context47.next = 36;
2817
- break;
2818
- }
2819
-
2820
- throw new Error("Unexpected error 3");
2821
-
2822
- case 36:
2823
- key = sodium.to_hex(encryptCryptoBox(sodium.from_hex(key), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey));
2824
- nameKey = secretstreamKeygen();
2825
- _context47.next = 40;
2826
- return encryptName(name, sodium.to_hex(nameKey));
2827
-
2828
- case 40:
2829
- encryptedName = _context47.sent;
2830
- encryptedNameKey = sodium.to_hex(encryptCryptoBox(nameKey, _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey));
2831
- _context47.next = 44;
2832
- return this.client.mutation({
2833
- saveInCloud: [{
2834
- fileId: fileId,
2835
- key: key,
2836
- folderId: folderId,
2837
- filename: encryptedName,
2838
- nameKey: encryptedNameKey
2839
- }, gqlVFileWithFolderQuery]
2840
- });
2841
-
2842
- case 44:
2843
- _yield$this$client$mu25 = _context47.sent;
2844
- saveInCloud = _yield$this$client$mu25.saveInCloud;
2845
- _context47.next = 48;
2846
- return gqlVFileToExternal(saveInCloud, _classPrivateFieldLooseBase(this, _keys)[_keys]);
2847
-
2848
- case 48:
2849
- vFile = _context47.sent;
2850
- me = vFile.folder.users.find(function (_ref38) {
2851
- var u = _ref38[0];
2852
- return u.publicKey === _classPrivateFieldLooseBase(_this5, _keys)[_keys].publicKey;
2853
- });
2854
-
2855
- if (!(me && ["admin", "write"].includes(me[1]))) {
2856
- _context47.next = 54;
2857
- break;
2858
- }
2859
-
2860
- others = vFile.folder.users.filter(function (_ref39) {
2861
- var u = _ref39[0];
2862
- return u.publicKey !== _classPrivateFieldLooseBase(_this5, _keys)[_keys].publicKey;
2863
- });
2864
- _context47.next = 54;
2865
- return Promise.all(others.map(function (_ref40) {
2866
- var u = _ref40[0],
2867
- rights = _ref40[1];
2868
- return _this5.shareVFile({
2869
- vFileId: vFile.id,
2870
- rights: rights,
2871
- userId: u.id
2872
- });
2873
- }));
2874
-
2875
- case 54:
2876
- return _context47.abrupt("return", vFile);
2877
-
2878
- case 55:
2879
- case "end":
2880
- return _context47.stop();
2881
- }
2882
- }
2883
- }, _callee47, this);
2884
- }));
2885
-
2886
- function saveInCloud(_x45) {
2887
- return _saveInCloud.apply(this, arguments);
2888
- }
2889
-
2890
- return saveInCloud;
2891
- }();
2892
-
2893
- _proto.sendDraftMail = /*#__PURE__*/function () {
2894
- var _sendDraftMail = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee48(draftId, customMessage) {
2895
- var drafts, draft, recipients, temporaryRecipients, _iterator14, _step14, email, input, _iterator15, _step15, id, _input, _yield$this$client$mu26, sendDraftMail;
2896
-
2897
- return _regeneratorRuntime.wrap(function _callee48$(_context48) {
2898
- while (1) {
2899
- switch (_context48.prev = _context48.next) {
2900
- case 0:
2901
- _context48.next = 2;
2902
- return this.draftMails();
2903
-
2904
- case 2:
2905
- drafts = _context48.sent;
2906
- draft = drafts.find(function (d) {
2907
- return d.mailIntegrityId === draftId;
2908
- });
2909
-
2910
- if (draft) {
2911
- _context48.next = 6;
2912
- break;
2913
- }
2914
-
2915
- return _context48.abrupt("return", false);
2916
-
2917
- case 6:
2918
- recipients = new Array();
2919
- temporaryRecipients = new Array();
2920
- _iterator14 = _createForOfIteratorHelperLoose(draft.temporaryRecipients);
2921
-
2922
- case 9:
2923
- if ((_step14 = _iterator14()).done) {
2924
- _context48.next = 19;
2925
- break;
2926
- }
2927
-
2928
- email = _step14.value.email;
2929
-
2930
- if (email) {
2931
- _context48.next = 13;
2932
- break;
2933
- }
2934
-
2935
- return _context48.abrupt("continue", 17);
2936
-
2937
- case 13:
2938
- _context48.next = 15;
2939
- return this._eachUser(draft.files, draft.subject, draft.body, email);
2940
-
2941
- case 15:
2942
- input = _context48.sent;
2943
-
2944
- if (!input) {
2945
- temporaryRecipients.push(email);
2946
- } else {
2947
- recipients.push(input);
2948
- }
2949
-
2950
- case 17:
2951
- _context48.next = 9;
2952
- break;
2953
-
2954
- case 19:
2955
- _iterator15 = _createForOfIteratorHelperLoose(draft.recipients);
2956
-
2957
- case 20:
2958
- if ((_step15 = _iterator15()).done) {
2959
- _context48.next = 28;
2960
- break;
2961
- }
2962
-
2963
- id = _step15.value.id;
2964
- _context48.next = 24;
2965
- return this._eachUser(draft.files, draft.subject, draft.body, id);
2966
-
2967
- case 24:
2968
- _input = _context48.sent;
2969
-
2970
- if (!_input) {
2971
- temporaryRecipients.push(id);
2972
- } else {
2973
- recipients.push(_input);
2974
- }
2975
-
2976
- case 26:
2977
- _context48.next = 20;
2978
- break;
2979
-
2980
- case 28:
2981
- _context48.next = 30;
2982
- return this.client.mutation({
2983
- sendDraftMail: [{
2984
- temporaryRecipients: temporaryRecipients,
2985
- recipients: recipients,
2986
- draftMailId: draft.mailIntegrityId,
2987
- customMessage: customMessage
2988
- }, true]
2989
- });
2990
-
2991
- case 30:
2992
- _yield$this$client$mu26 = _context48.sent;
2993
- sendDraftMail = _yield$this$client$mu26.sendDraftMail;
2994
- return _context48.abrupt("return", sendDraftMail != null ? sendDraftMail : false);
2995
-
2996
- case 33:
2997
- case "end":
2998
- return _context48.stop();
2999
- }
3000
- }
3001
- }, _callee48, this);
3002
- }));
3003
-
3004
- function sendDraftMail(_x46, _x47) {
3005
- return _sendDraftMail.apply(this, arguments);
3006
- }
3007
-
3008
- return sendDraftMail;
3009
- }();
3010
-
3011
- _proto.sendWaitingEmails = /*#__PURE__*/function () {
3012
- var _sendWaitingEmails = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee49() {
3013
- var mails, filtered, _iterator16, _step16, mail, _iterator17, _step17, email, input;
3014
-
3015
- return _regeneratorRuntime.wrap(function _callee49$(_context49) {
3016
- while (1) {
3017
- switch (_context49.prev = _context49.next) {
3018
- case 0:
3019
- _context49.next = 2;
3020
- return this.sentMails();
3021
-
3022
- case 2:
3023
- mails = _context49.sent;
3024
- filtered = mails.filter(function (m) {
3025
- return m.temporaryRecipients.length > 0;
3026
- });
3027
- _iterator16 = _createForOfIteratorHelperLoose(filtered);
3028
-
3029
- case 5:
3030
- if ((_step16 = _iterator16()).done) {
3031
- _context49.next = 22;
3032
- break;
3033
- }
3034
-
3035
- mail = _step16.value;
3036
- _iterator17 = _createForOfIteratorHelperLoose(mail.temporaryRecipients);
3037
-
3038
- case 8:
3039
- if ((_step17 = _iterator17()).done) {
3040
- _context49.next = 20;
3041
- break;
3042
- }
3043
-
3044
- email = _step17.value.email;
3045
-
3046
- if (email) {
3047
- _context49.next = 12;
3048
- break;
3049
- }
3050
-
3051
- return _context49.abrupt("continue", 18);
3052
-
3053
- case 12:
3054
- _context49.next = 14;
3055
- return this._eachUser(mail.files, mail.subject, mail.body, email);
3056
-
3057
- case 14:
3058
- input = _context49.sent;
3059
-
3060
- if (!input) {
3061
- _context49.next = 18;
3062
- break;
3063
- }
3064
-
3065
- _context49.next = 18;
3066
- return this.client.mutation({
3067
- sendOneMail: [{
3068
- mailIntegrityId: mail.mailIntegrityId,
3069
- recipient: input
3070
- }, true]
3071
- });
3072
-
3073
- case 18:
3074
- _context49.next = 8;
3075
- break;
3076
-
3077
- case 20:
3078
- _context49.next = 5;
3079
- break;
3080
-
3081
- case 22:
3082
- return _context49.abrupt("return", false);
3083
-
3084
- case 23:
3085
- case "end":
3086
- return _context49.stop();
3087
- }
3088
- }
3089
- }, _callee49, this);
3090
- }));
3091
-
3092
- function sendWaitingEmails() {
3093
- return _sendWaitingEmails.apply(this, arguments);
3094
- }
3095
-
3096
- return sendWaitingEmails;
3097
- }();
3098
-
3099
- _proto.createDraftMail = /*#__PURE__*/function () {
3100
- var _createDraftMail = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee50(_ref41) {
3101
- var body, subject, files, recipientsIds, replyTo, hashKey, hash, senderFiles, _iterator18, _step18, f, file, _yield$this$client$mu27, createDraftMail;
3102
-
3103
- return _regeneratorRuntime.wrap(function _callee50$(_context50) {
3104
- while (1) {
3105
- switch (_context50.prev = _context50.next) {
3106
- case 0:
3107
- body = _ref41.body, subject = _ref41.subject, files = _ref41.files, recipientsIds = _ref41.recipientsIds, replyTo = _ref41.replyTo;
3108
- hashKey = sodium.randombytes_buf(sodium.crypto_generichash_KEYBYTES, "hex");
3109
- hash = sodium.crypto_generichash(sodium.crypto_generichash_BYTES, JSON.stringify({
3110
- body: body,
3111
- subject: subject
3112
- }), hashKey, "hex");
3113
- senderFiles = new Array();
3114
- _iterator18 = _createForOfIteratorHelperLoose(files);
3115
-
3116
- case 5:
3117
- if ((_step18 = _iterator18()).done) {
3118
- _context50.next = 19;
3119
- break;
3120
- }
3121
-
3122
- f = _step18.value;
3123
- file = filesCache.get(f.id);
3124
-
3125
- if (file) {
3126
- _context50.next = 14;
3127
- break;
3128
- }
3129
-
3130
- _context50.next = 11;
3131
- return this.file({
3132
- id: f.id
3133
- });
3134
-
3135
- case 11:
3136
- file = filesCache.get(f.id);
3137
-
3138
- if (file) {
3139
- _context50.next = 14;
3140
- break;
3141
- }
3142
-
3143
- throw new Error("File " + f.name + " (" + f.id + ") does not exists");
3144
-
3145
- case 14:
3146
- if (file.user) {
3147
- _context50.next = 16;
3148
- break;
3149
- }
3150
-
3151
- return _context50.abrupt("continue", 17);
3152
-
3153
- case 16:
3154
- senderFiles.push({
3155
- id: file.id,
3156
- fileKey: sodium.to_hex(encryptCryptoBox(sodium.from_string(file.user.key), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
3157
- name: sodium.to_hex(encryptCryptoBox(sodium.from_string(f.name), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
3158
- });
3159
-
3160
- case 17:
3161
- _context50.next = 5;
3162
- break;
3163
-
3164
- case 19:
3165
- _context50.next = 21;
3166
- return this.client.mutation({
3167
- createDraftMail: [{
3168
- recipients: recipientsIds,
3169
- replyTo: replyTo,
3170
- body: sodium.to_hex(encryptCryptoBox(sodium.from_string(body), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
3171
- subject: sodium.to_hex(encryptCryptoBox(sodium.from_string(subject), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
3172
- senderFiles: senderFiles,
3173
- hash: hash,
3174
- hashKey: hashKey
3175
- }, gqlMailQuery]
3176
- });
3177
-
3178
- case 21:
3179
- _yield$this$client$mu27 = _context50.sent;
3180
- createDraftMail = _yield$this$client$mu27.createDraftMail;
3181
-
3182
- if (createDraftMail) {
3183
- _context50.next = 25;
3184
- break;
3185
- }
3186
-
3187
- return _context50.abrupt("return", null);
3188
-
3189
- case 25:
3190
- return _context50.abrupt("return", convertInternalMailToExternal(createDraftMail, _classPrivateFieldLooseBase(this, _keys)[_keys]));
3191
-
3192
- case 26:
3193
- case "end":
3194
- return _context50.stop();
3195
- }
3196
- }
3197
- }, _callee50, this);
3198
- }));
3199
-
3200
- function createDraftMail(_x48) {
3201
- return _createDraftMail.apply(this, arguments);
3202
- }
3203
-
3204
- return createDraftMail;
3205
- }();
3206
-
3207
- _proto.fileContent = /*#__PURE__*/function () {
3208
- var _fileContent = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee52(_ref42) {
3209
- var fileId, onDownloadProgress, progressDecrypt, signal, _yield$this$client$qu14, fileContent, progressParts, onProgress, parts, byPart, encryptedContent, md5Encrypted, key, src, md5Content;
3210
-
3211
- return _regeneratorRuntime.wrap(function _callee52$(_context52) {
3212
- while (1) {
3213
- switch (_context52.prev = _context52.next) {
3214
- case 0:
3215
- fileId = _ref42.fileId, onDownloadProgress = _ref42.onDownloadProgress, progressDecrypt = _ref42.progressDecrypt, signal = _ref42.signal;
3216
- _context52.next = 3;
3217
- return this.client.query({
3218
- fileContent: [{
3219
- fileId: fileId
3220
- }, {
3221
- __typename: true,
3222
- "...on FileContentCloud": {
3223
- parts: {
3224
- contentUrl: true,
3225
- order: true,
3226
- md5: true
3227
- },
3228
- key: true,
3229
- publicKey: true,
3230
- totalSize: true,
3231
- md5: true,
3232
- md5Encrypted: true
3233
- },
3234
- "...on FileContentReceivedMail": {
3235
- parts: {
3236
- contentUrl: true,
3237
- order: true,
3238
- md5: true
3239
- },
3240
- key: true,
3241
- senderPublicKey: true,
3242
- totalSize: true,
3243
- md5: true,
3244
- md5Encrypted: true
3245
- },
3246
- "...on FileContentSentMail": {
3247
- parts: {
3248
- contentUrl: true,
3249
- order: true,
3250
- md5: true
3251
- },
3252
- key: true,
3253
- totalSize: true,
3254
- md5: true,
3255
- md5Encrypted: true
3256
- }
3257
- }]
3258
- });
3259
-
3260
- case 3:
3261
- _yield$this$client$qu14 = _context52.sent;
3262
- fileContent = _yield$this$client$qu14.fileContent;
3263
-
3264
- if (fileContent) {
3265
- _context52.next = 7;
3266
- break;
3267
- }
3268
-
3269
- throw new Error("File " + fileId + " does not exists");
3270
-
3271
- case 7:
3272
- progressParts = {};
3273
-
3274
- onProgress = function onProgress(part, progressEvent) {
3275
- progressParts[part] = progressEvent;
3276
- var transferredBytes = Object.values(progressParts).reduce(function (prv, cur) {
3277
- return prv + cur.transferredBytes;
3278
- }, 0);
3279
- var totalBytes = Number(fileContent.totalSize);
3280
- onDownloadProgress == null ? void 0 : onDownloadProgress({
3281
- percent: transferredBytes / totalBytes,
3282
- totalBytes: totalBytes,
3283
- transferredBytes: transferredBytes
3284
- });
3285
- };
3286
-
3287
- parts = new Array();
3288
-
3289
- byPart = /*#__PURE__*/function () {
3290
- var _ref43 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee51(part) {
3291
- var buf, md5Part;
3292
- return _regeneratorRuntime.wrap(function _callee51$(_context51) {
3293
- while (1) {
3294
- switch (_context51.prev = _context51.next) {
3295
- case 0:
3296
- _context51.t0 = Uint8Array;
3297
- _context51.next = 3;
3298
- return ky.get(part.contentUrl, {
3299
- onDownloadProgress: function onDownloadProgress(pr) {
3300
- return onProgress(part.order, pr);
3301
- },
3302
- signal: signal
3303
- }).arrayBuffer();
3304
-
3305
- case 3:
3306
- _context51.t1 = _context51.sent;
3307
- buf = new _context51.t0(_context51.t1);
3308
- _context51.next = 7;
3309
- return md5(buf);
3310
-
3311
- case 7:
3312
- md5Part = _context51.sent;
3313
-
3314
- if (!(md5Part !== part.md5)) {
3315
- _context51.next = 10;
3316
- break;
3317
- }
3318
-
3319
- throw new Error("Invalid md5 for part " + part.order + " of file " + fileId);
3320
-
3321
- case 10:
3322
- parts.push({
3323
- data: buf,
3324
- order: part.order
3325
- });
3326
-
3327
- case 11:
3328
- case "end":
3329
- return _context51.stop();
3330
- }
3331
- }
3332
- }, _callee51);
3333
- }));
3334
-
3335
- return function byPart(_x50) {
3336
- return _ref43.apply(this, arguments);
3337
- };
3338
- }();
3339
-
3340
- _context52.next = 13;
3341
- return promiseAllLimit(3, fileContent.parts.map(function (p) {
3342
- return function () {
3343
- return byPart(p);
3344
- };
3345
- }));
3346
-
3347
- case 13:
3348
- encryptedContent = concatenate.apply(void 0, parts.sort(function (a, b) {
3349
- return a.order - b.order;
3350
- }).map(function (p) {
3351
- return p.data;
3352
- })); // const md5Encrypted = await firstValueFrom(md5(of(encryptedContent)));
3353
-
3354
- _context52.next = 16;
3355
- return md5(encryptedContent);
3356
-
3357
- case 16:
3358
- md5Encrypted = _context52.sent;
3359
-
3360
- if (!(md5Encrypted !== fileContent.md5Encrypted)) {
3361
- _context52.next = 19;
3362
- break;
3363
- }
3364
-
3365
- throw new Error("Encrypted content does not match");
3366
-
3367
- case 19:
3368
- key = decryptCryptoBox(sodium.from_hex(fileContent.key), fileContent.__typename === "FileContentReceivedMail" ? fileContent.senderPublicKey : fileContent.__typename === "FileContentCloud" ? fileContent.publicKey : _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
3369
- _context52.next = 22;
3370
- return decrypt(key, encryptedContent, progressDecrypt, signal);
3371
-
3372
- case 22:
3373
- src = _context52.sent;
3374
- _context52.next = 25;
3375
- return md5(src);
3376
-
3377
- case 25:
3378
- md5Content = _context52.sent;
3379
-
3380
- if (!(md5Content !== fileContent.md5)) {
3381
- _context52.next = 28;
3382
- break;
3383
- }
3384
-
3385
- throw new Error("Content does not match");
3386
-
3387
- case 28:
3388
- return _context52.abrupt("return", uncompress(src));
3389
-
3390
- case 29:
3391
- case "end":
3392
- return _context52.stop();
3393
- }
3394
- }
3395
- }, _callee52, this);
3396
- }));
3397
-
3398
- function fileContent(_x49) {
3399
- return _fileContent.apply(this, arguments);
3400
- }
3401
-
3402
- return fileContent;
3403
- }();
3404
-
3405
- _proto.updateFile = /*#__PURE__*/function () {
3406
- var _updateFile = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee53(_ref44) {
3407
- var fileId, filename, isFavorite, deletedAt, file, encryptedName, _yield$this$client$mu28, updateFile;
3408
-
3409
- return _regeneratorRuntime.wrap(function _callee53$(_context53) {
3410
- while (1) {
3411
- switch (_context53.prev = _context53.next) {
3412
- case 0:
3413
- fileId = _ref44.fileId, filename = _ref44.filename, isFavorite = _ref44.isFavorite, deletedAt = _ref44.deletedAt;
3414
- file = vFilesCache.get(fileId);
3415
-
3416
- if (file) {
3417
- _context53.next = 4;
3418
- break;
3419
- }
3420
-
3421
- throw "Can't find file " + fileId;
3422
-
3423
- case 4:
3424
- if (!filename) {
3425
- _context53.next = 10;
3426
- break;
3427
- }
3428
-
3429
- _context53.next = 7;
3430
- return encryptName(filename, file.userApp.nameKey);
3431
-
3432
- case 7:
3433
- _context53.t0 = _context53.sent;
3434
- _context53.next = 11;
3435
- break;
3436
-
3437
- case 10:
3438
- _context53.t0 = null;
3439
-
3440
- case 11:
3441
- encryptedName = _context53.t0;
3442
- _context53.next = 14;
3443
- return this.client.mutation({
3444
- updateFile: [{
3445
- fileId: fileId,
3446
- filename: encryptedName,
3447
- isFavorite: isFavorite,
3448
- deletedAt: deletedAt
3449
- }, gqlVFileQuery]
3450
- });
3451
-
3452
- case 14:
3453
- _yield$this$client$mu28 = _context53.sent;
3454
- updateFile = _yield$this$client$mu28.updateFile;
3455
-
3456
- if (updateFile) {
3457
- _context53.next = 18;
3458
- break;
3459
- }
3460
-
3461
- throw new Error("Can't update file");
3462
-
3463
- case 18:
3464
- return _context53.abrupt("return", gqlVFileToExternal(updateFile, _classPrivateFieldLooseBase(this, _keys)[_keys]));
3465
-
3466
- case 19:
3467
- case "end":
3468
- return _context53.stop();
3469
- }
3470
- }
3471
- }, _callee53, this);
3472
- }));
3473
-
3474
- function updateFile(_x51) {
3475
- return _updateFile.apply(this, arguments);
3476
- }
3477
-
3478
- return updateFile;
3479
- }();
3480
-
3481
- _proto.readMail = /*#__PURE__*/function () {
3482
- var _readMail = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee54(_ref45) {
3483
- var mailId, _yield$this$client$mu29, readMail;
3484
-
3485
- return _regeneratorRuntime.wrap(function _callee54$(_context54) {
3486
- while (1) {
3487
- switch (_context54.prev = _context54.next) {
3488
- case 0:
3489
- mailId = _ref45.mailId;
3490
- _context54.next = 3;
3491
- return this.client.mutation({
3492
- readMail: [{
3493
- mailId: mailId
3494
- }, true]
3495
- });
3496
-
3497
- case 3:
3498
- _yield$this$client$mu29 = _context54.sent;
3499
- readMail = _yield$this$client$mu29.readMail;
3500
- return _context54.abrupt("return", readMail != null ? readMail : false);
3501
-
3502
- case 6:
3503
- case "end":
3504
- return _context54.stop();
3505
- }
3506
- }
3507
- }, _callee54, this);
3508
- }));
3509
-
3510
- function readMail(_x52) {
3511
- return _readMail.apply(this, arguments);
3512
- }
3513
-
3514
- return readMail;
3515
- }();
3516
-
3517
- _proto.unreadMail = /*#__PURE__*/function () {
3518
- var _unreadMail = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee55(_ref46) {
3519
- var mailId, _yield$this$client$mu30, unreadMail;
3520
-
3521
- return _regeneratorRuntime.wrap(function _callee55$(_context55) {
3522
- while (1) {
3523
- switch (_context55.prev = _context55.next) {
3524
- case 0:
3525
- mailId = _ref46.mailId;
3526
- _context55.next = 3;
3527
- return this.client.mutation({
3528
- unreadMail: [{
3529
- mailId: mailId
3530
- }, true]
3531
- });
3532
-
3533
- case 3:
3534
- _yield$this$client$mu30 = _context55.sent;
3535
- unreadMail = _yield$this$client$mu30.unreadMail;
3536
- return _context55.abrupt("return", unreadMail != null ? unreadMail : false);
3537
-
3538
- case 6:
3539
- case "end":
3540
- return _context55.stop();
3541
- }
3542
- }
3543
- }, _callee55, this);
3544
- }));
3545
-
3546
- function unreadMail(_x53) {
3547
- return _unreadMail.apply(this, arguments);
3548
- }
3549
-
3550
- return unreadMail;
3551
- }();
3552
-
3553
- _proto.appSettings = /*#__PURE__*/function () {
3554
- var _appSettings = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee56() {
3555
- var _user$appSettings;
3556
-
3557
- var _yield$this$client$qu15, user;
3558
-
3559
- return _regeneratorRuntime.wrap(function _callee56$(_context56) {
3560
- while (1) {
3561
- switch (_context56.prev = _context56.next) {
3562
- case 0:
3563
- _context56.next = 2;
3564
- return this.client.query({
3565
- user: [{}, {
3566
- appSettings: {
3567
- autoDisconnectDelay: true,
3568
- cloudFileDaysForDelete: true,
3569
- cloudFolderDaysForDelete: true,
3570
- historyFileDaysForDelete: true,
3571
- historyMaxFileCount: true
3572
- }
3573
- }]
3574
- });
3575
-
3576
- case 2:
3577
- _yield$this$client$qu15 = _context56.sent;
3578
- user = _yield$this$client$qu15.user;
3579
-
3580
- if (user) {
3581
- _context56.next = 6;
3582
- break;
3583
- }
3584
-
3585
- return _context56.abrupt("return", null);
3586
-
3587
- case 6:
3588
- return _context56.abrupt("return", (_user$appSettings = user.appSettings) != null ? _user$appSettings : null);
3589
-
3590
- case 7:
3591
- case "end":
3592
- return _context56.stop();
3593
- }
3594
- }
3595
- }, _callee56, this);
3596
- }));
3597
-
3598
- function appSettings() {
3599
- return _appSettings.apply(this, arguments);
3600
- }
3601
-
3602
- return appSettings;
3603
- }();
3604
-
3605
- _proto.updateAppSettings = /*#__PURE__*/function () {
3606
- var _updateAppSettings = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee57(settings) {
3607
- var _yield$this$client$mu31, updateAppSettings;
3608
-
3609
- return _regeneratorRuntime.wrap(function _callee57$(_context57) {
3610
- while (1) {
3611
- switch (_context57.prev = _context57.next) {
3612
- case 0:
3613
- _context57.next = 2;
3614
- return this.client.mutation({
3615
- updateAppSettings: [settings, {
3616
- autoDisconnectDelay: true,
3617
- cloudFileDaysForDelete: true,
3618
- cloudFolderDaysForDelete: true,
3619
- historyFileDaysForDelete: true,
3620
- historyMaxFileCount: true
3621
- }]
3622
- });
3623
-
3624
- case 2:
3625
- _yield$this$client$mu31 = _context57.sent;
3626
- updateAppSettings = _yield$this$client$mu31.updateAppSettings;
3627
- return _context57.abrupt("return", updateAppSettings);
3628
-
3629
- case 5:
3630
- case "end":
3631
- return _context57.stop();
3632
- }
3633
- }
3634
- }, _callee57, this);
3635
- }));
3636
-
3637
- function updateAppSettings(_x54) {
3638
- return _updateAppSettings.apply(this, arguments);
3639
- }
3640
-
3641
- return updateAppSettings;
3642
- }();
3643
-
3644
- _proto.receivedMails = /*#__PURE__*/function () {
3645
- var _receivedMails = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee58() {
3646
- var _user$receivedMails;
3647
-
3648
- var _yield$this$client$qu16, user, mails, receivedMails, _iterator19, _step19, m, mail;
3649
-
3650
- return _regeneratorRuntime.wrap(function _callee58$(_context58) {
3651
- while (1) {
3652
- switch (_context58.prev = _context58.next) {
3653
- case 0:
3654
- _context58.next = 2;
3655
- return this.client.query({
3656
- user: [{}, {
3657
- receivedMails: gqlMailQuery
3658
- }]
3659
- });
3660
-
3661
- case 2:
3662
- _yield$this$client$qu16 = _context58.sent;
3663
- user = _yield$this$client$qu16.user;
3664
- mails = (_user$receivedMails = user == null ? void 0 : user.receivedMails) != null ? _user$receivedMails : []; // TODO get actual mails on this app only
3665
-
3666
- receivedMails = new Array();
3667
-
3668
- for (_iterator19 = _createForOfIteratorHelperLoose(mails); !(_step19 = _iterator19()).done;) {
3669
- m = _step19.value;
3670
- mail = convertInternalMailToExternal(m, _classPrivateFieldLooseBase(this, _keys)[_keys]);
3671
-
3672
- if (mail) {
3673
- receivedMails.push(mail);
3674
- }
3675
- }
3676
-
3677
- return _context58.abrupt("return", receivedMails);
3678
-
3679
- case 8:
3680
- case "end":
3681
- return _context58.stop();
3682
- }
3683
- }
3684
- }, _callee58, this);
3685
- }));
3686
-
3687
- function receivedMails() {
3688
- return _receivedMails.apply(this, arguments);
3689
- }
3690
-
3691
- return receivedMails;
3692
- }();
3693
-
3694
- _proto.sentMails = /*#__PURE__*/function () {
3695
- var _sentMails = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee59() {
3696
- var _user$sentMails;
3697
-
3698
- var _yield$this$client$qu17, user, mails, sentMails, _iterator20, _step20, m, mail;
3699
-
3700
- return _regeneratorRuntime.wrap(function _callee59$(_context59) {
3701
- while (1) {
3702
- switch (_context59.prev = _context59.next) {
3703
- case 0:
3704
- _context59.next = 2;
3705
- return this.client.query({
3706
- user: [{}, {
3707
- sentMails: gqlMailQuery
3708
- }]
3709
- });
3710
-
3711
- case 2:
3712
- _yield$this$client$qu17 = _context59.sent;
3713
- user = _yield$this$client$qu17.user;
3714
- mails = (_user$sentMails = user == null ? void 0 : user.sentMails) != null ? _user$sentMails : []; // TODO get actual mails on this app only
3715
-
3716
- sentMails = new Array();
3717
-
3718
- for (_iterator20 = _createForOfIteratorHelperLoose(mails); !(_step20 = _iterator20()).done;) {
3719
- m = _step20.value;
3720
- mail = convertInternalMailToExternal(m, _classPrivateFieldLooseBase(this, _keys)[_keys]);
3721
-
3722
- if (mail) {
3723
- sentMails.push(mail);
3724
- }
3725
- }
3726
-
3727
- return _context59.abrupt("return", sentMails);
3728
-
3729
- case 8:
3730
- case "end":
3731
- return _context59.stop();
3732
- }
3733
- }
3734
- }, _callee59, this);
3735
- }));
3736
-
3737
- function sentMails() {
3738
- return _sentMails.apply(this, arguments);
3739
- }
3740
-
3741
- return sentMails;
3742
- }();
3743
-
3744
- _proto.draftMails = /*#__PURE__*/function () {
3745
- var _draftMails = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee60() {
3746
- var _user$draftMails;
3747
-
3748
- var _yield$this$client$qu18, user, mails, draftMails, _iterator21, _step21, m, draft;
3749
-
3750
- return _regeneratorRuntime.wrap(function _callee60$(_context60) {
3751
- while (1) {
3752
- switch (_context60.prev = _context60.next) {
3753
- case 0:
3754
- _context60.next = 2;
3755
- return this.client.query({
3756
- user: [{}, {
3757
- draftMails: gqlMailQuery
3758
- }]
3759
- });
3760
-
3761
- case 2:
3762
- _yield$this$client$qu18 = _context60.sent;
3763
- user = _yield$this$client$qu18.user;
3764
- mails = (_user$draftMails = user == null ? void 0 : user.draftMails) != null ? _user$draftMails : []; // TODO get actual mails on this app only
3765
-
3766
- draftMails = new Array();
3767
-
3768
- for (_iterator21 = _createForOfIteratorHelperLoose(mails); !(_step21 = _iterator21()).done;) {
3769
- m = _step21.value;
3770
- draft = convertInternalMailToExternal(m, _classPrivateFieldLooseBase(this, _keys)[_keys]);
3771
-
3772
- if (draft) {
3773
- draftMails.push(draft);
3774
- }
3775
- }
3776
-
3777
- return _context60.abrupt("return", draftMails);
3778
-
3779
- case 8:
3780
- case "end":
3781
- return _context60.stop();
3782
- }
3783
- }
3784
- }, _callee60, this);
3785
- }));
3786
-
3787
- function draftMails() {
3788
- return _draftMails.apply(this, arguments);
3789
- }
3790
-
3791
- return draftMails;
3792
- }();
3793
-
3794
- _createClass(SecrecyClient, [{
3795
- key: "publicKey",
3796
- get: function get() {
3797
- return _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
3798
- }
3799
- }]);
3800
-
3801
- return SecrecyClient;
3802
- }(BaseClient);
3803
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGllbnQvaW5kZXgudHMiXSwibmFtZXMiOlsia3kiLCJheGlvcyIsIkJhc2VDbGllbnQiLCJ2RmlsZXNDYWNoZSIsImZvbGRlcnNDYWNoZSIsImZpbGVzQ2FjaGUiLCJ1c2Vyc0NhY2hlIiwic2VjcmV0c3RyZWFtS2V5Z2VuIiwiZW5jcnlwdFNlY3JldHN0cmVhbSIsImNvbXByZXNzIiwidW5jb21wcmVzcyIsImdxbEZvbGRlclRvRXh0ZXJuYWwiLCJncWxGb2xkZXJUb0V4dGVybmFsRm9sZGVyRnVsbCIsImdxbFZGaWxlVG9FeHRlcm5hbCIsImdxbFZGaWxlVG9JbnRlcm5hbCIsImludGVybmFsVkZpbGVUb1ZGaWxlIiwiZ3FsRmlsZVRvRXh0ZXJuYWwiLCJzb2RpdW0iLCJkZWNyeXB0Q3J5cHRvQm94IiwiZW5jcnlwdENyeXB0b0JveCIsImdlbmVyYXRlIiwibWQ1IiwiZW5jcnlwdCIsImRlY3J5cHQiLCJjaHVua3MiLCJjb25jYXRlbmF0ZSIsImVudW1lcmF0ZSIsInByb21pc2VBbGxMaW1pdCIsImdxbEZpbGVRdWVyeSIsImdxbEZvbGRlclF1ZXJ5IiwiZ3FsRm9sZGVyRnVsbFF1ZXJ5IiwiZ3FsTWFpbFF1ZXJ5IiwiZ3FsVkZpbGVRdWVyeSIsImdxbFZGaWxlV2l0aEZvbGRlclF1ZXJ5IiwiY29udmVydEludGVybmFsTWFpbFRvRXh0ZXJuYWwiLCJlbmNyeXB0TmFtZSIsIm5hbWUiLCJuYW1lS2V5IiwiZnJvbV9oZXgiLCJmcm9tX3N0cmluZyIsImRhdGEiLCJuYW1lRW5jcnlwdGVkIiwidG9faGV4IiwiU2VjcmVjeUNsaWVudCIsInVhU2Vzc2lvbiIsInVhS2V5cyIsInVhSnd0IiwiZW52Iiwiand0IiwicGVyRm9sZGVyIiwiZm9sZGVySWQiLCJwdWJsaWNLZXkiLCJmb2xkZXIiLCJnZXQiLCJpZCIsInVzZXJBcHAiLCJwcml2YXRlS2V5IiwicGVyVkZpbGUiLCJ2RmlsZUlkIiwidkZpbGUiLCJmaWxlcyIsImhpc3RvcnkiLCJtYXAiLCJmIiwia2V5IiwidXNlciIsIl9lYWNoVXNlciIsInN1YmplY3QiLCJib2R5IiwiaWRPck1haWwiLCJ1IiwidXNlcklkIiwid2l0aFB1YmxpY0tleSIsInVuZGVmaW5lZCIsIkVycm9yIiwicmVjaXBpZW50c0ZpbGVzIiwiQXJyYXkiLCJmaWxlSW5IaXN0b3J5IiwiZmlsZSIsInB1c2giLCJmaWxlS2V5IiwicmVjaXBpZW50SWQiLCJhZGRGaWxlVG9IaXN0b3J5IiwiZmlsZUlkIiwiY2xpZW50IiwibXV0YXRpb24iLCJmaW5kIiwidXNlcnMiLCJmaWx0ZXIiLCJpbnB1dCIsInNoYXJlRmlsZUluSGlzdG9yeSIsInVwbG9hZEZpbGUiLCJlbmNyeXB0UHJvZ3Jlc3MiLCJ1cGxvYWRQcm9ncmVzcyIsInNpZ25hbCIsIkZpbGUiLCJVaW50OEFycmF5IiwiYXJyYXlCdWZmZXIiLCJmaWxlQnVmZmVyIiwiY29tcHJlc3NlZCIsImVuY3J5cHRlZEZpbGUiLCJtZDVGaWxlIiwibWQ1RW5jcnlwdGVkIiwiZW5jcnlwdGVkRmlsZUtleSIsImZpbGVTaXplIiwiYnl0ZUxlbmd0aCIsImZpbGVTaXplQmVmb3JlIiwiZmlsZVBhcnRTaXplIiwicGFydHMiLCJmaWVsZHMiLCJvcmRlciIsInVybCIsInRvdGFsIiwiY3VycmVudCIsInBlcmNlbnQiLCJsZW5ndGgiLCJ1cGxvYWRQYXJ0RW5kZWQiLCJ1cGxvYWRGaWxlUGFydEVuZCIsInVwbG9hZEVuZGVkIiwidXBsb2FkRmlsZUVuZCIsImNodW5rUGFydHMiLCJOdW1iZXIiLCJpbmRleCIsImNodW5rIiwicHJvZ3Jlc3NQYXJ0cyIsIm9uUHJvZ3Jlc3MiLCJwYXJ0IiwicHJvZ3Jlc3NFdmVudCIsIk9iamVjdCIsInZhbHVlcyIsInJlZHVjZSIsInBydiIsImN1ciIsImxvYWRlZCIsImJ5UGFydCIsImZvcm1EYXRhIiwiRm9ybURhdGEiLCJwIiwiZW50cmllcyIsInZhbHVlIiwiYXBwZW5kIiwiQmxvYiIsInBvc3QiLCJvblVwbG9hZFByb2dyZXNzIiwicmVzcG9uc2UiLCJzdGF0dXMiLCJ1cGxvYWRGaWxlSW5DbG91ZCIsInNhdmVJbkNsb3VkIiwibG9nb3V0Iiwic2Vzc2lvbklkIiwiY2xlYXIiLCJjcmVhdGVGb2xkZXIiLCJwYXJlbnRGb2xkZXJJZCIsImVuY3J5cHRlZE5hbWUiLCJlbmNyeXB0ZWRLZXkiLCJwYXJlbnRGb2xkZXIiLCJQcm9taXNlIiwiYWxsIiwicmlnaHRzIiwic2hhcmVGb2xkZXIiLCJkZWxldGVkIiwicXVlcnkiLCJtYWlsIiwic2hhcmVWRmlsZSIsImgiLCJzaGFyZWRWRmlsZXMiLCJ2RmlsZXMiLCJ2RmlsZXNTaGFyZWRXaXRoTWUiLCJkZWxldGVkVkZpbGVzIiwic2hhcmVkRm9sZGVycyIsImZvbGRlcnMiLCJmb2xkZXJzU2hhcmVkV2l0aE1lIiwiZGVsZXRlZEZvbGRlcnMiLCJkZWxldGVkTWFpbHMiLCJtYWlsVHlwZSIsIm1haWxzIiwibSIsInNoYXJlRm9sZGVycyIsInZGaWxlSW5wdXQiLCJzaGFyZUZvbGRlckZpbmlzaCIsInVwZGF0ZUZvbGRlciIsImlzRmF2b3JpdGUiLCJkZWxldGVkQXQiLCJ1cGRhdGVBcHBOb3RpZmljYXRpb25zIiwibm90aWZpY2F0aW9ucyIsImVuYWJsZUFsbCIsImNsb3VkIiwiZGlzYWJsZUFsbFVudGlsIiwiRGF0ZSIsImFwcE5vdGlmaWNhdGlvbnMiLCJjcmVhdGVNYWlsIiwiY3VzdG9tTWVzc2FnZSIsImNyZWF0ZURyYWZ0TWFpbCIsInNlbmREcmFmdE1haWwiLCJtYWlsSW50ZWdyaXR5SWQiLCJ3YWl0aW5nUmVjZWl2ZWRNYWlscyIsImRhdGUiLCJhdHRhY2htZW50c0NvdW50Iiwic2VuZGVyIiwiZmlyc3RuYW1lIiwibGFzdG5hbWUiLCJlbWFpbCIsInJlY2lwaWVudHMiLCJ0ZW1wb3JhcnlSZWNpcGllbnRzIiwidXBkYXRlRHJhZnRNYWlsIiwiZHJhZnRJZCIsInJlY2lwaWVudHNJZHMiLCJyZXBseVRvIiwiZHJhZnRNYWlscyIsImRyYWZ0cyIsImRyYWZ0IiwiZCIsImhhc2hLZXkiLCJoYXNoIiwicmFuZG9tYnl0ZXNfYnVmIiwiY3J5cHRvX2dlbmVyaWNoYXNoX0tFWUJZVEVTIiwiY3J5cHRvX2dlbmVyaWNoYXNoIiwiY3J5cHRvX2dlbmVyaWNoYXNoX0JZVEVTIiwiSlNPTiIsInN0cmluZ2lmeSIsInNlbmRlckZpbGVzIiwiZGVsZXRlRHJhZnRNYWlsIiwiZGVsZXRlVkZpbGVTaGFyaW5nIiwiZGVsZXRlRm9sZGVyU2hhcmluZyIsImR1cGxpY2F0ZVZGaWxlIiwiY3VzdG9tTmFtZSIsImRlbGV0ZUZvbGRlckNsb3VkVHJhc2giLCJpZHMiLCJkZWxldGVWRmlsZUNsb3VkVHJhc2giLCJkZWxldGVNYWlsVHJhc2giLCJlbXB0eU1haWxUcmFzaCIsImVtcHR5Q2xvdWRUcmFzaCIsInJlY292ZXJWRmlsZSIsInJlY292ZXJGb2xkZXIiLCJyZWNvdmVyTWFpbCIsIm1haWxJZCIsImRlbGV0ZUZpbGUiLCJkZWxldGVWRmlsZSIsImRlbGV0ZU1haWwiLCJoYXMiLCJyZWNlaXZlZE1haWxzIiwic29tZSIsImZpbGVNYWlsIiwiZW5jcnlwdGVkTmFtZUtleSIsImZpbGVuYW1lIiwibWUiLCJpbmNsdWRlcyIsIm90aGVycyIsImRyYWZ0TWFpbElkIiwic2VuZFdhaXRpbmdFbWFpbHMiLCJzZW50TWFpbHMiLCJmaWx0ZXJlZCIsInNlbmRPbmVNYWlsIiwicmVjaXBpZW50IiwiZmlsZUNvbnRlbnQiLCJvbkRvd25sb2FkUHJvZ3Jlc3MiLCJwcm9ncmVzc0RlY3J5cHQiLCJfX3R5cGVuYW1lIiwiY29udGVudFVybCIsInRvdGFsU2l6ZSIsInNlbmRlclB1YmxpY0tleSIsInRyYW5zZmVycmVkQnl0ZXMiLCJ0b3RhbEJ5dGVzIiwicHIiLCJidWYiLCJtZDVQYXJ0IiwiZW5jcnlwdGVkQ29udGVudCIsInNvcnQiLCJhIiwiYiIsInNyYyIsIm1kNUNvbnRlbnQiLCJ1cGRhdGVGaWxlIiwicmVhZE1haWwiLCJ1bnJlYWRNYWlsIiwiYXBwU2V0dGluZ3MiLCJhdXRvRGlzY29ubmVjdERlbGF5IiwiY2xvdWRGaWxlRGF5c0ZvckRlbGV0ZSIsImNsb3VkRm9sZGVyRGF5c0ZvckRlbGV0ZSIsImhpc3RvcnlGaWxlRGF5c0ZvckRlbGV0ZSIsImhpc3RvcnlNYXhGaWxlQ291bnQiLCJ1cGRhdGVBcHBTZXR0aW5ncyIsInNldHRpbmdzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsT0FBT0EsRUFBUCxNQUFlLElBQWY7QUFDQSxPQUFPQyxLQUFQLE1BQWtCLE9BQWxCO0FBQ0EsU0FBU0MsVUFBVCxRQUEyQixrQkFBM0I7QUFDQSxTQUFTQyxXQUFULEVBQXNCQyxZQUF0QixFQUFvQ0MsVUFBcEMsRUFBZ0RDLFVBQWhELFFBQWtFLGFBQWxFO0FBRUEsU0FBU0Msa0JBQVQsRUFBNkJDLG1CQUE3QixRQUF3RCxtQkFBeEQ7QUFDQSxTQUFTQyxRQUFULEVBQW1CQyxVQUFuQixRQUFxQyxvQkFBckM7QUFDQSxTQUNFQyxtQkFERixFQUVFQyw2QkFGRixRQUdPLHFCQUhQO0FBSUEsU0FDRUMsa0JBREYsRUFFRUMsa0JBRkYsRUFHRUMsb0JBSEYsUUFJTyxvQkFKUDtBQTJCQSxTQUFTQyxpQkFBVCxRQUFrQyxtQkFBbEM7QUFDQSxTQUFTQyxNQUFULFFBQXVCLGNBQXZCO0FBRUEsU0FBU0MsZ0JBQVQsRUFBMkJDLGdCQUEzQixRQUFtRCxvQkFBbkQ7QUFFQSxTQUFTQyxRQUFULFFBQXlCLFNBQXpCO0FBQ0EsU0FBU0MsR0FBVCxRQUFvQixrQkFBcEI7QUFDQSxTQUFTQyxPQUFULEVBQWtCQyxPQUFsQixRQUFpQyxxQkFBakM7QUFDQSxTQUFTQyxNQUFULEVBQWlCQyxXQUFqQixFQUE4QkMsU0FBOUIsRUFBeUNDLGVBQXpDLFFBQWdFLGFBQWhFO0FBQ0EsU0FDRUMsWUFERixFQUVFQyxjQUZGLEVBR0VDLGtCQUhGLEVBSUVDLFlBSkYsRUFLRUMsYUFMRixFQU1FQyx1QkFORixRQU9PLG9CQVBQO0FBU0EsU0FBU0MsNkJBQVQsUUFBOEMsbUJBQTlDLEMsQ0FDQTtBQUNBOztBQVlBLElBQU1DLFdBQVc7QUFBQSxzRUFBRyxpQkFBT0MsSUFBUCxFQUFxQkMsT0FBckI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQ0s3QixtQkFBbUIsQ0FDeENTLE1BQU0sQ0FBQ3FCLFFBQVAsQ0FBZ0JELE9BQWhCLENBRHdDLEVBRXhDcEIsTUFBTSxDQUFDc0IsV0FBUCxDQUFtQkgsSUFBbkIsQ0FGd0MsQ0FEeEI7O0FBQUE7QUFBQTtBQUNWSSxZQUFBQSxJQURVLHlCQUNWQSxJQURVO0FBS1pDLFlBQUFBLGFBTFksR0FLSXhCLE1BQU0sQ0FBQ3lCLE1BQVAsQ0FBY0YsSUFBZCxDQUxKO0FBQUEsNkNBTVhDLGFBTlc7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0FBSDs7QUFBQSxrQkFBWE4sV0FBVztBQUFBO0FBQUE7QUFBQSxHQUFqQjs7OztBQVNBLFdBQWFRLGFBQWI7QUFBQTs7QUFLRSx5QkFDRUMsU0FERixFQUVFQyxNQUZGLEVBR0VDLEtBSEYsRUFJRUMsR0FKRixFQUtFO0FBQUE7O0FBQ0EsbUNBQU1ILFNBQU4sRUFBaUJHLEdBQWpCO0FBREEsVUFURkMsR0FTRTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBLFVBeW9ETUMsU0F6b0ROO0FBQUEsMkVBeW9Ea0Isa0JBQ2xCQyxRQURrQixFQUVsQkMsU0FGa0I7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSWRDLGdCQUFBQSxNQUpjLEdBSUxoRCxZQUFZLENBQUNpRCxHQUFiLENBQWlCSCxRQUFqQixDQUpLOztBQUFBLG9CQU1iRSxNQU5hO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEsdUJBT1YsTUFBS0EsTUFBTCxDQUFZO0FBQUVFLGtCQUFBQSxFQUFFLEVBQUVKO0FBQU4saUJBQVosQ0FQVTs7QUFBQTtBQVFoQkUsZ0JBQUFBLE1BQU0sR0FBR2hELFlBQVksQ0FBQ2lELEdBQWIsQ0FBaUJILFFBQWpCLENBQVQ7O0FBUmdCLG9CQVVYRSxNQVZXO0FBQUE7QUFBQTtBQUFBOztBQUFBLGtEQVdQLElBWE87O0FBQUE7QUFBQSx1Q0FlYkEsTUFBTSxDQUFDRyxPQWZNLGFBZWIsZ0JBQWdCbEIsT0FmSDtBQUFBO0FBQUE7QUFBQTs7QUFBQSxrREFnQlQsSUFoQlM7O0FBQUE7QUFBQSxrREFtQlg7QUFDTGlCLGtCQUFBQSxFQUFFLEVBQUVKLFFBREM7QUFFTGIsa0JBQUFBLE9BQU8sRUFBRXBCLE1BQU0sQ0FBQ3lCLE1BQVAsQ0FDUHZCLGdCQUFnQixDQUNkRixNQUFNLENBQUNxQixRQUFQLENBQWdCYyxNQUFNLENBQUNHLE9BQVAsQ0FBZWxCLE9BQS9CLENBRGMsRUFFZGMsU0FGYyxFQUdkLHlFQUFXSyxVQUhHLENBRFQ7QUFGSixpQkFuQlc7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsT0F6b0RsQjs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxVQXdxRE1DLFFBeHFETjtBQUFBLDJFQXdxRGlCLGtCQUNqQkMsT0FEaUIsRUFFakJQLFNBRmlCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUliUSxnQkFBQUEsS0FKYSxHQUlMeEQsV0FBVyxDQUFDa0QsR0FBWixDQUFnQkssT0FBaEIsQ0FKSzs7QUFBQSxvQkFNWkMsS0FOWTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLHVCQU9ULE1BQUtBLEtBQUwsQ0FBVztBQUFFTCxrQkFBQUEsRUFBRSxFQUFFSTtBQUFOLGlCQUFYLENBUFM7O0FBQUE7QUFRZkMsZ0JBQUFBLEtBQUssR0FBR3hELFdBQVcsQ0FBQ2tELEdBQVosQ0FBZ0JLLE9BQWhCLENBQVI7O0FBUmUsb0JBVVZDLEtBVlU7QUFBQTtBQUFBO0FBQUE7O0FBQUEsa0RBV04sSUFYTTs7QUFBQTtBQUFBLGtEQWVWO0FBQ0xMLGtCQUFBQSxFQUFFLEVBQUVLLEtBQUssQ0FBQ0wsRUFETDtBQUVMakIsa0JBQUFBLE9BQU8sRUFBRXBCLE1BQU0sQ0FBQ3lCLE1BQVAsQ0FDUHZCLGdCQUFnQixDQUNkRixNQUFNLENBQUNxQixRQUFQLENBQWdCcUIsS0FBSyxDQUFDSixPQUFOLENBQWNsQixPQUE5QixDQURjLEVBRWRjLFNBRmMsRUFHZCx5RUFBV0ssVUFIRyxDQURULENBRko7QUFTTEksa0JBQUFBLEtBQUssRUFBRUQsS0FBSyxDQUFDRSxPQUFOLENBQWNDLEdBQWQsQ0FBa0IsVUFBQUMsQ0FBQztBQUFBLDJCQUFLO0FBQzdCVCxzQkFBQUEsRUFBRSxFQUFFUyxDQUFDLENBQUNULEVBRHVCO0FBRTdCVSxzQkFBQUEsR0FBRyxFQUFFL0MsTUFBTSxDQUFDeUIsTUFBUCxDQUNIdkIsZ0JBQWdCLENBQ2RGLE1BQU0sQ0FBQ3FCLFFBQVAsQ0FBZ0J5QixDQUFDLENBQUNFLElBQUYsQ0FBUUQsR0FBeEIsQ0FEYyxFQUVkYixTQUZjLEVBR2QseUVBQVdLLFVBSEcsQ0FEYjtBQUZ3QixxQkFBTDtBQUFBLG1CQUFuQjtBQVRGLGlCQWZVOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE9BeHFEakI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsVUE2c0RNVSxTQTdzRE47QUFBQSwyRUE2c0RrQixrQkFDbEJOLEtBRGtCLEVBRWxCTyxPQUZrQixFQUdsQkMsSUFIa0IsRUFJbEJDLFFBSmtCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNZEMsZ0JBQUFBLENBTmMsR0FNVmhFLFVBQVUsQ0FBQytDLEdBQVgsQ0FBZWdCLFFBQWYsQ0FOVTs7QUFBQSxzQkFPZCxDQUFDQyxDQUFELElBQU0sRUFBRSxlQUFlQSxDQUFqQixDQVBRO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEsdUJBU1AsTUFBS0wsSUFBTCxDQUFVO0FBQ2ZNLGtCQUFBQSxNQUFNLEVBQUVGLFFBRE87QUFFZkcsa0JBQUFBLGFBQWEsRUFBRTtBQUZBLGlCQUFWLENBVE87O0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSwrQkFZUEMsU0FaTzs7QUFBQTtBQVFoQkgsZ0JBQUFBLENBUmdCOztBQUFBLG9CQWNYQSxDQWRXO0FBQUE7QUFBQTtBQUFBOztBQUFBLGtEQWVQLElBZk87O0FBQUE7QUFBQSxvQkFtQlosZUFBZUEsQ0FuQkg7QUFBQTtBQUFBO0FBQUE7O0FBQUEsc0JBb0JWLElBQUlJLEtBQUosV0FBa0JMLFFBQWxCLHlCQXBCVTs7QUFBQTtBQXVCWk0sZ0JBQUFBLGVBdkJZLEdBdUJNLElBQUlDLEtBQUosRUF2Qk47QUFBQSw0REF5QkZoQixLQXpCRTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQXlCUEcsZ0JBQUFBLENBekJPO0FBMEJaYyxnQkFBQUEsYUExQlksR0EwQkl4RSxVQUFVLENBQUNnRCxHQUFYLENBQWVVLENBQUMsQ0FBQ1QsRUFBakIsQ0ExQko7O0FBQUEsb0JBMkJYdUIsYUEzQlc7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSx1QkE0QlIsTUFBS0MsSUFBTCxDQUFVO0FBQUV4QixrQkFBQUEsRUFBRSxFQUFFUyxDQUFDLENBQUNUO0FBQVIsaUJBQVYsQ0E1QlE7O0FBQUE7QUE2QmR1QixnQkFBQUEsYUFBYSxHQUFHeEUsVUFBVSxDQUFDZ0QsR0FBWCxDQUFlVSxDQUFDLENBQUNULEVBQWpCLENBQWhCOztBQTdCYyxvQkE4QlR1QixhQTlCUztBQUFBO0FBQUE7QUFBQTs7QUFBQSxzQkErQk4sSUFBSUgsS0FBSixXQUFrQlgsQ0FBQyxDQUFDM0IsSUFBcEIsVUFBNkIyQixDQUFDLENBQUNULEVBQS9CLHVCQS9CTTs7QUFBQTtBQWtDVlUsZ0JBQUFBLEdBbENVLDBCQWtDSmEsYUFBYSxDQUFDWixJQWxDVixxQkFrQ0osb0JBQW9CRCxHQWxDaEI7O0FBQUEsb0JBbUNYQSxHQW5DVztBQUFBO0FBQUE7QUFBQTs7QUFBQTs7QUFBQTtBQXNDaEJXLGdCQUFBQSxlQUFlLENBQUNJLElBQWhCLENBQXFCO0FBQ25CekIsa0JBQUFBLEVBQUUsRUFBRVMsQ0FBQyxDQUFDVCxFQURhO0FBRW5CbEIsa0JBQUFBLElBQUksRUFBRW5CLE1BQU0sQ0FBQ3lCLE1BQVAsQ0FDSnZCLGdCQUFnQixDQUNkRixNQUFNLENBQUNzQixXQUFQLENBQW1Cd0IsQ0FBQyxDQUFDM0IsSUFBckIsQ0FEYyxFQUVka0MsQ0FBQyxDQUFDbkIsU0FGWSxFQUdkLHlFQUFXSyxVQUhHLENBRFosQ0FGYTtBQVNuQndCLGtCQUFBQSxPQUFPLEVBQUUvRCxNQUFNLENBQUN5QixNQUFQLENBQ1B2QixnQkFBZ0IsQ0FDZEYsTUFBTSxDQUFDcUIsUUFBUCxDQUFnQjBCLEdBQWhCLENBRGMsRUFFZE0sQ0FBQyxDQUFDbkIsU0FGWSxFQUdkLHlFQUFXSyxVQUhHLENBRFQ7QUFUVSxpQkFBckI7O0FBdENnQjtBQUFBO0FBQUE7O0FBQUE7QUFBQSxrREF5RFg7QUFDTHlCLGtCQUFBQSxXQUFXLEVBQUVYLENBQUMsQ0FBQ2hCLEVBRFY7QUFFTGMsa0JBQUFBLElBQUksRUFBRW5ELE1BQU0sQ0FBQ3lCLE1BQVAsQ0FDSnZCLGdCQUFnQixDQUNkRixNQUFNLENBQUNzQixXQUFQLENBQW1CNkIsSUFBbkIsQ0FEYyxFQUVkRSxDQUFDLENBQUNuQixTQUZZLEVBR2QseUVBQVdLLFVBSEcsQ0FEWixDQUZEO0FBU0xXLGtCQUFBQSxPQUFPLEVBQUVsRCxNQUFNLENBQUN5QixNQUFQLENBQ1B2QixnQkFBZ0IsQ0FDZEYsTUFBTSxDQUFDc0IsV0FBUCxDQUFtQjRCLE9BQW5CLENBRGMsRUFFZEcsQ0FBQyxDQUFDbkIsU0FGWSxFQUdkLHlFQUFXSyxVQUhHLENBRFQsQ0FUSjtBQWdCTEksa0JBQUFBLEtBQUssRUFBRWU7QUFoQkYsaUJBekRXOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE9BN3NEbEI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBRUEsVUFBSzNCLEdBQUwsR0FBV0YsS0FBWDtBQUNBLCtFQUFhRCxNQUFiO0FBSEE7QUFJRDs7QUFkSDs7QUFBQSxTQW9CUXFDLGdCQXBCUjtBQUFBLHFGQW9CRTtBQUFBOztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0VDLGNBQUFBLE1BREYsU0FDRUEsTUFERixFQUVFekIsT0FGRixTQUVFQSxPQUZGO0FBQUE7QUFBQSxxQkFPcUMsS0FBSzBCLE1BQUwsQ0FBWUMsUUFBWixDQUFxQjtBQUN0REgsZ0JBQUFBLGdCQUFnQixFQUFFLENBQ2hCO0FBQ0VDLGtCQUFBQSxNQUFNLEVBQU5BLE1BREY7QUFFRXpCLGtCQUFBQSxPQUFPLEVBQVBBO0FBRkYsaUJBRGdCLEVBS2hCMUIsYUFMZ0I7QUFEb0MsZUFBckIsQ0FQckM7O0FBQUE7QUFBQTtBQU9Va0QsY0FBQUEsZ0JBUFYseUJBT1VBLGdCQVBWO0FBQUE7QUFBQSxxQkFpQnNCcEUsa0JBQWtCLENBQUNvRSxnQkFBRCw4QkFBbUIsSUFBbkIsZ0JBakJ4Qzs7QUFBQTtBQWlCUXZCLGNBQUFBLEtBakJSO0FBa0JRbUIsY0FBQUEsSUFsQlIsR0FrQmVuQixLQUFLLENBQUNFLE9BQU4sQ0FBY3lCLElBQWQsQ0FBbUIsVUFBQXZCLENBQUM7QUFBQSx1QkFBSUEsQ0FBQyxDQUFDVCxFQUFGLEtBQVM2QixNQUFiO0FBQUEsZUFBcEIsQ0FsQmY7O0FBQUEsbUJBbUJNTCxJQW5CTjtBQUFBO0FBQUE7QUFBQTs7QUFvQlVTLGNBQUFBLEtBcEJWLEdBb0JrQjVCLEtBQUssQ0FBQzRCLEtBQU4sQ0FBWUMsTUFBWixDQUNaO0FBQUEsb0JBQUVsQixDQUFGO0FBQUEsdUJBQVNBLENBQUMsQ0FBQ25CLFNBQUYsS0FBZ0IsNEJBQUEsTUFBSSxRQUFKLFFBQVdBLFNBQXBDO0FBQUEsZUFEWSxDQXBCbEI7QUF1QlVzQyxjQUFBQSxLQXZCVixHQXVCMkM7QUFDckNOLGdCQUFBQSxNQUFNLEVBQUVMLElBQUksQ0FBQ3hCLEVBRHdCO0FBRXJDaUMsZ0JBQUFBLEtBQUssRUFBRUEsS0FBSyxDQUFDekIsR0FBTixDQUFVO0FBQUEsc0JBQUVRLENBQUY7QUFBQSx5QkFBVTtBQUN6QmhCLG9CQUFBQSxFQUFFLEVBQUVnQixDQUFDLENBQUNoQixFQURtQjtBQUV6QlUsb0JBQUFBLEdBQUcsRUFBRS9DLE1BQU0sQ0FBQ3lCLE1BQVAsQ0FDSHZCLGdCQUFnQixDQUNkRixNQUFNLENBQUNxQixRQUFQLENBQWdCd0MsSUFBSSxDQUFDYixJQUFMLENBQVdELEdBQTNCLENBRGMsRUFFZCw0QkFBQSxNQUFJLFFBQUosUUFBV2IsU0FGRyxFQUdkLDRCQUFBLE1BQUksUUFBSixRQUFXSyxVQUhHLENBRGI7QUFGb0IsbUJBQVY7QUFBQSxpQkFBVjtBQUY4QixlQXZCM0M7QUFBQTtBQUFBLHFCQXFDVSxLQUFLNEIsTUFBTCxDQUFZQyxRQUFaLENBQXFCO0FBQ3pCSyxnQkFBQUEsa0JBQWtCLEVBQUUsQ0FBQztBQUFFRCxrQkFBQUEsS0FBSyxFQUFMQSxLQUFGO0FBQVMvQixrQkFBQUEsT0FBTyxFQUFQQTtBQUFULGlCQUFELEVBQXFCLElBQXJCO0FBREssZUFBckIsQ0FyQ1Y7O0FBQUE7QUFBQSxnREF5Q1MzQyxvQkFBb0IsQ0FBQzRDLEtBQUQsQ0F6QzdCOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBcEJGOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBLFNBZ0VRZ0MsVUFoRVI7QUFBQSwrRUFnRUU7QUFBQTs7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNFYixjQUFBQSxJQURGLFNBQ0VBLElBREYsRUFFRWMsZUFGRixTQUVFQSxlQUZGLEVBR0VDLGNBSEYsU0FHRUEsY0FIRixFQUlFQyxNQUpGLFNBSUVBLE1BSkY7QUFXUWQsY0FBQUEsT0FYUixHQVdrQnpFLGtCQUFrQixFQVhwQzs7QUFBQSxvQkFhSXVFLElBQUksWUFBWWlCLElBYnBCO0FBQUE7QUFBQTtBQUFBOztBQUFBLDZCQWErQkMsVUFiL0I7QUFBQTtBQUFBLHFCQWFnRGxCLElBQUksQ0FBQ21CLFdBQUwsRUFiaEQ7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLDZCQWFzRW5CLElBYnRFOztBQUFBO0FBWVFvQixjQUFBQSxVQVpSO0FBY1FDLGNBQUFBLFVBZFIsR0FjcUIxRixRQUFRLENBQUN5RixVQUFELENBZDdCO0FBQUE7QUFBQSxxQkFvQlk1RSxPQUFPLENBQUMwRCxPQUFELEVBQVVtQixVQUFWLEVBQXNCUCxlQUF0QixFQUF1Q0UsTUFBdkMsQ0FwQm5COztBQUFBO0FBQUE7QUFpQlVNLGNBQUFBLGFBakJWLGtCQWlCSTVELElBakJKO0FBa0JTNkQsY0FBQUEsT0FsQlQsa0JBa0JJaEYsR0FsQko7QUFtQklpRixjQUFBQSxZQW5CSixrQkFtQklBLFlBbkJKO0FBc0JRQyxjQUFBQSxnQkF0QlIsR0FzQjJCcEYsZ0JBQWdCLENBQ3ZDNkQsT0FEdUMsRUFFdkMsZ0RBQVc3QixTQUY0QixFQUd2QyxnREFBV0ssVUFINEIsQ0F0QjNDO0FBQUE7QUFBQSxxQkE0QitCLEtBQUs0QixNQUFMLENBQVlDLFFBQVosQ0FBcUI7QUFDaERNLGdCQUFBQSxVQUFVLEVBQUUsQ0FDVjtBQUNFYSxrQkFBQUEsUUFBUSxFQUFFSixhQUFhLENBQUNLLFVBRDFCO0FBRUVDLGtCQUFBQSxjQUFjLEVBQUVSLFVBQVUsQ0FBQ08sVUFGN0I7QUFHRXpCLGtCQUFBQSxPQUFPLEVBQUUvRCxNQUFNLENBQUN5QixNQUFQLENBQWM2RCxnQkFBZCxDQUhYO0FBSUVELGtCQUFBQSxZQUFZLEVBQVpBLFlBSkY7QUFLRWpGLGtCQUFBQSxHQUFHLEVBQUVnRjtBQUxQLGlCQURVLEVBUVY7QUFDRWxCLGtCQUFBQSxNQUFNLEVBQUUsSUFEVjtBQUVFd0Isa0JBQUFBLFlBQVksRUFBRSxJQUZoQjtBQUdFQyxrQkFBQUEsS0FBSyxFQUFFO0FBQ0xDLG9CQUFBQSxNQUFNLEVBQUUsSUFESDtBQUVMQyxvQkFBQUEsS0FBSyxFQUFFLElBRkY7QUFHTEMsb0JBQUFBLEdBQUcsRUFBRTtBQUhBO0FBSFQsaUJBUlU7QUFEb0MsZUFBckIsQ0E1Qi9COztBQUFBO0FBQUE7QUE0QlVwQixjQUFBQSxVQTVCViwwQkE0QlVBLFVBNUJWOztBQUFBLGtCQWlET0EsVUFqRFA7QUFBQTtBQUFBO0FBQUE7O0FBQUEsZ0RBa0RXLElBbERYOztBQUFBO0FBcURFRSxjQUFBQSxjQUFjLFFBQWQsWUFBQUEsY0FBYyxDQUFHO0FBQ2ZtQixnQkFBQUEsS0FBSyxFQUFFWixhQUFhLENBQUNLLFVBRE47QUFFZlEsZ0JBQUFBLE9BQU8sRUFBRSxDQUZNO0FBR2ZDLGdCQUFBQSxPQUFPLEVBQUU7QUFITSxlQUFILENBQWQ7O0FBckRGLG9CQTJETXZCLFVBQVUsQ0FBQ2lCLEtBQVgsQ0FBaUJPLE1BQWpCLEtBQTRCLENBM0RsQztBQUFBO0FBQUE7QUFBQTs7QUE0REl0QixjQUFBQSxjQUFjLFFBQWQsWUFBQUEsY0FBYyxDQUFHO0FBQ2ZtQixnQkFBQUEsS0FBSyxFQUFFWixhQUFhLENBQUNLLFVBRE47QUFFZlEsZ0JBQUFBLE9BQU8sRUFBRWIsYUFBYSxDQUFDSyxVQUZSO0FBR2ZTLGdCQUFBQSxPQUFPLEVBQUU7QUFITSxlQUFILENBQWQ7QUE1REosZ0RBa0VXdkIsVUFBVSxDQUFDUixNQWxFdEI7O0FBQUE7QUFxRVFpQyxjQUFBQSxlQXJFUjtBQUFBLHFGQXFFMEIsa0JBQ3RCL0YsR0FEc0IsRUFFdEJ5RixLQUZzQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxpQ0FJYyxNQUFJLENBQUMxQixNQUFMLENBQVlDLFFBQVosQ0FBcUI7QUFDdkRnQyw0QkFBQUEsaUJBQWlCLEVBQUUsQ0FDakI7QUFDRWxDLDhCQUFBQSxNQUFNLEVBQUVRLFVBQVUsQ0FBQ1IsTUFEckI7QUFFRTlELDhCQUFBQSxHQUFHLEVBQUhBLEdBRkY7QUFHRXlGLDhCQUFBQSxLQUFLLEVBQUxBO0FBSEYsNkJBRGlCLEVBTWpCLElBTmlCO0FBRG9DLDJCQUFyQixDQUpkOztBQUFBO0FBQUE7QUFJZE8sMEJBQUFBLGlCQUpjLHlCQUlkQSxpQkFKYztBQUFBLDREQWVmQSxpQkFmZTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxpQkFyRTFCOztBQUFBLGdDQXFFUUQsZUFyRVI7QUFBQTtBQUFBO0FBQUE7O0FBdUZRRSxjQUFBQSxXQXZGUjtBQUFBLHNGQXVGc0I7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsaUNBQ2MsTUFBSSxDQUFDbEMsTUFBTCxDQUFZQyxRQUFaLENBQXFCO0FBQ25Ea0MsNEJBQUFBLGFBQWEsRUFBRSxDQUNiO0FBQ0VwQyw4QkFBQUEsTUFBTSxFQUFFUSxVQUFVLENBQUNSO0FBRHJCLDZCQURhLEVBSWIsSUFKYTtBQURvQywyQkFBckIsQ0FEZDs7QUFBQTtBQUFBO0FBQ1ZvQywwQkFBQUEsYUFEVSwwQkFDVkEsYUFEVTtBQUFBLDREQVVYQSxhQVZXLFdBVVhBLGFBVlcsR0FVTSxJQVZOOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGlCQXZGdEI7O0FBQUEsZ0NBdUZRRCxXQXZGUjtBQUFBO0FBQUE7QUFBQTs7QUFvR1FFLGNBQUFBLFVBcEdSLEdBb0dxQixJQUFJNUMsS0FBSixFQXBHckI7QUFBQSwyREEwRytCbEQsU0FBUyxDQUNwQ0YsTUFBTSxDQUFDNEUsYUFBRCxFQUFnQnFCLE1BQU0sQ0FBQzlCLFVBQVUsQ0FBQ2dCLFlBQVosQ0FBdEIsQ0FEOEIsQ0ExR3hDOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsMkNBMEdjZSxLQTFHZCxvQkEwR3FCQyxLQTFHckI7QUFBQSw2QkE2R0lILFVBN0dKO0FBQUEsNkJBOEdhRSxLQUFLLEdBQUcsQ0E5R3JCO0FBQUEsNkJBK0dZQyxLQS9HWjtBQUFBO0FBQUEscUJBZ0hpQnRHLEdBQUcsQ0FBQ3NHLEtBQUQsQ0FoSHBCOztBQUFBO0FBQUE7QUFBQTtBQThHTWIsZ0JBQUFBLEtBOUdOO0FBK0dNdEUsZ0JBQUFBLElBL0dOO0FBZ0hNbkIsZ0JBQUFBLEdBaEhOO0FBQUE7O0FBQUEsMkJBNkdlMEQsSUE3R2Y7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBb0hRNkMsY0FBQUEsYUFwSFIsR0FvSHVELEVBcEh2RDs7QUFxSFFDLGNBQUFBLFVBckhSLEdBcUhxQixTQUFiQSxVQUFhLENBQUNDLElBQUQsRUFBZUMsYUFBZixFQUFzRDtBQUN2RUgsZ0JBQUFBLGFBQWEsQ0FBQ0UsSUFBRCxDQUFiLEdBQXNCQyxhQUF0QjtBQUNBLG9CQUFNZCxPQUFPLEdBQUdlLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjTCxhQUFkLEVBQTZCTSxNQUE3QixDQUNkLFVBQUNDLEdBQUQsRUFBTUMsR0FBTjtBQUFBLHlCQUFjRCxHQUFHLEdBQUdDLEdBQUcsQ0FBQ0MsTUFBeEI7QUFBQSxpQkFEYyxFQUVkLENBRmMsQ0FBaEI7QUFJQXhDLGdCQUFBQSxjQUFjLFFBQWQsWUFBQUEsY0FBYyxDQUFHO0FBQ2ZxQixrQkFBQUEsT0FBTyxFQUFFRCxPQUFPLEdBQUdiLGFBQWEsQ0FBQ0ssVUFEbEI7QUFFZk8sa0JBQUFBLEtBQUssRUFBRVosYUFBYSxDQUFDSyxVQUZOO0FBR2ZRLGtCQUFBQSxPQUFPLEVBQVBBO0FBSGUsaUJBQUgsQ0FBZDtBQUtELGVBaElIOztBQWtJUXFCLGNBQUFBLE1BbElSO0FBQUEsc0ZBa0lpQixrQkFBT1IsSUFBUDtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ1BTLDBCQUFBQSxRQURPLEdBQ0ksSUFBSUMsUUFBSixFQURKO0FBRVBiLDBCQUFBQSxLQUZPLEdBRUNILFVBQVUsQ0FBQ2xDLElBQVgsQ0FBZ0IsVUFBQW1ELENBQUM7QUFBQSxtQ0FBSUEsQ0FBQyxDQUFDM0IsS0FBRixLQUFZZ0IsSUFBSSxDQUFDaEIsS0FBckI7QUFBQSwyQkFBakIsQ0FGRDs7QUFBQSw4QkFHUmEsS0FIUTtBQUFBO0FBQUE7QUFBQTs7QUFBQTs7QUFBQTtBQU1iLHlEQUEyQkssTUFBTSxDQUFDVSxPQUFQLENBQWVaLElBQUksQ0FBQ2pCLE1BQXBCLENBQTNCLHFDQUF3RDtBQUFBLHNFQUE1QzdDLEdBQTRDLDBCQUF2QzJFLEtBQXVDO0FBQ3RESiw0QkFBQUEsUUFBUSxDQUFDSyxNQUFULENBQWdCNUUsR0FBaEIsRUFBcUIyRSxLQUFyQjtBQUNEOztBQUNESiwwQkFBQUEsUUFBUSxDQUFDSyxNQUFULENBQ0UsTUFERixFQUVFLElBQUlDLElBQUosQ0FBUyxDQUFDbEIsS0FBSyxDQUFDbkYsSUFBUCxDQUFULENBRkYsRUFHS21ELFVBQVUsQ0FBQ1IsTUFIaEIsU0FHMEJ3QyxLQUFLLENBQUNiLEtBSGhDO0FBVGE7QUFBQTtBQUFBLGlDQWdCTDdHLEtBQUssQ0FBQzZJLElBQU4sQ0FBV2hCLElBQUksQ0FBQ2YsR0FBaEIsRUFBcUJ3QixRQUFyQixFQUErQjtBQUNuQ1EsNEJBQUFBLGdCQUFnQixFQUFFLDBCQUFBaEIsYUFBYTtBQUFBLHFDQUM3QkYsVUFBVSxDQUFDQyxJQUFJLENBQUNoQixLQUFOLEVBQWFpQixhQUFiLENBRG1CO0FBQUEsNkJBREk7QUFHbkNqQyw0QkFBQUEsTUFBTSxFQUFOQTtBQUhtQywyQkFBL0IsQ0FoQks7O0FBQUE7QUFBQTtBQUFBLGlDQXNCTHNCLGVBQWUsQ0FBQ08sS0FBSyxDQUFDdEcsR0FBUCxFQUFZc0csS0FBSyxDQUFDYixLQUFsQixDQXRCVjs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBOztBQUFBLGdDQXdCUCxhQUFXa0MsUUFBWCxDQUFvQkMsTUFBcEIsS0FBK0IsQ0F4QnhCO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxpQkFsSWpCOztBQUFBLGdDQWtJUVgsTUFsSVI7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSxxQkFrS1EzRyxlQUFlLENBQ25CLENBRG1CLEVBRW5CZ0UsVUFBVSxDQUFDaUIsS0FBWCxDQUFpQjlDLEdBQWpCLENBQXFCLFVBQUEyRSxDQUFDO0FBQUEsdUJBQUk7QUFBQSx5QkFBcUJILE1BQU0sQ0FBQ0csQ0FBRCxDQUEzQjtBQUFBLGlCQUFKO0FBQUEsZUFBdEIsQ0FGbUIsQ0FsS3ZCOztBQUFBO0FBQUEsZ0RBdUtTbkIsV0FBVyxFQXZLcEI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FoRUY7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUEsU0EwT1E0QixpQkExT1I7QUFBQSxzRkEwT0U7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0VwRSxjQUFBQSxJQURGLFVBQ0VBLElBREYsRUFFRTFDLElBRkYsVUFFRUEsSUFGRixFQUdFYyxRQUhGLFVBR0VBLFFBSEYsRUFJRTBDLGVBSkYsVUFJRUEsZUFKRixFQUtFQyxjQUxGLFVBS0VBLGNBTEYsRUFNRUMsTUFORixVQU1FQSxNQU5GO0FBQUE7QUFBQSxxQkFldUIsS0FBS0gsVUFBTCxDQUFnQjtBQUNuQ2IsZ0JBQUFBLElBQUksRUFBSkEsSUFEbUM7QUFFbkNjLGdCQUFBQSxlQUFlLEVBQWZBLGVBRm1DO0FBR25DQyxnQkFBQUEsY0FBYyxFQUFkQSxjQUhtQztBQUluQ0MsZ0JBQUFBLE1BQU0sRUFBTkE7QUFKbUMsZUFBaEIsQ0FmdkI7O0FBQUE7QUFlUVgsY0FBQUEsTUFmUjs7QUFBQSxrQkFxQk9BLE1BckJQO0FBQUE7QUFBQTtBQUFBOztBQUFBOztBQUFBO0FBQUEsaURBd0JTLEtBQUtnRSxXQUFMLENBQWlCO0FBQUVoRSxnQkFBQUEsTUFBTSxFQUFOQSxNQUFGO0FBQVUvQyxnQkFBQUEsSUFBSSxFQUFKQSxJQUFWO0FBQWdCYyxnQkFBQUEsUUFBUSxFQUFSQTtBQUFoQixlQUFqQixDQXhCVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQTFPRjs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQSxTQXFRUWtHLE1BclFSO0FBQUEsMkVBcVFFLG1CQUFhQyxTQUFiO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDRWxKLGNBQUFBLFdBQVcsQ0FBQ21KLEtBQVo7QUFDQWpKLGNBQUFBLFVBQVUsQ0FBQ2lKLEtBQVg7QUFDQWxKLGNBQUFBLFlBQVksQ0FBQ2tKLEtBQWI7QUFIRjtBQUFBLDJDQUljRixNQUpkLFlBSXFCQyxTQUpyQjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQXJRRjs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQSxTQTRRUUUsWUE1UVI7QUFBQSxpRkE0UUU7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNFbkgsY0FBQUEsSUFERixVQUNFQSxJQURGLEVBRUVvSCxjQUZGLFVBRUVBLGNBRkY7QUFPUXhGLGNBQUFBLEdBUFIsR0FPY3pELGtCQUFrQixFQVBoQztBQUFBO0FBQUEscUJBUThCNEIsV0FBVyxDQUFDQyxJQUFELEVBQU9uQixNQUFNLENBQUN5QixNQUFQLENBQWNzQixHQUFkLENBQVAsQ0FSekM7O0FBQUE7QUFRUXlGLGNBQUFBLGFBUlI7QUFTUUMsY0FBQUEsWUFUUixHQVN1QnZJLGdCQUFnQixDQUNuQzZDLEdBRG1DLEVBRW5DLGdEQUFXYixTQUZ3QixFQUduQyxnREFBV0ssVUFId0IsQ0FUdkM7QUFBQTtBQUFBLHFCQWNpQyxLQUFLNEIsTUFBTCxDQUFZQyxRQUFaLENBQXFCO0FBQ2xEa0UsZ0JBQUFBLFlBQVksRUFBRSxDQUNaO0FBQ0VuSCxrQkFBQUEsSUFBSSxFQUFFcUgsYUFEUjtBQUVFRCxrQkFBQUEsY0FBYyxFQUFkQSxjQUZGO0FBR0V4RixrQkFBQUEsR0FBRyxFQUFFL0MsTUFBTSxDQUFDeUIsTUFBUCxDQUFjZ0gsWUFBZDtBQUhQLGlCQURZLEVBTVo1SCxrQkFOWTtBQURvQyxlQUFyQixDQWRqQzs7QUFBQTtBQUFBO0FBY1V5SCxjQUFBQSxZQWRWLDBCQWNVQSxZQWRWOztBQUFBLGtCQXdCT0EsWUF4QlA7QUFBQTtBQUFBO0FBQUE7O0FBQUEsb0JBeUJVLElBQUk3RSxLQUFKLHVCQXpCVjs7QUFBQTtBQUFBO0FBQUEscUJBMkJ1QjlELDZCQUE2QixDQUNoRDJJLFlBRGdELDhCQUVoRCxJQUZnRCxnQkEzQnBEOztBQUFBO0FBMkJRbkcsY0FBQUEsTUEzQlI7QUFnQ1FtQyxjQUFBQSxLQWhDUixvREFpQ0luQyxNQUFNLENBQUN1RyxZQWpDWCwrQ0FpQ0kscUJBQXFCcEUsS0FqQ3pCLHFCQWlDSSx1QkFBNEJDLE1BQTVCLENBQ0U7QUFBQSxvQkFBRWxCLENBQUY7QUFBQSx1QkFBU0EsQ0FBQyxDQUFDbkIsU0FBRixLQUFnQiw0QkFBQSxNQUFJLFFBQUosUUFBV0EsU0FBcEM7QUFBQSxlQURGLENBakNKLG9DQW1DUyxFQW5DVDs7QUFBQSxtQkFxQ01vQyxLQUFLLENBQUM0QixNQXJDWjtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLHFCQXNDVXlDLE9BQU8sQ0FBQ0MsR0FBUixDQUNKdEUsS0FBSyxDQUFDekIsR0FBTixDQUFVO0FBQUEsb0JBQUVRLENBQUY7QUFBQSxvQkFBS3dGLE1BQUw7QUFBQSx1QkFDUixNQUFJLENBQUNDLFdBQUwsQ0FBaUI7QUFDZjdHLGtCQUFBQSxRQUFRLEVBQUVFLE1BQU0sQ0FBQ0UsRUFERjtBQUVmd0csa0JBQUFBLE1BQU0sRUFBTkEsTUFGZTtBQUdmdkYsa0JBQUFBLE1BQU0sRUFBRUQsQ0FBQyxDQUFDaEI7QUFISyxpQkFBakIsQ0FEUTtBQUFBLGVBQVYsQ0FESSxDQXRDVjs7QUFBQTtBQUFBLGlEQWlEU0YsTUFqRFQ7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0E1UUY7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUEsU0FnVVFBLE1BaFVSO0FBQUEsMkVBZ1VFO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSwwQ0FNSSxFQU5KLFVBQ0VFLEVBREYsVUFDRUEsRUFERixFQUVFMEcsT0FGRixVQUVFQSxPQUZGO0FBQUE7QUFBQSxxQkFPMkIsS0FBSzVFLE1BQUwsQ0FBWTZFLEtBQVosQ0FBa0I7QUFDekM3RyxnQkFBQUEsTUFBTSxFQUFFLENBQUM7QUFBRTRHLGtCQUFBQSxPQUFPLEVBQVBBLE9BQUY7QUFBVzFHLGtCQUFBQSxFQUFFLEVBQUZBO0FBQVgsaUJBQUQsRUFBa0J4QixrQkFBbEI7QUFEaUMsZUFBbEIsQ0FQM0I7O0FBQUE7QUFBQTtBQU9Vc0IsY0FBQUEsTUFQVix5QkFPVUEsTUFQVjs7QUFBQSxrQkFVT0EsTUFWUDtBQUFBO0FBQUE7QUFBQTs7QUFBQSxpREFXVyxJQVhYOztBQUFBO0FBQUEsaURBYVN4Qyw2QkFBNkIsQ0FBQ3dDLE1BQUQsOEJBQVMsSUFBVCxnQkFidEM7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FoVUY7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUEsU0FnVlEwQixJQWhWUjtBQUFBLHlFQWdWRTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQWF4QixjQUFBQSxFQUFiLFVBQWFBLEVBQWI7QUFBQTtBQUFBLHFCQUN5QixLQUFLOEIsTUFBTCxDQUFZNkUsS0FBWixDQUFrQjtBQUN2Q25GLGdCQUFBQSxJQUFJLEVBQUUsQ0FDSjtBQUNFeEIsa0JBQUFBLEVBQUUsRUFBRkE7QUFERixpQkFESSxFQUlKMUIsWUFKSTtBQURpQyxlQUFsQixDQUR6Qjs7QUFBQTtBQUFBO0FBQ1VrRCxjQUFBQSxJQURWLDBCQUNVQSxJQURWOztBQUFBLGtCQVNPQSxJQVRQO0FBQUE7QUFBQTtBQUFBOztBQUFBLGlEQVVXLElBVlg7O0FBQUE7QUFBQSxpREFZUzlELGlCQUFpQixDQUFDOEQsSUFBRCw4QkFBTyxJQUFQLGdCQVoxQjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQWhWRjs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQSxTQStWUW5CLEtBL1ZSO0FBQUEsMEVBK1ZFO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBY0wsY0FBQUEsRUFBZCxVQUFjQSxFQUFkO0FBQUE7QUFBQSxxQkFDMEIsS0FBSzhCLE1BQUwsQ0FBWTZFLEtBQVosQ0FBa0I7QUFDeEN0RyxnQkFBQUEsS0FBSyxFQUFFLENBQ0w7QUFDRUwsa0JBQUFBLEVBQUUsRUFBRkE7QUFERixpQkFESyxFQUlMckIsdUJBSks7QUFEaUMsZUFBbEIsQ0FEMUI7O0FBQUE7QUFBQTtBQUNVMEIsY0FBQUEsS0FEViwwQkFDVUEsS0FEVjs7QUFBQSxrQkFTT0EsS0FUUDtBQUFBO0FBQUE7QUFBQTs7QUFBQSxpREFVVyxJQVZYOztBQUFBO0FBQUEsaURBWVM5QyxrQkFBa0IsQ0FBQzhDLEtBQUQsOEJBQVEsSUFBUixnQkFaM0I7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0EvVkY7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUEsU0E4V1F1RyxJQTlXUjtBQUFBLHlFQThXRTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQWE1RyxjQUFBQSxFQUFiLFVBQWFBLEVBQWI7QUFBQTtBQUFBLHFCQUN5QixLQUFLOEIsTUFBTCxDQUFZNkUsS0FBWixDQUFrQjtBQUN2Q0MsZ0JBQUFBLElBQUksRUFBRSxDQUNKO0FBQ0U1RyxrQkFBQUEsRUFBRSxFQUFGQTtBQURGLGlCQURJLEVBSUp2QixZQUpJO0FBRGlDLGVBQWxCLENBRHpCOztBQUFBO0FBQUE7QUFDVW1JLGNBQUFBLElBRFYsMEJBQ1VBLElBRFY7O0FBQUEsa0JBVU9BLElBVlA7QUFBQTtBQUFBO0FBQUE7O0FBQUEsaURBV1csSUFYWDs7QUFBQTtBQUFBLGlEQWNTaEksNkJBQTZCLENBQUNnSSxJQUFELDhCQUFPLElBQVAsZ0JBZHRDOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBOVdGOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBLFNBK1hRQyxVQS9YUjtBQUFBLCtFQStYRTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0V6RyxjQUFBQSxPQURGLFVBQ0VBLE9BREYsRUFFRWEsTUFGRixVQUVFQSxNQUZGLEVBR0V1RixNQUhGLFVBR0VBLE1BSEY7QUFTTW5HLGNBQUFBLEtBVE4sR0FTY3hELFdBQVcsQ0FBQ2tELEdBQVosQ0FBZ0JLLE9BQWhCLENBVGQ7O0FBQUEsa0JBV09DLEtBWFA7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSxxQkFZVSxLQUFLQSxLQUFMLENBQVc7QUFBRUwsZ0JBQUFBLEVBQUUsRUFBRUk7QUFBTixlQUFYLENBWlY7O0FBQUE7QUFhSUMsY0FBQUEsS0FBSyxHQUFHeEQsV0FBVyxDQUFDa0QsR0FBWixDQUFnQkssT0FBaEIsQ0FBUjs7QUFiSixrQkFlU0MsS0FmVDtBQUFBO0FBQUE7QUFBQTs7QUFBQSxpREFnQmEsS0FoQmI7O0FBQUE7QUFBQTtBQUFBLHFCQW9CcUIsS0FBS00sSUFBTCxDQUFVO0FBQUVNLGdCQUFBQSxNQUFNLEVBQU5BLE1BQUY7QUFBVUMsZ0JBQUFBLGFBQWEsRUFBRTtBQUF6QixlQUFWLENBcEJyQjs7QUFBQTtBQW9CUVAsY0FBQUEsSUFwQlI7O0FBQUEsa0JBc0JPQSxJQXRCUDtBQUFBO0FBQUE7QUFBQTs7QUFBQSxpREF1QlcsS0F2Qlg7O0FBQUE7QUEwQlE1QixjQUFBQSxPQTFCUixHQTBCa0JwQixNQUFNLENBQUN5QixNQUFQLENBQ2R2QixnQkFBZ0IsQ0FDZEYsTUFBTSxDQUFDcUIsUUFBUCxDQUFnQnFCLEtBQUssQ0FBQ0osT0FBTixDQUFjbEIsT0FBOUIsQ0FEYyxFQUVkNEIsSUFBSSxDQUFDZCxTQUZTLEVBR2QsZ0RBQVdLLFVBSEcsQ0FERixDQTFCbEI7QUFrQ1FLLGNBQUFBLE9BbENSLEdBa0NrQixJQUFJZSxLQUFKLEVBbENsQjtBQUFBLDJEQXVDa0JqQixLQUFLLENBQUNFLE9BdkN4Qjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQXVDYXVHLGNBQUFBLENBdkNiOztBQUFBLGtCQXdDU0EsQ0FBQyxDQUFDbkcsSUF4Q1g7QUFBQTtBQUFBO0FBQUE7O0FBQUE7O0FBQUE7QUEyQ0lKLGNBQUFBLE9BQU8sQ0FBQ2tCLElBQVIsQ0FBYTtBQUNYekIsZ0JBQUFBLEVBQUUsRUFBRThHLENBQUMsQ0FBQzlHLEVBREs7QUFFWFUsZ0JBQUFBLEdBQUcsRUFBRS9DLE1BQU0sQ0FBQ3lCLE1BQVAsQ0FDSHZCLGdCQUFnQixDQUNkRixNQUFNLENBQUNxQixRQUFQLENBQWdCOEgsQ0FBQyxDQUFDbkcsSUFBRixDQUFPRCxHQUF2QixDQURjLEVBRWRDLElBQUksQ0FBQ2QsU0FGUyxFQUdkLGdEQUFXSyxVQUhHLENBRGI7QUFGTSxlQUFiOztBQTNDSjtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBLHFCQXVEK0IsS0FBSzRCLE1BQUwsQ0FBWUMsUUFBWixDQUFxQjtBQUNoRDhFLGdCQUFBQSxVQUFVLEVBQUUsQ0FDVjtBQUNFekcsa0JBQUFBLE9BQU8sRUFBUEEsT0FERjtBQUVFYSxrQkFBQUEsTUFBTSxFQUFOQSxNQUZGO0FBR0V1RixrQkFBQUEsTUFBTSxFQUFOQSxNQUhGO0FBSUV6SCxrQkFBQUEsT0FBTyxFQUFQQSxPQUpGO0FBS0V3QixrQkFBQUEsT0FBTyxFQUFQQTtBQUxGLGlCQURVLEVBUVYsSUFSVTtBQURvQyxlQUFyQixDQXZEL0I7O0FBQUE7QUFBQTtBQXVEVXNHLGNBQUFBLFVBdkRWLDBCQXVEVUEsVUF2RFY7QUFBQSxpREFvRVNBLFVBcEVULFdBb0VTQSxVQXBFVCxHQW9FdUIsS0FwRXZCOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBL1hGOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBLFNBc2NRRSxZQXRjUjtBQUFBLGlGQXNjRTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxxQkFDaUMsS0FBS2pGLE1BQUwsQ0FBWTZFLEtBQVosQ0FBa0I7QUFDL0NJLGdCQUFBQSxZQUFZLEVBQUVwSTtBQURpQyxlQUFsQixDQURqQzs7QUFBQTtBQUFBO0FBQ1VvSSxjQUFBQSxZQURWLDBCQUNVQSxZQURWO0FBS1FDLGNBQUFBLE1BTFIsR0FLaUIsSUFBSTFGLEtBQUosRUFMakI7QUFBQSwyREFPc0J5RixZQVB0Qjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQU9hMUcsY0FBQUEsS0FQYjtBQUFBLDhCQVFJMkcsTUFSSjtBQUFBO0FBQUEscUJBU2F6SixrQkFBa0IsQ0FBQzhDLEtBQUQsOEJBQVEsSUFBUixnQkFUL0I7O0FBQUE7QUFBQTs7QUFBQSw0QkFRV29CLElBUlg7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEsaURBYVN1RixNQWJUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBdGNGOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBLFNBc2RRQyxrQkF0ZFI7QUFBQSx1RkFzZEU7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEscUJBQ3VDLEtBQUtuRixNQUFMLENBQVk2RSxLQUFaLENBQWtCO0FBQ3JETSxnQkFBQUEsa0JBQWtCLEVBQUV0STtBQURpQyxlQUFsQixDQUR2Qzs7QUFBQTtBQUFBO0FBQ1VzSSxjQUFBQSxrQkFEViwwQkFDVUEsa0JBRFY7QUFLUUQsY0FBQUEsTUFMUixHQUtpQixJQUFJMUYsS0FBSixFQUxqQjtBQUFBLDJEQU9zQjJGLGtCQVB0Qjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQU9hNUcsY0FBQUEsS0FQYjtBQUFBLDhCQVFJMkcsTUFSSjtBQUFBO0FBQUEscUJBU2F6SixrQkFBa0IsQ0FBQzhDLEtBQUQsOEJBQVEsSUFBUixnQkFUL0I7O0FBQUE7QUFBQTs7QUFBQSw0QkFRV29CLElBUlg7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEsaURBYVN1RixNQWJUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBdGRGOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBLFNBc2VRRSxhQXRlUjtBQUFBLGtGQXNlRTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxxQkFDa0MsS0FBS3BGLE1BQUwsQ0FBWTZFLEtBQVosQ0FBa0I7QUFDaERPLGdCQUFBQSxhQUFhLEVBQUV4STtBQURpQyxlQUFsQixDQURsQzs7QUFBQTtBQUFBO0FBQ1V3SSxjQUFBQSxhQURWLDBCQUNVQSxhQURWO0FBS1FGLGNBQUFBLE1BTFIsR0FLaUIsSUFBSTFGLEtBQUosRUFMakI7QUFBQSwyREFPc0I0RixhQVB0Qjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQU9hN0csY0FBQUEsS0FQYjtBQUFBLDhCQVFJMkcsTUFSSjtBQUFBO0FBQUEscUJBUXVCekosa0JBQWtCLENBQUM4QyxLQUFELDhCQUFRLElBQVIsZ0JBUnpDOztBQUFBO0FBQUE7O0FBQUEsNEJBUVdvQixJQVJYOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLGlEQVdTdUYsTUFYVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQXRlRjs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQSxTQW9mUUcsYUFwZlI7QUFBQSxrRkFvZkU7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEscUJBQ2tDLEtBQUtyRixNQUFMLENBQVk2RSxLQUFaLENBQWtCO0FBQ2hEUSxnQkFBQUEsYUFBYSxFQUFFNUk7QUFEaUMsZUFBbEIsQ0FEbEM7O0FBQUE7QUFBQTtBQUNVNEksY0FBQUEsYUFEViwwQkFDVUEsYUFEVjtBQUtRQyxjQUFBQSxPQUxSLEdBS2tCLElBQUk5RixLQUFKLEVBTGxCO0FBQUEsMkRBT3VCNkYsYUFQdkI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFPYXJILGNBQUFBLE1BUGI7QUFBQSw4QkFRSXNILE9BUko7QUFBQTtBQUFBLHFCQVF1Qi9KLG1CQUFtQixDQUFDeUMsTUFBRCw4QkFBUyxJQUFULGdCQVIxQzs7QUFBQTtBQUFBOztBQUFBLDRCQVFZMkIsSUFSWjs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSxpREFXUzJGLE9BWFQ7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FwZkY7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUEsU0FrZ0JRQyxtQkFsZ0JSO0FBQUEsd0ZBa2dCRTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxxQkFDd0MsS0FBS3ZGLE1BQUwsQ0FBWTZFLEtBQVosQ0FBa0I7QUFDdERVLGdCQUFBQSxtQkFBbUIsRUFBRTlJO0FBRGlDLGVBQWxCLENBRHhDOztBQUFBO0FBQUE7QUFDVThJLGNBQUFBLG1CQURWLDBCQUNVQSxtQkFEVjtBQUtRRCxjQUFBQSxPQUxSLEdBS2tCLElBQUk5RixLQUFKLEVBTGxCO0FBQUEsMkRBT3VCK0YsbUJBUHZCOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBT2F2SCxjQUFBQSxNQVBiO0FBQUEsOEJBUUlzSCxPQVJKO0FBQUE7QUFBQSxxQkFRdUIvSixtQkFBbUIsQ0FBQ3lDLE1BQUQsOEJBQVMsSUFBVCxnQkFSMUM7O0FBQUE7QUFBQTs7QUFBQSw0QkFRWTJCLElBUlo7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEsaURBV1MyRixPQVhUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBbGdCRjs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQSxTQWdoQlFFLGNBaGhCUjtBQUFBLG1GQWdoQkU7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEscUJBQ21DLEtBQUt4RixNQUFMLENBQVk2RSxLQUFaLENBQWtCO0FBQ2pEVyxnQkFBQUEsY0FBYyxFQUFFL0k7QUFEaUMsZUFBbEIsQ0FEbkM7O0FBQUE7QUFBQTtBQUNVK0ksY0FBQUEsY0FEViwyQkFDVUEsY0FEVjtBQUtRRixjQUFBQSxPQUxSLEdBS2tCLElBQUk5RixLQUFKLEVBTGxCO0FBQUEsMkRBT3VCZ0csY0FQdkI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFPYXhILGNBQUFBLE1BUGI7QUFBQSw4QkFRSXNILE9BUko7QUFBQTtBQUFBLHFCQVF1Qi9KLG1CQUFtQixDQUFDeUMsTUFBRCw4QkFBUyxJQUFULGdCQVIxQzs7QUFBQTtBQUFBOztBQUFBLDRCQVFZMkIsSUFSWjs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSxpREFXUzJGLE9BWFQ7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FoaEJGOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBLFNBOGhCUUcsWUE5aEJSO0FBQUEsaUZBOGhCRTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQXFCQyxjQUFBQSxRQUFyQixVQUFxQkEsUUFBckI7QUFBQTtBQUFBLHFCQUNpQyxLQUFLMUYsTUFBTCxDQUFZNkUsS0FBWixDQUFrQjtBQUMvQ1ksZ0JBQUFBLFlBQVksRUFBRSxDQUFDO0FBQUVDLGtCQUFBQSxRQUFRLEVBQVJBO0FBQUYsaUJBQUQsRUFBZS9JLFlBQWY7QUFEaUMsZUFBbEIsQ0FEakM7O0FBQUE7QUFBQTtBQUNVOEksY0FBQUEsWUFEViwyQkFDVUEsWUFEVjtBQUtRRSxjQUFBQSxLQUxSLEdBS2dCLElBQUluRyxLQUFKLEVBTGhCOztBQU9FLGlFQUFnQmlHLFlBQWhCLHFDQUE4QjtBQUFuQkcsZ0JBQUFBLENBQW1CO0FBQ3RCZCxnQkFBQUEsSUFEc0IsR0FDZmhJLDZCQUE2QixDQUFDOEksQ0FBRCw4QkFBSSxJQUFKLGdCQURkOztBQUU1QixvQkFBSWQsSUFBSixFQUFVO0FBQ1JhLGtCQUFBQSxLQUFLLENBQUNoRyxJQUFOLENBQVdtRixJQUFYO0FBQ0Q7QUFDRjs7QUFaSCxpREFjU2EsS0FkVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQTloQkY7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUEsU0EraUJRaEIsV0EvaUJSO0FBQUEsZ0ZBK2lCRTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0U3RyxjQUFBQSxRQURGLFVBQ0VBLFFBREYsRUFFRXFCLE1BRkYsVUFFRUEsTUFGRixFQUdFdUYsTUFIRixVQUdFQSxNQUhGO0FBQUE7QUFBQSxxQkFTcUIsS0FBSzdGLElBQUwsQ0FBVTtBQUFFTSxnQkFBQUEsTUFBTSxFQUFOQSxNQUFGO0FBQVVDLGdCQUFBQSxhQUFhLEVBQUU7QUFBekIsZUFBVixDQVRyQjs7QUFBQTtBQVNRUCxjQUFBQSxJQVRSOztBQUFBLGtCQVdPQSxJQVhQO0FBQUE7QUFBQTtBQUFBOztBQUFBLGlEQVlXLEtBWlg7O0FBQUE7QUFBQTtBQUFBLHFCQWNnQyxLQUFLbUIsTUFBTCxDQUFZQyxRQUFaLENBQXFCO0FBQ2pEMEUsZ0JBQUFBLFdBQVcsRUFBRSxDQUNYO0FBQUU3RyxrQkFBQUEsUUFBUSxFQUFSQSxRQUFGO0FBQVlxQixrQkFBQUEsTUFBTSxFQUFOQTtBQUFaLGlCQURXLEVBRVg7QUFDRStGLGtCQUFBQSxNQUFNLEVBQUUsSUFEVjtBQUVFSSxrQkFBQUEsT0FBTyxFQUFFO0FBRlgsaUJBRlc7QUFEb0MsZUFBckIsQ0FkaEM7O0FBQUE7QUFBQTtBQWNVWCxjQUFBQSxXQWRWLDBCQWNVQSxXQWRWO0FBd0JRa0IsY0FBQUEsWUF4QlIsR0F3QjBDO0FBQ3RDWCxnQkFBQUEsTUFBTSxFQUFFLEVBRDhCO0FBRXRDSSxnQkFBQUEsT0FBTyxFQUFFO0FBRjZCLGVBeEIxQztBQUFBLDREQTZCbUJYLFdBQVcsQ0FBQ1csT0E3Qi9COztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBNkJhcEgsY0FBQUEsRUE3QmI7QUFBQTtBQUFBLHFCQThCMEIsS0FBS0wsU0FBTCxDQUFlSyxFQUFmLEVBQW1CVyxJQUFJLENBQUNkLFNBQXhCLENBOUIxQjs7QUFBQTtBQThCVWQsY0FBQUEsT0E5QlY7O0FBK0JJLGtCQUFJQSxPQUFKLEVBQWE7QUFDWDRJLGdCQUFBQSxZQUFZLENBQUNQLE9BQWIsQ0FBcUIzRixJQUFyQixDQUEwQjFDLE9BQTFCO0FBQ0Q7O0FBakNMO0FBQUE7QUFBQTs7QUFBQTtBQUFBLDREQW9DbUIwSCxXQUFXLENBQUNPLE1BcEMvQjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQW9DYWhILGNBQUFBLEdBcENiO0FBQUE7QUFBQSxxQkFxQzZCLEtBQUtHLFFBQUwsQ0FBY0gsR0FBZCxFQUFrQlcsSUFBSSxDQUFDZCxTQUF2QixDQXJDN0I7O0FBQUE7QUFxQ1UrSCxjQUFBQSxVQXJDVjs7QUFzQ0ksa0JBQUlBLFVBQUosRUFBZ0I7QUFDZEQsZ0JBQUFBLFlBQVksQ0FBQ1gsTUFBYixDQUFvQnZGLElBQXBCLENBQXlCbUcsVUFBekI7QUFDRDs7QUF4Q0w7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQSxxQkEyQ3NDLEtBQUs5RixNQUFMLENBQVlDLFFBQVosQ0FBcUI7QUFDdkQ4RixnQkFBQUEsaUJBQWlCLEVBQUUsQ0FDakI7QUFDRXJCLGtCQUFBQSxNQUFNLEVBQU5BLE1BREY7QUFFRXZGLGtCQUFBQSxNQUFNLEVBQU5BLE1BRkY7QUFHRTBHLGtCQUFBQSxZQUFZLEVBQVpBO0FBSEYsaUJBRGlCLEVBTWpCLElBTmlCO0FBRG9DLGVBQXJCLENBM0N0Qzs7QUFBQTtBQUFBO0FBMkNVRSxjQUFBQSxpQkEzQ1YsMEJBMkNVQSxpQkEzQ1Y7QUFBQSxpREFzRFNBLGlCQXREVCxXQXNEU0EsaUJBdERULEdBc0Q4QixLQXREOUI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0EvaUJGOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBLFNBd21CUUMsWUF4bUJSO0FBQUEsaUZBd21CRTtBQUFBOztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0VsSSxjQUFBQSxRQURGLFVBQ0VBLFFBREYsRUFFRWQsSUFGRixVQUVFQSxJQUZGLEVBR0VpSixVQUhGLFVBR0VBLFVBSEYsRUFJRUMsU0FKRixVQUlFQSxTQUpGO0FBV01sSSxjQUFBQSxNQVhOLEdBV2VoRCxZQUFZLENBQUNpRCxHQUFiLENBQWlCSCxRQUFqQixDQVhmOztBQUFBLGtCQVlPRSxNQVpQO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEscUJBYVUsS0FBS0EsTUFBTCxDQUFZO0FBQUVFLGdCQUFBQSxFQUFFLEVBQUVKO0FBQU4sZUFBWixDQWJWOztBQUFBO0FBY0lFLGNBQUFBLE1BQU0sR0FBR2hELFlBQVksQ0FBQ2lELEdBQWIsQ0FBaUJILFFBQWpCLENBQVQ7O0FBZEosa0JBZVNFLE1BZlQ7QUFBQTtBQUFBO0FBQUE7O0FBQUEsMkNBZ0JpQ0YsUUFoQmpDOztBQUFBO0FBQUEsbUJBb0JTZCxJQXBCVDtBQUFBO0FBQUE7QUFBQTs7QUFBQSx3Q0FxQk1nQixNQUFNLENBQUNHLE9BckJiLGFBcUJNLGlCQUFnQmxCLE9BckJ0QjtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLHFCQXNCY0YsV0FBVyxDQUFDQyxJQUFELEVBQU9nQixNQUFNLENBQUNHLE9BQVAsQ0FBZWxCLE9BQXRCLENBdEJ6Qjs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLDhCQXVCUUQsSUF2QlI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSw4QkF3Qk0sSUF4Qk47O0FBQUE7QUFvQkVBLGNBQUFBLElBcEJGO0FBQUE7QUFBQSxxQkEwQmlDLEtBQUtnRCxNQUFMLENBQVlDLFFBQVosQ0FBcUI7QUFDbEQrRixnQkFBQUEsWUFBWSxFQUFFLENBQ1o7QUFDRWxJLGtCQUFBQSxRQUFRLEVBQVJBLFFBREY7QUFFRWQsa0JBQUFBLElBQUksRUFBSkEsSUFGRjtBQUdFaUosa0JBQUFBLFVBQVUsRUFBVkEsVUFIRjtBQUlFQyxrQkFBQUEsU0FBUyxFQUFUQTtBQUpGLGlCQURZLEVBT1p4SixrQkFQWTtBQURvQyxlQUFyQixDQTFCakM7O0FBQUE7QUFBQTtBQTBCVXNKLGNBQUFBLFlBMUJWLDBCQTBCVUEsWUExQlY7O0FBQUEsa0JBc0NPQSxZQXRDUDtBQUFBO0FBQUE7QUFBQTs7QUFBQSxvQkF1Q1UsSUFBSTFHLEtBQUosQ0FBVSxxQkFBVixDQXZDVjs7QUFBQTtBQUFBLGlEQTBDUzlELDZCQUE2QixDQUFDd0ssWUFBRCw4QkFBZSxJQUFmLGdCQTFDdEM7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0F4bUJGOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBLFNBcXBCUUcsc0JBcnBCUjtBQUFBLDJGQXFwQkUsbUJBQ0VDLGFBREY7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEscUJBRzJDLEtBQUtwRyxNQUFMLENBQVlDLFFBQVosQ0FBcUI7QUFDNURrRyxnQkFBQUEsc0JBQXNCLEVBQUUsQ0FDdEJDLGFBRHNCLEVBRXRCO0FBQ0VDLGtCQUFBQSxTQUFTLEVBQUUsSUFEYjtBQUVFdkIsa0JBQUFBLElBQUksRUFBRSxJQUZSO0FBR0V3QixrQkFBQUEsS0FBSyxFQUFFLElBSFQ7QUFJRUMsa0JBQUFBLGVBQWUsRUFBRTtBQUpuQixpQkFGc0I7QUFEb0MsZUFBckIsQ0FIM0M7O0FBQUE7QUFBQTtBQUdVSixjQUFBQSxzQkFIViwwQkFHVUEsc0JBSFY7O0FBQUEsa0JBZU9BLHNCQWZQO0FBQUE7QUFBQTtBQUFBOztBQUFBLGlEQWdCVyxJQWhCWDs7QUFBQTtBQUFBLGlGQW9CT0Esc0JBcEJQO0FBcUJJSSxnQkFBQUEsZUFBZSxFQUFFSixzQkFBc0IsQ0FBQ0ksZUFBdkIsR0FDYixJQUFJQyxJQUFKLENBQVNMLHNCQUFzQixDQUFDSSxlQUFoQyxDQURhLEdBRWI7QUF2QlI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FycEJGOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBLFNBZ3JCUUUsZ0JBaHJCUjtBQUFBLHFGQWdyQkU7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEscUJBQ3FDLEtBQUt6RyxNQUFMLENBQVk2RSxLQUFaLENBQWtCO0FBQ25ENEIsZ0JBQUFBLGdCQUFnQixFQUFFO0FBQ2hCSixrQkFBQUEsU0FBUyxFQUFFLElBREs7QUFFaEJ2QixrQkFBQUEsSUFBSSxFQUFFLElBRlU7QUFHaEJ3QixrQkFBQUEsS0FBSyxFQUFFLElBSFM7QUFJaEJDLGtCQUFBQSxlQUFlLEVBQUU7QUFKRDtBQURpQyxlQUFsQixDQURyQzs7QUFBQTtBQUFBO0FBQ1VFLGNBQUFBLGdCQURWLDJCQUNVQSxnQkFEVjs7QUFBQSxrQkFVT0EsZ0JBVlA7QUFBQTtBQUFBO0FBQUE7O0FBQUEsaURBV1csSUFYWDs7QUFBQTtBQUFBLGlGQWVPQSxnQkFmUDtBQWdCSUYsZ0JBQUFBLGVBQWUsRUFBRUUsZ0JBQWdCLENBQUNGLGVBQWpCLEdBQ2IsSUFBSUMsSUFBSixDQUFTQyxnQkFBZ0IsQ0FBQ0YsZUFBMUIsQ0FEYSxHQUViO0FBbEJSOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBaHJCRjs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQSxTQXNzQlFHLFVBdHNCUjtBQUFBLCtFQXNzQkUsbUJBQ0V0SixJQURGLEVBRUV1SixhQUZGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEscUJBSXFCLEtBQUtDLGVBQUwsQ0FBcUJ4SixJQUFyQixDQUpyQjs7QUFBQTtBQUlRMEgsY0FBQUEsSUFKUjs7QUFBQSxrQkFLT0EsSUFMUDtBQUFBO0FBQUE7QUFBQTs7QUFBQSxpREFNVyxLQU5YOztBQUFBO0FBQUEsaURBUVMsS0FBSytCLGFBQUwsQ0FBbUIvQixJQUFJLENBQUNnQyxlQUF4QixFQUF5Q0gsYUFBekMsQ0FSVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQXRzQkY7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUEsU0FpdEJRSSxvQkFqdEJSO0FBQUEseUZBaXRCRTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxxQkFDeUIsS0FBSy9HLE1BQUwsQ0FBWTZFLEtBQVosQ0FBa0I7QUFDdkNoRyxnQkFBQUEsSUFBSSxFQUFFLENBQ0osRUFESSxFQUVKO0FBQ0VrSSxrQkFBQUEsb0JBQW9CLEVBQUU7QUFDcEJDLG9CQUFBQSxJQUFJLEVBQUUsSUFEYztBQUVwQkMsb0JBQUFBLGdCQUFnQixFQUFFLElBRkU7QUFHcEJDLG9CQUFBQSxNQUFNLEVBQUU7QUFDTmhKLHNCQUFBQSxFQUFFLEVBQUUsSUFERTtBQUVOaUosc0JBQUFBLFNBQVMsRUFBRSxJQUZMO0FBR05DLHNCQUFBQSxRQUFRLEVBQUUsSUFISjtBQUlOQyxzQkFBQUEsS0FBSyxFQUFFLElBSkQ7QUFLTnRKLHNCQUFBQSxTQUFTLEVBQUU7QUFMTCxxQkFIWTtBQVVwQnVKLG9CQUFBQSxVQUFVLEVBQUU7QUFDVnBKLHNCQUFBQSxFQUFFLEVBQUUsSUFETTtBQUVWaUosc0JBQUFBLFNBQVMsRUFBRSxJQUZEO0FBR1ZDLHNCQUFBQSxRQUFRLEVBQUUsSUFIQTtBQUlWQyxzQkFBQUEsS0FBSyxFQUFFLElBSkc7QUFLVnRKLHNCQUFBQSxTQUFTLEVBQUU7QUFMRCxxQkFWUTtBQWlCcEJ3SixvQkFBQUEsbUJBQW1CLEVBQUU7QUFDbkJGLHNCQUFBQSxLQUFLLEVBQUU7QUFEWTtBQWpCRDtBQUR4QixpQkFGSTtBQURpQyxlQUFsQixDQUR6Qjs7QUFBQTtBQUFBO0FBQ1V4SSxjQUFBQSxJQURWLDJCQUNVQSxJQURWOztBQUFBLGtCQThCT0EsSUE5QlA7QUFBQTtBQUFBO0FBQUE7O0FBQUEsb0JBK0JVLElBQUlTLEtBQUosQ0FBVSxrQ0FBVixDQS9CVjs7QUFBQTtBQUFBLGlEQWtDU1QsSUFBSSxDQUFDa0ksb0JBQUwsQ0FBMEJySSxHQUExQixDQUE4QixVQUFBa0gsQ0FBQztBQUFBO0FBQ3BDMUgsa0JBQUFBLEVBQUUsRUFBRWxDLFFBQVE7QUFEd0IsbUJBRWpDNEosQ0FGaUM7QUFHcENvQixrQkFBQUEsSUFBSSxFQUFFLElBQUlSLElBQUosQ0FBU1osQ0FBQyxDQUFDb0IsSUFBWDtBQUg4QjtBQUFBLGVBQS9CLENBbENUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBanRCRjs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQSxTQTB2QlFRLGVBMXZCUjtBQUFBLG9GQTB2QkUsbUJBQ0VDLE9BREY7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVJekksY0FBQUEsSUFGSixVQUVJQSxJQUZKLEVBRVVELE9BRlYsVUFFVUEsT0FGVixFQUVtQlAsS0FGbkIsVUFFbUJBLEtBRm5CLEVBRTBCa0osYUFGMUIsVUFFMEJBLGFBRjFCLEVBRXlDQyxPQUZ6QyxVQUV5Q0EsT0FGekM7QUFBQTtBQUFBLHFCQUl1QixLQUFLQyxVQUFMLEVBSnZCOztBQUFBO0FBSVFDLGNBQUFBLE1BSlI7QUFLUUMsY0FBQUEsS0FMUixHQUtnQkQsTUFBTSxDQUFDM0gsSUFBUCxDQUFZLFVBQUE2SCxDQUFDO0FBQUEsdUJBQUlBLENBQUMsQ0FBQ2pCLGVBQUYsS0FBc0JXLE9BQTFCO0FBQUEsZUFBYixDQUxoQjs7QUFBQSxrQkFNT0ssS0FOUDtBQUFBO0FBQUE7QUFBQTs7QUFBQSxvQkFPVSxJQUFJeEksS0FBSixvQkFBMkJtSSxPQUEzQixDQVBWOztBQUFBO0FBU01PLGNBQUFBLE9BVE4sR0FTK0IsSUFUL0I7QUFVTUMsY0FBQUEsSUFWTixHQVU0QixJQVY1Qjs7QUFXRSxrQkFBSWpKLElBQUksSUFBSUQsT0FBWixFQUFxQjtBQUNuQmlKLGdCQUFBQSxPQUFPLEdBQUduTSxNQUFNLENBQUNxTSxlQUFQLENBQ1JyTSxNQUFNLENBQUNzTSwyQkFEQyxFQUVSLEtBRlEsQ0FBVjtBQUlBRixnQkFBQUEsSUFBSSxHQUFHcE0sTUFBTSxDQUFDdU0sa0JBQVAsQ0FDTHZNLE1BQU0sQ0FBQ3dNLHdCQURGLEVBRUxDLElBQUksQ0FBQ0MsU0FBTCxDQUFlO0FBQUV2SixrQkFBQUEsSUFBSSxFQUFKQSxJQUFGO0FBQVFELGtCQUFBQSxPQUFPLEVBQVBBO0FBQVIsaUJBQWYsQ0FGSyxFQUdMaUosT0FISyxFQUlMLEtBSkssQ0FBUDtBQU1EOztBQUNLUSxjQUFBQSxXQXZCUixHQXVCc0IsSUFBSWhKLEtBQUosRUF2QnRCOztBQUFBLG1CQXdCTWhCLEtBeEJOO0FBQUE7QUFBQTtBQUFBOztBQUFBLDREQXlCb0JBLEtBekJwQjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQXlCZUcsY0FBQUEsQ0F6QmY7QUEwQlVlLGNBQUFBLElBMUJWLEdBMEJpQnpFLFVBQVUsQ0FBQ2dELEdBQVgsQ0FBZVUsQ0FBQyxDQUFDVCxFQUFqQixDQTFCakI7O0FBQUEsa0JBMkJXd0IsSUEzQlg7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSxxQkE0QmMsS0FBS0EsSUFBTCxDQUFVO0FBQUV4QixnQkFBQUEsRUFBRSxFQUFFUyxDQUFDLENBQUNUO0FBQVIsZUFBVixDQTVCZDs7QUFBQTtBQTZCUXdCLGNBQUFBLElBQUksR0FBR3pFLFVBQVUsQ0FBQ2dELEdBQVgsQ0FBZVUsQ0FBQyxDQUFDVCxFQUFqQixDQUFQOztBQTdCUixrQkE4QmF3QixJQTlCYjtBQUFBO0FBQUE7QUFBQTs7QUFBQSxvQkErQmdCLElBQUlKLEtBQUosV0FBa0JYLENBQUMsQ0FBQzNCLElBQXBCLFVBQTZCMkIsQ0FBQyxDQUFDVCxFQUEvQix1QkEvQmhCOztBQUFBO0FBQUEsa0JBa0NXd0IsSUFBSSxDQUFDYixJQWxDaEI7QUFBQTtBQUFBO0FBQUE7O0FBQUE7O0FBQUE7QUFxQ00ySixjQUFBQSxXQUFXLENBQUM3SSxJQUFaLENBQWlCO0FBQ2Z6QixnQkFBQUEsRUFBRSxFQUFFd0IsSUFBSSxDQUFDeEIsRUFETTtBQUVmMEIsZ0JBQUFBLE9BQU8sRUFBRS9ELE1BQU0sQ0FBQ3lCLE1BQVAsQ0FDUHZCLGdCQUFnQixDQUNkRixNQUFNLENBQUNzQixXQUFQLENBQW1CdUMsSUFBSSxDQUFDYixJQUFMLENBQVVELEdBQTdCLENBRGMsRUFFZCxnREFBV2IsU0FGRyxFQUdkLGdEQUFXSyxVQUhHLENBRFQsQ0FGTTtBQVNmcEIsZ0JBQUFBLElBQUksRUFBRW5CLE1BQU0sQ0FBQ3lCLE1BQVAsQ0FDSnZCLGdCQUFnQixDQUNkRixNQUFNLENBQUNzQixXQUFQLENBQW1Cd0IsQ0FBQyxDQUFDM0IsSUFBckIsQ0FEYyxFQUVkLGdEQUFXZSxTQUZHLEVBR2QsZ0RBQVdLLFVBSEcsQ0FEWjtBQVRTLGVBQWpCOztBQXJDTjtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBLHFCQXlEb0MsS0FBSzRCLE1BQUwsQ0FBWUMsUUFBWixDQUFxQjtBQUNyRHVILGdCQUFBQSxlQUFlLEVBQUUsQ0FDZjtBQUNFQyxrQkFBQUEsT0FBTyxFQUFQQSxPQURGO0FBRUVILGtCQUFBQSxVQUFVLEVBQUVJLGFBRmQ7QUFHRUMsa0JBQUFBLE9BQU8sRUFBUEEsT0FIRjtBQUlFM0ksa0JBQUFBLElBQUksRUFBRUEsSUFBSSxHQUNObkQsTUFBTSxDQUFDeUIsTUFBUCxDQUNFdkIsZ0JBQWdCLENBQ2RGLE1BQU0sQ0FBQ3NCLFdBQVAsQ0FBbUI2QixJQUFuQixDQURjLEVBRWQsZ0RBQVdqQixTQUZHLEVBR2QsZ0RBQVdLLFVBSEcsQ0FEbEIsQ0FETSxHQVFOLElBWk47QUFhRVcsa0JBQUFBLE9BQU8sRUFBRUEsT0FBTyxHQUNabEQsTUFBTSxDQUFDeUIsTUFBUCxDQUNFdkIsZ0JBQWdCLENBQ2RGLE1BQU0sQ0FBQ3NCLFdBQVAsQ0FBbUI0QixPQUFuQixDQURjLEVBRWQsZ0RBQVdoQixTQUZHLEVBR2QsZ0RBQVdLLFVBSEcsQ0FEbEIsQ0FEWSxHQVFaLElBckJOO0FBc0JFb0ssa0JBQUFBLFdBQVcsRUFBWEEsV0F0QkY7QUF1QkVQLGtCQUFBQSxJQUFJLEVBQUpBLElBdkJGO0FBd0JFRCxrQkFBQUEsT0FBTyxFQUFQQTtBQXhCRixpQkFEZSxFQTJCZnJMLFlBM0JlO0FBRG9DLGVBQXJCLENBekRwQzs7QUFBQTtBQUFBO0FBeURVNkssY0FBQUEsZUF6RFYsMEJBeURVQSxlQXpEVjs7QUFBQSxrQkF5Rk9BLGVBekZQO0FBQUE7QUFBQTtBQUFBOztBQUFBLGlEQTBGVyxJQTFGWDs7QUFBQTtBQUFBLGlEQTZGUzFLLDZCQUE2QixDQUNsQzBLLGVBRGtDLDhCQUVsQyxJQUZrQyxnQkE3RnRDOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBMXZCRjs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQSxTQTYxQlFpQixlQTcxQlI7QUFBQSxvRkE2MUJFLG1CQUFzQmhCLE9BQXRCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHFCQUNvQyxLQUFLekgsTUFBTCxDQUFZQyxRQUFaLENBQXFCO0FBQ3JEd0ksZ0JBQUFBLGVBQWUsRUFBRSxDQUNmO0FBQ0VoQixrQkFBQUEsT0FBTyxFQUFQQTtBQURGLGlCQURlLEVBSWYsSUFKZTtBQURvQyxlQUFyQixDQURwQzs7QUFBQTtBQUFBO0FBQ1VnQixjQUFBQSxlQURWLDJCQUNVQSxlQURWO0FBQUEsaURBU1NBLGVBVFQsV0FTU0EsZUFUVCxHQVM0QixLQVQ1Qjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQTcxQkY7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUEsU0F5MkJRQyxrQkF6MkJSO0FBQUEsdUZBeTJCRTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0VwSyxjQUFBQSxPQURGLFVBQ0VBLE9BREYsRUFFRWEsTUFGRixVQUVFQSxNQUZGO0FBQUE7QUFBQSxxQkFPdUMsS0FBS2EsTUFBTCxDQUFZQyxRQUFaLENBQXFCO0FBQ3hEeUksZ0JBQUFBLGtCQUFrQixFQUFFLENBQ2xCO0FBQ0VwSyxrQkFBQUEsT0FBTyxFQUFQQSxPQURGO0FBRUVhLGtCQUFBQSxNQUFNLEVBQU5BO0FBRkYsaUJBRGtCLEVBS2xCLElBTGtCO0FBRG9DLGVBQXJCLENBUHZDOztBQUFBO0FBQUE7QUFPVXVKLGNBQUFBLGtCQVBWLDJCQU9VQSxrQkFQVjtBQUFBLGlEQWdCU0Esa0JBaEJUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBejJCRjs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQSxTQTQzQlFDLG1CQTUzQlI7QUFBQSx3RkE0M0JFO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDRTdLLGNBQUFBLFFBREYsVUFDRUEsUUFERixFQUVFcUIsTUFGRixVQUVFQSxNQUZGO0FBQUE7QUFBQSxxQkFPd0MsS0FBS2EsTUFBTCxDQUFZQyxRQUFaLENBQXFCO0FBQ3pEMEksZ0JBQUFBLG1CQUFtQixFQUFFLENBQ25CO0FBQ0U3SyxrQkFBQUEsUUFBUSxFQUFSQSxRQURGO0FBRUVxQixrQkFBQUEsTUFBTSxFQUFOQTtBQUZGLGlCQURtQixFQUtuQixJQUxtQjtBQURvQyxlQUFyQixDQVB4Qzs7QUFBQTtBQUFBO0FBT1V3SixjQUFBQSxtQkFQViwyQkFPVUEsbUJBUFY7QUFBQSxpREFnQlNBLG1CQWhCVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQTUzQkY7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUEsU0ErNEJRQyxjQS80QlI7QUFBQSxtRkErNEJFO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDRXRLLGNBQUFBLE9BREYsVUFDRUEsT0FERixFQUVFUixRQUZGLFVBRUVBLFFBRkYsRUFHRStLLFVBSEYsVUFHRUEsVUFIRjtBQVNNbkosY0FBQUEsSUFUTixHQVNhM0UsV0FBVyxDQUFDa0QsR0FBWixDQUFnQkssT0FBaEIsQ0FUYjs7QUFBQSxrQkFVT29CLElBVlA7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSxxQkFXVSxLQUFLbkIsS0FBTCxDQUFXO0FBQUVMLGdCQUFBQSxFQUFFLEVBQUVJO0FBQU4sZUFBWCxDQVhWOztBQUFBO0FBWUlvQixjQUFBQSxJQUFJLEdBQUczRSxXQUFXLENBQUNrRCxHQUFaLENBQWdCSyxPQUFoQixDQUFQOztBQVpKLGtCQWFTb0IsSUFiVDtBQUFBO0FBQUE7QUFBQTs7QUFBQSxvQkFjWSxJQUFJSixLQUFKLFlBQW1CaEIsT0FBbkIsdUJBZFo7O0FBQUE7QUFBQSxtQkFpQmV1SyxVQWpCZjtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLHFCQWtCWTlMLFdBQVcsQ0FBQzhMLFVBQUQsRUFBYW5KLElBQUksQ0FBQ3ZCLE9BQUwsQ0FBYWxCLE9BQTFCLENBbEJ2Qjs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLDhCQW1CTSxJQW5CTjs7QUFBQTtBQWlCRTRMLGNBQUFBLFVBakJGO0FBQUE7QUFBQSxxQkFxQm1DLEtBQUs3SSxNQUFMLENBQVlDLFFBQVosQ0FBcUI7QUFDcEQySSxnQkFBQUEsY0FBYyxFQUFFLENBQ2Q7QUFDRXRLLGtCQUFBQSxPQUFPLEVBQVBBLE9BREY7QUFFRVIsa0JBQUFBLFFBQVEsRUFBUkEsUUFGRjtBQUdFK0ssa0JBQUFBLFVBQVUsRUFBVkE7QUFIRixpQkFEYyxFQU1kLElBTmM7QUFEb0MsZUFBckIsQ0FyQm5DOztBQUFBO0FBQUE7QUFxQlVELGNBQUFBLGNBckJWLDJCQXFCVUEsY0FyQlY7QUFBQSxpREFnQ1NBLGNBaENUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBLzRCRjs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQSxTQWs3QlFFLHNCQWw3QlI7QUFBQSwyRkFrN0JFO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDRUMsY0FBQUEsR0FERixVQUNFQSxHQURGO0FBQUE7QUFBQSxxQkFLMkMsS0FBSy9JLE1BQUwsQ0FBWUMsUUFBWixDQUFxQjtBQUM1RDZJLGdCQUFBQSxzQkFBc0IsRUFBRSxDQUN0QjtBQUNFQyxrQkFBQUEsR0FBRyxFQUFIQTtBQURGLGlCQURzQixFQUl0QixJQUpzQjtBQURvQyxlQUFyQixDQUwzQzs7QUFBQTtBQUFBO0FBS1VELGNBQUFBLHNCQUxWLDJCQUtVQSxzQkFMVjtBQUFBLGlEQWFTQSxzQkFiVCxXQWFTQSxzQkFiVCxHQWFtQyxLQWJuQzs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQWw3QkY7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUEsU0FrOEJRRSxxQkFsOEJSO0FBQUEsMEZBazhCRTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0VELGNBQUFBLEdBREYsVUFDRUEsR0FERjtBQUFBO0FBQUEscUJBSzBDLEtBQUsvSSxNQUFMLENBQVlDLFFBQVosQ0FBcUI7QUFDM0QrSSxnQkFBQUEscUJBQXFCLEVBQUUsQ0FDckI7QUFDRUQsa0JBQUFBLEdBQUcsRUFBSEE7QUFERixpQkFEcUIsRUFJckIsSUFKcUI7QUFEb0MsZUFBckIsQ0FMMUM7O0FBQUE7QUFBQTtBQUtVQyxjQUFBQSxxQkFMViwyQkFLVUEscUJBTFY7QUFBQSxpREFhU0EscUJBYlQsV0FhU0EscUJBYlQsR0Fha0MsS0FibEM7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FsOEJGOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBLFNBazlCUUMsZUFsOUJSO0FBQUEsb0ZBazlCRTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQXdCRixjQUFBQSxHQUF4QixVQUF3QkEsR0FBeEI7QUFBQTtBQUFBLHFCQUNvQyxLQUFLL0ksTUFBTCxDQUFZQyxRQUFaLENBQXFCO0FBQ3JEZ0osZ0JBQUFBLGVBQWUsRUFBRSxDQUNmO0FBQ0VGLGtCQUFBQSxHQUFHLEVBQUhBO0FBREYsaUJBRGUsRUFJZixJQUplO0FBRG9DLGVBQXJCLENBRHBDOztBQUFBO0FBQUE7QUFDVUUsY0FBQUEsZUFEViwyQkFDVUEsZUFEVjtBQUFBLGlEQVNTQSxlQVRUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBbDlCRjs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQSxTQTg5QlFDLGNBOTlCUjtBQUFBLG1GQTg5QkU7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEscUJBQ21DLEtBQUtsSixNQUFMLENBQVlDLFFBQVosQ0FBcUI7QUFDcERpSixnQkFBQUEsY0FBYyxFQUFFO0FBRG9DLGVBQXJCLENBRG5DOztBQUFBO0FBQUE7QUFDVUEsY0FBQUEsY0FEViwyQkFDVUEsY0FEVjtBQUFBLGlEQUtTQSxjQUxULFdBS1NBLGNBTFQsR0FLMkIsS0FMM0I7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0E5OUJGOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBLFNBcytCUUMsZUF0K0JSO0FBQUEsb0ZBcytCRTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxxQkFDb0MsS0FBS25KLE1BQUwsQ0FBWUMsUUFBWixDQUFxQjtBQUNyRGtKLGdCQUFBQSxlQUFlLEVBQUU7QUFEb0MsZUFBckIsQ0FEcEM7O0FBQUE7QUFBQTtBQUNVQSxjQUFBQSxlQURWLDJCQUNVQSxlQURWO0FBQUEsaURBS1NBLGVBTFQsV0FLU0EsZUFMVCxHQUs0QixLQUw1Qjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQXQrQkY7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUEsU0E4K0JRQyxZQTkrQlI7QUFBQSxpRkE4K0JFO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBcUI5SyxjQUFBQSxPQUFyQixVQUFxQkEsT0FBckI7QUFBQTtBQUFBLHFCQUNpQyxLQUFLMEIsTUFBTCxDQUFZQyxRQUFaLENBQXFCO0FBQ2xEbUosZ0JBQUFBLFlBQVksRUFBRSxDQUFDO0FBQUU5SyxrQkFBQUEsT0FBTyxFQUFQQTtBQUFGLGlCQUFELEVBQWMsSUFBZDtBQURvQyxlQUFyQixDQURqQzs7QUFBQTtBQUFBO0FBQ1U4SyxjQUFBQSxZQURWLDJCQUNVQSxZQURWO0FBQUEsaURBS1NBLFlBTFQ7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0E5K0JGOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBLFNBcy9CUUMsYUF0L0JSO0FBQUEsa0ZBcy9CRTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQXNCbkwsY0FBQUEsRUFBdEIsVUFBc0JBLEVBQXRCO0FBQUE7QUFBQSxxQkFDa0MsS0FBSzhCLE1BQUwsQ0FBWUMsUUFBWixDQUFxQjtBQUNuRG9KLGdCQUFBQSxhQUFhLEVBQUUsQ0FBQztBQUFFbkwsa0JBQUFBLEVBQUUsRUFBRkE7QUFBRixpQkFBRCxFQUFTLElBQVQ7QUFEb0MsZUFBckIsQ0FEbEM7O0FBQUE7QUFBQTtBQUNVbUwsY0FBQUEsYUFEViwyQkFDVUEsYUFEVjtBQUFBLGlEQUtTQSxhQUxULFdBS1NBLGFBTFQsR0FLMEIsS0FMMUI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0F0L0JGOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBLFNBOC9CUUMsV0E5L0JSO0FBQUEsZ0ZBOC9CRTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9CQyxjQUFBQSxNQUFwQixVQUFvQkEsTUFBcEI7QUFBQTtBQUFBLHFCQUNnQyxLQUFLdkosTUFBTCxDQUFZQyxRQUFaLENBQXFCO0FBQ2pEcUosZ0JBQUFBLFdBQVcsRUFBRSxDQUFDO0FBQUVDLGtCQUFBQSxNQUFNLEVBQU5BO0FBQUYsaUJBQUQsRUFBYSxJQUFiO0FBRG9DLGVBQXJCLENBRGhDOztBQUFBO0FBQUE7QUFDVUQsY0FBQUEsV0FEViwyQkFDVUEsV0FEVjtBQUFBLGlEQUtTQSxXQUxUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBOS9CRjs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQSxTQXNnQ1FFLFVBdGdDUjtBQUFBLCtFQXNnQ0U7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNFekosY0FBQUEsTUFERixVQUNFQSxNQURGLEVBRUV6QixPQUZGLFVBRUVBLE9BRkY7QUFBQTtBQUFBLHFCQU8rQixLQUFLMEIsTUFBTCxDQUFZQyxRQUFaLENBQXFCO0FBQ2hEdUosZ0JBQUFBLFVBQVUsRUFBRSxDQUNWO0FBQ0V6SixrQkFBQUEsTUFBTSxFQUFOQSxNQURGO0FBRUV6QixrQkFBQUEsT0FBTyxFQUFQQTtBQUZGLGlCQURVLEVBS1YsSUFMVTtBQURvQyxlQUFyQixDQVAvQjs7QUFBQTtBQUFBO0FBT1VrTCxjQUFBQSxVQVBWLDJCQU9VQSxVQVBWO0FBQUEsaURBZ0JTQSxVQWhCVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQXRnQ0Y7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUEsU0F5aENRQyxXQXpoQ1I7QUFBQSxnRkF5aENFO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0IxSixjQUFBQSxNQUFwQixVQUFvQkEsTUFBcEI7QUFBQTtBQUFBLHFCQUNnQyxLQUFLQyxNQUFMLENBQVlDLFFBQVosQ0FBcUI7QUFDakR3SixnQkFBQUEsV0FBVyxFQUFFLENBQ1g7QUFDRTFKLGtCQUFBQSxNQUFNLEVBQU5BO0FBREYsaUJBRFcsRUFJWCxJQUpXO0FBRG9DLGVBQXJCLENBRGhDOztBQUFBO0FBQUE7QUFDVTBKLGNBQUFBLFdBRFYsMkJBQ1VBLFdBRFY7QUFBQSxpREFTU0EsV0FUVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQXpoQ0Y7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUEsU0FxaUNRQyxVQXJpQ1I7QUFBQSwrRUFxaUNFO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBbUJILGNBQUFBLE1BQW5CLFVBQW1CQSxNQUFuQjtBQUFBO0FBQUEscUJBQytCLEtBQUt2SixNQUFMLENBQVlDLFFBQVosQ0FBcUI7QUFDaER5SixnQkFBQUEsVUFBVSxFQUFFLENBQ1Y7QUFDRUgsa0JBQUFBLE1BQU0sRUFBTkE7QUFERixpQkFEVSxFQUlWLElBSlU7QUFEb0MsZUFBckIsQ0FEL0I7O0FBQUE7QUFBQTtBQUNVRyxjQUFBQSxVQURWLDJCQUNVQSxVQURWO0FBQUEsaURBU1NBLFVBVFQ7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FyaUNGOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBLFNBaWpDUTNGLFdBampDUjtBQUFBLGdGQWlqQ0U7QUFBQTs7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNFaEUsY0FBQUEsTUFERixVQUNFQSxNQURGLEVBRUUvQyxJQUZGLFVBRUVBLElBRkYsRUFHRWMsUUFIRixVQUdFQSxRQUhGOztBQUFBLG9CQVNNQSxRQUFRLElBQUksQ0FBQzlDLFlBQVksQ0FBQzJPLEdBQWIsQ0FBaUI3TCxRQUFqQixDQVRuQjtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLHFCQVVVLEtBQUtFLE1BQUwsQ0FBWTtBQUFFRSxnQkFBQUEsRUFBRSxFQUFFSjtBQUFOLGVBQVosQ0FWVjs7QUFBQTtBQUFBLGtCQVdTOUMsWUFBWSxDQUFDMk8sR0FBYixDQUFpQjdMLFFBQWpCLENBWFQ7QUFBQTtBQUFBO0FBQUE7O0FBQUEsb0JBWVksSUFBSXdCLEtBQUosaUJBQXdCeEIsUUFBeEIsc0JBWlo7O0FBQUE7QUFnQk1jLGNBQUFBLEdBaEJOLEdBZ0JZLEVBaEJaO0FBa0JRYyxjQUFBQSxJQWxCUixHQWtCZXpFLFVBQVUsQ0FBQ2dELEdBQVgsQ0FBZThCLE1BQWYsQ0FsQmY7O0FBQUEsa0JBb0JPTCxJQXBCUDtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLHFCQXFCVSxLQUFLQSxJQUFMLENBQVU7QUFBRXhCLGdCQUFBQSxFQUFFLEVBQUU2QjtBQUFOLGVBQVYsQ0FyQlY7O0FBQUE7QUFzQlVMLGNBQUFBLE1BdEJWLHNCQXNCaUJ6RSxVQUFVLENBQUNnRCxHQUFYLENBQWU4QixNQUFmLENBdEJqQiw4QkFzQjJDLElBdEIzQzs7QUFBQSxrQkF1QlNMLE1BdkJUO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEscUJBd0JrQyxLQUFLa0ssYUFBTCxFQXhCbEM7O0FBQUE7QUF3QllBLGNBQUFBLGFBeEJaO0FBeUJZOUUsY0FBQUEsSUF6QlosR0F5Qm1COEUsYUFBYSxDQUFDMUosSUFBZCxDQUFtQixVQUFBMEYsQ0FBQztBQUFBLHVCQUMvQkEsQ0FBQyxDQUFDcEgsS0FBRixDQUFRcUwsSUFBUixDQUFhLFVBQUFsTCxDQUFDO0FBQUEseUJBQUlBLENBQUMsQ0FBQ1QsRUFBRixLQUFTNkIsTUFBYjtBQUFBLGlCQUFkLENBRCtCO0FBQUEsZUFBcEIsQ0F6Qm5COztBQUFBLGtCQTZCVytFLElBN0JYO0FBQUE7QUFBQTtBQUFBOztBQUFBLG9CQThCYyxJQUFJeEYsS0FBSixvQ0FBMkNTLE1BQTNDLENBOUJkOztBQUFBO0FBaUNZK0osY0FBQUEsUUFqQ1osR0FpQ3VCaEYsSUFBSSxDQUFDdEcsS0FBTCxDQUFXMEIsSUFBWCxDQUFnQixVQUFBdkIsQ0FBQztBQUFBLHVCQUFJQSxDQUFDLENBQUNULEVBQUYsS0FBUzZCLE1BQWI7QUFBQSxlQUFqQixDQWpDdkI7O0FBQUEsa0JBbUNXK0osUUFuQ1g7QUFBQTtBQUFBO0FBQUE7O0FBQUEsb0JBb0NjLElBQUl4SyxLQUFKLG9DQUEyQ1MsTUFBM0MsQ0FwQ2Q7O0FBQUE7QUF1Q1lILGNBQUFBLE9BdkNaLEdBdUNzQjlELGdCQUFnQixDQUM5QkQsTUFBTSxDQUFDcUIsUUFBUCxDQUFnQjRNLFFBQVEsQ0FBQ2xMLEdBQXpCLENBRDhCLEVBRTlCa0csSUFBSSxDQUFDb0MsTUFBTCxDQUFZbkosU0FGa0IsRUFHOUIsZ0RBQVdLLFVBSG1CLENBdkN0QztBQTZDTVEsY0FBQUEsR0FBRyxHQUFHL0MsTUFBTSxDQUFDeUIsTUFBUCxDQUFjc0MsT0FBZCxDQUFOO0FBN0NOO0FBQUE7O0FBQUE7QUFBQSxrQkErQ1dGLE1BQUksQ0FBQ2IsSUEvQ2hCO0FBQUE7QUFBQTtBQUFBOztBQUFBLG9CQWdEYyxJQUFJUyxLQUFKLENBQVUsb0JBQVYsQ0FoRGQ7O0FBQUE7QUFrRE1WLGNBQUFBLEdBQUcsR0FBR2MsTUFBSSxDQUFDYixJQUFMLENBQVVELEdBQWhCOztBQWxETjtBQUFBO0FBQUE7O0FBQUE7QUFBQSxrQkFxRFNjLElBQUksQ0FBQ2IsSUFyRGQ7QUFBQTtBQUFBO0FBQUE7O0FBQUEsb0JBc0RZLElBQUlTLEtBQUosQ0FBVSxvQkFBVixDQXREWjs7QUFBQTtBQXdESVYsY0FBQUEsR0FBRyxHQUFHYyxJQUFJLENBQUNiLElBQUwsQ0FBVUQsR0FBaEI7O0FBeERKO0FBQUEsb0JBMkRNQSxHQUFHLEtBQUssRUEzRGQ7QUFBQTtBQUFBO0FBQUE7O0FBQUEsb0JBNERVLElBQUlVLEtBQUosQ0FBVSxvQkFBVixDQTVEVjs7QUFBQTtBQStERVYsY0FBQUEsR0FBRyxHQUFHL0MsTUFBTSxDQUFDeUIsTUFBUCxDQUNKdkIsZ0JBQWdCLENBQ2RGLE1BQU0sQ0FBQ3FCLFFBQVAsQ0FBZ0IwQixHQUFoQixDQURjLEVBRWQsZ0RBQVdiLFNBRkcsRUFHZCxnREFBV0ssVUFIRyxDQURaLENBQU47QUFRTW5CLGNBQUFBLE9BdkVSLEdBdUVrQjlCLGtCQUFrQixFQXZFcEM7QUFBQTtBQUFBLHFCQXdFOEI0QixXQUFXLENBQUNDLElBQUQsRUFBT25CLE1BQU0sQ0FBQ3lCLE1BQVAsQ0FBY0wsT0FBZCxDQUFQLENBeEV6Qzs7QUFBQTtBQXdFUW9ILGNBQUFBLGFBeEVSO0FBeUVRMEYsY0FBQUEsZ0JBekVSLEdBeUUyQmxPLE1BQU0sQ0FBQ3lCLE1BQVAsQ0FDdkJ2QixnQkFBZ0IsQ0FBQ2tCLE9BQUQsRUFBVSxnREFBV2MsU0FBckIsRUFBZ0MsZ0RBQVdLLFVBQTNDLENBRE8sQ0F6RTNCO0FBQUE7QUFBQSxxQkE2RWdDLEtBQUs0QixNQUFMLENBQVlDLFFBQVosQ0FBcUI7QUFDakQ4RCxnQkFBQUEsV0FBVyxFQUFFLENBQ1g7QUFDRWhFLGtCQUFBQSxNQUFNLEVBQU5BLE1BREY7QUFFRW5CLGtCQUFBQSxHQUFHLEVBQUhBLEdBRkY7QUFHRWQsa0JBQUFBLFFBQVEsRUFBUkEsUUFIRjtBQUlFa00sa0JBQUFBLFFBQVEsRUFBRTNGLGFBSlo7QUFLRXBILGtCQUFBQSxPQUFPLEVBQUU4TTtBQUxYLGlCQURXLEVBUVhsTix1QkFSVztBQURvQyxlQUFyQixDQTdFaEM7O0FBQUE7QUFBQTtBQTZFVWtILGNBQUFBLFdBN0VWLDJCQTZFVUEsV0E3RVY7QUFBQTtBQUFBLHFCQTBGdUJ0SSxrQkFBa0IsQ0FDckNzSSxXQURxQyw4QkFFckMsSUFGcUMsZ0JBMUZ6Qzs7QUFBQTtBQTBGUXhGLGNBQUFBLEtBMUZSO0FBK0ZRMEwsY0FBQUEsRUEvRlIsR0ErRmExTCxLQUFLLENBQUNQLE1BQU4sQ0FBYW1DLEtBQWIsQ0FBbUJELElBQW5CLENBQ1Q7QUFBQSxvQkFBRWhCLENBQUY7QUFBQSx1QkFBU0EsQ0FBQyxDQUFDbkIsU0FBRixLQUFnQiw0QkFBQSxNQUFJLFFBQUosUUFBV0EsU0FBcEM7QUFBQSxlQURTLENBL0ZiOztBQUFBLG9CQW1HTWtNLEVBQUUsSUFBSSxDQUFDLE9BQUQsRUFBVSxPQUFWLEVBQW1CQyxRQUFuQixDQUE0QkQsRUFBRSxDQUFDLENBQUQsQ0FBOUIsQ0FuR1o7QUFBQTtBQUFBO0FBQUE7O0FBb0dVRSxjQUFBQSxNQXBHVixHQW9HbUI1TCxLQUFLLENBQUNQLE1BQU4sQ0FBYW1DLEtBQWIsQ0FBbUJDLE1BQW5CLENBQ2I7QUFBQSxvQkFBRWxCLENBQUY7QUFBQSx1QkFBU0EsQ0FBQyxDQUFDbkIsU0FBRixLQUFnQiw0QkFBQSxNQUFJLFFBQUosUUFBV0EsU0FBcEM7QUFBQSxlQURhLENBcEduQjtBQUFBO0FBQUEscUJBd0dVeUcsT0FBTyxDQUFDQyxHQUFSLENBQ0owRixNQUFNLENBQUN6TCxHQUFQLENBQVc7QUFBQSxvQkFBRVEsQ0FBRjtBQUFBLG9CQUFLd0YsTUFBTDtBQUFBLHVCQUNULE1BQUksQ0FBQ0ssVUFBTCxDQUFnQjtBQUNkekcsa0JBQUFBLE9BQU8sRUFBRUMsS0FBSyxDQUFDTCxFQUREO0FBRWR3RyxrQkFBQUEsTUFBTSxFQUFOQSxNQUZjO0FBR2R2RixrQkFBQUEsTUFBTSxFQUFFRCxDQUFDLENBQUNoQjtBQUhJLGlCQUFoQixDQURTO0FBQUEsZUFBWCxDQURJLENBeEdWOztBQUFBO0FBQUEsaURBbUhTSyxLQW5IVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQWpqQ0Y7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUEsU0F1cUNRc0ksYUF2cUNSO0FBQUEsa0ZBdXFDRSxtQkFDRVksT0FERixFQUVFZCxhQUZGO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHFCQUl1QixLQUFLaUIsVUFBTCxFQUp2Qjs7QUFBQTtBQUlRQyxjQUFBQSxNQUpSO0FBTVFDLGNBQUFBLEtBTlIsR0FNZ0JELE1BQU0sQ0FBQzNILElBQVAsQ0FBWSxVQUFBNkgsQ0FBQztBQUFBLHVCQUFJQSxDQUFDLENBQUNqQixlQUFGLEtBQXNCVyxPQUExQjtBQUFBLGVBQWIsQ0FOaEI7O0FBQUEsa0JBT09LLEtBUFA7QUFBQTtBQUFBO0FBQUE7O0FBQUEsaURBUVcsS0FSWDs7QUFBQTtBQVVRUixjQUFBQSxVQVZSLEdBVXFCLElBQUk5SCxLQUFKLEVBVnJCO0FBWVErSCxjQUFBQSxtQkFaUixHQVk4QixJQUFJL0gsS0FBSixFQVo5QjtBQUFBLDREQWMwQnNJLEtBQUssQ0FBQ1AsbUJBZGhDOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBY2VGLGNBQUFBLEtBZGYsaUJBY2VBLEtBZGY7O0FBQUEsa0JBZVNBLEtBZlQ7QUFBQTtBQUFBO0FBQUE7O0FBQUE7O0FBQUE7QUFBQTtBQUFBLHFCQWtCd0IsS0FBS3ZJLFNBQUwsQ0FDbEJnSixLQUFLLENBQUN0SixLQURZLEVBRWxCc0osS0FBSyxDQUFDL0ksT0FGWSxFQUdsQitJLEtBQUssQ0FBQzlJLElBSFksRUFJbEJxSSxLQUprQixDQWxCeEI7O0FBQUE7QUFrQlVoSCxjQUFBQSxLQWxCVjs7QUF5Qkksa0JBQUksQ0FBQ0EsS0FBTCxFQUFZO0FBQ1ZrSCxnQkFBQUEsbUJBQW1CLENBQUM1SCxJQUFwQixDQUF5QjBILEtBQXpCO0FBQ0QsZUFGRCxNQUVPO0FBQ0xDLGdCQUFBQSxVQUFVLENBQUMzSCxJQUFYLENBQWdCVSxLQUFoQjtBQUNEOztBQTdCTDtBQUFBO0FBQUE7O0FBQUE7QUFBQSw0REFnQ3VCeUgsS0FBSyxDQUFDUixVQWhDN0I7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFnQ2VwSixjQUFBQSxFQWhDZixpQkFnQ2VBLEVBaENmO0FBQUE7QUFBQSxxQkFpQ3dCLEtBQUtZLFNBQUwsQ0FDbEJnSixLQUFLLENBQUN0SixLQURZLEVBRWxCc0osS0FBSyxDQUFDL0ksT0FGWSxFQUdsQitJLEtBQUssQ0FBQzlJLElBSFksRUFJbEJkLEVBSmtCLENBakN4Qjs7QUFBQTtBQWlDVW1DLGNBQUFBLE1BakNWOztBQXdDSSxrQkFBSSxDQUFDQSxNQUFMLEVBQVk7QUFDVmtILGdCQUFBQSxtQkFBbUIsQ0FBQzVILElBQXBCLENBQXlCekIsRUFBekI7QUFDRCxlQUZELE1BRU87QUFDTG9KLGdCQUFBQSxVQUFVLENBQUMzSCxJQUFYLENBQWdCVSxNQUFoQjtBQUNEOztBQTVDTDtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBLHFCQStDa0MsS0FBS0wsTUFBTCxDQUFZQyxRQUFaLENBQXFCO0FBQ25ENEcsZ0JBQUFBLGFBQWEsRUFBRSxDQUNiO0FBQ0VVLGtCQUFBQSxtQkFBbUIsRUFBbkJBLG1CQURGO0FBRUVELGtCQUFBQSxVQUFVLEVBQVZBLFVBRkY7QUFHRThDLGtCQUFBQSxXQUFXLEVBQUV0QyxLQUFLLENBQUNoQixlQUhyQjtBQUlFSCxrQkFBQUEsYUFBYSxFQUFiQTtBQUpGLGlCQURhLEVBT2IsSUFQYTtBQURvQyxlQUFyQixDQS9DbEM7O0FBQUE7QUFBQTtBQStDVUUsY0FBQUEsYUEvQ1YsMkJBK0NVQSxhQS9DVjtBQUFBLGlEQTJEU0EsYUEzRFQsV0EyRFNBLGFBM0RULEdBMkQwQixLQTNEMUI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0F2cUNGOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBLFNBcXVDUXdELGlCQXJ1Q1I7QUFBQSxzRkFxdUNFO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHFCQUVzQixLQUFLQyxTQUFMLEVBRnRCOztBQUFBO0FBRVEzRSxjQUFBQSxLQUZSO0FBR1E0RSxjQUFBQSxRQUhSLEdBR21CNUUsS0FBSyxDQUFDdkYsTUFBTixDQUFhLFVBQUF3RixDQUFDO0FBQUEsdUJBQUlBLENBQUMsQ0FBQzJCLG1CQUFGLENBQXNCeEYsTUFBdEIsR0FBK0IsQ0FBbkM7QUFBQSxlQUFkLENBSG5CO0FBQUEsNERBS3FCd0ksUUFMckI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFLYXpGLGNBQUFBLElBTGI7QUFBQSw0REFNNEJBLElBQUksQ0FBQ3lDLG1CQU5qQzs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQU1pQkYsY0FBQUEsS0FOakIsaUJBTWlCQSxLQU5qQjs7QUFBQSxrQkFPV0EsS0FQWDtBQUFBO0FBQUE7QUFBQTs7QUFBQTs7QUFBQTtBQUFBO0FBQUEscUJBVTBCLEtBQUt2SSxTQUFMLENBQ2xCZ0csSUFBSSxDQUFDdEcsS0FEYSxFQUVsQnNHLElBQUksQ0FBQy9GLE9BRmEsRUFHbEIrRixJQUFJLENBQUM5RixJQUhhLEVBSWxCcUksS0FKa0IsQ0FWMUI7O0FBQUE7QUFVWWhILGNBQUFBLEtBVlo7O0FBQUEsbUJBaUJVQSxLQWpCVjtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLHFCQWtCYyxLQUFLTCxNQUFMLENBQVlDLFFBQVosQ0FBcUI7QUFDekJ1SyxnQkFBQUEsV0FBVyxFQUFFLENBQ1g7QUFDRTFELGtCQUFBQSxlQUFlLEVBQUVoQyxJQUFJLENBQUNnQyxlQUR4QjtBQUVFMkQsa0JBQUFBLFNBQVMsRUFBRXBLO0FBRmIsaUJBRFcsRUFLWCxJQUxXO0FBRFksZUFBckIsQ0FsQmQ7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLGlEQThCUyxLQTlCVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQXJ1Q0Y7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUEsU0Fzd0NRdUcsZUF0d0NSO0FBQUEsb0ZBc3dDRTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0U1SCxjQUFBQSxJQURGLFVBQ0VBLElBREYsRUFFRUQsT0FGRixVQUVFQSxPQUZGLEVBR0VQLEtBSEYsVUFHRUEsS0FIRixFQUlFa0osYUFKRixVQUlFQSxhQUpGLEVBS0VDLE9BTEYsVUFLRUEsT0FMRjtBQU9RSyxjQUFBQSxPQVBSLEdBT2tCbk0sTUFBTSxDQUFDcU0sZUFBUCxDQUNkck0sTUFBTSxDQUFDc00sMkJBRE8sRUFFZCxLQUZjLENBUGxCO0FBV1FGLGNBQUFBLElBWFIsR0FXZXBNLE1BQU0sQ0FBQ3VNLGtCQUFQLENBQ1h2TSxNQUFNLENBQUN3TSx3QkFESSxFQUVYQyxJQUFJLENBQUNDLFNBQUwsQ0FBZTtBQUFFdkosZ0JBQUFBLElBQUksRUFBSkEsSUFBRjtBQUFRRCxnQkFBQUEsT0FBTyxFQUFQQTtBQUFSLGVBQWYsQ0FGVyxFQUdYaUosT0FIVyxFQUlYLEtBSlcsQ0FYZjtBQWlCUVEsY0FBQUEsV0FqQlIsR0FpQnNCLElBQUloSixLQUFKLEVBakJ0QjtBQUFBLDREQWtCa0JoQixLQWxCbEI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFrQmFHLGNBQUFBLENBbEJiO0FBbUJRZSxjQUFBQSxJQW5CUixHQW1CZXpFLFVBQVUsQ0FBQ2dELEdBQVgsQ0FBZVUsQ0FBQyxDQUFDVCxFQUFqQixDQW5CZjs7QUFBQSxrQkFvQlN3QixJQXBCVDtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLHFCQXFCWSxLQUFLQSxJQUFMLENBQVU7QUFBRXhCLGdCQUFBQSxFQUFFLEVBQUVTLENBQUMsQ0FBQ1Q7QUFBUixlQUFWLENBckJaOztBQUFBO0FBc0JNd0IsY0FBQUEsSUFBSSxHQUFHekUsVUFBVSxDQUFDZ0QsR0FBWCxDQUFlVSxDQUFDLENBQUNULEVBQWpCLENBQVA7O0FBdEJOLGtCQXVCV3dCLElBdkJYO0FBQUE7QUFBQTtBQUFBOztBQUFBLG9CQXdCYyxJQUFJSixLQUFKLFdBQWtCWCxDQUFDLENBQUMzQixJQUFwQixVQUE2QjJCLENBQUMsQ0FBQ1QsRUFBL0IsdUJBeEJkOztBQUFBO0FBQUEsa0JBMkJTd0IsSUFBSSxDQUFDYixJQTNCZDtBQUFBO0FBQUE7QUFBQTs7QUFBQTs7QUFBQTtBQThCSTJKLGNBQUFBLFdBQVcsQ0FBQzdJLElBQVosQ0FBaUI7QUFDZnpCLGdCQUFBQSxFQUFFLEVBQUV3QixJQUFJLENBQUN4QixFQURNO0FBRWYwQixnQkFBQUEsT0FBTyxFQUFFL0QsTUFBTSxDQUFDeUIsTUFBUCxDQUNQdkIsZ0JBQWdCLENBQ2RGLE1BQU0sQ0FBQ3NCLFdBQVAsQ0FBbUJ1QyxJQUFJLENBQUNiLElBQUwsQ0FBVUQsR0FBN0IsQ0FEYyxFQUVkLGdEQUFXYixTQUZHLEVBR2QsZ0RBQVdLLFVBSEcsQ0FEVCxDQUZNO0FBU2ZwQixnQkFBQUEsSUFBSSxFQUFFbkIsTUFBTSxDQUFDeUIsTUFBUCxDQUNKdkIsZ0JBQWdCLENBQ2RGLE1BQU0sQ0FBQ3NCLFdBQVAsQ0FBbUJ3QixDQUFDLENBQUMzQixJQUFyQixDQURjLEVBRWQsZ0RBQVdlLFNBRkcsRUFHZCxnREFBV0ssVUFIRyxDQURaO0FBVFMsZUFBakI7O0FBOUJKO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUEscUJBaURvQyxLQUFLNEIsTUFBTCxDQUFZQyxRQUFaLENBQXFCO0FBQ3JEMkcsZ0JBQUFBLGVBQWUsRUFBRSxDQUNmO0FBQ0VVLGtCQUFBQSxVQUFVLEVBQUVJLGFBRGQ7QUFFRUMsa0JBQUFBLE9BQU8sRUFBUEEsT0FGRjtBQUdFM0ksa0JBQUFBLElBQUksRUFBRW5ELE1BQU0sQ0FBQ3lCLE1BQVAsQ0FDSnZCLGdCQUFnQixDQUNkRixNQUFNLENBQUNzQixXQUFQLENBQW1CNkIsSUFBbkIsQ0FEYyxFQUVkLGdEQUFXakIsU0FGRyxFQUdkLGdEQUFXSyxVQUhHLENBRFosQ0FIUjtBQVVFVyxrQkFBQUEsT0FBTyxFQUFFbEQsTUFBTSxDQUFDeUIsTUFBUCxDQUNQdkIsZ0JBQWdCLENBQ2RGLE1BQU0sQ0FBQ3NCLFdBQVAsQ0FBbUI0QixPQUFuQixDQURjLEVBRWQsZ0RBQVdoQixTQUZHLEVBR2QsZ0RBQVdLLFVBSEcsQ0FEVCxDQVZYO0FBaUJFb0ssa0JBQUFBLFdBQVcsRUFBWEEsV0FqQkY7QUFrQkVQLGtCQUFBQSxJQUFJLEVBQUpBLElBbEJGO0FBbUJFRCxrQkFBQUEsT0FBTyxFQUFQQTtBQW5CRixpQkFEZSxFQXNCZnJMLFlBdEJlO0FBRG9DLGVBQXJCLENBakRwQzs7QUFBQTtBQUFBO0FBaURVaUssY0FBQUEsZUFqRFYsMkJBaURVQSxlQWpEVjs7QUFBQSxrQkE0RU9BLGVBNUVQO0FBQUE7QUFBQTtBQUFBOztBQUFBLGlEQTZFVyxJQTdFWDs7QUFBQTtBQUFBLGlEQWdGUzlKLDZCQUE2QixDQUNsQzhKLGVBRGtDLDhCQUVsQyxJQUZrQyxnQkFoRnRDOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBdHdDRjs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQSxTQTQxQ1E4RCxXQTUxQ1I7QUFBQSxnRkE0MUNFO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDRTNLLGNBQUFBLE1BREYsVUFDRUEsTUFERixFQUVFNEssa0JBRkYsVUFFRUEsa0JBRkYsRUFHRUMsZUFIRixVQUdFQSxlQUhGLEVBSUVsSyxNQUpGLFVBSUVBLE1BSkY7QUFBQTtBQUFBLHFCQVdnQyxLQUFLVixNQUFMLENBQVk2RSxLQUFaLENBQWtCO0FBQzlDNkYsZ0JBQUFBLFdBQVcsRUFBRSxDQUNYO0FBQUUzSyxrQkFBQUEsTUFBTSxFQUFOQTtBQUFGLGlCQURXLEVBRVg7QUFDRThLLGtCQUFBQSxVQUFVLEVBQUUsSUFEZDtBQUVFLDRDQUEwQjtBQUN4QnJKLG9CQUFBQSxLQUFLLEVBQUU7QUFDTHNKLHNCQUFBQSxVQUFVLEVBQUUsSUFEUDtBQUVMcEosc0JBQUFBLEtBQUssRUFBRSxJQUZGO0FBR0x6RixzQkFBQUEsR0FBRyxFQUFFO0FBSEEscUJBRGlCO0FBTXhCMkMsb0JBQUFBLEdBQUcsRUFBRSxJQU5tQjtBQU94QmIsb0JBQUFBLFNBQVMsRUFBRSxJQVBhO0FBUXhCZ04sb0JBQUFBLFNBQVMsRUFBRSxJQVJhO0FBU3hCOU8sb0JBQUFBLEdBQUcsRUFBRSxJQVRtQjtBQVV4QmlGLG9CQUFBQSxZQUFZLEVBQUU7QUFWVSxtQkFGNUI7QUFjRSxtREFBaUM7QUFDL0JNLG9CQUFBQSxLQUFLLEVBQUU7QUFDTHNKLHNCQUFBQSxVQUFVLEVBQUUsSUFEUDtBQUVMcEosc0JBQUFBLEtBQUssRUFBRSxJQUZGO0FBR0x6RixzQkFBQUEsR0FBRyxFQUFFO0FBSEEscUJBRHdCO0FBTS9CMkMsb0JBQUFBLEdBQUcsRUFBRSxJQU4wQjtBQU8vQm9NLG9CQUFBQSxlQUFlLEVBQUUsSUFQYztBQVEvQkQsb0JBQUFBLFNBQVMsRUFBRSxJQVJvQjtBQVMvQjlPLG9CQUFBQSxHQUFHLEVBQUUsSUFUMEI7QUFVL0JpRixvQkFBQUEsWUFBWSxFQUFFO0FBVmlCLG1CQWRuQztBQTBCRSwrQ0FBNkI7QUFDM0JNLG9CQUFBQSxLQUFLLEVBQUU7QUFDTHNKLHNCQUFBQSxVQUFVLEVBQUUsSUFEUDtBQUVMcEosc0JBQUFBLEtBQUssRUFBRSxJQUZGO0FBR0x6RixzQkFBQUEsR0FBRyxFQUFFO0FBSEEscUJBRG9CO0FBTTNCMkMsb0JBQUFBLEdBQUcsRUFBRSxJQU5zQjtBQU8zQm1NLG9CQUFBQSxTQUFTLEVBQUUsSUFQZ0I7QUFRM0I5TyxvQkFBQUEsR0FBRyxFQUFFLElBUnNCO0FBUzNCaUYsb0JBQUFBLFlBQVksRUFBRTtBQVRhO0FBMUIvQixpQkFGVztBQURpQyxlQUFsQixDQVhoQzs7QUFBQTtBQUFBO0FBV1V3SixjQUFBQSxXQVhWLDJCQVdVQSxXQVhWOztBQUFBLGtCQXVET0EsV0F2RFA7QUFBQTtBQUFBO0FBQUE7O0FBQUEsb0JBd0RVLElBQUlwTCxLQUFKLFdBQWtCUyxNQUFsQixzQkF4RFY7O0FBQUE7QUEyRFF5QyxjQUFBQSxhQTNEUixHQTJEMEQsRUEzRDFEOztBQTREUUMsY0FBQUEsVUE1RFIsR0E0RHFCLFNBQWJBLFVBQWEsQ0FDakJDLElBRGlCLEVBRWpCQyxhQUZpQixFQUdSO0FBQ1RILGdCQUFBQSxhQUFhLENBQUNFLElBQUQsQ0FBYixHQUFzQkMsYUFBdEI7QUFDQSxvQkFBTXNJLGdCQUFnQixHQUFHckksTUFBTSxDQUFDQyxNQUFQLENBQWNMLGFBQWQsRUFBNkJNLE1BQTdCLENBQ3ZCLFVBQUNDLEdBQUQsRUFBTUMsR0FBTjtBQUFBLHlCQUFjRCxHQUFHLEdBQUdDLEdBQUcsQ0FBQ2lJLGdCQUF4QjtBQUFBLGlCQUR1QixFQUV2QixDQUZ1QixDQUF6QjtBQUlBLG9CQUFNQyxVQUFVLEdBQUc3SSxNQUFNLENBQUNxSSxXQUFXLENBQUNLLFNBQWIsQ0FBekI7QUFDQUosZ0JBQUFBLGtCQUFrQixRQUFsQixZQUFBQSxrQkFBa0IsQ0FBRztBQUNuQjdJLGtCQUFBQSxPQUFPLEVBQUVtSixnQkFBZ0IsR0FBR0MsVUFEVDtBQUVuQkEsa0JBQUFBLFVBQVUsRUFBVkEsVUFGbUI7QUFHbkJELGtCQUFBQSxnQkFBZ0IsRUFBaEJBO0FBSG1CLGlCQUFILENBQWxCO0FBS0QsZUEzRUg7O0FBNkVRekosY0FBQUEsS0E3RVIsR0E2RWdCLElBQUloQyxLQUFKLEVBN0VoQjs7QUErRVEwRCxjQUFBQSxNQS9FUjtBQUFBLHNGQStFaUIsbUJBQU9SLElBQVA7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsMENBQ0c5QixVQURIO0FBQUE7QUFBQSxpQ0FFTGhHLEVBQUUsQ0FDTHFELEdBREcsQ0FDQ3lFLElBQUksQ0FBQ29JLFVBRE4sRUFDa0I7QUFDcEJILDRCQUFBQSxrQkFBa0IsRUFBRSw0QkFBQVEsRUFBRTtBQUFBLHFDQUFJMUksVUFBVSxDQUFDQyxJQUFJLENBQUNoQixLQUFOLEVBQWF5SixFQUFiLENBQWQ7QUFBQSw2QkFERjtBQUVwQnpLLDRCQUFBQSxNQUFNLEVBQUVBO0FBRlksMkJBRGxCLEVBS0hHLFdBTEcsRUFGSzs7QUFBQTtBQUFBO0FBQ1B1SywwQkFBQUEsR0FETztBQUFBO0FBQUEsaUNBU1NuUCxHQUFHLENBQUNtUCxHQUFELENBVFo7O0FBQUE7QUFTUEMsMEJBQUFBLE9BVE87O0FBQUEsZ0NBVVRBLE9BQU8sS0FBSzNJLElBQUksQ0FBQ3pHLEdBVlI7QUFBQTtBQUFBO0FBQUE7O0FBQUEsZ0NBV0wsSUFBSXFELEtBQUosMkJBQWtDb0QsSUFBSSxDQUFDaEIsS0FBdkMsaUJBQXdEM0IsTUFBeEQsQ0FYSzs7QUFBQTtBQWFieUIsMEJBQUFBLEtBQUssQ0FBQzdCLElBQU4sQ0FBVztBQUNUdkMsNEJBQUFBLElBQUksRUFBRWdPLEdBREc7QUFFVDFKLDRCQUFBQSxLQUFLLEVBQUVnQixJQUFJLENBQUNoQjtBQUZILDJCQUFYOztBQWJhO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGlCQS9FakI7O0FBQUEsZ0NBK0VRd0IsTUEvRVI7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSxxQkFrR1EzRyxlQUFlLENBQ25CLENBRG1CLEVBRW5CbU8sV0FBVyxDQUFDbEosS0FBWixDQUFrQjlDLEdBQWxCLENBQXNCLFVBQUEyRSxDQUFDO0FBQUEsdUJBQUk7QUFBQSx5QkFBcUJILE1BQU0sQ0FBQ0csQ0FBRCxDQUEzQjtBQUFBLGlCQUFKO0FBQUEsZUFBdkIsQ0FGbUIsQ0FsR3ZCOztBQUFBO0FBdUdRaUksY0FBQUEsZ0JBdkdSLEdBdUcyQmpQLFdBQVcsTUFBWCxTQUNwQm1GLEtBQUssQ0FBQytKLElBQU4sQ0FBVyxVQUFDQyxDQUFELEVBQUlDLENBQUo7QUFBQSx1QkFBVUQsQ0FBQyxDQUFDOUosS0FBRixHQUFVK0osQ0FBQyxDQUFDL0osS0FBdEI7QUFBQSxlQUFYLEVBQXdDaEQsR0FBeEMsQ0FBNEMsVUFBQTJFLENBQUM7QUFBQSx1QkFBSUEsQ0FBQyxDQUFDakcsSUFBTjtBQUFBLGVBQTdDLENBRG9CLENBdkczQixFQTJHRTs7QUEzR0Y7QUFBQSxxQkE0RzZCbkIsR0FBRyxDQUFDcVAsZ0JBQUQsQ0E1R2hDOztBQUFBO0FBNEdRcEssY0FBQUEsWUE1R1I7O0FBQUEsb0JBOEdNQSxZQUFZLEtBQUt3SixXQUFXLENBQUN4SixZQTlHbkM7QUFBQTtBQUFBO0FBQUE7O0FBQUEsb0JBK0dVLElBQUk1QixLQUFKLG9DQS9HVjs7QUFBQTtBQWtIUVYsY0FBQUEsR0FsSFIsR0FrSGM5QyxnQkFBZ0IsQ0FDMUJELE1BQU0sQ0FBQ3FCLFFBQVAsQ0FBZ0J3TixXQUFXLENBQUM5TCxHQUE1QixDQUQwQixFQUUxQjhMLFdBQVcsQ0FBQ0csVUFBWixLQUEyQix5QkFBM0IsR0FDSUgsV0FBVyxDQUFDTSxlQURoQixHQUVJTixXQUFXLENBQUNHLFVBQVosS0FBMkIsa0JBQTNCLEdBQ0FILFdBQVcsQ0FBQzNNLFNBRFosR0FFQSxnREFBV0EsU0FOVyxFQU8xQixnREFBV0ssVUFQZSxDQWxIOUI7QUFBQTtBQUFBLHFCQTRIb0JqQyxPQUFPLENBQUN5QyxHQUFELEVBQU0wTSxnQkFBTixFQUF3QlYsZUFBeEIsRUFBeUNsSyxNQUF6QyxDQTVIM0I7O0FBQUE7QUE0SFFnTCxjQUFBQSxHQTVIUjtBQUFBO0FBQUEscUJBK0gyQnpQLEdBQUcsQ0FBQ3lQLEdBQUQsQ0EvSDlCOztBQUFBO0FBK0hRQyxjQUFBQSxVQS9IUjs7QUFBQSxvQkFpSU1BLFVBQVUsS0FBS2pCLFdBQVcsQ0FBQ3pPLEdBaklqQztBQUFBO0FBQUE7QUFBQTs7QUFBQSxvQkFrSVUsSUFBSXFELEtBQUosMEJBbElWOztBQUFBO0FBQUEsaURBcUlTaEUsVUFBVSxDQUFDb1EsR0FBRCxDQXJJbkI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0E1MUNGOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBLFNBbytDUUUsVUFwK0NSO0FBQUEsK0VBbytDRTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0U3TCxjQUFBQSxNQURGLFVBQ0VBLE1BREYsRUFFRWlLLFFBRkYsVUFFRUEsUUFGRixFQUdFL0QsVUFIRixVQUdFQSxVQUhGLEVBSUVDLFNBSkYsVUFJRUEsU0FKRjtBQVdReEcsY0FBQUEsSUFYUixHQVdlM0UsV0FBVyxDQUFDa0QsR0FBWixDQUFnQjhCLE1BQWhCLENBWGY7O0FBQUEsa0JBWU9MLElBWlA7QUFBQTtBQUFBO0FBQUE7O0FBQUEseUNBYTZCSyxNQWI3Qjs7QUFBQTtBQUFBLG1CQWdCd0JpSyxRQWhCeEI7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSxxQkFpQllqTixXQUFXLENBQUNpTixRQUFELEVBQVd0SyxJQUFJLENBQUN2QixPQUFMLENBQWFsQixPQUF4QixDQWpCdkI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSw4QkFrQk0sSUFsQk47O0FBQUE7QUFnQlFvSCxjQUFBQSxhQWhCUjtBQUFBO0FBQUEscUJBb0IrQixLQUFLckUsTUFBTCxDQUFZQyxRQUFaLENBQXFCO0FBQ2hEMkwsZ0JBQUFBLFVBQVUsRUFBRSxDQUNWO0FBQ0U3TCxrQkFBQUEsTUFBTSxFQUFOQSxNQURGO0FBRUVpSyxrQkFBQUEsUUFBUSxFQUFFM0YsYUFGWjtBQUdFNEIsa0JBQUFBLFVBQVUsRUFBVkEsVUFIRjtBQUlFQyxrQkFBQUEsU0FBUyxFQUFUQTtBQUpGLGlCQURVLEVBT1Z0SixhQVBVO0FBRG9DLGVBQXJCLENBcEIvQjs7QUFBQTtBQUFBO0FBb0JVZ1AsY0FBQUEsVUFwQlYsMkJBb0JVQSxVQXBCVjs7QUFBQSxrQkFnQ09BLFVBaENQO0FBQUE7QUFBQTtBQUFBOztBQUFBLG9CQWlDVSxJQUFJdE0sS0FBSixDQUFVLG1CQUFWLENBakNWOztBQUFBO0FBQUEsaURBb0NTN0Qsa0JBQWtCLENBQUNtUSxVQUFELDhCQUFhLElBQWIsZ0JBcEMzQjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQXArQ0Y7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUEsU0EyZ0RRQyxRQTNnRFI7QUFBQSw2RUEyZ0RFO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBaUJ0QyxjQUFBQSxNQUFqQixVQUFpQkEsTUFBakI7QUFBQTtBQUFBLHFCQUM2QixLQUFLdkosTUFBTCxDQUFZQyxRQUFaLENBQXFCO0FBQzlDNEwsZ0JBQUFBLFFBQVEsRUFBRSxDQUFDO0FBQUV0QyxrQkFBQUEsTUFBTSxFQUFOQTtBQUFGLGlCQUFELEVBQWEsSUFBYjtBQURvQyxlQUFyQixDQUQ3Qjs7QUFBQTtBQUFBO0FBQ1VzQyxjQUFBQSxRQURWLDJCQUNVQSxRQURWO0FBQUEsaURBS1NBLFFBTFQsV0FLU0EsUUFMVCxHQUtxQixLQUxyQjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQTNnREY7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUEsU0FtaERRQyxVQW5oRFI7QUFBQSwrRUFtaERFO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBbUJ2QyxjQUFBQSxNQUFuQixVQUFtQkEsTUFBbkI7QUFBQTtBQUFBLHFCQUMrQixLQUFLdkosTUFBTCxDQUFZQyxRQUFaLENBQXFCO0FBQ2hENkwsZ0JBQUFBLFVBQVUsRUFBRSxDQUFDO0FBQUV2QyxrQkFBQUEsTUFBTSxFQUFOQTtBQUFGLGlCQUFELEVBQWEsSUFBYjtBQURvQyxlQUFyQixDQUQvQjs7QUFBQTtBQUFBO0FBQ1V1QyxjQUFBQSxVQURWLDJCQUNVQSxVQURWO0FBQUEsaURBS1NBLFVBTFQsV0FLU0EsVUFMVCxHQUt1QixLQUx2Qjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQW5oREY7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUEsU0EyaERRQyxXQTNoRFI7QUFBQSxnRkEyaERFO0FBQUE7O0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHFCQUN5QixLQUFLL0wsTUFBTCxDQUFZNkUsS0FBWixDQUFrQjtBQUN2Q2hHLGdCQUFBQSxJQUFJLEVBQUUsQ0FDSixFQURJLEVBRUo7QUFDRWtOLGtCQUFBQSxXQUFXLEVBQUU7QUFDWEMsb0JBQUFBLG1CQUFtQixFQUFFLElBRFY7QUFFWEMsb0JBQUFBLHNCQUFzQixFQUFFLElBRmI7QUFHWEMsb0JBQUFBLHdCQUF3QixFQUFFLElBSGY7QUFJWEMsb0JBQUFBLHdCQUF3QixFQUFFLElBSmY7QUFLWEMsb0JBQUFBLG1CQUFtQixFQUFFO0FBTFY7QUFEZixpQkFGSTtBQURpQyxlQUFsQixDQUR6Qjs7QUFBQTtBQUFBO0FBQ1V2TixjQUFBQSxJQURWLDJCQUNVQSxJQURWOztBQUFBLGtCQWdCT0EsSUFoQlA7QUFBQTtBQUFBO0FBQUE7O0FBQUEsaURBaUJXLElBakJYOztBQUFBO0FBQUEsc0VBb0JTQSxJQUFJLENBQUNrTixXQXBCZCxnQ0FvQjZCLElBcEI3Qjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQTNoREY7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUEsU0FrakRRTSxpQkFsakRSO0FBQUEsc0ZBa2pERSxtQkFDRUMsUUFERjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxxQkFHc0MsS0FBS3RNLE1BQUwsQ0FBWUMsUUFBWixDQUFxQjtBQUN2RG9NLGdCQUFBQSxpQkFBaUIsRUFBRSxDQUNqQkMsUUFEaUIsRUFFakI7QUFDRU4sa0JBQUFBLG1CQUFtQixFQUFFLElBRHZCO0FBRUVDLGtCQUFBQSxzQkFBc0IsRUFBRSxJQUYxQjtBQUdFQyxrQkFBQUEsd0JBQXdCLEVBQUUsSUFINUI7QUFJRUMsa0JBQUFBLHdCQUF3QixFQUFFLElBSjVCO0FBS0VDLGtCQUFBQSxtQkFBbUIsRUFBRTtBQUx2QixpQkFGaUI7QUFEb0MsZUFBckIsQ0FIdEM7O0FBQUE7QUFBQTtBQUdVQyxjQUFBQSxpQkFIViwyQkFHVUEsaUJBSFY7QUFBQSxpREFnQlNBLGlCQWhCVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQWxqREY7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUEsU0Fxa0RRekMsYUFya0RSO0FBQUEsa0ZBcWtERTtBQUFBOztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxxQkFDeUIsS0FBSzVKLE1BQUwsQ0FBWTZFLEtBQVosQ0FBa0I7QUFDdkNoRyxnQkFBQUEsSUFBSSxFQUFFLENBQ0osRUFESSxFQUVKO0FBQ0UrSyxrQkFBQUEsYUFBYSxFQUFFak47QUFEakIsaUJBRkk7QUFEaUMsZUFBbEIsQ0FEekI7O0FBQUE7QUFBQTtBQUNVa0MsY0FBQUEsSUFEViwyQkFDVUEsSUFEVjtBQVVROEcsY0FBQUEsS0FWUiwwQkFVZ0I5RyxJQVZoQixvQkFVZ0JBLElBQUksQ0FBRStLLGFBVnRCLGtDQVV1QyxFQVZ2QyxFQVlFOztBQUVNQSxjQUFBQSxhQWRSLEdBY3dCLElBQUlwSyxLQUFKLEVBZHhCOztBQWdCRSxpRUFBZ0JtRyxLQUFoQixxQ0FBdUI7QUFBWkMsZ0JBQUFBLENBQVk7QUFDZmQsZ0JBQUFBLElBRGUsR0FDUmhJLDZCQUE2QixDQUFDOEksQ0FBRCw4QkFBSSxJQUFKLGdCQURyQjs7QUFFckIsb0JBQUlkLElBQUosRUFBVTtBQUNSOEUsa0JBQUFBLGFBQWEsQ0FBQ2pLLElBQWQsQ0FBbUJtRixJQUFuQjtBQUNEO0FBQ0Y7O0FBckJILGlEQXVCUzhFLGFBdkJUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBcmtERjs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQSxTQStsRFFVLFNBL2xEUjtBQUFBLDhFQStsREU7QUFBQTs7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEscUJBQ3lCLEtBQUt0SyxNQUFMLENBQVk2RSxLQUFaLENBQWtCO0FBQ3ZDaEcsZ0JBQUFBLElBQUksRUFBRSxDQUNKLEVBREksRUFFSjtBQUNFeUwsa0JBQUFBLFNBQVMsRUFBRTNOO0FBRGIsaUJBRkk7QUFEaUMsZUFBbEIsQ0FEekI7O0FBQUE7QUFBQTtBQUNVa0MsY0FBQUEsSUFEViwyQkFDVUEsSUFEVjtBQVVROEcsY0FBQUEsS0FWUixzQkFVZ0I5RyxJQVZoQixvQkFVZ0JBLElBQUksQ0FBRXlMLFNBVnRCLDhCQVVtQyxFQVZuQyxFQVlFOztBQUVNQSxjQUFBQSxTQWRSLEdBY29CLElBQUk5SyxLQUFKLEVBZHBCOztBQWdCRSxpRUFBZ0JtRyxLQUFoQixxQ0FBdUI7QUFBWkMsZ0JBQUFBLENBQVk7QUFDZmQsZ0JBQUFBLElBRGUsR0FDUmhJLDZCQUE2QixDQUFDOEksQ0FBRCw4QkFBSSxJQUFKLGdCQURyQjs7QUFFckIsb0JBQUlkLElBQUosRUFBVTtBQUNSd0Ysa0JBQUFBLFNBQVMsQ0FBQzNLLElBQVYsQ0FBZW1GLElBQWY7QUFDRDtBQUNGOztBQXJCSCxpREF1QlN3RixTQXZCVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQS9sREY7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUEsU0F5bkRRMUMsVUF6bkRSO0FBQUEsK0VBeW5ERTtBQUFBOztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxxQkFDeUIsS0FBSzVILE1BQUwsQ0FBWTZFLEtBQVosQ0FBa0I7QUFDdkNoRyxnQkFBQUEsSUFBSSxFQUFFLENBQ0osRUFESSxFQUVKO0FBQ0UrSSxrQkFBQUEsVUFBVSxFQUFFakw7QUFEZCxpQkFGSTtBQURpQyxlQUFsQixDQUR6Qjs7QUFBQTtBQUFBO0FBQ1VrQyxjQUFBQSxJQURWLDJCQUNVQSxJQURWO0FBVVE4RyxjQUFBQSxLQVZSLHVCQVVnQjlHLElBVmhCLG9CQVVnQkEsSUFBSSxDQUFFK0ksVUFWdEIsK0JBVW9DLEVBVnBDLEVBWUU7O0FBRU1BLGNBQUFBLFVBZFIsR0FjcUIsSUFBSXBJLEtBQUosRUFkckI7O0FBZ0JFLGlFQUFnQm1HLEtBQWhCLHFDQUF1QjtBQUFaQyxnQkFBQUEsQ0FBWTtBQUNma0MsZ0JBQUFBLEtBRGUsR0FDUGhMLDZCQUE2QixDQUFDOEksQ0FBRCw4QkFBSSxJQUFKLGdCQUR0Qjs7QUFFckIsb0JBQUlrQyxLQUFKLEVBQVc7QUFDVEYsa0JBQUFBLFVBQVUsQ0FBQ2pJLElBQVgsQ0FBZ0JtSSxLQUFoQjtBQUNEO0FBQ0Y7O0FBckJILGlEQXVCU0YsVUF2QlQ7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0F6bkRGOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQSxTQWdCRSxlQUF3QjtBQUN0QixhQUFPLGdEQUFXN0osU0FBbEI7QUFDRDtBQWxCSDs7QUFBQTtBQUFBLEVBQW1DakQsVUFBbkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IE1haWxUeXBlIH0gZnJvbSBcIi4vLi4vemV1cy9pbmRleFwiO1xuaW1wb3J0IHR5cGUgeyBEb3dubG9hZFByb2dyZXNzIH0gZnJvbSBcImt5XCI7XG5pbXBvcnQga3kgZnJvbSBcImt5XCI7XG5pbXBvcnQgYXhpb3MgZnJvbSBcImF4aW9zXCI7XG5pbXBvcnQgeyBCYXNlQ2xpZW50IH0gZnJvbSBcIi4uL0Jhc2VDbGllbnQuanNcIjtcbmltcG9ydCB7IHZGaWxlc0NhY2hlLCBmb2xkZXJzQ2FjaGUsIGZpbGVzQ2FjaGUsIHVzZXJzQ2FjaGUgfSBmcm9tIFwiLi4vY2FjaGUuanNcIjtcbmltcG9ydCB0eXBlIHsgUHJvZ3Jlc3MgfSBmcm9tIFwiLi4vY3J5cHRvL2ZpbGUuanNcIjtcbmltcG9ydCB7IHNlY3JldHN0cmVhbUtleWdlbiwgZW5jcnlwdFNlY3JldHN0cmVhbSB9IGZyb20gXCIuLi9jcnlwdG8vZmlsZS5qc1wiO1xuaW1wb3J0IHsgY29tcHJlc3MsIHVuY29tcHJlc3MgfSBmcm9tIFwiLi4vbWluaWZ5L2luZGV4LmpzXCI7XG5pbXBvcnQge1xuICBncWxGb2xkZXJUb0V4dGVybmFsLFxuICBncWxGb2xkZXJUb0V4dGVybmFsRm9sZGVyRnVsbFxufSBmcm9tIFwiLi9jb252ZXJ0L2ZvbGRlci5qc1wiO1xuaW1wb3J0IHtcbiAgZ3FsVkZpbGVUb0V4dGVybmFsLFxuICBncWxWRmlsZVRvSW50ZXJuYWwsXG4gIGludGVybmFsVkZpbGVUb1ZGaWxlXG59IGZyb20gXCIuL2NvbnZlcnQvdkZpbGUuanNcIjtcbmltcG9ydCB0eXBlIHtcbiAgTWFpbEZpbGVJbnB1dCxcbiAgUmVjZWl2ZWRNYWlsLFxuICBTZW50TWFpbCxcbiAgRm9sZGVyLFxuICBWRmlsZVdpdGhGb2xkZXIsXG4gIEZvbGRlckZ1bGwsXG4gIFVzZXJBcHBTZXR0aW5ncyxcbiAgVXNlckFwcE5vdGlmaWNhdGlvbnMsXG4gIEZpbGUgYXMgU2VjcmVjeUZpbGUsXG4gIFdhaXRpbmdSZWNlaXZlZE1haWwsXG4gIERyYWZ0TWFpbCxcbiAgTWFpbFJlY2lwaWVudElucHV0LFxuICBWRmlsZSxcbiAgU2hhcmVGb2xkZXJzSW5wdXQsXG4gIE5hbWVLZXlJbnB1dCxcbiAgTmFtZUtleUlucHV0Rm9sZGVycyxcbiAgTWFpbCxcbiAgU2hhcmVGaWxlSW5IaXN0b3J5SW5wdXQsXG4gIEZpbGVQYXJ0UmVzcG9uc2UsXG4gIEZpbGVDb250ZW50UGFydFxufSBmcm9tIFwiLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZ3FsRmlsZVRvRXh0ZXJuYWwgfSBmcm9tIFwiLi9jb252ZXJ0L2ZpbGUuanNcIjtcbmltcG9ydCB7IHNvZGl1bSB9IGZyb20gXCIuLi9zb2RpdW0uanNcIjtcbmltcG9ydCB0eXBlIHsgS2V5UGFpciB9IGZyb20gXCIuLi9jcnlwdG8vaW5kZXguanNcIjtcbmltcG9ydCB7IGRlY3J5cHRDcnlwdG9Cb3gsIGVuY3J5cHRDcnlwdG9Cb3ggfSBmcm9tIFwiLi4vY3J5cHRvL2luZGV4LmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNlY3JlY3lFbnYgfSBmcm9tIFwiLi9oZWxwZXJzLmpzXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gXCJzaG9ydGlkXCI7XG5pbXBvcnQgeyBtZDUgfSBmcm9tIFwiLi4vd29ya2VyL21kNS5qc1wiO1xuaW1wb3J0IHsgZW5jcnlwdCwgZGVjcnlwdCB9IGZyb20gXCIuLi93b3JrZXIvc29kaXVtLmpzXCI7XG5pbXBvcnQgeyBjaHVua3MsIGNvbmNhdGVuYXRlLCBlbnVtZXJhdGUsIHByb21pc2VBbGxMaW1pdCB9IGZyb20gXCIuLi91dGlscy5qc1wiO1xuaW1wb3J0IHtcbiAgZ3FsRmlsZVF1ZXJ5LFxuICBncWxGb2xkZXJRdWVyeSxcbiAgZ3FsRm9sZGVyRnVsbFF1ZXJ5LFxuICBncWxNYWlsUXVlcnksXG4gIGdxbFZGaWxlUXVlcnksXG4gIGdxbFZGaWxlV2l0aEZvbGRlclF1ZXJ5XG59IGZyb20gXCIuL3R5cGVzL3F1ZXJpZXMuanNcIjtcbmltcG9ydCB0eXBlIHsgUmlnaHRzIH0gZnJvbSBcIi4uL3pldXMvaW5kZXguanNcIjtcbmltcG9ydCB7IGNvbnZlcnRJbnRlcm5hbE1haWxUb0V4dGVybmFsIH0gZnJvbSBcIi4vY29udmVydC9tYWlsLmpzXCI7XG4vLyBpbXBvcnQgeyBtZDUgfSBmcm9tIFwiLi4vd29ya2VyL2luZGV4LmpzXCI7XG4vLyBpbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgb2YgfSBmcm9tIFwicnhqc1wiO1xuXG5leHBvcnQgdHlwZSBOZXdNYWlsID0ge1xuICBib2R5OiBzdHJpbmc7XG4gIHN1YmplY3Q6IHN0cmluZztcbiAgZmlsZXM6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXTtcbiAgcmVjaXBpZW50c0lkczogc3RyaW5nW107XG4gIHJlcGx5VG8/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IHR5cGUgUHJvZ3Jlc3NDYWxsYmFjayA9IChwcm9ncmVzczogUHJvZ3Jlc3MpID0+IFByb21pc2U8dm9pZD47XG5cbmNvbnN0IGVuY3J5cHROYW1lID0gYXN5bmMgKG5hbWU6IHN0cmluZywgbmFtZUtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBlbmNyeXB0U2VjcmV0c3RyZWFtKFxuICAgIHNvZGl1bS5mcm9tX2hleChuYW1lS2V5KSxcbiAgICBzb2RpdW0uZnJvbV9zdHJpbmcobmFtZSlcbiAgKTtcbiAgY29uc3QgbmFtZUVuY3J5cHRlZCA9IHNvZGl1bS50b19oZXgoZGF0YSk7XG4gIHJldHVybiBuYW1lRW5jcnlwdGVkO1xufTtcblxuZXhwb3J0IGNsYXNzIFNlY3JlY3lDbGllbnQgZXh0ZW5kcyBCYXNlQ2xpZW50IHtcbiAgand0OiBzdHJpbmc7XG5cbiAgI2tleXM6IEtleVBhaXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgdWFTZXNzaW9uOiBzdHJpbmcsXG4gICAgdWFLZXlzOiBLZXlQYWlyLFxuICAgIHVhSnd0OiBzdHJpbmcsXG4gICAgZW52OiBTZWNyZWN5RW52XG4gICkge1xuICAgIHN1cGVyKHVhU2Vzc2lvbiwgZW52KTtcbiAgICB0aGlzLmp3dCA9IHVhSnd0O1xuICAgIHRoaXMuI2tleXMgPSB1YUtleXM7XG4gIH1cblxuICBnZXQgcHVibGljS2V5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuI2tleXMucHVibGljS2V5O1xuICB9XG5cbiAgYXN5bmMgYWRkRmlsZVRvSGlzdG9yeSh7XG4gICAgZmlsZUlkLFxuICAgIHZGaWxlSWRcbiAgfToge1xuICAgIGZpbGVJZDogc3RyaW5nO1xuICAgIHZGaWxlSWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8VkZpbGU+IHtcbiAgICBjb25zdCB7IGFkZEZpbGVUb0hpc3RvcnkgfSA9IGF3YWl0IHRoaXMuY2xpZW50Lm11dGF0aW9uKHtcbiAgICAgIGFkZEZpbGVUb0hpc3Rvcnk6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZpbGVJZCxcbiAgICAgICAgICB2RmlsZUlkXG4gICAgICAgIH0sXG4gICAgICAgIGdxbFZGaWxlUXVlcnlcbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGNvbnN0IHZGaWxlID0gYXdhaXQgZ3FsVkZpbGVUb0ludGVybmFsKGFkZEZpbGVUb0hpc3RvcnksIHRoaXMuI2tleXMpO1xuICAgIGNvbnN0IGZpbGUgPSB2RmlsZS5oaXN0b3J5LmZpbmQoZiA9PiBmLmlkID09PSBmaWxlSWQpO1xuICAgIGlmIChmaWxlKSB7XG4gICAgICBjb25zdCB1c2VycyA9IHZGaWxlLnVzZXJzLmZpbHRlcihcbiAgICAgICAgKFt1XSkgPT4gdS5wdWJsaWNLZXkgIT09IHRoaXMuI2tleXMucHVibGljS2V5XG4gICAgICApO1xuICAgICAgY29uc3QgaW5wdXQ6IFNoYXJlRmlsZUluSGlzdG9yeUlucHV0ID0ge1xuICAgICAgICBmaWxlSWQ6IGZpbGUuaWQsXG4gICAgICAgIHVzZXJzOiB1c2Vycy5tYXAoKFt1XSkgPT4gKHtcbiAgICAgICAgICBpZDogdS5pZCxcbiAgICAgICAgICBrZXk6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgICAgICBzb2RpdW0uZnJvbV9oZXgoZmlsZS51c2VyIS5rZXkpLFxuICAgICAgICAgICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICB9KSlcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHRoaXMuY2xpZW50Lm11dGF0aW9uKHtcbiAgICAgICAgc2hhcmVGaWxlSW5IaXN0b3J5OiBbeyBpbnB1dCwgdkZpbGVJZCB9LCB0cnVlXVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBpbnRlcm5hbFZGaWxlVG9WRmlsZSh2RmlsZSk7XG4gIH1cblxuICBhc3luYyB1cGxvYWRGaWxlKHtcbiAgICBmaWxlLFxuICAgIGVuY3J5cHRQcm9ncmVzcyxcbiAgICB1cGxvYWRQcm9ncmVzcyxcbiAgICBzaWduYWxcbiAgfToge1xuICAgIGZpbGU6IGdsb2JhbFRoaXMuRmlsZSB8IFVpbnQ4QXJyYXk7XG4gICAgZW5jcnlwdFByb2dyZXNzPzogUHJvZ3Jlc3NDYWxsYmFjaztcbiAgICB1cGxvYWRQcm9ncmVzcz86IFByb2dyZXNzQ2FsbGJhY2s7XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIH0pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBjb25zdCBmaWxlS2V5ID0gc2VjcmV0c3RyZWFtS2V5Z2VuKCk7XG4gICAgY29uc3QgZmlsZUJ1ZmZlciA9XG4gICAgICBmaWxlIGluc3RhbmNlb2YgRmlsZSA/IG5ldyBVaW50OEFycmF5KGF3YWl0IGZpbGUuYXJyYXlCdWZmZXIoKSkgOiBmaWxlO1xuICAgIGNvbnN0IGNvbXByZXNzZWQgPSBjb21wcmVzcyhmaWxlQnVmZmVyKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGRhdGE6IGVuY3J5cHRlZEZpbGUsXG4gICAgICBtZDU6IG1kNUZpbGUsXG4gICAgICBtZDVFbmNyeXB0ZWRcbiAgICB9ID0gYXdhaXQgZW5jcnlwdChmaWxlS2V5LCBjb21wcmVzc2VkLCBlbmNyeXB0UHJvZ3Jlc3MsIHNpZ25hbCk7XG5cbiAgICBjb25zdCBlbmNyeXB0ZWRGaWxlS2V5ID0gZW5jcnlwdENyeXB0b0JveChcbiAgICAgIGZpbGVLZXksXG4gICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICk7XG5cbiAgICBjb25zdCB7IHVwbG9hZEZpbGUgfSA9IGF3YWl0IHRoaXMuY2xpZW50Lm11dGF0aW9uKHtcbiAgICAgIHVwbG9hZEZpbGU6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZpbGVTaXplOiBlbmNyeXB0ZWRGaWxlLmJ5dGVMZW5ndGgsXG4gICAgICAgICAgZmlsZVNpemVCZWZvcmU6IGZpbGVCdWZmZXIuYnl0ZUxlbmd0aCxcbiAgICAgICAgICBmaWxlS2V5OiBzb2RpdW0udG9faGV4KGVuY3J5cHRlZEZpbGVLZXkpLFxuICAgICAgICAgIG1kNUVuY3J5cHRlZCxcbiAgICAgICAgICBtZDU6IG1kNUZpbGVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGZpbGVJZDogdHJ1ZSxcbiAgICAgICAgICBmaWxlUGFydFNpemU6IHRydWUsXG4gICAgICAgICAgcGFydHM6IHtcbiAgICAgICAgICAgIGZpZWxkczogdHJ1ZSxcbiAgICAgICAgICAgIG9yZGVyOiB0cnVlLFxuICAgICAgICAgICAgdXJsOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXVwbG9hZEZpbGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHVwbG9hZFByb2dyZXNzPy4oe1xuICAgICAgdG90YWw6IGVuY3J5cHRlZEZpbGUuYnl0ZUxlbmd0aCxcbiAgICAgIGN1cnJlbnQ6IDAsXG4gICAgICBwZXJjZW50OiAwXG4gICAgfSk7XG5cbiAgICBpZiAodXBsb2FkRmlsZS5wYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHVwbG9hZFByb2dyZXNzPy4oe1xuICAgICAgICB0b3RhbDogZW5jcnlwdGVkRmlsZS5ieXRlTGVuZ3RoLFxuICAgICAgICBjdXJyZW50OiBlbmNyeXB0ZWRGaWxlLmJ5dGVMZW5ndGgsXG4gICAgICAgIHBlcmNlbnQ6IDFcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdXBsb2FkRmlsZS5maWxlSWQ7XG4gICAgfVxuXG4gICAgY29uc3QgdXBsb2FkUGFydEVuZGVkID0gYXN5bmMgKFxuICAgICAgbWQ1OiBzdHJpbmcsXG4gICAgICBvcmRlcjogbnVtYmVyXG4gICAgKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICBjb25zdCB7IHVwbG9hZEZpbGVQYXJ0RW5kIH0gPSBhd2FpdCB0aGlzLmNsaWVudC5tdXRhdGlvbih7XG4gICAgICAgIHVwbG9hZEZpbGVQYXJ0RW5kOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgZmlsZUlkOiB1cGxvYWRGaWxlLmZpbGVJZCxcbiAgICAgICAgICAgIG1kNSxcbiAgICAgICAgICAgIG9yZGVyXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0cnVlXG4gICAgICAgIF1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdXBsb2FkRmlsZVBhcnRFbmQ7XG4gICAgfTtcblxuICAgIGNvbnN0IHVwbG9hZEVuZGVkID0gYXN5bmMgKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4gPT4ge1xuICAgICAgY29uc3QgeyB1cGxvYWRGaWxlRW5kIH0gPSBhd2FpdCB0aGlzLmNsaWVudC5tdXRhdGlvbih7XG4gICAgICAgIHVwbG9hZEZpbGVFbmQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmaWxlSWQ6IHVwbG9hZEZpbGUuZmlsZUlkXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0cnVlXG4gICAgICAgIF1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdXBsb2FkRmlsZUVuZCA/PyBudWxsO1xuICAgIH07XG5cbiAgICBjb25zdCBjaHVua1BhcnRzID0gbmV3IEFycmF5PHtcbiAgICAgIG9yZGVyOiBudW1iZXI7XG4gICAgICBkYXRhOiBVaW50OEFycmF5O1xuICAgICAgbWQ1OiBzdHJpbmc7XG4gICAgfT4oKTtcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCBjaHVua10gb2YgZW51bWVyYXRlKFxuICAgICAgY2h1bmtzKGVuY3J5cHRlZEZpbGUsIE51bWJlcih1cGxvYWRGaWxlLmZpbGVQYXJ0U2l6ZSkpXG4gICAgKSkge1xuICAgICAgY2h1bmtQYXJ0cy5wdXNoKHtcbiAgICAgICAgb3JkZXI6IGluZGV4ICsgMSxcbiAgICAgICAgZGF0YTogY2h1bmssXG4gICAgICAgIG1kNTogYXdhaXQgbWQ1KGNodW5rKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvZ3Jlc3NQYXJ0czogUmVjb3JkPG51bWJlciwgUHJvZ3Jlc3NFdmVudD4gPSB7fTtcbiAgICBjb25zdCBvblByb2dyZXNzID0gKHBhcnQ6IG51bWJlciwgcHJvZ3Jlc3NFdmVudDogUHJvZ3Jlc3NFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgcHJvZ3Jlc3NQYXJ0c1twYXJ0XSA9IHByb2dyZXNzRXZlbnQ7XG4gICAgICBjb25zdCBjdXJyZW50ID0gT2JqZWN0LnZhbHVlcyhwcm9ncmVzc1BhcnRzKS5yZWR1Y2UoXG4gICAgICAgIChwcnYsIGN1cikgPT4gcHJ2ICsgY3VyLmxvYWRlZCxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIHVwbG9hZFByb2dyZXNzPy4oe1xuICAgICAgICBwZXJjZW50OiBjdXJyZW50IC8gZW5jcnlwdGVkRmlsZS5ieXRlTGVuZ3RoLFxuICAgICAgICB0b3RhbDogZW5jcnlwdGVkRmlsZS5ieXRlTGVuZ3RoLFxuICAgICAgICBjdXJyZW50XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgYnlQYXJ0ID0gYXN5bmMgKHBhcnQ6IEZpbGVQYXJ0UmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICBjb25zdCBjaHVuayA9IGNodW5rUGFydHMuZmluZChwID0+IHAub3JkZXIgPT09IHBhcnQub3JkZXIpO1xuICAgICAgaWYgKCFjaHVuaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJ0LmZpZWxkcykpIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgICAgZm9ybURhdGEuYXBwZW5kKFxuICAgICAgICBcImZpbGVcIixcbiAgICAgICAgbmV3IEJsb2IoW2NodW5rLmRhdGFdKSxcbiAgICAgICAgYCR7dXBsb2FkRmlsZS5maWxlSWR9LSR7Y2h1bmsub3JkZXJ9YFxuICAgICAgKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgYXhpb3MucG9zdChwYXJ0LnVybCwgZm9ybURhdGEsIHtcbiAgICAgICAgICBvblVwbG9hZFByb2dyZXNzOiBwcm9ncmVzc0V2ZW50ID0+XG4gICAgICAgICAgICBvblByb2dyZXNzKHBhcnQub3JkZXIsIHByb2dyZXNzRXZlbnQpLFxuICAgICAgICAgIHNpZ25hbFxuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCB1cGxvYWRQYXJ0RW5kZWQoY2h1bmsubWQ1LCBjaHVuay5vcmRlcik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICgoZSBhcyBhbnkpLnJlc3BvbnNlLnN0YXR1cyA9PT0gMCkge1xuICAgICAgICAgIC8vIFRPRE8gaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9reS9pc3N1ZXMvMzA1XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBhd2FpdCBwcm9taXNlQWxsTGltaXQoXG4gICAgICAzLFxuICAgICAgdXBsb2FkRmlsZS5wYXJ0cy5tYXAocCA9PiAoKTogUHJvbWlzZTx2b2lkPiA9PiBieVBhcnQocCkpXG4gICAgKTtcblxuICAgIHJldHVybiB1cGxvYWRFbmRlZCgpO1xuICB9XG5cbiAgYXN5bmMgdXBsb2FkRmlsZUluQ2xvdWQoe1xuICAgIGZpbGUsXG4gICAgbmFtZSxcbiAgICBmb2xkZXJJZCxcbiAgICBlbmNyeXB0UHJvZ3Jlc3MsXG4gICAgdXBsb2FkUHJvZ3Jlc3MsXG4gICAgc2lnbmFsXG4gIH06IHtcbiAgICBmaWxlOiBnbG9iYWxUaGlzLkZpbGUgfCBVaW50OEFycmF5O1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBmb2xkZXJJZD86IHN0cmluZztcbiAgICBlbmNyeXB0UHJvZ3Jlc3M/OiBQcm9ncmVzc0NhbGxiYWNrO1xuICAgIHVwbG9hZFByb2dyZXNzPzogUHJvZ3Jlc3NDYWxsYmFjaztcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8VkZpbGVXaXRoRm9sZGVyPiB7XG4gICAgY29uc3QgZmlsZUlkID0gYXdhaXQgdGhpcy51cGxvYWRGaWxlKHtcbiAgICAgIGZpbGUsXG4gICAgICBlbmNyeXB0UHJvZ3Jlc3MsXG4gICAgICB1cGxvYWRQcm9ncmVzcyxcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIGlmICghZmlsZUlkKSB7XG4gICAgICB0aHJvdyBgQ2FuJ3QgdXBsb2FkIGZpbGVgO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zYXZlSW5DbG91ZCh7IGZpbGVJZCwgbmFtZSwgZm9sZGVySWQgfSk7XG4gIH1cblxuICBhc3luYyBsb2dvdXQoc2Vzc2lvbklkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHZGaWxlc0NhY2hlLmNsZWFyKCk7XG4gICAgZmlsZXNDYWNoZS5jbGVhcigpO1xuICAgIGZvbGRlcnNDYWNoZS5jbGVhcigpO1xuICAgIGF3YWl0IHN1cGVyLmxvZ291dChzZXNzaW9uSWQpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlRm9sZGVyKHtcbiAgICBuYW1lLFxuICAgIHBhcmVudEZvbGRlcklkXG4gIH06IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgcGFyZW50Rm9sZGVySWQ/OiBzdHJpbmcgfCBudWxsO1xuICB9KTogUHJvbWlzZTxGb2xkZXJGdWxsPiB7XG4gICAgY29uc3Qga2V5ID0gc2VjcmV0c3RyZWFtS2V5Z2VuKCk7XG4gICAgY29uc3QgZW5jcnlwdGVkTmFtZSA9IGF3YWl0IGVuY3J5cHROYW1lKG5hbWUsIHNvZGl1bS50b19oZXgoa2V5KSk7XG4gICAgY29uc3QgZW5jcnlwdGVkS2V5ID0gZW5jcnlwdENyeXB0b0JveChcbiAgICAgIGtleSxcbiAgICAgIHRoaXMuI2tleXMucHVibGljS2V5LFxuICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgKTtcbiAgICBjb25zdCB7IGNyZWF0ZUZvbGRlciB9ID0gYXdhaXQgdGhpcy5jbGllbnQubXV0YXRpb24oe1xuICAgICAgY3JlYXRlRm9sZGVyOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBlbmNyeXB0ZWROYW1lLFxuICAgICAgICAgIHBhcmVudEZvbGRlcklkLFxuICAgICAgICAgIGtleTogc29kaXVtLnRvX2hleChlbmNyeXB0ZWRLZXkpXG4gICAgICAgIH0sXG4gICAgICAgIGdxbEZvbGRlckZ1bGxRdWVyeVxuICAgICAgXVxuICAgIH0pO1xuICAgIGlmICghY3JlYXRlRm9sZGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IGNyZWF0ZSBmb2xkZXJgKTtcbiAgICB9XG4gICAgY29uc3QgZm9sZGVyID0gYXdhaXQgZ3FsRm9sZGVyVG9FeHRlcm5hbEZvbGRlckZ1bGwoXG4gICAgICBjcmVhdGVGb2xkZXIsXG4gICAgICB0aGlzLiNrZXlzXG4gICAgKTtcblxuICAgIGNvbnN0IHVzZXJzID1cbiAgICAgIGZvbGRlci5wYXJlbnRGb2xkZXI/LnVzZXJzPy5maWx0ZXIoXG4gICAgICAgIChbdV0pID0+IHUucHVibGljS2V5ICE9PSB0aGlzLiNrZXlzLnB1YmxpY0tleVxuICAgICAgKSA/PyBbXTtcblxuICAgIGlmICh1c2Vycy5sZW5ndGgpIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICB1c2Vycy5tYXAoKFt1LCByaWdodHNdKSA9PlxuICAgICAgICAgIHRoaXMuc2hhcmVGb2xkZXIoe1xuICAgICAgICAgICAgZm9sZGVySWQ6IGZvbGRlci5pZCxcbiAgICAgICAgICAgIHJpZ2h0cyxcbiAgICAgICAgICAgIHVzZXJJZDogdS5pZFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvbGRlcjtcbiAgfVxuXG4gIGFzeW5jIGZvbGRlcih7XG4gICAgaWQsXG4gICAgZGVsZXRlZFxuICB9OiB7XG4gICAgaWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIGRlbGV0ZWQ/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgfSA9IHt9KTogUHJvbWlzZTxGb2xkZXJGdWxsIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgZm9sZGVyIH0gPSBhd2FpdCB0aGlzLmNsaWVudC5xdWVyeSh7XG4gICAgICBmb2xkZXI6IFt7IGRlbGV0ZWQsIGlkIH0sIGdxbEZvbGRlckZ1bGxRdWVyeV1cbiAgICB9KTtcbiAgICBpZiAoIWZvbGRlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBncWxGb2xkZXJUb0V4dGVybmFsRm9sZGVyRnVsbChmb2xkZXIsIHRoaXMuI2tleXMpO1xuICB9XG5cbiAgYXN5bmMgZmlsZSh7IGlkIH06IHsgaWQ6IHN0cmluZyB9KTogUHJvbWlzZTxTZWNyZWN5RmlsZSB8IG51bGw+IHtcbiAgICBjb25zdCB7IGZpbGUgfSA9IGF3YWl0IHRoaXMuY2xpZW50LnF1ZXJ5KHtcbiAgICAgIGZpbGU6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkXG4gICAgICAgIH0sXG4gICAgICAgIGdxbEZpbGVRdWVyeVxuICAgICAgXVxuICAgIH0pO1xuICAgIGlmICghZmlsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBncWxGaWxlVG9FeHRlcm5hbChmaWxlLCB0aGlzLiNrZXlzKTtcbiAgfVxuXG4gIGFzeW5jIHZGaWxlKHsgaWQgfTogeyBpZDogc3RyaW5nIH0pOiBQcm9taXNlPFZGaWxlV2l0aEZvbGRlciB8IG51bGw+IHtcbiAgICBjb25zdCB7IHZGaWxlIH0gPSBhd2FpdCB0aGlzLmNsaWVudC5xdWVyeSh7XG4gICAgICB2RmlsZTogW1xuICAgICAgICB7XG4gICAgICAgICAgaWRcbiAgICAgICAgfSxcbiAgICAgICAgZ3FsVkZpbGVXaXRoRm9sZGVyUXVlcnlcbiAgICAgIF1cbiAgICB9KTtcbiAgICBpZiAoIXZGaWxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGdxbFZGaWxlVG9FeHRlcm5hbCh2RmlsZSwgdGhpcy4ja2V5cykgYXMgUHJvbWlzZTxWRmlsZVdpdGhGb2xkZXI+O1xuICB9XG5cbiAgYXN5bmMgbWFpbCh7IGlkIH06IHsgaWQ6IHN0cmluZyB9KTogUHJvbWlzZTxNYWlsIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgbWFpbCB9ID0gYXdhaXQgdGhpcy5jbGllbnQucXVlcnkoe1xuICAgICAgbWFpbDogW1xuICAgICAgICB7XG4gICAgICAgICAgaWRcbiAgICAgICAgfSxcbiAgICAgICAgZ3FsTWFpbFF1ZXJ5XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIW1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBjb252ZXJ0SW50ZXJuYWxNYWlsVG9FeHRlcm5hbChtYWlsLCB0aGlzLiNrZXlzKTtcbiAgfVxuXG4gIGFzeW5jIHNoYXJlVkZpbGUoe1xuICAgIHZGaWxlSWQsXG4gICAgdXNlcklkLFxuICAgIHJpZ2h0c1xuICB9OiB7XG4gICAgdkZpbGVJZDogc3RyaW5nO1xuICAgIHVzZXJJZDogc3RyaW5nO1xuICAgIHJpZ2h0czogUmlnaHRzO1xuICB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbGV0IHZGaWxlID0gdkZpbGVzQ2FjaGUuZ2V0KHZGaWxlSWQpO1xuXG4gICAgaWYgKCF2RmlsZSkge1xuICAgICAgYXdhaXQgdGhpcy52RmlsZSh7IGlkOiB2RmlsZUlkIH0pO1xuICAgICAgdkZpbGUgPSB2RmlsZXNDYWNoZS5nZXQodkZpbGVJZCk7XG5cbiAgICAgIGlmICghdkZpbGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLnVzZXIoeyB1c2VySWQsIHdpdGhQdWJsaWNLZXk6IHRydWUgfSk7XG5cbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBuYW1lS2V5ID0gc29kaXVtLnRvX2hleChcbiAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgIHNvZGl1bS5mcm9tX2hleCh2RmlsZS51c2VyQXBwLm5hbWVLZXkpLFxuICAgICAgICB1c2VyLnB1YmxpY0tleSxcbiAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICApXG4gICAgKTtcblxuICAgIGNvbnN0IGhpc3RvcnkgPSBuZXcgQXJyYXk8e1xuICAgICAgaWQ6IHN0cmluZztcbiAgICAgIGtleTogc3RyaW5nO1xuICAgIH0+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGggb2YgdkZpbGUuaGlzdG9yeSkge1xuICAgICAgaWYgKCFoLnVzZXIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBoaXN0b3J5LnB1c2goe1xuICAgICAgICBpZDogaC5pZCxcbiAgICAgICAga2V5OiBzb2RpdW0udG9faGV4KFxuICAgICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgICBzb2RpdW0uZnJvbV9oZXgoaC51c2VyLmtleSksXG4gICAgICAgICAgICB1c2VyLnB1YmxpY0tleSxcbiAgICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBzaGFyZVZGaWxlIH0gPSBhd2FpdCB0aGlzLmNsaWVudC5tdXRhdGlvbih7XG4gICAgICBzaGFyZVZGaWxlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB2RmlsZUlkLFxuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICByaWdodHMsXG4gICAgICAgICAgbmFtZUtleSxcbiAgICAgICAgICBoaXN0b3J5XG4gICAgICAgIH0sXG4gICAgICAgIHRydWVcbiAgICAgIF1cbiAgICB9KTtcblxuICAgIHJldHVybiBzaGFyZVZGaWxlID8/IGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgc2hhcmVkVkZpbGVzKCk6IFByb21pc2U8VkZpbGVXaXRoRm9sZGVyW10+IHtcbiAgICBjb25zdCB7IHNoYXJlZFZGaWxlcyB9ID0gYXdhaXQgdGhpcy5jbGllbnQucXVlcnkoe1xuICAgICAgc2hhcmVkVkZpbGVzOiBncWxWRmlsZVdpdGhGb2xkZXJRdWVyeVxuICAgIH0pO1xuXG4gICAgY29uc3QgdkZpbGVzID0gbmV3IEFycmF5PFZGaWxlV2l0aEZvbGRlcj4oKTtcblxuICAgIGZvciAoY29uc3QgdkZpbGUgb2Ygc2hhcmVkVkZpbGVzKSB7XG4gICAgICB2RmlsZXMucHVzaChcbiAgICAgICAgKGF3YWl0IGdxbFZGaWxlVG9FeHRlcm5hbCh2RmlsZSwgdGhpcy4ja2V5cykpIGFzIFZGaWxlV2l0aEZvbGRlclxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdkZpbGVzO1xuICB9XG5cbiAgYXN5bmMgdkZpbGVzU2hhcmVkV2l0aE1lKCk6IFByb21pc2U8VkZpbGVXaXRoRm9sZGVyW10+IHtcbiAgICBjb25zdCB7IHZGaWxlc1NoYXJlZFdpdGhNZSB9ID0gYXdhaXQgdGhpcy5jbGllbnQucXVlcnkoe1xuICAgICAgdkZpbGVzU2hhcmVkV2l0aE1lOiBncWxWRmlsZVdpdGhGb2xkZXJRdWVyeVxuICAgIH0pO1xuXG4gICAgY29uc3QgdkZpbGVzID0gbmV3IEFycmF5PFZGaWxlV2l0aEZvbGRlcj4oKTtcblxuICAgIGZvciAoY29uc3QgdkZpbGUgb2YgdkZpbGVzU2hhcmVkV2l0aE1lKSB7XG4gICAgICB2RmlsZXMucHVzaChcbiAgICAgICAgKGF3YWl0IGdxbFZGaWxlVG9FeHRlcm5hbCh2RmlsZSwgdGhpcy4ja2V5cykpIGFzIFZGaWxlV2l0aEZvbGRlclxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdkZpbGVzO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlZFZGaWxlcygpOiBQcm9taXNlPFZGaWxlW10+IHtcbiAgICBjb25zdCB7IGRlbGV0ZWRWRmlsZXMgfSA9IGF3YWl0IHRoaXMuY2xpZW50LnF1ZXJ5KHtcbiAgICAgIGRlbGV0ZWRWRmlsZXM6IGdxbFZGaWxlUXVlcnlcbiAgICB9KTtcblxuICAgIGNvbnN0IHZGaWxlcyA9IG5ldyBBcnJheTxWRmlsZT4oKTtcblxuICAgIGZvciAoY29uc3QgdkZpbGUgb2YgZGVsZXRlZFZGaWxlcykge1xuICAgICAgdkZpbGVzLnB1c2goKGF3YWl0IGdxbFZGaWxlVG9FeHRlcm5hbCh2RmlsZSwgdGhpcy4ja2V5cykpIGFzIFZGaWxlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdkZpbGVzO1xuICB9XG5cbiAgYXN5bmMgc2hhcmVkRm9sZGVycygpOiBQcm9taXNlPEZvbGRlcltdPiB7XG4gICAgY29uc3QgeyBzaGFyZWRGb2xkZXJzIH0gPSBhd2FpdCB0aGlzLmNsaWVudC5xdWVyeSh7XG4gICAgICBzaGFyZWRGb2xkZXJzOiBncWxGb2xkZXJRdWVyeVxuICAgIH0pO1xuXG4gICAgY29uc3QgZm9sZGVycyA9IG5ldyBBcnJheTxGb2xkZXI+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGZvbGRlciBvZiBzaGFyZWRGb2xkZXJzKSB7XG4gICAgICBmb2xkZXJzLnB1c2goYXdhaXQgZ3FsRm9sZGVyVG9FeHRlcm5hbChmb2xkZXIsIHRoaXMuI2tleXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm9sZGVycztcbiAgfVxuXG4gIGFzeW5jIGZvbGRlcnNTaGFyZWRXaXRoTWUoKTogUHJvbWlzZTxGb2xkZXJbXT4ge1xuICAgIGNvbnN0IHsgZm9sZGVyc1NoYXJlZFdpdGhNZSB9ID0gYXdhaXQgdGhpcy5jbGllbnQucXVlcnkoe1xuICAgICAgZm9sZGVyc1NoYXJlZFdpdGhNZTogZ3FsRm9sZGVyUXVlcnlcbiAgICB9KTtcblxuICAgIGNvbnN0IGZvbGRlcnMgPSBuZXcgQXJyYXk8Rm9sZGVyPigpO1xuXG4gICAgZm9yIChjb25zdCBmb2xkZXIgb2YgZm9sZGVyc1NoYXJlZFdpdGhNZSkge1xuICAgICAgZm9sZGVycy5wdXNoKGF3YWl0IGdxbEZvbGRlclRvRXh0ZXJuYWwoZm9sZGVyLCB0aGlzLiNrZXlzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvbGRlcnM7XG4gIH1cblxuICBhc3luYyBkZWxldGVkRm9sZGVycygpOiBQcm9taXNlPEZvbGRlcltdPiB7XG4gICAgY29uc3QgeyBkZWxldGVkRm9sZGVycyB9ID0gYXdhaXQgdGhpcy5jbGllbnQucXVlcnkoe1xuICAgICAgZGVsZXRlZEZvbGRlcnM6IGdxbEZvbGRlclF1ZXJ5XG4gICAgfSk7XG5cbiAgICBjb25zdCBmb2xkZXJzID0gbmV3IEFycmF5PEZvbGRlcj4oKTtcblxuICAgIGZvciAoY29uc3QgZm9sZGVyIG9mIGRlbGV0ZWRGb2xkZXJzKSB7XG4gICAgICBmb2xkZXJzLnB1c2goYXdhaXQgZ3FsRm9sZGVyVG9FeHRlcm5hbChmb2xkZXIsIHRoaXMuI2tleXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm9sZGVycztcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZWRNYWlscyh7IG1haWxUeXBlIH06IHsgbWFpbFR5cGU6IE1haWxUeXBlIH0pOiBQcm9taXNlPE1haWxbXT4ge1xuICAgIGNvbnN0IHsgZGVsZXRlZE1haWxzIH0gPSBhd2FpdCB0aGlzLmNsaWVudC5xdWVyeSh7XG4gICAgICBkZWxldGVkTWFpbHM6IFt7IG1haWxUeXBlIH0sIGdxbE1haWxRdWVyeV1cbiAgICB9KTtcblxuICAgIGNvbnN0IG1haWxzID0gbmV3IEFycmF5PE1haWw+KCk7XG5cbiAgICBmb3IgKGNvbnN0IG0gb2YgZGVsZXRlZE1haWxzKSB7XG4gICAgICBjb25zdCBtYWlsID0gY29udmVydEludGVybmFsTWFpbFRvRXh0ZXJuYWwobSwgdGhpcy4ja2V5cyk7XG4gICAgICBpZiAobWFpbCkge1xuICAgICAgICBtYWlscy5wdXNoKG1haWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYWlscztcbiAgfVxuXG4gIGFzeW5jIHNoYXJlRm9sZGVyKHtcbiAgICBmb2xkZXJJZCxcbiAgICB1c2VySWQsXG4gICAgcmlnaHRzXG4gIH06IHtcbiAgICBmb2xkZXJJZDogc3RyaW5nO1xuICAgIHVzZXJJZDogc3RyaW5nO1xuICAgIHJpZ2h0czogUmlnaHRzO1xuICB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMudXNlcih7IHVzZXJJZCwgd2l0aFB1YmxpY0tleTogdHJ1ZSB9KTtcblxuICAgIGlmICghdXNlcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB7IHNoYXJlRm9sZGVyIH0gPSBhd2FpdCB0aGlzLmNsaWVudC5tdXRhdGlvbih7XG4gICAgICBzaGFyZUZvbGRlcjogW1xuICAgICAgICB7IGZvbGRlcklkLCB1c2VySWQgfSxcbiAgICAgICAge1xuICAgICAgICAgIHZGaWxlczogdHJ1ZSxcbiAgICAgICAgICBmb2xkZXJzOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGNvbnN0IHNoYXJlRm9sZGVyczogU2hhcmVGb2xkZXJzSW5wdXQgPSB7XG4gICAgICB2RmlsZXM6IFtdLFxuICAgICAgZm9sZGVyczogW11cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBpZCBvZiBzaGFyZUZvbGRlci5mb2xkZXJzKSB7XG4gICAgICBjb25zdCBuYW1lS2V5ID0gYXdhaXQgdGhpcy5wZXJGb2xkZXIoaWQsIHVzZXIucHVibGljS2V5KTtcbiAgICAgIGlmIChuYW1lS2V5KSB7XG4gICAgICAgIHNoYXJlRm9sZGVycy5mb2xkZXJzLnB1c2gobmFtZUtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBpZCBvZiBzaGFyZUZvbGRlci52RmlsZXMpIHtcbiAgICAgIGNvbnN0IHZGaWxlSW5wdXQgPSBhd2FpdCB0aGlzLnBlclZGaWxlKGlkLCB1c2VyLnB1YmxpY0tleSk7XG4gICAgICBpZiAodkZpbGVJbnB1dCkge1xuICAgICAgICBzaGFyZUZvbGRlcnMudkZpbGVzLnB1c2godkZpbGVJbnB1dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeyBzaGFyZUZvbGRlckZpbmlzaCB9ID0gYXdhaXQgdGhpcy5jbGllbnQubXV0YXRpb24oe1xuICAgICAgc2hhcmVGb2xkZXJGaW5pc2g6IFtcbiAgICAgICAge1xuICAgICAgICAgIHJpZ2h0cyxcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgc2hhcmVGb2xkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIHRydWVcbiAgICAgIF1cbiAgICB9KTtcblxuICAgIHJldHVybiBzaGFyZUZvbGRlckZpbmlzaCA/PyBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUZvbGRlcih7XG4gICAgZm9sZGVySWQsXG4gICAgbmFtZSxcbiAgICBpc0Zhdm9yaXRlLFxuICAgIGRlbGV0ZWRBdFxuICB9OiB7XG4gICAgZm9sZGVySWQ6IHN0cmluZztcbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICBpc0Zhdm9yaXRlPzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgZGVsZXRlZEF0PzogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIH0pOiBQcm9taXNlPEZvbGRlckZ1bGw+IHtcbiAgICBsZXQgZm9sZGVyID0gZm9sZGVyc0NhY2hlLmdldChmb2xkZXJJZCk7XG4gICAgaWYgKCFmb2xkZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuZm9sZGVyKHsgaWQ6IGZvbGRlcklkIH0pO1xuICAgICAgZm9sZGVyID0gZm9sZGVyc0NhY2hlLmdldChmb2xkZXJJZCk7XG4gICAgICBpZiAoIWZvbGRlcikge1xuICAgICAgICB0aHJvdyBgQ2FuJ3QgZmluZCBmb2xkZXIgJHtmb2xkZXJJZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5hbWUgPSBuYW1lXG4gICAgICA/IGZvbGRlci51c2VyQXBwPy5uYW1lS2V5XG4gICAgICAgID8gYXdhaXQgZW5jcnlwdE5hbWUobmFtZSwgZm9sZGVyLnVzZXJBcHAubmFtZUtleSlcbiAgICAgICAgOiBuYW1lXG4gICAgICA6IG51bGw7XG5cbiAgICBjb25zdCB7IHVwZGF0ZUZvbGRlciB9ID0gYXdhaXQgdGhpcy5jbGllbnQubXV0YXRpb24oe1xuICAgICAgdXBkYXRlRm9sZGVyOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmb2xkZXJJZCxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGlzRmF2b3JpdGUsXG4gICAgICAgICAgZGVsZXRlZEF0XG4gICAgICAgIH0sXG4gICAgICAgIGdxbEZvbGRlckZ1bGxRdWVyeVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCF1cGRhdGVGb2xkZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IHVwZGF0ZSBmb2xkZXJcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdxbEZvbGRlclRvRXh0ZXJuYWxGb2xkZXJGdWxsKHVwZGF0ZUZvbGRlciwgdGhpcy4ja2V5cyk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVBcHBOb3RpZmljYXRpb25zKFxuICAgIG5vdGlmaWNhdGlvbnM6IFBhcnRpYWw8VXNlckFwcE5vdGlmaWNhdGlvbnM+XG4gICk6IFByb21pc2U8VXNlckFwcE5vdGlmaWNhdGlvbnMgfCBudWxsPiB7XG4gICAgY29uc3QgeyB1cGRhdGVBcHBOb3RpZmljYXRpb25zIH0gPSBhd2FpdCB0aGlzLmNsaWVudC5tdXRhdGlvbih7XG4gICAgICB1cGRhdGVBcHBOb3RpZmljYXRpb25zOiBbXG4gICAgICAgIG5vdGlmaWNhdGlvbnMsXG4gICAgICAgIHtcbiAgICAgICAgICBlbmFibGVBbGw6IHRydWUsXG4gICAgICAgICAgbWFpbDogdHJ1ZSxcbiAgICAgICAgICBjbG91ZDogdHJ1ZSxcbiAgICAgICAgICBkaXNhYmxlQWxsVW50aWw6IHRydWVcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCF1cGRhdGVBcHBOb3RpZmljYXRpb25zKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udXBkYXRlQXBwTm90aWZpY2F0aW9ucyxcbiAgICAgIGRpc2FibGVBbGxVbnRpbDogdXBkYXRlQXBwTm90aWZpY2F0aW9ucy5kaXNhYmxlQWxsVW50aWxcbiAgICAgICAgPyBuZXcgRGF0ZSh1cGRhdGVBcHBOb3RpZmljYXRpb25zLmRpc2FibGVBbGxVbnRpbClcbiAgICAgICAgOiBudWxsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGFwcE5vdGlmaWNhdGlvbnMoKTogUHJvbWlzZTxVc2VyQXBwTm90aWZpY2F0aW9ucyB8IG51bGw+IHtcbiAgICBjb25zdCB7IGFwcE5vdGlmaWNhdGlvbnMgfSA9IGF3YWl0IHRoaXMuY2xpZW50LnF1ZXJ5KHtcbiAgICAgIGFwcE5vdGlmaWNhdGlvbnM6IHtcbiAgICAgICAgZW5hYmxlQWxsOiB0cnVlLFxuICAgICAgICBtYWlsOiB0cnVlLFxuICAgICAgICBjbG91ZDogdHJ1ZSxcbiAgICAgICAgZGlzYWJsZUFsbFVudGlsOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIWFwcE5vdGlmaWNhdGlvbnMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5hcHBOb3RpZmljYXRpb25zLFxuICAgICAgZGlzYWJsZUFsbFVudGlsOiBhcHBOb3RpZmljYXRpb25zLmRpc2FibGVBbGxVbnRpbFxuICAgICAgICA/IG5ldyBEYXRlKGFwcE5vdGlmaWNhdGlvbnMuZGlzYWJsZUFsbFVudGlsKVxuICAgICAgICA6IG51bGxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlTWFpbChcbiAgICBkYXRhOiBOZXdNYWlsLFxuICAgIGN1c3RvbU1lc3NhZ2U/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IG1haWwgPSBhd2FpdCB0aGlzLmNyZWF0ZURyYWZ0TWFpbChkYXRhKTtcbiAgICBpZiAoIW1haWwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VuZERyYWZ0TWFpbChtYWlsLm1haWxJbnRlZ3JpdHlJZCwgY3VzdG9tTWVzc2FnZSk7XG4gIH1cblxuICBhc3luYyB3YWl0aW5nUmVjZWl2ZWRNYWlscygpOiBQcm9taXNlPFdhaXRpbmdSZWNlaXZlZE1haWxbXT4ge1xuICAgIGNvbnN0IHsgdXNlciB9ID0gYXdhaXQgdGhpcy5jbGllbnQucXVlcnkoe1xuICAgICAgdXNlcjogW1xuICAgICAgICB7fSxcbiAgICAgICAge1xuICAgICAgICAgIHdhaXRpbmdSZWNlaXZlZE1haWxzOiB7XG4gICAgICAgICAgICBkYXRlOiB0cnVlLFxuICAgICAgICAgICAgYXR0YWNobWVudHNDb3VudDogdHJ1ZSxcbiAgICAgICAgICAgIHNlbmRlcjoge1xuICAgICAgICAgICAgICBpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgZmlyc3RuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICBsYXN0bmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgZW1haWw6IHRydWUsXG4gICAgICAgICAgICAgIHB1YmxpY0tleTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IHtcbiAgICAgICAgICAgICAgaWQ6IHRydWUsXG4gICAgICAgICAgICAgIGZpcnN0bmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFzdG5hbWU6IHRydWUsXG4gICAgICAgICAgICAgIGVtYWlsOiB0cnVlLFxuICAgICAgICAgICAgICBwdWJsaWNLZXk6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0ZW1wb3JhcnlSZWNpcGllbnRzOiB7XG4gICAgICAgICAgICAgIGVtYWlsOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGdldCB3YWl0aW5nIHJlY2VpdmVkIG1haWxzXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB1c2VyLndhaXRpbmdSZWNlaXZlZE1haWxzLm1hcChtID0+ICh7XG4gICAgICBpZDogZ2VuZXJhdGUoKSxcbiAgICAgIC4uLm0sXG4gICAgICBkYXRlOiBuZXcgRGF0ZShtLmRhdGUpXG4gICAgfSkpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRHJhZnRNYWlsKFxuICAgIGRyYWZ0SWQ6IHN0cmluZyxcbiAgICB7IGJvZHksIHN1YmplY3QsIGZpbGVzLCByZWNpcGllbnRzSWRzLCByZXBseVRvIH06IFBhcnRpYWw8TmV3TWFpbD5cbiAgKTogUHJvbWlzZTxEcmFmdE1haWwgfCBudWxsPiB7XG4gICAgY29uc3QgZHJhZnRzID0gYXdhaXQgdGhpcy5kcmFmdE1haWxzKCk7XG4gICAgY29uc3QgZHJhZnQgPSBkcmFmdHMuZmluZChkID0+IGQubWFpbEludGVncml0eUlkID09PSBkcmFmdElkKTtcbiAgICBpZiAoIWRyYWZ0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZHJhZnQgJHtkcmFmdElkfWApO1xuICAgIH1cbiAgICBsZXQgaGFzaEtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGhhc2g6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGlmIChib2R5IHx8IHN1YmplY3QpIHtcbiAgICAgIGhhc2hLZXkgPSBzb2RpdW0ucmFuZG9tYnl0ZXNfYnVmKFxuICAgICAgICBzb2RpdW0uY3J5cHRvX2dlbmVyaWNoYXNoX0tFWUJZVEVTLFxuICAgICAgICBcImhleFwiXG4gICAgICApO1xuICAgICAgaGFzaCA9IHNvZGl1bS5jcnlwdG9fZ2VuZXJpY2hhc2goXG4gICAgICAgIHNvZGl1bS5jcnlwdG9fZ2VuZXJpY2hhc2hfQllURVMsXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHsgYm9keSwgc3ViamVjdCB9KSxcbiAgICAgICAgaGFzaEtleSxcbiAgICAgICAgXCJoZXhcIlxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgc2VuZGVyRmlsZXMgPSBuZXcgQXJyYXk8TWFpbEZpbGVJbnB1dD4oKTtcbiAgICBpZiAoZmlsZXMpIHtcbiAgICAgIGZvciAoY29uc3QgZiBvZiBmaWxlcykge1xuICAgICAgICBsZXQgZmlsZSA9IGZpbGVzQ2FjaGUuZ2V0KGYuaWQpO1xuICAgICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmZpbGUoeyBpZDogZi5pZCB9KTtcbiAgICAgICAgICBmaWxlID0gZmlsZXNDYWNoZS5nZXQoZi5pZCk7XG4gICAgICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgJHtmLm5hbWV9ICgke2YuaWR9KSBkb2VzIG5vdCBleGlzdHNgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmaWxlLnVzZXIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBzZW5kZXJGaWxlcy5wdXNoKHtcbiAgICAgICAgICBpZDogZmlsZS5pZCxcbiAgICAgICAgICBmaWxlS2V5OiBzb2RpdW0udG9faGV4KFxuICAgICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgICAgc29kaXVtLmZyb21fc3RyaW5nKGZpbGUudXNlci5rZXkpLFxuICAgICAgICAgICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuYW1lOiBzb2RpdW0udG9faGV4KFxuICAgICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgICAgc29kaXVtLmZyb21fc3RyaW5nKGYubmFtZSksXG4gICAgICAgICAgICAgIHRoaXMuI2tleXMucHVibGljS2V5LFxuICAgICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHsgdXBkYXRlRHJhZnRNYWlsIH0gPSBhd2FpdCB0aGlzLmNsaWVudC5tdXRhdGlvbih7XG4gICAgICB1cGRhdGVEcmFmdE1haWw6IFtcbiAgICAgICAge1xuICAgICAgICAgIGRyYWZ0SWQsXG4gICAgICAgICAgcmVjaXBpZW50czogcmVjaXBpZW50c0lkcyxcbiAgICAgICAgICByZXBseVRvLFxuICAgICAgICAgIGJvZHk6IGJvZHlcbiAgICAgICAgICAgID8gc29kaXVtLnRvX2hleChcbiAgICAgICAgICAgICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgICAgICAgICAgc29kaXVtLmZyb21fc3RyaW5nKGJvZHkpLFxuICAgICAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wdWJsaWNLZXksXG4gICAgICAgICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBzdWJqZWN0OiBzdWJqZWN0XG4gICAgICAgICAgICA/IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgICAgICAgIHNvZGl1bS5mcm9tX3N0cmluZyhzdWJqZWN0KSxcbiAgICAgICAgICAgICAgICAgIHRoaXMuI2tleXMucHVibGljS2V5LFxuICAgICAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgc2VuZGVyRmlsZXMsXG4gICAgICAgICAgaGFzaCxcbiAgICAgICAgICBoYXNoS2V5XG4gICAgICAgIH0sXG4gICAgICAgIGdxbE1haWxRdWVyeVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCF1cGRhdGVEcmFmdE1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBjb252ZXJ0SW50ZXJuYWxNYWlsVG9FeHRlcm5hbChcbiAgICAgIHVwZGF0ZURyYWZ0TWFpbCxcbiAgICAgIHRoaXMuI2tleXNcbiAgICApIGFzIERyYWZ0TWFpbDtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZURyYWZ0TWFpbChkcmFmdElkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IGRlbGV0ZURyYWZ0TWFpbCB9ID0gYXdhaXQgdGhpcy5jbGllbnQubXV0YXRpb24oe1xuICAgICAgZGVsZXRlRHJhZnRNYWlsOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBkcmFmdElkXG4gICAgICAgIH0sXG4gICAgICAgIHRydWVcbiAgICAgIF1cbiAgICB9KTtcbiAgICByZXR1cm4gZGVsZXRlRHJhZnRNYWlsID8/IGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlVkZpbGVTaGFyaW5nKHtcbiAgICB2RmlsZUlkLFxuICAgIHVzZXJJZFxuICB9OiB7XG4gICAgdkZpbGVJZDogc3RyaW5nO1xuICAgIHVzZXJJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyBkZWxldGVWRmlsZVNoYXJpbmcgfSA9IGF3YWl0IHRoaXMuY2xpZW50Lm11dGF0aW9uKHtcbiAgICAgIGRlbGV0ZVZGaWxlU2hhcmluZzogW1xuICAgICAgICB7XG4gICAgICAgICAgdkZpbGVJZCxcbiAgICAgICAgICB1c2VySWRcbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZVxuICAgICAgXVxuICAgIH0pO1xuICAgIHJldHVybiBkZWxldGVWRmlsZVNoYXJpbmc7XG4gIH1cblxuICBhc3luYyBkZWxldGVGb2xkZXJTaGFyaW5nKHtcbiAgICBmb2xkZXJJZCxcbiAgICB1c2VySWRcbiAgfToge1xuICAgIGZvbGRlcklkOiBzdHJpbmc7XG4gICAgdXNlcklkOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IGRlbGV0ZUZvbGRlclNoYXJpbmcgfSA9IGF3YWl0IHRoaXMuY2xpZW50Lm11dGF0aW9uKHtcbiAgICAgIGRlbGV0ZUZvbGRlclNoYXJpbmc6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZvbGRlcklkLFxuICAgICAgICAgIHVzZXJJZFxuICAgICAgICB9LFxuICAgICAgICB0cnVlXG4gICAgICBdXG4gICAgfSk7XG4gICAgcmV0dXJuIGRlbGV0ZUZvbGRlclNoYXJpbmc7XG4gIH1cblxuICBhc3luYyBkdXBsaWNhdGVWRmlsZSh7XG4gICAgdkZpbGVJZCxcbiAgICBmb2xkZXJJZCxcbiAgICBjdXN0b21OYW1lXG4gIH06IHtcbiAgICB2RmlsZUlkOiBzdHJpbmc7XG4gICAgZm9sZGVySWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIGN1c3RvbU5hbWU/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbGV0IGZpbGUgPSB2RmlsZXNDYWNoZS5nZXQodkZpbGVJZCk7XG4gICAgaWYgKCFmaWxlKSB7XG4gICAgICBhd2FpdCB0aGlzLnZGaWxlKHsgaWQ6IHZGaWxlSWQgfSk7XG4gICAgICBmaWxlID0gdkZpbGVzQ2FjaGUuZ2V0KHZGaWxlSWQpO1xuICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSAoJHt2RmlsZUlkfSkgZG9lcyBub3QgZXhpc3RzYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGN1c3RvbU5hbWUgPSBjdXN0b21OYW1lXG4gICAgICA/IGF3YWl0IGVuY3J5cHROYW1lKGN1c3RvbU5hbWUsIGZpbGUudXNlckFwcC5uYW1lS2V5KVxuICAgICAgOiBudWxsO1xuXG4gICAgY29uc3QgeyBkdXBsaWNhdGVWRmlsZSB9ID0gYXdhaXQgdGhpcy5jbGllbnQubXV0YXRpb24oe1xuICAgICAgZHVwbGljYXRlVkZpbGU6IFtcbiAgICAgICAge1xuICAgICAgICAgIHZGaWxlSWQsXG4gICAgICAgICAgZm9sZGVySWQsXG4gICAgICAgICAgY3VzdG9tTmFtZVxuICAgICAgICB9LFxuICAgICAgICB0cnVlXG4gICAgICBdXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZHVwbGljYXRlVkZpbGU7XG4gIH1cblxuICBhc3luYyBkZWxldGVGb2xkZXJDbG91ZFRyYXNoKHtcbiAgICBpZHNcbiAgfToge1xuICAgIGlkczogQXJyYXk8c3RyaW5nPjtcbiAgfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgZGVsZXRlRm9sZGVyQ2xvdWRUcmFzaCB9ID0gYXdhaXQgdGhpcy5jbGllbnQubXV0YXRpb24oe1xuICAgICAgZGVsZXRlRm9sZGVyQ2xvdWRUcmFzaDogW1xuICAgICAgICB7XG4gICAgICAgICAgaWRzXG4gICAgICAgIH0sXG4gICAgICAgIHRydWVcbiAgICAgIF1cbiAgICB9KTtcbiAgICByZXR1cm4gZGVsZXRlRm9sZGVyQ2xvdWRUcmFzaCA/PyBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVZGaWxlQ2xvdWRUcmFzaCh7XG4gICAgaWRzXG4gIH06IHtcbiAgICBpZHM6IEFycmF5PHN0cmluZz47XG4gIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IGRlbGV0ZVZGaWxlQ2xvdWRUcmFzaCB9ID0gYXdhaXQgdGhpcy5jbGllbnQubXV0YXRpb24oe1xuICAgICAgZGVsZXRlVkZpbGVDbG91ZFRyYXNoOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZHNcbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZVxuICAgICAgXVxuICAgIH0pO1xuICAgIHJldHVybiBkZWxldGVWRmlsZUNsb3VkVHJhc2ggPz8gZmFsc2U7XG4gIH1cblxuICBhc3luYyBkZWxldGVNYWlsVHJhc2goeyBpZHMgfTogeyBpZHM6IEFycmF5PHN0cmluZz4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgZGVsZXRlTWFpbFRyYXNoIH0gPSBhd2FpdCB0aGlzLmNsaWVudC5tdXRhdGlvbih7XG4gICAgICBkZWxldGVNYWlsVHJhc2g6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkc1xuICAgICAgICB9LFxuICAgICAgICB0cnVlXG4gICAgICBdXG4gICAgfSk7XG4gICAgcmV0dXJuIGRlbGV0ZU1haWxUcmFzaDtcbiAgfVxuXG4gIGFzeW5jIGVtcHR5TWFpbFRyYXNoKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgZW1wdHlNYWlsVHJhc2ggfSA9IGF3YWl0IHRoaXMuY2xpZW50Lm11dGF0aW9uKHtcbiAgICAgIGVtcHR5TWFpbFRyYXNoOiB0cnVlXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW1wdHlNYWlsVHJhc2ggPz8gZmFsc2U7XG4gIH1cblxuICBhc3luYyBlbXB0eUNsb3VkVHJhc2goKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyBlbXB0eUNsb3VkVHJhc2ggfSA9IGF3YWl0IHRoaXMuY2xpZW50Lm11dGF0aW9uKHtcbiAgICAgIGVtcHR5Q2xvdWRUcmFzaDogdHJ1ZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVtcHR5Q2xvdWRUcmFzaCA/PyBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIHJlY292ZXJWRmlsZSh7IHZGaWxlSWQgfTogeyB2RmlsZUlkOiBzdHJpbmcgfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgcmVjb3ZlclZGaWxlIH0gPSBhd2FpdCB0aGlzLmNsaWVudC5tdXRhdGlvbih7XG4gICAgICByZWNvdmVyVkZpbGU6IFt7IHZGaWxlSWQgfSwgdHJ1ZV1cbiAgICB9KTtcblxuICAgIHJldHVybiByZWNvdmVyVkZpbGU7XG4gIH1cblxuICBhc3luYyByZWNvdmVyRm9sZGVyKHsgaWQgfTogeyBpZDogc3RyaW5nIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IHJlY292ZXJGb2xkZXIgfSA9IGF3YWl0IHRoaXMuY2xpZW50Lm11dGF0aW9uKHtcbiAgICAgIHJlY292ZXJGb2xkZXI6IFt7IGlkIH0sIHRydWVdXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVjb3ZlckZvbGRlciA/PyBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIHJlY292ZXJNYWlsKHsgbWFpbElkIH06IHsgbWFpbElkOiBzdHJpbmcgfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgcmVjb3Zlck1haWwgfSA9IGF3YWl0IHRoaXMuY2xpZW50Lm11dGF0aW9uKHtcbiAgICAgIHJlY292ZXJNYWlsOiBbeyBtYWlsSWQgfSwgdHJ1ZV1cbiAgICB9KTtcblxuICAgIHJldHVybiByZWNvdmVyTWFpbDtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUZpbGUoe1xuICAgIGZpbGVJZCxcbiAgICB2RmlsZUlkXG4gIH06IHtcbiAgICBmaWxlSWQ6IHN0cmluZztcbiAgICB2RmlsZUlkOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IGRlbGV0ZUZpbGUgfSA9IGF3YWl0IHRoaXMuY2xpZW50Lm11dGF0aW9uKHtcbiAgICAgIGRlbGV0ZUZpbGU6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZpbGVJZCxcbiAgICAgICAgICB2RmlsZUlkXG4gICAgICAgIH0sXG4gICAgICAgIHRydWVcbiAgICAgIF1cbiAgICB9KTtcbiAgICByZXR1cm4gZGVsZXRlRmlsZTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVZGaWxlKHsgZmlsZUlkIH06IHsgZmlsZUlkOiBzdHJpbmcgfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgZGVsZXRlVkZpbGUgfSA9IGF3YWl0IHRoaXMuY2xpZW50Lm11dGF0aW9uKHtcbiAgICAgIGRlbGV0ZVZGaWxlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmaWxlSWRcbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZVxuICAgICAgXVxuICAgIH0pO1xuICAgIHJldHVybiBkZWxldGVWRmlsZTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZU1haWwoeyBtYWlsSWQgfTogeyBtYWlsSWQ6IHN0cmluZyB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyBkZWxldGVNYWlsIH0gPSBhd2FpdCB0aGlzLmNsaWVudC5tdXRhdGlvbih7XG4gICAgICBkZWxldGVNYWlsOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBtYWlsSWRcbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZVxuICAgICAgXVxuICAgIH0pO1xuICAgIHJldHVybiBkZWxldGVNYWlsO1xuICB9XG5cbiAgYXN5bmMgc2F2ZUluQ2xvdWQoe1xuICAgIGZpbGVJZCxcbiAgICBuYW1lLFxuICAgIGZvbGRlcklkXG4gIH06IHtcbiAgICBmaWxlSWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZm9sZGVySWQ/OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPFZGaWxlV2l0aEZvbGRlcj4ge1xuICAgIGlmIChmb2xkZXJJZCAmJiAhZm9sZGVyc0NhY2hlLmhhcyhmb2xkZXJJZCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuZm9sZGVyKHsgaWQ6IGZvbGRlcklkIH0pO1xuICAgICAgaWYgKCFmb2xkZXJzQ2FjaGUuaGFzKGZvbGRlcklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBmb2xkZXIgJHtmb2xkZXJJZH0gZG9lcyBub3QgZXhpc3RzYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGtleSA9IFwiXCI7XG5cbiAgICBjb25zdCBmaWxlID0gZmlsZXNDYWNoZS5nZXQoZmlsZUlkKTtcblxuICAgIGlmICghZmlsZSkge1xuICAgICAgYXdhaXQgdGhpcy5maWxlKHsgaWQ6IGZpbGVJZCB9KTtcbiAgICAgIGNvbnN0IGZpbGUgPSBmaWxlc0NhY2hlLmdldChmaWxlSWQpID8/IG51bGw7XG4gICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgY29uc3QgcmVjZWl2ZWRNYWlscyA9IGF3YWl0IHRoaXMucmVjZWl2ZWRNYWlscygpO1xuICAgICAgICBjb25zdCBtYWlsID0gcmVjZWl2ZWRNYWlscy5maW5kKG0gPT5cbiAgICAgICAgICBtLmZpbGVzLnNvbWUoZiA9PiBmLmlkID09PSBmaWxlSWQpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFtYWlsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBmaW5kIG1haWwgd2l0aCB0aGUgZmlsZSAke2ZpbGVJZH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVNYWlsID0gbWFpbC5maWxlcy5maW5kKGYgPT4gZi5pZCA9PT0gZmlsZUlkKTtcblxuICAgICAgICBpZiAoIWZpbGVNYWlsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBmaW5kIG1haWwgd2l0aCB0aGUgZmlsZSAke2ZpbGVJZH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVLZXkgPSBkZWNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgIHNvZGl1bS5mcm9tX2hleChmaWxlTWFpbC5rZXkpLFxuICAgICAgICAgIG1haWwuc2VuZGVyLnB1YmxpY0tleSxcbiAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgKTtcblxuICAgICAgICBrZXkgPSBzb2RpdW0udG9faGV4KGZpbGVLZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFmaWxlLnVzZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGVycm9yIDFcIik7XG4gICAgICAgIH1cbiAgICAgICAga2V5ID0gZmlsZS51c2VyLmtleTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFmaWxlLnVzZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBlcnJvciAyXCIpO1xuICAgICAgfVxuICAgICAga2V5ID0gZmlsZS51c2VyLmtleTtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSBcIlwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGVycm9yIDNcIik7XG4gICAgfVxuXG4gICAga2V5ID0gc29kaXVtLnRvX2hleChcbiAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgIHNvZGl1bS5mcm9tX2hleChrZXkpLFxuICAgICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICApXG4gICAgKTtcblxuICAgIGNvbnN0IG5hbWVLZXkgPSBzZWNyZXRzdHJlYW1LZXlnZW4oKTtcbiAgICBjb25zdCBlbmNyeXB0ZWROYW1lID0gYXdhaXQgZW5jcnlwdE5hbWUobmFtZSwgc29kaXVtLnRvX2hleChuYW1lS2V5KSk7XG4gICAgY29uc3QgZW5jcnlwdGVkTmFtZUtleSA9IHNvZGl1bS50b19oZXgoXG4gICAgICBlbmNyeXB0Q3J5cHRvQm94KG5hbWVLZXksIHRoaXMuI2tleXMucHVibGljS2V5LCB0aGlzLiNrZXlzLnByaXZhdGVLZXkpXG4gICAgKTtcblxuICAgIGNvbnN0IHsgc2F2ZUluQ2xvdWQgfSA9IGF3YWl0IHRoaXMuY2xpZW50Lm11dGF0aW9uKHtcbiAgICAgIHNhdmVJbkNsb3VkOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmaWxlSWQsXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGZvbGRlcklkLFxuICAgICAgICAgIGZpbGVuYW1lOiBlbmNyeXB0ZWROYW1lLFxuICAgICAgICAgIG5hbWVLZXk6IGVuY3J5cHRlZE5hbWVLZXlcbiAgICAgICAgfSxcbiAgICAgICAgZ3FsVkZpbGVXaXRoRm9sZGVyUXVlcnlcbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGNvbnN0IHZGaWxlID0gKGF3YWl0IGdxbFZGaWxlVG9FeHRlcm5hbChcbiAgICAgIHNhdmVJbkNsb3VkLFxuICAgICAgdGhpcy4ja2V5c1xuICAgICkpIGFzIFZGaWxlV2l0aEZvbGRlcjtcblxuICAgIGNvbnN0IG1lID0gdkZpbGUuZm9sZGVyLnVzZXJzLmZpbmQoXG4gICAgICAoW3VdKSA9PiB1LnB1YmxpY0tleSA9PT0gdGhpcy4ja2V5cy5wdWJsaWNLZXlcbiAgICApO1xuXG4gICAgaWYgKG1lICYmIFtcImFkbWluXCIsIFwid3JpdGVcIl0uaW5jbHVkZXMobWVbMV0pKSB7XG4gICAgICBjb25zdCBvdGhlcnMgPSB2RmlsZS5mb2xkZXIudXNlcnMuZmlsdGVyKFxuICAgICAgICAoW3VdKSA9PiB1LnB1YmxpY0tleSAhPT0gdGhpcy4ja2V5cy5wdWJsaWNLZXlcbiAgICAgICk7XG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBvdGhlcnMubWFwKChbdSwgcmlnaHRzXSkgPT5cbiAgICAgICAgICB0aGlzLnNoYXJlVkZpbGUoe1xuICAgICAgICAgICAgdkZpbGVJZDogdkZpbGUuaWQsXG4gICAgICAgICAgICByaWdodHMsXG4gICAgICAgICAgICB1c2VySWQ6IHUuaWRcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB2RmlsZTtcbiAgfVxuXG4gIGFzeW5jIHNlbmREcmFmdE1haWwoXG4gICAgZHJhZnRJZDogc3RyaW5nLFxuICAgIGN1c3RvbU1lc3NhZ2U/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGRyYWZ0cyA9IGF3YWl0IHRoaXMuZHJhZnRNYWlscygpO1xuXG4gICAgY29uc3QgZHJhZnQgPSBkcmFmdHMuZmluZChkID0+IGQubWFpbEludGVncml0eUlkID09PSBkcmFmdElkKTtcbiAgICBpZiAoIWRyYWZ0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHJlY2lwaWVudHMgPSBuZXcgQXJyYXk8TWFpbFJlY2lwaWVudElucHV0PigpO1xuXG4gICAgY29uc3QgdGVtcG9yYXJ5UmVjaXBpZW50cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGNvbnN0IHsgZW1haWwgfSBvZiBkcmFmdC50ZW1wb3JhcnlSZWNpcGllbnRzKSB7XG4gICAgICBpZiAoIWVtYWlsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLl9lYWNoVXNlcihcbiAgICAgICAgZHJhZnQuZmlsZXMsXG4gICAgICAgIGRyYWZ0LnN1YmplY3QsXG4gICAgICAgIGRyYWZ0LmJvZHksXG4gICAgICAgIGVtYWlsXG4gICAgICApO1xuXG4gICAgICBpZiAoIWlucHV0KSB7XG4gICAgICAgIHRlbXBvcmFyeVJlY2lwaWVudHMucHVzaChlbWFpbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWNpcGllbnRzLnB1c2goaW5wdXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgeyBpZCB9IG9mIGRyYWZ0LnJlY2lwaWVudHMpIHtcbiAgICAgIGNvbnN0IGlucHV0ID0gYXdhaXQgdGhpcy5fZWFjaFVzZXIoXG4gICAgICAgIGRyYWZ0LmZpbGVzLFxuICAgICAgICBkcmFmdC5zdWJqZWN0LFxuICAgICAgICBkcmFmdC5ib2R5LFxuICAgICAgICBpZFxuICAgICAgKTtcblxuICAgICAgaWYgKCFpbnB1dCkge1xuICAgICAgICB0ZW1wb3JhcnlSZWNpcGllbnRzLnB1c2goaWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVjaXBpZW50cy5wdXNoKGlucHV0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB7IHNlbmREcmFmdE1haWwgfSA9IGF3YWl0IHRoaXMuY2xpZW50Lm11dGF0aW9uKHtcbiAgICAgIHNlbmREcmFmdE1haWw6IFtcbiAgICAgICAge1xuICAgICAgICAgIHRlbXBvcmFyeVJlY2lwaWVudHMsXG4gICAgICAgICAgcmVjaXBpZW50cyxcbiAgICAgICAgICBkcmFmdE1haWxJZDogZHJhZnQubWFpbEludGVncml0eUlkLFxuICAgICAgICAgIGN1c3RvbU1lc3NhZ2VcbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNlbmREcmFmdE1haWwgPz8gZmFsc2U7XG4gIH1cblxuICBhc3luYyBzZW5kV2FpdGluZ0VtYWlscygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBUT0RPIG9wdGkgdGhpc1xuICAgIGNvbnN0IG1haWxzID0gYXdhaXQgdGhpcy5zZW50TWFpbHMoKTtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IG1haWxzLmZpbHRlcihtID0+IG0udGVtcG9yYXJ5UmVjaXBpZW50cy5sZW5ndGggPiAwKTtcblxuICAgIGZvciAoY29uc3QgbWFpbCBvZiBmaWx0ZXJlZCkge1xuICAgICAgZm9yIChjb25zdCB7IGVtYWlsIH0gb2YgbWFpbC50ZW1wb3JhcnlSZWNpcGllbnRzKSB7XG4gICAgICAgIGlmICghZW1haWwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnB1dCA9IGF3YWl0IHRoaXMuX2VhY2hVc2VyKFxuICAgICAgICAgIG1haWwuZmlsZXMsXG4gICAgICAgICAgbWFpbC5zdWJqZWN0LFxuICAgICAgICAgIG1haWwuYm9keSxcbiAgICAgICAgICBlbWFpbFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuY2xpZW50Lm11dGF0aW9uKHtcbiAgICAgICAgICAgIHNlbmRPbmVNYWlsOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBtYWlsSW50ZWdyaXR5SWQ6IG1haWwubWFpbEludGVncml0eUlkLFxuICAgICAgICAgICAgICAgIHJlY2lwaWVudDogaW5wdXRcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZURyYWZ0TWFpbCh7XG4gICAgYm9keSxcbiAgICBzdWJqZWN0LFxuICAgIGZpbGVzLFxuICAgIHJlY2lwaWVudHNJZHMsXG4gICAgcmVwbHlUb1xuICB9OiBOZXdNYWlsKTogUHJvbWlzZTxEcmFmdE1haWwgfCBudWxsPiB7XG4gICAgY29uc3QgaGFzaEtleSA9IHNvZGl1bS5yYW5kb21ieXRlc19idWYoXG4gICAgICBzb2RpdW0uY3J5cHRvX2dlbmVyaWNoYXNoX0tFWUJZVEVTLFxuICAgICAgXCJoZXhcIlxuICAgICk7XG4gICAgY29uc3QgaGFzaCA9IHNvZGl1bS5jcnlwdG9fZ2VuZXJpY2hhc2goXG4gICAgICBzb2RpdW0uY3J5cHRvX2dlbmVyaWNoYXNoX0JZVEVTLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoeyBib2R5LCBzdWJqZWN0IH0pLFxuICAgICAgaGFzaEtleSxcbiAgICAgIFwiaGV4XCJcbiAgICApO1xuICAgIGNvbnN0IHNlbmRlckZpbGVzID0gbmV3IEFycmF5PE1haWxGaWxlSW5wdXQ+KCk7XG4gICAgZm9yIChjb25zdCBmIG9mIGZpbGVzKSB7XG4gICAgICBsZXQgZmlsZSA9IGZpbGVzQ2FjaGUuZ2V0KGYuaWQpO1xuICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmlsZSh7IGlkOiBmLmlkIH0pO1xuICAgICAgICBmaWxlID0gZmlsZXNDYWNoZS5nZXQoZi5pZCk7XG4gICAgICAgIGlmICghZmlsZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSAke2YubmFtZX0gKCR7Zi5pZH0pIGRvZXMgbm90IGV4aXN0c2ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWZpbGUudXNlcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHNlbmRlckZpbGVzLnB1c2goe1xuICAgICAgICBpZDogZmlsZS5pZCxcbiAgICAgICAgZmlsZUtleTogc29kaXVtLnRvX2hleChcbiAgICAgICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgICAgc29kaXVtLmZyb21fc3RyaW5nKGZpbGUudXNlci5rZXkpLFxuICAgICAgICAgICAgdGhpcy4ja2V5cy5wdWJsaWNLZXksXG4gICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIG5hbWU6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgIHNvZGl1bS5mcm9tX3N0cmluZyhmLm5hbWUpLFxuICAgICAgICAgICAgdGhpcy4ja2V5cy5wdWJsaWNLZXksXG4gICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHsgY3JlYXRlRHJhZnRNYWlsIH0gPSBhd2FpdCB0aGlzLmNsaWVudC5tdXRhdGlvbih7XG4gICAgICBjcmVhdGVEcmFmdE1haWw6IFtcbiAgICAgICAge1xuICAgICAgICAgIHJlY2lwaWVudHM6IHJlY2lwaWVudHNJZHMsXG4gICAgICAgICAgcmVwbHlUbyxcbiAgICAgICAgICBib2R5OiBzb2RpdW0udG9faGV4KFxuICAgICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgICAgc29kaXVtLmZyb21fc3RyaW5nKGJvZHkpLFxuICAgICAgICAgICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgICAgICBzdWJqZWN0OiBzb2RpdW0udG9faGV4KFxuICAgICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgICAgc29kaXVtLmZyb21fc3RyaW5nKHN1YmplY3QpLFxuICAgICAgICAgICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgICAgICBzZW5kZXJGaWxlcyxcbiAgICAgICAgICBoYXNoLFxuICAgICAgICAgIGhhc2hLZXlcbiAgICAgICAgfSxcbiAgICAgICAgZ3FsTWFpbFF1ZXJ5XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWNyZWF0ZURyYWZ0TWFpbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnZlcnRJbnRlcm5hbE1haWxUb0V4dGVybmFsKFxuICAgICAgY3JlYXRlRHJhZnRNYWlsLFxuICAgICAgdGhpcy4ja2V5c1xuICAgICkgYXMgRHJhZnRNYWlsO1xuICB9XG5cbiAgYXN5bmMgZmlsZUNvbnRlbnQoe1xuICAgIGZpbGVJZCxcbiAgICBvbkRvd25sb2FkUHJvZ3Jlc3MsXG4gICAgcHJvZ3Jlc3NEZWNyeXB0LFxuICAgIHNpZ25hbFxuICB9OiB7XG4gICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgb25Eb3dubG9hZFByb2dyZXNzPzogKHByb2dyZXNzOiBEb3dubG9hZFByb2dyZXNzKSA9PiB2b2lkO1xuICAgIHByb2dyZXNzRGVjcnlwdD86IFByb2dyZXNzQ2FsbGJhY2s7XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIH0pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCB7IGZpbGVDb250ZW50IH0gPSBhd2FpdCB0aGlzLmNsaWVudC5xdWVyeSh7XG4gICAgICBmaWxlQ29udGVudDogW1xuICAgICAgICB7IGZpbGVJZCB9LFxuICAgICAgICB7XG4gICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICBcIi4uLm9uIEZpbGVDb250ZW50Q2xvdWRcIjoge1xuICAgICAgICAgICAgcGFydHM6IHtcbiAgICAgICAgICAgICAgY29udGVudFVybDogdHJ1ZSxcbiAgICAgICAgICAgICAgb3JkZXI6IHRydWUsXG4gICAgICAgICAgICAgIG1kNTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGtleTogdHJ1ZSxcbiAgICAgICAgICAgIHB1YmxpY0tleTogdHJ1ZSxcbiAgICAgICAgICAgIHRvdGFsU2l6ZTogdHJ1ZSxcbiAgICAgICAgICAgIG1kNTogdHJ1ZSxcbiAgICAgICAgICAgIG1kNUVuY3J5cHRlZDogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBGaWxlQ29udGVudFJlY2VpdmVkTWFpbFwiOiB7XG4gICAgICAgICAgICBwYXJ0czoge1xuICAgICAgICAgICAgICBjb250ZW50VXJsOiB0cnVlLFxuICAgICAgICAgICAgICBvcmRlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgbWQ1OiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAga2V5OiB0cnVlLFxuICAgICAgICAgICAgc2VuZGVyUHVibGljS2V5OiB0cnVlLFxuICAgICAgICAgICAgdG90YWxTaXplOiB0cnVlLFxuICAgICAgICAgICAgbWQ1OiB0cnVlLFxuICAgICAgICAgICAgbWQ1RW5jcnlwdGVkOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEZpbGVDb250ZW50U2VudE1haWxcIjoge1xuICAgICAgICAgICAgcGFydHM6IHtcbiAgICAgICAgICAgICAgY29udGVudFVybDogdHJ1ZSxcbiAgICAgICAgICAgICAgb3JkZXI6IHRydWUsXG4gICAgICAgICAgICAgIG1kNTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGtleTogdHJ1ZSxcbiAgICAgICAgICAgIHRvdGFsU2l6ZTogdHJ1ZSxcbiAgICAgICAgICAgIG1kNTogdHJ1ZSxcbiAgICAgICAgICAgIG1kNUVuY3J5cHRlZDogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFmaWxlQ29udGVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlICR7ZmlsZUlkfSBkb2VzIG5vdCBleGlzdHNgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9ncmVzc1BhcnRzOiBSZWNvcmQ8bnVtYmVyLCBEb3dubG9hZFByb2dyZXNzPiA9IHt9O1xuICAgIGNvbnN0IG9uUHJvZ3Jlc3MgPSAoXG4gICAgICBwYXJ0OiBudW1iZXIsXG4gICAgICBwcm9ncmVzc0V2ZW50OiBEb3dubG9hZFByb2dyZXNzXG4gICAgKTogdm9pZCA9PiB7XG4gICAgICBwcm9ncmVzc1BhcnRzW3BhcnRdID0gcHJvZ3Jlc3NFdmVudDtcbiAgICAgIGNvbnN0IHRyYW5zZmVycmVkQnl0ZXMgPSBPYmplY3QudmFsdWVzKHByb2dyZXNzUGFydHMpLnJlZHVjZShcbiAgICAgICAgKHBydiwgY3VyKSA9PiBwcnYgKyBjdXIudHJhbnNmZXJyZWRCeXRlcyxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHRvdGFsQnl0ZXMgPSBOdW1iZXIoZmlsZUNvbnRlbnQudG90YWxTaXplKTtcbiAgICAgIG9uRG93bmxvYWRQcm9ncmVzcz8uKHtcbiAgICAgICAgcGVyY2VudDogdHJhbnNmZXJyZWRCeXRlcyAvIHRvdGFsQnl0ZXMsXG4gICAgICAgIHRvdGFsQnl0ZXMsXG4gICAgICAgIHRyYW5zZmVycmVkQnl0ZXNcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBwYXJ0cyA9IG5ldyBBcnJheTx7IGRhdGE6IFVpbnQ4QXJyYXk7IG9yZGVyOiBudW1iZXIgfT4oKTtcblxuICAgIGNvbnN0IGJ5UGFydCA9IGFzeW5jIChwYXJ0OiBGaWxlQ29udGVudFBhcnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGNvbnN0IGJ1ZiA9IG5ldyBVaW50OEFycmF5KFxuICAgICAgICBhd2FpdCBreVxuICAgICAgICAgIC5nZXQocGFydC5jb250ZW50VXJsLCB7XG4gICAgICAgICAgICBvbkRvd25sb2FkUHJvZ3Jlc3M6IHByID0+IG9uUHJvZ3Jlc3MocGFydC5vcmRlciwgcHIpLFxuICAgICAgICAgICAgc2lnbmFsOiBzaWduYWxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5hcnJheUJ1ZmZlcigpXG4gICAgICApO1xuICAgICAgY29uc3QgbWQ1UGFydCA9IGF3YWl0IG1kNShidWYpO1xuICAgICAgaWYgKG1kNVBhcnQgIT09IHBhcnQubWQ1KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBtZDUgZm9yIHBhcnQgJHtwYXJ0Lm9yZGVyfSBvZiBmaWxlICR7ZmlsZUlkfWApO1xuICAgICAgfVxuICAgICAgcGFydHMucHVzaCh7XG4gICAgICAgIGRhdGE6IGJ1ZixcbiAgICAgICAgb3JkZXI6IHBhcnQub3JkZXJcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhd2FpdCBwcm9taXNlQWxsTGltaXQoXG4gICAgICAzLFxuICAgICAgZmlsZUNvbnRlbnQucGFydHMubWFwKHAgPT4gKCk6IFByb21pc2U8dm9pZD4gPT4gYnlQYXJ0KHApKVxuICAgICk7XG5cbiAgICBjb25zdCBlbmNyeXB0ZWRDb250ZW50ID0gY29uY2F0ZW5hdGUoXG4gICAgICAuLi5wYXJ0cy5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcikubWFwKHAgPT4gcC5kYXRhKVxuICAgICk7XG5cbiAgICAvLyBjb25zdCBtZDVFbmNyeXB0ZWQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShtZDUob2YoZW5jcnlwdGVkQ29udGVudCkpKTtcbiAgICBjb25zdCBtZDVFbmNyeXB0ZWQgPSBhd2FpdCBtZDUoZW5jcnlwdGVkQ29udGVudCk7XG5cbiAgICBpZiAobWQ1RW5jcnlwdGVkICE9PSBmaWxlQ29udGVudC5tZDVFbmNyeXB0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW5jcnlwdGVkIGNvbnRlbnQgZG9lcyBub3QgbWF0Y2hgKTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXkgPSBkZWNyeXB0Q3J5cHRvQm94KFxuICAgICAgc29kaXVtLmZyb21faGV4KGZpbGVDb250ZW50LmtleSksXG4gICAgICBmaWxlQ29udGVudC5fX3R5cGVuYW1lID09PSBcIkZpbGVDb250ZW50UmVjZWl2ZWRNYWlsXCJcbiAgICAgICAgPyBmaWxlQ29udGVudC5zZW5kZXJQdWJsaWNLZXlcbiAgICAgICAgOiBmaWxlQ29udGVudC5fX3R5cGVuYW1lID09PSBcIkZpbGVDb250ZW50Q2xvdWRcIlxuICAgICAgICA/IGZpbGVDb250ZW50LnB1YmxpY0tleVxuICAgICAgICA6IHRoaXMuI2tleXMucHVibGljS2V5LFxuICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgKTtcblxuICAgIGNvbnN0IHNyYyA9IGF3YWl0IGRlY3J5cHQoa2V5LCBlbmNyeXB0ZWRDb250ZW50LCBwcm9ncmVzc0RlY3J5cHQsIHNpZ25hbCk7XG5cbiAgICAvLyBjb25zdCBtZDVDb250ZW50ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20obWQ1KG9mKHNyYykpKTtcbiAgICBjb25zdCBtZDVDb250ZW50ID0gYXdhaXQgbWQ1KHNyYyk7XG5cbiAgICBpZiAobWQ1Q29udGVudCAhPT0gZmlsZUNvbnRlbnQubWQ1KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbnRlbnQgZG9lcyBub3QgbWF0Y2hgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5jb21wcmVzcyhzcmMpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRmlsZSh7XG4gICAgZmlsZUlkLFxuICAgIGZpbGVuYW1lLFxuICAgIGlzRmF2b3JpdGUsXG4gICAgZGVsZXRlZEF0XG4gIH06IHtcbiAgICBmaWxlSWQ6IHN0cmluZztcbiAgICBmaWxlbmFtZT86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgaXNGYXZvcml0ZT86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIGRlbGV0ZWRBdD86IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkO1xuICB9KTogUHJvbWlzZTxWRmlsZT4ge1xuICAgIGNvbnN0IGZpbGUgPSB2RmlsZXNDYWNoZS5nZXQoZmlsZUlkKTtcbiAgICBpZiAoIWZpbGUpIHtcbiAgICAgIHRocm93IGBDYW4ndCBmaW5kIGZpbGUgJHtmaWxlSWR9YDtcbiAgICB9XG5cbiAgICBjb25zdCBlbmNyeXB0ZWROYW1lID0gZmlsZW5hbWVcbiAgICAgID8gYXdhaXQgZW5jcnlwdE5hbWUoZmlsZW5hbWUsIGZpbGUudXNlckFwcC5uYW1lS2V5KVxuICAgICAgOiBudWxsO1xuXG4gICAgY29uc3QgeyB1cGRhdGVGaWxlIH0gPSBhd2FpdCB0aGlzLmNsaWVudC5tdXRhdGlvbih7XG4gICAgICB1cGRhdGVGaWxlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmaWxlSWQsXG4gICAgICAgICAgZmlsZW5hbWU6IGVuY3J5cHRlZE5hbWUsXG4gICAgICAgICAgaXNGYXZvcml0ZSxcbiAgICAgICAgICBkZWxldGVkQXRcbiAgICAgICAgfSxcbiAgICAgICAgZ3FsVkZpbGVRdWVyeVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCF1cGRhdGVGaWxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCB1cGRhdGUgZmlsZVwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ3FsVkZpbGVUb0V4dGVybmFsKHVwZGF0ZUZpbGUsIHRoaXMuI2tleXMpO1xuICB9XG5cbiAgYXN5bmMgcmVhZE1haWwoeyBtYWlsSWQgfTogeyBtYWlsSWQ6IHN0cmluZyB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyByZWFkTWFpbCB9ID0gYXdhaXQgdGhpcy5jbGllbnQubXV0YXRpb24oe1xuICAgICAgcmVhZE1haWw6IFt7IG1haWxJZCB9LCB0cnVlXVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlYWRNYWlsID8/IGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgdW5yZWFkTWFpbCh7IG1haWxJZCB9OiB7IG1haWxJZDogc3RyaW5nIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IHVucmVhZE1haWwgfSA9IGF3YWl0IHRoaXMuY2xpZW50Lm11dGF0aW9uKHtcbiAgICAgIHVucmVhZE1haWw6IFt7IG1haWxJZCB9LCB0cnVlXVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHVucmVhZE1haWwgPz8gZmFsc2U7XG4gIH1cblxuICBhc3luYyBhcHBTZXR0aW5ncygpOiBQcm9taXNlPFVzZXJBcHBTZXR0aW5ncyB8IG51bGw+IHtcbiAgICBjb25zdCB7IHVzZXIgfSA9IGF3YWl0IHRoaXMuY2xpZW50LnF1ZXJ5KHtcbiAgICAgIHVzZXI6IFtcbiAgICAgICAge30sXG4gICAgICAgIHtcbiAgICAgICAgICBhcHBTZXR0aW5nczoge1xuICAgICAgICAgICAgYXV0b0Rpc2Nvbm5lY3REZWxheTogdHJ1ZSxcbiAgICAgICAgICAgIGNsb3VkRmlsZURheXNGb3JEZWxldGU6IHRydWUsXG4gICAgICAgICAgICBjbG91ZEZvbGRlckRheXNGb3JEZWxldGU6IHRydWUsXG4gICAgICAgICAgICBoaXN0b3J5RmlsZURheXNGb3JEZWxldGU6IHRydWUsXG4gICAgICAgICAgICBoaXN0b3J5TWF4RmlsZUNvdW50OiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB1c2VyLmFwcFNldHRpbmdzID8/IG51bGw7XG4gIH1cblxuICBhc3luYyB1cGRhdGVBcHBTZXR0aW5ncyhcbiAgICBzZXR0aW5nczogUGFydGlhbDxVc2VyQXBwU2V0dGluZ3M+XG4gICk6IFByb21pc2U8VXNlckFwcFNldHRpbmdzPiB7XG4gICAgY29uc3QgeyB1cGRhdGVBcHBTZXR0aW5ncyB9ID0gYXdhaXQgdGhpcy5jbGllbnQubXV0YXRpb24oe1xuICAgICAgdXBkYXRlQXBwU2V0dGluZ3M6IFtcbiAgICAgICAgc2V0dGluZ3MsXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvRGlzY29ubmVjdERlbGF5OiB0cnVlLFxuICAgICAgICAgIGNsb3VkRmlsZURheXNGb3JEZWxldGU6IHRydWUsXG4gICAgICAgICAgY2xvdWRGb2xkZXJEYXlzRm9yRGVsZXRlOiB0cnVlLFxuICAgICAgICAgIGhpc3RvcnlGaWxlRGF5c0ZvckRlbGV0ZTogdHJ1ZSxcbiAgICAgICAgICBoaXN0b3J5TWF4RmlsZUNvdW50OiB0cnVlXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIHJldHVybiB1cGRhdGVBcHBTZXR0aW5ncztcbiAgfVxuXG4gIGFzeW5jIHJlY2VpdmVkTWFpbHMoKTogUHJvbWlzZTxSZWNlaXZlZE1haWxbXT4ge1xuICAgIGNvbnN0IHsgdXNlciB9ID0gYXdhaXQgdGhpcy5jbGllbnQucXVlcnkoe1xuICAgICAgdXNlcjogW1xuICAgICAgICB7fSxcbiAgICAgICAge1xuICAgICAgICAgIHJlY2VpdmVkTWFpbHM6IGdxbE1haWxRdWVyeVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBjb25zdCBtYWlscyA9IHVzZXI/LnJlY2VpdmVkTWFpbHMgPz8gW107XG5cbiAgICAvLyBUT0RPIGdldCBhY3R1YWwgbWFpbHMgb24gdGhpcyBhcHAgb25seVxuXG4gICAgY29uc3QgcmVjZWl2ZWRNYWlscyA9IG5ldyBBcnJheTxSZWNlaXZlZE1haWw+KCk7XG5cbiAgICBmb3IgKGNvbnN0IG0gb2YgbWFpbHMpIHtcbiAgICAgIGNvbnN0IG1haWwgPSBjb252ZXJ0SW50ZXJuYWxNYWlsVG9FeHRlcm5hbChtLCB0aGlzLiNrZXlzKTtcbiAgICAgIGlmIChtYWlsKSB7XG4gICAgICAgIHJlY2VpdmVkTWFpbHMucHVzaChtYWlsIGFzIFJlY2VpdmVkTWFpbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlY2VpdmVkTWFpbHM7XG4gIH1cblxuICBhc3luYyBzZW50TWFpbHMoKTogUHJvbWlzZTxTZW50TWFpbFtdPiB7XG4gICAgY29uc3QgeyB1c2VyIH0gPSBhd2FpdCB0aGlzLmNsaWVudC5xdWVyeSh7XG4gICAgICB1c2VyOiBbXG4gICAgICAgIHt9LFxuICAgICAgICB7XG4gICAgICAgICAgc2VudE1haWxzOiBncWxNYWlsUXVlcnlcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgY29uc3QgbWFpbHMgPSB1c2VyPy5zZW50TWFpbHMgPz8gW107XG5cbiAgICAvLyBUT0RPIGdldCBhY3R1YWwgbWFpbHMgb24gdGhpcyBhcHAgb25seVxuXG4gICAgY29uc3Qgc2VudE1haWxzID0gbmV3IEFycmF5PFNlbnRNYWlsPigpO1xuXG4gICAgZm9yIChjb25zdCBtIG9mIG1haWxzKSB7XG4gICAgICBjb25zdCBtYWlsID0gY29udmVydEludGVybmFsTWFpbFRvRXh0ZXJuYWwobSwgdGhpcy4ja2V5cyk7XG4gICAgICBpZiAobWFpbCkge1xuICAgICAgICBzZW50TWFpbHMucHVzaChtYWlsIGFzIFNlbnRNYWlsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VudE1haWxzO1xuICB9XG5cbiAgYXN5bmMgZHJhZnRNYWlscygpOiBQcm9taXNlPERyYWZ0TWFpbFtdPiB7XG4gICAgY29uc3QgeyB1c2VyIH0gPSBhd2FpdCB0aGlzLmNsaWVudC5xdWVyeSh7XG4gICAgICB1c2VyOiBbXG4gICAgICAgIHt9LFxuICAgICAgICB7XG4gICAgICAgICAgZHJhZnRNYWlsczogZ3FsTWFpbFF1ZXJ5XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGNvbnN0IG1haWxzID0gdXNlcj8uZHJhZnRNYWlscyA/PyBbXTtcblxuICAgIC8vIFRPRE8gZ2V0IGFjdHVhbCBtYWlscyBvbiB0aGlzIGFwcCBvbmx5XG5cbiAgICBjb25zdCBkcmFmdE1haWxzID0gbmV3IEFycmF5PERyYWZ0TWFpbD4oKTtcblxuICAgIGZvciAoY29uc3QgbSBvZiBtYWlscykge1xuICAgICAgY29uc3QgZHJhZnQgPSBjb252ZXJ0SW50ZXJuYWxNYWlsVG9FeHRlcm5hbChtLCB0aGlzLiNrZXlzKSBhcyBEcmFmdE1haWw7XG4gICAgICBpZiAoZHJhZnQpIHtcbiAgICAgICAgZHJhZnRNYWlscy5wdXNoKGRyYWZ0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZHJhZnRNYWlscztcbiAgfVxuXG4gIHByaXZhdGUgcGVyRm9sZGVyID0gYXN5bmMgKFxuICAgIGZvbGRlcklkOiBzdHJpbmcsXG4gICAgcHVibGljS2V5OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxOYW1lS2V5SW5wdXRGb2xkZXJzIHwgbnVsbD4gPT4ge1xuICAgIGxldCBmb2xkZXIgPSBmb2xkZXJzQ2FjaGUuZ2V0KGZvbGRlcklkKTtcblxuICAgIGlmICghZm9sZGVyKSB7XG4gICAgICBhd2FpdCB0aGlzLmZvbGRlcih7IGlkOiBmb2xkZXJJZCB9KTtcbiAgICAgIGZvbGRlciA9IGZvbGRlcnNDYWNoZS5nZXQoZm9sZGVySWQpO1xuXG4gICAgICBpZiAoIWZvbGRlcikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWZvbGRlci51c2VyQXBwPy5uYW1lS2V5KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGZvbGRlcklkLFxuICAgICAgbmFtZUtleTogc29kaXVtLnRvX2hleChcbiAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICBzb2RpdW0uZnJvbV9oZXgoZm9sZGVyLnVzZXJBcHAubmFtZUtleSksXG4gICAgICAgICAgcHVibGljS2V5LFxuICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICApXG4gICAgICApXG4gICAgfTtcbiAgfTtcblxuICBwcml2YXRlIHBlclZGaWxlID0gYXN5bmMgKFxuICAgIHZGaWxlSWQ6IHN0cmluZyxcbiAgICBwdWJsaWNLZXk6IHN0cmluZ1xuICApOiBQcm9taXNlPE5hbWVLZXlJbnB1dCB8IG51bGw+ID0+IHtcbiAgICBsZXQgdkZpbGUgPSB2RmlsZXNDYWNoZS5nZXQodkZpbGVJZCk7XG5cbiAgICBpZiAoIXZGaWxlKSB7XG4gICAgICBhd2FpdCB0aGlzLnZGaWxlKHsgaWQ6IHZGaWxlSWQgfSk7XG4gICAgICB2RmlsZSA9IHZGaWxlc0NhY2hlLmdldCh2RmlsZUlkKTtcblxuICAgICAgaWYgKCF2RmlsZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHZGaWxlLmlkLFxuICAgICAgbmFtZUtleTogc29kaXVtLnRvX2hleChcbiAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICBzb2RpdW0uZnJvbV9oZXgodkZpbGUudXNlckFwcC5uYW1lS2V5KSxcbiAgICAgICAgICBwdWJsaWNLZXksXG4gICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgIClcbiAgICAgICksXG4gICAgICBmaWxlczogdkZpbGUuaGlzdG9yeS5tYXAoZiA9PiAoe1xuICAgICAgICBpZDogZi5pZCxcbiAgICAgICAga2V5OiBzb2RpdW0udG9faGV4KFxuICAgICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgICBzb2RpdW0uZnJvbV9oZXgoZi51c2VyIS5rZXkpLFxuICAgICAgICAgICAgcHVibGljS2V5LFxuICAgICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICB9KSlcbiAgICB9O1xuICB9O1xuXG4gIHByaXZhdGUgX2VhY2hVc2VyID0gYXN5bmMgKFxuICAgIGZpbGVzOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10sXG4gICAgc3ViamVjdDogc3RyaW5nLFxuICAgIGJvZHk6IHN0cmluZyxcbiAgICBpZE9yTWFpbDogc3RyaW5nXG4gICk6IFByb21pc2U8TWFpbFJlY2lwaWVudElucHV0IHwgbnVsbD4gPT4ge1xuICAgIGxldCB1ID0gdXNlcnNDYWNoZS5nZXQoaWRPck1haWwpO1xuICAgIGlmICghdSB8fCAhKFwicHVibGljS2V5XCIgaW4gdSkpIHtcbiAgICAgIHUgPVxuICAgICAgICAoYXdhaXQgdGhpcy51c2VyKHtcbiAgICAgICAgICB1c2VySWQ6IGlkT3JNYWlsLFxuICAgICAgICAgIHdpdGhQdWJsaWNLZXk6IHRydWVcbiAgICAgICAgfSkpID8/IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKCF1KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghKFwicHVibGljS2V5XCIgaW4gdSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVXNlciAke2lkT3JNYWlsfSBoYXZlIG5vIHB1YmxpYyBrZXlgKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWNpcGllbnRzRmlsZXMgPSBuZXcgQXJyYXk8TWFpbEZpbGVJbnB1dD4oKTtcblxuICAgIGZvciAoY29uc3QgZiBvZiBmaWxlcykge1xuICAgICAgbGV0IGZpbGVJbkhpc3RvcnkgPSBmaWxlc0NhY2hlLmdldChmLmlkKTtcbiAgICAgIGlmICghZmlsZUluSGlzdG9yeSkge1xuICAgICAgICBhd2FpdCB0aGlzLmZpbGUoeyBpZDogZi5pZCB9KTtcbiAgICAgICAgZmlsZUluSGlzdG9yeSA9IGZpbGVzQ2FjaGUuZ2V0KGYuaWQpO1xuICAgICAgICBpZiAoIWZpbGVJbkhpc3RvcnkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgJHtmLm5hbWV9ICgke2YuaWR9KSBkb2VzIG5vdCBleGlzdHNgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3Qga2V5ID0gZmlsZUluSGlzdG9yeS51c2VyPy5rZXk7XG4gICAgICBpZiAoIWtleSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlY2lwaWVudHNGaWxlcy5wdXNoKHtcbiAgICAgICAgaWQ6IGYuaWQsXG4gICAgICAgIG5hbWU6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgIHNvZGl1bS5mcm9tX3N0cmluZyhmLm5hbWUpLFxuICAgICAgICAgICAgdS5wdWJsaWNLZXksXG4gICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIGZpbGVLZXk6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgIHNvZGl1bS5mcm9tX2hleChrZXkpLFxuICAgICAgICAgICAgdS5wdWJsaWNLZXksXG4gICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICByZWNpcGllbnRJZDogdS5pZCxcbiAgICAgIGJvZHk6IHNvZGl1bS50b19oZXgoXG4gICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgc29kaXVtLmZyb21fc3RyaW5nKGJvZHkpLFxuICAgICAgICAgIHUucHVibGljS2V5LFxuICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICApXG4gICAgICApLFxuICAgICAgc3ViamVjdDogc29kaXVtLnRvX2hleChcbiAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICBzb2RpdW0uZnJvbV9zdHJpbmcoc3ViamVjdCksXG4gICAgICAgICAgdS5wdWJsaWNLZXksXG4gICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgIClcbiAgICAgICksXG4gICAgICBmaWxlczogcmVjaXBpZW50c0ZpbGVzXG4gICAgfTtcbiAgfTtcbn1cbiJdfQ==