1 | ;
|
2 |
|
3 | var _stringify = require("babel-runtime/core-js/json/stringify");
|
4 |
|
5 | var _stringify2 = _interopRequireDefault(_stringify);
|
6 |
|
7 | var _toConsumableArray2 = require("babel-runtime/helpers/toConsumableArray");
|
8 |
|
9 | var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
|
10 |
|
11 | var _regenerator = require("babel-runtime/regenerator");
|
12 |
|
13 | var _regenerator2 = _interopRequireDefault(_regenerator);
|
14 |
|
15 | var _createClass2 = require("babel-runtime/helpers/createClass");
|
16 |
|
17 | var _createClass3 = _interopRequireDefault(_createClass2);
|
18 |
|
19 | var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck");
|
20 |
|
21 | var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
|
22 |
|
23 | var _promise = require("babel-runtime/core-js/promise");
|
24 |
|
25 | var _promise2 = _interopRequireDefault(_promise);
|
26 |
|
27 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
28 |
|
29 | var __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {
|
30 | return new (P || (P = _promise2.default))(function (resolve, reject) {
|
31 | function fulfilled(value) {
|
32 | try {
|
33 | step(generator.next(value));
|
34 | } catch (e) {
|
35 | reject(e);
|
36 | }
|
37 | }
|
38 | function rejected(value) {
|
39 | try {
|
40 | step(generator.throw(value));
|
41 | } catch (e) {
|
42 | reject(e);
|
43 | }
|
44 | }
|
45 | function step(result) {
|
46 | result.done ? resolve(result.value) : new P(function (resolve) {
|
47 | resolve(result.value);
|
48 | }).then(fulfilled, rejected);
|
49 | }
|
50 | step((generator = generator.apply(thisArg, _arguments)).next());
|
51 | });
|
52 | };
|
53 | var typestore_1 = require("typestore");
|
54 | var IndexedDBConstants_1 = require("./IndexedDBConstants");
|
55 | var log = typestore_1.Log.create(__filename);
|
56 | /**
|
57 | * Super simple plain jain key for now
|
58 | * what you send to the constructor comes out the
|
59 | * other end
|
60 | *
|
61 | * just like poop!
|
62 | */
|
63 |
|
64 | var IndexedDBKeyValue = function IndexedDBKeyValue() {
|
65 | (0, _classCallCheck3.default)(this, IndexedDBKeyValue);
|
66 |
|
67 | this.indexedDBKey = true;
|
68 |
|
69 | for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
70 | args[_key] = arguments[_key];
|
71 | }
|
72 |
|
73 | this.args = args;
|
74 | };
|
75 |
|
76 | exports.IndexedDBKeyValue = IndexedDBKeyValue;
|
77 |
|
78 | var IndexedDBRepoPlugin = function () {
|
79 | /**
|
80 | * Construct a new repo/store
|
81 | * manager for a given repo/model
|
82 | *
|
83 | * @param store
|
84 | * @param repo
|
85 | */
|
86 | function IndexedDBRepoPlugin(store, repo) {
|
87 | (0, _classCallCheck3.default)(this, IndexedDBRepoPlugin);
|
88 |
|
89 | this.store = store;
|
90 | this.repo = repo;
|
91 | this.type = typestore_1.PluginType.Repo | typestore_1.PluginType.Finder;
|
92 | this.supportedModels = [repo.modelClazz];
|
93 | this.keys = repo.modelType.options.attrs.filter(function (attr) {
|
94 | return attr.primaryKey || attr.secondaryKey;
|
95 | }).map(function (attr) {
|
96 | return attr.name;
|
97 | });
|
98 | repo.attach(this);
|
99 | }
|
100 | /**
|
101 | * Create a finder method with descriptor
|
102 | * and signature
|
103 | *
|
104 | * @param repo
|
105 | * @param finderKey
|
106 | * @returns {any}
|
107 | */
|
108 |
|
109 |
|
110 | (0, _createClass3.default)(IndexedDBRepoPlugin, [{
|
111 | key: "decorateFinder",
|
112 | value: function decorateFinder(repo, finderKey) {
|
113 | var _this = this;
|
114 |
|
115 | var finderOpts = typestore_1.getMetadata(IndexedDBConstants_1.IndexedDBFinderKey, this.repo, finderKey);
|
116 | if (!finderOpts) return null;
|
117 | var fn = finderOpts.fn;
|
118 | var filter = finderOpts.filter;
|
119 |
|
120 | if (!fn && !filter) throw new Error('finder or fn properties MUST be provided on an indexeddb finder descriptor');
|
121 | return function () {
|
122 | for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
123 | args[_key2] = arguments[_key2];
|
124 | }
|
125 |
|
126 | return __awaiter(_this, void 0, void 0, _regenerator2.default.mark(function _callee() {
|
127 | var results, mapper, mappedResults;
|
128 | return _regenerator2.default.wrap(function _callee$(_context) {
|
129 | while (1) {
|
130 | switch (_context.prev = _context.next) {
|
131 | case 0:
|
132 | _context.next = 2;
|
133 | return fn ? fn.apply(undefined, [this].concat(args)) : this.table.filter(function (record) {
|
134 | return filter.apply(undefined, [record].concat(args));
|
135 | }).toArray();
|
136 |
|
137 | case 2:
|
138 | results = _context.sent;
|
139 | mapper = this.mapper;
|
140 | mappedResults = results.map(function (record) {
|
141 | return mapper.fromObject(record);
|
142 | });
|
143 | return _context.abrupt("return", finderOpts.singleResult ? mappedResults[0] : mappedResults);
|
144 |
|
145 | case 6:
|
146 | case "end":
|
147 | return _context.stop();
|
148 | }
|
149 | }
|
150 | }, _callee, this);
|
151 | }));
|
152 | };
|
153 | }
|
154 | /**
|
155 | * Handle a plugin event
|
156 | *
|
157 | * @param eventType
|
158 | * @param args
|
159 | * @returns {boolean}
|
160 | */
|
161 |
|
162 | }, {
|
163 | key: "handle",
|
164 | value: function handle(eventType) {
|
165 | return false;
|
166 | }
|
167 | /**
|
168 | * Model mapper
|
169 | *
|
170 | * @returns {IModelMapper<M>}
|
171 | */
|
172 |
|
173 | }, {
|
174 | key: "init",
|
175 | value: function init(coordinator, opts) {
|
176 | return __awaiter(this, void 0, void 0, _regenerator2.default.mark(function _callee2() {
|
177 | return _regenerator2.default.wrap(function _callee2$(_context2) {
|
178 | while (1) {
|
179 | switch (_context2.prev = _context2.next) {
|
180 | case 0:
|
181 | return _context2.abrupt("return", this.coordinator = coordinator);
|
182 |
|
183 | case 1:
|
184 | case "end":
|
185 | return _context2.stop();
|
186 | }
|
187 | }
|
188 | }, _callee2, this);
|
189 | }));
|
190 | }
|
191 | }, {
|
192 | key: "start",
|
193 | value: function start() {
|
194 | return __awaiter(this, void 0, void 0, _regenerator2.default.mark(function _callee3() {
|
195 | return _regenerator2.default.wrap(function _callee3$(_context3) {
|
196 | while (1) {
|
197 | switch (_context3.prev = _context3.next) {
|
198 | case 0:
|
199 | return _context3.abrupt("return", this.coordinator);
|
200 |
|
201 | case 1:
|
202 | case "end":
|
203 | return _context3.stop();
|
204 | }
|
205 | }
|
206 | }, _callee3, this);
|
207 | }));
|
208 | }
|
209 | }, {
|
210 | key: "stop",
|
211 | value: function stop() {
|
212 | return __awaiter(this, void 0, void 0, _regenerator2.default.mark(function _callee4() {
|
213 | return _regenerator2.default.wrap(function _callee4$(_context4) {
|
214 | while (1) {
|
215 | switch (_context4.prev = _context4.next) {
|
216 | case 0:
|
217 | return _context4.abrupt("return", this.coordinator);
|
218 |
|
219 | case 1:
|
220 | case "end":
|
221 | return _context4.stop();
|
222 | }
|
223 | }
|
224 | }, _callee4, this);
|
225 | }));
|
226 | }
|
227 | }, {
|
228 | key: "key",
|
229 | value: function key() {
|
230 | for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
|
231 | args[_key3] = arguments[_key3];
|
232 | }
|
233 |
|
234 | return new (Function.prototype.bind.apply(IndexedDBKeyValue, [null].concat(args)))();
|
235 | }
|
236 | }, {
|
237 | key: "keyFromObject",
|
238 | value: function keyFromObject(o) {
|
239 | return new (Function.prototype.bind.apply(IndexedDBKeyValue, [null].concat((0, _toConsumableArray3.default)(this.keys.map(function (key) {
|
240 | return o[key];
|
241 | })))))();
|
242 | }
|
243 | }, {
|
244 | key: "dbKeyFromKey",
|
245 | value: function dbKeyFromKey(key) {
|
246 | return key.args[0];
|
247 | }
|
248 | }, {
|
249 | key: "get",
|
250 | value: function get(key) {
|
251 | return __awaiter(this, void 0, void 0, _regenerator2.default.mark(function _callee5() {
|
252 | var _this2 = this;
|
253 |
|
254 | var dbObjects;
|
255 | return _regenerator2.default.wrap(function _callee5$(_context5) {
|
256 | while (1) {
|
257 | switch (_context5.prev = _context5.next) {
|
258 | case 0:
|
259 | key = key.indexedDBKey ? key : this.key(key);
|
260 | _context5.next = 3;
|
261 | return this.table.filter(function (record) {
|
262 | var recordKey = _this2.keyFromObject(record);
|
263 | return Array.isEqual(key.args, recordKey.args);
|
264 | }).toArray();
|
265 |
|
266 | case 3:
|
267 | dbObjects = _context5.sent;
|
268 |
|
269 | if (!(dbObjects.length === 0)) {
|
270 | _context5.next = 8;
|
271 | break;
|
272 | }
|
273 |
|
274 | return _context5.abrupt("return", null);
|
275 |
|
276 | case 8:
|
277 | if (!(dbObjects.length > 1)) {
|
278 | _context5.next = 10;
|
279 | break;
|
280 | }
|
281 |
|
282 | throw new Error("More than one database object returned for key: " + (0, _stringify2.default)(key.args));
|
283 |
|
284 | case 10:
|
285 | return _context5.abrupt("return", this.repo.getMapper(this.repo.modelClazz).fromObject(dbObjects[0]));
|
286 |
|
287 | case 11:
|
288 | case "end":
|
289 | return _context5.stop();
|
290 | }
|
291 | }
|
292 | }, _callee5, this);
|
293 | }));
|
294 | }
|
295 | }, {
|
296 | key: "save",
|
297 | value: function save(model) {
|
298 | return __awaiter(this, void 0, void 0, _regenerator2.default.mark(function _callee6() {
|
299 | var mapper, json;
|
300 | return _regenerator2.default.wrap(function _callee6$(_context6) {
|
301 | while (1) {
|
302 | switch (_context6.prev = _context6.next) {
|
303 | case 0:
|
304 | mapper = this.mapper;
|
305 | json = mapper.toObject(model);
|
306 | _context6.prev = 2;
|
307 | _context6.next = 5;
|
308 | return this.table.put(json);
|
309 |
|
310 | case 5:
|
311 | this.repo.triggerPersistenceEvent(typestore_1.ModelPersistenceEventType.Save, model);
|
312 | _context6.next = 13;
|
313 | break;
|
314 |
|
315 | case 8:
|
316 | _context6.prev = 8;
|
317 | _context6.t0 = _context6["catch"](2);
|
318 |
|
319 | log.error('Failed to persist model', _context6.t0);
|
320 | log.error('Failed persisted json', json, model);
|
321 | throw _context6.t0;
|
322 |
|
323 | case 13:
|
324 | return _context6.abrupt("return", model);
|
325 |
|
326 | case 14:
|
327 | case "end":
|
328 | return _context6.stop();
|
329 | }
|
330 | }
|
331 | }, _callee6, this, [[2, 8]]);
|
332 | }));
|
333 | }
|
334 | /**
|
335 | * Remove implementation
|
336 | *
|
337 | * @param key
|
338 | * @returns {Promise<void>}
|
339 | */
|
340 |
|
341 | }, {
|
342 | key: "remove",
|
343 | value: function remove(key) {
|
344 | return __awaiter(this, void 0, void 0, _regenerator2.default.mark(function _callee7() {
|
345 | var model, result;
|
346 | return _regenerator2.default.wrap(function _callee7$(_context7) {
|
347 | while (1) {
|
348 | switch (_context7.prev = _context7.next) {
|
349 | case 0:
|
350 | key = key.indexedDBKey ? key : this.key(key);
|
351 |
|
352 | if (!this.repo.supportPersistenceEvents()) {
|
353 | _context7.next = 7;
|
354 | break;
|
355 | }
|
356 |
|
357 | _context7.next = 4;
|
358 | return this.get(key);
|
359 |
|
360 | case 4:
|
361 | _context7.t0 = _context7.sent;
|
362 | _context7.next = 8;
|
363 | break;
|
364 |
|
365 | case 7:
|
366 | _context7.t0 = null;
|
367 |
|
368 | case 8:
|
369 | model = _context7.t0;
|
370 | _context7.next = 11;
|
371 | return this.table.delete(key.args[0]);
|
372 |
|
373 | case 11:
|
374 | result = _context7.sent;
|
375 |
|
376 | if (model) this.repo.triggerPersistenceEvent(typestore_1.ModelPersistenceEventType.Remove, model);
|
377 | return _context7.abrupt("return", _promise2.default.resolve(result));
|
378 |
|
379 | case 14:
|
380 | case "end":
|
381 | return _context7.stop();
|
382 | }
|
383 | }
|
384 | }, _callee7, this);
|
385 | }));
|
386 | }
|
387 | }, {
|
388 | key: "count",
|
389 | value: function count() {
|
390 | return _promise2.default.resolve(this.table.count());
|
391 | }
|
392 | /**
|
393 | * Bulk get
|
394 | *
|
395 | * @param keys
|
396 | * @returns {any}
|
397 | */
|
398 |
|
399 | }, {
|
400 | key: "bulkGet",
|
401 | value: function bulkGet() {
|
402 | for (var _len4 = arguments.length, keys = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
|
403 | keys[_key4] = arguments[_key4];
|
404 | }
|
405 |
|
406 | return __awaiter(this, void 0, void 0, _regenerator2.default.mark(function _callee8() {
|
407 | var _this3 = this;
|
408 |
|
409 | var promises;
|
410 | return _regenerator2.default.wrap(function _callee8$(_context8) {
|
411 | while (1) {
|
412 | switch (_context8.prev = _context8.next) {
|
413 | case 0:
|
414 | keys = keys.map(function (key) {
|
415 | return key.indexedDBKey ? key : _this3.key(key);
|
416 | });
|
417 | promises = keys.map(function (key) {
|
418 | return _this3.get(key);
|
419 | });
|
420 | _context8.next = 4;
|
421 | return _promise2.default.all(promises);
|
422 |
|
423 | case 4:
|
424 | return _context8.abrupt("return", _context8.sent);
|
425 |
|
426 | case 5:
|
427 | case "end":
|
428 | return _context8.stop();
|
429 | }
|
430 | }
|
431 | }, _callee8, this);
|
432 | }));
|
433 | }
|
434 | /**
|
435 | * Bulk save/put
|
436 | *
|
437 | * @param models
|
438 | * @returns {M[]}
|
439 | */
|
440 |
|
441 | }, {
|
442 | key: "bulkSave",
|
443 | value: function bulkSave() {
|
444 | for (var _len5 = arguments.length, models = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
|
445 | models[_key5] = arguments[_key5];
|
446 | }
|
447 |
|
448 | return __awaiter(this, void 0, void 0, _regenerator2.default.mark(function _callee9() {
|
449 | var _repo;
|
450 |
|
451 | var mapper, jsons;
|
452 | return _regenerator2.default.wrap(function _callee9$(_context9) {
|
453 | while (1) {
|
454 | switch (_context9.prev = _context9.next) {
|
455 | case 0:
|
456 | mapper = this.repo.getMapper(this.repo.modelClazz);
|
457 | jsons = models.map(function (model) {
|
458 | return mapper.toObject(model);
|
459 | });
|
460 | _context9.next = 4;
|
461 | return this.table.bulkPut(jsons);
|
462 |
|
463 | case 4:
|
464 | (_repo = this.repo).triggerPersistenceEvent.apply(_repo, [typestore_1.ModelPersistenceEventType.Save].concat(models));
|
465 | return _context9.abrupt("return", models);
|
466 |
|
467 | case 6:
|
468 | case "end":
|
469 | return _context9.stop();
|
470 | }
|
471 | }
|
472 | }, _callee9, this);
|
473 | }));
|
474 | }
|
475 | /**
|
476 | * Bulk remove
|
477 | *
|
478 | * @param keys
|
479 | * @returns {IndexedDBKeyValue[]}
|
480 | */
|
481 |
|
482 | }, {
|
483 | key: "bulkRemove",
|
484 | value: function bulkRemove() {
|
485 | for (var _len6 = arguments.length, keys = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
|
486 | keys[_key6] = arguments[_key6];
|
487 | }
|
488 |
|
489 | return __awaiter(this, void 0, void 0, _regenerator2.default.mark(function _callee10() {
|
490 | var _this4 = this,
|
491 | _repo2;
|
492 |
|
493 | var models, dbKeys;
|
494 | return _regenerator2.default.wrap(function _callee10$(_context10) {
|
495 | while (1) {
|
496 | switch (_context10.prev = _context10.next) {
|
497 | case 0:
|
498 | keys = keys.map(function (key) {
|
499 | return key.indexedDBKey ? key : _this4.key(key);
|
500 | });
|
501 |
|
502 | if (!this.repo.supportPersistenceEvents()) {
|
503 | _context10.next = 7;
|
504 | break;
|
505 | }
|
506 |
|
507 | _context10.next = 4;
|
508 | return this.bulkGet.apply(this, (0, _toConsumableArray3.default)(keys));
|
509 |
|
510 | case 4:
|
511 | _context10.t0 = _context10.sent;
|
512 | _context10.next = 8;
|
513 | break;
|
514 |
|
515 | case 7:
|
516 | _context10.t0 = null;
|
517 |
|
518 | case 8:
|
519 | models = _context10.t0;
|
520 | dbKeys = keys.map(function (key) {
|
521 | return _this4.dbKeyFromKey(key);
|
522 | });
|
523 | _context10.next = 12;
|
524 | return this.table.bulkDelete(dbKeys);
|
525 |
|
526 | case 12:
|
527 | if (models) (_repo2 = this.repo).triggerPersistenceEvent.apply(_repo2, [typestore_1.ModelPersistenceEventType.Remove].concat((0, _toConsumableArray3.default)(models)));
|
528 | return _context10.abrupt("return", keys);
|
529 |
|
530 | case 14:
|
531 | case "end":
|
532 | return _context10.stop();
|
533 | }
|
534 | }
|
535 | }, _callee10, this);
|
536 | }));
|
537 | }
|
538 | }, {
|
539 | key: "mapper",
|
540 | get: function get() {
|
541 | return this.repo.getMapper(this.repo.modelClazz);
|
542 | }
|
543 | /**
|
544 | * Get dexie table
|
545 | *
|
546 | * @returns {Dexie.Table<any, any>}
|
547 | */
|
548 |
|
549 | }, {
|
550 | key: "table",
|
551 | get: function get() {
|
552 | return this.store.table(this.repo.modelType);
|
553 | }
|
554 | /**
|
555 | * Get db ref
|
556 | *
|
557 | * @returns {Dexie}
|
558 | */
|
559 |
|
560 | }, {
|
561 | key: "db",
|
562 | get: function get() {
|
563 | return this.store.db;
|
564 | }
|
565 | }]);
|
566 | return IndexedDBRepoPlugin;
|
567 | }();
|
568 |
|
569 | exports.IndexedDBRepoPlugin = IndexedDBRepoPlugin;
|
570 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkluZGV4ZWREQlJlcG9QbHVnaW4uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxJQUFJLFlBQWEsYUFBUSxVQUFLLFNBQWQsSUFBNEIsVUFBVSxPQUFWLEVBQW1CLFVBQW5CLEVBQStCLENBQS9CLEVBQWtDLFNBQWxDLEVBQTZDO0FBQ3JGLFdBQU8sS0FBSyxNQUFNLHFCQUFOLENBQUwsRUFBeUIsVUFBVSxPQUFWLEVBQW1CLE1BQW5CLEVBQTJCO0FBQ3ZELGlCQUFTLFNBQVQsQ0FBbUIsS0FBbkIsRUFBMEI7QUFBRSxnQkFBSTtBQUFFLHFCQUFLLFVBQVUsSUFBVixDQUFlLEtBQWYsQ0FBTDtBQUE4QixhQUFwQyxDQUFxQyxPQUFPLENBQVAsRUFBVTtBQUFFLHVCQUFPLENBQVA7QUFBWTtBQUFFO0FBQzNGLGlCQUFTLFFBQVQsQ0FBa0IsS0FBbEIsRUFBeUI7QUFBRSxnQkFBSTtBQUFFLHFCQUFLLFVBQVUsS0FBVixDQUFnQixLQUFoQixDQUFMO0FBQStCLGFBQXJDLENBQXNDLE9BQU8sQ0FBUCxFQUFVO0FBQUUsdUJBQU8sQ0FBUDtBQUFZO0FBQUU7QUFDM0YsaUJBQVMsSUFBVCxDQUFjLE1BQWQsRUFBc0I7QUFBRSxtQkFBTyxJQUFQLEdBQWMsUUFBUSxPQUFPLEtBQWYsQ0FBZCxHQUFzQyxJQUFJLENBQUosQ0FBTSxVQUFVLE9BQVYsRUFBbUI7QUFBRSx3QkFBUSxPQUFPLEtBQWY7QUFBd0IsYUFBbkQsRUFBcUQsSUFBckQsQ0FBMEQsU0FBMUQsRUFBcUUsUUFBckUsQ0FBdEM7QUFBdUg7QUFDL0ksYUFBSyxDQUFDLFlBQVksVUFBVSxLQUFWLENBQWdCLE9BQWhCLEVBQXlCLFVBQXpCLENBQWIsRUFBbUQsSUFBbkQsRUFBTDtBQUNILEtBTE0sQ0FBUDtBQU1ILENBUEQ7QUFRQSxJQUFNLGNBQWMsUUFBUSxXQUFSLENBQXBCO0FBQ0EsSUFBTSx1QkFBdUIsUUFBUSxzQkFBUixDQUE3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VCxDQUFsQztBQUFBLGlDQUFULENBQVA7O0FBRG1DLHFDQUVuQixLQUFLLElBQUwsQ0FBVSx3QkFBVixFQUZtQjtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLHVDQUd6QixLQUFLLE9BQUwsOENBQWdCLElBQWhCLEVBSHlCOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEsZ0RBR0QsSUFIQzs7QUFBQTtBQUU3QixzQ0FGNkI7QUFJN0Isc0NBSjZCLEdBSXBCLEtBQUssR0FBTCxDQUFTO0FBQUEsMkNBQU8sT0FBSyxZQUFMLENBQWtCLEdBQWxCLENBQVA7QUFBQSxpQ0FBVCxDQUpvQjtBQUFBO0FBQUEsdUNBSzdCLEtBQUssS0FBTCxDQUFXLFVBQVgsQ0FBc0IsTUFBdEIsQ0FMNkI7O0FBQUE7QUFNbkMsb0NBQUksTUFBSixFQUNJLGVBQUssSUFBTCxFQUFVLHVCQUFWLGdCQUFrQyxZQUFZLHlCQUFaLENBQXNDLE1BQXhFLDBDQUFtRixNQUFuRjtBQVArQixtRUFRNUIsSUFSNEI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsYUFBaEMsRUFBUDtBQVVIOzs7NEJBNUlZO0FBQ1QsbUJBQU8sS0FBSyxJQUFMLENBQVUsU0FBVixDQUFvQixLQUFLLElBQUwsQ0FBVSxVQUE5QixDQUFQO0FBQ0g7QUFDRDs7Ozs7Ozs7NEJBS1k7QUFDUixtQkFBTyxLQUFLLEtBQUwsQ0FBVyxLQUFYLENBQWlCLEtBQUssSUFBTCxDQUFVLFNBQTNCLENBQVA7QUFDSDtBQUNEOzs7Ozs7Ozs0QkFLUztBQUNMLG1CQUFPLEtBQUssS0FBTCxDQUFXLEVBQWxCO0FBQ0g7Ozs7O0FBNEhMLFFBQVEsbUJBQVIsR0FBOEIsbUJBQTlCIiwiZmlsZSI6IkluZGV4ZWREQlJlcG9QbHVnaW4uanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLnRocm93KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHJlc3VsdC52YWx1ZSk7IH0pLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMpKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmNvbnN0IHR5cGVzdG9yZV8xID0gcmVxdWlyZShcInR5cGVzdG9yZVwiKTtcbmNvbnN0IEluZGV4ZWREQkNvbnN0YW50c18xID0gcmVxdWlyZShcIi4vSW5kZXhlZERCQ29uc3RhbnRzXCIpO1xuY29uc3QgbG9nID0gdHlwZXN0b3JlXzEuTG9nLmNyZWF0ZShfX2ZpbGVuYW1lKTtcbi8qKlxuICogU3VwZXIgc2ltcGxlIHBsYWluIGphaW4ga2V5IGZvciBub3dcbiAqIHdoYXQgeW91IHNlbmQgdG8gdGhlIGNvbnN0cnVjdG9yIGNvbWVzIG91dCB0aGVcbiAqIG90aGVyIGVuZFxuICpcbiAqIGp1c3QgbGlrZSBwb29wIVxuICovXG5jbGFzcyBJbmRleGVkREJLZXlWYWx1ZSB7XG4gICAgY29uc3RydWN0b3IoLi4uYXJncykge1xuICAgICAgICB0aGlzLmluZGV4ZWREQktleSA9IHRydWU7XG4gICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgfVxufVxuZXhwb3J0cy5JbmRleGVkREJLZXlWYWx1ZSA9IEluZGV4ZWREQktleVZhbHVlO1xuY2xhc3MgSW5kZXhlZERCUmVwb1BsdWdpbiB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgbmV3IHJlcG8vc3RvcmVcbiAgICAgKiBtYW5hZ2VyIGZvciBhIGdpdmVuIHJlcG8vbW9kZWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdG9yZVxuICAgICAqIEBwYXJhbSByZXBvXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc3RvcmUsIHJlcG8pIHtcbiAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlO1xuICAgICAgICB0aGlzLnJlcG8gPSByZXBvO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlc3RvcmVfMS5QbHVnaW5UeXBlLlJlcG8gfCB0eXBlc3RvcmVfMS5QbHVnaW5UeXBlLkZpbmRlcjtcbiAgICAgICAgdGhpcy5zdXBwb3J0ZWRNb2RlbHMgPSBbcmVwby5tb2RlbENsYXp6XTtcbiAgICAgICAgdGhpcy5rZXlzID0gcmVwby5tb2RlbFR5cGUub3B0aW9ucy5hdHRyc1xuICAgICAgICAgICAgLmZpbHRlcihhdHRyID0+IGF0dHIucHJpbWFyeUtleSB8fCBhdHRyLnNlY29uZGFyeUtleSlcbiAgICAgICAgICAgIC5tYXAoYXR0ciA9PiBhdHRyLm5hbWUpO1xuICAgICAgICByZXBvLmF0dGFjaCh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgZmluZGVyIG1ldGhvZCB3aXRoIGRlc2NyaXB0b3JcbiAgICAgKiBhbmQgc2lnbmF0dXJlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVwb1xuICAgICAqIEBwYXJhbSBmaW5kZXJLZXlcbiAgICAgKiBAcmV0dXJucyB7YW55fVxuICAgICAqL1xuICAgIGRlY29yYXRlRmluZGVyKHJlcG8sIGZpbmRlcktleSkge1xuICAgICAgICBjb25zdCBmaW5kZXJPcHRzID0gdHlwZXN0b3JlXzEuZ2V0TWV0YWRhdGEoSW5kZXhlZERCQ29uc3RhbnRzXzEuSW5kZXhlZERCRmluZGVyS2V5LCB0aGlzLnJlcG8sIGZpbmRlcktleSk7XG4gICAgICAgIGlmICghZmluZGVyT3B0cylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IGZuLCBmaWx0ZXIgfSA9IGZpbmRlck9wdHM7XG4gICAgICAgIGlmICghZm4gJiYgIWZpbHRlcilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZmluZGVyIG9yIGZuIHByb3BlcnRpZXMgTVVTVCBiZSBwcm92aWRlZCBvbiBhbiBpbmRleGVkZGIgZmluZGVyIGRlc2NyaXB0b3InKTtcbiAgICAgICAgcmV0dXJuICguLi5hcmdzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0cyA9IHlpZWxkICgoZm4pID8gZm4odGhpcywgLi4uYXJncykgOiB0aGlzLnRhYmxlXG4gICAgICAgICAgICAgICAgLmZpbHRlcihyZWNvcmQgPT4gZmlsdGVyKHJlY29yZCwgLi4uYXJncykpXG4gICAgICAgICAgICAgICAgLnRvQXJyYXkoKSk7XG4gICAgICAgICAgICBjb25zdCBtYXBwZXIgPSB0aGlzLm1hcHBlcjtcbiAgICAgICAgICAgIGNvbnN0IG1hcHBlZFJlc3VsdHMgPSByZXN1bHRzLm1hcChyZWNvcmQgPT4gbWFwcGVyLmZyb21PYmplY3QocmVjb3JkKSk7XG4gICAgICAgICAgICByZXR1cm4gZmluZGVyT3B0cy5zaW5nbGVSZXN1bHQgPyBtYXBwZWRSZXN1bHRzWzBdIDogbWFwcGVkUmVzdWx0cztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBhIHBsdWdpbiBldmVudFxuICAgICAqXG4gICAgICogQHBhcmFtIGV2ZW50VHlwZVxuICAgICAqIEBwYXJhbSBhcmdzXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaGFuZGxlKGV2ZW50VHlwZSwgLi4uYXJncykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vZGVsIG1hcHBlclxuICAgICAqXG4gICAgICogQHJldHVybnMge0lNb2RlbE1hcHBlcjxNPn1cbiAgICAgKi9cbiAgICBnZXQgbWFwcGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXBvLmdldE1hcHBlcih0aGlzLnJlcG8ubW9kZWxDbGF6eik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBkZXhpZSB0YWJsZVxuICAgICAqXG4gICAgICogQHJldHVybnMge0RleGllLlRhYmxlPGFueSwgYW55Pn1cbiAgICAgKi9cbiAgICBnZXQgdGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLnRhYmxlKHRoaXMucmVwby5tb2RlbFR5cGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgZGIgcmVmXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7RGV4aWV9XG4gICAgICovXG4gICAgZ2V0IGRiKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5kYjtcbiAgICB9XG4gICAgaW5pdChjb29yZGluYXRvciwgb3B0cykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLmNvb3JkaW5hdG9yID0gY29vcmRpbmF0b3IpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhcnQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb29yZGluYXRvcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0b3AoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb29yZGluYXRvcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGtleSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5kZXhlZERCS2V5VmFsdWUoLi4uYXJncyk7XG4gICAgfVxuICAgIGtleUZyb21PYmplY3Qobykge1xuICAgICAgICByZXR1cm4gbmV3IEluZGV4ZWREQktleVZhbHVlKC4uLnRoaXMua2V5cy5tYXAoa2V5ID0+IG9ba2V5XSkpO1xuICAgIH1cbiAgICBkYktleUZyb21LZXkoa2V5KSB7XG4gICAgICAgIHJldHVybiBrZXkuYXJnc1swXTtcbiAgICB9XG4gICAgZ2V0KGtleSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAga2V5ID0ga2V5LmluZGV4ZWREQktleSA/IGtleSA6IHRoaXMua2V5KGtleSk7XG4gICAgICAgICAgICBjb25zdCBkYk9iamVjdHMgPSB5aWVsZCB0aGlzLnRhYmxlXG4gICAgICAgICAgICAgICAgLmZpbHRlcihyZWNvcmQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZEtleSA9IHRoaXMua2V5RnJvbU9iamVjdChyZWNvcmQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0VxdWFsKGtleS5hcmdzLCByZWNvcmRLZXkuYXJncyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50b0FycmF5KCk7XG4gICAgICAgICAgICBpZiAoZGJPYmplY3RzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGRiT2JqZWN0cy5sZW5ndGggPiAxKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTW9yZSB0aGFuIG9uZSBkYXRhYmFzZSBvYmplY3QgcmV0dXJuZWQgZm9yIGtleTogJHtKU09OLnN0cmluZ2lmeShrZXkuYXJncyl9YCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXBvLmdldE1hcHBlcih0aGlzLnJlcG8ubW9kZWxDbGF6eikuZnJvbU9iamVjdChkYk9iamVjdHNbMF0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2F2ZShtb2RlbCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgbWFwcGVyID0gdGhpcy5tYXBwZXI7XG4gICAgICAgICAgICBjb25zdCBqc29uID0gbWFwcGVyLnRvT2JqZWN0KG1vZGVsKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgeWllbGQgdGhpcy50YWJsZS5wdXQoanNvbik7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXBvLnRyaWdnZXJQZXJzaXN0ZW5jZUV2ZW50KHR5cGVzdG9yZV8xLk1vZGVsUGVyc2lzdGVuY2VFdmVudFR5cGUuU2F2ZSwgbW9kZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIHBlcnNpc3QgbW9kZWwnLCBlcnIpO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcignRmFpbGVkIHBlcnNpc3RlZCBqc29uJywganNvbiwgbW9kZWwpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtb2RlbDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBpbXBsZW1lbnRhdGlvblxuICAgICAqXG4gICAgICogQHBhcmFtIGtleVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgICAqL1xuICAgIHJlbW92ZShrZXkpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGtleSA9IGtleS5pbmRleGVkREJLZXkgPyBrZXkgOiB0aGlzLmtleShrZXkpO1xuICAgICAgICAgICAgY29uc3QgbW9kZWwgPSAodGhpcy5yZXBvLnN1cHBvcnRQZXJzaXN0ZW5jZUV2ZW50cygpKSA/XG4gICAgICAgICAgICAgICAgeWllbGQgdGhpcy5nZXQoa2V5KSA6IG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCB0aGlzLnRhYmxlLmRlbGV0ZShrZXkuYXJnc1swXSk7XG4gICAgICAgICAgICBpZiAobW9kZWwpXG4gICAgICAgICAgICAgICAgdGhpcy5yZXBvLnRyaWdnZXJQZXJzaXN0ZW5jZUV2ZW50KHR5cGVzdG9yZV8xLk1vZGVsUGVyc2lzdGVuY2VFdmVudFR5cGUuUmVtb3ZlLCBtb2RlbCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLnRhYmxlLmNvdW50KCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCdWxrIGdldFxuICAgICAqXG4gICAgICogQHBhcmFtIGtleXNcbiAgICAgKiBAcmV0dXJucyB7YW55fVxuICAgICAqL1xuICAgIGJ1bGtHZXQoLi4ua2V5cykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAga2V5cyA9IGtleXMubWFwKGtleSA9PiAoa2V5LmluZGV4ZWREQktleSkgPyBrZXkgOiB0aGlzLmtleShrZXkpKTtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VzID0ga2V5cy5tYXAoa2V5ID0+IHRoaXMuZ2V0KGtleSkpO1xuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEJ1bGsgc2F2ZS9wdXRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlbHNcbiAgICAgKiBAcmV0dXJucyB7TVtdfVxuICAgICAqL1xuICAgIGJ1bGtTYXZlKC4uLm1vZGVscykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgbWFwcGVyID0gdGhpcy5yZXBvLmdldE1hcHBlcih0aGlzLnJlcG8ubW9kZWxDbGF6eik7XG4gICAgICAgICAgICBjb25zdCBqc29ucyA9IG1vZGVscy5tYXAobW9kZWwgPT4gbWFwcGVyLnRvT2JqZWN0KG1vZGVsKSk7XG4gICAgICAgICAgICB5aWVsZCB0aGlzLnRhYmxlLmJ1bGtQdXQoanNvbnMpO1xuICAgICAgICAgICAgdGhpcy5yZXBvLnRyaWdnZXJQZXJzaXN0ZW5jZUV2ZW50KHR5cGVzdG9yZV8xLk1vZGVsUGVyc2lzdGVuY2VFdmVudFR5cGUuU2F2ZSwgLi4ubW9kZWxzKTtcbiAgICAgICAgICAgIHJldHVybiBtb2RlbHM7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCdWxrIHJlbW92ZVxuICAgICAqXG4gICAgICogQHBhcmFtIGtleXNcbiAgICAgKiBAcmV0dXJucyB7SW5kZXhlZERCS2V5VmFsdWVbXX1cbiAgICAgKi9cbiAgICBidWxrUmVtb3ZlKC4uLmtleXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGtleXMgPSBrZXlzLm1hcChrZXkgPT4gKGtleS5pbmRleGVkREJLZXkpID8ga2V5IDogdGhpcy5rZXkoa2V5KSk7XG4gICAgICAgICAgICBjb25zdCBtb2RlbHMgPSAodGhpcy5yZXBvLnN1cHBvcnRQZXJzaXN0ZW5jZUV2ZW50cygpKSA/XG4gICAgICAgICAgICAgICAgeWllbGQgdGhpcy5idWxrR2V0KC4uLmtleXMpIDogbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGRiS2V5cyA9IGtleXMubWFwKGtleSA9PiB0aGlzLmRiS2V5RnJvbUtleShrZXkpKTtcbiAgICAgICAgICAgIHlpZWxkIHRoaXMudGFibGUuYnVsa0RlbGV0ZShkYktleXMpO1xuICAgICAgICAgICAgaWYgKG1vZGVscylcbiAgICAgICAgICAgICAgICB0aGlzLnJlcG8udHJpZ2dlclBlcnNpc3RlbmNlRXZlbnQodHlwZXN0b3JlXzEuTW9kZWxQZXJzaXN0ZW5jZUV2ZW50VHlwZS5SZW1vdmUsIC4uLm1vZGVscyk7XG4gICAgICAgICAgICByZXR1cm4ga2V5cztcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5JbmRleGVkREJSZXBvUGx1Z2luID0gSW5kZXhlZERCUmVwb1BsdWdpbjtcbiJdfQ==
|
571 | //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkluZGV4ZWREQlJlcG9QbHVnaW4uanMiLCJJbmRleGVkREJSZXBvUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsSUFBSSxZQUFhLGFBQVEsVUFBSyxTQUFkLElBQTRCLFVBQVUsT0FBVixFQUFtQixVQUFuQixFQUErQixDQUEvQixFQUFrQyxTQUFsQyxFQUE2QztBQUNyRixXQUFPLEtBQUssTUFBTSxxQkFBTixDQUFMLEVBQXlCLFVBQVUsT0FBVixFQUFtQixNQUFuQixFQUEyQjtBQUN2RCxpQkFBUyxTQUFULENBQW1CLEtBQW5CLEVBQTBCO0FBQUUsZ0JBQUk7QUFBRSxxQkFBSyxVQUFVLElBQVYsQ0FBZSxLQUFmLENBQUw7QUFBOEIsYUFBcEMsQ0FBcUMsT0FBTyxDQUFQLEVBQVU7QUFBRSx1QkFBTyxDQUFQO0FBQVk7QUFBRTtBQUMzRixpQkFBUyxRQUFULENBQWtCLEtBQWxCLEVBQXlCO0FBQUUsZ0JBQUk7QUFBRSxxQkFBSyxVQUFVLEtBQVYsQ0FBZ0IsS0FBaEIsQ0FBTDtBQUErQixhQUFyQyxDQUFzQyxPQUFPLENBQVAsRUFBVTtBQUFFLHVCQUFPLENBQVA7QUFBWTtBQUFFO0FBQzNGLGlCQUFTLElBQVQsQ0FBYyxNQUFkLEVBQXNCO0FBQUUsbUJBQU8sSUFBUCxHQUFjLFFBQVEsT0FBTyxLQUFmLENBQWQsR0FBc0MsSUFBSSxDQUFKLENBQU0sVUFBVSxPQUFWLEVBQW1CO0FBQUUsd0JBQVEsT0FBTyxLQUFmO0FBQXdCLGFBQW5ELEVBQXFELElBQXJELENBQTBELFNBQTFELEVBQXFFLFFBQXJFLENBQXRDO0FBQXVIO0FBQy9JLGFBQUssQ0FBQyxZQUFZLFVBQVUsS0FBVixDQUFnQixPQUFoQixFQUF5QixVQUF6QixDQUFiLEVBQW1ELElBQW5ELEVBQUw7QUFDSCxLQUxNLENBQVA7QUFNSCxDQVBEO0FDREEsSUFBQSxjQUFBLFFBQUEsV0FBQSxDQUFBO0FBbUJBLElB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
|