UNPKG

@fdot/angular-staff

Version:

The angular-staff package wraps service calls to FDOT Staff API and also includes pipes and components based on bootstrap 4. ## Installation The angular staff package use a peer dependency of ng-bootstrap so you will need to also perform an NPM install

438 lines (428 loc) 48.3 kB
import { Injectable, Inject, Pipe, defineInjectable, inject, NgModule, EventEmitter, Component, Output, Input } from '@angular/core'; import { Observable, BehaviorSubject, of } from 'rxjs'; import { HttpHeaders, HttpParams, HttpClient, HttpClientModule } from '@angular/common/http'; import { map, debounceTime, distinctUntilChanged, tap, switchMap, catchError } from 'rxjs/operators'; import { CommonModule } from '@angular/common'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import { FormsModule } from '@angular/forms'; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class Config { /** * @param {?} host * @param {?} apiKey */ constructor(host, apiKey) { this.host = host; this.apiKey = apiKey; } } /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class AngularStaffService { /** * @param {?} http * @param {?} config */ constructor(http, config) { this.http = http; this.config = config; this.staffByIdCache = new Map(); this.staffByRacfIdCache = new Map(); this.staffSearchCache = new Map(); if (!config) { throw Error('Call AngularStaffmodule with for root passing in the config object'); } } /** * @param {?} staff * @param {?} format * @return {?} */ Format(staff, format) { if (format) { let /** @type {?} */ formattedStr = format.replace('{firstName}', staff.firstName); formattedStr = formattedStr.replace('{lastName}', staff.lastName); formattedStr = formattedStr.replace('{racfId}', staff.racfId); formattedStr = formattedStr.replace('{emailAddress}', staff.emailAddress); formattedStr = formattedStr.replace('{phone}', staff.phone); return formattedStr; } return `${staff.firstName} ${staff.lastName}`; } /** * Method GetStaffById * @param {?} id Id for Staff to retrieve * @return {?} Full HTTP response as Observable */ GetStaffById(id) { if (!this.staffByIdCache.get(id)) { this.staffByIdCache.set(id, new BehaviorSubject(null)); const /** @type {?} */ uri = `/GetStaffById`; const /** @type {?} */ headers = new HttpHeaders(); let /** @type {?} */ params = new HttpParams(); if (id !== undefined && id !== null) { params = params.set('id', id + ''); } this.sendRequest('get', uri, headers, params, null).toPromise().then(r => { if (r && r.body) { this.staffByIdCache.get(id).next(r.body); } }); } return this.staffByIdCache.get(id); } /** * Method GetStaffByIds * @param {?} id Id for Staff to retrieve * @return {?} Full HTTP response as Observable */ GetStaffByIds(id) { const /** @type {?} */ uri = `/GetStaffByIds`; const /** @type {?} */ headers = new HttpHeaders(); let /** @type {?} */ params = new HttpParams(); if (id !== undefined && id !== null) { params = params.set('id', id + ''); } return this.sendRequest('get', uri, headers, params, null).pipe(map(r => { if (r && r.body) { return r.body; } })); } /** * Method GetStaffByRacfId * @param {?} racfId RacfId for Staff to retrieve * @return {?} Full HTTP response as Observable */ GetStaffByRacfId(racfId) { if (!this.staffByRacfIdCache.get(racfId)) { this.staffByRacfIdCache.set(racfId, new BehaviorSubject(null)); const /** @type {?} */ uri = `/GetStaffByRacfId`; const /** @type {?} */ headers = new HttpHeaders(); let /** @type {?} */ params = new HttpParams(); if (racfId !== undefined && racfId !== null) { params = params.set('racfId', racfId + ''); } this.sendRequest('get', uri, headers, params, null).pipe(map(r => { if (r && r.body) { this.staffByRacfIdCache.get(racfId).next(r.body); } })); } return this.staffByRacfIdCache.get(racfId); } /** * Method GetStaffByRacfIds * @param {?} racfId RacfId for Staff to retrieve * @return {?} Full HTTP response as Observable */ GetStaffByRacfIds(racfId) { const /** @type {?} */ uri = `/GetStaffByRacfIds`; const /** @type {?} */ headers = new HttpHeaders(); let /** @type {?} */ params = new HttpParams(); if (racfId !== undefined && racfId !== null) { params = params.set('racfId', racfId + ''); } return this.sendRequest('get', uri, headers, params, null).pipe(map(r => { if (r && r.body) { return r.body; } })); } /** * Method SearchStaffBySearchCriteriaGet * @param {?} racfId RacfId for Staff to retrieve * @param {?} peopleFirstId The people first id to Search for * @param {?} status The status code to search for * @param {?} partialName The partial name to search for * @param {?} firstName The first name to search for * @param {?} lastName The last name to search for * @param {?} districtCode The district to search for * @param {?} positionNumber The position number to search for * @param {?} organizationalCode The organization code to search for * @param {?} emailAddress The email address to search for * @param {?} staffTypeCode The staff type code to search for * @param {?} staffId The staff id to search for * @return {?} Full HTTP response as Observable */ SearchStaffBySearchCriteriaGet(racfId, peopleFirstId, status, partialName, firstName, lastName, districtCode, positionNumber, organizationalCode, emailAddress, staffTypeCode, staffId) { const /** @type {?} */ uri = `/SearchStaffBySearchCriteria`; const /** @type {?} */ headers = new HttpHeaders(); let /** @type {?} */ params = new HttpParams(); if (racfId !== undefined && racfId !== null) { params = params.set('racfId', racfId + ''); } if (peopleFirstId !== undefined && peopleFirstId !== null) { params = params.set('peopleFirstId', peopleFirstId + ''); } if (status !== undefined && status !== null) { params = params.set('status', status + ''); } if (partialName !== undefined && partialName !== null) { params = params.set('partialName', partialName + ''); } if (firstName !== undefined && firstName !== null) { params = params.set('firstName', firstName + ''); } if (lastName !== undefined && lastName !== null) { params = params.set('lastName', lastName + ''); } if (districtCode !== undefined && districtCode !== null) { params = params.set('districtCode', districtCode + ''); } if (positionNumber !== undefined && positionNumber !== null) { params = params.set('positionNumber', positionNumber + ''); } if (organizationalCode !== undefined && organizationalCode !== null) { params = params.set('organizationalCode', organizationalCode + ''); } if (emailAddress !== undefined && emailAddress !== null) { params = params.set('emailAddress', emailAddress + ''); } if (staffTypeCode !== undefined && staffTypeCode !== null) { params = params.set('staffTypeCode', staffTypeCode + ''); } if (staffId !== undefined && staffId !== null) { params = params.set('staffId', staffId + ''); } return this.sendRequest('get', uri, headers, params, null).pipe(map(r => { if (r && r.body) { return r.body; } })); } /** * @param {?} name * @return {?} */ SearchActiveStaffByName(name) { if (!this.staffSearchCache.get(name)) { this.staffSearchCache.set(name, new BehaviorSubject([])); this.SearchStaffBySearchCriteriaGet(null, null, 'active', name, null, null, null, null, null, null, null, null).toPromise().then((results) => { this.staffSearchCache.get(name).next(results); }); } return this.staffSearchCache.get(name); } /** * Method SearchStaffBySearchCriteriaPost * @param {?} searchCriteria RacfId for Staff to retrieve * @return {?} Full HTTP response as Observable */ SearchStaffBySearchCriteriaPost(searchCriteria) { const /** @type {?} */ uri = `/SearchStaffBySearchCriteria`; const /** @type {?} */ headers = new HttpHeaders(); const /** @type {?} */ params = new HttpParams(); return this.sendRequest('post', uri, headers, params, JSON.stringify(searchCriteria)); } /** * @template T * @param {?} method * @param {?} uri * @param {?} headers * @param {?} params * @param {?} body * @return {?} */ sendRequest(method, uri, headers, params, body) { headers = headers.set('Ocp-Apim-Subscription-Key', this.config.apiKey); if (method === 'get') { return this.http.get(this.config.host + uri, { headers: headers.set('Accept', 'application/json'), params: params, observe: 'response' }); } else if (method === 'put') { return this.http.put(this.config.host + uri, body, { headers: headers.set('Content-Type', 'application/json'), params: params, observe: 'response' }); } else if (method === 'post') { return this.http.post(this.config.host + uri, body, { headers: headers.set('Content-Type', 'application/json'), params: params, observe: 'response' }); } else if (method === 'delete') { return this.http.delete(this.config.host + uri, { headers: headers, params: params, observe: 'response' }); } else { console.error('Unsupported request: ' + method); return Observable.throw('Unsupported request: ' + method); } } } AngularStaffService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] }, ]; /** @nocollapse */ AngularStaffService.ctorParameters = () => [ { type: HttpClient, }, { type: Config, decorators: [{ type: Inject, args: ['config',] },] }, ]; /** @nocollapse */ AngularStaffService.ngInjectableDef = defineInjectable({ factory: function AngularStaffService_Factory() { return new AngularStaffService(inject(HttpClient), inject("config")); }, token: AngularStaffService, providedIn: "root" }); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class StaffSelectorComponent { /** * @param {?} staffService */ constructor(staffService) { this.staffService = staffService; this.selected = new EventEmitter(); this.searching = false; this.searchFailed = false; this.search = (text$) => text$.pipe(debounceTime(300), distinctUntilChanged(), tap(() => this.searching = true), switchMap((term) => term && term.length > 2 ? this.staffService.SearchActiveStaffByName(term).pipe(tap(() => this.searchFailed = false), catchError(() => { this.searchFailed = true; return of([]); })) : of([])), tap(() => this.searching = false)); this.formatter = (result) => { if (result != null) { return this.staffService.Format(result, this.format); } return ''; }; } /** * @param {?} value * @return {?} */ set value(value) { this._value = value; this.staffService.GetStaffById(value).subscribe((s) => { if (s) { this.model = s; this.selected.emit(s); } }); } /** * @return {?} */ get value() { return this._value; } /** * @return {?} */ ngOnInit() { } /** * @return {?} */ onBlur() { if (typeof this.model !== 'object') { this.model = null; this.selected.emit(null); } } /** * @param {?} event * @return {?} */ itemSelected(event) { if (event) { this.selected.emit(event.item); } } } StaffSelectorComponent.decorators = [ { type: Component, args: [{ // tslint:disable-next-line:component-selector selector: 'fdot-staff-selector', template: `<div class="form-group"> <input type="text" class="form-control" [class.is-invalid]="searchFailed" [(ngModel)]="model" [ngbTypeahead]="search" placeholder="{{placeholder}}" [editable]="false" (blur)="onBlur()" [resultFormatter]="formatter" (selectItem)="itemSelected($event)" [inputFormatter]="formatter" /> <span *ngIf="searching">searching...</span> <div class="invalid-feedback" *ngIf="searchFailed">No results found</div> </div>`, styles: [``] },] }, ]; /** @nocollapse */ StaffSelectorComponent.ctorParameters = () => [ { type: AngularStaffService, }, ]; StaffSelectorComponent.propDecorators = { "selected": [{ type: Output },], "format": [{ type: Input },], "placeholder": [{ type: Input },], "value": [{ type: Input },], }; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class StaffPipe { /** * @param {?} staffService */ constructor(staffService) { this.staffService = staffService; } /** * @param {?} value * @param {?=} format * @return {?} */ transform(value, format) { return this.staffService.GetStaffById(value).pipe(map(c => { if (!c) { return; } return this.staffService.Format(c, format); })); } } StaffPipe.decorators = [ { type: Pipe, args: [{ name: 'staff' },] }, ]; /** @nocollapse */ StaffPipe.ctorParameters = () => [ { type: AngularStaffService, }, ]; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class AngularStaffModule { /** * @param {?} config * @return {?} */ static forRoot(config) { return { ngModule: AngularStaffModule, providers: [ { provide: 'config', useValue: config } ] }; } } AngularStaffModule.decorators = [ { type: NgModule, args: [{ imports: [HttpClientModule, NgbModule, FormsModule, CommonModule], declarations: [StaffPipe, StaffSelectorComponent], exports: [StaffPipe, StaffSelectorComponent] },] }, ]; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ export { AngularStaffService, StaffSelectorComponent, Config, AngularStaffModule, StaffPipe as ɵa }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmRvdC1hbmd1bGFyLXN0YWZmLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9AZmRvdC9hbmd1bGFyLXN0YWZmL2xpYi9tb2RlbHMvY29uZmlnLnRzIiwibmc6Ly9AZmRvdC9hbmd1bGFyLXN0YWZmL2xpYi9hbmd1bGFyLXN0YWZmLnNlcnZpY2UudHMiLCJuZzovL0BmZG90L2FuZ3VsYXItc3RhZmYvbGliL3N0YWZmLXNlbGVjdG9yL3N0YWZmLXNlbGVjdG9yLmNvbXBvbmVudC50cyIsIm5nOi8vQGZkb3QvYW5ndWxhci1zdGFmZi9saWIvc3RhZmYucGlwZS50cyIsIm5nOi8vQGZkb3QvYW5ndWxhci1zdGFmZi9saWIvYW5ndWxhci1zdGFmZi5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIENvbmZpZyB7XHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaG9zdDogc3RyaW5nLCBwdWJsaWMgYXBpS2V5OiBzdHJpbmcpIHtcclxuXHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT3B0aW9uYWwsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU3RhZmZNZW1iZXIsIFNlYXJjaENyaXRlcmlhIH0gZnJvbSAnLi9tb2RlbHMnO1xyXG5pbXBvcnQgeyBIdHRwUmVzcG9uc2UsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zLCBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4vbW9kZWxzL2NvbmZpZyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBbmd1bGFyU3RhZmZTZXJ2aWNlIHtcclxuICBwcml2YXRlIHN0YWZmQnlJZENhY2hlID0gbmV3IE1hcDxudW1iZXIsIEJlaGF2aW9yU3ViamVjdDxTdGFmZk1lbWJlcj4+KCk7XHJcbiAgcHJpdmF0ZSBzdGFmZkJ5UmFjZklkQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgQmVoYXZpb3JTdWJqZWN0PFN0YWZmTWVtYmVyPj4oKTtcclxuICBwcml2YXRlIHN0YWZmU2VhcmNoQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgQmVoYXZpb3JTdWJqZWN0PFN0YWZmTWVtYmVyW10+PigpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIEBJbmplY3QoJ2NvbmZpZycpIHByaXZhdGUgY29uZmlnOiBDb25maWcpIHtcclxuICAgIGlmICghY29uZmlnKSB7XHJcbiAgICAgIHRocm93IEVycm9yKCdDYWxsIEFuZ3VsYXJTdGFmZm1vZHVsZSB3aXRoIGZvciByb290IHBhc3NpbmcgaW4gdGhlIGNvbmZpZyBvYmplY3QnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBGb3JtYXQoc3RhZmY6IFN0YWZmTWVtYmVyLCBmb3JtYXQ6IHN0cmluZykge1xyXG4gICAgaWYgKGZvcm1hdCkge1xyXG4gICAgICBsZXQgZm9ybWF0dGVkU3RyID0gZm9ybWF0LnJlcGxhY2UoJ3tmaXJzdE5hbWV9Jywgc3RhZmYuZmlyc3ROYW1lKTtcclxuXHJcbiAgICAgIGZvcm1hdHRlZFN0ciA9IGZvcm1hdHRlZFN0ci5yZXBsYWNlKCd7bGFzdE5hbWV9Jywgc3RhZmYubGFzdE5hbWUpO1xyXG4gICAgICBmb3JtYXR0ZWRTdHIgPSBmb3JtYXR0ZWRTdHIucmVwbGFjZSgne3JhY2ZJZH0nLCBzdGFmZi5yYWNmSWQpO1xyXG4gICAgICBmb3JtYXR0ZWRTdHIgPSBmb3JtYXR0ZWRTdHIucmVwbGFjZSgne2VtYWlsQWRkcmVzc30nLCBzdGFmZi5lbWFpbEFkZHJlc3MpO1xyXG4gICAgICBmb3JtYXR0ZWRTdHIgPSBmb3JtYXR0ZWRTdHIucmVwbGFjZSgne3Bob25lfScsIHN0YWZmLnBob25lKTtcclxuXHJcbiAgICAgIHJldHVybiBmb3JtYXR0ZWRTdHI7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGAke3N0YWZmLmZpcnN0TmFtZX0gJHtzdGFmZi5sYXN0TmFtZX1gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBNZXRob2QgR2V0U3RhZmZCeUlkXHJcbiAgKiBAcGFyYW0gaWQgSWQgZm9yIFN0YWZmIHRvIHJldHJpZXZlXHJcbiAgKiBAcmV0dXJuIEZ1bGwgSFRUUCByZXNwb25zZSBhcyBPYnNlcnZhYmxlXHJcbiAgKi9cclxuICBwdWJsaWMgR2V0U3RhZmZCeUlkKGlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPFN0YWZmTWVtYmVyPiB7XHJcbiAgICBpZiAoIXRoaXMuc3RhZmZCeUlkQ2FjaGUuZ2V0KGlkKSkge1xyXG4gICAgICB0aGlzLnN0YWZmQnlJZENhY2hlLnNldChpZCwgbmV3IEJlaGF2aW9yU3ViamVjdDxTdGFmZk1lbWJlcj4obnVsbCkpO1xyXG5cclxuICAgICAgY29uc3QgdXJpID0gYC9HZXRTdGFmZkJ5SWRgO1xyXG4gICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG4gICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCAmJiBpZCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2lkJywgaWQgKyAnJyk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZW5kUmVxdWVzdDxTdGFmZk1lbWJlcj4oJ2dldCcsIHVyaSwgaGVhZGVycywgcGFyYW1zLCBudWxsKS50b1Byb21pc2UoKS50aGVuKHIgPT4ge1xyXG4gICAgICAgIGlmIChyICYmIHIuYm9keSkge1xyXG4gICAgICAgICAgdGhpcy5zdGFmZkJ5SWRDYWNoZS5nZXQoaWQpLm5leHQoci5ib2R5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnN0YWZmQnlJZENhY2hlLmdldChpZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIE1ldGhvZCBHZXRTdGFmZkJ5SWRzXHJcbiAgKiBAcGFyYW0gaWQgSWQgZm9yIFN0YWZmIHRvIHJldHJpZXZlXHJcbiAgKiBAcmV0dXJuIEZ1bGwgSFRUUCByZXNwb25zZSBhcyBPYnNlcnZhYmxlXHJcbiAgKi9cclxuICBwdWJsaWMgR2V0U3RhZmZCeUlkcyhpZDogbnVtYmVyW10pOiBPYnNlcnZhYmxlPFN0YWZmTWVtYmVyW10+IHtcclxuICAgIGNvbnN0IHVyaSA9IGAvR2V0U3RhZmZCeUlkc2A7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcclxuICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkICYmIGlkICE9PSBudWxsKSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2lkJywgaWQgKyAnJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5zZW5kUmVxdWVzdDxhbnk+KCdnZXQnLCB1cmksIGhlYWRlcnMsIHBhcmFtcywgbnVsbCkucGlwZShtYXAociA9PiB7XHJcbiAgICAgIGlmIChyICYmIHIuYm9keSkge1xyXG4gICAgICAgIHJldHVybiByLmJvZHk7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogTWV0aG9kIEdldFN0YWZmQnlSYWNmSWRcclxuICAqIEBwYXJhbSByYWNmSWQgUmFjZklkIGZvciBTdGFmZiB0byByZXRyaWV2ZVxyXG4gICogQHJldHVybiBGdWxsIEhUVFAgcmVzcG9uc2UgYXMgT2JzZXJ2YWJsZVxyXG4gICovXHJcbiAgcHVibGljIEdldFN0YWZmQnlSYWNmSWQocmFjZklkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFN0YWZmTWVtYmVyPiB7XHJcbiAgICBpZiAoIXRoaXMuc3RhZmZCeVJhY2ZJZENhY2hlLmdldChyYWNmSWQpKSB7XHJcbiAgICAgIHRoaXMuc3RhZmZCeVJhY2ZJZENhY2hlLnNldChyYWNmSWQsIG5ldyBCZWhhdmlvclN1YmplY3Q8U3RhZmZNZW1iZXI+KG51bGwpKTtcclxuICAgICAgY29uc3QgdXJpID0gYC9HZXRTdGFmZkJ5UmFjZklkYDtcclxuICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xyXG4gICAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcclxuICAgICAgaWYgKHJhY2ZJZCAhPT0gdW5kZWZpbmVkICYmIHJhY2ZJZCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3JhY2ZJZCcsIHJhY2ZJZCArICcnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zZW5kUmVxdWVzdDxTdGFmZk1lbWJlcj4oJ2dldCcsIHVyaSwgaGVhZGVycywgcGFyYW1zLCBudWxsKS5waXBlKG1hcChyID0+IHtcclxuICAgICAgICBpZiAociAmJiByLmJvZHkpIHtcclxuICAgICAgICAgIHRoaXMuc3RhZmZCeVJhY2ZJZENhY2hlLmdldChyYWNmSWQpLm5leHQoci5ib2R5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5zdGFmZkJ5UmFjZklkQ2FjaGUuZ2V0KHJhY2ZJZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIE1ldGhvZCBHZXRTdGFmZkJ5UmFjZklkc1xyXG4gICogQHBhcmFtIHJhY2ZJZCBSYWNmSWQgZm9yIFN0YWZmIHRvIHJldHJpZXZlXHJcbiAgKiBAcmV0dXJuIEZ1bGwgSFRUUCByZXNwb25zZSBhcyBPYnNlcnZhYmxlXHJcbiAgKi9cclxuICBwdWJsaWMgR2V0U3RhZmZCeVJhY2ZJZHMocmFjZklkOiBudW1iZXJbXSk6IE9ic2VydmFibGU8U3RhZmZNZW1iZXJbXT4ge1xyXG4gICAgY29uc3QgdXJpID0gYC9HZXRTdGFmZkJ5UmFjZklkc2A7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcclxuICAgIGlmIChyYWNmSWQgIT09IHVuZGVmaW5lZCAmJiByYWNmSWQgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgncmFjZklkJywgcmFjZklkICsgJycpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuc2VuZFJlcXVlc3Q8YW55PignZ2V0JywgdXJpLCBoZWFkZXJzLCBwYXJhbXMsIG51bGwpLnBpcGUobWFwKHIgPT4ge1xyXG4gICAgICBpZiAociAmJiByLmJvZHkpIHtcclxuICAgICAgICByZXR1cm4gci5ib2R5O1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIE1ldGhvZCBTZWFyY2hTdGFmZkJ5U2VhcmNoQ3JpdGVyaWFHZXRcclxuICAqIEBwYXJhbSByYWNmSWQgUmFjZklkIGZvciBTdGFmZiB0byByZXRyaWV2ZVxyXG4gICogQHBhcmFtIHBlb3BsZUZpcnN0SWQgVGhlIHBlb3BsZSBmaXJzdCBpZCB0byBTZWFyY2ggZm9yXHJcbiAgKiBAcGFyYW0gc3RhdHVzIFRoZSBzdGF0dXMgY29kZSB0byBzZWFyY2ggZm9yXHJcbiAgKiBAcGFyYW0gcGFydGlhbE5hbWUgVGhlIHBhcnRpYWwgbmFtZSB0byBzZWFyY2ggZm9yXHJcbiAgKiBAcGFyYW0gZmlyc3ROYW1lIFRoZSBmaXJzdCBuYW1lIHRvIHNlYXJjaCBmb3JcclxuICAqIEBwYXJhbSBsYXN0TmFtZSBUaGUgbGFzdCBuYW1lIHRvIHNlYXJjaCBmb3JcclxuICAqIEBwYXJhbSBkaXN0cmljdENvZGUgVGhlIGRpc3RyaWN0IHRvIHNlYXJjaCBmb3JcclxuICAqIEBwYXJhbSBwb3NpdGlvbk51bWJlciBUaGUgcG9zaXRpb24gbnVtYmVyIHRvIHNlYXJjaCBmb3JcclxuICAqIEBwYXJhbSBvcmdhbml6YXRpb25hbENvZGUgVGhlIG9yZ2FuaXphdGlvbiBjb2RlIHRvIHNlYXJjaCBmb3JcclxuICAqIEBwYXJhbSBlbWFpbEFkZHJlc3MgVGhlIGVtYWlsIGFkZHJlc3MgdG8gc2VhcmNoIGZvclxyXG4gICogQHBhcmFtIHN0YWZmVHlwZUNvZGUgVGhlIHN0YWZmIHR5cGUgY29kZSB0byBzZWFyY2ggZm9yXHJcbiAgKiBAcGFyYW0gc3RhZmZJZCBUaGUgc3RhZmYgaWQgdG8gc2VhcmNoIGZvclxyXG4gICogQHJldHVybiBGdWxsIEhUVFAgcmVzcG9uc2UgYXMgT2JzZXJ2YWJsZVxyXG4gICovXHJcbiAgcHVibGljIFNlYXJjaFN0YWZmQnlTZWFyY2hDcml0ZXJpYUdldChyYWNmSWQ6IG51bWJlcltdLCBwZW9wbGVGaXJzdElkOiBzdHJpbmcsIHN0YXR1czogc3RyaW5nLCBwYXJ0aWFsTmFtZTogc3RyaW5nLFxyXG4gICAgZmlyc3ROYW1lOiBzdHJpbmcsIGxhc3ROYW1lOiBzdHJpbmcsIGRpc3RyaWN0Q29kZTogc3RyaW5nLCBwb3NpdGlvbk51bWJlcjogc3RyaW5nLCBvcmdhbml6YXRpb25hbENvZGU6IHN0cmluZyxcclxuICAgIGVtYWlsQWRkcmVzczogc3RyaW5nLCBzdGFmZlR5cGVDb2RlOiBzdHJpbmcsIHN0YWZmSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8U3RhZmZNZW1iZXJbXT4ge1xyXG4gICAgY29uc3QgdXJpID0gYC9TZWFyY2hTdGFmZkJ5U2VhcmNoQ3JpdGVyaWFgO1xyXG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xyXG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICBpZiAocmFjZklkICE9PSB1bmRlZmluZWQgJiYgcmFjZklkICE9PSBudWxsKSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3JhY2ZJZCcsIHJhY2ZJZCArICcnKTtcclxuICAgIH1cclxuICAgIGlmIChwZW9wbGVGaXJzdElkICE9PSB1bmRlZmluZWQgJiYgcGVvcGxlRmlyc3RJZCAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdwZW9wbGVGaXJzdElkJywgcGVvcGxlRmlyc3RJZCArICcnKTtcclxuICAgIH1cclxuICAgIGlmIChzdGF0dXMgIT09IHVuZGVmaW5lZCAmJiBzdGF0dXMgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnc3RhdHVzJywgc3RhdHVzICsgJycpO1xyXG4gICAgfVxyXG4gICAgaWYgKHBhcnRpYWxOYW1lICE9PSB1bmRlZmluZWQgJiYgcGFydGlhbE5hbWUgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgncGFydGlhbE5hbWUnLCBwYXJ0aWFsTmFtZSArICcnKTtcclxuICAgIH1cclxuICAgIGlmIChmaXJzdE5hbWUgIT09IHVuZGVmaW5lZCAmJiBmaXJzdE5hbWUgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnZmlyc3ROYW1lJywgZmlyc3ROYW1lICsgJycpO1xyXG4gICAgfVxyXG4gICAgaWYgKGxhc3ROYW1lICE9PSB1bmRlZmluZWQgJiYgbGFzdE5hbWUgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnbGFzdE5hbWUnLCBsYXN0TmFtZSArICcnKTtcclxuICAgIH1cclxuICAgIGlmIChkaXN0cmljdENvZGUgIT09IHVuZGVmaW5lZCAmJiBkaXN0cmljdENvZGUgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnZGlzdHJpY3RDb2RlJywgZGlzdHJpY3RDb2RlICsgJycpO1xyXG4gICAgfVxyXG4gICAgaWYgKHBvc2l0aW9uTnVtYmVyICE9PSB1bmRlZmluZWQgJiYgcG9zaXRpb25OdW1iZXIgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgncG9zaXRpb25OdW1iZXInLCBwb3NpdGlvbk51bWJlciArICcnKTtcclxuICAgIH1cclxuICAgIGlmIChvcmdhbml6YXRpb25hbENvZGUgIT09IHVuZGVmaW5lZCAmJiBvcmdhbml6YXRpb25hbENvZGUgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnb3JnYW5pemF0aW9uYWxDb2RlJywgb3JnYW5pemF0aW9uYWxDb2RlICsgJycpO1xyXG4gICAgfVxyXG4gICAgaWYgKGVtYWlsQWRkcmVzcyAhPT0gdW5kZWZpbmVkICYmIGVtYWlsQWRkcmVzcyAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdlbWFpbEFkZHJlc3MnLCBlbWFpbEFkZHJlc3MgKyAnJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoc3RhZmZUeXBlQ29kZSAhPT0gdW5kZWZpbmVkICYmIHN0YWZmVHlwZUNvZGUgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnc3RhZmZUeXBlQ29kZScsIHN0YWZmVHlwZUNvZGUgKyAnJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoc3RhZmZJZCAhPT0gdW5kZWZpbmVkICYmIHN0YWZmSWQgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnc3RhZmZJZCcsIHN0YWZmSWQgKyAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuc2VuZFJlcXVlc3Q8YW55PignZ2V0JywgdXJpLCBoZWFkZXJzLCBwYXJhbXMsIG51bGwpLnBpcGUobWFwKHIgPT4ge1xyXG4gICAgICBpZiAociAmJiByLmJvZHkpIHtcclxuICAgICAgICByZXR1cm4gci5ib2R5O1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgU2VhcmNoQWN0aXZlU3RhZmZCeU5hbWUobmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxTdGFmZk1lbWJlcltdPiB7XHJcbiAgICBpZiAoIXRoaXMuc3RhZmZTZWFyY2hDYWNoZS5nZXQobmFtZSkpIHtcclxuICAgICAgdGhpcy5zdGFmZlNlYXJjaENhY2hlLnNldChuYW1lLCBuZXcgQmVoYXZpb3JTdWJqZWN0PFN0YWZmTWVtYmVyW10+KFtdKSk7XHJcblxyXG4gICAgICB0aGlzLlNlYXJjaFN0YWZmQnlTZWFyY2hDcml0ZXJpYUdldChudWxsLCBudWxsLCAnYWN0aXZlJywgbmFtZSxcclxuICAgICAgICBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKS50b1Byb21pc2UoKS50aGVuKChyZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnN0YWZmU2VhcmNoQ2FjaGUuZ2V0KG5hbWUpLm5leHQocmVzdWx0cyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5zdGFmZlNlYXJjaENhY2hlLmdldChuYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogTWV0aG9kIFNlYXJjaFN0YWZmQnlTZWFyY2hDcml0ZXJpYVBvc3RcclxuICAqIEBwYXJhbSBzZWFyY2hDcml0ZXJpYSBSYWNmSWQgZm9yIFN0YWZmIHRvIHJldHJpZXZlXHJcbiAgKiBAcmV0dXJuIEZ1bGwgSFRUUCByZXNwb25zZSBhcyBPYnNlcnZhYmxlXHJcbiAgKi9cclxuICBwdWJsaWMgU2VhcmNoU3RhZmZCeVNlYXJjaENyaXRlcmlhUG9zdChzZWFyY2hDcml0ZXJpYTogU2VhcmNoQ3JpdGVyaWEpOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxhbnk+PiB7XHJcbiAgICBjb25zdCB1cmkgPSBgL1NlYXJjaFN0YWZmQnlTZWFyY2hDcml0ZXJpYWA7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG4gICAgcmV0dXJuIHRoaXMuc2VuZFJlcXVlc3Q8YW55PigncG9zdCcsIHVyaSwgaGVhZGVycywgcGFyYW1zLCBKU09OLnN0cmluZ2lmeShzZWFyY2hDcml0ZXJpYSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZW5kUmVxdWVzdDxUPihtZXRob2Q6IHN0cmluZywgdXJpOiBzdHJpbmcsIGhlYWRlcnM6IEh0dHBIZWFkZXJzLCBwYXJhbXM6IEh0dHBQYXJhbXMsIGJvZHk6IGFueSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFQ+PiB7XHJcbiAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ09jcC1BcGltLVN1YnNjcmlwdGlvbi1LZXknLCB0aGlzLmNvbmZpZy5hcGlLZXkpO1xyXG4gICAgaWYgKG1ldGhvZCA9PT0gJ2dldCcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VD4odGhpcy5jb25maWcuaG9zdCArIHVyaSxcclxuICAgICAgICB7IGhlYWRlcnM6IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpLCBwYXJhbXM6IHBhcmFtcywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KTtcclxuICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAncHV0Jykge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxUPih0aGlzLmNvbmZpZy5ob3N0ICsgdXJpLCBib2R5LFxyXG4gICAgICAgIHsgaGVhZGVyczogaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyksIHBhcmFtczogcGFyYW1zLCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pO1xyXG4gICAgfSBlbHNlIGlmIChtZXRob2QgPT09ICdwb3N0Jykge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8VD4odGhpcy5jb25maWcuaG9zdCArIHVyaSwgYm9keSxcclxuICAgICAgICB7IGhlYWRlcnM6IGhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpLCBwYXJhbXM6IHBhcmFtcywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KTtcclxuICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAnZGVsZXRlJykge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZTxUPih0aGlzLmNvbmZpZy5ob3N0ICsgdXJpLCB7IGhlYWRlcnM6IGhlYWRlcnMsIHBhcmFtczogcGFyYW1zLCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5lcnJvcignVW5zdXBwb3J0ZWQgcmVxdWVzdDogJyArIG1ldGhvZCk7XHJcbiAgICAgIHJldHVybiBPYnNlcnZhYmxlLnRocm93KCdVbnN1cHBvcnRlZCByZXF1ZXN0OiAnICsgbWV0aG9kKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgU3RhZmZNZW1iZXIgfSBmcm9tICcuLi9tb2RlbHMvc3RhZmZtZW1iZXIubW9kZWwnO1xyXG5pbXBvcnQgeyBBbmd1bGFyU3RhZmZTZXJ2aWNlIH0gZnJvbSAnLi8uLi9hbmd1bGFyLXN0YWZmLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIHRhcCwgc3dpdGNoTWFwLCBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBOZ2JUeXBlYWhlYWRTZWxlY3RJdGVtRXZlbnQgfSBmcm9tIFwiQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAvdHlwZWFoZWFkL3R5cGVhaGVhZFwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmNvbXBvbmVudC1zZWxlY3RvclxyXG4gIHNlbGVjdG9yOiAnZmRvdC1zdGFmZi1zZWxlY3RvcicsXHJcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW2NsYXNzLmlzLWludmFsaWRdPVwic2VhcmNoRmFpbGVkXCIgWyhuZ01vZGVsKV09XCJtb2RlbFwiIFtuZ2JUeXBlYWhlYWRdPVwic2VhcmNoXCIgcGxhY2Vob2xkZXI9XCJ7e3BsYWNlaG9sZGVyfX1cIlxyXG4gICAgW2VkaXRhYmxlXT1cImZhbHNlXCIgKGJsdXIpPVwib25CbHVyKClcIiBbcmVzdWx0Rm9ybWF0dGVyXT1cImZvcm1hdHRlclwiIChzZWxlY3RJdGVtKT1cIml0ZW1TZWxlY3RlZCgkZXZlbnQpXCIgW2lucHV0Rm9ybWF0dGVyXT1cImZvcm1hdHRlclwiXHJcbiAgLz5cclxuICA8c3BhbiAqbmdJZj1cInNlYXJjaGluZ1wiPnNlYXJjaGluZy4uLjwvc3Bhbj5cclxuICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiICpuZ0lmPVwic2VhcmNoRmFpbGVkXCI+Tm8gcmVzdWx0cyBmb3VuZDwvZGl2PlxyXG48L2Rpdj5gLFxyXG4gIHN0eWxlczogW2BgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgU3RhZmZTZWxlY3RvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc3RhZmZTZXJ2aWNlOiBBbmd1bGFyU3RhZmZTZXJ2aWNlKSB7IH1cclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgc2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxTdGFmZk1lbWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPFN0YWZmTWVtYmVyPigpO1xyXG5cclxuICBtb2RlbDogU3RhZmZNZW1iZXI7XHJcbiAgQElucHV0KClcclxuICBmb3JtYXQ6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIHBsYWNlaG9sZGVyOiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgX3ZhbHVlOiBudW1iZXI7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHZhbHVlKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XHJcbiAgICB0aGlzLnN0YWZmU2VydmljZS5HZXRTdGFmZkJ5SWQodmFsdWUpLnN1YnNjcmliZSgoczogU3RhZmZNZW1iZXIpID0+IHtcclxuICAgICAgaWYgKHMpIHtcclxuICAgICAgICB0aGlzLm1vZGVsID0gcztcclxuICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQocyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHZhbHVlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XHJcbiAgfVxyXG5cclxuICBzZWFyY2hpbmcgPSBmYWxzZTtcclxuICBzZWFyY2hGYWlsZWQgPSBmYWxzZTtcclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgfVxyXG5cclxuICBvbkJsdXIoKSB7XHJcbiAgICBpZiAodHlwZW9mIHRoaXMubW9kZWwgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgIHRoaXMubW9kZWwgPSBudWxsO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkLmVtaXQobnVsbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWFyY2ggPSAodGV4dCQ6IE9ic2VydmFibGU8c3RyaW5nPik6IE9ic2VydmFibGU8U3RhZmZNZW1iZXJbXT4gPT5cclxuICAgIHRleHQkLnBpcGUoXHJcbiAgICAgIGRlYm91bmNlVGltZSgzMDApLFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICB0YXAoKCkgPT4gdGhpcy5zZWFyY2hpbmcgPSB0cnVlKSxcclxuICAgICAgc3dpdGNoTWFwKCh0ZXJtOiBzdHJpbmcpID0+IHRlcm0gJiYgdGVybS5sZW5ndGggPiAyID9cclxuICAgICAgICB0aGlzLnN0YWZmU2VydmljZS5TZWFyY2hBY3RpdmVTdGFmZkJ5TmFtZSh0ZXJtKS5waXBlKFxyXG4gICAgICAgICAgdGFwKCgpID0+IHRoaXMuc2VhcmNoRmFpbGVkID0gZmFsc2UpLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoRmFpbGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgICAgICAgIH0pKVxyXG4gICAgICAgIDogb2YoW10pXHJcbiAgICAgICksXHJcbiAgICAgIHRhcCgoKSA9PiB0aGlzLnNlYXJjaGluZyA9IGZhbHNlKVxyXG4gICAgKTtcclxuXHJcbiAgaXRlbVNlbGVjdGVkKGV2ZW50OiBOZ2JUeXBlYWhlYWRTZWxlY3RJdGVtRXZlbnQpIHtcclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkLmVtaXQoZXZlbnQuaXRlbSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmb3JtYXR0ZXIgPSAocmVzdWx0OiBTdGFmZk1lbWJlcik6IHN0cmluZyA9PiB7XHJcbiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc3RhZmZTZXJ2aWNlLkZvcm1hdChyZXN1bHQsIHRoaXMuZm9ybWF0KTtcclxuICAgIH1cclxuICAgIHJldHVybiAnJztcclxuICB9XHJcbn0iLCJpbXBvcnQgeyBBbmd1bGFyU3RhZmZTZXJ2aWNlIH0gZnJvbSAnLi9hbmd1bGFyLXN0YWZmLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbkBQaXBlKHtcclxuICBuYW1lOiAnc3RhZmYnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTdGFmZlBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzdGFmZlNlcnZpY2U6IEFuZ3VsYXJTdGFmZlNlcnZpY2UpIHtcclxuXHJcbiAgfVxyXG5cclxuICB0cmFuc2Zvcm0odmFsdWU6IG51bWJlciwgZm9ybWF0Pzogc3RyaW5nKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLnN0YWZmU2VydmljZS5HZXRTdGFmZkJ5SWQodmFsdWUpLnBpcGUobWFwKGMgPT4ge1xyXG4gICAgICBpZiAoIWMpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLnN0YWZmU2VydmljZS5Gb3JtYXQoYywgZm9ybWF0KTtcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4vbW9kZWxzL2NvbmZpZyc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IE5nTW9kdWxlLCBNb2R1bGVXaXRoUHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN0YWZmUGlwZSB9IGZyb20gJy4vc3RhZmYucGlwZSc7XHJcbmltcG9ydCB7IFN0YWZmU2VsZWN0b3JDb21wb25lbnQgfSBmcm9tICcuL3N0YWZmLXNlbGVjdG9yL3N0YWZmLXNlbGVjdG9yLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE5nYk1vZHVsZSB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbkBOZ01vZHVsZSh7XHJcbiAgaW1wb3J0czogW0h0dHBDbGllbnRNb2R1bGUsIE5nYk1vZHVsZSwgRm9ybXNNb2R1bGUsIENvbW1vbk1vZHVsZV0sXHJcbiAgZGVjbGFyYXRpb25zOiBbU3RhZmZQaXBlLCBTdGFmZlNlbGVjdG9yQ29tcG9uZW50XSxcclxuICBleHBvcnRzOiBbU3RhZmZQaXBlLCBTdGFmZlNlbGVjdG9yQ29tcG9uZW50XVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5ndWxhclN0YWZmTW9kdWxlIHtcclxuICBzdGF0aWMgZm9yUm9vdChjb25maWc6IENvbmZpZyk6IE1vZHVsZVdpdGhQcm92aWRlcnMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbmdNb2R1bGU6IEFuZ3VsYXJTdGFmZk1vZHVsZSxcclxuICAgICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAgeyBwcm92aWRlOiAnY29uZmlnJywgdXNlVmFsdWU6IGNvbmZpZyB9XHJcbiAgICAgIF1cclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTs7Ozs7SUFDSSxZQUFtQixJQUFZLEVBQVMsTUFBYztRQUFuQyxTQUFJLEdBQUosSUFBSSxDQUFRO1FBQVMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtLQUVyRDtDQUNKOzs7Ozs7QUNKRDs7Ozs7SUFlRSxZQUFvQixJQUFnQixFQUE0QjtRQUE1QyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQTRCLFdBQU0sR0FBTixNQUFNOzhCQUo3QyxJQUFJLEdBQUcsRUFBd0M7a0NBQzNDLElBQUksR0FBRyxFQUF3QztnQ0FDakQsSUFBSSxHQUFHLEVBQTBDO1FBRzFFLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxNQUFNLEtBQUssQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDO1NBQ25GO0tBQ0Y7Ozs7OztJQUVNLE1BQU0sQ0FBQyxLQUFrQixFQUFFLE1BQWM7UUFDOUMsSUFBSSxNQUFNLEVBQUU7WUFDVixxQkFBSSxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRWxFLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEUsWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5RCxZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMs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