@pointerstack/ngx-cookie-storage
Version:
An Angular cookie service
401 lines (395 loc) • 27.8 kB
JavaScript
import { Injectable, Inject, NgModule, defineInjectable, inject } from '@angular/core';
import { DOCUMENT } from '@angular/common';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var NgxCookieStorageService = /** @class */ (function () {
function NgxCookieStorageService(
// The type `Document` may not be used here. Although a fix is on its way,
// we will go with `any` for now to support Angular 2.4.x projects.
// Issue: https://github.com/angular/angular/issues/12631
// Fix: https://github.com/angular/angular/pull/14894
document) {
this.document = document;
// To avoid issues with server side prerendering, check if `document` is defined.
this.documentIsAccessible = document !== undefined;
}
/**
* PARSER
*
* Function to parse document.cookie string and extract
* cookiename:value pairs.
* @return {?}
*/
NgxCookieStorageService.prototype.parser = /**
* PARSER
*
* Function to parse document.cookie string and extract
* cookiename:value pairs.
* @return {?}
*/
function () {
if (!this.documentIsAccessible) {
return {};
}
/** @type {?} */
var cookies = {};
/** @type {?} */
var document = this.document;
if (document.cookie && document.cookie !== '') {
/** @type {?} */
var split = document.cookie.split(';');
for (var i = 0; i < split.length; i += 1) {
/** @type {?} */
var currentCookie = split[i].split('=');
currentCookie[0] = currentCookie[0].replace(/^ /, '');
cookies[decodeURIComponent(currentCookie[0])] = decodeURIComponent(currentCookie[1]);
}
}
return cookies;
};
/**
* GET
*
* Function to get value from cookie
*
* @param {?} name Cookie Name
* @param {?=} parsedCookie Parsed Cookie
* @return {?}
*/
NgxCookieStorageService.prototype.get = /**
* GET
*
* Function to get value from cookie
*
* @param {?} name Cookie Name
* @param {?=} parsedCookie Parsed Cookie
* @return {?}
*/
function (name, parsedCookie) {
if (!parsedCookie) {
parsedCookie = this.parser();
}
return parsedCookie[name];
};
/**
* GETALL
*
* Function to get all stored cookie.
* @return {?}
*/
NgxCookieStorageService.prototype.getAll = /**
* GETALL
*
* Function to get all stored cookie.
* @return {?}
*/
function () {
return this.parser();
};
/**
* GET-ASYNC
*
* Function to get cookie value as promise.
*
* @param {?} name {string}
* @return {?}
*/
NgxCookieStorageService.prototype.getAsync = /**
* GET-ASYNC
*
* Function to get cookie value as promise.
*
* @param {?} name {string}
* @return {?}
*/
function (name) {
var _this = this;
/** @type {?} */
var _getAsyncPromiseCb = function (resolve, reject) {
if (!_this.documentIsAccessible) {
return reject(new Error("document.cookie is not accessible"));
}
return resolve(_this.get(name));
};
return new Promise(_getAsyncPromiseCb);
};
/**
* GETALL-ASYNC
*
* Function to get all stored cookie value as promise.
*
* @return {?}
*/
NgxCookieStorageService.prototype.getAllAsync = /**
* GETALL-ASYNC
*
* Function to get all stored cookie value as promise.
*
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var _getAsyncPromiseCb = function (resolve, reject) {
if (!_this.documentIsAccessible) {
return reject(new Error("document.cookie is not accessible"));
}
return resolve(_this.getAll());
};
return new Promise(_getAsyncPromiseCb);
};
/**
* SET
*
* Function to set cookie
*
* @param {?} name Cookie name
* @param {?} value Cookie value
* @param {?=} expires Number of days until the cookies expires or an actual `Date`
* @param {?=} path Cookie path
* @param {?=} domain Cookie domain
* @param {?=} secure Secure flag
* @return {?}
*/
NgxCookieStorageService.prototype.set = /**
* SET
*
* Function to set cookie
*
* @param {?} name Cookie name
* @param {?} value Cookie value
* @param {?=} expires Number of days until the cookies expires or an actual `Date`
* @param {?=} path Cookie path
* @param {?=} domain Cookie domain
* @param {?=} secure Secure flag
* @return {?}
*/
function (name, value, expires, path, domain, secure) {
if (!this.documentIsAccessible) {
return;
}
/** @type {?} */
var cookieString = encodeURIComponent(name) + '=' + encodeURIComponent(value) + ';';
if (expires) {
if (typeof expires === 'number') {
/** @type {?} */
var dateExpires = new Date(new Date().getTime() + expires * 1000 * 60 * 60 * 24);
cookieString += 'expires=' + dateExpires.toUTCString() + ';';
}
else {
cookieString += 'expires=' + expires.toUTCString() + ';';
}
}
if (path) {
cookieString += 'path=' + path + ';';
}
if (domain) {
cookieString += 'domain=' + domain + ';';
}
if (secure) {
cookieString += 'secure;';
}
this.document.cookie = cookieString;
};
/**
* SET-ASYNC
*
* Function to set cookie asynchronously.
*
* @param {?} name
* @param {?} value
* @param {?=} expires
* @param {?=} path
* @param {?=} domain
* @param {?=} secure
* @return {?}
*/
NgxCookieStorageService.prototype.setAsync = /**
* SET-ASYNC
*
* Function to set cookie asynchronously.
*
* @param {?} name
* @param {?} value
* @param {?=} expires
* @param {?=} path
* @param {?=} domain
* @param {?=} secure
* @return {?}
*/
function (name, value, expires, path, domain, secure) {
var _this = this;
/** @type {?} */
var _setAsync = function (resolve, reject) {
if (!_this.documentIsAccessible) {
return reject(new Error("document.cookie is not accessible"));
}
_this.set(name, value, expires, path, domain, secure);
setTimeout(function () {
return resolve();
}, 50);
};
return new Promise(_setAsync);
};
/**
* DELETE
*
* Function to delete a cookie
*
* @param {?} name Cookie name
* @param {?=} path Cookie path
* @param {?=} domain Cookie domain
* @return {?}
*/
NgxCookieStorageService.prototype.delete = /**
* DELETE
*
* Function to delete a cookie
*
* @param {?} name Cookie name
* @param {?=} path Cookie path
* @param {?=} domain Cookie domain
* @return {?}
*/
function (name, path, domain) {
if (!this.documentIsAccessible) {
return;
}
this.set(name, '', new Date(new Date().getTime() - 1000), path, domain);
};
/**
* DELETEALL
*
* Function to delete all cookie
*
* @param {?=} path Cookie path
* @param {?=} domain Cookie domain
* @return {?}
*/
NgxCookieStorageService.prototype.deleteAll = /**
* DELETEALL
*
* Function to delete all cookie
*
* @param {?=} path Cookie path
* @param {?=} domain Cookie domain
* @return {?}
*/
function (path, domain) {
if (!this.documentIsAccessible) {
return;
}
/** @type {?} */
var cookies = this.getAll();
for (var cookieName in cookies) {
if (cookies.hasOwnProperty(cookieName)) {
this.delete(cookieName, path, domain);
}
}
};
/**
* DELETE-ASYNC
*
* Function to delete a cookie asynchronously.
*
* @param {?} name Cookie name
* @param {?=} path Cookie path
* @param {?=} domain Cookie domain
* @return {?}
*/
NgxCookieStorageService.prototype.deleteAsync = /**
* DELETE-ASYNC
*
* Function to delete a cookie asynchronously.
*
* @param {?} name Cookie name
* @param {?=} path Cookie path
* @param {?=} domain Cookie domain
* @return {?}
*/
function (name, path, domain) {
var _this = this;
/** @type {?} */
var _deleteAsyncPromiseCb = function (resolve, reject) {
if (!_this.documentIsAccessible) {
return reject(new Error("document.cookie is not accessible"));
}
_this.delete(name, path, domain);
setTimeout(function () {
return resolve();
}, 50);
};
return new Promise(_deleteAsyncPromiseCb);
};
/**
* DELETEALL-ASYNC
*
* Function to delete all cookie asynchronously.
*
* @param {?=} path Cookie path
* @param {?=} domain Cookie domain
* @return {?}
*/
NgxCookieStorageService.prototype.deleteAllAsync = /**
* DELETEALL-ASYNC
*
* Function to delete all cookie asynchronously.
*
* @param {?=} path Cookie path
* @param {?=} domain Cookie domain
* @return {?}
*/
function (path, domain) {
var _this = this;
/** @type {?} */
var _deleteAllAsyncPromiseCb = function (resolve, reject) {
if (!_this.documentIsAccessible) {
return reject(new Error("document.cookie is not accessible"));
}
_this.deleteAll(path, domain);
setTimeout(function () {
return resolve();
}, 50);
};
return new Promise(_deleteAllAsyncPromiseCb);
};
NgxCookieStorageService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
NgxCookieStorageService.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
]; };
/** @nocollapse */ NgxCookieStorageService.ngInjectableDef = defineInjectable({ factory: function NgxCookieStorageService_Factory() { return new NgxCookieStorageService(inject(DOCUMENT)); }, token: NgxCookieStorageService, providedIn: "root" });
return NgxCookieStorageService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var NgxCookieStorageModule = /** @class */ (function () {
function NgxCookieStorageModule() {
}
NgxCookieStorageModule.decorators = [
{ type: NgModule, args: [{
imports: [],
declarations: [],
exports: []
},] }
];
return NgxCookieStorageModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
export { NgxCookieStorageService, NgxCookieStorageModule };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9pbnRlcnN0YWNrLW5neC1jb29raWUtc3RvcmFnZS5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vQHBvaW50ZXJzdGFjay9uZ3gtY29va2llLXN0b3JhZ2UvbGliL25neC1jb29raWUtc3RvcmFnZS5zZXJ2aWNlLnRzIiwibmc6Ly9AcG9pbnRlcnN0YWNrL25neC1jb29raWUtc3RvcmFnZS9saWIvbmd4LWNvb2tpZS1zdG9yYWdlLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBOT1RFOiBcbi8vIE1hbnkgb2YgZm9sbG93aW5nIGNvZGUgYXJlIGluc3BpcmVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tLzdsZWFkcy9uZ3gtY29va2llLXNlcnZpY2Vcbi8vIFRoYW5rcyB0byA3bGVhZHMgR21iSCBUZWFtLlxuLy9cbmltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBOZ3hDb29raWVTdG9yYWdlU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBkb2N1bWVudElzQWNjZXNzaWJsZTogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAvLyBUaGUgdHlwZSBgRG9jdW1lbnRgIG1heSBub3QgYmUgdXNlZCBoZXJlLiBBbHRob3VnaCBhIGZpeCBpcyBvbiBpdHMgd2F5LFxuICAgIC8vIHdlIHdpbGwgZ28gd2l0aCBgYW55YCBmb3Igbm93IHRvIHN1cHBvcnQgQW5ndWxhciAyLjQueCBwcm9qZWN0cy5cbiAgICAvLyBJc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTI2MzFcbiAgICAvLyBGaXg6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcHVsbC8xNDg5NFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IGFueVxuICApIHtcbiAgICAvLyBUbyBhdm9pZCBpc3N1ZXMgd2l0aCBzZXJ2ZXIgc2lkZSBwcmVyZW5kZXJpbmcsIGNoZWNrIGlmIGBkb2N1bWVudGAgaXMgZGVmaW5lZC5cbiAgICB0aGlzLmRvY3VtZW50SXNBY2Nlc3NpYmxlID0gZG9jdW1lbnQgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFBBUlNFUlxuICAgKiBcbiAgICogRnVuY3Rpb24gdG8gcGFyc2UgZG9jdW1lbnQuY29va2llIHN0cmluZyBhbmQgZXh0cmFjdFxuICAgKiBjb29raWVuYW1lOnZhbHVlIHBhaXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZXIoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuZG9jdW1lbnRJc0FjY2Vzc2libGUpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgY29va2llczoge30gPSB7fTtcbiAgICBjb25zdCBkb2N1bWVudDogYW55ID0gdGhpcy5kb2N1bWVudDtcbiAgICBpZiAoZG9jdW1lbnQuY29va2llICYmIGRvY3VtZW50LmNvb2tpZSAhPT0gJycpIHtcbiAgICAgIGNvbnN0IHNwbGl0OiBBcnJheTxzdHJpbmc+ID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb29raWU6IEFycmF5PHN0cmluZz4gPSBzcGxpdFtpXS5zcGxpdCgnPScpO1xuICAgICAgICBjdXJyZW50Q29va2llWzBdID0gY3VycmVudENvb2tpZVswXS5yZXBsYWNlKC9eIC8sICcnKTtcbiAgICAgICAgY29va2llc1tkZWNvZGVVUklDb21wb25lbnQoY3VycmVudENvb2tpZVswXSldID0gZGVjb2RlVVJJQ29tcG9uZW50KGN1cnJlbnRDb29raWVbMV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29va2llcztcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdFVFxuICAgKiBcbiAgICogRnVuY3Rpb24gdG8gZ2V0IHZhbHVlIGZyb20gY29va2llXG4gICAqIFxuICAgKiBAcGFyYW0gbmFtZSBDb29raWUgTmFtZVxuICAgKiBAcGFyYW0gcGFyc2VkQ29va2llIFBhcnNlZCBDb29raWVcbiAgICovXG4gIHB1YmxpYyBnZXQobmFtZTogc3RyaW5nLCBwYXJzZWRDb29raWU/OiB7fSk6IHZvaWQgfCBzdHJpbmcge1xuICAgIGlmICghcGFyc2VkQ29va2llKSB7XG4gICAgICBwYXJzZWRDb29raWUgPSB0aGlzLnBhcnNlcigpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkQ29va2llW25hbWVdO1xuICB9XG5cblxuICAvKipcbiAgICogR0VUQUxMXG4gICAqIFxuICAgKiBGdW5jdGlvbiB0byBnZXQgYWxsIHN0b3JlZCBjb29raWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0QWxsKCk6IHZvaWQgfCB7fSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyKCk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBHRVQtQVNZTkNcbiAgICogXG4gICAqIEZ1bmN0aW9uIHRvIGdldCBjb29raWUgdmFsdWUgYXMgcHJvbWlzZS5cbiAgICogXG4gICAqIEBwYXJhbSBuYW1lIHtzdHJpbmd9XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgZ2V0QXN5bmMobmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkIHwgc3RyaW5nIHwgRXJyb3I+IHtcbiAgICBjb25zdCBfZ2V0QXN5bmNQcm9taXNlQ2IgPSAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZG9jdW1lbnRJc0FjY2Vzc2libGUpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYGRvY3VtZW50LmNvb2tpZSBpcyBub3QgYWNjZXNzaWJsZWApKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNvbHZlKHRoaXMuZ2V0KG5hbWUpKTtcbiAgICB9O1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShfZ2V0QXN5bmNQcm9taXNlQ2IpO1xuICB9XG5cblxuICAvKipcbiAgICogR0VUQUxMLUFTWU5DXG4gICAqIFxuICAgKiBGdW5jdGlvbiB0byBnZXQgYWxsIHN0b3JlZCBjb29raWUgdmFsdWUgYXMgcHJvbWlzZS5cbiAgICogXG4gICAqL1xuICBwdWJsaWMgZ2V0QWxsQXN5bmMoKTogUHJvbWlzZTx2b2lkIHwgc3RyaW5nIHwgRXJyb3I+IHtcbiAgICBjb25zdCBfZ2V0QXN5bmNQcm9taXNlQ2IgPSAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZG9jdW1lbnRJc0FjY2Vzc2libGUpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYGRvY3VtZW50LmNvb2tpZSBpcyBub3QgYWNjZXNzaWJsZWApKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNvbHZlKHRoaXMuZ2V0QWxsKCkpO1xuICAgIH07XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKF9nZXRBc3luY1Byb21pc2VDYik7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBTRVRcbiAgICogXG4gICAqIEZ1bmN0aW9uIHRvIHNldCBjb29raWVcbiAgICogXG4gICAqIEBwYXJhbSBuYW1lICAgIENvb2tpZSBuYW1lXG4gICAqIEBwYXJhbSB2YWx1ZSAgIENvb2tpZSB2YWx1ZVxuICAgKiBAcGFyYW0gZXhwaXJlcyBOdW1iZXIgb2YgZGF5cyB1bnRpbCB0aGUgY29va2llcyBleHBpcmVzIG9yIGFuIGFjdHVhbCBgRGF0ZWBcbiAgICogQHBhcmFtIHBhdGggICAgQ29va2llIHBhdGhcbiAgICogQHBhcmFtIGRvbWFpbiAgQ29va2llIGRvbWFpblxuICAgKiBAcGFyYW0gc2VjdXJlICBTZWN1cmUgZmxhZ1xuICAgKi9cbiAgcHVibGljIHNldChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBleHBpcmVzPzogbnVtYmVyIHwgRGF0ZSxcbiAgICBwYXRoPzogc3RyaW5nLFxuICAgIGRvbWFpbj86IHN0cmluZyxcbiAgICBzZWN1cmU/OiBib29sZWFuXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kb2N1bWVudElzQWNjZXNzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBjb29raWVTdHJpbmc6IHN0cmluZyA9IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkgKyAnOyc7XG5cbiAgICBpZiAoZXhwaXJlcykge1xuICAgICAgaWYgKHR5cGVvZiBleHBpcmVzID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25zdCBkYXRlRXhwaXJlczogRGF0ZSA9IG5ldyBEYXRlKG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgZXhwaXJlcyAqIDEwMDAgKiA2MCAqIDYwICogMjQpO1xuXG4gICAgICAgIGNvb2tpZVN0cmluZyArPSAnZXhwaXJlcz0nICsgZGF0ZUV4cGlyZXMudG9VVENTdHJpbmcoKSArICc7JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvb2tpZVN0cmluZyArPSAnZXhwaXJlcz0nICsgZXhwaXJlcy50b1VUQ1N0cmluZygpICsgJzsnO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXRoKSB7XG4gICAgICBjb29raWVTdHJpbmcgKz0gJ3BhdGg9JyArIHBhdGggKyAnOyc7XG4gICAgfVxuXG4gICAgaWYgKGRvbWFpbikge1xuICAgICAgY29va2llU3RyaW5nICs9ICdkb21haW49JyArIGRvbWFpbiArICc7JztcbiAgICB9XG5cbiAgICBpZiAoc2VjdXJlKSB7XG4gICAgICBjb29raWVTdHJpbmcgKz0gJ3NlY3VyZTsnO1xuICAgIH1cblxuICAgIHRoaXMuZG9jdW1lbnQuY29va2llID0gY29va2llU3RyaW5nO1xuICB9XG5cblxuICAvKipcbiAgICogU0VULUFTWU5DXG4gICAqIFxuICAgKiBGdW5jdGlvbiB0byBzZXQgY29va2llIGFzeW5jaHJvbm91c2x5LlxuICAgKiBcbiAgICogQHBhcmFtIG5hbWUgXG4gICAqIEBwYXJhbSB2YWx1ZSBcbiAgICogQHBhcmFtIGV4cGlyZXMgXG4gICAqIEBwYXJhbSBwYXRoIFxuICAgKiBAcGFyYW0gZG9tYWluIFxuICAgKiBAcGFyYW0gc2VjdXJlIFxuICAgKi9cbiAgcHVibGljIHNldEFzeW5jKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIGV4cGlyZXM/OiBudW1iZXIgfCBEYXRlLFxuICAgIHBhdGg/OiBzdHJpbmcsXG4gICAgZG9tYWluPzogc3RyaW5nLFxuICAgIHNlY3VyZT86IGJvb2xlYW5cbiAgKTogUHJvbWlzZTx2b2lkIHwgRXJyb3I+IHtcbiAgICBjb25zdCBfc2V0QXN5bmMgPSAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZG9jdW1lbnRJc0FjY2Vzc2libGUpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYGRvY3VtZW50LmNvb2tpZSBpcyBub3QgYWNjZXNzaWJsZWApKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0KG5hbWUsIHZhbHVlLCBleHBpcmVzLCBwYXRoLCBkb21haW4sIHNlY3VyZSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgIH0sIDUwKTtcbiAgICB9O1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShfc2V0QXN5bmMpO1xuICB9XG5cblxuICAvKipcbiAgICogREVMRVRFXG4gICAqIFxuICAgKiBGdW5jdGlvbiB0byBkZWxldGUgYSBjb29raWVcbiAgICogXG4gICAqIEBwYXJhbSBuYW1lICAgQ29va2llIG5hbWVcbiAgICogQHBhcmFtIHBhdGggICBDb29raWUgcGF0aFxuICAgKiBAcGFyYW0gZG9tYWluIENvb2tpZSBkb21haW5cbiAgICovXG4gIHB1YmxpYyBkZWxldGUobmFtZTogc3RyaW5nLCBwYXRoPzogc3RyaW5nLCBkb21haW4/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZG9jdW1lbnRJc0FjY2Vzc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZXQobmFtZSwgJycsIG5ldyBEYXRlKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gMTAwMCksIHBhdGgsIGRvbWFpbik7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBERUxFVEVBTExcbiAgICogXG4gICAqIEZ1bmN0aW9uIHRvIGRlbGV0ZSBhbGwgY29va2llXG4gICAqIFxuICAgKiBAcGFyYW0gcGF0aCAgIENvb2tpZSBwYXRoXG4gICAqIEBwYXJhbSBkb21haW4gQ29va2llIGRvbWFpblxuICAgKi9cbiAgcHVibGljIGRlbGV0ZUFsbChwYXRoPzogc3RyaW5nLCBkb21haW4/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZG9jdW1lbnRJc0FjY2Vzc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29va2llczogYW55ID0gdGhpcy5nZXRBbGwoKTtcbiAgICBmb3IgKGNvbnN0IGNvb2tpZU5hbWUgaW4gY29va2llcykge1xuICAgICAgaWYgKGNvb2tpZXMuaGFzT3duUHJvcGVydHkoY29va2llTmFtZSkpIHtcbiAgICAgICAgdGhpcy5kZWxldGUoY29va2llTmFtZSwgcGF0aCwgZG9tYWluKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBERUxFVEUtQVNZTkNcbiAgICogXG4gICAqIEZ1bmN0aW9uIHRvIGRlbGV0ZSBhIGNvb2tpZSBhc3luY2hyb25vdXNseS5cbiAgICogXG4gICAqIEBwYXJhbSBuYW1lICAgQ29va2llIG5hbWVcbiAgICogQHBhcmFtIHBhdGggICBDb29raWUgcGF0aFxuICAgKiBAcGFyYW0gZG9tYWluIENvb2tpZSBkb21haW5cbiAgICovXG4gIHB1YmxpYyBkZWxldGVBc3luYyhuYW1lOiBzdHJpbmcsIHBhdGg/OiBzdHJpbmcsIGRvbWFpbj86IHN0cmluZyk6IFByb21pc2U8dm9pZCB8IEVycm9yPiB7XG4gICAgY29uc3QgX2RlbGV0ZUFzeW5jUHJvbWlzZUNiID0gKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmRvY3VtZW50SXNBY2Nlc3NpYmxlKSB7XG4gICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKGBkb2N1bWVudC5jb29raWUgaXMgbm90IGFjY2Vzc2libGVgKSk7XG4gICAgICB9XG4gICAgICB0aGlzLmRlbGV0ZShuYW1lLCBwYXRoLCBkb21haW4pO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICB9LCA1MCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJvbWlzZShfZGVsZXRlQXN5bmNQcm9taXNlQ2IpO1xuICB9XG5cblxuICAvKipcbiAgICogREVMRVRFQUxMLUFTWU5DXG4gICAqIFxuICAgKiBGdW5jdGlvbiB0byBkZWxldGUgYWxsIGNvb2tpZSBhc3luY2hyb25vdXNseS5cbiAgICogXG4gICAqIEBwYXJhbSBwYXRoICAgQ29va2llIHBhdGhcbiAgICogQHBhcmFtIGRvbWFpbiBDb29raWUgZG9tYWluXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlQWxsQXN5bmMocGF0aD86IHN0cmluZywgZG9tYWluPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkIHwgRXJyb3I+IHtcbiAgICBjb25zdCBfZGVsZXRlQWxsQXN5bmNQcm9taXNlQ2IgPSAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZG9jdW1lbnRJc0FjY2Vzc2libGUpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYGRvY3VtZW50LmNvb2tpZSBpcyBub3QgYWNjZXNzaWJsZWApKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGVsZXRlQWxsKHBhdGgsIGRvbWFpbik7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgIH0sIDUwKTtcbiAgICB9O1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShfZGVsZXRlQWxsQXN5bmNQcm9taXNlQ2IpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuLy8gaW1wb3J0IHsgTmd4Q29va2llU3RvcmFnZUNvbXBvbmVudCB9IGZyb20gJy4vbmd4LWNvb2tpZS1zdG9yYWdlLmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gICAgaW1wb3J0czogW1xuICAgIF0sXG4gICAgZGVjbGFyYXRpb25zOiBbXG4gICAgICAgIC8vIE5neENvb2tpZVN0b3JhZ2VDb21wb25lbnRcbiAgICBdLFxuICAgIGV4cG9ydHM6IFtcbiAgICAgICAgLy8gTmd4Q29va2llU3RvcmFnZUNvbXBvbmVudFxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgTmd4Q29va2llU3RvcmFnZU1vZHVsZSB7IH1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBSUE7SUFVRTs7Ozs7SUFLNEIsUUFBYTtRQUFiLGFBQVEsR0FBUixRQUFRLENBQUs7O1FBR3ZDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxRQUFRLEtBQUssU0FBUyxDQUFDO0tBQ3BEOzs7Ozs7OztJQVNPLHdDQUFNOzs7Ozs7OztRQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDOUIsT0FBTyxFQUFFLENBQUM7U0FDWDs7UUFDRCxJQUFNLE9BQU8sR0FBTyxFQUFFLENBQUM7O1FBQ3ZCLElBQU0sUUFBUSxHQUFRLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDcEMsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFOztZQUM3QyxJQUFNLEtBQUssR0FBa0IsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUs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