@helgoland/core
Version:
634 lines (633 loc) • 48.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Injectable } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import { deserialize, deserializeArray } from 'class-transformer';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { Dataset, Timeseries } from '../model/dataset-api/dataset';
import { DatasetApiInterface } from './api-interface';
import { HttpService } from './http.service';
import { InternalIdHandler } from './internal-id-handler.service';
var DatasetImplApiInterface = /** @class */ (function (_super) {
tslib_1.__extends(DatasetImplApiInterface, _super);
function DatasetImplApiInterface(httpservice, internalDatasetId, translate) {
var _this = _super.call(this, httpservice, translate) || this;
_this.httpservice = httpservice;
_this.internalDatasetId = internalDatasetId;
_this.translate = translate;
return _this;
}
/**
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
DatasetImplApiInterface.prototype.getServices = /**
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
function (apiUrl, params, options) {
/** @type {?} */
var url = this.createRequestUrl(apiUrl, 'services');
if (params) {
params.expanded = true;
}
else {
params = { expanded: true };
}
return this.requestApi(url, params, options).pipe(map(function (result) {
result.forEach(function (entry) { return entry.apiUrl = apiUrl; });
return result;
}));
};
/**
* @param {?} id
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
DatasetImplApiInterface.prototype.getService = /**
* @param {?} id
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
function (id, apiUrl, params, options) {
/** @type {?} */
var url = this.createRequestUrl(apiUrl, 'services', id);
return this.requestApi(url, params, options).pipe(map(function (result) {
result.apiUrl = apiUrl;
return result;
}));
};
/**
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
DatasetImplApiInterface.prototype.getStations = /**
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
function (apiUrl, params, options) {
/** @type {?} */
var url = this.createRequestUrl(apiUrl, 'stations');
return this.requestApi(url, params, options);
};
/**
* @param {?} id
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
DatasetImplApiInterface.prototype.getStation = /**
* @param {?} id
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
function (id, apiUrl, params, options) {
/** @type {?} */
var url = this.createRequestUrl(apiUrl, 'stations', id);
return this.requestApi(url, params, options);
};
/**
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
DatasetImplApiInterface.prototype.getTimeseries = /**
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
function (apiUrl, params, options) {
var _this = this;
/** @type {?} */
var url = this.createRequestUrl(apiUrl, 'timeseries');
return new Observable(function (observer) {
_this.requestApiTexted(url, params, options).subscribe(function (result) {
/** @type {?} */
var timeseriesList = deserializeArray(Timeseries, result);
timeseriesList.forEach(function (entry) {
entry.url = apiUrl;
_this.internalDatasetId.generateInternalId(entry);
});
observer.next(timeseriesList);
}, function (error) { return observer.error(error); }, function () { return observer.complete(); });
});
};
/**
* @param {?} apiUrl
* @param {?} ids
* @param {?} timespan
* @param {?=} options
* @return {?}
*/
DatasetImplApiInterface.prototype.getTimeseriesData = /**
* @param {?} apiUrl
* @param {?} ids
* @param {?} timespan
* @param {?=} options
* @return {?}
*/
function (apiUrl, ids, timespan, options) {
var _this = this;
/** @type {?} */
var url = this.createRequestUrl(apiUrl, 'timeseries/getData');
return new Observable(function (observer) {
_this.requestApiTextedPost(url, {
timespan: _this.createRequestTimespan(timespan),
timeseries: ids
}, options).subscribe(function (result) {
/** @type {?} */
var timeseriesList = [];
for (var id in result) {
if (id) {
timeseriesList.push({
id: id,
url: apiUrl,
data: result[id].values
});
}
}
observer.next(timeseriesList);
}, function (error) { return observer.error(error); }, function () { return observer.complete(); });
});
};
/**
* @param {?} id
* @param {?} apiUrl
* @param {?=} params
* @return {?}
*/
DatasetImplApiInterface.prototype.getSingleTimeseries = /**
* @param {?} id
* @param {?} apiUrl
* @param {?=} params
* @return {?}
*/
function (id, apiUrl, params) {
var _this = this;
/** @type {?} */
var url = this.createRequestUrl(apiUrl, 'timeseries', id);
return this.requestApiTexted(url, params).pipe(map(function (result) {
/** @type {?} */
var timeseries = deserialize(Timeseries, result);
timeseries.url = apiUrl;
_this.internalDatasetId.generateInternalId(timeseries);
return timeseries;
}));
};
/**
* @param {?} internalId
* @param {?=} params
* @return {?}
*/
DatasetImplApiInterface.prototype.getSingleTimeseriesByInternalId = /**
* @param {?} internalId
* @param {?=} params
* @return {?}
*/
function (internalId, params) {
/** @type {?} */
var resolvedId = this.internalDatasetId.resolveInternalId(internalId);
return this.getSingleTimeseries(resolvedId.id, resolvedId.url, params);
};
/**
* @param {?} id
* @param {?} apiUrl
* @return {?}
*/
DatasetImplApiInterface.prototype.getTimeseriesExtras = /**
* @param {?} id
* @param {?} apiUrl
* @return {?}
*/
function (id, apiUrl) {
/** @type {?} */
var url = this.createRequestUrl(apiUrl, 'timeseries', id);
return this.requestApi(url + '/extras');
};
/**
* @template T
* @param {?} id
* @param {?} apiUrl
* @param {?} timespan
* @param {?=} params
* @param {?=} options
* @return {?}
*/
DatasetImplApiInterface.prototype.getTsData = /**
* @template T
* @param {?} id
* @param {?} apiUrl
* @param {?} timespan
* @param {?=} params
* @param {?=} options
* @return {?}
*/
function (id, apiUrl, timespan, params, options) {
if (params === void 0) { params = {}; }
/** @type {?} */
var url = this.createRequestUrl(apiUrl, 'timeseries', id) + '/getData';
params.timespan = this.createRequestTimespan(timespan);
return this.requestApi(url, params, options).pipe(map(function (res) {
if (params.expanded) {
res = res[id];
}
return res;
}));
};
/**
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
DatasetImplApiInterface.prototype.getCategories = /**
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
function (apiUrl, params, options) {
/** @type {?} */
var url = this.createRequestUrl(apiUrl, 'categories');
return this.requestApi(url, params, options);
};
/**
* @param {?} id
* @param {?} apiUrl
* @param {?=} params
* @return {?}
*/
DatasetImplApiInterface.prototype.getCategory = /**
* @param {?} id
* @param {?} apiUrl
* @param {?=} params
* @return {?}
*/
function (id, apiUrl, params) {
// const url = this.createRequestUrl(apiUrl, 'categories', id);
throw new Error('Not implemented');
// return this.requestApi(url, params)
// .map(this.extractData);
};
/**
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
DatasetImplApiInterface.prototype.getPhenomena = /**
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
function (apiUrl, params, options) {
/** @type {?} */
var url = this.createRequestUrl(apiUrl, 'phenomena');
return this.requestApi(url, params, options);
};
/**
* @param {?} id
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
DatasetImplApiInterface.prototype.getPhenomenon = /**
* @param {?} id
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
function (id, apiUrl, params, options) {
/** @type {?} */
var url = this.createRequestUrl(apiUrl, 'phenomena', id);
return this.requestApi(url, params, options);
};
/**
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
DatasetImplApiInterface.prototype.getOfferings = /**
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
function (apiUrl, params, options) {
/** @type {?} */
var url = this.createRequestUrl(apiUrl, 'offerings');
return this.requestApi(url, params, options);
};
/**
* @param {?} id
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
DatasetImplApiInterface.prototype.getOffering = /**
* @param {?} id
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
function (id, apiUrl, params, options) {
/** @type {?} */
var url = this.createRequestUrl(apiUrl, 'offerings', id);
return this.requestApi(url, params, options);
};
/**
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
DatasetImplApiInterface.prototype.getFeatures = /**
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
function (apiUrl, params, options) {
/** @type {?} */
var url = this.createRequestUrl(apiUrl, 'features');
return this.requestApi(url, params, options);
};
/**
* @param {?} id
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
DatasetImplApiInterface.prototype.getFeature = /**
* @param {?} id
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
function (id, apiUrl, params, options) {
/** @type {?} */
var url = this.createRequestUrl(apiUrl, 'features', id);
return this.requestApi(url, params, options);
};
/**
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
DatasetImplApiInterface.prototype.getProcedures = /**
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
function (apiUrl, params, options) {
/** @type {?} */
var url = this.createRequestUrl(apiUrl, 'procedures');
return this.requestApi(url, params, options);
};
/**
* @param {?} id
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
DatasetImplApiInterface.prototype.getProcedure = /**
* @param {?} id
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
function (id, apiUrl, params, options) {
/** @type {?} */
var url = this.createRequestUrl(apiUrl, 'procedures', id);
return this.requestApi(url, params, options);
};
/**
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
DatasetImplApiInterface.prototype.getPlatforms = /**
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
function (apiUrl, params, options) {
/** @type {?} */
var url = this.createRequestUrl(apiUrl, 'platforms');
return this.requestApi(url, params, options);
};
/**
* @param {?} id
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
DatasetImplApiInterface.prototype.getPlatform = /**
* @param {?} id
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
function (id, apiUrl, params, options) {
/** @type {?} */
var url = this.createRequestUrl(apiUrl, 'platforms', id);
return this.requestApi(url, params, options);
};
/**
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
DatasetImplApiInterface.prototype.getDatasets = /**
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
function (apiUrl, params, options) {
var _this = this;
/** @type {?} */
var url = this.createRequestUrl(apiUrl, 'datasets');
return this.requestApi(url, params, options).pipe(map(function (list) { return list.map(function (entry) { return _this.prepareDataset(entry, apiUrl); }); }));
};
/**
* @param {?} id
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
DatasetImplApiInterface.prototype.getDataset = /**
* @param {?} id
* @param {?} apiUrl
* @param {?=} params
* @param {?=} options
* @return {?}
*/
function (id, apiUrl, params, options) {
var _this = this;
/** @type {?} */
var url = this.createRequestUrl(apiUrl, 'datasets', id);
return this.requestApi(url, params, options).pipe(map(function (res) { return _this.prepareDataset(res, apiUrl); }));
};
/**
* @param {?} internalId
* @param {?=} params
* @param {?=} options
* @return {?}
*/
DatasetImplApiInterface.prototype.getDatasetByInternalId = /**
* @param {?} internalId
* @param {?=} params
* @param {?=} options
* @return {?}
*/
function (internalId, params, options) {
/** @type {?} */
var resolvedId = this.internalDatasetId.resolveInternalId(internalId);
return this.getDataset(resolvedId.id, resolvedId.url, params, options);
};
/**
* @template T
* @param {?} id
* @param {?} apiUrl
* @param {?} timespan
* @param {?=} params
* @param {?=} options
* @return {?}
*/
DatasetImplApiInterface.prototype.getData = /**
* @template T
* @param {?} id
* @param {?} apiUrl
* @param {?} timespan
* @param {?=} params
* @param {?=} options
* @return {?}
*/
function (id, apiUrl, timespan, params, options) {
if (params === void 0) { params = {}; }
/** @type {?} */
var url = this.createRequestUrl(apiUrl, 'datasets', id) + '/data';
params.timespan = this.createRequestTimespan(timespan);
return this.requestApi(url, params, options);
};
/**
* @param {?} url
* @param {?=} params
* @param {?=} options
* @return {?}
*/
DatasetImplApiInterface.prototype.requestApiTexted = /**
* @param {?} url
* @param {?=} params
* @param {?=} options
* @return {?}
*/
function (url, params, options) {
if (params === void 0) { params = {}; }
if (options === void 0) { options = {}; }
return this.httpservice.client(options).get(url, {
params: this.prepareParams(params),
responseType: 'text'
});
};
/**
* @param {?} url
* @param {?=} params
* @param {?=} options
* @return {?}
*/
DatasetImplApiInterface.prototype.requestApiTextedPost = /**
* @param {?} url
* @param {?=} params
* @param {?=} options
* @return {?}
*/
function (url, params, options) {
if (params === void 0) { params = {}; }
if (options === void 0) { options = {}; }
return this.httpservice.client().post(url, params, {
responseType: 'json'
});
};
/**
* @param {?} datasetObj
* @param {?} apiUrl
* @return {?}
*/
DatasetImplApiInterface.prototype.prepareDataset = /**
* @param {?} datasetObj
* @param {?} apiUrl
* @return {?}
*/
function (datasetObj, apiUrl) {
/** @type {?} */
var dataset = deserialize(Dataset, JSON.stringify(datasetObj));
dataset.url = apiUrl;
this.internalDatasetId.generateInternalId(dataset);
if (dataset.seriesParameters) {
dataset.parameters = dataset.seriesParameters;
delete dataset.seriesParameters;
}
return dataset;
};
DatasetImplApiInterface.decorators = [
{ type: Injectable },
];
/** @nocollapse */
DatasetImplApiInterface.ctorParameters = function () { return [
{ type: HttpService },
{ type: InternalIdHandler },
{ type: TranslateService }
]; };
return DatasetImplApiInterface;
}(DatasetApiInterface));
export { DatasetImplApiInterface };
if (false) {
/** @type {?} */
DatasetImplApiInterface.prototype.httpservice;
/** @type {?} */
DatasetImplApiInterface.prototype.internalDatasetId;
/** @type {?} */
DatasetImplApiInterface.prototype.translate;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXNldC1pbXBsLWFwaS1pbnRlcmZhY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BoZWxnb2xhbmQvY29yZS8iLCJzb3VyY2VzIjpbImxpYi9kYXRhc2V0LWFwaS9kYXRhc2V0LWltcGwtYXBpLWludGVyZmFjZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEUsT0FBTyxFQUFFLFVBQVUsRUFBWSxNQUFNLE1BQU0sQ0FBQztBQUM1QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJckMsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQW9DLE1BQU0sOEJBQThCLENBQUM7QUFVckcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDOztJQUdyQixtREFBbUI7SUFFNUQsaUNBQ2MsV0FBd0IsRUFDeEIsaUJBQW9DLEVBQ3BDLFNBQTJCO1FBSHpDLFlBS0ksa0JBQU0sV0FBVyxFQUFFLFNBQVMsQ0FBQyxTQUNoQztRQUxhLGlCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLHVCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsZUFBUyxHQUFULFNBQVMsQ0FBa0I7O0tBR3hDOzs7Ozs7O0lBRU0sNkNBQVc7Ozs7OztjQUFDLE1BQWMsRUFBRSxNQUF3QixFQUFFLE9BQTRCOztRQUNyRixJQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxF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Q0FBVSxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQzFFLE9BQU8sQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuRCxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQzNCLE9BQU8sQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDO1lBQzlDLE9BQU8sT0FBTyxDQUFDLGdCQUFnQixDQUFDO1NBQ25DO1FBQ0QsTUFBTSxDQUFDLE9BQU8sQ0FBQzs7O2dCQTNSdEIsVUFBVTs7OztnQkFIRixXQUFXO2dCQUNYLGlCQUFpQjtnQkFuQmpCLGdCQUFnQjs7a0NBRHpCO0VBdUI2QyxtQkFBbUI7U0FBbkQsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgZGVzZXJpYWxpemUsIGRlc2VyaWFsaXplQXJyYXkgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBPYnNlcnZlciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBDYXRlZ29yeSB9IGZyb20gJy4uL21vZGVsL2RhdGFzZXQtYXBpL2NhdGVnb3J5JztcbmltcG9ydCB7IERhdGEgfSBmcm9tICcuLi9tb2RlbC9kYXRhc2V0LWFwaS9kYXRhJztcbmltcG9ydCB7IERhdGFzZXQsIFRpbWVzZXJpZXMsIFRpbWVzZXJpZXNEYXRhLCBUaW1lc2VyaWVzRXh0cmFzIH0gZnJvbSAnLi4vbW9kZWwvZGF0YXNldC1hcGkvZGF0YXNldCc7XG5pbXBvcnQgeyBGZWF0dXJlIH0gZnJvbSAnLi4vbW9kZWwvZGF0YXNldC1hcGkvZmVhdHVyZSc7XG5pbXBvcnQgeyBPZmZlcmluZyB9IGZyb20gJy4uL21vZGVsL2RhdGFzZXQtYXBpL29mZmVyaW5nJztcbmltcG9ydCB7IFBoZW5vbWVub24gfSBmcm9tICcuLi9tb2RlbC9kYXRhc2V0LWFwaS9waGVub21lbm9uJztcbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnLi4vbW9kZWwvZGF0YXNldC1hcGkvcGxhdGZvcm0nO1xuaW1wb3J0IHsgUHJvY2VkdXJlIH0gZnJvbSAnLi4vbW9kZWwvZGF0YXNldC1hcGkvcHJvY2VkdXJlJztcbmltcG9ydCB7IFNlcnZpY2UgfSBmcm9tICcuLi9tb2RlbC9kYXRhc2V0LWFwaS9zZXJ2aWNlJztcbmltcG9ydCB7IFN0YXRpb24gfSBmcm9tICcuLi9tb2RlbC9kYXRhc2V0LWFwaS9zdGF0aW9uJztcbmltcG9ydCB7IERhdGFQYXJhbWV0ZXJGaWx0ZXIsIEh0dHBSZXF1ZXN0T3B0aW9ucywgUGFyYW1ldGVyRmlsdGVyIH0gZnJvbSAnLi4vbW9kZWwvaW50ZXJuYWwvaHR0cC1yZXF1ZXN0cyc7XG5pbXBvcnQgeyBUaW1lc3BhbiB9IGZyb20gJy4uL21vZGVsL2ludGVybmFsL3RpbWVJbnRlcnZhbCc7XG5pbXBvcnQgeyBEYXRhc2V0QXBpSW50ZXJmYWNlIH0gZnJvbSAnLi9hcGktaW50ZXJmYWNlJztcbmltcG9ydCB7IEh0dHBTZXJ2aWNlIH0gZnJvbSAnLi9odHRwLnNlcnZpY2UnO1xuaW1wb3J0IHsgSW50ZXJuYWxJZEhhbmRsZXIgfSBmcm9tICcuL2ludGVybmFsLWlkLWhhbmRsZXIuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEYXRhc2V0SW1wbEFwaUludGVyZmFjZSBleHRlbmRzIERhdGFzZXRBcGlJbnRlcmZhY2Uge1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCBodHRwc2VydmljZTogSHR0cFNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbERhdGFzZXRJZDogSW50ZXJuYWxJZEhhbmRsZXIsXG4gICAgICAgIHByb3RlY3RlZCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaHR0cHNlcnZpY2UsIHRyYW5zbGF0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNlcnZpY2VzKGFwaVVybDogc3RyaW5nLCBwYXJhbXM/OiBQYXJhbWV0ZXJGaWx0ZXIsIG9wdGlvbnM/OiBIdHRwUmVxdWVzdE9wdGlvbnMpOiBPYnNlcnZhYmxlPFNlcnZpY2VbXT4ge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmNyZWF0ZVJlcXVlc3RVcmwoYXBpVXJsLCAnc2VydmljZXMnKTtcbiAgICAgICAgaWYgKHBhcmFtcykge1xuICAgICAgICAgICAgcGFyYW1zLmV4cGFuZGVkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IHsgZXhwYW5kZWQ6IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0QXBpPFNlcnZpY2VbXT4odXJsLCBwYXJhbXMsIG9wdGlvbnMpLnBpcGUoXG4gICAgICAgICAgICBtYXAoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5mb3JFYWNoKChlbnRyeSkgPT4gZW50cnkuYXBpVXJsID0gYXBpVXJsKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTZXJ2aWNlKFxuICAgICAgICBpZDogc3RyaW5nLFxuICAgICAgICBhcGlVcmw6IHN0cmluZyxcbiAgICAgICAgcGFyYW1zPzogUGFyYW1ldGVyRmlsdGVyLFxuICAgICAgICBvcHRpb25zPzogSHR0cFJlcXVlc3RPcHRpb25zXG4gICAgKTogT2JzZXJ2YWJsZTxTZXJ2aWNlPiB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuY3JlYXRlUmVxdWVzdFVybChhcGlVcmwsICdzZXJ2aWNlcycsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdEFwaTxTZXJ2aWNlPih1cmwsIHBhcmFtcywgb3B0aW9ucykucGlwZShcbiAgICAgICAgICAgIG1hcCgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmFwaVVybCA9IGFwaVVybDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTdGF0aW9ucyhhcGlVcmw6IHN0cmluZywgcGFyYW1zPzogUGFyYW1ldGVyRmlsdGVyLCBvcHRpb25zPzogSHR0cFJlcXVlc3RPcHRpb25zKTogT2JzZXJ2YWJsZTxTdGF0aW9uW10+IHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jcmVhdGVSZXF1ZXN0VXJsKGFwaVVybCwgJ3N0YXRpb25zJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RBcGk8U3RhdGlvbltdPih1cmwsIHBhcmFtcywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFN0YXRpb24oXG4gICAgICAgIGlkOiBzdHJpbmcsXG4gICAgICAgIGFwaVVybDogc3RyaW5nLFxuICAgICAgICBwYXJhbXM/OiBQYXJhbWV0ZXJGaWx0ZXIsXG4gICAgICAgIG9wdGlvbnM/OiBIdHRwUmVxdWVzdE9wdGlvbnNcbiAgICApOiBPYnNlcnZhYmxlPFN0YXRpb24+IHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jcmVhdGVSZXF1ZXN0VXJsKGFwaVVybCwgJ3N0YXRpb25zJywgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0QXBpPFN0YXRpb24+KHVybCwgcGFyYW1zLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VGltZXNlcmllcyhhcGlVcmw6IHN0cmluZywgcGFyYW1zPzogUGFyYW1ldGVyRmlsdGVyLCBvcHRpb25zPzogSHR0cFJlcXVlc3RPcHRpb25zKTogT2JzZXJ2YWJsZTxUaW1lc2VyaWVzW10+IHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jcmVhdGVSZXF1ZXN0VXJsKGFwaVVybCwgJ3RpbWVzZXJpZXMnKTtcbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPFRpbWVzZXJpZXNbXT4oKG9ic2VydmVyOiBPYnNlcnZlcjxUaW1lc2VyaWVzW10+KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RBcGlUZXh0ZWQodXJsLCBwYXJhbXMsIG9wdGlvbnMpLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVzZXJpZXNMaXN0ID0gZGVzZXJpYWxpemVBcnJheTxUaW1lc2VyaWVzPihUaW1lc2VyaWVzLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB0aW1lc2VyaWVzTGlzdC5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkudXJsID0gYXBpVXJsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbERhdGFzZXRJZC5nZW5lcmF0ZUludGVybmFsSWQoZW50cnkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh0aW1lc2VyaWVzTGlzdCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoZXJyb3IpID0+IG9ic2VydmVyLmVycm9yKGVycm9yKSxcbiAgICAgICAgICAgICAgICAoKSA9PiBvYnNlcnZlci5jb21wbGV0ZSgpXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VGltZXNlcmllc0RhdGEoYXBpVXJsOiBzdHJpbmcsIGlkczogc3RyaW5nW10sIHRpbWVzcGFuOiBUaW1lc3Bhbiwgb3B0aW9ucz86IEh0dHBSZXF1ZXN0T3B0aW9ucyk6IE9ic2VydmFibGU8VGltZXNlcmllc0RhdGFbXT4ge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmNyZWF0ZVJlcXVlc3RVcmwoYXBpVXJsLCAndGltZXNlcmllcy9nZXREYXRhJyk7XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxUaW1lc2VyaWVzRGF0YVtdPigob2JzZXJ2ZXI6IE9ic2VydmVyPE9iamVjdD4pID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdEFwaVRleHRlZFBvc3QodXJsLCB7XG4gICAgICAgICAgICAgICAgdGltZXNwYW46IHRoaXMuY3JlYXRlUmVxdWVzdFRpbWVzcGFuKHRpbWVzcGFuKSxcbiAgICAgICAgICAgICAgICB0aW1lc2VyaWVzOiBpZHNcbiAgICAgICAgICAgIH0sIG9wdGlvbnMpLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVzZXJpZXNMaXN0OiBUaW1lc2VyaWVzRGF0YVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc2VyaWVzTGlzdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGFwaVVybCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHJlc3VsdFtpZF0udmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQodGltZXNlcmllc0xpc3QpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGVycm9yKSA9PiBvYnNlcnZlci5lcnJvcihlcnJvciksXG4gICAgICAgICAgICAgICAgKCkgPT4gb2JzZXJ2ZXIuY29tcGxldGUoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNpbmdsZVRpbWVzZXJpZXMoaWQ6IHN0cmluZywgYXBpVXJsOiBzdHJpbmcsIHBhcmFtcz86IFBhcmFtZXRlckZpbHRlcik6IE9ic2VydmFibGU8VGltZXNlcmllcz4ge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmNyZWF0ZVJlcXVlc3RVcmwoYXBpVXJsLCAndGltZXNlcmllcycsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdEFwaVRleHRlZCh1cmwsIHBhcmFtcykucGlwZShtYXAoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGltZXNlcmllcyA9IGRlc2VyaWFsaXplPFRpbWVzZXJpZXM+KFRpbWVzZXJpZXMsIHJlc3VsdCk7XG4gICAgICAgICAgICB0aW1lc2VyaWVzLnVybCA9IGFwaVVybDtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxEYXRhc2V0SWQuZ2VuZXJhdGVJbnRlcm5hbElkKHRpbWVzZXJpZXMpO1xuICAgICAgICAgICAgcmV0dXJuIHRpbWVzZXJpZXM7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2luZ2xlVGltZXNlcmllc0J5SW50ZXJuYWxJZChpbnRlcm5hbElkOiBzdHJpbmcsIHBhcmFtcz86IFBhcmFtZXRlckZpbHRlcik6IE9ic2VydmFibGU8VGltZXNlcmllcz4ge1xuICAgICAgICBjb25zdCByZXNvbHZlZElkID0gdGhpcy5pbnRlcm5hbERhdGFzZXRJZC5yZXNvbHZlSW50ZXJuYWxJZChpbnRlcm5hbElkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2luZ2xlVGltZXNlcmllcyhyZXNvbHZlZElkLmlkLCByZXNvbHZlZElkLnVybCwgcGFyYW1zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VGltZXNlcmllc0V4dHJhcyhpZDogc3RyaW5nLCBhcGlVcmw6IHN0cmluZyk6IE9ic2VydmFibGU8VGltZXNlcmllc0V4dHJhcz4ge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmNyZWF0ZVJlcXVlc3RVcmwoYXBpVXJsLCAndGltZXNlcmllcycsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdEFwaTxUaW1lc2VyaWVzRXh0cmFzPih1cmwgKyAnL2V4dHJhcycpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUc0RhdGE8VD4oXG4gICAgICAgIGlkOiBzdHJpbmcsXG4gICAgICAgIGFwaVVybDogc3RyaW5nLFxuICAgICAgICB0aW1lc3BhbjogVGltZXNwYW4sXG4gICAgICAgIHBhcmFtczogRGF0YVBhcmFtZXRlckZpbHRlciA9IHt9LFxuICAgICAgICBvcHRpb25zOiBIdHRwUmVxdWVzdE9wdGlvbnNcbiAgICApOiBPYnNlcnZhYmxlPERhdGE8VD4+IHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jcmVhdGVSZXF1ZXN0VXJsKGFwaVVybCwgJ3RpbWVzZXJpZXMnLCBpZCkgKyAnL2dldERhdGEnO1xuICAgICAgICBwYXJhbXMudGltZXNwYW4gPSB0aGlzLmNyZWF0ZVJlcXVlc3RUaW1lc3Bhbih0aW1lc3Bhbik7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RBcGk8RGF0YTxUPj4odXJsLCBwYXJhbXMsIG9wdGlvbnMpLnBpcGUoXG4gICAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5leHBhbmRlZCkgeyByZXMgPSByZXNbaWRdOyB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q2F0ZWdvcmllcyhhcGlVcmw6IHN0cmluZywgcGFyYW1zPzogUGFyYW1ldGVyRmlsdGVyLCBvcHRpb25zPzogSHR0cFJlcXVlc3RPcHRpb25zKTogT2JzZXJ2YWJsZTxDYXRlZ29yeVtdPiB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuY3JlYXRlUmVxdWVzdFVybChhcGlVcmwsICdjYXRlZ29yaWVzJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RBcGk8Q2F0ZWdvcnlbXT4odXJsLCBwYXJhbXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDYXRlZ29yeShpZDogc3RyaW5nLCBhcGlVcmw6IHN0cmluZywgcGFyYW1zPzogUGFyYW1ldGVyRmlsdGVyKTogT2JzZXJ2YWJsZTxDYXRlZ29yeT4ge1xuICAgICAgICAvLyBjb25zdCB1cmwgPSB0aGlzLmNyZWF0ZVJlcXVlc3RVcmwoYXBpVXJsLCAnY2F0ZWdvcmllcycsIGlkKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgICAgICAgLy8gcmV0dXJuIHRoaXMucmVxdWVzdEFwaSh1cmwsIHBhcmFtcylcbiAgICAgICAgLy8gICAgIC5tYXAodGhpcy5leHRyYWN0RGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBoZW5vbWVuYShhcGlVcmw6IHN0cmluZywgcGFyYW1zPzogUGFyYW1ldGVyRmlsdGVyLCBvcHRpb25zPzogSHR0cFJlcXVlc3RPcHRpb25zKTogT2JzZXJ2YWJsZTxQaGVub21lbm9uW10+IHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jcmVhdGVSZXF1ZXN0VXJsKGFwaVVybCwgJ3BoZW5vbWVuYScpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0QXBpPFBoZW5vbWVub25bXT4odXJsLCBwYXJhbXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQaGVub21lbm9uKFxuICAgICAgICBpZDogc3RyaW5nLFxuICAgICAgICBhcGlVcmw6IHN0cmluZyxcbiAgICAgICAgcGFyYW1zPzogUGFyYW1ldGVyRmlsdGVyLFxuICAgICAgICBvcHRpb25zPzogSHR0cFJlcXVlc3RPcHRpb25zXG4gICAgKTogT2JzZXJ2YWJsZTxQaGVub21lbm9uPiB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuY3JlYXRlUmVxdWVzdFVybChhcGlVcmwsICdwaGVub21lbmEnLCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RBcGk8UGhlbm9tZW5vbj4odXJsLCBwYXJhbXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRPZmZlcmluZ3MoYXBpVXJsOiBzdHJpbmcsIHBhcmFtcz86IFBhcmFtZXRlckZpbHRlciwgb3B0aW9ucz86IEh0dHBSZXF1ZXN0T3B0aW9ucyk6IE9ic2VydmFibGU8T2ZmZXJpbmdbXT4ge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmNyZWF0ZVJlcXVlc3RVcmwoYXBpVXJsLCAnb2ZmZXJpbmdzJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RBcGk8T2ZmZXJpbmdbXT4odXJsLCBwYXJhbXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRPZmZlcmluZyhcbiAgICAgICAgaWQ6IHN0cmluZyxcbiAgICAgICAgYXBpVXJsOiBzdHJpbmcsXG4gICAgICAgIHBhcmFtcz86IFBhcmFtZXRlckZpbHRlcixcbiAgICAgICAgb3B0aW9ucz86IEh0dHBSZXF1ZXN0T3B0aW9uc1xuICAgICk6IE9ic2VydmFibGU8T2ZmZXJpbmc+IHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jcmVhdGVSZXF1ZXN0VXJsKGFwaVVybCwgJ29mZmVyaW5ncycsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdEFwaTxPZmZlcmluZz4odXJsLCBwYXJhbXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGZWF0dXJlcyhhcGlVcmw6IHN0cmluZywgcGFyYW1zPzogUGFyYW1ldGVyRmlsdGVyLCBvcHRpb25zPzogSHR0cFJlcXVlc3RPcHRpb25zKTogT2JzZXJ2YWJsZTxGZWF0dXJlW10+IHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jcmVhdGVSZXF1ZXN0VXJsKGFwaVVybCwgJ2ZlYXR1cmVzJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RBcGk8RmVhdHVyZVtdPih1cmwsIHBhcmFtcywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZlYXR1cmUoXG4gICAgICAgIGlkOiBzdHJpbmcsXG4gICAgICAgIGFwaVVybDogc3RyaW5nLFxuICAgICAgICBwYXJhbXM/OiBQYXJhbWV0ZXJGaWx0ZXIsXG4gICAgICAgIG9wdGlvbnM/OiBIdHRwUmVxdWVzdE9wdGlvbnNcbiAgICApOiBPYnNlcnZhYmxlPEZlYXR1cmU+IHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jcmVhdGVSZXF1ZXN0VXJsKGFwaVVybCwgJ2ZlYXR1cmVzJywgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0QXBpPEZlYXR1cmU+KHVybCwgcGFyYW1zLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UHJvY2VkdXJlcyhhcGlVcmw6IHN0cmluZywgcGFyYW1zPzogUGFyYW1ldGVyRmlsdGVyLCBvcHRpb25zPzogSHR0cFJlcXVlc3RPcHRpb25zKTogT2JzZXJ2YWJsZTxQcm9jZWR1cmVbXT4ge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmNyZWF0ZVJlcXVlc3RVcmwoYXBpVXJsLCAncHJvY2VkdXJlcycpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0QXBpPFByb2NlZHVyZVtdPih1cmwsIHBhcmFtcywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFByb2NlZHVyZShcbiAgICAgICAgaWQ6IHN0cmluZyxcbiAgICAgICAgYXBpVXJsOiBzdHJpbmcsXG4gICAgICAgIHBhcmFtcz86IFBhcmFtZXRlckZpbHRlcixcbiAgICAgICAgb3B0aW9ucz86IEh0dHBSZXF1ZXN0T3B0aW9uc1xuICAgICk6IE9ic2VydmFibGU8UHJvY2VkdXJlPiB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuY3JlYXRlUmVxdWVzdFVybChhcGlVcmwsICdwcm9jZWR1cmVzJywgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0QXBpPFByb2NlZHVyZT4odXJsLCBwYXJhbXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQbGF0Zm9ybXMoYXBpVXJsOiBzdHJpbmcsIHBhcmFtcz86IFBhcmFtZXRlckZpbHRlciwgb3B0aW9ucz86IEh0dHBSZXF1ZXN0T3B0aW9ucyk6IE9ic2VydmFibGU8UGxhdGZvcm1bXT4ge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmNyZWF0ZVJlcXVlc3RVcmwoYXBpVXJsLCAncGxhdGZvcm1zJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RBcGk8UGxhdGZvcm1bXT4odXJsLCBwYXJhbXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQbGF0Zm9ybShcbiAgICAgICAgaWQ6IHN0cmluZyxcbiAgICAgICAgYXBpVXJsOiBzdHJpbmcsXG4gICAgICAgIHBhcmFtcz86IFBhcmFtZXRlckZpbHRlcixcbiAgICAgICAgb3B0aW9ucz86IEh0dHBSZXF1ZXN0T3B0aW9uc1xuICAgICk6IE9ic2VydmFibGU8UGxhdGZvcm0+IHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jcmVhdGVSZXF1ZXN0VXJsKGFwaVVybCwgJ3BsYXRmb3JtcycsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdEFwaTxQbGF0Zm9ybT4odXJsLCBwYXJhbXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXREYXRhc2V0cyhhcGlVcmw6IHN0cmluZywgcGFyYW1zPzogUGFyYW1ldGVyRmlsdGVyLCBvcHRpb25zPzogSHR0cFJlcXVlc3RPcHRpb25zKTogT2JzZXJ2YWJsZTxEYXRhc2V0W10+IHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jcmVhdGVSZXF1ZXN0VXJsKGFwaVVybCwgJ2RhdGFzZXRzJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RBcGk8RGF0YXNldFtdPih1cmwsIHBhcmFtcywgb3B0aW9ucykucGlwZShcbiAgICAgICAgICAgIG1hcCgobGlzdCkgPT4gbGlzdC5tYXAoKGVudHJ5KSA9PiB0aGlzLnByZXBhcmVEYXRhc2V0KGVudHJ5LCBhcGlVcmwpKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGF0YXNldChpZDogc3RyaW5nLCBhcGlVcmw6IHN0cmluZywgcGFyYW1zPzogUGFyYW1ldGVyRmlsdGVyLCBvcHRpb25zPzogSHR0cFJlcXVlc3RPcHRpb25zKTogT2JzZXJ2YWJsZTxEYXRhc2V0PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuY3JlYXRlUmVxdWVzdFVybChhcGlVcmwsICdkYXRhc2V0cycsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdEFwaTxEYXRhc2V0Pih1cmwsIHBhcmFtcywgb3B0aW9ucykucGlwZShcbiAgICAgICAgICAgIG1hcCgocmVzKSA9PiB0aGlzLnByZXBhcmVEYXRhc2V0KHJlcywgYXBpVXJsKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGF0YXNldEJ5SW50ZXJuYWxJZChpbnRlcm5hbElkOiBzdHJpbmcsIHBhcmFtcz86IFBhcmFtZXRlckZpbHRlciwgb3B0aW9ucz86IEh0dHBSZXF1ZXN0T3B0aW9ucyk6IE9ic2VydmFibGU8RGF0YXNldD4ge1xuICAgICAgICBjb25zdCByZXNvbHZlZElkID0gdGhpcy5pbnRlcm5hbERhdGFzZXRJZC5yZXNvbHZlSW50ZXJuYWxJZChpbnRlcm5hbElkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF0YXNldChyZXNvbHZlZElkLmlkLCByZXNvbHZlZElkLnVybCwgcGFyYW1zLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGF0YTxUPihcbiAgICAgICAgaWQ6IHN0cmluZyxcbiAgICAgICAgYXBpVXJsOiBzdHJpbmcsXG4gICAgICAgIHRpbWVzcGFuOiBUaW1lc3BhbixcbiAgICAgICAgcGFyYW1zOiBEYXRhUGFyYW1ldGVyRmlsdGVyID0ge30sXG4gICAgICAgIG9wdGlvbnM6IEh0dHBSZXF1ZXN0T3B0aW9uc1xuICAgICk6IE9ic2VydmFibGU8RGF0YTxUPj4ge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmNyZWF0ZVJlcXVlc3RVcmwoYXBpVXJsLCAnZGF0YXNldHMnLCBpZCkgKyAnL2RhdGEnO1xuICAgICAgICBwYXJhbXMudGltZXNwYW4gPSB0aGlzLmNyZWF0ZVJlcXVlc3RUaW1lc3Bhbih0aW1lc3Bhbik7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RBcGk8RGF0YTxUPj4odXJsLCBwYXJhbXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIHB1YmxpYyBnZXRHZW9tZXRyaWVzKGlkOiBzdHJpbmcsIGFwaVVybDogc3RyaW5nLCBwYXJhbXM/KTogT2JzZXJ2YWJsZTw+IHtcbiAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgICAvLyB9XG5cbiAgICAvLyBwcm90ZWN0ZWQgY3JlYXRlUmVxdWVzdFRpbWVzcGFuKHRpbWVzcGFuOiBUaW1lc3Bhbik6IHN0cmluZyB7XG4gICAgLy8gICAgIHJldHVybiBlbmNvZGVVUkkobW9tZW50KHRpbWVzcGFuLmZyb20pLmZvcm1hdCgpICsgJy8nICsgbW9tZW50KHRpbWVzcGFuLnRvKS5mb3JtYXQoKSk7XG4gICAgLy8gfVxuXG4gICAgcHJpdmF0ZSByZXF1ZXN0QXBpVGV4dGVkKHVybDogc3RyaW5nLCBwYXJhbXM6IFBhcmFtZXRlckZpbHRlciA9IHt9LCBvcHRpb25zOiBIdHRwUmVxdWVzdE9wdGlvbnMgPSB7fSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBzZXJ2aWNlLmNsaWVudChvcHRpb25zKS5nZXQodXJsLCB7XG4gICAgICAgICAgICBwYXJhbXM6IHRoaXMucHJlcGFyZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCdcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXF1ZXN0QXBpVGV4dGVkUG9zdCh1cmw6IHN0cmluZywgcGFyYW1zOiBQYXJhbWV0ZXJGaWx0ZXIgPSB7fSwgb3B0aW9uczogSHR0cFJlcXVlc3RPcHRpb25zID0ge30pOiBPYnNlcnZhYmxlPE9iamVjdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwc2VydmljZS5jbGllbnQoKS5wb3N0KHVybCwgcGFyYW1zLCB7XG4gICAgICAgICAgICByZXNwb25zZVR5cGU6ICdqc29uJ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByZXBhcmVEYXRhc2V0KGRhdGFzZXRPYmo6IERhdGFzZXQsIGFwaVVybDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGRhdGFzZXQgPSBkZXNlcmlhbGl6ZTxEYXRhc2V0PihEYXRhc2V0LCBKU09OLnN0cmluZ2lmeShkYXRhc2V0T2JqKSk7XG4gICAgICAgIGRhdGFzZXQudXJsID0gYXBpVXJsO1xuICAgICAgICB0aGlzLmludGVybmFsRGF0YXNldElkLmdlbmVyYXRlSW50ZXJuYWxJZChkYXRhc2V0KTtcbiAgICAgICAgaWYgKGRhdGFzZXQuc2VyaWVzUGFyYW1ldGVycykge1xuICAgICAgICAgICAgZGF0YXNldC5wYXJhbWV0ZXJzID0gZGF0YXNldC5zZXJpZXNQYXJhbWV0ZXJzO1xuICAgICAgICAgICAgZGVsZXRlIGRhdGFzZXQuc2VyaWVzUGFyYW1ldGVycztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YXNldDtcbiAgICB9XG59XG4iXX0=