UNPKG

@neocomplexx/ngx-neo-indexeddb

Version:

This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.5.

393 lines (385 loc) 35.1 kB
import { NgModule } from '@angular/core'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ class NgxNeoIndexedDbModule { /** * @return {?} */ static forRoot() { return { ngModule: NgxNeoIndexedDbModule, providers: [] }; } } NgxNeoIndexedDbModule.decorators = [ { type: NgModule, args: [{ declarations: [], imports: [], exports: [] },] } ]; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ class DbWrapper { /** * @param {?} dbName * @param {?} version */ constructor(dbName, version) { this.dbName = dbName; this.dbVersion = version || 1; this.db = null; } /** * @param {?} storeName * @return {?} */ validateStoreName(storeName) { return this.db.objectStoreNames.contains(storeName); } /** * @param {?} storeName * @param {?} reject * @return {?} */ validateBeforeTransaction(storeName, reject) { if (!this.db) { reject('You need to use the openDatabase function to create a database before you query it!'); } if (!this.validateStoreName(storeName)) { reject(('objectStore does not exists: ' + storeName)); } } /** * @param {?} options * @return {?} */ createTransaction(options) { /** @type {?} */ const trans = this.db.transaction(options.storeName, options.dbMode); trans.onerror = options.error; trans.oncomplete = options.complete; trans.onabort = options.abort; return trans; } } /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ class Utils { constructor() { this.indexedDB = window.indexedDB || ((/** @type {?} */ (window))).mozIndexedDB || ((/** @type {?} */ (window))).webkitIndexedDB || ((/** @type {?} */ (window))).msIndexedDB; } } /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ class NgxNeoIDB { /** * @param {?} dbName * @param {?} version */ constructor(dbName, version) { this.utils = new Utils(); this.dbWrapper = new DbWrapper(dbName, version); } /** * @param {?} version * @param {?=} upgradeCallback * @return {?} */ openDatabase(version, upgradeCallback) { return new Promise((resolve, reject) => { this.dbWrapper.dbVersion = version; /** @type {?} */ const request = this.utils.indexedDB.open(this.dbWrapper.dbName, version); request.onsuccess = (e) => { this.dbWrapper.db = request.result; resolve(); }; request.onerror = (e) => { reject('IndexedDB error: ' + ((/** @type {?} */ (e.target))).errorCode ? ((/** @type {?} */ (e.target))).errorCode + ' (' + ((/** @type {?} */ (e.target))).error + ')' : ((/** @type {?} */ (e.target))).errorCode); }; if (typeof upgradeCallback === 'function') { request.onupgradeneeded = (e) => { upgradeCallback(e, this.dbWrapper.db); }; } }); } /** * @param {?} storeName * @param {?} key * @return {?} */ getByKey(storeName, key) { return new Promise((resolve, reject) => { this.dbWrapper.validateBeforeTransaction(storeName, reject); /** @type {?} */ const transaction = this.dbWrapper.createTransaction({ storeName: storeName, dbMode: 'readonly', error: (e) => { reject(e); }, complete: (e) => { } }); /** @type {?} */ const objectStore = transaction.objectStore(storeName); /** @type {?} */ let request; request = objectStore.get(key); request.onsuccess = (event) => { resolve(((/** @type {?} */ (event.target))).result); }; }); } /** * @param {?} storeName * @param {?=} keyRange * @param {?=} indexDetails * @return {?} */ getAll(storeName, keyRange, indexDetails) { return new Promise((resolve, reject) => { this.dbWrapper.validateBeforeTransaction(storeName, reject); /** @type {?} */ const transaction = this.dbWrapper.createTransaction({ storeName: storeName, dbMode: 'readonly', error: (e) => { reject(e); }, complete: (e) => { } }); /** @type {?} */ const objectStore = transaction.objectStore(storeName); /** @type {?} */ const result = []; /** @type {?} */ let request; if (indexDetails) { /** @type {?} */ const index = objectStore.index(indexDetails.indexName); /** @type {?} */ const order = (indexDetails.order === 'desc') ? 'prev' : 'next'; request = index.openCursor(keyRange, (/** @type {?} */ (order))); } else { request = objectStore.openCursor(keyRange); } request.onerror = (e) => { reject(e); }; request.onsuccess = (evt) => { /** @type {?} */ const cursor = ((/** @type {?} */ (evt.target))).result; if (cursor) { result.push(cursor.value); cursor['continue'](); } else { resolve(result); } }; }); } /** * @param {?} storeName * @param {?} value * @param {?=} key * @return {?} */ add(storeName, value, key) { return new Promise((resolve, reject) => { this.dbWrapper.validateBeforeTransaction(storeName, reject); /** @type {?} */ const transaction = this.dbWrapper.createTransaction({ storeName: storeName, dbMode: 'readwrite', error: (e) => { reject(e); }, complete: (e) => { resolve({ key: key, value: value }); } }); /** @type {?} */ const objectStore = transaction.objectStore(storeName); /** @type {?} */ const request = objectStore.add(value, key); request.onsuccess = (evt) => { key = evt.target.result; }; }); } /** * @param {?} storeName * @param {?} value * @param {?=} key * @return {?} */ update(storeName, value, key) { return new Promise((resolve, reject) => { this.dbWrapper.validateBeforeTransaction(storeName, reject); /** @type {?} */ const transaction = this.dbWrapper.createTransaction({ storeName: storeName, dbMode: 'readwrite', error: (e) => { reject(e); }, complete: (e) => { resolve(value); }, abort: (e) => { reject(e); } }); /** @type {?} */ const objectStore = transaction.objectStore(storeName); objectStore.put(value, key); }); } /** * @param {?} storeName * @param {?} key * @return {?} */ delete(storeName, key) { return new Promise((resolve, reject) => { this.dbWrapper.validateBeforeTransaction(storeName, reject); /** @type {?} */ const transaction = this.dbWrapper.createTransaction({ storeName: storeName, dbMode: 'readwrite', error: (e) => { reject(e); }, complete: (e) => { resolve(); }, abort: (e) => { reject(e); } }); /** @type {?} */ const objectStore = transaction.objectStore(storeName); objectStore['delete'](key); }); } /** * @param {?} storeName * @param {?} cursorCallback * @param {?=} keyRange * @return {?} */ openCursor(storeName, cursorCallback, keyRange) { return new Promise((resolve, reject) => { this.dbWrapper.validateBeforeTransaction(storeName, reject); /** @type {?} */ const transaction = this.dbWrapper.createTransaction({ storeName: storeName, dbMode: 'readonly', error: (e) => { reject(e); }, complete: (e) => { resolve(); }, abort: (e) => { reject(e); } }); /** @type {?} */ const objectStore = transaction.objectStore(storeName); /** @type {?} */ const request = objectStore.openCursor(keyRange); request.onsuccess = (evt) => { cursorCallback(evt); resolve(); }; }); } /** * @param {?} storeName * @return {?} */ clear(storeName) { return new Promise((resolve, reject) => { this.dbWrapper.validateBeforeTransaction(storeName, reject); /** @type {?} */ const transaction = this.dbWrapper.createTransaction({ storeName: storeName, dbMode: 'readwrite', error: (e) => { reject(e); }, complete: (e) => { resolve(); }, abort: (e) => { reject(e); } }); /** @type {?} */ const objectStore = transaction.objectStore(storeName); objectStore.clear(); resolve(); }); } /** * @param {?} storeName * @param {?} indexName * @param {?} key * @return {?} */ getByIndex(storeName, indexName, key) { return new Promise((resolve, reject) => { this.dbWrapper.validateBeforeTransaction(storeName, reject); /** @type {?} */ const transaction = this.dbWrapper.createTransaction({ storeName: storeName, dbMode: 'readonly', error: (e) => { reject(e); }, abort: (e) => { reject(e); }, complete: (e) => { } }); /** @type {?} */ const objectStore = transaction.objectStore(storeName); /** @type {?} */ const index = objectStore.index(indexName); /** @type {?} */ const request = index.get(key); request.onsuccess = (event) => { resolve(((/** @type {?} */ (event.target))).result); }; }); } } /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ export { NgxNeoIndexedDbModule, NgxNeoIDB }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVvY29tcGxleHgtbmd4LW5lby1pbmRleGVkZGIuanMubWFwIiwic291cmNlcyI6WyJuZzovL0BuZW9jb21wbGV4eC9uZ3gtbmVvLWluZGV4ZWRkYi9saWIvbmd4LW5lby1pbmRleGVkLWRiLm1vZHVsZS50cyIsIm5nOi8vQG5lb2NvbXBsZXh4L25neC1uZW8taW5kZXhlZGRiL2xpYi9jbGFzc2VzL2RiV3JhcHBlci50cyIsIm5nOi8vQG5lb2NvbXBsZXh4L25neC1uZW8taW5kZXhlZGRiL2xpYi9jbGFzc2VzL3V0aWxzLnRzIiwibmc6Ly9AbmVvY29tcGxleHgvbmd4LW5lby1pbmRleGVkZGIvbGliL05neElEQi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBhdXRob3IgU2ViYXN0aWFuIExhcnJpZXVcbiAqIEBlbWFpbCBzbGFycmlldUBuZW9jb21wbGV4eC5jb21cbiAqIEBjcmVhdGUgZGF0ZSAyMDE4LTExLTIyIDA4OjIzOjMwXG4gKiBAbW9kaWZ5IGRhdGUgMjAxOC0xMS0yMiAwODoyMzozMFxuKi9cbmltcG9ydCB7IE5nTW9kdWxlLCBNb2R1bGVXaXRoUHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW10sXG4gIGltcG9ydHM6IFtdLFxuICBleHBvcnRzOiBbXVxufSlcbmV4cG9ydCBjbGFzcyBOZ3hOZW9JbmRleGVkRGJNb2R1bGUge1xuICBzdGF0aWMgZm9yUm9vdCgpOiBNb2R1bGVXaXRoUHJvdmlkZXJzIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IE5neE5lb0luZGV4ZWREYk1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW11cbiAgICB9O1xuICB9XG4gfVxuIiwiZXhwb3J0IGNsYXNzIERiV3JhcHBlciB7XHJcbiAgICBkYk5hbWU6IHN0cmluZztcclxuICAgIGRiVmVyc2lvbjogbnVtYmVyO1xyXG4gICAgZGI6IElEQkRhdGFiYXNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGRiTmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLmRiTmFtZSA9IGRiTmFtZTtcclxuICAgICAgICB0aGlzLmRiVmVyc2lvbiA9IHZlcnNpb24gfHwgMTtcclxuICAgICAgICB0aGlzLmRiID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB2YWxpZGF0ZVN0b3JlTmFtZShzdG9yZU5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoc3RvcmVOYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICB2YWxpZGF0ZUJlZm9yZVRyYW5zYWN0aW9uKHN0b3JlTmFtZTogc3RyaW5nLCByZWplY3Q6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRiKSB7XHJcbiAgICAgICAgICAgIHJlamVjdCgnWW91IG5lZWQgdG8gdXNlIHRoZSBvcGVuRGF0YWJhc2UgZnVuY3Rpb24gdG8gY3JlYXRlIGEgZGF0YWJhc2UgYmVmb3JlIHlvdSBxdWVyeSBpdCEnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlU3RvcmVOYW1lKHN0b3JlTmFtZSkpIHtcclxuICAgICAgICAgICAgcmVqZWN0KCgnb2JqZWN0U3RvcmUgZG9lcyBub3QgZXhpc3RzOiAnICsgc3RvcmVOYW1lKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVRyYW5zYWN0aW9uKFxyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgc3RvcmVOYW1lOiBzdHJpbmcsIGRiTW9kZTogSURCVHJhbnNhY3Rpb25Nb2RlLFxyXG4gICAgICAgICAgICBlcnJvcjogKGU6IEV2ZW50KSA9PiBhbnksXHJcbiAgICAgICAgICAgIGNvbXBsZXRlOiAoZTogRXZlbnQpID0+IGFueSxcclxuICAgICAgICAgICAgYWJvcnQ/OiAoZTogRXZlbnQpID0+IGFueVxyXG4gICAgICAgIH0pOiBJREJUcmFuc2FjdGlvbiB7XHJcbiAgICAgICAgY29uc3QgdHJhbnM6IElEQlRyYW5zYWN0aW9uID0gdGhpcy5kYi50cmFuc2FjdGlvbihvcHRpb25zLnN0b3JlTmFtZSwgb3B0aW9ucy5kYk1vZGUpO1xyXG4gICAgICAgIHRyYW5zLm9uZXJyb3IgPSBvcHRpb25zLmVycm9yO1xyXG4gICAgICAgIHRyYW5zLm9uY29tcGxldGUgPSBvcHRpb25zLmNvbXBsZXRlO1xyXG4gICAgICAgIHRyYW5zLm9uYWJvcnQgPSBvcHRpb25zLmFib3J0O1xyXG4gICAgICAgIHJldHVybiB0cmFucztcclxuICAgIH1cclxufVxyXG4iLCJleHBvcnQgY2xhc3MgVXRpbHMge1xyXG4gICAgaW5kZXhlZERCOiBJREJGYWN0b3J5O1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5pbmRleGVkREIgPSB3aW5kb3cuaW5kZXhlZERCIHx8ICg8YW55PndpbmRvdykubW96SW5kZXhlZERCIHx8ICg8YW55PndpbmRvdykud2Via2l0SW5kZXhlZERCIHx8ICg8YW55PndpbmRvdykubXNJbmRleGVkREI7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRGJXcmFwcGVyIH0gZnJvbSAnLi9jbGFzc2VzL2RiV3JhcHBlcic7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4vY2xhc3Nlcy91dGlscyc7XG5pbXBvcnQgeyBJbmRleERldGFpbHMgfSBmcm9tICcuL2NsYXNzZXMvaW5kZXhEZXRhaWxzJztcblxuXG5leHBvcnQgY2xhc3MgTmd4TmVvSURCIHtcbiAgdXRpbHM6IFV0aWxzO1xuICBkYldyYXBwZXI6IERiV3JhcHBlcjtcblxuICBjb25zdHJ1Y3RvcihkYk5hbWU6IHN0cmluZywgdmVyc2lvbjogbnVtYmVyKSB7XG4gICAgdGhpcy51dGlscyA9IG5ldyBVdGlscygpO1xuICAgIHRoaXMuZGJXcmFwcGVyID0gbmV3IERiV3JhcHBlcihkYk5hbWUsIHZlcnNpb24pO1xuICB9XG5cbiAgb3BlbkRhdGFiYXNlKHZlcnNpb246IG51bWJlciwgdXBncmFkZUNhbGxiYWNrPzogRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmRiV3JhcHBlci5kYlZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMudXRpbHMuaW5kZXhlZERCLm9wZW4odGhpcy5kYldyYXBwZXIuZGJOYW1lLCB2ZXJzaW9uKTtcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKGUpID0+IHtcbiAgICAgICAgdGhpcy5kYldyYXBwZXIuZGIgPSByZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcblxuICAgICAgcmVxdWVzdC5vbmVycm9yID0gKGUpID0+IHtcbiAgICAgICAgcmVqZWN0KCdJbmRleGVkREIgZXJyb3I6ICcgKyAoPGFueT5lLnRhcmdldCkuZXJyb3JDb2RlID9cbiAgICAgICAgICAoPGFueT5lLnRhcmdldCkuZXJyb3JDb2RlICsgJyAoJyArICg8YW55PmUudGFyZ2V0KS5lcnJvciArICcpJyA6XG4gICAgICAgICAgKDxhbnk+ZS50YXJnZXQpLmVycm9yQ29kZSk7XG4gICAgICB9O1xuXG4gICAgICBpZiAodHlwZW9mIHVwZ3JhZGVDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IChlKSA9PiB7XG4gICAgICAgICAgdXBncmFkZUNhbGxiYWNrKGUsIHRoaXMuZGJXcmFwcGVyLmRiKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldEJ5S2V5KHN0b3JlTmFtZTogc3RyaW5nLCBrZXk6IGFueSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGJXcmFwcGVyLnZhbGlkYXRlQmVmb3JlVHJhbnNhY3Rpb24oc3RvcmVOYW1lLCByZWplY3QpO1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRiV3JhcHBlci5jcmVhdGVUcmFuc2FjdGlvbih7XG4gICAgICAgIHN0b3JlTmFtZTogc3RvcmVOYW1lLFxuICAgICAgICBkYk1vZGU6ICdyZWFkb25seScsXG4gICAgICAgIGVycm9yOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXBsZXRlOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBvYmplY3RTdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHN0b3JlTmFtZSk7XG4gICAgICBsZXQgcmVxdWVzdDogSURCUmVxdWVzdDtcblxuICAgICAgcmVxdWVzdCA9IG9iamVjdFN0b3JlLmdldChrZXkpO1xuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgIHJlc29sdmUoKDxhbnk+ZXZlbnQudGFyZ2V0KS5yZXN1bHQpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldEFsbChzdG9yZU5hbWU6IHN0cmluZywga2V5UmFuZ2U/OiBJREJLZXlSYW5nZSwgaW5kZXhEZXRhaWxzPzogSW5kZXhEZXRhaWxzKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kYldyYXBwZXIudmFsaWRhdGVCZWZvcmVUcmFuc2FjdGlvbihzdG9yZU5hbWUsIHJlamVjdCk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYldyYXBwZXIuY3JlYXRlVHJhbnNhY3Rpb24oe1xuICAgICAgICBzdG9yZU5hbWU6IHN0b3JlTmFtZSxcbiAgICAgICAgZGJNb2RlOiAncmVhZG9ubHknLFxuICAgICAgICBlcnJvcjogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9LFxuICAgICAgICBjb21wbGV0ZTogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3Qgb2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpO1xuICAgICAgY29uc3QgcmVzdWx0OiBBcnJheTxhbnk+ID0gW107XG4gICAgICBsZXQgcmVxdWVzdDogSURCUmVxdWVzdDtcbiAgICAgIGlmIChpbmRleERldGFpbHMpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBvYmplY3RTdG9yZS5pbmRleChpbmRleERldGFpbHMuaW5kZXhOYW1lKSxcbiAgICAgICAgICBvcmRlciA9IChpbmRleERldGFpbHMub3JkZXIgPT09ICdkZXNjJykgPyAncHJldicgOiAnbmV4dCc7XG4gICAgICAgIHJlcXVlc3QgPSBpbmRleC5vcGVuQ3Vyc29yKGtleVJhbmdlLCA8SURCQ3Vyc29yRGlyZWN0aW9uPm9yZGVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcXVlc3QgPSBvYmplY3RTdG9yZS5vcGVuQ3Vyc29yKGtleVJhbmdlKTtcbiAgICAgIH1cblxuICAgICAgcmVxdWVzdC5vbmVycm9yID0gKGUpID0+IHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfTtcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAgKGV2dDogRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgY3Vyc29yOiBhbnkgPSAoPElEQk9wZW5EQlJlcXVlc3Q+ZXZ0LnRhcmdldCkucmVzdWx0O1xuICAgICAgICBpZiAoY3Vyc29yKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goY3Vyc29yLnZhbHVlKTtcbiAgICAgICAgICBjdXJzb3JbJ2NvbnRpbnVlJ10oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBhZGQoc3RvcmVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGtleT86IGFueSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGJXcmFwcGVyLnZhbGlkYXRlQmVmb3JlVHJhbnNhY3Rpb24oc3RvcmVOYW1lLCByZWplY3QpO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGJXcmFwcGVyLmNyZWF0ZVRyYW5zYWN0aW9uKHtcbiAgICAgICAgc3RvcmVOYW1lOiBzdG9yZU5hbWUsXG4gICAgICAgIGRiTW9kZTogJ3JlYWR3cml0ZScsXG4gICAgICAgIGVycm9yOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXBsZXRlOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHsga2V5OiBrZXksIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICAgIG9iamVjdFN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcblxuICAgICAgY29uc3QgcmVxdWVzdCA9IG9iamVjdFN0b3JlLmFkZCh2YWx1ZSwga2V5KTtcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKGV2dDogYW55KSA9PiB7XG4gICAgICAgIGtleSA9IGV2dC50YXJnZXQucmVzdWx0O1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZShzdG9yZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwga2V5PzogYW55KSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kYldyYXBwZXIudmFsaWRhdGVCZWZvcmVUcmFuc2FjdGlvbihzdG9yZU5hbWUsIHJlamVjdCk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYldyYXBwZXIuY3JlYXRlVHJhbnNhY3Rpb24oe1xuICAgICAgICBzdG9yZU5hbWU6IHN0b3JlTmFtZSxcbiAgICAgICAgZGJNb2RlOiAncmVhZHdyaXRlJyxcbiAgICAgICAgZXJyb3I6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSxcbiAgICAgICAgY29tcGxldGU6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBhYm9ydDogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgICAgb2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpO1xuXG4gICAgICBvYmplY3RTdG9yZS5wdXQodmFsdWUsIGtleSk7XG4gICAgfSk7XG4gIH1cblxuICBkZWxldGUoc3RvcmVOYW1lOiBzdHJpbmcsIGtleTogYW55KSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kYldyYXBwZXIudmFsaWRhdGVCZWZvcmVUcmFuc2FjdGlvbihzdG9yZU5hbWUsIHJlamVjdCk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYldyYXBwZXIuY3JlYXRlVHJhbnNhY3Rpb24oe1xuICAgICAgICBzdG9yZU5hbWU6IHN0b3JlTmFtZSxcbiAgICAgICAgZGJNb2RlOiAncmVhZHdyaXRlJyxcbiAgICAgICAgZXJyb3I6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSxcbiAgICAgICAgY29tcGxldGU6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgYWJvcnQ6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICAgIG9iamVjdFN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcblxuICAgICAgb2JqZWN0U3RvcmVbJ2RlbGV0ZSddKGtleSk7XG4gICAgfSk7XG4gIH1cblxuICBvcGVuQ3Vyc29yKHN0b3JlTmFtZTogc3RyaW5nLCBjdXJzb3JDYWxsYmFjazogKGV2dDogRXZlbnQpID0+IHZvaWQsIGtleVJhbmdlPzogSURCS2V5UmFuZ2UpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmRiV3JhcHBlci52YWxpZGF0ZUJlZm9yZVRyYW5zYWN0aW9uKHN0b3JlTmFtZSwgcmVqZWN0KTtcblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRiV3JhcHBlci5jcmVhdGVUcmFuc2FjdGlvbih7XG4gICAgICAgIHN0b3JlTmFtZTogc3RvcmVOYW1lLFxuICAgICAgICBkYk1vZGU6ICdyZWFkb25seScsXG4gICAgICAgIGVycm9yOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXBsZXRlOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGFib3J0OiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgICBvYmplY3RTdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHN0b3JlTmFtZSksXG4gICAgICAgIHJlcXVlc3QgPSBvYmplY3RTdG9yZS5vcGVuQ3Vyc29yKGtleVJhbmdlKTtcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoZXZ0OiBFdmVudCkgPT4ge1xuICAgICAgICBjdXJzb3JDYWxsYmFjayhldnQpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgY2xlYXIoc3RvcmVOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmRiV3JhcHBlci52YWxpZGF0ZUJlZm9yZVRyYW5zYWN0aW9uKHN0b3JlTmFtZSwgcmVqZWN0KTtcblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRiV3JhcHBlci5jcmVhdGVUcmFuc2FjdGlvbih7XG4gICAgICAgIHN0b3JlTmFtZTogc3RvcmVOYW1lLFxuICAgICAgICBkYk1vZGU6ICdyZWFkd3JpdGUnLFxuICAgICAgICBlcnJvcjogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9LFxuICAgICAgICBjb21wbGV0ZTogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9LFxuICAgICAgICBhYm9ydDogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgICAgb2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpO1xuICAgICAgb2JqZWN0U3RvcmUuY2xlYXIoKTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldEJ5SW5kZXgoc3RvcmVOYW1lOiBzdHJpbmcsIGluZGV4TmFtZTogc3RyaW5nLCBrZXk6IGFueSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGJXcmFwcGVyLnZhbGlkYXRlQmVmb3JlVHJhbnNhY3Rpb24oc3RvcmVOYW1lLCByZWplY3QpO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGJXcmFwcGVyLmNyZWF0ZVRyYW5zYWN0aW9uKHtcbiAgICAgICAgc3RvcmVOYW1lOiBzdG9yZU5hbWUsXG4gICAgICAgIGRiTW9kZTogJ3JlYWRvbmx5JyxcbiAgICAgICAgZXJyb3I6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSxcbiAgICAgICAgYWJvcnQ6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSxcbiAgICAgICAgY29tcGxldGU6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgICAgb2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpLFxuICAgICAgICBpbmRleCA9IG9iamVjdFN0b3JlLmluZGV4KGluZGV4TmFtZSksXG4gICAgICAgIHJlcXVlc3QgPSBpbmRleC5nZXQoa2V5KTtcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgcmVzb2x2ZSgoPElEQk9wZW5EQlJlcXVlc3Q+ZXZlbnQudGFyZ2V0KS5yZXN1bHQpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztNQWFhLHFCQUFxQjs7OztJQUNoQyxPQUFPLE9BQU87UUFDWixPQUFPO1lBQ0wsUUFBUSxFQUFFLHFCQUFxQjtZQUMvQixTQUFTLEVBQUUsRUFBRTtTQUNkLENBQUM7S0FDSDs7O1lBWEYsUUFBUSxTQUFDO2dCQUNSLFlBQVksRUFBRSxFQUFFO2dCQUNoQixPQUFPLEVBQUUsRUFBRTtnQkFDWCxPQUFPLEVBQUUsRUFBRTthQUNaOzs7Ozs7O0FDWkQsTUFBYSxTQUFTOzs7OztJQUtsQixZQUFZLE1BQWMsRUFBRSxPQUFlO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxJQUFJLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQztLQUNsQjs7Ozs7SUFFRCxpQkFBaUIsQ0FBQyxTQUFpQjtRQUMvQixPQUFPLElBQUksQ0FB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