UNPKG

@mgrcto/angular-odata-v401

Version:

Odata Library for Angular made with Angular CLI

208 lines 29.4 kB
import { HttpParams } from '@angular/common/http'; import { throwError } from 'rxjs'; import { catchError, map } from 'rxjs/operators'; export class ODataOperation { constructor(typeName, config, http) { this.typeName = typeName; this.config = config; this.http = http; this._expand = []; this._select = []; } Expand(expand) { if (expand) { this._expand = this.toStringArray(expand); } return this; } /** * Selects Entities. If String is separated by "/" the first part will be expanded and the second part will be selected in the expand. * @param select * @returns ODataOperation<T> */ Select(select) { if (select) { this._select = this.toStringArray(select); } return this; } getParams(aParams) { const expandData = new Map(); const normalSelects = []; this._expand.forEach((name) => expandData.set(name, [])); this._select.forEach((select) => { const items = select.split('/'); // Select contains string like: `Boss/Name` if (items.length > 1) { const expandName = items[0]; const propertyName = items[1]; if (!expandData.has(expandName)) { expandData.set(expandName, []); } expandData.get(expandName).push(propertyName); } else { // Select is just a simple string like: `Boss` normalSelects.push(select); } }); let params = (aParams && Object.keys(aParams).length > 0) ? aParams : new HttpParams(); const expands = []; expandData.forEach((val, key) => { if (val.length) { expands.push(`${key}(${this.config.keys.select}=${this.toCommaString(val)})`); return; } expands.push(key); }); if (expands.length) { params = params.append(this.config.keys.expand, this.toCommaString(expands)); } if (normalSelects.length) { params = params.append(this.config.keys.select, this.toCommaString(normalSelects)); } return params; } handleResponse(entity) { return entity .pipe(map(this.extractData), catchError((err, caught) => { if (this.config.handleError) { this.config.handleError(err, caught); } return throwError(err); })); } getDefaultRequestOptions() { const options = Object.assign({}, this.config.defaultRequestOptions); options.params = this.getParams(options.params); return options; } getPostRequestOptions() { const options = Object.assign({}, this.config.postRequestOptions); options.params = this.getParams(options.params); return options; } GeneratePostUrl(entitiesUri) { const params = this.getParams(this.config.postRequestOptions.params); if (params.keys().length > 0) { return `${entitiesUri}?${params}`; } return entitiesUri; } GenerateUrl(entitiesUri) { const params = this.getParams(this.config.defaultRequestOptions.params); if (params.keys().length > 0) { return `${entitiesUri}?${params}`; } return entitiesUri; } toStringArray(input) { if (!input) { return []; } if (input instanceof String || typeof input === 'string') { return input.split(',').map(s => s.trim()); } if (input instanceof Array) { return input; } return []; } toCommaString(input) { if (input instanceof String || typeof input === 'string') { return input; } if (input instanceof Array) { return input.join(); } return ""; } extractData(res) { if (res.status < 200 || res.status >= 300) { throw new Error('Bad response status: ' + res.status); } const body = res.body; return body || {}; } } export class OperationWithKey extends ODataOperation { constructor(_typeName, config, http, entityKey) { super(_typeName, config, http); this._typeName = _typeName; this.config = config; this.http = http; this.entityKey = entityKey; } getEntityUri() { return this.config.getEntityUri(this.entityKey, this.typeName); } GetUrl() { return this.GenerateUrl(this.getEntityUri()); } } export class OperationWithEntity extends ODataOperation { constructor(_typeName, config, http, entity) { super(_typeName, config, http); this._typeName = _typeName; this.config = config; this.http = http; this.entity = entity; } getEntitiesUri() { return this.config.getEntitiesUri(this._typeName); } GetUrl() { return this.GenerateUrl(this.getEntitiesUri()); } } export class OperationWithKeyAndEntity extends OperationWithKey { constructor(_typeName, config, http, entityKey, entity) { super(_typeName, config, http, entityKey); this._typeName = _typeName; this.config = config; this.http = http; this.entityKey = entityKey; this.entity = entity; } getEntityUri() { return this.config.getEntityUri(this.entityKey, this._typeName); } } export class GetOperation extends OperationWithKey { Exec() { return super.handleResponse(this.http.get(this.getEntityUri(), this.getDefaultRequestOptions())); } } export class PostOperation extends OperationWithEntity { Exec() { const body = this.entity ? JSON.stringify(this.entity) : null; return super.handleResponse(this.http.post(this.getEntitiesUri(), body, this.getPostRequestOptions())); } GetUrl() { return this.GeneratePostUrl(this.getEntitiesUri()); } } export class PatchOperation extends OperationWithKeyAndEntity { Exec() { const body = this.entity ? JSON.stringify(this.entity) : null; return super.handleResponse(this.http.patch(this.getEntityUri(), body, this.getPostRequestOptions())); } GetUrl() { return this.GeneratePostUrl(this.getEntityUri()); } } export class PutOperation extends OperationWithKeyAndEntity { Exec() { const body = this.entity ? JSON.stringify(this.entity) : null; return super.handleResponse(this.http.put(this.getEntityUri(), body, this.getPostRequestOptions())); } GetUrl() { return this.GeneratePostUrl(this.getEntityUri()); } } export class DeleteOperation extends OperationWithKey { Exec() { return super.handleResponse(this.http.delete(this.getEntityUri(), this.config.defaultRequestOptions)); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhck9EYXRhT3BlcmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS12NDAxL3NyYy9saWIvb2RhdGEvYW5ndWxhck9EYXRhT3BlcmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBMkIsVUFBVSxFQUFnQixNQUFNLHNCQUFzQixDQUFDO0FBQ3pGLE9BQU8sRUFBYyxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdqRCxNQUFNLE9BQWdCLGNBQWM7SUFJaEMsWUFBc0IsUUFBZ0IsRUFBWSxNQUEwQixFQUFZLElBQWdCO1FBQWxGLGFBQVEsR0FBUixRQUFRLENBQVE7UUFBWSxXQUFNLEdBQU4sTUFBTSxDQUFvQjtRQUFZLFNBQUksR0FBSixJQUFJLENBQVk7UUFIaEcsWUFBTyxHQUFhLEVBQUUsQ0FBQztRQUN2QixZQUFPLEdBQWEsRUFBRSxDQUFDO0lBRy9CLENBQUM7SUFFTSxNQUFNLENBQUMsTUFBeUI7UUFDbkMsSUFBSSxNQUFNLEVBQUU7WUFDUixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDN0M7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxNQUF5QjtRQUNuQyxJQUFJLE1BQU0sRUFBRTtZQUNSLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM3QztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFUyxTQUFTLENBQUMsT0FBcUI7UUFDckMsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQXlCLENBQUM7UUFDcEQsTUFBTSxhQUFhLEdBQWtCLEVB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SHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMsIEh0dHBSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IE9EYXRhQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vYW5ndWxhck9EYXRhQ29uZmlndXJhdGlvbic7XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgT0RhdGFPcGVyYXRpb248VD4ge1xyXG4gICAgcHJpdmF0ZSBfZXhwYW5kOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBfc2VsZWN0OiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB0eXBlTmFtZTogc3RyaW5nLCBwcm90ZWN0ZWQgY29uZmlnOiBPRGF0YUNvbmZpZ3VyYXRpb24sIHByb3RlY3RlZCBodHRwOiBIdHRwQ2xpZW50KSB7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHB1YmxpYyBFeHBhbmQoZXhwYW5kOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xyXG4gICAgICAgIGlmIChleHBhbmQpIHtcclxuICAgICAgICAgICAgdGhpcy5fZXhwYW5kID0gdGhpcy50b1N0cmluZ0FycmF5KGV4cGFuZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTZWxlY3RzIEVudGl0aWVzLiBJZiBTdHJpbmcgaXMgc2VwYXJhdGVkIGJ5IFwiL1wiIHRoZSBmaXJzdCBwYXJ0IHdpbGwgYmUgZXhwYW5kZWQgYW5kIHRoZSBzZWNvbmQgcGFydCB3aWxsIGJlIHNlbGVjdGVkIGluIHRoZSBleHBhbmQuXHJcbiAgICAgKiBAcGFyYW0gc2VsZWN0IFxyXG4gICAgICogQHJldHVybnMgT0RhdGFPcGVyYXRpb248VD5cclxuICAgICAqLyBcclxuICAgIHB1YmxpYyBTZWxlY3Qoc2VsZWN0OiBzdHJpbmcgfCBzdHJpbmdbXSkge1xyXG4gICAgICAgIGlmIChzZWxlY3QpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ID0gdGhpcy50b1N0cmluZ0FycmF5KHNlbGVjdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwcm90ZWN0ZWQgZ2V0UGFyYW1zKGFQYXJhbXM/IDogSHR0cFBhcmFtcyk6IEh0dHBQYXJhbXMge1xyXG4gICAgICAgIGNvbnN0IGV4cGFuZERhdGEgPSBuZXcgTWFwPHN0cmluZywgQXJyYXk8c3RyaW5nPj4oKTtcclxuICAgICAgICBjb25zdCBub3JtYWxTZWxlY3RzOiBBcnJheTxzdHJpbmc+ID0gW107XHJcbiAgICAgICAgXHJcblxyXG4gICAgICAgIHRoaXMuX2V4cGFuZC5mb3JFYWNoKChuYW1lKSA9PiBleHBhbmREYXRhLnNldChuYW1lLCBbXSkpO1xyXG5cclxuICAgICAgICB0aGlzLl9zZWxlY3QuZm9yRWFjaCgoc2VsZWN0OiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbXM6IHN0cmluZ1tdID0gc2VsZWN0LnNwbGl0KCcvJyk7XHJcblxyXG4gICAgICAgICAgICAvLyBTZWxlY3QgY29udGFpbnMgc3RyaW5nIGxpa2U6IGBCb3NzL05hbWVgXHJcbiAgICAgICAgICAgIGlmIChpdGVtcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBleHBhbmROYW1lID0gaXRlbXNbMF07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBpdGVtc1sxXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWV4cGFuZERhdGEuaGFzKGV4cGFuZE5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhwYW5kRGF0YS5zZXQoZXhwYW5kTmFtZSwgW10pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBleHBhbmREYXRhLmdldChleHBhbmROYW1lKSEucHVzaChwcm9wZXJ0eU5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gU2VsZWN0IGlzIGp1c3QgYSBzaW1wbGUgc3RyaW5nIGxpa2U6IGBCb3NzYFxyXG4gICAgICAgICAgICAgICAgbm9ybWFsU2VsZWN0cy5wdXNoKHNlbGVjdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbGV0IHBhcmFtcyA9IChhUGFyYW1zICYmIE9iamVjdC5rZXlzKGFQYXJhbXMpLmxlbmd0aD4wKT9hUGFyYW1zOm5ldyBIdHRwUGFyYW1zKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGV4cGFuZHM6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuICAgICAgICBleHBhbmREYXRhLmZvckVhY2goKHZhbCxrZXkpPT57XHJcbiAgICAgICAgICAgIGlmICh2YWwubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBleHBhbmRzLnB1c2goYCR7a2V5fSgke3RoaXMuY29uZmlnLmtleXMuc2VsZWN0fT0ke3RoaXMudG9Db21tYVN0cmluZyh2YWwpfSlgKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBleHBhbmRzLnB1c2goa2V5KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGV4cGFuZHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQodGhpcy5jb25maWcua2V5cy5leHBhbmQsIHRoaXMudG9Db21tYVN0cmluZyhleHBhbmRzKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobm9ybWFsU2VsZWN0cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZCh0aGlzLmNvbmZpZy5rZXlzLnNlbGVjdCwgdGhpcy50b0NvbW1hU3RyaW5nKG5vcm1hbFNlbGVjdHMpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwYXJhbXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGhhbmRsZVJlc3BvbnNlKGVudGl0eTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8VD4+KTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICAgICAgcmV0dXJuIGVudGl0eVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIG1hcCh0aGlzLmV4dHJhY3REYXRhKSxcclxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogYW55LCBjYXVnaHQ6IE9ic2VydmFibGU8VD4pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWcuaGFuZGxlRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuaGFuZGxlRXJyb3IoZXJyLCBjYXVnaHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnIpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdFJlcXVlc3RPcHRpb25zKCk6IHtcclxuICAgICAgICBoZWFkZXJzPzogSHR0cEhlYWRlcnM7XHJcbiAgICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcclxuICAgICAgICBwYXJhbXM/OiBIdHRwUGFyYW1zO1xyXG4gICAgICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbjtcclxuICAgICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XHJcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzPzogYm9vbGVhbjtcclxuICAgIH0ge1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmNvbmZpZy5kZWZhdWx0UmVxdWVzdE9wdGlvbnMpO1xyXG4gICAgICAgIG9wdGlvbnMucGFyYW1zID0gdGhpcy5nZXRQYXJhbXMob3B0aW9ucy5wYXJhbXMpO1xyXG5cclxuICAgICAgICByZXR1cm4gb3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0UG9zdFJlcXVlc3RPcHRpb25zKCk6IHtcclxuICAgICAgICBoZWFkZXJzPzogSHR0cEhlYWRlcnM7XHJcbiAgICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcclxuICAgICAgICBwYXJhbXM/OiBIdHRwUGFyYW1zO1xyXG4gICAgICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbjtcclxuICAgICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XHJcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzPzogYm9vbGVhbjtcclxuICAgIH0ge1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmNvbmZpZy5wb3N0UmVxdWVzdE9wdGlvbnMpO1xyXG4gICAgICAgIG9wdGlvbnMucGFyYW1zID0gdGhpcy5nZXRQYXJhbXMob3B0aW9ucy5wYXJhbXMpO1xyXG5cclxuICAgICAgICByZXR1cm4gb3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRXhlYygpOiBPYnNlcnZhYmxlPGFueT47XHJcblxyXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IEdldFVybCgpOiBzdHJpbmc7XHJcblxyXG4gICAgcHJvdGVjdGVkIEdlbmVyYXRlUG9zdFVybChlbnRpdGllc1VyaTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBwYXJhbXM6IEh0dHBQYXJhbXMgPSB0aGlzLmdldFBhcmFtcyh0aGlzLmNvbmZpZy5wb3N0UmVxdWVzdE9wdGlvbnMucGFyYW1zKTtcclxuICAgICAgICBpZiAocGFyYW1zLmtleXMoKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBgJHtlbnRpdGllc1VyaX0/JHtwYXJhbXN9YDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBlbnRpdGllc1VyaTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBHZW5lcmF0ZVVybChlbnRpdGllc1VyaTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBwYXJhbXM6IEh0dHBQYXJhbXMgPSB0aGlzLmdldFBhcmFtcyggdGhpcy5jb25maWcuZGVmYXVsdFJlcXVlc3RPcHRpb25zLnBhcmFtcyk7XHJcbiAgICAgICAgaWYgKHBhcmFtcy5rZXlzKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYCR7ZW50aXRpZXNVcml9PyR7cGFyYW1zfWA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZW50aXRpZXNVcmk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHRvU3RyaW5nQXJyYXkoaW5wdXQ6IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nW10ge1xyXG4gICAgICAgIGlmICghaW5wdXQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgU3RyaW5nIHx8IHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGlucHV0LnNwbGl0KCcsJykubWFwKHMgPT4gcy50cmltKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGlucHV0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCB0b0NvbW1hU3RyaW5nKGlucHV0OiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgU3RyaW5nIHx8IHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGlucHV0IGFzIHN0cmluZztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC5qb2luKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZXh0cmFjdERhdGEocmVzOiBIdHRwUmVzcG9uc2U8VD4pOiBUIHtcclxuICAgICAgICBpZiAocmVzLnN0YXR1cyA8IDIwMCB8fCByZXMuc3RhdHVzID49IDMwMCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhZCByZXNwb25zZSBzdGF0dXM6ICcgKyByZXMuc3RhdHVzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGJvZHk6IGFueSA9IHJlcy5ib2R5O1xyXG4gICAgICAgIHJldHVybiBib2R5IHx8IHt9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgT3BlcmF0aW9uV2l0aEtleTxUPiBleHRlbmRzIE9EYXRhT3BlcmF0aW9uPFQ+IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfdHlwZU5hbWU6IHN0cmluZyxcclxuICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY29uZmlnOiBPRGF0YUNvbmZpZ3VyYXRpb24sXHJcbiAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICAgICAgcHJvdGVjdGVkIGVudGl0eUtleTogYW55KSB7XHJcbiAgICAgICAgc3VwZXIoX3R5cGVOYW1lLCBjb25maWcsIGh0dHApO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRFbnRpdHlVcmkoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcuZ2V0RW50aXR5VXJpKHRoaXMuZW50aXR5S2V5LCB0aGlzLnR5cGVOYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0VXJsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuR2VuZXJhdGVVcmwodGhpcy5nZXRFbnRpdHlVcmkoKSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBPcGVyYXRpb25XaXRoRW50aXR5PFQ+IGV4dGVuZHMgT0RhdGFPcGVyYXRpb248VD4ge1xyXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF90eXBlTmFtZTogc3RyaW5nLFxyXG4gICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBjb25maWc6IE9EYXRhQ29uZmlndXJhdGlvbixcclxuICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgICAgICBwcm90ZWN0ZWQgZW50aXR5OiBUKSB7XHJcbiAgICAgICAgc3VwZXIoX3R5cGVOYW1lLCBjb25maWcsIGh0dHApO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRFbnRpdGllc1VyaSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5nZXRFbnRpdGllc1VyaSh0aGlzLl90eXBlTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFVybCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkdlbmVyYXRlVXJsKHRoaXMuZ2V0RW50aXRpZXNVcmkoKSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBPcGVyYXRpb25XaXRoS2V5QW5kRW50aXR5PFQ+IGV4dGVuZHMgT3BlcmF0aW9uV2l0aEtleTxUPiB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgb3ZlcnJpZGUgX3R5cGVOYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGNvbmZpZzogT0RhdGFDb25maWd1cmF0aW9uLFxyXG4gICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBlbnRpdHlLZXk6IHN0cmluZyxcclxuICAgICAgICBwcm90ZWN0ZWQgZW50aXR5OiBUKSB7XHJcbiAgICAgICAgc3VwZXIoX3R5cGVOYW1lLCBjb25maWcsIGh0dHAsIGVudGl0eUtleSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldEVudGl0eVVyaSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5nZXRFbnRpdHlVcmkodGhpcy5lbnRpdHlLZXksIHRoaXMuX3R5cGVOYW1lKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEdldE9wZXJhdGlvbjxUPiBleHRlbmRzIE9wZXJhdGlvbldpdGhLZXk8VD4ge1xyXG4gICAgcHVibGljIEV4ZWMoKTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmhhbmRsZVJlc3BvbnNlKHRoaXMuaHR0cC5nZXQ8VD4odGhpcy5nZXRFbnRpdHlVcmkoKSwgdGhpcy5nZXREZWZhdWx0UmVxdWVzdE9wdGlvbnMoKSkpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUG9zdE9wZXJhdGlvbjxUPiBleHRlbmRzIE9wZXJhdGlvbldpdGhFbnRpdHk8VD4ge1xyXG4gICAgcHVibGljIEV4ZWMoKTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuZW50aXR5ID8gSlNPTi5zdHJpbmdpZnkodGhpcy5lbnRpdHkpIDogbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmhhbmRsZVJlc3BvbnNlKHRoaXMuaHR0cC5wb3N0PFQ+KHRoaXMuZ2V0RW50aXRpZXNVcmkoKSwgYm9keSwgdGhpcy5nZXRQb3N0UmVxdWVzdE9wdGlvbnMoKSkpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIG92ZXJyaWRlIEdldFVybCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkdlbmVyYXRlUG9zdFVybCh0aGlzLmdldEVudGl0aWVzVXJpKCkpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUGF0Y2hPcGVyYXRpb248VD4gZXh0ZW5kcyBPcGVyYXRpb25XaXRoS2V5QW5kRW50aXR5PFQ+IHtcclxuICAgIHB1YmxpYyBFeGVjKCk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLmVudGl0eSA/IEpTT04uc3RyaW5naWZ5KHRoaXMuZW50aXR5KSA6IG51bGw7XHJcblxyXG4gICAgICAgIHJldHVybiBzdXBlci5oYW5kbGVSZXNwb25zZSh0aGlzLmh0dHAucGF0Y2g8VD4odGhpcy5nZXRFbnRpdHlVcmkoKSwgYm9keSwgdGhpcy5nZXRQb3N0UmVxdWVzdE9wdGlvbnMoKSkpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIG92ZXJyaWRlIEdldFVybCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkdlbmVyYXRlUG9zdFVybCh0aGlzLmdldEVudGl0eVVyaSgpKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFB1dE9wZXJhdGlvbjxUPiBleHRlbmRzIE9wZXJhdGlvbldpdGhLZXlBbmRFbnRpdHk8VD4ge1xyXG4gICAgcHVibGljIEV4ZWMoKTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuZW50aXR5ID8gSlNPTi5zdHJpbmdpZnkodGhpcy5lbnRpdHkpIDogbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmhhbmRsZVJlc3BvbnNlKHRoaXMuaHR0cC5wdXQ8VD4odGhpcy5nZXRFbnRpdHlVcmkoKSwgYm9keSwgdGhpcy5nZXRQb3N0UmVxdWVzdE9wdGlvbnMoKSkpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIG92ZXJyaWRlIEdldFVybCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkdlbmVyYXRlUG9zdFVybCh0aGlzLmdldEVudGl0eVVyaSgpKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIERlbGV0ZU9wZXJhdGlvbjxUPiBleHRlbmRzIE9wZXJhdGlvbldpdGhLZXk8VD57XHJcbiAgICBwdWJsaWMgRXhlYygpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgICAgICByZXR1cm4gc3VwZXIuaGFuZGxlUmVzcG9uc2UodGhpcy5odHRwLmRlbGV0ZTxUPih0aGlzLmdldEVudGl0eVVyaSgpLCB0aGlzLmNvbmZpZy5kZWZhdWx0UmVxdWVzdE9wdGlvbnMpKTtcclxuICAgIH1cclxufVxyXG4iXX0=