@linid-dm/directory-manager-client-core
Version:
Core package by providing a set of angular components for the Directory Manager app.
171 lines • 26.2 kB
JavaScript
/**
* Copyright (C) 2020-2024 Linagora
*
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU Affero General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any
* later version, provided you comply with the Additional Terms applicable for
* LinID Directory Manager software by LINAGORA pursuant to Section 7 of the GNU
* Affero General Public License, subsections (b), (c), and (e), pursuant to
* which these Appropriate Legal Notices must notably (i) retain the display of
* the "LinID™" trademark/logo at the top of the interface window, the display
* of the “You are using the Open Source and free version of LinID™, powered by
* Linagora © 2009–2013. Contribute to LinID R&D by subscribing to an Enterprise
* offer!” infobox and in the e-mails sent with the Program, notice appended to
* any type of outbound messages (e.g. e-mail and meeting requests) as well as
* in the LinID Directory Manager user interface, (ii) retain all hypertext
* links between LinID Directory Manager and https://linid.org/, as well as
* between LINAGORA and LINAGORA.com, and (iii) refrain from infringing LINAGORA
* intellectual property rights over its trademarks and commercial brands. Other
* Additional Terms apply, see <http://www.linagora.com/licenses/> for more
* details.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
* details.
*
* You should have received a copy of the GNU Affero General Public License and
* its applicable Additional Terms for LinID Directory Manager along with this
* program. If not, see <http://www.gnu.org/licenses/> for the GNU Affero
* General Public License version 3 and <http://www.linagora.com/licenses/> for
* the Additional Terms applicable to the LinID Directory Manager software.
*/
import { HttpHeaders, } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { catchError, finalize, takeUntil, tap, throwError, } from 'rxjs';
import { escapeBackSlash } from '../helpers/data-table.helper';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common/http";
import * as i2 from "./env.service";
import * as i3 from "./interactions.service";
export class DataService {
}
export class DataServiceImpl extends DataService {
constructor(http, env, interactionsService) {
super();
this.http = http;
this.env = env;
this.interactionsService = interactionsService;
}
getDataList(dataType, params = undefined, isRequestForFormField = false) {
if (this._isProcessingGetRequest && !isRequestForFormField) {
this.interactionsService.cancelRequest();
}
let requestParams = {};
if (!!params) {
if (params.filter) {
requestParams = { filter: params.filter };
}
if (params.attributes) {
requestParams = {
...requestParams,
attributes: params.attributes.join(','),
};
}
if (params.extendedMeta) {
requestParams = { ...requestParams, extendedMeta: params.extendedMeta };
}
}
if (!isRequestForFormField) {
this._isProcessingGetRequest = true;
}
return this.http
.get(`${this.env.urlBackend}/${dataType}`, {
params: requestParams,
})
.pipe(takeUntil(this.interactionsService.cancelRequest$), tap((__) => {
if (!isRequestForFormField) {
this._isProcessingGetRequest = false;
}
}), catchError((err) => {
if (!isRequestForFormField) {
this._isProcessingGetRequest = false;
}
return throwError(() => err);
}), finalize(() => {
if (!isRequestForFormField) {
this._isProcessingGetRequest = false;
}
}));
}
getDataListWithParameteredFilter(requestTarget, regexParam, regexFilter, attributes, extendedMeta) {
regexFilter = regexFilter.replace('$1', regexParam);
return this.getDataList(requestTarget, {
filter: escapeBackSlash(regexFilter),
attributes,
extendedMeta,
});
}
getDataDetail(dataType, id) {
let params = {};
params = { ...params, getOperationalAttributes: true };
return this.http.get(`${this.env.urlBackend}/${dataType}/${id}`, {
params,
});
}
removeData(dataType, id) {
return this.http.delete(`${this.env.urlBackend}/${dataType}/${id}`);
}
updateData(dataType, id, body) {
return this.http.put(`${this.env.urlBackend}/${dataType}/${id}`, body, {
headers: new HttpHeaders({
'Content-Type': 'application/json',
timeout: '30000',
}),
observe: 'response',
});
}
createData(dataType, body, params) {
return this.http.post(`${this.env.urlBackend}/${dataType}`, body, {
headers: new HttpHeaders({
'Content-Type': 'application/json',
timeout: '30000',
}),
observe: 'response',
params,
});
}
search(dataType, filter, postRequest, body, extendedMeta) {
let searchRequest$;
if (this._isProcessingGetRequest) {
this.interactionsService.cancelRequest();
}
if (postRequest) {
searchRequest$ = this.http.post(`${this.env.urlBackend}/${dataType}/.search`, { ...body, filter }, {
headers: new HttpHeaders({
'Content-Type': 'application/json',
}),
observe: 'response',
params: { extendedMeta: extendedMeta ?? false },
});
}
else {
searchRequest$ = this.http.get(`${this.env.urlBackend}/${dataType}`, {
params: { filter: escapeBackSlash(filter) },
headers: new HttpHeaders({ 'Content-Type': 'application/json' }),
observe: 'response',
});
}
this._isProcessingGetRequest = true;
return searchRequest$.pipe(takeUntil(this.interactionsService.cancelRequest$), tap((__) => (this._isProcessingGetRequest = false)), catchError((err) => {
this._isProcessingGetRequest = false;
return throwError(() => err);
}), finalize(() => (this._isProcessingGetRequest = false)));
}
patchData(dataType, id, body) {
return this.http.patch(`${this.env.urlBackend}/${dataType}/${id}`, body, {
headers: new HttpHeaders({
'Content-Type': 'application/json',
timeout: '30000',
}),
observe: 'response',
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: DataServiceImpl, deps: [{ token: i1.HttpClient }, { token: i2.EnvService }, { token: i3.InteractionsService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: DataServiceImpl }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: DataServiceImpl, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.EnvService }, { type: i3.InteractionsService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbGlicy9jbGllbnQtY29yZS9zcmMvbGliL3NoYXJlZC9zZXJ2aWNlcy9kYXRhLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBRUgsT0FBTyxFQUdMLFdBQVcsR0FHWixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUVMLFVBQVUsRUFDVixRQUFRLEVBQ1IsU0FBUyxFQUNULEdBQUcsRUFDSCxVQUFVLEdBQ1gsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7O0FBSy9ELE1BQU0sT0FBZ0IsV0FBVztDQWdEaEM7QUFHRCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxXQUFXO0lBRzlDLFlBQ1ksSUFBZ0IsRUFDaEIsR0FBZSxFQUNmLG1CQUF3QztRQUVsRCxLQUFLLEVBQUUsQ0FBQztRQUpFLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsUUFBRyxHQUFILEdBQUcsQ0FBWTtRQUNmLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7SUFHcEQsQ0FBQztJQUVELFdBQVcsQ0FDVCxRQUFnQixFQUNoQixTQUFjLFNBQVMsRUFDdkIscUJBQXFCLEdBQUcsS0FBSztRQUU3QixJQUFJLElBQUksQ0FBQyx1QkFBdUIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDM0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzNDLENBQUM7UUFDRCxJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDYixJQUFJLE1BQU0sQ0FB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SyxDQUNwQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLFFBQVEsSUFBSSxFQUFFLEVBQUUsRUFDMUMsSUFBSSxFQUNKO1lBQ0UsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUN2QixjQUFjLEVBQUUsa0JBQWtCO2dCQUNsQyxPQUFPLEVBQUUsT0FBTzthQUNqQixDQUFDO1lBQ0YsT0FBTyxFQUFFLFVBQVU7U0FDcEIsQ0FDRixDQUFDO0lBQ0osQ0FBQzs4R0EzTFUsZUFBZTtrSEFBZixlQUFlOzsyRkFBZixlQUFlO2tCQUQzQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyNCBMaW5hZ29yYVxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyXG4gKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWVcbiAqIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55XG4gKiBsYXRlciB2ZXJzaW9uLCBwcm92aWRlZCB5b3UgY29tcGx5IHdpdGggdGhlIEFkZGl0aW9uYWwgVGVybXMgYXBwbGljYWJsZSBmb3JcbiAqIExpbklEIERpcmVjdG9yeSBNYW5hZ2VyIHNvZnR3YXJlIGJ5IExJTkFHT1JBIHB1cnN1YW50IHRvIFNlY3Rpb24gNyBvZiB0aGUgR05VXG4gKiBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgc3Vic2VjdGlvbnMgKGIpLCAoYyksIGFuZCAoZSksIHB1cnN1YW50IHRvXG4gKiB3aGljaCB0aGVzZSBBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzIG11c3Qgbm90YWJseSAoaSkgcmV0YWluIHRoZSBkaXNwbGF5IG9mXG4gKiB0aGUgXCJMaW5JROKEolwiIHRyYWRlbWFyay9sb2dvIGF0IHRoZSB0b3Agb2YgdGhlIGludGVyZmFjZSB3aW5kb3csIHRoZSBkaXNwbGF5XG4gKiBvZiB0aGUg4oCcWW91IGFyZSB1c2luZyB0aGUgT3BlbiBTb3VyY2UgYW5kIGZyZWUgdmVyc2lvbiBvZiBMaW5JROKEoiwgcG93ZXJlZCBieVxuICogTGluYWdvcmEgwqkgMjAwOeKAkzIwMTMuIENvbnRyaWJ1dGUgdG8gTGluSUQgUiZEIGJ5IHN1YnNjcmliaW5nIHRvIGFuIEVudGVycHJpc2VcbiAqIG9mZmVyIeKAnSBpbmZvYm94IGFuZCBpbiB0aGUgZS1tYWlscyBzZW50IHdpdGggdGhlIFByb2dyYW0sIG5vdGljZSBhcHBlbmRlZCB0b1xuICogYW55IHR5cGUgb2Ygb3V0Ym91bmQgbWVzc2FnZXMgKGUuZy4gZS1tYWlsIGFuZCBtZWV0aW5nIHJlcXVlc3RzKSBhcyB3ZWxsIGFzXG4gKiBpbiB0aGUgTGluSUQgRGlyZWN0b3J5IE1hbmFnZXIgdXNlciBpbnRlcmZhY2UsIChpaSkgcmV0YWluIGFsbCBoeXBlcnRleHRcbiAqIGxpbmtzIGJldHdlZW4gTGluSUQgRGlyZWN0b3J5IE1hbmFnZXIgYW5kIGh0dHBzOi8vbGluaWQub3JnLywgYXMgd2VsbCBhc1xuICogYmV0d2VlbiBMSU5BR09SQSBhbmQgTElOQUdPUkEuY29tLCBhbmQgKGlpaSkgcmVmcmFpbiBmcm9tIGluZnJpbmdpbmcgTElOQUdPUkFcbiAqIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3ZlciBpdHMgdHJhZGVtYXJrcyBhbmQgY29tbWVyY2lhbCBicmFuZHMuIE90aGVyXG4gKiBBZGRpdGlvbmFsIFRlcm1zIGFwcGx5LCBzZWUgPGh0dHA6Ly93d3cubGluYWdvcmEuY29tL2xpY2Vuc2VzLz4gZm9yIG1vcmVcbiAqIGRldGFpbHMuXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUXG4gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTU1xuICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZVxuICogZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kXG4gKiBpdHMgYXBwbGljYWJsZSBBZGRpdGlvbmFsIFRlcm1zIGZvciBMaW5JRCBEaXJlY3RvcnkgTWFuYWdlciBhbG9uZyB3aXRoIHRoaXNcbiAqIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPiBmb3IgdGhlIEdOVSBBZmZlcm9cbiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIGFuZCA8aHR0cDovL3d3dy5saW5hZ29yYS5jb20vbGljZW5zZXMvPiBmb3JcbiAqIHRoZSBBZGRpdGlvbmFsIFRlcm1zIGFwcGxpY2FibGUgdG8gdGhlIExpbklEIERpcmVjdG9yeSBNYW5hZ2VyIHNvZnR3YXJlLlxuICovXG5cbmltcG9ydCB7XG4gIEh0dHBDbGllbnQsXG4gIEh0dHBFcnJvclJlc3BvbnNlLFxuICBIdHRwSGVhZGVycyxcbiAgSHR0cFBhcmFtcyxcbiAgSHR0cFJlc3BvbnNlLFxufSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBPYnNlcnZhYmxlLFxuICBjYXRjaEVycm9yLFxuICBmaW5hbGl6ZSxcbiAgdGFrZVVudGlsLFxuICB0YXAsXG4gIHRocm93RXJyb3IsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZXNjYXBlQmFja1NsYXNoIH0gZnJvbSAnLi4vaGVscGVycy9kYXRhLXRhYmxlLmhlbHBlcic7XG5pbXBvcnQgeyBJRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMvZGF0YS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRW52U2VydmljZSB9IGZyb20gJy4vZW52LnNlcnZpY2UnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb25zU2VydmljZSB9IGZyb20gJy4vaW50ZXJhY3Rpb25zLnNlcnZpY2UnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGF0YVNlcnZpY2Uge1xuICBhYnN0cmFjdCBnZXREYXRhTGlzdChcbiAgICBkYXRhVHlwZTogc3RyaW5nLFxuICAgIGJvZHk/OiBhbnksXG4gICAgaXNSZXF1ZXN0Rm9yRm9ybUZpZWxkPzogYm9vbGVhblxuICApOiBPYnNlcnZhYmxlPElEYXRhPjtcblxuICBhYnN0cmFjdCBnZXREYXRhTGlzdFdpdGhQYXJhbWV0ZXJlZEZpbHRlcihcbiAgICByZXF1ZXN0VGFyZ2V0OiBzdHJpbmcsXG4gICAgcmVnZXhQYXJhbTogc3RyaW5nLFxuICAgIHJlZ2V4RmlsdGVyOiBzdHJpbmcsXG4gICAgYm9keTogYW55LFxuICAgIGV4dGVuZGVkTWV0YTogYm9vbGVhblxuICApOiBPYnNlcnZhYmxlPElEYXRhPjtcblxuICBhYnN0cmFjdCBnZXREYXRhRGV0YWlsKGRhdGFUeXBlOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT47XG5cbiAgYWJzdHJhY3QgcmVtb3ZlRGF0YShkYXRhVHlwZTogc3RyaW5nLCBpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+O1xuXG4gIGFic3RyYWN0IHVwZGF0ZURhdGEoXG4gICAgZGF0YVR5cGU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nLFxuICAgIGJvZHk6IGFueVxuICApOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxhbnk+PjtcblxuICBhYnN0cmFjdCBjcmVhdGVEYXRhKFxuICAgIGRhdGFUeXBlOiBzdHJpbmcsXG4gICAgYm9keTogYW55LFxuICAgIHBhcmFtcz86XG4gICAgICB8IEh0dHBQYXJhbXNcbiAgICAgIHwge1xuICAgICAgICAgIFtwYXJhbTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgICAgIH1cbiAgKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8YW55Pj47XG5cbiAgYWJzdHJhY3Qgc2VhcmNoKFxuICAgIGRhdGFUeXBlOiBzdHJpbmcsXG4gICAgZmlsdGVyOiBzdHJpbmcsXG4gICAgcG9zdFJlcXVlc3Q/OiBib29sZWFuLFxuICAgIGJvZHk/OiBhbnksXG4gICAgZXh0ZW5kZWRNZXRhPzogYm9vbGVhblxuICApOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxJRGF0YT4gfCBIdHRwRXJyb3JSZXNwb25zZT47XG5cbiAgYWJzdHJhY3QgcGF0Y2hEYXRhKFxuICAgIGRhdGFUeXBlOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBib2R5OiBhbnlcbiAgKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8YW55Pj47XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEYXRhU2VydmljZUltcGwgZXh0ZW5kcyBEYXRhU2VydmljZSB7XG4gIHByaXZhdGUgX2lzUHJvY2Vzc2luZ0dldFJlcXVlc3Q6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJvdGVjdGVkIGVudjogRW52U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgaW50ZXJhY3Rpb25zU2VydmljZTogSW50ZXJhY3Rpb25zU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgZ2V0RGF0YUxpc3QoXG4gICAgZGF0YVR5cGU6IHN0cmluZyxcbiAgICBwYXJhbXM6IGFueSA9IHVuZGVmaW5lZCxcbiAgICBpc1JlcXVlc3RGb3JGb3JtRmllbGQgPSBmYWxzZVxuICApOiBPYnNlcnZhYmxlPElEYXRhPiB7XG4gICAgaWYgKHRoaXMuX2lzUHJvY2Vzc2luZ0dldFJlcXVlc3QgJiYgIWlzUmVxdWVzdEZvckZvcm1GaWVsZCkge1xuICAgICAgdGhpcy5pbnRlcmFjdGlvbnNTZXJ2aWNlLmNhbmNlbFJlcXVlc3QoKTtcbiAgICB9XG4gICAgbGV0IHJlcXVlc3RQYXJhbXMgPSB7fTtcbiAgICBpZiAoISFwYXJhbXMpIHtcbiAgICAgIGlmIChwYXJhbXMuZmlsdGVyKSB7XG4gICAgICAgIHJlcXVlc3RQYXJhbXMgPSB7IGZpbHRlcjogcGFyYW1zLmZpbHRlciB9O1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5hdHRyaWJ1dGVzKSB7XG4gICAgICAgIHJlcXVlc3RQYXJhbXMgPSB7XG4gICAgICAgICAgLi4ucmVxdWVzdFBhcmFtcyxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBwYXJhbXMuYXR0cmlidXRlcy5qb2luKCcsJyksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLmV4dGVuZGVkTWV0YSkge1xuICAgICAgICByZXF1ZXN0UGFyYW1zID0geyAuLi5yZXF1ZXN0UGFyYW1zLCBleHRlbmRlZE1ldGE6IHBhcmFtcy5leHRlbmRlZE1ldGEgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFpc1JlcXVlc3RGb3JGb3JtRmllbGQpIHtcbiAgICAgIHRoaXMuX2lzUHJvY2Vzc2luZ0dldFJlcXVlc3QgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAuZ2V0PElEYXRhPihgJHt0aGlzLmVudi51cmxCYWNrZW5kfS8ke2RhdGFUeXBlfWAsIHtcbiAgICAgICAgcGFyYW1zOiByZXF1ZXN0UGFyYW1zLFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5pbnRlcmFjdGlvbnNTZXJ2aWNlLmNhbmNlbFJlcXVlc3QkKSxcbiAgICAgICAgdGFwKChfXykgPT4ge1xuICAgICAgICAgIGlmICghaXNSZXF1ZXN0Rm9yRm9ybUZpZWxkKSB7XG4gICAgICAgICAgICB0aGlzLl9pc1Byb2Nlc3NpbmdHZXRSZXF1ZXN0ID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG4gICAgICAgICAgaWYgKCFpc1JlcXVlc3RGb3JGb3JtRmllbGQpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzUHJvY2Vzc2luZ0dldFJlcXVlc3QgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyKTtcbiAgICAgICAgfSksXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICBpZiAoIWlzUmVxdWVzdEZvckZvcm1GaWVsZCkge1xuICAgICAgICAgICAgdGhpcy5faXNQcm9jZXNzaW5nR2V0UmVxdWVzdCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBnZXREYXRhTGlzdFdpdGhQYXJhbWV0ZXJlZEZpbHRlcihcbiAgICByZXF1ZXN0VGFyZ2V0OiBzdHJpbmcsXG4gICAgcmVnZXhQYXJhbTogc3RyaW5nLFxuICAgIHJlZ2V4RmlsdGVyOiBzdHJpbmcsXG4gICAgYXR0cmlidXRlczogc3RyaW5nW10sXG4gICAgZXh0ZW5kZWRNZXRhOiBib29sZWFuXG4gICk6IE9ic2VydmFibGU8SURhdGE+IHtcbiAgICByZWdleEZpbHRlciA9IHJlZ2V4RmlsdGVyLnJlcGxhY2UoJyQxJywgcmVnZXhQYXJhbSk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGF0YUxpc3QocmVxdWVzdFRhcmdldCwge1xuICAgICAgZmlsdGVyOiBlc2NhcGVCYWNrU2xhc2gocmVnZXhGaWx0ZXIpLFxuICAgICAgYXR0cmlidXRlcyxcbiAgICAgIGV4dGVuZGVkTWV0YSxcbiAgICB9KTtcbiAgfVxuXG4gIGdldERhdGFEZXRhaWwoZGF0YVR5cGU6IHN0cmluZywgaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhcmFtcyA9IHt9O1xuICAgIHBhcmFtcyA9IHsgLi4ucGFyYW1zLCBnZXRPcGVyYXRpb25hbEF0dHJpYnV0ZXM6IHRydWUgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnk+KGAke3RoaXMuZW52LnVybEJhY2tlbmR9LyR7ZGF0YVR5cGV9LyR7aWR9YCwge1xuICAgICAgcGFyYW1zLFxuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlRGF0YShkYXRhVHlwZTogc3RyaW5nLCBpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZTxhbnk+KGAke3RoaXMuZW52LnVybEJhY2tlbmR9LyR7ZGF0YVR5cGV9LyR7aWR9YCk7XG4gIH1cblxuICB1cGRhdGVEYXRhKFxuICAgIGRhdGFUeXBlOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBib2R5OiBhbnlcbiAgKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8YW55Pj4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PGFueT4oXG4gICAgICBgJHt0aGlzLmVudi51cmxCYWNrZW5kfS8ke2RhdGFUeXBlfS8ke2lkfWAsXG4gICAgICBib2R5LFxuICAgICAge1xuICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgdGltZW91dDogJzMwMDAwJyxcbiAgICAgICAgfSksXG4gICAgICAgIG9ic2VydmU6ICdyZXNwb25zZScsXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGNyZWF0ZURhdGEoXG4gICAgZGF0YVR5cGU6IHN0cmluZyxcbiAgICBib2R5OiBhbnksXG4gICAgcGFyYW1zPzpcbiAgICAgIHwgSHR0cFBhcmFtc1xuICAgICAgfCB7XG4gICAgICAgICAgW3BhcmFtOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICAgICAgfVxuICApOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxhbnk+PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PGFueT4oYCR7dGhpcy5lbnYudXJsQmFja2VuZH0vJHtkYXRhVHlwZX1gLCBib2R5LCB7XG4gICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB0aW1lb3V0OiAnMzAwMDAnLFxuICAgICAgfSksXG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnLFxuICAgICAgcGFyYW1zLFxuICAgIH0pO1xuICB9XG5cbiAgc2VhcmNoKFxuICAgIGRhdGFUeXBlOiBzdHJpbmcsXG4gICAgZmlsdGVyOiBzdHJpbmcsXG4gICAgcG9zdFJlcXVlc3Q/OiBib29sZWFuLFxuICAgIGJvZHk/OiBhbnksXG4gICAgZXh0ZW5kZWRNZXRhPzogYm9vbGVhblxuICApOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxJRGF0YT4gfCBIdHRwRXJyb3JSZXNwb25zZT4ge1xuICAgIGxldCBzZWFyY2hSZXF1ZXN0JDogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8SURhdGE+PjtcbiAgICBpZiAodGhpcy5faXNQcm9jZXNzaW5nR2V0UmVxdWVzdCkge1xuICAgICAgdGhpcy5pbnRlcmFjdGlvbnNTZXJ2aWNlLmNhbmNlbFJlcXVlc3QoKTtcbiAgICB9XG4gICAgaWYgKHBvc3RSZXF1ZXN0KSB7XG4gICAgICBzZWFyY2hSZXF1ZXN0JCA9IHRoaXMuaHR0cC5wb3N0PElEYXRhPihcbiAgICAgICAgYCR7dGhpcy5lbnYudXJsQmFja2VuZH0vJHtkYXRhVHlwZX0vLnNlYXJjaGAsXG4gICAgICAgIHsgLi4uYm9keSwgZmlsdGVyIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBvYnNlcnZlOiAncmVzcG9uc2UnLFxuICAgICAgICAgIHBhcmFtczogeyBleHRlbmRlZE1ldGE6IGV4dGVuZGVkTWV0YSA/PyBmYWxzZSB9LFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWFyY2hSZXF1ZXN0JCA9IHRoaXMuaHR0cC5nZXQ8SURhdGE+KFxuICAgICAgICBgJHt0aGlzLmVudi51cmxCYWNrZW5kfS8ke2RhdGFUeXBlfWAsXG4gICAgICAgIHtcbiAgICAgICAgICBwYXJhbXM6IHsgZmlsdGVyOiBlc2NhcGVCYWNrU2xhc2goZmlsdGVyKSB9LFxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSksXG4gICAgICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5faXNQcm9jZXNzaW5nR2V0UmVxdWVzdCA9IHRydWU7XG4gICAgcmV0dXJuIHNlYXJjaFJlcXVlc3QkLnBpcGUoXG4gICAgICB0YWtlVW50aWwodGhpcy5pbnRlcmFjdGlvbnNTZXJ2aWNlLmNhbmNlbFJlcXVlc3QkKSxcbiAgICAgIHRhcCgoX18pID0+ICh0aGlzLl9pc1Byb2Nlc3NpbmdHZXRSZXF1ZXN0ID0gZmFsc2UpKSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xuICAgICAgICB0aGlzLl9pc1Byb2Nlc3NpbmdHZXRSZXF1ZXN0ID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycik7XG4gICAgICB9KSxcbiAgICAgIGZpbmFsaXplKCgpID0+ICh0aGlzLl9pc1Byb2Nlc3NpbmdHZXRSZXF1ZXN0ID0gZmFsc2UpKVxuICAgICk7XG4gIH1cblxuICBwYXRjaERhdGEoXG4gICAgZGF0YVR5cGU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nLFxuICAgIGJvZHk6IGFueVxuICApOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxhbnk+PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wYXRjaDxhbnk+KFxuICAgICAgYCR7dGhpcy5lbnYudXJsQmFja2VuZH0vJHtkYXRhVHlwZX0vJHtpZH1gLFxuICAgICAgYm9keSxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgIHRpbWVvdXQ6ICczMDAwMCcsXG4gICAgICAgIH0pLFxuICAgICAgICBvYnNlcnZlOiAncmVzcG9uc2UnLFxuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiJdfQ==