UNPKG

@steinv/filippine

Version:

Filippine - acrostic word puzzle with Angular

117 lines 18 kB
import { Component, Input, ChangeDetectorRef, ChangeDetectionStrategy, Output, EventEmitter } from '@angular/core'; import { FormControl, FormGroup } from '@angular/forms'; export class FilippineComponent { constructor(_changeDetectorRef) { this._changeDetectorRef = _changeDetectorRef; this.answer = new EventEmitter(); /** * Emits when the form has been completed * returns false when answered wrongly, true when correctly answered */ this.completed = new EventEmitter(); this.filippineForm = new FormGroup({}); this.columns = 1; this.tiles = []; } ngOnInit() { /** * Calculate how big the grid should be */ const left = this.configuration.questions.reduce((acc, q) => acc = acc > q.answerPosition ? acc : q.answerPosition, 0); const right = this.configuration.questions.reduce((acc, q) => acc = acc > q.answerLength - q.answerPosition ? acc : q.answerLength - q.answerPosition, 0); this.columns = left + right; /** * map the configuration to the tiles on the grid * Creates a filippineForm that can validate each question */ let inputFieldCounter = 0; this.configuration.questions.map((m, i) => { const blankCellsLeft = left - m.answerPosition; const blankCellsRight = this.columns - (m.answerLength + blankCellsLeft); const inputCells = m.answerLength; this.tiles.push(new Array()); if (blankCellsLeft > 0) { this.tiles[i].push({ colspan: blankCellsLeft, question: false, highlight: false }); } const formQuestion = new FormGroup({}, this.rightAnswer(m)); for (let index = 0; index < inputCells; index++) { this.tiles[i].push({ index: inputFieldCounter, highlight: (index === m.answerPosition), colspan: 1, question: true, name: index, coordinates: i.toString() + ',' + (index + blankCellsLeft).toString() // coorindates row, column }); inputFieldCounter++; formQuestion.addControl(index.toString(), new FormControl('')); // m.answer.charAt(index) } this.filippineForm.addControl(i.toString(), formQuestion); if (blankCellsRight > 0) { this.tiles[i].push({ colspan: blankCellsRight, question: false, highlight: false }); } this.filippineForm.valueChanges.subscribe(() => { for (const group in this.filippineForm.controls) { const controlGroup = this.filippineForm.get(group); for (const field in controlGroup.controls) { const inputField = controlGroup.get(field); if (!inputField || !inputField.value) { return; } } } this.completed.emit(this.filippineForm.valid); }); }); } rightAnswer(question) { return (c) => { let formGroup = c; let invalid = false; let reply = ''; for (const field in formGroup.controls) { const control = formGroup.get(field); // only validate answer when entire group is filled if (!control || !control.value) { return null; } // concat control value upon reply string reply += control.value; // validate response if (question.answer && question.answer.length >= +field && control.value.toUpperCase() !== question.answer.charAt(+field).toUpperCase()) { invalid = true; } } // emit answer that client entered if (reply) { this.answer.emit({ question: question, answer: reply, }); } return invalid ? { invalid: true } : null; }; } ngAfterViewInit() { this._changeDetectorRef.detectChanges(); } } FilippineComponent.decorators = [ { type: Component, args: [{ selector: 'filippine', template: "\n<form [formGroup]=\"filippineForm\">\n <grid-list \n *ngFor=\"let row of tiles; let i = index\" \n [cols]=\"columns\" \n gutterSize=\"0\"\n [formGroupName]=\"i\"\n >\n <grid-tile \n *ngFor=\"let tile of row\"\n [colspan]=\"tile.colspan\"\n [ngClass]=\"{'input': tile.question, 'spacer': !tile.question, '': true, 'highlight': tile.highlight}\">\n <input \n *ngIf=\"tile.question === true\" \n AutoTab \n [id]=\"tile.coordinates\" \n [name]=\"tile.index\" \n type=\"text\" \n maxlength=\"1\" \n [formControlName]=\"tile.name\" \n />\n </grid-tile>\n </grid-list>\n</form>", changeDetection: ChangeDetectionStrategy.OnPush, styles: ["grid-tile{border:1px solid #000;box-shadow:0 0 0 1px #000;display:flex;position:relative}grid-tile input{background:transparent;border:none;height:0;margin:0;outline:none;padding:50% 0;text-align:center;text-transform:uppercase;width:100%}.spacer{background-color:#000}.input{background-color:#fff;border:1px solid #000;box-shadow:0 0 0 1px #000}.highlight{background-color:#ff0}grid-list.ng-invalid .input{border-color:red;box-shadow:0 0 0 1px red;z-index:1}"] },] } ]; FilippineComponent.ctorParameters = () => [ { type: ChangeDetectorRef } ]; FilippineComponent.propDecorators = { configuration: [{ type: Input }], answer: [{ type: Output }], completed: [{ type: Output }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsaXBwaW5lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi9wcm9qZWN0cy9maWxpcHBpbmUvc3JjLyIsInNvdXJjZXMiOlsibGliL2ZpbGlwcGluZS9maWxpcHBpbmUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLGlCQUFpQixFQUFFLHVCQUF1QixFQUFpQixNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFJLE9BQU8sRUFBbUIsV0FBVyxFQUFFLFNBQVMsRUFBZSxNQUFNLGdCQUFnQixDQUFDO0FBUXRGLE1BQU0sT0FBTyxrQkFBa0I7SUFtQjdCLFlBQ21CLGtCQUFxQztRQUFyQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW1CO1FBZGpELFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRTNDOzs7V0FHRztRQUVJLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRXhDLGtCQUFhLEdBQUcsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEMsWUFBTyxHQUFXLENBQUMsQ0FBQztRQUNwQixVQUFLLEdBQXNCLEVBQUUsQ0FBQztJQUlqQyxDQUFDO0lBRUUsUUFBUTtRQUNiOztXQUVHO1FBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBUSxFQUFFLENBQU0sRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakksTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBUSxFQUFFLENBQU0sRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BLLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUU1Qjs7O1dBR0c7UUFDSCxJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQzlCLENBQUMsQ0FBVyxFQUFFLENBQVMsRUFBRSxFQUFFO1lBQ3pCLE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDO1lBQy9DLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLGNBQWMsQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUM7WUFFbEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLElBQUksY0FBYyxHQUFHLENBQUMsRUFBRTtnQkFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7YUFDcEY7WUFFRCxNQUFNLFlBQVksR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVELEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQy9DLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO29CQUNqQixLQUFLLEVBQUUsaUJBQWlCO29CQUN4QixTQUFTLEVBQUUsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQztvQkFDdkMsT0FBTyxFQUFFLENBQUM7b0JBQ1YsUUFBUSxFQUFFLElBQUk7b0JBQ2QsSUFBSSxFQUFFLEtBQUs7b0JBQ1gsV0FBVyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEdBQUcsY0FBYyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsMEJBQTBCO2lCQUNqRyxDQUFDLENBQUM7Z0JBQ0gsaUJBQWlCLEVBQUUsQ0FBQztnQkFDcEIsWUFBWSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBLHlCQUF5QjthQUN6RjtZQUNELElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUUxRCxJQUFJLGVBQWUsR0FBRyxDQUFDLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQ3JGO1lBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDN0MsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRTtvQkFDL0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFjLENBQUM7b0JBQ2hFLEtBQUssTUFBTSxLQUFLLElBQUksWUFBWSxDQUFDLFFBQVEsRUFBRTt3QkFDekMsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDM0MsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUU7NEJBQ3BDLE9BQU87eUJBQ1I7cUJBQ0Y7aUJBQ0Y7Z0JBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoRCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVNLFdBQVcsQ0FBQyxRQUFrQjtRQUNuQyxPQUFPLENBQUMsQ0FBa0IsRUFBaUMsRUFBRTtZQUMzRCxJQUFJLFNBQVMsR0FBRyxDQUFjLENBQUM7WUFFL0IsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNmLEtBQUssTUFBTSxLQUFLLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRTtnQkFDdEMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFckMsbURBQW1EO2dCQUNuRCxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtvQkFDOUIsT0FBTyxJQUFJLENBQUM7aUJBQ2I7Z0JBRUQseUNBQXlDO2dCQUN6QyxLQUFLLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFFdkIsb0JBQW9CO2dCQUNwQixJQUFJLFFBQVEsQ0FBQyxNQUFNO29CQUNqQixRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUs7b0JBQ2hDLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFDNUU7b0JBQ0EsT0FBTyxHQUFHLElBQUksQ0FBQztpQkFDaEI7YUFDRjtZQUdELGtDQUFrQztZQUNsQyxJQUFJLEtBQUssRUFBRTtnQkFDVCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDZixRQUFRLEVBQUUsUUFBUTtvQkFDbEIsTUFBTSxFQUFFLEtBQUs7aUJBQ2QsQ0FBQyxDQUFDO2FBQ0o7WUFDRCxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUM1QyxDQUFDLENBQUE7SUFDSCxDQUFDO0lBRU0sZUFBZTtRQUNwQixJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDMUMsQ0FBQzs7O1lBaklGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsV0FBVztnQkFDckIsMnhCQUF5QztnQkFFekMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07O2FBQ2hEOzs7WUFSa0MsaUJBQWlCOzs7NEJBV2pELEtBQUs7cUJBR0wsTUFBTTt3QkFPTixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5zd2VyIH0gZnJvbSAnLi8uLi9jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb24sIFF1ZXN0aW9uIH0gZnJvbSAnLi4vY29uZmlndXJhdGlvbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIENoYW5nZURldGVjdG9yUmVmLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQWZ0ZXJWaWV3SW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ZpbGlwcGluZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9maWxpcHBpbmUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9maWxpcHBpbmUuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEZpbGlwcGluZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGNvbmZpZ3VyYXRpb24hOiBDb25maWd1cmF0aW9uO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgYW5zd2VyID0gbmV3IEV2ZW50RW1pdHRlcjxBbnN3ZXI+KCk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHdoZW4gdGhlIGZvcm0gaGFzIGJlZW4gY29tcGxldGVkXG4gICAqIHJldHVybnMgZmFsc2Ugd2hlbiBhbnN3ZXJlZCB3cm9uZ2x5LCB0cnVlIHdoZW4gY29ycmVjdGx5IGFuc3dlcmVkXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIGNvbXBsZXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBwdWJsaWMgZmlsaXBwaW5lRm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xuICBwdWJsaWMgY29sdW1uczogbnVtYmVyID0gMTtcbiAgcHVibGljIHRpbGVzOiBBcnJheTxBcnJheTxhbnk+PiA9IFtdO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICkgeyB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSBob3cgYmlnIHRoZSBncmlkIHNob3VsZCBiZVxuICAgICAqL1xuICAgIGNvbnN0IGxlZnQgPSB0aGlzLmNvbmZpZ3VyYXRpb24ucXVlc3Rpb25zLnJlZHVjZSgoYWNjOiBhbnksIHE6IGFueSkgPT4gYWNjID0gYWNjID4gcS5hbnN3ZXJQb3NpdGlvbiA/IGFjYyA6IHEuYW5zd2VyUG9zaXRpb24sIDApO1xuICAgIGNvbnN0IHJpZ2h0ID0gdGhpcy5jb25maWd1cmF0aW9uLnF1ZXN0aW9ucy5yZWR1Y2UoKGFjYzogYW55LCBxOiBhbnkpID0+IGFjYyA9IGFjYyA+IHEuYW5zd2VyTGVuZ3RoIC0gcS5hbnN3ZXJQb3NpdGlvbiA/IGFjYyA6IHEuYW5zd2VyTGVuZ3RoIC0gcS5hbnN3ZXJQb3NpdGlvbiwgMCk7XG4gICAgdGhpcy5jb2x1bW5zID0gbGVmdCArIHJpZ2h0O1xuXG4gICAgLyoqXG4gICAgICogbWFwIHRoZSBjb25maWd1cmF0aW9uIHRvIHRoZSB0aWxlcyBvbiB0aGUgZ3JpZFxuICAgICAqIENyZWF0ZXMgYSBmaWxpcHBpbmVGb3JtIHRoYXQgY2FuIHZhbGlkYXRlIGVhY2ggcXVlc3Rpb25cbiAgICAgKi9cbiAgICBsZXQgaW5wdXRGaWVsZENvdW50ZXIgPSAwO1xuICAgIHRoaXMuY29uZmlndXJhdGlvbi5xdWVzdGlvbnMubWFwKFxuICAgICAgKG06IFF1ZXN0aW9uLCBpOiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgYmxhbmtDZWxsc0xlZnQgPSBsZWZ0IC0gbS5hbnN3ZXJQb3NpdGlvbjtcbiAgICAgICAgY29uc3QgYmxhbmtDZWxsc1JpZ2h0ID0gdGhpcy5jb2x1bW5zIC0gKG0uYW5zd2VyTGVuZ3RoICsgYmxhbmtDZWxsc0xlZnQpO1xuICAgICAgICBjb25zdCBpbnB1dENlbGxzID0gbS5hbnN3ZXJMZW5ndGg7XG5cbiAgICAgICAgdGhpcy50aWxlcy5wdXNoKG5ldyBBcnJheSgpKTtcbiAgICAgICAgaWYgKGJsYW5rQ2VsbHNMZWZ0ID4gMCkge1xuICAgICAgICAgIHRoaXMudGlsZXNbaV0ucHVzaCh7IGNvbHNwYW46IGJsYW5rQ2VsbHNMZWZ0LCBxdWVzdGlvbjogZmFsc2UsIGhpZ2hsaWdodDogZmFsc2UgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmb3JtUXVlc3Rpb24gPSBuZXcgRm9ybUdyb3VwKHt9LCB0aGlzLnJpZ2h0QW5zd2VyKG0pKTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGlucHV0Q2VsbHM7IGluZGV4KyspIHtcbiAgICAgICAgICB0aGlzLnRpbGVzW2ldLnB1c2goe1xuICAgICAgICAgICAgaW5kZXg6IGlucHV0RmllbGRDb3VudGVyLFxuICAgICAgICAgICAgaGlnaGxpZ2h0OiAoaW5kZXggPT09IG0uYW5zd2VyUG9zaXRpb24pLCAgICAgICAgLy8gaGlnaGxpZ2h0ZWQgYm94IG9yIG5vdFxuICAgICAgICAgICAgY29sc3BhbjogMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sc3BhbiBmb3IgcXVlc3Rpb24gaXMgYWx3YXlzIDFcbiAgICAgICAgICAgIHF1ZXN0aW9uOiB0cnVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXN0aW9uIG9yIHNwYWNlclxuICAgICAgICAgICAgbmFtZTogaW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9ybUNvbnRyb2xOYW1lIGJhc2VkIG9uIGluZGV4XG4gICAgICAgICAgICBjb29yZGluYXRlczogaS50b1N0cmluZygpICsgJywnICsgKGluZGV4ICsgYmxhbmtDZWxsc0xlZnQpLnRvU3RyaW5nKCkgLy8gY29vcmluZGF0ZXMgcm93LCBjb2x1bW5cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpbnB1dEZpZWxkQ291bnRlcisrO1xuICAgICAgICAgIGZvcm1RdWVzdGlvbi5hZGRDb250cm9sKGluZGV4LnRvU3RyaW5nKCksIG5ldyBGb3JtQ29udHJvbCgnJykpOy8vIG0uYW5zd2VyLmNoYXJBdChpbmRleClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbGlwcGluZUZvcm0uYWRkQ29udHJvbChpLnRvU3RyaW5nKCksIGZvcm1RdWVzdGlvbik7XG5cbiAgICAgICAgaWYgKGJsYW5rQ2VsbHNSaWdodCA+IDApIHtcbiAgICAgICAgICB0aGlzLnRpbGVzW2ldLnB1c2goeyBjb2xzcGFuOiBibGFua0NlbGxzUmlnaHQsIHF1ZXN0aW9uOiBmYWxzZSwgaGlnaGxpZ2h0OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlsaXBwaW5lRm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIGluIHRoaXMuZmlsaXBwaW5lRm9ybS5jb250cm9scykge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbEdyb3VwID0gdGhpcy5maWxpcHBpbmVGb3JtLmdldChncm91cCkgYXMgRm9ybUdyb3VwO1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZCBpbiBjb250cm9sR3JvdXAuY29udHJvbHMpIHtcbiAgICAgICAgICAgICAgY29uc3QgaW5wdXRGaWVsZCA9IGNvbnRyb2xHcm91cC5nZXQoZmllbGQpO1xuICAgICAgICAgICAgICBpZiAoIWlucHV0RmllbGQgfHwgIWlucHV0RmllbGQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmNvbXBsZXRlZC5lbWl0KHRoaXMuZmlsaXBwaW5lRm9ybS52YWxpZCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcmlnaHRBbnN3ZXIocXVlc3Rpb246IFF1ZXN0aW9uKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoYzogQWJzdHJhY3RDb250cm9sKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwgPT4ge1xuICAgICAgbGV0IGZvcm1Hcm91cCA9IGMgYXMgRm9ybUdyb3VwO1xuXG4gICAgICBsZXQgaW52YWxpZCA9IGZhbHNlO1xuICAgICAgbGV0IHJlcGx5ID0gJyc7XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIGluIGZvcm1Hcm91cC5jb250cm9scykge1xuICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmdldChmaWVsZCk7XG5cbiAgICAgICAgLy8gb25seSB2YWxpZGF0ZSBhbnN3ZXIgd2hlbiBlbnRpcmUgZ3JvdXAgaXMgZmlsbGVkXG4gICAgICAgIGlmICghY29udHJvbCB8fCAhY29udHJvbC52YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29uY2F0IGNvbnRyb2wgdmFsdWUgdXBvbiByZXBseSBzdHJpbmdcbiAgICAgICAgcmVwbHkgKz0gY29udHJvbC52YWx1ZTtcblxuICAgICAgICAvLyB2YWxpZGF0ZSByZXNwb25zZVxuICAgICAgICBpZiAocXVlc3Rpb24uYW5zd2VyICYmXG4gICAgICAgICAgcXVlc3Rpb24uYW5zd2VyLmxlbmd0aCA+PSArZmllbGQgJiZcbiAgICAgICAgICBjb250cm9sLnZhbHVlLnRvVXBwZXJDYXNlKCkgIT09IHF1ZXN0aW9uLmFuc3dlci5jaGFyQXQoK2ZpZWxkKS50b1VwcGVyQ2FzZSgpXG4gICAgICAgICkge1xuICAgICAgICAgIGludmFsaWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cblxuICAgICAgLy8gZW1pdCBhbnN3ZXIgdGhhdCBjbGllbnQgZW50ZXJlZFxuICAgICAgaWYgKHJlcGx5KSB7XG4gICAgICAgIHRoaXMuYW5zd2VyLmVtaXQoe1xuICAgICAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgICAgICBhbnN3ZXI6IHJlcGx5LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpbnZhbGlkID8geyBpbnZhbGlkOiB0cnVlIH0gOiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG59XG5cbiJdfQ==