UNPKG

ontimize-web-ngx

Version:
197 lines 29.5 kB
import { HttpHeaders } from '@angular/common/http'; import { Injectable, Injector } from '@angular/core'; import { Observable, share } from 'rxjs'; import { AppConfig } from '../../config/app-config'; import { Util } from '../../util/util'; import { BaseDataService } from '../base-data-service.class'; import { O_JSON_API_CONFIG } from '../../injection-tokens'; import * as i0 from "@angular/core"; export class JSONAPIService extends BaseDataService { constructor(injector) { super(injector); this.injector = injector; this.DEFAULT_DELIMITER = '_'; this.config = this.injector.get(AppConfig); const jsonApiConfig = this.injector.get(O_JSON_API_CONFIG); this.delimiter = jsonApiConfig?.multipleKeyDelimiter || this.DEFAULT_DELIMITER; } startsession(user, password) { const url = this.urlBase + this._startSessionPath; const options = { headers: new HttpHeaders({ Authorization: 'Basic ' + btoa(user + ':' + password) }), observe: 'response' }; const dataObservable = new Observable(observer => { this.httpClient.post(url, null, options).subscribe({ next: (resp) => { if (Util.isDefined(resp) && Util.isDefined(resp.headers) && Util.isDefined(resp.headers.get('X-Auth-Token'))) { observer.next(resp.headers.get('X-Auth-Token')); } else { observer.error('Invalid user or password'); } }, error: (error) => observer.error(error) }); }); return dataObservable.pipe(share()); } endsession(user, sessionId) { const url = this.urlBase + '/endsession?user=' + user + '&sessionid=' + sessionId; const dataObservable = new Observable(_closeSessionObserver => { this.httpClient.get(url).subscribe({ next: (resp) => { _closeSessionObserver.next(resp); }, error: (error) => { if (error.status === 401 || error.status === 0 || !error.ok) { _closeSessionObserver.next(0); } else { _closeSessionObserver.error(error); } } }); }); return dataObservable.pipe(share()); } buildHeaders() { let headers = super.buildHeaders(); const sessionId = this.authService.getSessionInfo().id; if (Util.isDefined(sessionId)) { headers = headers.append('Authorization', 'Bearer ' + sessionId); } return headers; } hassession(user, sessionId) { const dataObservable = new Observable(observer => { observer.next(true); }); return dataObservable.pipe(share()); } configureService(config) { super.configureService(config); this._startSessionPath = this._appConfig.startSessionPath ? this._appConfig.startSessionPath : '/auth/login'; this.path = config.path; this.delimiter = this.getValidDelimiter(config.multipleKeyDelimiter ?? this.delimiter); } getValidDelimiter(delimiter) { if (!delimiter || !/^[_-]$/.test(delimiter)) { console.warn(`Delimiter '${delimiter}' is not valid for URL, defaulting to '${this.DEFAULT_DELIMITER}'.`); return this.DEFAULT_DELIMITER; } return delimiter; } query(queryParams) { queryParams = this.parseNameConventionQueryParams(queryParams); const queryParamsToString = Util.objectToQueryString(queryParams); const queryParamsString = Util.isDefined(queryParams) ? '?' + queryParamsToString : ''; const url = `${this.urlBase}${this.path}${queryParamsString}`; return this.doRequest({ method: 'GET', url: url, successCallback: this.parseSuccessfulQueryResponse, errorCallBack: this.parseUnsuccessfulQueryResponse }); } advancedQuery(queryParams) { return this.query(queryParams); } queryById(queryParams) { queryParams = this.parseNameConventionQueryParams(queryParams); const serializedId = this.serializeCompositeKey(queryParams.filter); const url = `${this.urlBase}${this.path}/${serializedId}`; return this.doRequest({ method: 'GET', url: url, successCallback: this.parseSuccessfulQueryResponse, errorCallBack: this.parseUnsuccessfulQueryResponse, }); } serializeCompositeKey(keyObj) { if (keyObj == null) { console.warn('JSONAPI Service: Key object is null or undefined.'); return ''; } if (typeof keyObj === 'string') { if (keyObj.trim() === '') { console.warn('JSONAPI Service: Key string is empty.'); } return keyObj; } const values = Object.values(keyObj); if (values.length === 0) { console.warn('JSONAPI Service: Key object has no properties.'); return ''; } for (const val of values) { if (val == null) { console.warn('JSONAPI Service: Key object contains null or undefined value.'); } } return Object.values(keyObj).join(this.delimiter); } parseNameConventionQueryParams(queryParams) { if (Util.isDefined(queryParams.fields)) { const entity = Object.keys(queryParams.fields)[0]; const fields = Object.values(queryParams.fields)[0]; queryParams.fields[entity] = this.nameConvention.parseColumnsToNameConventionForJSONAPI(fields); } if (Util.isDefined(queryParams.sort)) { queryParams.sort = this.nameConvention.parseColumnsToNameConventionForJSONAPI(queryParams.sort); } if (Util.isDefined(queryParams.filter)) { const filter = this.nameConvention.parseFilterToNameConvention(queryParams.filter); queryParams.filter = { ...filter }; } return queryParams; } insert(attributes, type) { const url = `${this.urlBase}${this.path}`; attributes = this.nameConvention.parseDataToNameConvention(attributes); let data = { attributes: attributes, type: type }; const body = JSON.stringify({ data: data }); return this.doRequest({ method: 'POST', url: url, body: body, successCallback: this.parseSuccessfulInsertResponse, errorCallBack: this.parseUnsuccessfulInsertResponse }); } update(id, attributes, type) { const serializedId = this.serializeCompositeKey(id); const url = `${this.urlBase}${this.path}/${serializedId}`; attributes = this.nameConvention.parseDataToNameConvention(attributes); let data = { ...{ attributes: attributes }, ...{ id: serializedId }, ...{ type: type } }; const body = JSON.stringify({ data: data }); return this.doRequest({ method: 'PATCH', url: url, body: body, successCallback: this.parseSuccessfulUpdateResponse, errorCallBack: this.parseUnsuccessfulUpdateResponse }); } delete(id) { const serializedId = this.serializeCompositeKey(id); const url = `${this.urlBase}${this.path}/${serializedId}`; return this.doRequest({ method: 'DELETE', url: url, successCallback: this.parseSuccessfulDeleteResponse, errorCallBack: this.parseUnsuccessfulDeleteResponse }); } } JSONAPIService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: JSONAPIService, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); JSONAPIService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: JSONAPIService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: JSONAPIService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i0.Injector }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbmFwaS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL3NlcnZpY2VzL2pzb25hcGkvanNvbmFwaS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV6QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFJcEQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFJM0QsTUFBTSxPQUFPLGNBQWUsU0FBUSxlQUFnQztJQU9sRSxZQUFzQixRQUFrQjtRQUN0QyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFESSxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBSnJCLHNCQUFpQixHQUFHLEdBQUcsQ0FBQztRQU16QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFpQixpQkFBaUIsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxTQUFTLEdBQUcsYUFBYSxFQUFFLG9CQUFvQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNqRixDQUFDO0lBRU0sWUFBWSxDQUFDLElBQVksRUFBRSxRQUFnQjtRQUNoRCxNQUFNLEdBQUcs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LElBQUksQ0FBQywrQkFBK0I7U0FDcEQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7NEdBcE9VLGNBQWM7Z0hBQWQsY0FBYzs0RkFBZCxjQUFjO2tCQUQxQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgc2hhcmUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQXBwQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29uZmlnL2FwcC1jb25maWcnO1xuaW1wb3J0IHsgSUF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9hdXRoLXNlcnZpY2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IEpTT05BUElSZXNwb25zZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvanNvbmFwaS1yZXNwb25zZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSlNPTkFQSVF1ZXJ5UGFyYW1ldGVyIH0gZnJvbSAnLi4vLi4vdHlwZXMvanNvbi1xdWVyeS1wYXJhbWV0ZXIudHlwZSc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IEJhc2VEYXRhU2VydmljZSB9IGZyb20gJy4uL2Jhc2UtZGF0YS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IE9fSlNPTl9BUElfQ09ORklHIH0gZnJvbSAnLi4vLi4vaW5qZWN0aW9uLXRva2Vucyc7XG5pbXBvcnQgeyBJSnNvbkFwaUNvbmZpZyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvanNvbmFwaS1jb25maWcuaW50ZXJmYWNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEpTT05BUElTZXJ2aWNlIGV4dGVuZHMgQmFzZURhdGFTZXJ2aWNlPEpTT05BUElSZXNwb25zZT4gaW1wbGVtZW50cyBJQXV0aFNlcnZpY2Uge1xuICBwcm90ZWN0ZWQgX3N0YXJ0U2Vzc2lvblBhdGg6IHN0cmluZztcbiAgcHJvdGVjdGVkIGNvbmZpZzogQXBwQ29uZmlnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgREVGQVVMVF9ERUxJTUlURVIgPSAnXyc7XG4gIGRlbGltaXRlcjogc3RyaW5nO1xuXG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgIHN1cGVyKGluamVjdG9yKTtcbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMuaW5qZWN0b3IuZ2V0KEFwcENvbmZpZyk7XG4gICAgY29uc3QganNvbkFwaUNvbmZpZyA9IHRoaXMuaW5qZWN0b3IuZ2V0PElKc29uQXBpQ29uZmlnPihPX0pTT05fQVBJX0NPTkZJRyk7XG4gICAgdGhpcy5kZWxpbWl0ZXIgPSBqc29uQXBpQ29uZmlnPy5tdWx0aXBsZUtleURlbGltaXRlciB8fCB0aGlzLkRFRkFVTFRfREVMSU1JVEVSO1xuICB9XG5cbiAgcHVibGljIHN0YXJ0c2Vzc2lvbih1c2VyOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZyB8IG51bWJlcj4ge1xuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsQmFzZSArIHRoaXMuX3N0YXJ0U2Vzc2lvblBhdGg7XG4gICAgY29uc3Qgb3B0aW9uczogYW55ID0ge1xuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgQXV0aG9yaXphdGlvbjogJ0Jhc2ljICcgKyBidG9hKHVzZXIgKyAnOicgKyBwYXNzd29yZClcbiAgICAgIH0pLFxuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJ1xuICAgIH07XG4gICAgY29uc3QgZGF0YU9ic2VydmFibGU6IE9ic2VydmFibGU8c3RyaW5nIHwgbnVtYmVyPiA9IG5ldyBPYnNlcnZhYmxlKG9ic2VydmVyID0+IHtcbiAgICAgIHRoaXMuaHR0cENsaWVudC5wb3N0KHVybCwgbnVsbCwgb3B0aW9ucykuc3Vic2NyaWJlKFxuICAgICAgICB7XG4gICAgICAgICAgbmV4dDogKHJlc3A6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKHJlc3ApICYmIFV0aWwuaXNEZWZpbmVkKHJlc3AuaGVhZGVycykgJiYgVXRpbC5pc0RlZmluZWQocmVzcC5oZWFkZXJzLmdldCgnWC1BdXRoLVRva2VuJykpKSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmVzcC5oZWFkZXJzLmdldCgnWC1BdXRoLVRva2VuJykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gSW52YWxpZCBzZXNzaW9uSWQgLi4uXG4gICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKCdJbnZhbGlkIHVzZXIgb3IgcGFzc3dvcmQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLCBlcnJvcjogKGVycm9yKSA9PiBvYnNlcnZlci5lcnJvcihlcnJvcilcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGRhdGFPYnNlcnZhYmxlLnBpcGUoc2hhcmUoKSk7XG4gIH1cblxuICBwdWJsaWMgZW5kc2Vzc2lvbih1c2VyOiBzdHJpbmcsIHNlc3Npb25JZDogbnVtYmVyKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybEJhc2UgKyAnL2VuZHNlc3Npb24/dXNlcj0nICsgdXNlciArICcmc2Vzc2lvbmlkPScgKyBzZXNzaW9uSWQ7XG4gICAgY29uc3QgZGF0YU9ic2VydmFibGU6IE9ic2VydmFibGU8YW55PiA9IG5ldyBPYnNlcnZhYmxlKF9jbG9zZVNlc3Npb25PYnNlcnZlciA9PiB7XG4gICAgICB0aGlzLmh0dHBDbGllbnQuZ2V0KHVybCkuc3Vic2NyaWJlKFxuICAgICAgICB7XG4gICAgICAgICAgbmV4dDogKHJlc3ApID0+IHtcbiAgICAgICAgICAgIF9jbG9zZVNlc3Npb25PYnNlcnZlci5uZXh0KHJlc3ApO1xuICAgICAgICAgIH0sIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT09IDQwMSB8fCBlcnJvci5zdGF0dXMgPT09IDAgfHwgIWVycm9yLm9rKSB7XG4gICAgICAgICAgICAgIF9jbG9zZVNlc3Npb25PYnNlcnZlci5uZXh0KDApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgX2Nsb3NlU2Vzc2lvbk9ic2VydmVyLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG4gICAgcmV0dXJuIGRhdGFPYnNlcnZhYmxlLnBpcGUoc2hhcmUoKSk7XG5cbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZEhlYWRlcnMoKTogSHR0cEhlYWRlcnMge1xuICAgIGxldCBoZWFkZXJzID0gc3VwZXIuYnVpbGRIZWFkZXJzKCk7XG4gICAgY29uc3Qgc2Vzc2lvbklkID0gdGhpcy5hdXRoU2VydmljZS5nZXRTZXNzaW9uSW5mbygpLmlkO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChzZXNzaW9uSWQpKSB7XG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBzZXNzaW9uSWQpO1xuICAgIH1cbiAgICByZXR1cm4gaGVhZGVycztcbiAgfVxuXG4gIHB1YmxpYyBoYXNzZXNzaW9uKHVzZXI6IHN0cmluZywgc2Vzc2lvbklkOiBhbnkpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBkYXRhT2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxhbnk+ID0gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgb2JzZXJ2ZXIubmV4dCh0cnVlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YU9ic2VydmFibGUucGlwZShzaGFyZSgpKTtcbiAgfVxuXG4gIHB1YmxpYyBjb25maWd1cmVTZXJ2aWNlKGNvbmZpZzogYW55KTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlU2VydmljZShjb25maWcpO1xuICAgIHRoaXMuX3N0YXJ0U2Vzc2lvblBhdGggPSB0aGlzLl9hcHBDb25maWcuc3RhcnRTZXNzaW9uUGF0aCA/IHRoaXMuX2FwcENvbmZpZy5zdGFydFNlc3Npb25QYXRoIDogJy9hdXRoL2xvZ2luJztcbiAgICB0aGlzLnBhdGggPSBjb25maWcucGF0aDtcbiAgICB0aGlzLmRlbGltaXRlciA9IHRoaXMuZ2V0VmFsaWREZWxpbWl0ZXIoY29uZmlnLm11bHRpcGxlS2V5RGVsaW1pdGVyID8/IHRoaXMuZGVsaW1pdGVyKTtcbiAgfVxuXG5cbiAgcHJvdGVjdGVkIGdldFZhbGlkRGVsaW1pdGVyKGRlbGltaXRlcj86IHN0cmluZyk6IHN0cmluZyB7XG5cbiAgICBpZiAoIWRlbGltaXRlciB8fCAhL15bXy1dJC8udGVzdChkZWxpbWl0ZXIpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYERlbGltaXRlciAnJHtkZWxpbWl0ZXJ9JyBpcyBub3QgdmFsaWQgZm9yIFVSTCwgZGVmYXVsdGluZyB0byAnJHt0aGlzLkRFRkFVTFRfREVMSU1JVEVSfScuYCk7XG4gICAgICByZXR1cm4gdGhpcy5ERUZBVUxUX0RFTElNSVRFUlxuICAgIH1cbiAgICByZXR1cm4gZGVsaW1pdGVyO1xuICB9XG5cbiAgcXVlcnkocXVlcnlQYXJhbXM6IEpTT05BUElRdWVyeVBhcmFtZXRlcik6IE9ic2VydmFibGU8SlNPTkFQSVJlc3BvbnNlPiB7XG4gICAgcXVlcnlQYXJhbXMgPSB0aGlzLnBhcnNlTmFtZUNvbnZlbnRpb25RdWVyeVBhcmFtcyhxdWVyeVBhcmFtcyk7XG4gICAgY29uc3QgcXVlcnlQYXJhbXNUb1N0cmluZyA9IFV0aWwub2JqZWN0VG9RdWVyeVN0cmluZyhxdWVyeVBhcmFtcyk7XG5cbiAgICBjb25zdCBxdWVyeVBhcmFtc1N0cmluZyA9IFV0aWwuaXNEZWZpbmVkKHF1ZXJ5UGFyYW1zKSA/ICc/JyArIHF1ZXJ5UGFyYW1zVG9TdHJpbmcgOiAnJztcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMudXJsQmFzZX0ke3RoaXMucGF0aH0ke3F1ZXJ5UGFyYW1zU3RyaW5nfWA7XG5cbiAgICByZXR1cm4gdGhpcy5kb1JlcXVlc3Qoe1xuICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgIHVybDogdXJsLFxuICAgICAgc3VjY2Vzc0NhbGxiYWNrOiB0aGlzLnBhcnNlU3VjY2Vzc2Z1bFF1ZXJ5UmVzcG9uc2UsXG4gICAgICBlcnJvckNhbGxCYWNrOiB0aGlzLnBhcnNlVW5zdWNjZXNzZnVsUXVlcnlSZXNwb25zZVxuICAgIH0pO1xuICB9XG5cbiAgYWR2YW5jZWRRdWVyeShxdWVyeVBhcmFtczogSlNPTkFQSVF1ZXJ5UGFyYW1ldGVyKTogT2JzZXJ2YWJsZTxKU09OQVBJUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeShxdWVyeVBhcmFtcyk7XG4gIH1cblxuICBxdWVyeUJ5SWQocXVlcnlQYXJhbXM6IEpTT05BUElRdWVyeVBhcmFtZXRlcik6IE9ic2VydmFibGU8SlNPTkFQSVJlc3BvbnNlPiB7XG4gICAgcXVlcnlQYXJhbXMgPSB0aGlzLnBhcnNlTmFtZUNvbnZlbnRpb25RdWVyeVBhcmFtcyhxdWVyeVBhcmFtcyk7XG5cbiAgICBjb25zdCBzZXJpYWxpemVkSWQgPSB0aGlzLnNlcmlhbGl6ZUNvbXBvc2l0ZUtleShxdWVyeVBhcmFtcy5maWx0ZXIpO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMudXJsQmFzZX0ke3RoaXMucGF0aH0vJHtzZXJpYWxpemVkSWR9YDtcblxuICAgIHJldHVybiB0aGlzLmRvUmVxdWVzdCh7XG4gICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgdXJsOiB1cmwsXG4gICAgICBzdWNjZXNzQ2FsbGJhY2s6IHRoaXMucGFyc2VTdWNjZXNzZnVsUXVlcnlSZXNwb25zZSxcbiAgICAgIGVycm9yQ2FsbEJhY2s6IHRoaXMucGFyc2VVbnN1Y2Nlc3NmdWxRdWVyeVJlc3BvbnNlLFxuICAgIH0pO1xuICB9XG5cblxuICBwcm90ZWN0ZWQgc2VyaWFsaXplQ29tcG9zaXRlS2V5KGtleU9iajogc3RyaW5nIHwgb2JqZWN0KTogc3RyaW5nIHtcbiAgICBpZiAoa2V5T2JqID09IG51bGwpIHtcbiAgICAgIGNvbnNvbGUud2FybignSlNPTkFQSSBTZXJ2aWNlOiBLZXkgb2JqZWN0IGlzIG51bGwgb3IgdW5kZWZpbmVkLicpO1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Yga2V5T2JqID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGtleU9iai50cmltKCkgPT09ICcnKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignSlNPTkFQSSBTZXJ2aWNlOiBLZXkgc3RyaW5nIGlzIGVtcHR5LicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGtleU9iajtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKGtleU9iaik7XG5cbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS53YXJuKCdKU09OQVBJIFNlcnZpY2U6IEtleSBvYmplY3QgaGFzIG5vIHByb3BlcnRpZXMuJyk7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB2YWwgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdKU09OQVBJIFNlcnZpY2U6IEtleSBvYmplY3QgY29udGFpbnMgbnVsbCBvciB1bmRlZmluZWQgdmFsdWUuJyk7XG4gICAgICB9XG4gICAgfVxuXG5cbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhrZXlPYmopLmpvaW4odGhpcy5kZWxpbWl0ZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlTmFtZUNvbnZlbnRpb25RdWVyeVBhcmFtcyhxdWVyeVBhcmFtczogSlNPTkFQSVF1ZXJ5UGFyYW1ldGVyKTogSlNPTkFQSVF1ZXJ5UGFyYW1ldGVyIHtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQocXVlcnlQYXJhbXMuZmllbGRzKSkge1xuICAgICAgY29uc3QgZW50aXR5ID0gT2JqZWN0LmtleXMocXVlcnlQYXJhbXMuZmllbGRzKVswXTtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IE9iamVjdC52YWx1ZXMocXVlcnlQYXJhbXMuZmllbGRzKVswXTtcbiAgICAgIHF1ZXJ5UGFyYW1zLmZpZWxkc1tlbnRpdHldID0gdGhpcy5uYW1lQ29udmVudGlvbi5wYXJzZUNvbHVtbnNUb05hbWVDb252ZW50aW9uRm9ySlNPTkFQSShmaWVsZHMpO1xuICAgIH1cbiAgICBpZiAoVXRpbC5pc0RlZmluZWQocXVlcnlQYXJhbXMuc29ydCkpIHtcbiAgICAgIHF1ZXJ5UGFyYW1zLnNvcnQgPSB0aGlzLm5hbWVDb252ZW50aW9uLnBhcnNlQ29sdW1uc1RvTmFtZUNvbnZlbnRpb25Gb3JKU09OQVBJKHF1ZXJ5UGFyYW1zLnNvcnQpO1xuICAgIH1cblxuICAgIGlmIChVdGlsLmlzRGVmaW5lZChxdWVyeVBhcmFtcy5maWx0ZXIpKSB7XG4gICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLm5hbWVDb252ZW50aW9uLnBhcnNlRmlsdGVyVG9OYW1lQ29udmVudGlvbihxdWVyeVBhcmFtcy5maWx0ZXIpO1xuICAgICAgcXVlcnlQYXJhbXMuZmlsdGVyID0geyAuLi5maWx0ZXIgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gcXVlcnlQYXJhbXM7XG4gIH1cblxuICBpbnNlcnQoYXR0cmlidXRlczogb2JqZWN0LCB0eXBlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEpTT05BUElSZXNwb25zZT4ge1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMudXJsQmFzZX0ke3RoaXMucGF0aH1gO1xuXG4gICAgYXR0cmlidXRlcyA9IHRoaXMubmFtZUNvbnZlbnRpb24ucGFyc2VEYXRhVG9OYW1lQ29udmVudGlvbihhdHRyaWJ1dGVzKTtcblxuICAgIGxldCBkYXRhID0geyBhdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzLCB0eXBlOiB0eXBlIH07XG4gICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmRvUmVxdWVzdCh7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIHVybDogdXJsLFxuICAgICAgYm9keTogYm9keSxcbiAgICAgIHN1Y2Nlc3NDYWxsYmFjazogdGhpcy5wYXJzZVN1Y2Nlc3NmdWxJbnNlcnRSZXNwb25zZSxcbiAgICAgIGVycm9yQ2FsbEJhY2s6IHRoaXMucGFyc2VVbnN1Y2Nlc3NmdWxJbnNlcnRSZXNwb25zZVxuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlKGlkOiBzdHJpbmcgfCBvYmplY3QsIGF0dHJpYnV0ZXM6IG9iamVjdCwgdHlwZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxKU09OQVBJUmVzcG9uc2U+IHtcblxuICAgIGNvbnN0IHNlcmlhbGl6ZWRJZCA9IHRoaXMuc2VyaWFsaXplQ29tcG9zaXRlS2V5KGlkKTtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnVybEJhc2V9JHt0aGlzLnBhdGh9LyR7c2VyaWFsaXplZElkfWA7XG5cblxuICAgIGF0dHJpYnV0ZXMgPSB0aGlzLm5hbWVDb252ZW50aW9uLnBhcnNlRGF0YVRvTmFtZUNvbnZlbnRpb24oYXR0cmlidXRlcyk7XG5cbiAgICBsZXQgZGF0YSA9IHsgLi4ueyBhdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzIH0sIC4uLnsgaWQ6IHNlcmlhbGl6ZWRJZCB9LCAuLi57IHR5cGU6IHR5cGUgfSB9O1xuXG4gICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmRvUmVxdWVzdCh7XG4gICAgICBtZXRob2Q6ICdQQVRDSCcsXG4gICAgICB1cmw6IHVybCxcbiAgICAgIGJvZHk6IGJvZHksXG4gICAgICBzdWNjZXNzQ2FsbGJhY2s6IHRoaXMucGFyc2VTdWNjZXNzZnVsVXBkYXRlUmVzcG9uc2UsXG4gICAgICBlcnJvckNhbGxCYWNrOiB0aGlzLnBhcnNlVW5zdWNjZXNzZnVsVXBkYXRlUmVzcG9uc2VcbiAgICB9KTtcbiAgfVxuXG4gIGRlbGV0ZShpZDogb2JqZWN0KTogT2JzZXJ2YWJsZTxKU09OQVBJUmVzcG9uc2U+IHtcbiAgICBjb25zdCBzZXJpYWxpemVkSWQgPSB0aGlzLnNlcmlhbGl6ZUNvbXBvc2l0ZUtleShpZCk7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy51cmxCYXNlfSR7dGhpcy5wYXRofS8ke3NlcmlhbGl6ZWRJZH1gO1xuXG4gICAgcmV0dXJuIHRoaXMuZG9SZXF1ZXN0KHtcbiAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgICB1cmw6IHVybCxcbiAgICAgIHN1Y2Nlc3NDYWxsYmFjazogdGhpcy5wYXJzZVN1Y2Nlc3NmdWxEZWxldGVSZXNwb25zZSxcbiAgICAgIGVycm9yQ2FsbEJhY2s6IHRoaXMucGFyc2VVbnN1Y2Nlc3NmdWxEZWxldGVSZXNwb25zZVxuICAgIH0pO1xuICB9XG59XG4iXX0=