UNPKG

@fdot/angular-dotcodes

Version:

`npm install @fdot/angular-dotcodes --save`

413 lines (402 loc) 38.8 kB
import { Inject, Injectable, Pipe, Component, Input, defineInjectable, inject, NgModule, EventEmitter, Output } from '@angular/core'; import { HttpClient, HttpHeaders, HttpParams, HttpClientModule } from '@angular/common/http'; import { Observable, BehaviorSubject } from 'rxjs'; import { map } from 'rxjs/operators'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class Config { /** * @param {?} host * @param {?} apiKey * @param {?} useDefaultSelect * @param {?} defaultSelectText */ constructor(host, apiKey, useDefaultSelect, defaultSelectText) { this.host = host; this.apiKey = apiKey; this.useDefaultSelect = useDefaultSelect; this.defaultSelectText = defaultSelectText; } } /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class AngularDotcodesService { /** * @param {?} http * @param {?} config */ constructor(http, config) { this.http = http; this.config = config; this.codesCache = new Map(); this.codeCache = new Map(); if (!config) { throw Error('Call AngularDotcodesService with for root passing in the config object'); } } /** * Method GetCode * @param {?} column Column name to get Dotcode from * @param {?} codeValue The code value to retrieve * @return {?} Full HTTP response as Observable */ GetCode(column, codeValue) { const /** @type {?} */ key = `${column}-${codeValue}`; if (this.codeCache.get(key)) { this.codeCache.get(`${column}-${codeValue}`); } else if (this.codesCache.get(column)) { const /** @type {?} */ codes = this.codesCache.get(column).value; if (codes) { const /** @type {?} */ code = codes.filter(c => c.value === codeValue); if (code && code.length === 1) { if (!this.codeCache.get(key)) { this.codeCache.set(key, new BehaviorSubject(null)); } this.codeCache.get(key).next(code[0]); } else { this.loadCodes(key, column, codeValue); } } else { this.loadCodes(key, column, codeValue); } } else { this.loadCodes(key, column, codeValue); } return this.codeCache.get(key); } /** * @param {?} key * @param {?} column * @param {?} codeValue * @return {?} */ loadCodes(key, column, codeValue) { this.codeCache.set(key, new BehaviorSubject(null)); const /** @type {?} */ uri = `/GetCode`; const /** @type {?} */ headers = new HttpHeaders(); let /** @type {?} */ params = new HttpParams(); if (column !== undefined && column !== null) { params = params.set('column', column + ''); } if (codeValue !== undefined && codeValue !== null) { params = params.set('codeValue', codeValue + ''); } this.sendRequest('get', uri, headers, params, null).toPromise().then(b => { if (b && b.body) { this.codeCache.get(key).next(b.body); } }); } /** * Method GetCodes * @param {?} column Column name to get Dotcode from * @return {?} Full HTTP response as Observable */ GetCodes(column) { if (this.codesCache.get(column)) { this.codesCache.get(column); } else { this.codesCache.set(column, new BehaviorSubject(null)); const /** @type {?} */ uri = `/GetCodes`; const /** @type {?} */ headers = new HttpHeaders(); let /** @type {?} */ params = new HttpParams(); if (column !== undefined && column !== null) { params = params.set('column', column + ''); } this.sendRequest('get', uri, headers, params, null).toPromise().then(b => { if (b && b.body) { this.codesCache.get(column).next(b.body); } }); } return this.codesCache.get(column); } /** * Method GetRelatedCodes * @param {?} column Column name for dotcode * @param {?} codeValue DotCode value to get related codes for * @param {?} relatedCode Related Column name to get Related Codes from * @return {?} Full HTTP response as Observable */ GetRelatedCodes(column, codeValue, relatedCode) { const /** @type {?} */ uri = `/GetRelatedCodes`; const /** @type {?} */ headers = new HttpHeaders(); let /** @type {?} */ params = new HttpParams(); if (column !== undefined && column !== null) { params = params.set('column', column + ''); } if (codeValue !== undefined && codeValue !== null) { params = params.set('codeValue', codeValue + ''); } if (relatedCode !== undefined && relatedCode !== null) { params = params.set('relatedCode', relatedCode + ''); } return this.sendRequest('get', uri, headers, params, null).pipe(map(b => { if (b && b.body) { return b.body; } })); } /** * @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); } } } AngularDotcodesService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] }, ]; /** @nocollapse */ AngularDotcodesService.ctorParameters = () => [ { type: HttpClient, }, { type: Config, decorators: [{ type: Inject, args: ['config',] },] }, ]; /** @nocollapse */ AngularDotcodesService.ngInjectableDef = defineInjectable({ factory: function AngularDotcodesService_Factory() { return new AngularDotcodesService(inject(HttpClient), inject("config")); }, token: AngularDotcodesService, providedIn: "root" }); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class AngularDotcodesComponent { /** * @param {?} dotcodeService */ constructor(dotcodeService) { this.dotcodeService = dotcodeService; } /** * @return {?} */ ngOnInit() { console.log('init'); this.dotcodeService.GetCode(this.column, this.value).subscribe(code => { console.log(code); this.code = code; }); } } AngularDotcodesComponent.decorators = [ { type: Component, args: [{ selector: 'fdot-angular-dotcodes', template: ` <span *ngIf="code"> {{code.description}} </span> `, styles: [] },] }, ]; /** @nocollapse */ AngularDotcodesComponent.ctorParameters = () => [ { type: AngularDotcodesService, }, ]; AngularDotcodesComponent.propDecorators = { "column": [{ type: Input },], "value": [{ type: Input },], }; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class DotcodesSelectComponent { /** * @param {?} dotCodeService * @param {?} config */ constructor(dotCodeService, config) { this.dotCodeService = dotCodeService; this.config = config; this.selectedDotcode = new EventEmitter(); } /** * @param {?} value * @return {?} */ set value(value) { this._value = value; this.setSelectedCode(); } /** * @return {?} */ get value() { return this._value; } /** * @return {?} */ ngOnInit() { // tslint:disable-next-line:triple-equals if (!(this.useDefaultSelect === false || /** @type {?} */ (this.useDefaultSelect) === 'false') && this.config != null && this.config.useDefaultSelect) { this.useDefaultSelect = true; } else { this.useDefaultSelect = false; } if (!this.defaultSelectText && this.config != null && this.config.defaultSelectText) { this.defaultSelectText = this.config.defaultSelectText; } this.dotCodeService.GetCodes(this.column).subscribe(codes => { this.codes = codes; this.setSelectedCode(); }); } /** * @return {?} */ setSelectedCode() { if (!this.codes) { return; } if (this.value) { const /** @type {?} */ code = this.codes.find(c => c.value === this.value); if (code) { this.selectedCode = code; this.codeChanged(); } } } /** * @return {?} */ codeChanged() { this.selectedDotcode.emit(this.selectedCode); } } DotcodesSelectComponent.decorators = [ { type: Component, args: [{ selector: 'fdot-dotcodes-select', template: `<select [(ngModel)]="selectedCode" (change)="codeChanged()" class="form-control" [disabled]="disabled"> <option *ngIf="useDefaultSelect" value=""> {{defaultSelectText}} </option> <option *ngFor="let code of codes" [ngValue]="code"> {{code.description}} </option> </select> `, styles: [``] },] }, ]; /** @nocollapse */ DotcodesSelectComponent.ctorParameters = () => [ { type: AngularDotcodesService, }, { type: Config, decorators: [{ type: Inject, args: ['config',] },] }, ]; DotcodesSelectComponent.propDecorators = { "column": [{ type: Input },], "value": [{ type: Input },], "disabled": [{ type: Input },], "selectedDotcode": [{ type: Output },], "useDefaultSelect": [{ type: Input },], "defaultSelectText": [{ type: Input },], }; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class DotcodePipe { /** * @param {?} dotcodeService */ constructor(dotcodeService) { this.dotcodeService = dotcodeService; } /** * @param {?} value * @param {?} column * @return {?} */ transform(value, column) { return this.dotcodeService.GetCode(column, value).pipe(map(c => { if (c) { return c.description; } })); } } DotcodePipe.decorators = [ { type: Pipe, args: [{ name: 'dotcode', },] }, ]; /** @nocollapse */ DotcodePipe.ctorParameters = () => [ { type: AngularDotcodesService, }, ]; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class AngularDotcodesModule { /** * @param {?} config * @return {?} */ static forRoot(config) { return { ngModule: AngularDotcodesModule, providers: [AngularDotcodesService, { provide: 'config', useValue: config } ] }; } } AngularDotcodesModule.decorators = [ { type: NgModule, args: [{ imports: [HttpClientModule, CommonModule, FormsModule ], declarations: [AngularDotcodesComponent, DotcodesSelectComponent, DotcodePipe], exports: [AngularDotcodesComponent, DotcodesSelectComponent, DotcodePipe] },] }, ]; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ export { AngularDotcodesService, AngularDotcodesComponent, Config, DotcodesSelectComponent, AngularDotcodesModule, DotcodePipe as ɵa }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmRvdC1hbmd1bGFyLWRvdGNvZGVzLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9AZmRvdC9hbmd1bGFyLWRvdGNvZGVzL2xpYi9tb2RlbHMvY29uZmlnLnRzIiwibmc6Ly9AZmRvdC9hbmd1bGFyLWRvdGNvZGVzL2xpYi9hbmd1bGFyLWRvdGNvZGVzLnNlcnZpY2UudHMiLCJuZzovL0BmZG90L2FuZ3VsYXItZG90Y29kZXMvbGliL2FuZ3VsYXItZG90Y29kZXMuY29tcG9uZW50LnRzIiwibmc6Ly9AZmRvdC9hbmd1bGFyLWRvdGNvZGVzL2xpYi9kb3Rjb2Rlcy1zZWxlY3QvZG90Y29kZXMtc2VsZWN0LmNvbXBvbmVudC50cyIsIm5nOi8vQGZkb3QvYW5ndWxhci1kb3Rjb2Rlcy9saWIvZG90Y29kZS5waXBlLnRzIiwibmc6Ly9AZmRvdC9hbmd1bGFyLWRvdGNvZGVzL2xpYi9hbmd1bGFyLWRvdGNvZGVzLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgQ29uZmlnIHtcclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBob3N0OiBzdHJpbmcsIHB1YmxpYyBhcGlLZXk6IHN0cmluZywgcHVibGljIHVzZURlZmF1bHRTZWxlY3Q6IGJvb2xlYW4sXHJcbiAgICAgICAgcHVibGljIGRlZmF1bHRTZWxlY3RUZXh0OiBzdHJpbmcpIHtcclxuXHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcywgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHtcclxuICBEb3RDb2RlLFxyXG4gIFJlbGF0ZWRDb2RlXHJcbn0gZnJvbSAnLi9tb2RlbHMnO1xyXG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuL21vZGVscy9jb25maWcnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5ndWxhckRvdGNvZGVzU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBjb2Rlc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIEJlaGF2aW9yU3ViamVjdDxEb3RDb2RlW10+PigpO1xyXG4gIHByaXZhdGUgY29kZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIEJlaGF2aW9yU3ViamVjdDxEb3RDb2RlPj4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBASW5qZWN0KCdjb25maWcnKSBwcml2YXRlIGNvbmZpZzogQ29uZmlnKSB7XHJcbiAgICBpZiAoIWNvbmZpZykge1xyXG4gICAgICB0aHJvdyBFcnJvcignQ2FsbCBBbmd1bGFyRG90Y29kZXNTZXJ2aWNlIHdpdGggZm9yIHJvb3QgcGFzc2luZyBpbiB0aGUgY29uZmlnIG9iamVjdCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBNZXRob2QgR2V0Q29kZVxyXG4gICogQHBhcmFtIGNvbHVtbiBDb2x1bW4gbmFtZSB0byBnZXQgRG90Y29kZSBmcm9tXHJcbiAgKiBAcGFyYW0gY29kZVZhbHVlIFRoZSBjb2RlIHZhbHVlIHRvIHJldHJpZXZlXHJcbiAgKiBAcmV0dXJuIEZ1bGwgSFRUUCByZXNwb25zZSBhcyBPYnNlcnZhYmxlXHJcbiAgKi9cclxuICBwdWJsaWMgR2V0Q29kZShjb2x1bW46IHN0cmluZywgY29kZVZhbHVlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPERvdENvZGU+IHtcclxuICAgIGNvbnN0IGtleSA9IGAke2NvbHVtbn0tJHtjb2RlVmFsdWV9YDtcclxuXHJcbiAgICBpZiAodGhpcy5jb2RlQ2FjaGUuZ2V0KGtleSkpIHtcclxuICAgICAgdGhpcy5jb2RlQ2FjaGUuZ2V0KGAke2NvbHVtbn0tJHtjb2RlVmFsdWV9YCk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29kZXNDYWNoZS5nZXQoY29sdW1uKSkge1xyXG4gICAgICBjb25zdCBjb2RlcyA9IHRoaXMuY29kZXNDYWNoZS5nZXQoY29sdW1uKS52YWx1ZTtcclxuICAgICAgaWYgKGNvZGVzKSB7XHJcbiAgICAgICAgY29uc3QgY29kZSA9IGNvZGVzLmZpbHRlcihjID0+IGMudmFsdWUgPT09IGNvZGVWYWx1ZSk7XHJcblxyXG4gICAgICAgIGlmIChjb2RlICYmIGNvZGUubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuY29kZUNhY2hlLmdldChrZXkpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29kZUNhY2hlLnNldChrZXksIG5ldyBCZWhhdmlvclN1YmplY3Q8RG90Q29kZT4obnVsbCkpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuY29kZUNhY2hlLmdldChrZXkpLm5leHQoY29kZVswXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMubG9hZENvZGVzKGtleSwgY29sdW1uLCBjb2RlVmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmxvYWRDb2RlcyhrZXksIGNvbHVtbiwgY29kZVZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5sb2FkQ29kZXMoa2V5LCBjb2x1bW4sIGNvZGVWYWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuY29kZUNhY2hlLmdldChrZXkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkQ29kZXMoa2V5OiBzdHJpbmcsIGNvbHVtbjogc3RyaW5nLCBjb2RlVmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5jb2RlQ2FjaGUuc2V0KGtleSwgbmV3IEJlaGF2aW9yU3ViamVjdDxEb3RDb2RlPihudWxsKSk7XHJcblxyXG4gICAgY29uc3QgdXJpID0gYC9HZXRDb2RlYDtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcclxuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG5cclxuICAgIGlmIChjb2x1bW4gIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4gIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnY29sdW1uJywgY29sdW1uICsgJycpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvZGVWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGNvZGVWYWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdjb2RlVmFsdWUnLCBjb2RlVmFsdWUgKyAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZW5kUmVxdWVzdDxEb3RDb2RlPignZ2V0JywgdXJpLCBoZWFkZXJzLCBwYXJhbXMsIG51bGwpLnRvUHJvbWlzZSgpLnRoZW4oYiA9PiB7XHJcbiAgICAgIGlmIChiICYmIGIuYm9keSkge1xyXG4gICAgICAgIHRoaXMuY29kZUNhY2hlLmdldChrZXkpLm5leHQoYi5ib2R5KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICogTWV0aG9kIEdldENvZGVzXHJcbiAgKiBAcGFyYW0gY29sdW1uIENvbHVtbiBuYW1lIHRvIGdldCBEb3Rjb2RlIGZyb21cclxuICAqIEByZXR1cm4gRnVsbCBIVFRQIHJlc3BvbnNlIGFzIE9ic2VydmFibGVcclxuICAqL1xyXG4gIHB1YmxpYyBHZXRDb2Rlcyhjb2x1bW46IHN0cmluZyk6IE9ic2VydmFibGU8RG90Q29kZVtdPiB7XHJcbiAgICBpZiAodGhpcy5jb2Rlc0NhY2hlLmdldChjb2x1bW4pKSB7XHJcbiAgICAgIHRoaXMuY29kZXNDYWNoZS5nZXQoY29sdW1uKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY29kZXNDYWNoZS5zZXQoY29sdW1uLCBuZXcgQmVoYXZpb3JTdWJqZWN0PERvdENvZGVbXT4obnVsbCkpO1xyXG5cclxuICAgICAgY29uc3QgdXJpID0gYC9HZXRDb2Rlc2A7XHJcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcclxuICAgICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICAgIGlmIChjb2x1bW4gIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4gIT09IG51bGwpIHtcclxuICAgICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdjb2x1bW4nLCBjb2x1bW4gKyAnJyk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZW5kUmVxdWVzdDxEb3RDb2RlW10+KCdnZXQnLCB1cmksIGhlYWRlcnMsIHBhcmFtcywgbnVsbCkudG9Qcm9taXNlKCkudGhlbihiID0+IHtcclxuICAgICAgICBpZiAoYiAmJiBiLmJvZHkpIHtcclxuICAgICAgICAgIHRoaXMuY29kZXNDYWNoZS5nZXQoY29sdW1uKS5uZXh0KGIuYm9keSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5jb2Rlc0NhY2hlLmdldChjb2x1bW4pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBNZXRob2QgR2V0UmVsYXRlZENvZGVzXHJcbiAgKiBAcGFyYW0gY29sdW1uIENvbHVtbiBuYW1lIGZvciBkb3Rjb2RlXHJcbiAgKiBAcGFyYW0gY29kZVZhbHVlIERvdENvZGUgdmFsdWUgdG8gZ2V0IHJlbGF0ZWQgY29kZXMgZm9yXHJcbiAgKiBAcGFyYW0gcmVsYXRlZENvZGUgUmVsYXRlZCBDb2x1bW4gbmFtZSB0byBnZXQgUmVsYXRlZCBDb2RlcyBmcm9tXHJcbiAgKiBAcmV0dXJuIEZ1bGwgSFRUUCByZXNwb25zZSBhcyBPYnNlcnZhYmxlXHJcbiAgKi9cclxuICBwdWJsaWMgR2V0UmVsYXRlZENvZGVzKGNvbHVtbjogc3RyaW5nLCBjb2RlVmFsdWU6IHN0cmluZywgcmVsYXRlZENvZGU6IHN0cmluZyk6IE9ic2VydmFibGU8UmVsYXRlZENvZGVbXT4ge1xyXG4gICAgY29uc3QgdXJpID0gYC9HZXRSZWxhdGVkQ29kZXNgO1xyXG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xyXG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICBpZiAoY29sdW1uICE9PSB1bmRlZmluZWQgJiYgY29sdW1uICE9PSBudWxsKSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2NvbHVtbicsIGNvbHVtbiArICcnKTtcclxuICAgIH1cclxuICAgIGlmIChjb2RlVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBjb2RlVmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnY29kZVZhbHVlJywgY29kZVZhbHVlICsgJycpO1xyXG4gICAgfVxyXG4gICAgaWYgKHJlbGF0ZWRDb2RlICE9PSB1bmRlZmluZWQgJiYgcmVsYXRlZENvZGUgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgncmVsYXRlZENvZGUnLCByZWxhdGVkQ29kZSArICcnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5zZW5kUmVxdWVzdDxSZWxhdGVkQ29kZVtdPignZ2V0JywgdXJpLCBoZWFkZXJzLCBwYXJhbXMsIG51bGwpLnBpcGUoXHJcbiAgICAgIG1hcChiID0+IHtcclxuICAgICAgICBpZiAoYiAmJiBiLmJvZHkpIHtcclxuICAgICAgICAgIHJldHVybiBiLmJvZHk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlbmRSZXF1ZXN0PFQ+KG1ldGhvZDogc3RyaW5nLCB1cmk6IHN0cmluZywgaGVhZGVyczogSHR0cEhlYWRlcnMsIHBhcmFtczogSHR0cFBhcmFtcywgYm9keTogYW55KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8VD4+IHtcclxuICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnT2NwLUFwaW0tU3Vic2NyaXB0aW9uLUtleScsIHRoaXMuY29uZmlnLmFwaUtleSk7XHJcbiAgICBpZiAobWV0aG9kID09PSAnZ2V0Jykge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxUPih0aGlzLmNvbmZpZy5ob3N0ICsgdXJpLFxyXG4gICAgICAgIHsgaGVhZGVyczogaGVhZGVycy5zZXQoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyksIHBhcmFtczogcGFyYW1zLCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pO1xyXG4gICAgfSBlbHNlIGlmIChtZXRob2QgPT09ICdwdXQnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PFQ+KHRoaXMuY29uZmlnLmhvc3QgKyB1cmksIGJvZHksXHJcbiAgICAgICAgeyBoZWFkZXJzOiBoZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKSwgcGFyYW1zOiBwYXJhbXMsIG9ic2VydmU6ICdyZXNwb25zZScgfSk7XHJcbiAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gJ3Bvc3QnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxUPih0aGlzLmNvbmZpZy5ob3N0ICsgdXJpLCBib2R5LFxyXG4gICAgICAgIHsgaGVhZGVyczogaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyksIHBhcmFtczogcGFyYW1zLCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pO1xyXG4gICAgfSBlbHNlIGlmIChtZXRob2QgPT09ICdkZWxldGUnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlPFQ+KHRoaXMuY29uZmlnLmhvc3QgKyB1cmksIHsgaGVhZGVyczogaGVhZGVycywgcGFyYW1zOiBwYXJhbXMsIG9ic2VydmU6ICdyZXNwb25zZScgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdVbnN1cHBvcnRlZCByZXF1ZXN0OiAnICsgbWV0aG9kKTtcclxuICAgICAgcmV0dXJuIE9ic2VydmFibGUudGhyb3coJ1Vuc3VwcG9ydGVkIHJlcXVlc3Q6ICcgKyBtZXRob2QpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBEb3RDb2RlIH0gZnJvbSAnLi9tb2RlbHMvZG90Y29kZS5tb2RlbCc7XHJcbmltcG9ydCB7IEFuZ3VsYXJEb3Rjb2Rlc1NlcnZpY2UgfSBmcm9tICcuL2FuZ3VsYXItZG90Y29kZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdmZG90LWFuZ3VsYXItZG90Y29kZXMnLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8c3BhbiAqbmdJZj1cImNvZGVcIj5cclxuICAgIHt7Y29kZS5kZXNjcmlwdGlvbn19XHJcbiAgICA8L3NwYW4+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBbmd1bGFyRG90Y29kZXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBjb2RlOiBEb3RDb2RlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGNvbHVtbjogc3RyaW5nO1xyXG4gIEBJbnB1dCgpXHJcbiAgdmFsdWU6IHN0cmluZztcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZG90Y29kZVNlcnZpY2U6IEFuZ3VsYXJEb3Rjb2Rlc1NlcnZpY2UpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGNvbnNvbGUubG9nKCdpbml0Jyk7XHJcbiAgICB0aGlzLmRvdGNvZGVTZXJ2aWNlLkdldENvZGUodGhpcy5jb2x1bW4sIHRoaXMudmFsdWUpLnN1YnNjcmliZShjb2RlID0+IHtcclxuICAgICAgY29uc29sZS5sb2coY29kZSk7XHJcbiAgICAgIHRoaXMuY29kZSA9IGNvZGU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4vLi4vbW9kZWxzL2NvbmZpZyc7XHJcbmltcG9ydCB7IEFuZ3VsYXJEb3Rjb2Rlc1NlcnZpY2UgfSBmcm9tICcuLy4uL2FuZ3VsYXItZG90Y29kZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IERvdENvZGUgfSBmcm9tICcuLy4uL21vZGVscy9kb3Rjb2RlLm1vZGVsJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgT3B0aW9uYWwsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdmZG90LWRvdGNvZGVzLXNlbGVjdCcsXHJcbiAgdGVtcGxhdGU6IGA8c2VsZWN0IFsobmdNb2RlbCldPVwic2VsZWN0ZWRDb2RlXCIgKGNoYW5nZSk9XCJjb2RlQ2hhbmdlZCgpXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cclxuICA8b3B0aW9uICpuZ0lmPVwidXNlRGVmYXVsdFNlbGVjdFwiIHZhbHVlPVwiXCI+XHJcbiAgICB7e2RlZmF1bHRTZWxlY3RUZXh0fX1cclxuICA8L29wdGlvbj5cclxuICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjb2RlIG9mIGNvZGVzXCIgW25nVmFsdWVdPVwiY29kZVwiPlxyXG4gICAge3tjb2RlLmRlc2NyaXB0aW9ufX1cclxuICA8L29wdGlvbj5cclxuPC9zZWxlY3Q+XHJcbmAsXHJcbiAgc3R5bGVzOiBbYGBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEb3Rjb2Rlc1NlbGVjdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIHByaXZhdGUgX3ZhbHVlOiBzdHJpbmc7XHJcbiAgY29kZXM6IERvdENvZGVbXTtcclxuXHJcbiAgQElucHV0KClcclxuICBjb2x1bW46IHN0cmluZztcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgdmFsdWUodmFsdWUpIHtcclxuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XHJcbiAgICB0aGlzLnNldFNlbGVjdGVkQ29kZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgc2VsZWN0ZWREb3Rjb2RlID0gbmV3IEV2ZW50RW1pdHRlcjxEb3RDb2RlPigpO1xyXG4gIHNlbGVjdGVkQ29kZTogRG90Q29kZTtcclxuXHJcbiAgQElucHV0KClcclxuICB1c2VEZWZhdWx0U2VsZWN0PzogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIGRlZmF1bHRTZWxlY3RUZXh0Pzogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRvdENvZGVTZXJ2aWNlOiBBbmd1bGFyRG90Y29kZXNTZXJ2aWNlLCBASW5qZWN0KCdjb25maWcnKSBwcml2YXRlIGNvbmZpZzogQ29uZmlnKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHJpcGxlLWVxdWFsc1xyXG4gICAgaWYgKCEodGhpcy51c2VEZWZhdWx0U2VsZWN0ID09PSBmYWxzZSB8fCA8YW55PnRoaXMudXNlRGVmYXVsdFNlbGVjdCA9PT0gJ2ZhbHNlJylcclxuICAgICAgJiYgdGhpcy5jb25maWcgIT0gbnVsbCAmJiB0aGlzLmNvbmZpZy51c2VEZWZhdWx0U2VsZWN0KSB7XHJcbiAgICAgIHRoaXMudXNlRGVmYXVsdFNlbGVjdCA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnVzZURlZmF1bHRTZWxlY3QgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5kZWZhdWx0U2VsZWN0VGV4dCAmJiB0aGlzLmNvbmZpZyAhPSBudWxsICYmIHRoaXMuY29uZmlnLmRlZmF1bHRTZWxlY3RUZXh0KSB7XHJcbiAgICAgIHRoaXMuZGVmYXVsdFNlbGVjdFRleHQgPSB0aGlzLmNvbmZpZy5kZWZhdWx0U2VsZWN0VGV4dDtcclxuICAgIH1cclxuICAgIHRoaXMuZG90Q29kZVNlcnZpY2UuR2V0Q29kZXModGhpcy5jb2x1bW4pLnN1YnNjcmliZShjb2RlcyA9PiB7XHJcbiAgICAgIHRoaXMuY29kZXMgPSBjb2RlcztcclxuXHJcbiAgICAgIHRoaXMuc2V0U2VsZWN0ZWRDb2RlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0U2VsZWN0ZWRDb2RlKCkge1xyXG4gICAgaWYgKCF0aGlzLmNvZGVzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnZhbHVlKSB7XHJcbiAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLmNvZGVzLmZpbmQoYyA9PiBjLnZhbHVlID09PSB0aGlzLnZhbHVlKTtcclxuXHJcbiAgICAgIGlmIChjb2RlKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvZGUgPSBjb2RlO1xyXG4gICAgICAgIHRoaXMuY29kZUNoYW5nZWQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNvZGVDaGFuZ2VkKCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZERvdGNvZGUuZW1pdCh0aGlzLnNlbGVjdGVkQ29kZSk7XHJcbiAgfVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFuZ3VsYXJEb3Rjb2Rlc1NlcnZpY2UgfSBmcm9tICcuL2FuZ3VsYXItZG90Y29kZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbkBQaXBlKHtcclxuICBuYW1lOiAnZG90Y29kZScsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEb3Rjb2RlUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZG90Y29kZVNlcnZpY2U6IEFuZ3VsYXJEb3Rjb2Rlc1NlcnZpY2UpIHsgfVxyXG5cclxuICB0cmFuc2Zvcm0odmFsdWU6IHN0cmluZywgY29sdW1uOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuZG90Y29kZVNlcnZpY2UuR2V0Q29kZShjb2x1bW4sIHZhbHVlKS5waXBlKG1hcChjID0+IHtcclxuICAgICAgaWYgKGMpIHtcclxuICAgICAgICByZXR1cm4gYy5kZXNjcmlwdGlvbjtcclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgQW5ndWxhckRvdGNvZGVzU2VydmljZSB9IGZyb20gJy4vYW5ndWxhci1kb3Rjb2Rlcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTmdNb2R1bGUsIE1vZHVsZVdpdGhQcm92aWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQW5ndWxhckRvdGNvZGVzQ29tcG9uZW50IH0gZnJvbSAnLi9hbmd1bGFyLWRvdGNvZGVzLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnRNb2R1bGUsIEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IERvdGNvZGVzU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi9kb3Rjb2Rlcy1zZWxlY3QvZG90Y29kZXMtc2VsZWN0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBEb3Rjb2RlUGlwZSB9IGZyb20gJy4vZG90Y29kZS5waXBlJztcclxuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi9tb2RlbHMvY29uZmlnJztcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgaW1wb3J0czogW0h0dHBDbGllbnRNb2R1bGUsIENvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGVcclxuICBdLFxyXG4gIGRlY2xhcmF0aW9uczogW0FuZ3VsYXJEb3Rjb2Rlc0NvbXBvbmVudCwgRG90Y29kZXNTZWxlY3RDb21wb25lbnQsIERvdGNvZGVQaXBlXSxcclxuICBleHBvcnRzOiBbQW5ndWxhckRvdGNvZGVzQ29tcG9uZW50LCBEb3Rjb2Rlc1NlbGVjdENvbXBvbmVudCwgRG90Y29kZVBpcGVdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBbmd1bGFyRG90Y29kZXNNb2R1bGUge1xyXG4gIHN0YXRpYyBmb3JSb290KGNvbmZpZzogQ29uZmlnKTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBuZ01vZHVsZTogQW5ndWxhckRvdGNvZGVzTW9kdWxlLFxyXG4gICAgICBwcm92aWRlcnM6IFtBbmd1bGFyRG90Y29kZXNTZXJ2aWNlLFxyXG4gICAgICAgIHsgcHJvdmlkZTogJ2NvbmZpZycsIHVzZVZhbHVlOiBjb25maWcgfVxyXG4gICAgICBdXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7Ozs7OztJQUNJLFlBQW1CLElBQVksRUFBUyxNQUFjLEVBQVMsZ0JBQXlCLEVBQzdFO1FBRFEsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUFTLFdBQU0sR0FBTixNQUFNLENBQVE7UUFBUyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQVM7UUFDN0Usc0JBQWlCLEdBQWpCLGlCQUFpQjtLQUUzQjtDQUNKOzs7Ozs7QUNMRDs7Ozs7SUFrQkUsWUFBb0IsSUFBZ0IsRUFBNEI7UUFBNUMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUE0QixXQUFN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QUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkUsSUFBSSxNQUFNLEtBQUssS0FBSyxFQUFFO1lBQ3BCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxFQUM1QyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7U0FDaEc7YUFBTSxJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUU7WUFDM0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUNsRCxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7U0FDdEc7YUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLEVBQUU7WUFDNUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUNuRCxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7U0FDdEc7YUFBTSxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUU7WUFDOUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFN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