ngx-mat-lib
Version:
A bunch of utilities and components to use in your Angular 7+ apps!
286 lines (285 loc) • 33.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Injectable } from "@angular/core";
import { HttpResponse, HttpEventType } from "@angular/common/http";
import { XmatLib, XmatRestVerbs } from "../models/index";
import { XmatConstantsService } from "./xmat-constants.service";
import { XmatMocksListService } from "./xmat-mocks-list.service";
import { tap, switchMap } from "rxjs/operators";
import { Observable, timer } from "rxjs";
import { each } from "lodash";
var XmatMockService = /** @class */ (function () {
function XmatMockService(_xmatConstants, _xmatMocksList) {
var _this = this;
this._xmatConstants = _xmatConstants;
this._xmatMocksList = _xmatMocksList;
this._defaultResponseBody = { data: void 0, message: "forbidden" };
this._fileEndings = this._xmatConstants.mocksEndings;
this._mocks = {};
this._ds = this._xmatConstants.ds;
this._fileNameSpace = this._xmatConstants.fileNameSpace;
this._mocksBaseUrl = this._xmatConstants.mocksBaseUrl;
this._paramsPlaceholder = this._xmatConstants.paramsPlaceholder;
this._qm = "?";
this._queryUrlParam = this._xmatConstants.queryUrlParam;
this._restBaseUrl = this._xmatConstants.restBaseUrl;
// Override these from extended class
this._defaultMockDelay = 2500;
this._logEnabled = true;
/** @type {?} */
var mocks = this._xmatMocksList.get();
each(mocks, function (mock) {
_this._pushMockHandler(mock);
});
}
// Here the magic happens
/**
* @param {?} request
* @param {?} next
* @return {?}
*/
XmatMockService.prototype.intercept = /**
* @param {?} request
* @param {?} next
* @return {?}
*/
function (request, next) {
if (!!XmatLib.restTimes[request.url]) {
/** @type {?} */
var startTime = XmatLib.restTimes[request.url];
/** @type {?} */
var finalTime = Date.now();
if (this._logEnabled) {
console.info("XmatMock: interceptor fired after " + (finalTime - startTime) + " ms");
XmatLib.restTimes[request.url] = startTime;
}
}
/** @type {?} */
var urlParts = request.url.split(this._qm);
/** @type {?} */
var mockKey = request.method + urlParts[0];
// Checks for non parametric URL
if (this._mockExists(mockKey)) {
this._logEnabled && console.info("XmatMock: found mock with key " + mockKey);
return this._mocks[mockKey](request, next, [], urlParts[1]);
}
/** @type {?} */
var urlParams = this._extractUrlParams(urlParts[0]);
if (Array.isArray(urlParams)) {
/** @type {?} */
var serviceName = urlParts[0].substr(this._restBaseUrl.length).split(this._ds).shift();
/** @type {?} */
var serviceBase = request.method + this._restBaseUrl + serviceName;
/** @type {?} */
var j = urlParams.length;
while (--j >= 0) {
/** @type {?} */
var paramsBak = urlParams.slice();
paramsBak[j] = this._paramsPlaceholder;
/** @type {?} */
var mixedKey = [serviceBase].concat(paramsBak).join(this._ds);
if (this._mockExists(mixedKey)) {
this._logEnabled && console.info("XmatMock: found mock with key " + mixedKey);
return this._mocks[mixedKey](request, next, urlParams.slice(j), urlParts[1]);
}
/** @type {?} */
var k = j;
while (--k >= 0) {
/** @type {?} */
var paramsBakBak = paramsBak.slice();
paramsBakBak[k] = this._paramsPlaceholder;
mixedKey = [serviceBase].concat(paramsBakBak).join(this._ds);
if (this._mockExists(mixedKey)) {
this._logEnabled && console.info("XmatMock: found mock with key " + mixedKey);
return this._mocks[mixedKey](request, next, urlParams.slice(k), urlParts[1]);
}
}
}
}
return next.handle(request);
};
// Private methods
/**
* @param {?} serviceUrl
* @return {?}
*/
XmatMockService.prototype._extractUrlParams = /**
* @param {?} serviceUrl
* @return {?}
*/
function (serviceUrl) {
/** *
* E.G. serviceUrl = "/rest/cd/property-store/5/id";
* cleanUrl = "property-store/5/id"
* urlParamsList = [
* "property-store",
* "5",
* "id"
* ]
@type {?} */
var cleanUrl = serviceUrl.replace(this._restBaseUrl, "");
/** @type {?} */
var urlParamsList = cleanUrl.split(this._ds);
urlParamsList.shift();
// If true it means there was at least one param
if (urlParamsList.length > 0) {
return urlParamsList;
}
return void 0;
};
/**
* @param {?} mockKey
* @return {?}
*/
XmatMockService.prototype._mockExists = /**
* @param {?} mockKey
* @return {?}
*/
function (mockKey) {
return !!this._mocks[mockKey] && typeof this._mocks[mockKey] === typeof this._xmatConstants.noop;
};
/**
* @param {?} serviceUrl
* @param {?} methodKey
* @param {?=} fileSuffix
* @param {?=} status
* @return {?}
*/
XmatMockService.prototype._generateJsonUrl = /**
* @param {?} serviceUrl
* @param {?} methodKey
* @param {?=} fileSuffix
* @param {?=} status
* @return {?}
*/
function (serviceUrl, methodKey, fileSuffix, status) {
if (fileSuffix === void 0) { fileSuffix = ""; }
if (status === void 0) { status = this._fileEndings.ok; }
/** @type {?} */
var serviceKey = serviceUrl.substr(this._restBaseUrl.length).split(this._ds + this._paramsPlaceholder)[0];
/** @type {?} */
var serviceFolder = serviceKey.split(this._ds)[0];
/** @type {?} */
var fileName = serviceKey.split(this._ds).join(this._fileNameSpace);
return this._mocksBaseUrl + serviceFolder + this._ds + methodKey + fileName + fileSuffix + status;
};
/**
* @param {?} mock
* @return {?}
*/
XmatMockService.prototype._pushMockHandler = /**
* @param {?} mock
* @return {?}
*/
function (mock) {
var _this = this;
/**
* TODO: Possible evolution: custom callback in mock object
*/
!!mock.status || (mock.status = 200);
!!mock.body || (mock.body = this._defaultResponseBody);
/** @type {?} */
var mockKey = mock.method + mock.url;
this._mocks[mockKey] = function (request, next, params, queryString) {
if (params === void 0) { params = []; }
if (mock.status !== 200) {
return new Observable(function (observer) {
/** @type {?} */
var customResponse = new HttpResponse({ status: mock.status, body: mock.body });
observer.error(customResponse);
observer.complete();
});
}
/** @type {?} */
var mockRequest;
if (!!mock.customUrl) {
if (_this._logEnabled) {
console.info("XmatMock: calling " + mock.customUrl);
}
/** @type {?} */
var url = mock.customUrl.replace(_this._paramsPlaceholder, params.join(_this._ds));
mockRequest = request.clone({
url: url + (!!queryString ? _this._qm + queryString : ""),
method: mock.customMethod ? mock.customMethod : url.indexOf(".json") >= 0 ? XmatRestVerbs.GET : request.method
});
}
else {
/** @type {?} */
var fileNameSuffix_1 = "";
each(params, function (param) {
fileNameSuffix_1 += _this._fileNameSpace + param;
});
/** @type {?} */
var ending = mock.result === false ? _this._fileEndings.ko : _this._fileEndings.ok;
/** @type {?} */
var methodKey = XmatRestVerbs[request.method] + "-";
/** @type {?} */
var url = _this._generateJsonUrl(mock.url, methodKey, fileNameSuffix_1, ending);
/** @type {?} */
var queriedUrl = _this._generateJsonUrl(mock.url, methodKey, _this._fileNameSpace + _this._queryUrlParam, ending);
mockRequest = request.clone({
url: request.urlWithParams.indexOf(_this._queryUrlParam) > 0 ? queriedUrl : url,
method: XmatRestVerbs.GET
});
}
if (_this._logEnabled) {
console.info("XmatMock: calling " + mockRequest.url);
}
typeof mock.timeout === typeof 0 && mock.timeout >= 0 || (mock.timeout = _this._defaultMockDelay);
/** @type {?} */
var delay = timer(mock.timeout);
/** @type {?} */
var start = XmatLib.restTimes[request.url] || Date.now();
return delay.pipe(switchMap(function () { return next.handle(mockRequest); }), tap(function (event) {
if (event.type === HttpEventType.Response) {
/** @type {?} */
var elapsed = Date.now() - start;
!!_this._logEnabled && console.log("XmatMock: request for mocked " + request.urlWithParams + " took " + elapsed + " ms.");
}
}));
};
};
XmatMockService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
XmatMockService.ctorParameters = function () { return [
{ type: XmatConstantsService },
{ type: XmatMocksListService }
]; };
return XmatMockService;
}());
export { XmatMockService };
if (false) {
/** @type {?} */
XmatMockService.prototype._defaultResponseBody;
/** @type {?} */
XmatMockService.prototype._fileEndings;
/** @type {?} */
XmatMockService.prototype._mocks;
/** @type {?} */
XmatMockService.prototype._ds;
/** @type {?} */
XmatMockService.prototype._fileNameSpace;
/** @type {?} */
XmatMockService.prototype._mocksBaseUrl;
/** @type {?} */
XmatMockService.prototype._paramsPlaceholder;
/** @type {?} */
XmatMockService.prototype._qm;
/** @type {?} */
XmatMockService.prototype._queryUrlParam;
/** @type {?} */
XmatMockService.prototype._restBaseUrl;
/** @type {?} */
XmatMockService.prototype._defaultMockDelay;
/** @type {?} */
XmatMockService.prototype._logEnabled;
/** @type {?} */
XmatMockService.prototype._xmatConstants;
/** @type {?} */
XmatMockService.prototype._xmatMocksList;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1hdC1tb2NrLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtbWF0LWxpYi8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy94bWF0LW1vY2suc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBS0gsWUFBWSxFQUNaLGFBQWEsRUFDaEIsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLEVBRUgsT0FBTyxFQUdQLGFBQWEsRUFDaEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUUvRCxPQUFPLEVBQUMsR0FBRyxFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7O0lBcUJ4Qix5QkFBc0IsY0FBb0MsRUFDcEMsY0FBb0M7UUFEMUQsaUJBT0M7UUFQcUIsbUJBQWMsR0FBZCxjQUFjLENBQXNCO1FBQ3BDLG1CQUFjLEdBQWQsY0FBYyxDQUFzQjtRQWpCMUQsNEJBQW9ELEVBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUMsQ0FBQztRQUN6RixvQkFBeUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUM7UUFDMUQsY0FBdUMsRUFBRSxDQUFDO1FBRTFDLFdBQXlCLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1FBQ2hELHNCQUFvQyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQztRQUN0RSxxQkFBMkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUM7UUFD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LENBQUMsUUFBUSxFQUFFOztvQkFDdkMsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQztvQkFDbkMsQ0FBQyxDQUFDLEtBQUksQ0FBQyxXQUFXLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQ0FBZ0MsT0FBTyxDQUFDLGFBQWEsY0FBUyxPQUFPLFNBQU0sQ0FBQyxDQUFDO2lCQUNsSDthQUNKLENBQUMsQ0FBQyxDQUFDO1NBQ1gsQ0FBQztLQUNMOztnQkF0S0osVUFBVTs7OztnQkFQSCxvQkFBb0I7Z0JBQ3BCLG9CQUFvQjs7MEJBbEI1Qjs7U0F5QmEsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7XG4gICAgSHR0cEV2ZW50LFxuICAgIEh0dHBJbnRlcmNlcHRvcixcbiAgICBIdHRwSGFuZGxlcixcbiAgICBIdHRwUmVxdWVzdCxcbiAgICBIdHRwUmVzcG9uc2UsXG4gICAgSHR0cEV2ZW50VHlwZVxufSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcbi8vXG5pbXBvcnQge1xuICAgIFhtYXRHZW5lcmljT2JqZWN0LFxuICAgIFhtYXRMaWIsXG4gICAgWG1hdE1vY2ssXG4gICAgWG1hdE1vY2tzQ2FsbGJhY2tzLFxuICAgIFhtYXRSZXN0VmVyYnNcbn0gZnJvbSBcIi4uL21vZGVscy9pbmRleFwiO1xuaW1wb3J0IHtYbWF0Q29uc3RhbnRzU2VydmljZX0gZnJvbSBcIi4veG1hdC1jb25zdGFudHMuc2VydmljZVwiO1xuaW1wb3J0IHtYbWF0TW9ja3NMaXN0U2VydmljZX0gZnJvbSBcIi4veG1hdC1tb2Nrcy1saXN0LnNlcnZpY2VcIjtcbi8vXG5pbXBvcnQge3RhcCwgc3dpdGNoTWFwfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7T2JzZXJ2YWJsZSwgdGltZXJ9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQge2VhY2h9IGZyb20gXCJsb2Rhc2hcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFhtYXRNb2NrU2VydmljZSBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XG5cbiAgICBwcm90ZWN0ZWQgX2RlZmF1bHRSZXNwb25zZUJvZHk6IFhtYXRHZW5lcmljT2JqZWN0ID0ge2RhdGE6IHZvaWQgMCwgbWVzc2FnZTogXCJmb3JiaWRkZW5cIn07XG4gICAgcHJvdGVjdGVkIF9maWxlRW5kaW5ncyA9IHRoaXMuX3htYXRDb25zdGFudHMubW9ja3NFbmRpbmdzO1xuICAgIHByb3RlY3RlZCBfbW9ja3M6IFhtYXRNb2Nrc0NhbGxiYWNrcyA9IHt9O1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9kcyA9IHRoaXMuX3htYXRDb25zdGFudHMuZHM7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9maWxlTmFtZVNwYWNlID0gdGhpcy5feG1hdENvbnN0YW50cy5maWxlTmFtZVNwYWNlO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfbW9ja3NCYXNlVXJsOiBzdHJpbmcgPSB0aGlzLl94bWF0Q29uc3RhbnRzLm1vY2tzQmFzZVVybDtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3BhcmFtc1BsYWNlaG9sZGVyID0gdGhpcy5feG1hdENvbnN0YW50cy5wYXJhbXNQbGFjZWhvbGRlcjtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3FtOiBzdHJpbmcgPSBcIj9cIjtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3F1ZXJ5VXJsUGFyYW0gPSB0aGlzLl94bWF0Q29uc3RhbnRzLnF1ZXJ5VXJsUGFyYW07XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9yZXN0QmFzZVVybDogc3RyaW5nID0gdGhpcy5feG1hdENvbnN0YW50cy5yZXN0QmFzZVVybDtcblxuICAgIC8vIE92ZXJyaWRlIHRoZXNlIGZyb20gZXh0ZW5kZWQgY2xhc3NcbiAgICBwcm90ZWN0ZWQgX2RlZmF1bHRNb2NrRGVsYXk6IG51bWJlciA9IDI1MDA7XG4gICAgcHJvdGVjdGVkIF9sb2dFbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfeG1hdENvbnN0YW50czogWG1hdENvbnN0YW50c1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF94bWF0TW9ja3NMaXN0OiBYbWF0TW9ja3NMaXN0U2VydmljZSkge1xuXG4gICAgICAgIGNvbnN0IG1vY2tzID0gdGhpcy5feG1hdE1vY2tzTGlzdC5nZXQoKTtcbiAgICAgICAgZWFjaChtb2NrcywgKG1vY2spID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3B1c2hNb2NrSGFuZGxlcihtb2NrKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSGVyZSB0aGUgbWFnaWMgaGFwcGVuc1xuICAgIGludGVyY2VwdChyZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcbiAgICAgICAgaWYgKCEhWG1hdExpYi5yZXN0VGltZXNbcmVxdWVzdC51cmxdKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBYbWF0TGliLnJlc3RUaW1lc1tyZXF1ZXN0LnVybF07XG4gICAgICAgICAgICBjb25zdCBmaW5hbFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2xvZ0VuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oYFhtYXRNb2NrOiBpbnRlcmNlcHRvciBmaXJlZCBhZnRlciAkeyhmaW5hbFRpbWUgLSBzdGFydFRpbWUpfSBtc2ApO1xuICAgICAgICAgICAgICAgIFhtYXRMaWIucmVzdFRpbWVzW3JlcXVlc3QudXJsXSA9IHN0YXJ0VGltZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBTZXBhcmF0ZSBxdWVyeSBzdHJpbmcgZnJvbSB0aGUgcmVzdFxuICAgICAgICBjb25zdCB1cmxQYXJ0cyA9IHJlcXVlc3QudXJsLnNwbGl0KHRoaXMuX3FtKTtcbiAgICAgICAgY29uc3QgbW9ja0tleSA9IHJlcXVlc3QubWV0aG9kICsgdXJsUGFydHNbMF07XG5cbiAgICAgICAgLy8gQ2hlY2tzIGZvciBub24gcGFyYW1ldHJpYyBVUkxcbiAgICAgICAgaWYgKHRoaXMuX21vY2tFeGlzdHMobW9ja0tleSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ0VuYWJsZWQgJiYgY29uc29sZS5pbmZvKGBYbWF0TW9jazogZm91bmQgbW9jayB3aXRoIGtleSAke21vY2tLZXl9YCk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb2Nrc1ttb2NrS2V5XShyZXF1ZXN0LCBuZXh0LCBbXSwgdXJsUGFydHNbMV0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVybFBhcmFtcyA9IHRoaXMuX2V4dHJhY3RVcmxQYXJhbXModXJsUGFydHNbMF0pO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh1cmxQYXJhbXMpKSB7XG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHVybFBhcnRzWzBdLnN1YnN0cih0aGlzLl9yZXN0QmFzZVVybC5sZW5ndGgpLnNwbGl0KHRoaXMuX2RzKS5zaGlmdCgpO1xuICAgICAgICAgICAgY29uc3Qgc2VydmljZUJhc2UgPSByZXF1ZXN0Lm1ldGhvZCArIHRoaXMuX3Jlc3RCYXNlVXJsICsgc2VydmljZU5hbWU7XG4gICAgICAgICAgICBsZXQgaiA9IHVybFBhcmFtcy5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAoLS1qID49IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXNCYWsgPSB1cmxQYXJhbXMuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICBwYXJhbXNCYWtbal0gPSB0aGlzLl9wYXJhbXNQbGFjZWhvbGRlcjtcbiAgICAgICAgICAgICAgICBsZXQgbWl4ZWRLZXkgPSBbc2VydmljZUJhc2VdLmNvbmNhdChwYXJhbXNCYWspLmpvaW4odGhpcy5fZHMpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tb2NrRXhpc3RzKG1peGVkS2V5KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2dFbmFibGVkICYmIGNvbnNvbGUuaW5mbyhgWG1hdE1vY2s6IGZvdW5kIG1vY2sgd2l0aCBrZXkgJHttaXhlZEtleX1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vY2tzW21peGVkS2V5XShyZXF1ZXN0LCBuZXh0LCB1cmxQYXJhbXMuc2xpY2UoaiksIHVybFBhcnRzWzFdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGsgPSBqO1xuICAgICAgICAgICAgICAgIHdoaWxlICgtLWsgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXNCYWtCYWsgPSBwYXJhbXNCYWsuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zQmFrQmFrW2tdID0gdGhpcy5fcGFyYW1zUGxhY2Vob2xkZXI7XG4gICAgICAgICAgICAgICAgICAgIG1peGVkS2V5ID0gW3NlcnZpY2VCYXNlXS5jb25jYXQocGFyYW1zQmFrQmFrKS5qb2luKHRoaXMuX2RzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX21vY2tFeGlzdHMobWl4ZWRLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2dFbmFibGVkICYmIGNvbnNvbGUuaW5mbyhgWG1hdE1vY2s6IGZvdW5kIG1vY2sgd2l0aCBrZXkgJHttaXhlZEtleX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb2Nrc1ttaXhlZEtleV0ocmVxdWVzdCwgbmV4dCwgdXJsUGFyYW1zLnNsaWNlKGspLCB1cmxQYXJ0c1sxXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxdWVzdCk7XG5cbiAgICB9XG5cbiAgICAvLyBQcml2YXRlIG1ldGhvZHNcbiAgICBwcm90ZWN0ZWQgX2V4dHJhY3RVcmxQYXJhbXMoc2VydmljZVVybDogc3RyaW5nKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFLkcuIHNlcnZpY2VVcmwgPSBcIi9yZXN0L2NkL3Byb3BlcnR5LXN0b3JlLzUvaWRcIjtcbiAgICAgICAgICogY2xlYW5VcmwgPSBcInByb3BlcnR5LXN0b3JlLzUvaWRcIlxuICAgICAgICAgKiB1cmxQYXJhbXNMaXN0ID0gW1xuICAgICAgICAgKiAgICAgIFwicHJvcGVydHktc3RvcmVcIixcbiAgICAgICAgICogICAgICBcIjVcIixcbiAgICAgICAgICogICAgICBcImlkXCJcbiAgICAgICAgICogXVxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgY2xlYW5VcmwgPSBzZXJ2aWNlVXJsLnJlcGxhY2UodGhpcy5fcmVzdEJhc2VVcmwsIFwiXCIpO1xuICAgICAgICBjb25zdCB1cmxQYXJhbXNMaXN0ID0gY2xlYW5Vcmwuc3BsaXQodGhpcy5fZHMpO1xuICAgICAgICB1cmxQYXJhbXNMaXN0LnNoaWZ0KCk7XG4gICAgICAgIC8vIElmIHRydWUgaXQgbWVhbnMgdGhlcmUgd2FzIGF0IGxlYXN0IG9uZSBwYXJhbVxuICAgICAgICBpZiAodXJsUGFyYW1zTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdXJsUGFyYW1zTGlzdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfbW9ja0V4aXN0cyhtb2NrS2V5KSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX21vY2tzW21vY2tLZXldICYmIHR5cGVvZiB0aGlzLl9tb2Nrc1ttb2NrS2V5XSA9PT0gdHlwZW9mIHRoaXMuX3htYXRDb25zdGFudHMubm9vcDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2dlbmVyYXRlSnNvblVybChzZXJ2aWNlVXJsOiBzdHJpbmcsIG1ldGhvZEtleTogc3RyaW5nLCBmaWxlU3VmZml4OiBzdHJpbmcgPSBcIlwiLCBzdGF0dXM6IHN0cmluZyA9IHRoaXMuX2ZpbGVFbmRpbmdzLm9rKSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VLZXkgPSBzZXJ2aWNlVXJsLnN1YnN0cih0aGlzLl9yZXN0QmFzZVVybC5sZW5ndGgpLnNwbGl0KHRoaXMuX2RzICsgdGhpcy5fcGFyYW1zUGxhY2Vob2xkZXIpWzBdO1xuICAgICAgICBjb25zdCBzZXJ2aWNlRm9sZGVyID0gc2VydmljZUtleS5zcGxpdCh0aGlzLl9kcylbMF07XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gc2VydmljZUtleS5zcGxpdCh0aGlzLl9kcykuam9pbih0aGlzLl9maWxlTmFtZVNwYWNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vY2tzQmFzZVVybCArIHNlcnZpY2VGb2xkZXIgKyB0aGlzLl9kcyArIG1ldGhvZEtleSArIGZpbGVOYW1lICsgZmlsZVN1ZmZpeCArIHN0YXR1cztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3B1c2hNb2NrSGFuZGxlcihtb2NrOiBYbWF0TW9jaykge1xuICAgICAgICAvKipcbiAgICAgICAgICogVE9ETzogUG9zc2libGUgZXZvbHV0aW9uOiBjdXN0b20gY2FsbGJhY2sgaW4gbW9jayBvYmplY3RcbiAgICAgICAgICovXG4gICAgICAgICEhbW9jay5zdGF0dXMgfHwgKG1vY2suc3RhdHVzID0gMjAwKTtcbiAgICAgICAgISFtb2NrLmJvZHkgfHwgKG1vY2suYm9keSA9IHRoaXMuX2RlZmF1bHRSZXNwb25zZUJvZHkpO1xuICAgICAgICBjb25zdCBtb2NrS2V5ID0gbW9jay5tZXRob2QgKyBtb2NrLnVybDtcbiAgICAgICAgdGhpcy5fbW9ja3NbbW9ja0tleV0gPSAocmVxdWVzdDogSHR0cFJlcXVlc3Q8YW55PiwgbmV4dDogSHR0cEhhbmRsZXIsIHBhcmFtczogc3RyaW5nW10gPSBbXSwgcXVlcnlTdHJpbmc/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4gPT4ge1xuICAgICAgICAgICAgaWYgKG1vY2suc3RhdHVzICE9PSAyMDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXN0b21SZXNwb25zZSA9IG5ldyBIdHRwUmVzcG9uc2Uoe3N0YXR1czogbW9jay5zdGF0dXMsIGJvZHk6IG1vY2suYm9keX0pO1xuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihjdXN0b21SZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBtb2NrUmVxdWVzdDtcbiAgICAgICAgICAgIGlmICghIW1vY2suY3VzdG9tVXJsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2xvZ0VuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKGBYbWF0TW9jazogY2FsbGluZyAke21vY2suY3VzdG9tVXJsfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJZiBwYXJhbXMgcGxhY2Vob2xkZXIgaXMgaW4gY3VzdG9tIFVSTCwgcGFyYW1zIGFyZSBjb25jYXQgdG8gdXJsIHdpdGggc2xhc2hlc1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IG1vY2suY3VzdG9tVXJsLnJlcGxhY2UodGhpcy5fcGFyYW1zUGxhY2Vob2xkZXIsIHBhcmFtcy5qb2luKHRoaXMuX2RzKSk7XG4gICAgICAgICAgICAgICAgbW9ja1JlcXVlc3QgPSByZXF1ZXN0LmNsb25lKHtcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwgKyAoISFxdWVyeVN0cmluZyA/IHRoaXMuX3FtICsgcXVlcnlTdHJpbmcgOiBcIlwiKSxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBtb2NrLmN1c3RvbU1ldGhvZCA/IG1vY2suY3VzdG9tTWV0aG9kIDogdXJsLmluZGV4T2YoXCIuanNvblwiKSA+PSAwID8gWG1hdFJlc3RWZXJicy5HRVQgOiByZXF1ZXN0Lm1ldGhvZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGVOYW1lU3VmZml4ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBlYWNoKHBhcmFtcywgKHBhcmFtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lU3VmZml4ICs9IHRoaXMuX2ZpbGVOYW1lU3BhY2UgKyBwYXJhbTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRpbmcgPSBtb2NrLnJlc3VsdCA9PT0gZmFsc2UgPyB0aGlzLl9maWxlRW5kaW5ncy5rbyA6IHRoaXMuX2ZpbGVFbmRpbmdzLm9rO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1ldGhvZEtleSA9IGAke1htYXRSZXN0VmVyYnNbcmVxdWVzdC5tZXRob2RdfS1gO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IHRoaXMuX2dlbmVyYXRlSnNvblVybChtb2NrLnVybCwgbWV0aG9kS2V5LCBmaWxlTmFtZVN1ZmZpeCwgZW5kaW5nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBxdWVyaWVkVXJsID0gdGhpcy5fZ2VuZXJhdGVKc29uVXJsKG1vY2sudXJsLCBtZXRob2RLZXksIHRoaXMuX2ZpbGVOYW1lU3BhY2UgKyB0aGlzLl9xdWVyeVVybFBhcmFtLCBlbmRpbmcpO1xuICAgICAgICAgICAgICAgIG1vY2tSZXF1ZXN0ID0gcmVxdWVzdC5jbG9uZSh7XG4gICAgICAgICAgICAgICAgICAgIHVybDogcmVxdWVzdC51cmxXaXRoUGFyYW1zLmluZGV4T2YodGhpcy5fcXVlcnlVcmxQYXJhbSkgPiAwID8gcXVlcmllZFVybCA6IHVybCxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBYbWF0UmVzdFZlcmJzLkdFVFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2xvZ0VuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oYFhtYXRNb2NrOiBjYWxsaW5nICR7bW9ja1JlcXVlc3QudXJsfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHlwZW9mIG1vY2sudGltZW91dCA9PT0gdHlwZW9mIDAgJiYgbW9jay50aW1lb3V0ID49IDAgfHwgKG1vY2sudGltZW91dCA9IHRoaXMuX2RlZmF1bHRNb2NrRGVsYXkpO1xuICAgICAgICAgICAgY29uc3QgZGVsYXkgPSB0aW1lcihtb2NrLnRpbWVvdXQpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBYbWF0TGliLnJlc3RUaW1lc1tyZXF1ZXN0LnVybF0gfHwgRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHJldHVybiBkZWxheS5waXBlKHN3aXRjaE1hcCgoKSA9PiBuZXh0LmhhbmRsZShtb2NrUmVxdWVzdCkpLFxuICAgICAgICAgICAgICAgIHRhcCgoZXZlbnQ6IEh0dHBSZXNwb25zZTxhbnk+KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLlJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIHN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgISF0aGlzLl9sb2dFbmFibGVkICYmIGNvbnNvbGUubG9nKGBYbWF0TW9jazogcmVxdWVzdCBmb3IgbW9ja2VkICR7cmVxdWVzdC51cmxXaXRoUGFyYW1zfSB0b29rICR7ZWxhcHNlZH0gbXMuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgIH07XG4gICAgfVxufVxuIl19