@pointerstack/ngx-cookie-storage
Version:
An Angular cookie service
411 lines (403 loc) • 30.7 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common')) :
typeof define === 'function' && define.amd ? define('@pointerstack/ngx-cookie-storage', ['exports', '@angular/core', '@angular/common'], factory) :
(factory((global.pointerstack = global.pointerstack || {}, global.pointerstack['ngx-cookie-storage'] = {}),global.ng.core,global.ng.common));
}(this, (function (exports,i0,i1) { 'use strict';
/**
* @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: i0.Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
NgxCookieStorageService.ctorParameters = function () {
return [
{ type: undefined, decorators: [{ type: i0.Inject, args: [i1.DOCUMENT,] }] }
];
};
/** @nocollapse */ NgxCookieStorageService.ngInjectableDef = i0.defineInjectable({ factory: function NgxCookieStorageService_Factory() { return new NgxCookieStorageService(i0.inject(i1.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: i0.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
*/
exports.NgxCookieStorageService = NgxCookieStorageService;
exports.NgxCookieStorageModule = NgxCookieStorageModule;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9pbnRlcnN0YWNrLW5neC1jb29raWUtc3RvcmFnZS51bWQuanMubWFwIiwic291cmNlcyI6WyJuZzovL0Bwb2ludGVyc3RhY2svbmd4LWNvb2tpZS1zdG9yYWdlL2xpYi9uZ3gtY29va2llLXN0b3JhZ2Uuc2VydmljZS50cyIsIm5nOi8vQHBvaW50ZXJzdGFjay9uZ3gtY29va2llLXN0b3JhZ2UvbGliL25neC1jb29raWUtc3RvcmFnZS5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gTk9URTogXG4vLyBNYW55IG9mIGZvbGxvd2luZyBjb2RlIGFyZSBpbnNwaXJlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS83bGVhZHMvbmd4LWNvb2tpZS1zZXJ2aWNlXG4vLyBUaGFua3MgdG8gN2xlYWRzIEdtYkggVGVhbS5cbi8vXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgTmd4Q29va2llU3RvcmFnZVNlcnZpY2Uge1xuXG4gIHByaXZhdGUgZG9jdW1lbnRJc0FjY2Vzc2libGU6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgLy8gVGhlIHR5cGUgYERvY3VtZW50YCBtYXkgbm90IGJlIHVzZWQgaGVyZS4gQWx0aG91Z2ggYSBmaXggaXMgb24gaXRzIHdheSxcbiAgICAvLyB3ZSB3aWxsIGdvIHdpdGggYGFueWAgZm9yIG5vdyB0byBzdXBwb3J0IEFuZ3VsYXIgMi40LnggcHJvamVjdHMuXG4gICAgLy8gSXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzEyNjMxXG4gICAgLy8gRml4OiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL3B1bGwvMTQ4OTRcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBhbnlcbiAgKSB7XG4gICAgLy8gVG8gYXZvaWQgaXNzdWVzIHdpdGggc2VydmVyIHNpZGUgcHJlcmVuZGVyaW5nLCBjaGVjayBpZiBgZG9jdW1lbnRgIGlzIGRlZmluZWQuXG4gICAgdGhpcy5kb2N1bWVudElzQWNjZXNzaWJsZSA9IGRvY3VtZW50ICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBQQVJTRVJcbiAgICogXG4gICAqIEZ1bmN0aW9uIHRvIHBhcnNlIGRvY3VtZW50LmNvb2tpZSBzdHJpbmcgYW5kIGV4dHJhY3RcbiAgICogY29va2llbmFtZTp2YWx1ZSBwYWlycy5cbiAgICovXG4gIHByaXZhdGUgcGFyc2VyKCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLmRvY3VtZW50SXNBY2Nlc3NpYmxlKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IGNvb2tpZXM6IHt9ID0ge307XG4gICAgY29uc3QgZG9jdW1lbnQ6IGFueSA9IHRoaXMuZG9jdW1lbnQ7XG4gICAgaWYgKGRvY3VtZW50LmNvb2tpZSAmJiBkb2N1bWVudC5jb29raWUgIT09ICcnKSB7XG4gICAgICBjb25zdCBzcGxpdDogQXJyYXk8c3RyaW5nPiA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBjdXJyZW50Q29va2llOiBBcnJheTxzdHJpbmc+ID0gc3BsaXRbaV0uc3BsaXQoJz0nKTtcbiAgICAgICAgY3VycmVudENvb2tpZVswXSA9IGN1cnJlbnRDb29raWVbMF0ucmVwbGFjZSgvXiAvLCAnJyk7XG4gICAgICAgIGNvb2tpZXNbZGVjb2RlVVJJQ29tcG9uZW50KGN1cnJlbnRDb29raWVbMF0pXSA9IGRlY29kZVVSSUNvbXBvbmVudChjdXJyZW50Q29va2llWzFdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvb2tpZXM7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBHRVRcbiAgICogXG4gICAqIEZ1bmN0aW9uIHRvIGdldCB2YWx1ZSBmcm9tIGNvb2tpZVxuICAgKiBcbiAgICogQHBhcmFtIG5hbWUgQ29va2llIE5hbWVcbiAgICogQHBhcmFtIHBhcnNlZENvb2tpZSBQYXJzZWQgQ29va2llXG4gICAqL1xuICBwdWJsaWMgZ2V0KG5hbWU6IHN0cmluZywgcGFyc2VkQ29va2llPzoge30pOiB2b2lkIHwgc3RyaW5nIHtcbiAgICBpZiAoIXBhcnNlZENvb2tpZSkge1xuICAgICAgcGFyc2VkQ29va2llID0gdGhpcy5wYXJzZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZENvb2tpZVtuYW1lXTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdFVEFMTFxuICAgKiBcbiAgICogRnVuY3Rpb24gdG8gZ2V0IGFsbCBzdG9yZWQgY29va2llLlxuICAgKi9cbiAgcHVibGljIGdldEFsbCgpOiB2b2lkIHwge30ge1xuICAgIHJldHVybiB0aGlzLnBhcnNlcigpO1xuICB9XG5cblxuICAvKipcbiAgICogR0VULUFTWU5DXG4gICAqIFxuICAgKiBGdW5jdGlvbiB0byBnZXQgY29va2llIHZhbHVlIGFzIHByb21pc2UuXG4gICAqIFxuICAgKiBAcGFyYW0gbmFtZSB7c3RyaW5nfVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIGdldEFzeW5jKG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZCB8IHN0cmluZyB8IEVycm9yPiB7XG4gICAgY29uc3QgX2dldEFzeW5jUHJvbWlzZUNiID0gKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmRvY3VtZW50SXNBY2Nlc3NpYmxlKSB7XG4gICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKGBkb2N1bWVudC5jb29raWUgaXMgbm90IGFjY2Vzc2libGVgKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzb2x2ZSh0aGlzLmdldChuYW1lKSk7XG4gICAgfTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoX2dldEFzeW5jUHJvbWlzZUNiKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdFVEFMTC1BU1lOQ1xuICAgKiBcbiAgICogRnVuY3Rpb24gdG8gZ2V0IGFsbCBzdG9yZWQgY29va2llIHZhbHVlIGFzIHByb21pc2UuXG4gICAqIFxuICAgKi9cbiAgcHVibGljIGdldEFsbEFzeW5jKCk6IFByb21pc2U8dm9pZCB8IHN0cmluZyB8IEVycm9yPiB7XG4gICAgY29uc3QgX2dldEFzeW5jUHJvbWlzZUNiID0gKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmRvY3VtZW50SXNBY2Nlc3NpYmxlKSB7XG4gICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKGBkb2N1bWVudC5jb29raWUgaXMgbm90IGFjY2Vzc2libGVgKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzb2x2ZSh0aGlzLmdldEFsbCgpKTtcbiAgICB9O1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShfZ2V0QXN5bmNQcm9taXNlQ2IpO1xuICB9XG5cblxuICAvKipcbiAgICogU0VUXG4gICAqIFxuICAgKiBGdW5jdGlvbiB0byBzZXQgY29va2llXG4gICAqIFxuICAgKiBAcGFyYW0gbmFtZSAgICBDb29raWUgbmFtZVxuICAgKiBAcGFyYW0gdmFsdWUgICBDb29raWUgdmFsdWVcbiAgICogQHBhcmFtIGV4cGlyZXMgTnVtYmVyIG9mIGRheXMgdW50aWwgdGhlIGNvb2tpZXMgZXhwaXJlcyBvciBhbiBhY3R1YWwgYERhdGVgXG4gICAqIEBwYXJhbSBwYXRoICAgIENvb2tpZSBwYXRoXG4gICAqIEBwYXJhbSBkb21haW4gIENvb2tpZSBkb21haW5cbiAgICogQHBhcmFtIHNlY3VyZSAgU2VjdXJlIGZsYWdcbiAgICovXG4gIHB1YmxpYyBzZXQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgZXhwaXJlcz86IG51bWJlciB8IERhdGUsXG4gICAgcGF0aD86IHN0cmluZyxcbiAgICBkb21haW4/OiBzdHJpbmcsXG4gICAgc2VjdXJlPzogYm9vbGVhblxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZG9jdW1lbnRJc0FjY2Vzc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgY29va2llU3RyaW5nOiBzdHJpbmcgPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpICsgJzsnO1xuXG4gICAgaWYgKGV4cGlyZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgZXhwaXJlcyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uc3QgZGF0ZUV4cGlyZXM6IERhdGUgPSBuZXcgRGF0ZShuZXcgRGF0ZSgpLmdldFRpbWUoKSArIGV4cGlyZXMgKiAxMDAwICogNjAgKiA2MCAqIDI0KTtcblxuICAgICAgICBjb29raWVTdHJpbmcgKz0gJ2V4cGlyZXM9JyArIGRhdGVFeHBpcmVzLnRvVVRDU3RyaW5nKCkgKyAnOyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb29raWVTdHJpbmcgKz0gJ2V4cGlyZXM9JyArIGV4cGlyZXMudG9VVENTdHJpbmcoKSArICc7JztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGF0aCkge1xuICAgICAgY29va2llU3RyaW5nICs9ICdwYXRoPScgKyBwYXRoICsgJzsnO1xuICAgIH1cblxuICAgIGlmIChkb21haW4pIHtcbiAgICAgIGNvb2tpZVN0cmluZyArPSAnZG9tYWluPScgKyBkb21haW4gKyAnOyc7XG4gICAgfVxuXG4gICAgaWYgKHNlY3VyZSkge1xuICAgICAgY29va2llU3RyaW5nICs9ICdzZWN1cmU7JztcbiAgICB9XG5cbiAgICB0aGlzLmRvY3VtZW50LmNvb2tpZSA9IGNvb2tpZVN0cmluZztcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFNFVC1BU1lOQ1xuICAgKiBcbiAgICogRnVuY3Rpb24gdG8gc2V0IGNvb2tpZSBhc3luY2hyb25vdXNseS5cbiAgICogXG4gICAqIEBwYXJhbSBuYW1lIFxuICAgKiBAcGFyYW0gdmFsdWUgXG4gICAqIEBwYXJhbSBleHBpcmVzIFxuICAgKiBAcGFyYW0gcGF0aCBcbiAgICogQHBhcmFtIGRvbWFpbiBcbiAgICogQHBhcmFtIHNlY3VyZSBcbiAgICovXG4gIHB1YmxpYyBzZXRBc3luYyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBleHBpcmVzPzogbnVtYmVyIHwgRGF0ZSxcbiAgICBwYXRoPzogc3RyaW5nLFxuICAgIGRvbWFpbj86IHN0cmluZyxcbiAgICBzZWN1cmU/OiBib29sZWFuXG4gICk6IFByb21pc2U8dm9pZCB8IEVycm9yPiB7XG4gICAgY29uc3QgX3NldEFzeW5jID0gKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmRvY3VtZW50SXNBY2Nlc3NpYmxlKSB7XG4gICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKGBkb2N1bWVudC5jb29raWUgaXMgbm90IGFjY2Vzc2libGVgKSk7XG4gICAgICB9XG4gICAgICB0aGlzLnNldChuYW1lLCB2YWx1ZSwgZXhwaXJlcywgcGF0aCwgZG9tYWluLCBzZWN1cmUpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICB9LCA1MCk7XG4gICAgfTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoX3NldEFzeW5jKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIERFTEVURVxuICAgKiBcbiAgICogRnVuY3Rpb24gdG8gZGVsZXRlIGEgY29va2llXG4gICAqIFxuICAgKiBAcGFyYW0gbmFtZSAgIENvb2tpZSBuYW1lXG4gICAqIEBwYXJhbSBwYXRoICAgQ29va2llIHBhdGhcbiAgICogQHBhcmFtIGRvbWFpbiBDb29raWUgZG9tYWluXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlKG5hbWU6IHN0cmluZywgcGF0aD86IHN0cmluZywgZG9tYWluPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRvY3VtZW50SXNBY2Nlc3NpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2V0KG5hbWUsICcnLCBuZXcgRGF0ZShuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIDEwMDApLCBwYXRoLCBkb21haW4pO1xuICB9XG5cblxuICAvKipcbiAgICogREVMRVRFQUxMXG4gICAqIFxuICAgKiBGdW5jdGlvbiB0byBkZWxldGUgYWxsIGNvb2tpZVxuICAgKiBcbiAgICogQHBhcmFtIHBhdGggICBDb29raWUgcGF0aFxuICAgKiBAcGFyYW0gZG9tYWluIENvb2tpZSBkb21haW5cbiAgICovXG4gIHB1YmxpYyBkZWxldGVBbGwocGF0aD86IHN0cmluZywgZG9tYWluPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRvY3VtZW50SXNBY2Nlc3NpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvb2tpZXM6IGFueSA9IHRoaXMuZ2V0QWxsKCk7XG4gICAgZm9yIChjb25zdCBjb29raWVOYW1lIGluIGNvb2tpZXMpIHtcbiAgICAgIGlmIChjb29raWVzLmhhc093blByb3BlcnR5KGNvb2tpZU5hbWUpKSB7XG4gICAgICAgIHRoaXMuZGVsZXRlKGNvb2tpZU5hbWUsIHBhdGgsIGRvbWFpbik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogREVMRVRFLUFTWU5DXG4gICAqIFxuICAgKiBGdW5jdGlvbiB0byBkZWxldGUgYSBjb29raWUgYXN5bmNocm9ub3VzbHkuXG4gICAqIFxuICAgKiBAcGFyYW0gbmFtZSAgIENvb2tpZSBuYW1lXG4gICAqIEBwYXJhbSBwYXRoICAgQ29va2llIHBhdGhcbiAgICogQHBhcmFtIGRvbWFpbiBDb29raWUgZG9tYWluXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlQXN5bmMobmFtZTogc3RyaW5nLCBwYXRoPzogc3RyaW5nLCBkb21haW4/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQgfCBFcnJvcj4ge1xuICAgIGNvbnN0IF9kZWxldGVBc3luY1Byb21pc2VDYiA9IChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghdGhpcy5kb2N1bWVudElzQWNjZXNzaWJsZSkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgZG9jdW1lbnQuY29va2llIGlzIG5vdCBhY2Nlc3NpYmxlYCkpO1xuICAgICAgfVxuICAgICAgdGhpcy5kZWxldGUobmFtZSwgcGF0aCwgZG9tYWluKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgfSwgNTApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb21pc2UoX2RlbGV0ZUFzeW5jUHJvbWlzZUNiKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIERFTEVURUFMTC1BU1lOQ1xuICAgKiBcbiAgICogRnVuY3Rpb24gdG8gZGVsZXRlIGFsbCBjb29raWUgYXN5bmNocm9ub3VzbHkuXG4gICAqIFxuICAgKiBAcGFyYW0gcGF0aCAgIENvb2tpZSBwYXRoXG4gICAqIEBwYXJhbSBkb21haW4gQ29va2llIGRvbWFpblxuICAgKi9cbiAgcHVibGljIGRlbGV0ZUFsbEFzeW5jKHBhdGg/OiBzdHJpbmcsIGRvbWFpbj86IHN0cmluZyk6IFByb21pc2U8dm9pZCB8IEVycm9yPiB7XG4gICAgY29uc3QgX2RlbGV0ZUFsbEFzeW5jUHJvbWlzZUNiID0gKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmRvY3VtZW50SXNBY2Nlc3NpYmxlKSB7XG4gICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKGBkb2N1bWVudC5jb29raWUgaXMgbm90IGFjY2Vzc2libGVgKSk7XG4gICAgICB9XG4gICAgICB0aGlzLmRlbGV0ZUFsbChwYXRoLCBkb21haW4pO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICB9LCA1MCk7XG4gICAgfTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoX2RlbGV0ZUFsbEFzeW5jUHJvbWlzZUNiKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbi8vIGltcG9ydCB7IE5neENvb2tpZVN0b3JhZ2VDb21wb25lbnQgfSBmcm9tICcuL25neC1jb29raWUtc3RvcmFnZS5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICAgIGltcG9ydHM6IFtcbiAgICBdLFxuICAgIGRlY2xhcmF0aW9uczogW1xuICAgICAgICAvLyBOZ3hDb29raWVTdG9yYWdlQ29tcG9uZW50XG4gICAgXSxcbiAgICBleHBvcnRzOiBbXG4gICAgICAgIC8vIE5neENvb2tpZVN0b3JhZ2VDb21wb25lbnRcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIE5neENvb2tpZVN0b3JhZ2VNb2R1bGUgeyB9XG4iXSwibmFtZXMiOlsiSW5qZWN0YWJsZSIsIkluamVjdCIsIkRPQ1VNRU5UIiwiTmdNb2R1bGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFJQTtRQVVFOzs7OztRQUs0QixRQUFhO1lBQWIsYUFBUSxHQUFSLFFBQVEsQ0FBSzs7WUFHdkMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFFBQVEsS0FBSyxTQUFTLENBQUM7U0FDcEQ7Ozs7Ozs7O1FBU08sd0NBQU07Ozs7Ozs7O2dCQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7b0JBQzlCLE9BQU8sRUFBRSxDQUFDO2lCQUNYOztnQkFDRCxJQUFNLE9BQU8sR0FBTyxFQUFFLENBQUM7O2dCQUN2QixJQUFNLFFBQVEsR0FBUSxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNwQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUU7O29CQUM3QyxJQUFNLEtBQUssR0FBa0IsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFL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