ng-storage-local
Version:
An Angular module that makes Web Storage working in the Angular Way
259 lines • 29.4 kB
JavaScript
import { __awaiter } from "tslib";
import { Injectable } from '@angular/core';
import * as i0 from "@angular/core";
export class NgStorage {
/**
@LocalStorage Service
*/
/**
@setLocalStorage
* Set data in local storage
*/
setLocalStorage(options) {
return __awaiter(this, void 0, void 0, function* () {
return yield new Promise((resolve, reject) => {
if (options.storageKey && options.storageType && options.storageData) {
if (options.storageType == "JSON" /* JSON */) {
this.convertJsonToString(options.storageData);
this.saveDataInLocalStorage(options.storageKey, this.convertJsonToString(options.storageData));
}
else if (options.storageType == "STRING" /* STRING */) {
this.saveDataInLocalStorage(options.storageKey, options.storageData);
}
resolve({ error: false, message: "data store successfully" });
}
else {
reject({ error: true, message: "Please check parameters" });
}
});
});
}
/**
@getLocalStorage
* Get data in local storage
*/
getLocalStorage(options) {
return __awaiter(this, void 0, void 0, function* () {
return yield new Promise((resolve, reject) => {
if (window.localStorage.getItem(options.storageKey)) {
if (options.storageType == "JSON" /* JSON */) {
resolve(this.convertStringToJson(window.localStorage.getItem(options.storageKey)));
}
else if (options.storageType == "STRING" /* STRING */) {
resolve(window.localStorage.getItem(options.storageKey));
}
}
else {
reject({ error: true, message: options.storageKey + " No data found" });
}
reject(new TypeError('Something Wrong'));
});
});
}
/**
@removeLocalStorageItem
* Remove data in local storage
*/
removeLocalStorageItem(key) {
return __awaiter(this, void 0, void 0, function* () {
return yield new Promise((resolve, reject) => {
if (key) {
window.localStorage.removeItem(key);
resolve({ error: false, message: key + " removed successfully" });
}
else {
reject({ error: true, message: "Please pass key to remove" });
}
});
});
}
/**
@getLocalStorageLength
* Get total local storage
*/
getLocalStorageLength() {
return __awaiter(this, void 0, void 0, function* () {
return yield new Promise((resolve, reject) => {
if (window.localStorage.length > 0) {
resolve({ error: false, session: window.localStorage.length });
}
else {
reject({ error: true, message: " No local storage stored" });
}
});
});
}
/**
@getLocalStorageAllKey
* Get all local storage KEY list
*/
getLocalStorageAllKey() {
return __awaiter(this, void 0, void 0, function* () {
return yield new Promise((resolve, reject) => {
if (window.localStorage.length > 0) {
let allLocalStorageKeyList = [];
for (let index = 0; index < window.localStorage.length; index++) {
allLocalStorageKeyList.push({
keyIndex: index,
keyName: window.localStorage.key(index)
});
resolve(allLocalStorageKeyList);
}
}
else {
reject({ error: true, message: " No local storage stored" });
}
});
});
}
/* To Clear Local Storage */
clearAllLocalStorage() {
return __awaiter(this, void 0, void 0, function* () {
return yield new Promise((resolve, reject) => {
if (window.localStorage.length > 0) {
window.localStorage.clear();
resolve({ error: false, message: "All local storage are cleared" });
}
else {
reject({ error: true, message: " No local storage stored" });
}
});
});
}
/**
@SessionStorage Service
*/
/**
@setSessionStorage
* Set data in session storage
*/
setSessionStorage(options) {
return __awaiter(this, void 0, void 0, function* () {
return yield new Promise((resolve, reject) => {
if (options.storageKey && options.storageType && options.storageData) {
if (options.storageType == "JSON" /* JSON */) {
this.convertJsonToString(options.storageData);
this.saveDataInSessionStorage(options.storageKey, this.convertJsonToString(options.storageData));
}
else if (options.storageType == "STRING" /* STRING */) {
this.saveDataInSessionStorage(options.storageKey, options.storageData);
}
resolve({ error: false, message: "data store successfully" });
}
else {
reject({ error: true, message: "Please check parameters" });
}
});
});
}
/**
@getSessionStorage
* Get data in session storage
*/
getSessionStorage(options) {
return __awaiter(this, void 0, void 0, function* () {
return yield new Promise((resolve, reject) => {
if (window.sessionStorage.getItem(options.storageKey)) {
if (options.storageType == "JSON" /* JSON */) {
resolve(this.convertStringToJson(window.sessionStorage.getItem(options.storageKey)));
}
else if (options.storageType == "STRING" /* STRING */) {
resolve(window.sessionStorage.getItem(options.storageKey));
}
}
else {
reject({ error: true, message: options.storageKey + " No data found" });
}
reject(new TypeError('Something Wrong'));
});
});
}
/**
@getSessionStorageLength
* Get total session storage
*/
getSessionStorageLength() {
return __awaiter(this, void 0, void 0, function* () {
return yield new Promise((resolve, reject) => {
if (window.sessionStorage.length > 0) {
resolve({ error: false, session: window.sessionStorage.length });
}
else {
reject({ error: true, message: " No session stored" });
}
});
});
}
/**
@getSessionStorageAllKey
* Get all session storage KEY list
*/
getSessionStorageAllKey() {
return __awaiter(this, void 0, void 0, function* () {
return yield new Promise((resolve, reject) => {
if (window.sessionStorage.length > 0) {
let allSessionStorageKeyList = [];
for (let index = 0; index < window.sessionStorage.length; index++) {
allSessionStorageKeyList.push({
keyIndex: index,
keyName: window.sessionStorage.key(index)
});
resolve(allSessionStorageKeyList);
}
}
else {
reject({ error: true, message: " No session storage stored" });
}
});
});
}
/**
@removeLocalStorageItem
* Remove data in local storage
*/
removeSessionStorageItem(key) {
return __awaiter(this, void 0, void 0, function* () {
return yield new Promise((resolve, reject) => {
if (key) {
window.sessionStorage.removeItem(key);
resolve({ error: false, message: key + " removed successfully" });
}
else {
reject({ error: true, message: "Please pass key to remove" });
}
});
});
}
clearAllSessionStorage() {
return __awaiter(this, void 0, void 0, function* () {
return yield new Promise((resolve, reject) => {
if (window.sessionStorage.length > 0) {
window.sessionStorage.clear();
resolve({ error: false, message: "All session storage are cleared" });
}
else {
reject({ error: true, message: " No session storage stored" });
}
});
});
}
convertJsonToString(json) {
return JSON.stringify(json);
}
convertStringToJson(stringData) {
return JSON.parse(stringData);
}
saveDataInLocalStorage(storageName, storageData) {
window.localStorage.setItem(storageName, storageData);
}
saveDataInSessionStorage(storageName, storageData) {
window.sessionStorage.setItem(storageName, storageData);
}
}
NgStorage.ɵprov = i0.ɵɵdefineInjectable({ factory: function NgStorage_Factory() { return new NgStorage(); }, token: NgStorage, providedIn: "root" });
NgStorage.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uL3Byb2plY3RzL25nLXN0b3JhZ2Uvc3JjLyIsInNvdXJjZXMiOlsibGliL3N0b3JhZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFRM0MsTUFBTSxPQUFPLFNBQVM7SUFFcEI7O09BRUc7SUFHSDs7O01BR0U7SUFDSSxlQUFlLENBQUMsT0FBc0I7O1lBQzFDLE9BQU8sTUFBTSxJQUFJLE9BQU8sQ0FBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFDaEQsSUFBSSxPQUFPLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxXQUFXLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRTtvQkFDcEUsSUFBSSxPQUFPLENBQUMsV0FBVyxxQkFBd0IsRUFBRTt3QkFDL0MsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQzt3QkFDOUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFBO3FCQUMvRjt5QkFDSSxJQUFJLE9BQU8sQ0FBQyxXQUFXLHlCQUEwQixFQUFFO3dCQUN0RCxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7cUJBQ3RFO29CQUNELE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLENBQUMsQ0FBQztpQkFDL0Q7cUJBQ0k7b0JBQ0gsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsQ0FBQyxDQUFDO2lCQUM3RDtZQUVILENBQUMsQ0FBQyxDQUFDO1FB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OUIsQ0FBQztJQUVPLG1CQUFtQixDQUFDLFVBQVU7UUFDcEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsV0FBVztRQUNyRCxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDdkQsQ0FBQztJQUVPLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxXQUFXO1FBQ3ZELE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUN6RCxDQUFDOzs7O1lBL1BGLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEdldFN0b3JhZ2VDb25mbGlnLCBTdG9yYWdlQ29uZmlnLCBTdG9yYWdlVHlwZVVuaXQgfSBmcm9tICcuL3N0b3JhZ2VNb2RlbFBlcm1UeXBlJztcblxuXG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIE5nU3RvcmFnZSB7XG5cbiAgLyoqXG4gICBATG9jYWxTdG9yYWdlIFNlcnZpY2VcbiAgICovXG5cblxuICAvKipcbiAgQHNldExvY2FsU3RvcmFnZVxuICAqIFNldCBkYXRhIGluIGxvY2FsIHN0b3JhZ2VcbiAgKi9cbiAgYXN5bmMgc2V0TG9jYWxTdG9yYWdlKG9wdGlvbnM6IFN0b3JhZ2VDb25maWcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmIChvcHRpb25zLnN0b3JhZ2VLZXkgJiYgb3B0aW9ucy5zdG9yYWdlVHlwZSAmJiBvcHRpb25zLnN0b3JhZ2VEYXRhKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnN0b3JhZ2VUeXBlID09IFN0b3JhZ2VUeXBlVW5pdC5KU09OKSB7XG4gICAgICAgICAgdGhpcy5jb252ZXJ0SnNvblRvU3RyaW5nKG9wdGlvbnMuc3RvcmFnZURhdGEpO1xuICAgICAgICAgIHRoaXMuc2F2ZURhdGFJbkxvY2FsU3RvcmFnZShvcHRpb25zLnN0b3JhZ2VLZXksIHRoaXMuY29udmVydEpzb25Ub1N0cmluZyhvcHRpb25zLnN0b3JhZ2VEYXRhKSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvcHRpb25zLnN0b3JhZ2VUeXBlID09IFN0b3JhZ2VUeXBlVW5pdC5TVFJJTkcpIHtcbiAgICAgICAgICB0aGlzLnNhdmVEYXRhSW5Mb2NhbFN0b3JhZ2Uob3B0aW9ucy5zdG9yYWdlS2V5LCBvcHRpb25zLnN0b3JhZ2VEYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHsgZXJyb3I6IGZhbHNlLCBtZXNzYWdlOiBcImRhdGEgc3RvcmUgc3VjY2Vzc2Z1bGx5XCIgfSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmVqZWN0KHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6IFwiUGxlYXNlIGNoZWNrIHBhcmFtZXRlcnNcIiB9KTtcbiAgICAgIH1cblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gIEBnZXRMb2NhbFN0b3JhZ2VcbiAgKiBHZXQgZGF0YSBpbiBsb2NhbCBzdG9yYWdlXG4gICovXG4gIGFzeW5jIGdldExvY2FsU3RvcmFnZShvcHRpb25zOiBHZXRTdG9yYWdlQ29uZmxpZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0ob3B0aW9ucy5zdG9yYWdlS2V5KSkge1xuICAgICAgICBpZiAob3B0aW9ucy5zdG9yYWdlVHlwZSA9PSBTdG9yYWdlVHlwZVVuaXQuSlNPTikge1xuICAgICAgICAgIHJlc29sdmUodGhpcy5jb252ZXJ0U3RyaW5nVG9Kc29uKHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShvcHRpb25zLnN0b3JhZ2VLZXkpKSlcbiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnN0b3JhZ2VUeXBlID09IFN0b3JhZ2VUeXBlVW5pdC5TVFJJTkcpIHtcbiAgICAgICAgICByZXNvbHZlKHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShvcHRpb25zLnN0b3JhZ2VLZXkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJlamVjdCh7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiBvcHRpb25zLnN0b3JhZ2VLZXkgKyBcIiBObyBkYXRhIGZvdW5kXCIgfSk7XG4gICAgICB9XG4gICAgICByZWplY3QobmV3IFR5cGVFcnJvcignU29tZXRoaW5nIFdyb25nJykpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gIEByZW1vdmVMb2NhbFN0b3JhZ2VJdGVtXG4gICogUmVtb3ZlIGRhdGEgaW4gbG9jYWwgc3RvcmFnZVxuICAqL1xuICBhc3luYyByZW1vdmVMb2NhbFN0b3JhZ2VJdGVtKGtleTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKGtleSkge1xuICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgcmVzb2x2ZSh7IGVycm9yOiBmYWxzZSwgbWVzc2FnZToga2V5ICsgXCIgcmVtb3ZlZCBzdWNjZXNzZnVsbHlcIiB9KTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICByZWplY3QoeyBlcnJvcjogdHJ1ZSwgbWVzc2FnZTogXCJQbGVhc2UgcGFzcyBrZXkgdG8gcmVtb3ZlXCIgfSk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICBAZ2V0TG9jYWxTdG9yYWdlTGVuZ3RoXG4gICogR2V0IHRvdGFsIGxvY2FsIHN0b3JhZ2VcbiAgKi9cbiAgYXN5bmMgZ2V0TG9jYWxTdG9yYWdlTGVuZ3RoKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh3aW5kb3cubG9jYWxTdG9yYWdlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzb2x2ZSh7IGVycm9yOiBmYWxzZSwgc2Vzc2lvbjogd2luZG93LmxvY2FsU3RvcmFnZS5sZW5ndGggfSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmVqZWN0KHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6IFwiIE5vIGxvY2FsIHN0b3JhZ2Ugc3RvcmVkXCIgfSk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICBAZ2V0TG9jYWxTdG9yYWdlQWxsS2V5XG4gICogR2V0IGFsbCBsb2NhbCBzdG9yYWdlIEtFWSBsaXN0XG4gICovXG4gIGFzeW5jIGdldExvY2FsU3RvcmFnZUFsbEtleSgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAod2luZG93LmxvY2FsU3RvcmFnZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCBhbGxMb2NhbFN0b3JhZ2VLZXlMaXN0OiBBcnJheTx7IGtleU5hbWU6IHN0cmluZywga2V5SW5kZXg6IG51bWJlciB9PiA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgd2luZG93LmxvY2FsU3RvcmFnZS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBhbGxMb2NhbFN0b3JhZ2VLZXlMaXN0LnB1c2goe1xuICAgICAgICAgICAga2V5SW5kZXg6IGluZGV4LFxuICAgICAgICAgICAga2V5TmFtZTogd2luZG93LmxvY2FsU3RvcmFnZS5rZXkoaW5kZXgpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzb2x2ZShhbGxMb2NhbFN0b3JhZ2VLZXlMaXN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJlamVjdCh7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiBcIiBObyBsb2NhbCBzdG9yYWdlIHN0b3JlZFwiIH0pO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKiBUbyBDbGVhciBMb2NhbCBTdG9yYWdlICovXG4gIGFzeW5jIGNsZWFyQWxsTG9jYWxTdG9yYWdlKCkge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAod2luZG93LmxvY2FsU3RvcmFnZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UuY2xlYXIoKVxuICAgICAgICByZXNvbHZlKHsgZXJyb3I6IGZhbHNlLCBtZXNzYWdlOiBcIkFsbCBsb2NhbCBzdG9yYWdlIGFyZSBjbGVhcmVkXCIgfSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmVqZWN0KHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6IFwiIE5vIGxvY2FsIHN0b3JhZ2Ugc3RvcmVkXCIgfSk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG5cblxuICAvKipcbiAgICAgQFNlc3Npb25TdG9yYWdlIFNlcnZpY2VcbiAgKi9cblxuXG4gIC8qKlxuICBAc2V0U2Vzc2lvblN0b3JhZ2VcbiAgKiBTZXQgZGF0YSBpbiBzZXNzaW9uIHN0b3JhZ2VcbiAgKi9cbiAgYXN5bmMgc2V0U2Vzc2lvblN0b3JhZ2Uob3B0aW9uczogU3RvcmFnZUNvbmZpZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKG9wdGlvbnMuc3RvcmFnZUtleSAmJiBvcHRpb25zLnN0b3JhZ2VUeXBlICYmIG9wdGlvbnMuc3RvcmFnZURhdGEpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuc3RvcmFnZVR5cGUgPT0gU3RvcmFnZVR5cGVVbml0LkpTT04pIHtcbiAgICAgICAgICB0aGlzLmNvbnZlcnRKc29uVG9TdHJpbmcob3B0aW9ucy5zdG9yYWdlRGF0YSk7XG4gICAgICAgICAgdGhpcy5zYXZlRGF0YUluU2Vzc2lvblN0b3JhZ2Uob3B0aW9ucy5zdG9yYWdlS2V5LCB0aGlzLmNvbnZlcnRKc29uVG9TdHJpbmcob3B0aW9ucy5zdG9yYWdlRGF0YSkpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5zdG9yYWdlVHlwZSA9PSBTdG9yYWdlVHlwZVVuaXQuU1RSSU5HKSB7XG4gICAgICAgICAgdGhpcy5zYXZlRGF0YUluU2Vzc2lvblN0b3JhZ2Uob3B0aW9ucy5zdG9yYWdlS2V5LCBvcHRpb25zLnN0b3JhZ2VEYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHsgZXJyb3I6IGZhbHNlLCBtZXNzYWdlOiBcImRhdGEgc3RvcmUgc3VjY2Vzc2Z1bGx5XCIgfSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmVqZWN0KHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6IFwiUGxlYXNlIGNoZWNrIHBhcmFtZXRlcnNcIiB9KTtcbiAgICAgIH1cblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gIEBnZXRTZXNzaW9uU3RvcmFnZVxuICAqIEdldCBkYXRhIGluIHNlc3Npb24gc3RvcmFnZVxuICAqL1xuICBhc3luYyBnZXRTZXNzaW9uU3RvcmFnZShvcHRpb25zOiBHZXRTdG9yYWdlQ29uZmxpZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShvcHRpb25zLnN0b3JhZ2VLZXkpKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnN0b3JhZ2VUeXBlID09IFN0b3JhZ2VUeXBlVW5pdC5KU09OKSB7XG4gICAgICAgICAgcmVzb2x2ZSh0aGlzLmNvbnZlcnRTdHJpbmdUb0pzb24od2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0ob3B0aW9ucy5zdG9yYWdlS2V5KSkpXG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5zdG9yYWdlVHlwZSA9PSBTdG9yYWdlVHlwZVVuaXQuU1RSSU5HKSB7XG4gICAgICAgICAgcmVzb2x2ZSh3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShvcHRpb25zLnN0b3JhZ2VLZXkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJlamVjdCh7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiBvcHRpb25zLnN0b3JhZ2VLZXkgKyBcIiBObyBkYXRhIGZvdW5kXCIgfSk7XG4gICAgICB9XG4gICAgICByZWplY3QobmV3IFR5cGVFcnJvcignU29tZXRoaW5nIFdyb25nJykpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gIEBnZXRTZXNzaW9uU3RvcmFnZUxlbmd0aFxuICAqIEdldCB0b3RhbCBzZXNzaW9uIHN0b3JhZ2VcbiAgKi9cbiAgYXN5bmMgZ2V0U2Vzc2lvblN0b3JhZ2VMZW5ndGgoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc29sdmUoeyBlcnJvcjogZmFsc2UsIHNlc3Npb246IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5sZW5ndGggfSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmVqZWN0KHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6IFwiIE5vIHNlc3Npb24gc3RvcmVkXCIgfSk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICBAZ2V0U2Vzc2lvblN0b3JhZ2VBbGxLZXlcbiAgKiBHZXQgYWxsIHNlc3Npb24gc3RvcmFnZSBLRVkgbGlzdFxuICAqL1xuICBhc3luYyBnZXRTZXNzaW9uU3RvcmFnZUFsbEtleSgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAod2luZG93LnNlc3Npb25TdG9yYWdlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IGFsbFNlc3Npb25TdG9yYWdlS2V5TGlzdDogQXJyYXk8eyBrZXlOYW1lOiBzdHJpbmcsIGtleUluZGV4OiBudW1iZXIgfT4gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBhbGxTZXNzaW9uU3RvcmFnZUtleUxpc3QucHVzaCh7XG4gICAgICAgICAgICBrZXlJbmRleDogaW5kZXgsXG4gICAgICAgICAgICBrZXlOYW1lOiB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uua2V5KGluZGV4KVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlc29sdmUoYWxsU2Vzc2lvblN0b3JhZ2VLZXlMaXN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJlamVjdCh7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiBcIiBObyBzZXNzaW9uIHN0b3JhZ2Ugc3RvcmVkXCIgfSk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuICBcbiAgLyoqXG4gIEByZW1vdmVMb2NhbFN0b3JhZ2VJdGVtXG4gICogUmVtb3ZlIGRhdGEgaW4gbG9jYWwgc3RvcmFnZVxuICAqL1xuICBhc3luYyByZW1vdmVTZXNzaW9uU3RvcmFnZUl0ZW0oa2V5OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICAgIHJlc29sdmUoeyBlcnJvcjogZmFsc2UsIG1lc3NhZ2U6IGtleSArIFwiIHJlbW92ZWQgc3VjY2Vzc2Z1bGx5XCIgfSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmVqZWN0KHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6IFwiUGxlYXNlIHBhc3Mga2V5IHRvIHJlbW92ZVwiIH0pO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuXG5cbiAgYXN5bmMgY2xlYXJBbGxTZXNzaW9uU3RvcmFnZSgpIHtcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5jbGVhcigpO1xuICAgICAgICByZXNvbHZlKHsgZXJyb3I6IGZhbHNlLCBtZXNzYWdlOiBcIkFsbCBzZXNzaW9uIHN0b3JhZ2UgYXJlIGNsZWFyZWRcIiB9KTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICByZWplY3QoeyBlcnJvcjogdHJ1ZSwgbWVzc2FnZTogXCIgTm8gc2Vzc2lvbiBzdG9yYWdlIHN0b3JlZFwiIH0pO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuXG5cblxuXG5cbiAgcHJpdmF0ZSBjb252ZXJ0SnNvblRvU3RyaW5nKGpzb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShqc29uKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFN0cmluZ1RvSnNvbihzdHJpbmdEYXRhKTogSlNPTiB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyaW5nRGF0YSk7XG4gIH1cblxuICBwcml2YXRlIHNhdmVEYXRhSW5Mb2NhbFN0b3JhZ2Uoc3RvcmFnZU5hbWUsIHN0b3JhZ2VEYXRhKSB7XG4gICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKHN0b3JhZ2VOYW1lLCBzdG9yYWdlRGF0YSlcbiAgfVxuXG4gIHByaXZhdGUgc2F2ZURhdGFJblNlc3Npb25TdG9yYWdlKHN0b3JhZ2VOYW1lLCBzdG9yYWdlRGF0YSkge1xuICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHN0b3JhZ2VOYW1lLCBzdG9yYWdlRGF0YSlcbiAgfVxuXG59XG4iXX0=