@noaestudio/forms
Version:
Dynamic forms extension for Covalent
403 lines (399 loc) • 37 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, forwardRef, ViewChild, ChangeDetectorRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { AbstractControlValueAccessor } from '../abstract-control-value-accesor';
import { TranslateDialogComponent } from '../../dialogs/translate-dialog/translate-dialog.component';
import { MatDialog, MatTabGroup } from '@angular/material';
export const /** @type {?} */ INPUT_INPUT_CONTROL_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => TranslateComponent),
multi: true,
};
export class TranslateComponent extends AbstractControlValueAccessor {
/**
* @param {?} dialog
* @param {?} changeDetector
*/
constructor(dialog, changeDetector) {
super();
this.dialog = dialog;
this.changeDetector = changeDetector;
this.height = "150px";
this.toolbarConfig = [
['bold', 'italic', 'underline'],
['fontName', 'fontSize', 'color'],
['justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull', 'indent', 'outdent'],
['cut', 'copy', 'delete', 'removeFormat', 'undo', 'redo'],
['horizontalLine', 'orderedList', 'unorderedList'],
['link', 'unlink']
];
this.label = '';
this.type = undefined;
this.required = undefined;
this.min = undefined;
this.max = undefined;
this.minLength = undefined;
this.maxLength = undefined;
this.langs = ['es'];
//TODO: Guachau...
this.allLangs = ['es', 'en', 'fr', 'de'];
this.selectedIndex = 0;
this.selectedLang = '';
this.templateType = '';
}
/**
* @return {?}
*/
ngOnInit() {
this.selectedLang = this.langs[0];
this.templateType = TranslateComponent.getTemplateType(this.type);
this.initValue(this.value);
}
/**
* @param {?} arr
* @param {?} value
* @return {?}
*/
inArray(arr, value) {
return arr.indexOf(value) > -1;
}
/**
* @param {?} value
* @return {?}
*/
initValue(value) {
this.valuesJSON = {};
if (value) {
if (typeof value === 'string') {
value = JSON.parse(value);
}
this.langs = [];
for (let /** @type {?} */ lang in value) {
if (this.inArray(this.allLangs, lang)) {
this.langs.push(lang);
}
}
}
for (let /** @type {?} */ lang of this.langs) {
if (value) {
this.valuesJSON[lang] = (value[lang] || '');
}
else {
this.valuesJSON[lang] = '';
}
}
this.values = this.parseInit(this.valuesJSON);
let /** @type {?} */ jsonValue = JSON.stringify(this.valuesJSON);
this.control.setValue(jsonValue);
}
/**
* @param {?} valuesJSON
* @return {?}
*/
parseInit(valuesJSON) {
let /** @type {?} */ values = {};
for (let /** @type {?} */ lang in valuesJSON) {
values[lang] = this.parseValue(valuesJSON[lang]);
}
return values;
}
/**
* @param {?} value
* @return {?}
*/
parseValue(value) {
if (this.templateType == 'file-input') {
return undefined;
}
else {
return value;
}
}
/**
* @param {?} type
* @return {?}
*/
static getTemplateType(type) {
switch (type) {
case 'text':
case 'input':
return 'input';
case 'textarea':
return 'area';
case 'text-editor':
return 'editor';
case 'file-input':
return 'file-input';
default:
return '';
}
}
/**
* @param {?} lang
* @return {?}
*/
selectLang(lang) {
let /** @type {?} */ index = this.langs.findIndex(row => {
return row == lang;
});
if (index != this.selectedIndex) {
this.selectedIndex = index;
}
}
/**
* @return {?}
*/
addLang() {
let /** @type {?} */ langs = this.langs;
let /** @type {?} */ remLangs = this.allLangs.filter(x => {
return !this.inArray(langs, x);
});
this.openDialog(remLangs);
}
/**
* @param {?} lang
* @return {?}
*/
removeLang(lang) {
if (this.langs.length <= 1) {
return;
}
let /** @type {?} */ index = this.langs.findIndex(row => {
return row == lang;
});
if (index !== -1) {
this.langs.splice(index, 1);
delete this.values[lang];
delete this.valuesJSON[lang];
if (index == this.selectedIndex) {
this.selectedIndex = 0;
this.selectedLang = this.langs[0];
}
else {
this.selectLang(this.selectedLang);
}
let /** @type {?} */ jsonValue = JSON.stringify(this.valuesJSON);
this.control.setValue(jsonValue);
}
}
/**
* @param {?} remLangs
* @return {?}
*/
openDialog(remLangs) {
let /** @type {?} */ data = {
langs: remLangs
};
let /** @type {?} */ dialogRef = this.dialog.open(TranslateDialogComponent, { data: data });
dialogRef.afterClosed().subscribe(lang => {
if (lang) {
this.valuesJSON[lang] = '';
this.values[lang] = this.parseValue(this.valuesJSON[lang]);
this.langs.push(lang);
this.changeDetector.detectChanges();
this.selectLang(lang);
}
});
}
/**
* @param {?} newValue
* @param {?} lang
* @return {?}
*/
changeValue(newValue, lang) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
if (newValue instanceof File) {
this.valuesJSON[lang] = yield TranslateComponent.toBase64(newValue);
}
else if (newValue == undefined) {
this.valuesJSON[lang] = '';
}
else {
this.valuesJSON[lang] = newValue;
}
let /** @type {?} */ jsonValue = JSON.stringify(this.valuesJSON);
this.control.setValue(jsonValue);
});
}
/**
* @param {?} value
* @return {?}
*/
static toBase64(value) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
let /** @type {?} */ myReader = new FileReader();
let /** @type {?} */ image = '';
let /** @type {?} */ promise = new Promise(resolve => {
myReader.onloadend = (e) => {
image = myReader.result;
resolve(image);
};
myReader.readAsDataURL(value);
});
return promise;
});
}
}
TranslateComponent.decorators = [
{ type: Component, args: [{
providers: [INPUT_INPUT_CONTROL_VALUE_ACCESSOR],
selector: 'translate',
styles: [`.td-dynamic-input-wrapper{-ms-flex-direction:row;flex-direction:row;display:-ms-flexbox;display:flex;box-sizing:border-box}.td-dynamic-input-wrapper .td-dynamic-input-field{-ms-flex:1;flex:1;box-sizing:border-box}`],
template: `<style>
.ngx-editor {
margin-top: 10px;
}
</style>
<div class="td-translatable">
<label>{{label}}</label>
<mat-tab-group #tabGroup class="tab-group" dynamicHeight [(selectedIndex)]="selectedIndex">
<mat-tab *ngFor="let lang of langs">
<ng-template matTabLabel>
<span (click)="selectLang(lang)">{{lang | translate}}</span>
<mat-icon (click)="removeLang(lang)" style="vertical-align: middle; margin-left: 10px;">close</mat-icon>
</ng-template>
<div style="width:100%;" [ngSwitch]="templateType">
<ng-template ngSwitchCase="input">
<div class="td-dynamic-input-wrapper">
<mat-form-field class="td-dynamic-input-field">
<input #elementInput
matInput
autocomplete="off"
[(ngModel)]="values[lang]"
(ngModelChange)="changeValue($event, lang)"
[type]="type"
[required]="required"
[attr.min]="min"
[attr.max]="max"
[attr.minLength]="minLength"
[attr.maxLength]="maxLength"/>
</mat-form-field>
</div>
</ng-template>
<ng-template ngSwitchCase="area">
<div class="td-dynamic-textarea-wrapper">
<mat-form-field class="td-dynamic-textarea-field" style="width:100%;">
<textarea #elementInput
matInput
[(ngModel)]="values[lang]"
(ngModelChange)="changeValue($event, lang)"
[required]="required"
rows="4">
</textarea>
</mat-form-field>
</div>
</ng-template>
<ng-template ngSwitchCase="editor">
<div class="td-dynamic-input-wrapper" style="display: block;">
<app-ngx-editor [(ngModel)]="values[lang]" (ngModelChange)="changeValue($event, lang)"
[height]="height" [minHeight]="height" [toolbar]="toolbarConfig" style="width:100%;">
</app-ngx-editor>
</div>
</ng-template>
<ng-template ngSwitchCase="file-input">
<div class="td-dynamic-file-input-wrapper" style="display: flex;">
<mat-form-field tdFileDrop class="td-dynamic-file-input-field" floatLabel="never" (fileDrop)="values[lang] = $event"
(click)="fileInput.inputElement.click()" (keyup.enter)="fileInput.inputElement.click()"
(keyup.delete)="fileInput.clear()" (keyup.backspace)="fileInput.clear()">
<input matInput autocomplete="off" [value]="values[lang]?.name" [placeholder]="label" readonly />
</mat-form-field>
<button style="align-self: center;" mat-icon-button *ngIf="values[lang]" (click)="fileInput.clear(); changeValue(undefined,lang);" (keyup.enter)="fileInput.clear()">
<mat-icon>cancel</mat-icon>
</button>
<td-file-input style="align-self:center; margin-left:10px;" class="td-file-input" #fileInput [(ngModel)]="values[lang]" (ngModelChange)="changeValue($event, lang)">
<mat-icon>folder</mat-icon>
<span>{{ label }}</span>
</td-file-input>
</div>
</ng-template>
<ng-template ngSwitchDefault>
<div class="td-dynamic-input-wrapper">
<mat-form-field class="td-dynamic-input-field">
<input #elementInput
autocomplete="off"
matInput
[(ngModel)]="values[lang]"
(ngModelChange)="changeValue($event, lang)"
[type]="type"
[required]="required"
[attr.min]="min"
[attr.max]="max"
[attr.minLength]="minLength"
[attr.maxLength]="maxLength"/>
</mat-form-field>
</div>
</ng-template>
</div>
</mat-tab>
<mat-tab [disabled]=true>
<ng-template matTabLabel><mat-icon (click)="addLang()" style="color: #000000;">add</mat-icon></ng-template>
</mat-tab>
</mat-tab-group>
</div>
`,
},] },
];
/** @nocollapse */
TranslateComponent.ctorParameters = () => [
{ type: MatDialog, },
{ type: ChangeDetectorRef, },
];
TranslateComponent.propDecorators = {
"tabGroup": [{ type: ViewChild, args: ['tabGroup',] },],
};
function TranslateComponent_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
TranslateComponent.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
TranslateComponent.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
TranslateComponent.propDecorators;
/** @type {?} */
TranslateComponent.prototype.control;
/** @type {?} */
TranslateComponent.prototype.height;
/** @type {?} */
TranslateComponent.prototype.toolbarConfig;
/** @type {?} */
TranslateComponent.prototype.label;
/** @type {?} */
TranslateComponent.prototype.type;
/** @type {?} */
TranslateComponent.prototype.required;
/** @type {?} */
TranslateComponent.prototype.min;
/** @type {?} */
TranslateComponent.prototype.max;
/** @type {?} */
TranslateComponent.prototype.minLength;
/** @type {?} */
TranslateComponent.prototype.maxLength;
/** @type {?} */
TranslateComponent.prototype.langs;
/** @type {?} */
TranslateComponent.prototype.allLangs;
/** @type {?} */
TranslateComponent.prototype.selectedIndex;
/** @type {?} */
TranslateComponent.prototype.selectedLang;
/** @type {?} */
TranslateComponent.prototype.templateType;
/** @type {?} */
TranslateComponent.prototype.values;
/** @type {?} */
TranslateComponent.prototype.valuesJSON;
/** @type {?} */
TranslateComponent.prototype.tabGroup;
/** @type {?} */
TranslateComponent.prototype.dialog;
/** @type {?} */
TranslateComponent.prototype.changeDetector;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb3ZhbGVudC9keW5hbWljLWZvcm1zLyIsInNvdXJjZXMiOlsiZHluYW1pYy1lbGVtZW50cy90cmFuc2xhdGFibGUvdHJhbnNsYXRlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRixPQUFPLEVBQUUsaUJBQWlCLEVBQXFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFakYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMkRBQTJELENBQUM7QUFDckcsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUzRCxNQUFNLENBQUMsdUJBQU0sa0NBQWtDLEdBQVE7SUFDdEQsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixDQUFDO0lBQ2pELEtBQUssRUFBRSxJQUFJO0NBQ1gsQ0FBQztBQXNHRixNQUFNLHlCQUEwQixTQUFRLDRCQUE0Qjs7Ozs7SUE4Q25FLFlBQW9CLE1BQWlCLEVBQVUsY0FBa0M7UUFDaEYsS0FBSyxFQUFFLENBQUM7UUFEVyxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQVUsbUJBQWMsR0FBZCxjQUFjLENBQW9CO3NCQTFDaEUsT0FBTzs2QkFFRjtZQUNmLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUM7WUFDL0IsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQztZQUNqQyxDQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDO1lBQ3BG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QUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQzthQUNqQztZQUVELHFCQUFJLFNBQVMsR0FBWSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUV6RCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQzs7S0FDakM7Ozs7O0lBRUQsTUFBTSxDQUFPLFFBQVEsQ0FBQyxLQUFXOztZQUNoQyxxQkFBSSxRQUFRLEdBQWdCLElBQUksVUFBVSxFQUFFLENBQUM7WUFFN0MscUJBQUksS0FBSyxHQUFZLEVBQUUsQ0FBQztZQUV4QixxQkFBSSxPQUFPLEdBQXFCLElBQUksT0FBTyxDQUFVLE9BQU8sQ0FBQyxFQUFFO2dCQUM5RCxRQUFRLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQzFCLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO29CQUN4QixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ2YsQ0FBQTtnQkFDRCxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzlCLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxPQUFPLENBQUM7O0tBRWY7OztZQW5VRCxTQUFTLFNBQUM7Z0JBQ1YsU0FBUyxFQUFFLENBQUUsa0NBQWtDLENBQUU7Z0JBQ2pELFFBQVEsRUFBRSxXQUFXO2dCQUNyQixNQUFNLEVBQUUsQ0FBQyx1TkFBdU4sQ0FBQztnQkFDak8sUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBOEZWO2FBQ0E7Ozs7WUEzR1EsU0FBUztZQU55QixpQkFBaUI7Ozt5QkE2SjFELFNBQVMsU0FBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBmb3J3YXJkUmVmLCBWaWV3Q2hpbGQsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnLi4vYWJzdHJhY3QtY29udHJvbC12YWx1ZS1hY2Nlc29yJztcclxuXHJcbmltcG9ydCB7IFRyYW5zbGF0ZURpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2RpYWxvZ3MvdHJhbnNsYXRlLWRpYWxvZy90cmFuc2xhdGUtZGlhbG9nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0VGFiR3JvdXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XHJcblxyXG5leHBvcnQgY29uc3QgSU5QVVRfSU5QVVRfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xyXG5cdHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG5cdHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFRyYW5zbGF0ZUNvbXBvbmVudCksXHJcblx0bXVsdGk6IHRydWUsXHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHRwcm92aWRlcnM6IFsgSU5QVVRfSU5QVVRfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUiBdLFxyXG5cdHNlbGVjdG9yOiAndHJhbnNsYXRlJyxcclxuXHRzdHlsZXM6IFtgLnRkLWR5bmFtaWMtaW5wdXQtd3JhcHBlcnstbXMtZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtZGlyZWN0aW9uOnJvdztkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDtib3gtc2l6aW5nOmJvcmRlci1ib3h9LnRkLWR5bmFtaWMtaW5wdXQtd3JhcHBlciAudGQtZHluYW1pYy1pbnB1dC1maWVsZHstbXMtZmxleDoxO2ZsZXg6MTtib3gtc2l6aW5nOmJvcmRlci1ib3h9YF0sXHJcblx0dGVtcGxhdGU6IGA8c3R5bGU+XHJcblxyXG4ubmd4LWVkaXRvciB7XHJcblx0bWFyZ2luLXRvcDogMTBweDtcclxufVxyXG5cclxuPC9zdHlsZT5cclxuXHJcbjxkaXYgY2xhc3M9XCJ0ZC10cmFuc2xhdGFibGVcIj5cclxuXHQ8bGFiZWw+e3tsYWJlbH19PC9sYWJlbD5cclxuXHQ8bWF0LXRhYi1ncm91cCAjdGFiR3JvdXAgY2xhc3M9XCJ0YWItZ3JvdXBcIiBkeW5hbWljSGVpZ2h0IFsoc2VsZWN0ZWRJbmRleCldPVwic2VsZWN0ZWRJbmRleFwiPlxyXG5cdFx0PG1hdC10YWIgKm5nRm9yPVwibGV0IGxhbmcgb2YgbGFuZ3NcIj5cclxuXHRcdFx0PG5nLXRlbXBsYXRlIG1hdFRhYkxhYmVsPlxyXG5cdFx0XHRcdDxzcGFuIChjbGljayk9XCJzZWxlY3RMYW5nKGxhbmcpXCI+e3tsYW5nIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcblx0XHRcdFx0PG1hdC1pY29uIChjbGljayk9XCJyZW1vdmVMYW5nKGxhbmcpXCIgc3R5bGU9XCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyBtYXJnaW4tbGVmdDogMTBweDtcIj5jbG9zZTwvbWF0LWljb24+XHJcblx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdDxkaXYgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIFtuZ1N3aXRjaF09XCJ0ZW1wbGF0ZVR5cGVcIj5cclxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwiaW5wdXRcIj5cclxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZC1keW5hbWljLWlucHV0LXdyYXBwZXJcIj5cclxuXHRcdFx0XHRcdCAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidGQtZHluYW1pYy1pbnB1dC1maWVsZFwiPlxyXG5cdFx0XHRcdFx0ICAgIDxpbnB1dCAjZWxlbWVudElucHV0XHJcblx0XHRcdFx0XHQgICAgICAgICAgICBtYXRJbnB1dFxyXG5cdFx0XHRcdFx0XHRcdFx0YXV0b2NvbXBsZXRlPVwib2ZmXCJcclxuXHRcdFx0XHRcdCAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVzW2xhbmddXCJcclxuXHRcdFx0XHRcdFx0XHRcdChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZVZhbHVlKCRldmVudCwgbGFuZylcIlxyXG5cdFx0XHRcdFx0ICAgICAgICAgICAgW3R5cGVdPVwidHlwZVwiXHJcblx0XHRcdFx0XHQgICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxyXG5cdFx0XHRcdFx0ICAgICAgICAgICAgW2F0dHIubWluXT1cIm1pblwiXHJcblx0XHRcdFx0XHQgICAgICAgICAgICBbYXR0ci5tYXhdPVwibWF4XCJcclxuXHRcdFx0XHRcdCAgICAgICAgICAgIFthdHRyLm1pbkxlbmd0aF09XCJtaW5MZW5ndGhcIlxyXG5cdFx0XHRcdFx0ICAgICAgICAgICAgW2F0dHIubWF4TGVuZ3RoXT1cIm1heExlbmd0aFwiLz5cclxuXHRcdFx0XHRcdCAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0PG5nLXRlbXBsYXRlIG5nU3dpdGNoQ2FzZT1cImFyZWFcIj5cclxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZC1keW5hbWljLXRleHRhcmVhLXdyYXBwZXJcIj5cclxuXHRcdFx0XHRcdCAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidGQtZHluYW1pYy10ZXh0YXJlYS1maWVsZFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIj5cclxuXHRcdFx0XHRcdCAgICA8dGV4dGFyZWEgI2VsZW1lbnRJbnB1dFxyXG5cdFx0XHRcdFx0ICAgICAgICAgICAgbWF0SW5wdXRcclxuXHRcdFx0XHRcdCAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVzW2xhbmddXCJcclxuXHRcdFx0XHRcdFx0XHRcdChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZVZhbHVlKCRldmVudCwgbGFuZylcIlxyXG5cdFx0XHRcdFx0ICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcclxuXHRcdFx0XHRcdCAgICAgICAgICAgIHJvd3M9XCI0XCI+XHJcblx0XHRcdFx0XHQgICAgPC90ZXh0YXJlYT5cclxuXHRcdFx0XHRcdCAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0PG5nLXRlbXBsYXRlIG5nU3dpdGNoQ2FzZT1cImVkaXRvclwiPlxyXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRkLWR5bmFtaWMtaW5wdXQtd3JhcHBlclwiIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7XCI+XHJcblx0XHRcdFx0XHRcdDxhcHAtbmd4LWVkaXRvciBbKG5nTW9kZWwpXT1cInZhbHVlc1tsYW5nXVwiIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZVZhbHVlKCRldmVudCwgbGFuZylcIlxyXG5cdFx0XHRcdFx0XHRcdFtoZWlnaHRdPVwiaGVpZ2h0XCIgW21pbkhlaWdodF09XCJoZWlnaHRcIiBbdG9vbGJhcl09XCJ0b29sYmFyQ29uZmlnXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxyXG5cdFx0XHRcdFx0XHQ8L2FwcC1uZ3gtZWRpdG9yPlxyXG5cdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwiZmlsZS1pbnB1dFwiPlxyXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRkLWR5bmFtaWMtZmlsZS1pbnB1dC13cmFwcGVyXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxyXG5cdFx0XHRcdFx0XHQ8bWF0LWZvcm0tZmllbGQgdGRGaWxlRHJvcCBjbGFzcz1cInRkLWR5bmFtaWMtZmlsZS1pbnB1dC1maWVsZFwiIGZsb2F0TGFiZWw9XCJuZXZlclwiIChmaWxlRHJvcCk9XCJ2YWx1ZXNbbGFuZ10gPSAkZXZlbnRcIlxyXG5cdFx0XHRcdFx0XHRcdChjbGljayk9XCJmaWxlSW5wdXQuaW5wdXRFbGVtZW50LmNsaWNrKClcIiAoa2V5dXAuZW50ZXIpPVwiZmlsZUlucHV0LmlucHV0RWxlbWVudC5jbGljaygpXCJcclxuXHRcdFx0XHRcdFx0XHQoa2V5dXAuZGVsZXRlKT1cImZpbGVJbnB1dC5jbGVhcigpXCIgKGtleXVwLmJhY2tzcGFjZSk9XCJmaWxlSW5wdXQuY2xlYXIoKVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGlucHV0IG1hdElucHV0IGF1dG9jb21wbGV0ZT1cIm9mZlwiIFt2YWx1ZV09XCJ2YWx1ZXNbbGFuZ10/Lm5hbWVcIiBbcGxhY2Vob2xkZXJdPVwibGFiZWxcIiByZWFkb25seSAvPlxyXG5cdFx0XHRcdFx0XHQ8L21hdC1mb3JtLWZpZWxkPlxyXG5cdFx0XHRcdFx0XHQ8YnV0dG9uIHN0eWxlPVwiYWxpZ24tc2VsZjogY2VudGVyO1wiIG1hdC1pY29uLWJ1dHRvbiAqbmdJZj1cInZhbHVlc1tsYW5nXVwiIChjbGljayk9XCJmaWxlSW5wdXQuY2xlYXIoKTsgY2hhbmdlVmFsdWUodW5kZWZpbmVkLGxhbmcpO1wiIChrZXl1cC5lbnRlcik9XCJmaWxlSW5wdXQuY2xlYXIoKVwiPlxyXG5cdFx0XHRcdFx0XHRcdDxtYXQtaWNvbj5jYW5jZWw8L21hdC1pY29uPlxyXG5cdFx0XHRcdFx0XHQ8L2J1dHRvbj5cclxuXHRcdFx0XHRcdFx0PHRkLWZpbGUtaW5wdXQgc3R5bGU9XCJhbGlnbi1zZWxmOmNlbnRlcjsgbWFyZ2luLWxlZnQ6MTBweDtcIiBjbGFzcz1cInRkLWZpbGUtaW5wdXRcIiAjZmlsZUlucHV0IFsobmdNb2RlbCldPVwidmFsdWVzW2xhbmddXCIgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlVmFsdWUoJGV2ZW50LCBsYW5nKVwiPlxyXG5cdFx0XHRcdFx0XHRcdDxtYXQtaWNvbj5mb2xkZXI8L21hdC1pY29uPlxyXG5cdFx0XHRcdFx0XHRcdDxzcGFuPnt7IGxhYmVsIH19PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHQ8L3RkLWZpbGUtaW5wdXQ+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdDxuZy10ZW1wbGF0ZSBuZ1N3aXRjaERlZmF1bHQ+XHJcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGQtZHluYW1pYy1pbnB1dC13cmFwcGVyXCI+XHJcblx0XHRcdFx0XHQgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInRkLWR5bmFtaWMtaW5wdXQtZmllbGRcIj5cclxuXHRcdFx0XHRcdCAgICA8aW5wdXQgI2VsZW1lbnRJbnB1dFxyXG5cdFx0XHRcdFx0XHRcdFx0YXV0b2NvbXBsZXRlPVwib2ZmXCJcclxuXHRcdFx0XHRcdCAgICAgICAgICAgIG1hdElucHV0XHJcblx0XHRcdFx0XHQgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZhbHVlc1tsYW5nXVwiXHJcblx0XHRcdFx0XHRcdFx0XHQobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VWYWx1ZSgkZXZlbnQsIGxhbmcpXCJcclxuXHRcdFx0XHRcdCAgICAgICAgICAgIFt0eXBlXT1cInR5cGVcIlxyXG5cdFx0XHRcdFx0ICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcclxuXHRcdFx0XHRcdCAgICAgICAgICAgIFthdHRyLm1pbl09XCJtaW5cIlxyXG5cdFx0XHRcdFx0ICAgICAgICAgICAgW2F0dHIubWF4XT1cIm1heFwiXHJcblx0XHRcdFx0XHQgICAgICAgICAgICBbYXR0ci5taW5MZW5ndGhdPVwibWluTGVuZ3RoXCJcclxuXHRcdFx0XHRcdCAgICAgICAgICAgIFthdHRyLm1heExlbmd0aF09XCJtYXhMZW5ndGhcIi8+XHJcblx0XHRcdFx0XHQgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHQ8L2Rpdj5cclxuXHRcdDwvbWF0LXRhYj5cclxuXHRcdDxtYXQtdGFiIFtkaXNhYmxlZF09dHJ1ZT5cclxuXHRcdFx0PG5nLXRlbXBsYXRlIG1hdFRhYkxhYmVsPjxtYXQtaWNvbiAoY2xpY2spPVwiYWRkTGFuZygpXCIgc3R5bGU9XCJjb2xvcjogIzAwMDAwMDtcIj5hZGQ8L21hdC1pY29uPjwvbmctdGVtcGxhdGU+XHJcblx0XHQ8L21hdC10YWI+XHJcblx0PC9tYXQtdGFiLWdyb3VwPlxyXG48L2Rpdj5cclxuYCxcclxufSlcclxuZXhwb3J0IGNsYXNzIFRyYW5zbGF0ZUNvbXBvbmVudCBleHRlbmRzIEFic3RyYWN0Q29udHJvbFZhbHVlQWNjZXNzb3IgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcblxyXG5cdGNvbnRyb2w6IEZvcm1Db250cm9sO1xyXG5cclxuXHRoZWlnaHQ6IHN0cmluZyA9IFwiMTUwcHhcIjtcclxuXHJcblx0dG9vbGJhckNvbmZpZyA6IGFueSA9IFtcclxuICAgICAgICBbJ2JvbGQnLCAnaXRhbGljJywgJ3VuZGVybGluZSddLFxyXG4gICAgICAgIFsnZm9udE5hbWUnLCAnZm9udFNpemUnLCAnY29sb3InXSxcclxuICAgICAgICBbJ2p1c3RpZnlMZWZ0JywgJ2p1c3RpZnlDZW50ZXInLCAnanVzdGlmeVJpZ2h0JywgJ2p1c3RpZnlGdWxsJywgJ2luZGVudCcsICdvdXRkZW50J10sXHJcbiAgICAgICAgWydjdXQnLCAnY29weScsICdkZWxldGUnLCAncmVtb3ZlRm9ybWF0JywgJ3VuZG8nLCAncmVkbyddLFxyXG4gICAgICAgIFsnaG9yaXpvbnRhbExpbmUnLCAnb3JkZXJlZExpc3QnLCAndW5vcmRlcmVkTGlzdCddLFxyXG4gICAgICAgIFsnbGluaycsICd1bmxpbmsnXVxyXG4gICAgXTtcclxuXHJcblx0bGFiZWw6IHN0cmluZyA9ICcnO1xyXG5cclxuXHR0eXBlOiBzdHJpbmcgPSB1bmRlZmluZWQ7XHJcblxyXG5cdHJlcXVpcmVkOiBib29sZWFuID0gdW5kZWZpbmVkO1xyXG5cclxuXHRtaW46IG51bWJlciA9IHVuZGVmaW5lZDtcclxuXHJcblx0bWF4OiBudW1iZXIgPSB1bmRlZmluZWQ7XHJcblxyXG5cdG1pbkxlbmd0aDogbnVtYmVyID0gdW5kZWZpbmVkO1xyXG5cclxuXHRtYXhMZW5ndGg6IG51bWJlciA9IHVuZGVmaW5lZDtcclxuXHJcblx0bGFuZ3MgOiBzdHJpbmdbXSA9IFsnZXMnXTtcclxuXHJcblx0Ly9UT0RPOiBHdWFjaGF1Li4uXHJcblx0YWxsTGFuZ3MgOiBzdHJpbmdbXSA9IFsnZXMnICwgJ2VuJyAsICdmcicgLCAnZGUnXTtcclxuXHJcblx0c2VsZWN0ZWRJbmRleCA6IG51bWJlciA9IDA7XHJcblxyXG5cdHNlbGVjdGVkTGFuZyA6IHN0cmluZyA9ICcnO1xyXG5cclxuXHR0ZW1wbGF0ZVR5cGUgOiBzdHJpbmcgPSAnJztcclxuXHJcblx0dmFsdWVzOiBhbnk7XHJcblx0dmFsdWVzSlNPTjogYW55O1xyXG5cclxuXHRAVmlld0NoaWxkKCd0YWJHcm91cCcpXHJcblx0dGFiR3JvdXAgOiBNYXRUYWJHcm91cDtcclxuXHJcblx0Y29uc3RydWN0b3IocHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZywgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvciA6IENoYW5nZURldGVjdG9yUmVmKSB7XHJcblx0XHRzdXBlcigpO1xyXG5cdH1cclxuXHJcblx0bmdPbkluaXQoKSB7XHJcblx0XHR0aGlzLnNlbGVjdGVkTGFuZyA9IHRoaXMubGFuZ3NbMF07XHJcblxyXG5cdFx0dGhpcy50ZW1wbGF0ZVR5cGUgPSBUcmFuc2xhdGVDb21wb25lbnQuZ2V0VGVtcGxhdGVUeXBlKHRoaXMudHlwZSk7XHJcblxyXG5cdFx0dGhpcy5pbml0VmFsdWUodGhpcy52YWx1ZSk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGluQXJyYXkoYXJyOiBhbnlbXSAsIHZhbHVlOiBhbnkpIDogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gYXJyLmluZGV4T2YodmFsdWUpID4gLTE7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGluaXRWYWx1ZSh2YWx1ZTogYW55KSB7XHJcblx0XHR0aGlzLnZhbHVlc0pTT04gPSB7fTtcclxuXHRcdGlmICh2YWx1ZSkge1xyXG5cclxuXHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuXHRcdFx0XHR2YWx1ZSA9IEpTT04ucGFyc2UodmFsdWUpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLmxhbmdzID0gW107XHJcblx0XHRcdGZvciAobGV0IGxhbmcgaW4gdmFsdWUpIHtcclxuXHRcdFx0XHRpZiAodGhpcy5pbkFycmF5KHRoaXMuYWxsTGFuZ3MsbGFuZykpIHtcclxuXHRcdFx0XHRcdHRoaXMubGFuZ3MucHVzaChsYW5nKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRmb3IgKGxldCBsYW5nIG9mIHRoaXMubGFuZ3MpIHtcclxuXHRcdFx0aWYgKHZhbHVlKSB7XHJcblx0XHRcdFx0dGhpcy52YWx1ZXNKU09OW2xhbmddID0gKHZhbHVlW2xhbmddIHx8ICcnKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHR0aGlzLnZhbHVlc0pTT05bbGFuZ10gPSAnJztcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMudmFsdWVzID0gdGhpcy5wYXJzZUluaXQodGhpcy52YWx1ZXNKU09OKTtcclxuXHJcblx0XHRsZXQganNvblZhbHVlIDogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodGhpcy52YWx1ZXNKU09OKTtcclxuXHRcdHRoaXMuY29udHJvbC5zZXRWYWx1ZShqc29uVmFsdWUpO1xyXG5cclxuXHR9XHJcblxyXG5cdHBhcnNlSW5pdCh2YWx1ZXNKU09OOiBhbnkpIDogYW55IHtcclxuXHRcdGxldCB2YWx1ZXMgPSB7fTtcclxuXHJcblx0XHRmb3IgKGxldCBsYW5nIGluIHZhbHVlc0pTT04pIHtcclxuXHRcdFx0dmFsdWVzW2xhbmddID0gdGhpcy5wYXJzZVZhbHVlKHZhbHVlc0pTT05bbGFuZ10pO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB2YWx1ZXM7XHJcblx0fVxyXG5cclxuXHRwYXJzZVZhbHVlKHZhbHVlIDogYW55KSA6IGFueSB7XHJcblxyXG5cdFx0aWYgKHRoaXMudGVtcGxhdGVUeXBlID09ICdmaWxlLWlucHV0Jykge1xyXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdHJldHVybiB2YWx1ZTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRUZW1wbGF0ZVR5cGUodHlwZSA6IHN0cmluZykgOiBzdHJpbmcge1xyXG5cdFx0c3dpdGNoICh0eXBlKSB7XHJcblx0XHRcdGNhc2UgJ3RleHQnOlxyXG5cdFx0XHRjYXNlICdpbnB1dCc6XHJcblx0XHRcdFx0cmV0dXJuICdpbnB1dCc7XHJcblx0XHRcdGNhc2UgJ3RleHRhcmVhJzpcclxuXHRcdFx0XHRyZXR1cm4gJ2FyZWEnO1xyXG5cdFx0XHRjYXNlICd0ZXh0LWVkaXRvcic6XHJcblx0XHRcdFx0cmV0dXJuICdlZGl0b3InO1xyXG5cdFx0XHRjYXNlICdmaWxlLWlucHV0JzpcclxuXHRcdFx0XHRyZXR1cm4gJ2ZpbGUtaW5wdXQnO1xyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdHJldHVybiAnJztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHNlbGVjdExhbmcobGFuZyA6IHN0cmluZykge1xyXG5cdFx0bGV0IGluZGV4ID0gdGhpcy5sYW5ncy5maW5kSW5kZXgoIHJvdyA9PiB7XHJcblx0XHRcdHJldHVybiByb3cgPT0gbGFuZztcclxuXHRcdH0pO1xyXG5cdFx0aWYgKGluZGV4ICE9IHRoaXMuc2VsZWN0ZWRJbmRleCkge1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSBpbmRleDtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGFkZExhbmcoKSB7XHJcblx0XHRsZXQgbGFuZ3MgPSB0aGlzLmxhbmdzO1xyXG5cdFx0bGV0IHJlbUxhbmdzID0gdGhpcy5hbGxMYW5ncy5maWx0ZXIoIHggPT4ge1xyXG5cdFx0XHRyZXR1cm4gISB0aGlzLmluQXJyYXkobGFuZ3MseCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLm9wZW5EaWFsb2cocmVtTGFuZ3MpO1xyXG5cdH1cclxuXHJcblx0cmVtb3ZlTGFuZyhsYW5nIDogc3RyaW5nKSB7XHJcblx0XHRpZiAodGhpcy5sYW5ncy5sZW5ndGggPD0gMSkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IGluZGV4ID0gdGhpcy5sYW5ncy5maW5kSW5kZXgoIHJvdyA9PiB7XHJcblx0XHRcdHJldHVybiByb3cgPT0gbGFuZztcclxuXHRcdH0pO1xyXG5cdFx0aWYgKGluZGV4ICE9PSAtMSkge1xyXG5cdFx0XHR0aGlzLmxhbmdzLnNwbGljZShpbmRleCwxKTtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLnZhbHVlc1tsYW5nXTtcclxuXHRcdFx0ZGVsZXRlIHRoaXMudmFsdWVzSlNPTltsYW5nXTtcclxuXHJcblx0XHRcdGlmIChpbmRleCA9PSB0aGlzLnNlbGVjdGVkSW5kZXgpIHtcclxuXHRcdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSAwO1xyXG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRMYW5nID0gdGhpcy5sYW5nc1swXTtcclxuXHRcdFx0fVxyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHR0aGlzLnNlbGVjdExhbmcodGhpcy5zZWxlY3RlZExhbmcpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGxldCBqc29uVmFsdWUgOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh0aGlzLnZhbHVlc0pTT04pO1xyXG5cdFx0XHR0aGlzLmNvbnRyb2wuc2V0VmFsdWUoanNvblZhbHVlKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgb3BlbkRpYWxvZyhyZW1MYW5ncyA6IGFueVtdKSB7XHJcblx0XHRsZXQgZGF0YSA6IGFueSA9IHtcclxuXHRcdFx0bGFuZ3M6IHJlbUxhbmdzXHJcblx0XHR9O1xyXG5cdFx0bGV0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oVHJhbnNsYXRlRGlhbG9nQ29tcG9uZW50LCB7IGRhdGEgOiBkYXRhIH0pO1xyXG5cclxuXHRcdGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShsYW5nID0+IHtcclxuXHRcdFx0aWYgKGxhbmcpIHtcclxuXHRcdFx0XHR0aGlzLnZhbHVlc0pTT05bbGFuZ10gPSAnJztcclxuXHRcdFx0XHR0aGlzLnZhbHVlc1tsYW5nXSA9IHRoaXMucGFyc2VWYWx1ZSh0aGlzLnZhbHVlc0pTT05bbGFuZ10pO1xyXG5cclxuXHRcdFx0XHR0aGlzLmxhbmdzLnB1c2gobGFuZyk7XHJcblx0XHRcdFx0dGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcblx0XHRcdFx0dGhpcy5zZWxlY3RMYW5nKGxhbmcpO1xyXG5cdFx0XHR9XHJcbiAgICBcdH0pO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgY2hhbmdlVmFsdWUobmV3VmFsdWUgOiBhbnksIGxhbmc6IHN0cmluZykge1xyXG5cdFx0aWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgRmlsZSkge1xyXG5cdFx0XHR0aGlzLnZhbHVlc0pTT05bbGFuZ10gPSBhd2FpdCBUcmFuc2xhdGVDb21wb25lbnQudG9CYXNlNjQobmV3VmFsdWUpO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSBpZiAobmV3VmFsdWUgPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdHRoaXMudmFsdWVzSlNPTltsYW5nXSA9ICcnO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdHRoaXMudmFsdWVzSlNPTltsYW5nXSA9IG5ld1ZhbHVlO1xyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBqc29uVmFsdWUgOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh0aGlzLnZhbHVlc0pTT04pO1xyXG5cclxuXHRcdHRoaXMuY29udHJvbC5zZXRWYWx1ZShqc29uVmFsdWUpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGFzeW5jIHRvQmFzZTY0KHZhbHVlIDogYW55KSA6IFByb21pc2U8c3RyaW5nPiB7XHJcblx0XHRsZXQgbXlSZWFkZXIgOiBGaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuXHJcblx0XHRsZXQgaW1hZ2UgOiBzdHJpbmcgPSAnJztcclxuXHJcblx0XHRsZXQgcHJvbWlzZSA6IFByb21pc2U8c3RyaW5nPiA9IG5ldyBQcm9taXNlPHN0cmluZz4oIHJlc29sdmUgPT4ge1xyXG5cdFx0XHRteVJlYWRlci5vbmxvYWRlbmQgPSAoZSkgPT4ge1xyXG5cdFx0XHRcdGltYWdlID0gbXlSZWFkZXIucmVzdWx0O1xyXG5cdFx0XHRcdHJlc29sdmUoaW1hZ2UpO1xyXG5cdFx0XHR9XHJcblx0XHRcdG15UmVhZGVyLnJlYWRBc0RhdGFVUkwodmFsdWUpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0cmV0dXJuIHByb21pc2U7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIl19