UNPKG

@fdot/angular-dotcodes

Version:

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

466 lines (453 loc) 45.3 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common/http'), require('rxjs'), require('rxjs/operators'), require('@angular/common'), require('@angular/forms')) : typeof define === 'function' && define.amd ? define('@fdot/angular-dotcodes', ['exports', '@angular/core', '@angular/common/http', 'rxjs', 'rxjs/operators', '@angular/common', '@angular/forms'], factory) : (factory((global.fdot = global.fdot || {}, global.fdot['angular-dotcodes'] = {}),global.ng.core,global.ng.common.http,null,global.Rx.Observable.prototype,global.ng.common,global.ng.forms)); }(this, (function (exports,i0,i1,rxjs,operators,common,forms) { 'use strict'; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var Config = (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 = (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 rxjs.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 rxjs.BehaviorSubject(null)); var /** @type {?} */ uri = "/GetCode"; var /** @type {?} */ headers = new i1.HttpHeaders(); var /** @type {?} */ params = new i1.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 rxjs.BehaviorSubject(null)); var /** @type {?} */ uri = "/GetCodes"; var /** @type {?} */ headers = new i1.HttpHeaders(); var /** @type {?} */ params = new i1.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 i1.HttpHeaders(); var /** @type {?} */ params = new i1.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(operators.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 rxjs.Observable.throw('Unsupported request: ' + method); } }; AngularDotcodesService.decorators = [ { type: i0.Injectable, args: [{ providedIn: 'root' },] }, ]; /** @nocollapse */ AngularDotcodesService.ctorParameters = function () { return [ { type: i1.HttpClient, }, { type: Config, decorators: [{ type: i0.Inject, args: ['config',] },] }, ]; }; /** @nocollapse */ AngularDotcodesService.ngInjectableDef = i0.defineInjectable({ factory: function AngularDotcodesService_Factory() { return new AngularDotcodesService(i0.inject(i1.HttpClient), i0.inject("config")); }, token: AngularDotcodesService, providedIn: "root" }); return AngularDotcodesService; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var AngularDotcodesComponent = (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: i0.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: i0.Input },], "value": [{ type: i0.Input },], }; return AngularDotcodesComponent; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var DotcodesSelectComponent = (function () { function DotcodesSelectComponent(dotCodeService, config) { this.dotCodeService = dotCodeService; this.config = config; this.selectedDotcode = new i0.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: i0.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: i0.Inject, args: ['config',] },] }, ]; }; DotcodesSelectComponent.propDecorators = { "column": [{ type: i0.Input },], "value": [{ type: i0.Input },], "disabled": [{ type: i0.Input },], "selectedDotcode": [{ type: i0.Output },], "useDefaultSelect": [{ type: i0.Input },], "defaultSelectText": [{ type: i0.Input },], }; return DotcodesSelectComponent; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var DotcodePipe = (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(operators.map(function (c) { if (c) { return c.description; } })); }; DotcodePipe.decorators = [ { type: i0.Pipe, args: [{ name: 'dotcode', },] }, ]; /** @nocollapse */ DotcodePipe.ctorParameters = function () { return [ { type: AngularDotcodesService, }, ]; }; return DotcodePipe; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var AngularDotcodesModule = (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: i0.NgModule, args: [{ imports: [i1.HttpClientModule, common.CommonModule, forms.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 */ exports.AngularDotcodesService = AngularDotcodesService; exports.AngularDotcodesComponent = AngularDotcodesComponent; exports.Config = Config; exports.DotcodesSelectComponent = DotcodesSelectComponent; exports.AngularDotcodesModule = AngularDotcodesModule; exports.ɵa = DotcodePipe; Object.defineProperty(exports, '__esModule', { value: true }); }))); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmRvdC1hbmd1bGFyLWRvdGNvZGVzLnVtZC5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vQGZkb3QvYW5ndWxhci1kb3Rjb2Rlcy9saWIvbW9kZWxzL2NvbmZpZy50cyIsIm5nOi8vQGZkb3QvYW5ndWxhci1kb3Rjb2Rlcy9saWIvYW5ndWxhci1kb3Rjb2Rlcy5zZXJ2aWNlLnRzIiwibmc6Ly9AZmRvdC9hbmd1bGFyLWRvdGNvZGVzL2xpYi9hbmd1bGFyLWRvdGNvZGVzLmNvbXBvbmVudC50cyIsIm5nOi8vQGZkb3QvYW5ndWxhci1kb3Rjb2Rlcy9saWIvZG90Y29kZXMtc2VsZWN0L2RvdGNvZGVzLXNlbGVjdC5jb21wb25lbnQudHMiLCJuZzovL0BmZG90L2FuZ3VsYXItZG90Y29kZXMvbGliL2RvdGNvZGUucGlwZS50cyIsIm5nOi8vQGZkb3QvYW5ndWxhci1kb3Rjb2Rlcy9saWIvYW5ndWxhci1kb3Rjb2Rlcy5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIENvbmZpZyB7XHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaG9zdDogc3RyaW5nLCBwdWJsaWMgYXBpS2V5OiBzdHJpbmcsIHB1YmxpYyB1c2VEZWZhdWx0U2VsZWN0OiBib29sZWFuLFxyXG4gICAgICAgIHB1YmxpYyBkZWZhdWx0U2VsZWN0VGV4dDogc3RyaW5nKSB7XHJcblxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMsIEh0dHBSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7XHJcbiAgRG90Q29kZSxcclxuICBSZWxhdGVkQ29kZVxyXG59IGZyb20gJy4vbW9kZWxzJztcclxuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi9tb2RlbHMvY29uZmlnJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEFuZ3VsYXJEb3Rjb2Rlc1NlcnZpY2Uge1xyXG4gIHByaXZhdGUgY29kZXNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBCZWhhdmlvclN1YmplY3Q8RG90Q29kZVtdPj4oKTtcclxuICBwcml2YXRlIGNvZGVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBCZWhhdmlvclN1YmplY3Q8RG90Q29kZT4+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwgQEluamVjdCgnY29uZmlnJykgcHJpdmF0ZSBjb25maWc6IENvbmZpZykge1xyXG4gICAgaWYgKCFjb25maWcpIHtcclxuICAgICAgdGhyb3cgRXJyb3IoJ0NhbGwgQW5ndWxhckRvdGNvZGVzU2VydmljZSB3aXRoIGZvciByb290IHBhc3NpbmcgaW4gdGhlIGNvbmZpZyBvYmplY3QnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogTWV0aG9kIEdldENvZGVcclxuICAqIEBwYXJhbSBjb2x1bW4gQ29sdW1uIG5hbWUgdG8gZ2V0IERvdGNvZGUgZnJvbVxyXG4gICogQHBhcmFtIGNvZGVWYWx1ZSBUaGUgY29kZSB2YWx1ZSB0byByZXRyaWV2ZVxyXG4gICogQHJldHVybiBGdWxsIEhUVFAgcmVzcG9uc2UgYXMgT2JzZXJ2YWJsZVxyXG4gICovXHJcbiAgcHVibGljIEdldENvZGUoY29sdW1uOiBzdHJpbmcsIGNvZGVWYWx1ZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxEb3RDb2RlPiB7XHJcbiAgICBjb25zdCBrZXkgPSBgJHtjb2x1bW59LSR7Y29kZVZhbHVlfWA7XHJcblxyXG4gICAgaWYgKHRoaXMuY29kZUNhY2hlLmdldChrZXkpKSB7XHJcbiAgICAgIHRoaXMuY29kZUNhY2hlLmdldChgJHtjb2x1bW59LSR7Y29kZVZhbHVlfWApO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmNvZGVzQ2FjaGUuZ2V0KGNvbHVtbikpIHtcclxuICAgICAgY29uc3QgY29kZXMgPSB0aGlzLmNvZGVzQ2FjaGUuZ2V0KGNvbHVtbikudmFsdWU7XHJcbiAgICAgIGlmIChjb2Rlcykge1xyXG4gICAgICAgIGNvbnN0IGNvZGUgPSBjb2Rlcy5maWx0ZXIoYyA9PiBjLnZhbHVlID09PSBjb2RlVmFsdWUpO1xyXG5cclxuICAgICAgICBpZiAoY29kZSAmJiBjb2RlLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmNvZGVDYWNoZS5nZXQoa2V5KSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvZGVDYWNoZS5zZXQoa2V5LCBuZXcgQmVoYXZpb3JTdWJqZWN0PERvdENvZGU+KG51bGwpKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmNvZGVDYWNoZS5nZXQoa2V5KS5uZXh0KGNvZGVbMF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmxvYWRDb2RlcyhrZXksIGNvbHVtbiwgY29kZVZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5sb2FkQ29kZXMoa2V5LCBjb2x1bW4sIGNvZGVWYWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubG9hZENvZGVzKGtleSwgY29sdW1uLCBjb2RlVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmNvZGVDYWNoZS5nZXQoa2V5KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZENvZGVzKGtleTogc3RyaW5nLCBjb2x1bW46IHN0cmluZywgY29kZVZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuY29kZUNhY2hlLnNldChrZXksIG5ldyBCZWhhdmlvclN1YmplY3Q8RG90Q29kZT4obnVsbCkpO1xyXG5cclxuICAgIGNvbnN0IHVyaSA9IGAvR2V0Q29kZWA7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcclxuXHJcbiAgICBpZiAoY29sdW1uICE9PSB1bmRlZmluZWQgJiYgY29sdW1uICE9PSBudWxsKSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2NvbHVtbicsIGNvbHVtbiArICcnKTtcclxuICAgIH1cclxuICAgIGlmIChjb2RlVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBjb2RlVmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnY29kZVZhbHVlJywgY29kZVZhbHVlICsgJycpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VuZFJlcXVlc3Q8RG90Q29kZT4oJ2dldCcsIHVyaSwgaGVhZGVycywgcGFyYW1zLCBudWxsKS50b1Byb21pc2UoKS50aGVuKGIgPT4ge1xyXG4gICAgICBpZiAoYiAmJiBiLmJvZHkpIHtcclxuICAgICAgICB0aGlzLmNvZGVDYWNoZS5nZXQoa2V5KS5uZXh0KGIuYm9keSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAqIE1ldGhvZCBHZXRDb2Rlc1xyXG4gICogQHBhcmFtIGNvbHVtbiBDb2x1bW4gbmFtZSB0byBnZXQgRG90Y29kZSBmcm9tXHJcbiAgKiBAcmV0dXJuIEZ1bGwgSFRUUCByZXNwb25zZSBhcyBPYnNlcnZhYmxlXHJcbiAgKi9cclxuICBwdWJsaWMgR2V0Q29kZXMoY29sdW1uOiBzdHJpbmcpOiBPYnNlcnZhYmxlPERvdENvZGVbXT4ge1xyXG4gICAgaWYgKHRoaXMuY29kZXNDYWNoZS5nZXQoY29sdW1uKSkge1xyXG4gICAgICB0aGlzLmNvZGVzQ2FjaGUuZ2V0KGNvbHVtbik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNvZGVzQ2FjaGUuc2V0KGNvbHVtbiwgbmV3IEJlaGF2aW9yU3ViamVjdDxEb3RDb2RlW10+KG51bGwpKTtcclxuXHJcbiAgICAgIGNvbnN0IHVyaSA9IGAvR2V0Q29kZXNgO1xyXG4gICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG4gICAgICBpZiAoY29sdW1uICE9PSB1bmRlZmluZWQgJiYgY29sdW1uICE9PSBudWxsKSB7XHJcbiAgICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnY29sdW1uJywgY29sdW1uICsgJycpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2VuZFJlcXVlc3Q8RG90Q29kZVtdPignZ2V0JywgdXJpLCBoZWFkZXJzLCBwYXJhbXMsIG51bGwpLnRvUHJvbWlzZSgpLnRoZW4oYiA9PiB7XHJcbiAgICAgICAgaWYgKGIgJiYgYi5ib2R5KSB7XHJcbiAgICAgICAgICB0aGlzLmNvZGVzQ2FjaGUuZ2V0KGNvbHVtbikubmV4dChiLmJvZHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuY29kZXNDYWNoZS5nZXQoY29sdW1uKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogTWV0aG9kIEdldFJlbGF0ZWRDb2Rlc1xyXG4gICogQHBhcmFtIGNvbHVtbiBDb2x1bW4gbmFtZSBmb3IgZG90Y29kZVxyXG4gICogQHBhcmFtIGNvZGVWYWx1ZSBEb3RDb2RlIHZhbHVlIHRvIGdldCByZWxhdGVkIGNvZGVzIGZvclxyXG4gICogQHBhcmFtIHJlbGF0ZWRDb2RlIFJlbGF0ZWQgQ29sdW1uIG5hbWUgdG8gZ2V0IFJlbGF0ZWQgQ29kZXMgZnJvbVxyXG4gICogQHJldHVybiBGdWxsIEhUVFAgcmVzcG9uc2UgYXMgT2JzZXJ2YWJsZVxyXG4gICovXHJcbiAgcHVibGljIEdldFJlbGF0ZWRDb2Rlcyhjb2x1bW46IHN0cmluZywgY29kZVZhbHVlOiBzdHJpbmcsIHJlbGF0ZWRDb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFJlbGF0ZWRDb2RlW10+IHtcclxuICAgIGNvbnN0IHVyaSA9IGAvR2V0UmVsYXRlZENvZGVzYDtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcclxuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG4gICAgaWYgKGNvbHVtbiAhPT0gdW5kZWZpbmVkICYmIGNvbHVtbiAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdjb2x1bW4nLCBjb2x1bW4gKyAnJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoY29kZVZhbHVlICE9PSB1bmRlZmluZWQgJiYgY29kZVZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2NvZGVWYWx1ZScsIGNvZGVWYWx1ZSArICcnKTtcclxuICAgIH1cclxuICAgIGlmIChyZWxhdGVkQ29kZSAhPT0gdW5kZWZpbmVkICYmIHJlbGF0ZWRDb2RlICE9PSBudWxsKSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3JlbGF0ZWRDb2RlJywgcmVsYXRlZENvZGUgKyAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuc2VuZFJlcXVlc3Q8UmVsYXRlZENvZGVbXT4oJ2dldCcsIHVyaSwgaGVhZGVycywgcGFyYW1zLCBudWxsKS5waXBlKFxyXG4gICAgICBtYXAoYiA9PiB7XHJcbiAgICAgICAgaWYgKGIgJiYgYi5ib2R5KSB7XHJcbiAgICAgICAgICByZXR1cm4gYi5ib2R5O1xyXG4gICAgICAgIH1cclxuICAgICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZW5kUmVxdWVzdDxUPihtZXRob2Q6IHN0cmluZywgdXJpOiBzdHJpbmcsIGhlYWRlcnM6IEh0dHBIZWFkZXJzLCBwYXJhbXM6IEh0dHBQYXJhbXMsIGJvZHk6IGFueSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFQ+PiB7XHJcbiAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ09jcC1BcGltLVN1YnNjcmlwdGlvbi1LZXknLCB0aGlzLmNvbmZpZy5hcGlLZXkpO1xyXG4gICAgaWYgKG1ldGhvZCA9PT0gJ2dldCcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VD4odGhpcy5jb25maWcuaG9zdCArIHVyaSxcclxuICAgICAgICB7IGhlYWRlcnM6IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpLCBwYXJhbXM6IHBhcmFtcywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KTtcclxuICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAncHV0Jykge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxUPih0aGlzLmNvbmZpZy5ob3N0ICsgdXJpLCBib2R5LFxyXG4gICAgICAgIHsgaGVhZGVyczogaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyksIHBhcmFtczogcGFyYW1zLCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pO1xyXG4gICAgfSBlbHNlIGlmIChtZXRob2QgPT09ICdwb3N0Jykge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8VD4odGhpcy5jb25maWcuaG9zdCArIHVyaSwgYm9keSxcclxuICAgICAgICB7IGhlYWRlcnM6IGhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpLCBwYXJhbXM6IHBhcmFtcywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KTtcclxuICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAnZGVsZXRlJykge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZTxUPih0aGlzLmNvbmZpZy5ob3N0ICsgdXJpLCB7IGhlYWRlcnM6IGhlYWRlcnMsIHBhcmFtczogcGFyYW1zLCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5lcnJvcignVW5zdXBwb3J0ZWQgcmVxdWVzdDogJyArIG1ldGhvZCk7XHJcbiAgICAgIHJldHVybiBPYnNlcnZhYmxlLnRocm93KCdVbnN1cHBvcnRlZCByZXF1ZXN0OiAnICsgbWV0aG9kKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRG90Q29kZSB9IGZyb20gJy4vbW9kZWxzL2RvdGNvZGUubW9kZWwnO1xyXG5pbXBvcnQgeyBBbmd1bGFyRG90Y29kZXNTZXJ2aWNlIH0gZnJvbSAnLi9hbmd1bGFyLWRvdGNvZGVzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZmRvdC1hbmd1bGFyLWRvdGNvZGVzJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPHNwYW4gKm5nSWY9XCJjb2RlXCI+XHJcbiAgICB7e2NvZGUuZGVzY3JpcHRpb259fVxyXG4gICAgPC9zcGFuPlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5ndWxhckRvdGNvZGVzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgY29kZTogRG90Q29kZTtcclxuXHJcbiAgQElucHV0KClcclxuICBjb2x1bW46IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIHZhbHVlOiBzdHJpbmc7XHJcblxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRvdGNvZGVTZXJ2aWNlOiBBbmd1bGFyRG90Y29kZXNTZXJ2aWNlKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBjb25zb2xlLmxvZygnaW5pdCcpO1xyXG4gICAgdGhpcy5kb3Rjb2RlU2VydmljZS5HZXRDb2RlKHRoaXMuY29sdW1uLCB0aGlzLnZhbHVlKS5zdWJzY3JpYmUoY29kZSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGNvZGUpO1xyXG4gICAgICB0aGlzLmNvZGUgPSBjb2RlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBDb25maWcgfSBmcm9tICcuLy4uL21vZGVscy9jb25maWcnO1xyXG5pbXBvcnQgeyBBbmd1bGFyRG90Y29kZXNTZXJ2aWNlIH0gZnJvbSAnLi8uLi9hbmd1bGFyLWRvdGNvZGVzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEb3RDb2RlIH0gZnJvbSAnLi8uLi9tb2RlbHMvZG90Y29kZS5tb2RlbCc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIE9wdGlvbmFsLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZmRvdC1kb3Rjb2Rlcy1zZWxlY3QnLFxyXG4gIHRlbXBsYXRlOiBgPHNlbGVjdCBbKG5nTW9kZWwpXT1cInNlbGVjdGVkQ29kZVwiIChjaGFuZ2UpPVwiY29kZUNoYW5nZWQoKVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XHJcbiAgPG9wdGlvbiAqbmdJZj1cInVzZURlZmF1bHRTZWxlY3RcIiB2YWx1ZT1cIlwiPlxyXG4gICAge3tkZWZhdWx0U2VsZWN0VGV4dH19XHJcbiAgPC9vcHRpb24+XHJcbiAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgY29kZSBvZiBjb2Rlc1wiIFtuZ1ZhbHVlXT1cImNvZGVcIj5cclxuICAgIHt7Y29kZS5kZXNjcmlwdGlvbn19XHJcbiAgPC9vcHRpb24+XHJcbjwvc2VsZWN0PlxyXG5gLFxyXG4gIHN0eWxlczogW2BgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRG90Y29kZXNTZWxlY3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBwcml2YXRlIF92YWx1ZTogc3RyaW5nO1xyXG4gIGNvZGVzOiBEb3RDb2RlW107XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgY29sdW1uOiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHZhbHVlKHZhbHVlKSB7XHJcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5zZXRTZWxlY3RlZENvZGUoKTtcclxuICB9XHJcblxyXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBkaXNhYmxlZD86IGJvb2xlYW47XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHNlbGVjdGVkRG90Y29kZSA9IG5ldyBFdmVudEVtaXR0ZXI8RG90Q29kZT4oKTtcclxuICBzZWxlY3RlZENvZGU6IERvdENvZGU7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgdXNlRGVmYXVsdFNlbGVjdD86IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBkZWZhdWx0U2VsZWN0VGV4dD86IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkb3RDb2RlU2VydmljZTogQW5ndWxhckRvdGNvZGVzU2VydmljZSwgQEluamVjdCgnY29uZmlnJykgcHJpdmF0ZSBjb25maWc6IENvbmZpZykge1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcblxyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnRyaXBsZS1lcXVhbHNcclxuICAgIGlmICghKHRoaXMudXNlRGVmYXVsdFNlbGVjdCA9PT0gZmFsc2UgfHwgPGFueT50aGlzLnVzZURlZmF1bHRTZWxlY3QgPT09ICdmYWxzZScpXHJcbiAgICAgICYmIHRoaXMuY29uZmlnICE9IG51bGwgJiYgdGhpcy5jb25maWcudXNlRGVmYXVsdFNlbGVjdCkge1xyXG4gICAgICB0aGlzLnVzZURlZmF1bHRTZWxlY3QgPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51c2VEZWZhdWx0U2VsZWN0ID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZGVmYXVsdFNlbGVjdFRleHQgJiYgdGhpcy5jb25maWcgIT0gbnVsbCAmJiB0aGlzLmNvbmZpZy5kZWZhdWx0U2VsZWN0VGV4dCkge1xyXG4gICAgICB0aGlzLmRlZmF1bHRTZWxlY3RUZXh0ID0gdGhpcy5jb25maWcuZGVmYXVsdFNlbGVjdFRleHQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLmRvdENvZGVTZXJ2aWNlLkdldENvZGVzKHRoaXMuY29sdW1uKS5zdWJzY3JpYmUoY29kZXMgPT4ge1xyXG4gICAgICB0aGlzLmNvZGVzID0gY29kZXM7XHJcblxyXG4gICAgICB0aGlzLnNldFNlbGVjdGVkQ29kZSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFNlbGVjdGVkQ29kZSgpIHtcclxuICAgIGlmICghdGhpcy5jb2Rlcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy52YWx1ZSkge1xyXG4gICAgICBjb25zdCBjb2RlID0gdGhpcy5jb2Rlcy5maW5kKGMgPT4gYy52YWx1ZSA9PT0gdGhpcy52YWx1ZSk7XHJcblxyXG4gICAgICBpZiAoY29kZSkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2RlID0gY29kZTtcclxuICAgICAgICB0aGlzLmNvZGVDaGFuZ2VkKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb2RlQ2hhbmdlZCgpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWREb3Rjb2RlLmVtaXQodGhpcy5zZWxlY3RlZENvZGUpO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBbmd1bGFyRG90Y29kZXNTZXJ2aWNlIH0gZnJvbSAnLi9hbmd1bGFyLWRvdGNvZGVzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5AUGlwZSh7XHJcbiAgbmFtZTogJ2RvdGNvZGUnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRG90Y29kZVBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRvdGNvZGVTZXJ2aWNlOiBBbmd1bGFyRG90Y29kZXNTZXJ2aWNlKSB7IH1cclxuXHJcbiAgdHJhbnNmb3JtKHZhbHVlOiBzdHJpbmcsIGNvbHVtbjogc3RyaW5nKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLmRvdGNvZGVTZXJ2aWNlLkdldENvZGUoY29sdW1uLCB2YWx1ZSkucGlwZShtYXAoYyA9PiB7XHJcbiAgICAgIGlmIChjKSB7XHJcbiAgICAgICAgcmV0dXJuIGMuZGVzY3JpcHRpb247XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IEFuZ3VsYXJEb3Rjb2Rlc1NlcnZpY2UgfSBmcm9tICcuL2FuZ3VsYXItZG90Y29kZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IE5nTW9kdWxlLCBNb2R1bGVXaXRoUHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFuZ3VsYXJEb3Rjb2Rlc0NvbXBvbmVudCB9IGZyb20gJy4vYW5ndWxhci1kb3Rjb2Rlcy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50TW9kdWxlLCBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBEb3Rjb2Rlc1NlbGVjdENvbXBvbmVudCB9IGZyb20gJy4vZG90Y29kZXMtc2VsZWN0L2RvdGNvZGVzLXNlbGVjdC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgRG90Y29kZVBpcGUgfSBmcm9tICcuL2RvdGNvZGUucGlwZSc7XHJcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4vbW9kZWxzL2NvbmZpZyc7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gIGltcG9ydHM6IFtIdHRwQ2xpZW50TW9kdWxlLCBDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlXHJcbiAgXSxcclxuICBkZWNsYXJhdGlvbnM6IFtBbmd1bGFyRG90Y29kZXNDb21wb25lbnQsIERvdGNvZGVzU2VsZWN0Q29tcG9uZW50LCBEb3Rjb2RlUGlwZV0sXHJcbiAgZXhwb3J0czogW0FuZ3VsYXJEb3Rjb2Rlc0NvbXBvbmVudCwgRG90Y29kZXNTZWxlY3RDb21wb25lbnQsIERvdGNvZGVQaXBlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5ndWxhckRvdGNvZGVzTW9kdWxlIHtcclxuICBzdGF0aWMgZm9yUm9vdChjb25maWc6IENvbmZpZyk6IE1vZHVsZVdpdGhQcm92aWRlcnMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbmdNb2R1bGU6IEFuZ3VsYXJEb3Rjb2Rlc01vZHVsZSxcclxuICAgICAgcHJvdmlkZXJzOiBbQW5ndWxhckRvdGNvZGVzU2VydmljZSxcclxuICAgICAgICB7IHByb3ZpZGU6ICdjb25maWcnLCB1c2VWYWx1ZTogY29uZmlnIH1cclxuICAgICAgXVxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbIkJlaGF2aW9yU3ViamVjdCIsIkh0dHBIZWFkZXJzIiwiSHR0cFBhcmFtcyIsIm1hcCIsIk9ic2VydmFibGUiLCJJbmplY3RhYmxlIiwiSHR0cENsaWVudCIsIkluamVjdCIsIkNvbXBvbmVudCIsIklucHV0IiwiRXZlbnRFbWl0dGVyIiwiT3V0cHV0IiwiUGlwZSIsIk5nTW9kdWxlIiwiSHR0cENsaWVudE1vZHVsZSIsIkNvbW1vbk1vZHVsZSIsIkZvcm1zTW9kdWxlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUEsUUFBQTtRQUNJLGdCQUFtQixJQUFZLEVBQVMsTUFB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