UNPKG

@fdot/angular-dotcodes

Version:

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

452 lines (441 loc) 41.6 kB
import { Inject, Injectable, Pipe, defineInjectable, inject, Component, Input, 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 */ var Config = /** @class */ (function () { function Config(host, apiKey, useDefaultSelect, defaultSelectText) { this.host = host; this.apiKey = apiKey; this.useDefaultSelect = useDefaultSelect; this.defaultSelectText = defaultSelectText; } return Config; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var AngularDotcodesService = /** @class */ (function () { function AngularDotcodesService(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 */ AngularDotcodesService.prototype.GetCode = /** * Method GetCode * @param {?} column Column name to get Dotcode from * @param {?} codeValue The code value to retrieve * @return {?} Full HTTP response as Observable */ function (column, codeValue) { var /** @type {?} */ key = column + "-" + codeValue; if (this.codeCache.get(key)) { this.codeCache.get(column + "-" + codeValue); } else if (this.codesCache.get(column)) { var /** @type {?} */ codes = this.codesCache.get(column).value; if (codes) { var /** @type {?} */ code = codes.filter(function (c) { return 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 {?} */ AngularDotcodesService.prototype.loadCodes = /** * @param {?} key * @param {?} column * @param {?} codeValue * @return {?} */ function (key, column, codeValue) { var _this = this; this.codeCache.set(key, new BehaviorSubject(null)); var /** @type {?} */ uri = "/GetCode"; var /** @type {?} */ headers = new HttpHeaders(); var /** @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(function (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 */ AngularDotcodesService.prototype.GetCodes = /** * Method GetCodes * @param {?} column Column name to get Dotcode from * @return {?} Full HTTP response as Observable */ function (column) { var _this = this; if (this.codesCache.get(column)) { this.codesCache.get(column); } else { this.codesCache.set(column, new BehaviorSubject(null)); var /** @type {?} */ uri = "/GetCodes"; var /** @type {?} */ headers = new HttpHeaders(); var /** @type {?} */ params = new HttpParams(); if (column !== undefined && column !== null) { params = params.set('column', column + ''); } this.sendRequest('get', uri, headers, params, null).toPromise().then(function (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 */ AngularDotcodesService.prototype.GetRelatedCodes = /** * 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 */ function (column, codeValue, relatedCode) { var /** @type {?} */ uri = "/GetRelatedCodes"; var /** @type {?} */ headers = new HttpHeaders(); var /** @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(function (b) { if (b && b.body) { return b.body; } })); }; /** * @template T * @param {?} method * @param {?} uri * @param {?} headers * @param {?} params * @param {?} body * @return {?} */ AngularDotcodesService.prototype.sendRequest = /** * @template T * @param {?} method * @param {?} uri * @param {?} headers * @param {?} params * @param {?} body * @return {?} */ function (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 = function () { return [ { 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" }); return AngularDotcodesService; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var AngularDotcodesComponent = /** @class */ (function () { function AngularDotcodesComponent(dotcodeService) { this.dotcodeService = dotcodeService; } /** * @return {?} */ AngularDotcodesComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; console.log('init'); this.dotcodeService.GetCode(this.column, this.value).subscribe(function (code) { console.log(code); _this.code = code; }); }; AngularDotcodesComponent.decorators = [ { type: Component, args: [{ selector: 'fdot-angular-dotcodes', template: "\n <span *ngIf=\"code\">\n {{code.description}}\n </span>\n ", styles: [] },] }, ]; /** @nocollapse */ AngularDotcodesComponent.ctorParameters = function () { return [ { type: AngularDotcodesService, }, ]; }; AngularDotcodesComponent.propDecorators = { "column": [{ type: Input },], "value": [{ type: Input },], }; return AngularDotcodesComponent; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var DotcodesSelectComponent = /** @class */ (function () { function DotcodesSelectComponent(dotCodeService, config) { this.dotCodeService = dotCodeService; this.config = config; this.selectedDotcode = new EventEmitter(); } Object.defineProperty(DotcodesSelectComponent.prototype, "value", { get: /** * @return {?} */ function () { return this._value; }, set: /** * @param {?} value * @return {?} */ function (value) { this._value = value; this.setSelectedCode(); }, enumerable: true, configurable: true }); /** * @return {?} */ DotcodesSelectComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; // 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(function (codes) { _this.codes = codes; _this.setSelectedCode(); }); }; /** * @return {?} */ DotcodesSelectComponent.prototype.setSelectedCode = /** * @return {?} */ function () { var _this = this; if (!this.codes) { return; } if (this.value) { var /** @type {?} */ code = this.codes.find(function (c) { return c.value === _this.value; }); if (code) { this.selectedCode = code; this.codeChanged(); } } }; /** * @return {?} */ DotcodesSelectComponent.prototype.codeChanged = /** * @return {?} */ function () { 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\">\n <option *ngIf=\"useDefaultSelect\" value=\"\">\n {{defaultSelectText}}\n </option>\n <option *ngFor=\"let code of codes\" [ngValue]=\"code\">\n {{code.description}}\n </option>\n</select>\n", styles: [""] },] }, ]; /** @nocollapse */ DotcodesSelectComponent.ctorParameters = function () { return [ { 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 },], }; return DotcodesSelectComponent; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var DotcodePipe = /** @class */ (function () { function DotcodePipe(dotcodeService) { this.dotcodeService = dotcodeService; } /** * @param {?} value * @param {?} column * @return {?} */ DotcodePipe.prototype.transform = /** * @param {?} value * @param {?} column * @return {?} */ function (value, column) { return this.dotcodeService.GetCode(column, value).pipe(map(function (c) { if (c) { return c.description; } })); }; DotcodePipe.decorators = [ { type: Pipe, args: [{ name: 'dotcode', },] }, ]; /** @nocollapse */ DotcodePipe.ctorParameters = function () { return [ { type: AngularDotcodesService, }, ]; }; return DotcodePipe; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var AngularDotcodesModule = /** @class */ (function () { function AngularDotcodesModule() { } /** * @param {?} config * @return {?} */ AngularDotcodesModule.forRoot = /** * @param {?} config * @return {?} */ function (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] },] }, ]; return AngularDotcodesModule; }()); /** * @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+IHtcclxuICAgICAgaWYgKGMpIHtcclxuICAgICAgICByZXR1cm4gYy5kZXNjcmlwdGlvbjtcclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgQW5ndWxhckRvdGNvZGVzU2VydmljZSB9IGZyb20gJy4vYW5ndWxhci1kb3Rjb2Rlcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTmdNb2R1bGUsIE1vZHVsZVdpdGhQcm92aWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQW5ndWxhckRvdGNvZGVzQ29tcG9uZW50IH0gZnJvbSAnLi9hbmd1bGFyLWRvdGNvZGVzLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnRNb2R1bGUsIEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IERvdGNvZGVzU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi9kb3Rjb2Rlcy1zZWxlY3QvZG90Y29kZXMtc2VsZWN0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBEb3Rjb2RlUGlwZSB9IGZyb20gJy4vZG90Y29kZS5waXBlJztcclxuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi9tb2RlbHMvY29uZmlnJztcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgaW1wb3J0czogW0h0dHBDbGllbnRNb2R1bGUsIENvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGVcclxuICBdLFxyXG4gIGRlY2xhcmF0aW9uczogW0FuZ3VsYXJEb3Rjb2Rlc0NvbXBvbmVudCwgRG90Y29kZXNTZWxlY3RDb21wb25lbnQsIERvdGNvZGVQaXBlXSxcclxuICBleHBvcnRzOiBbQW5ndWxhckRvdGNvZGVzQ29tcG9uZW50LCBEb3Rjb2Rlc1NlbGVjdENvbXBvbmVudCwgRG90Y29kZVBpcGVdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBbmd1bGFyRG90Y29kZXNNb2R1bGUge1xyXG4gIHN0YXRpYyBmb3JSb290KGNvbmZpZzogQ29uZmlnKTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBuZ01vZHVsZTogQW5ndWxhckRvdGNvZGVzTW9kdWxlLFxyXG4gICAgICBwcm92aWRlcnM6IFtBbmd1bGFyRG90Y29kZXNTZXJ2aWNlLFxyXG4gICAgICAgIHsgcHJvdmlkZTogJ2NvbmZpZycsIHVzZVZhbHVlOiBjb25maWcgfVxyXG4gICAgICBdXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQSxJQUFBO0lBQ0ksZ0JBQW1CLElBQVksRUFBUyxNQUFjLEVBQVMsZ0JBQXlCLEVBQzdFO1FBRFEsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUFTLFdBQU0sR0FBTixNQUFNLENBQVE7UUFBUyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQVM7UUFDN0Usc0JBQWlCLEdBQWpCLGlCQUFpQjtLQUUzQjtpQkFKTDtJQUtDOzs7Ozs7QUNMRDtJQWtCRSxnQ0FBb0IsSUFBZ0IsRUFBNEI7UUFBNUMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUE0QixX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