UNPKG

@true-directive/grid

Version:

Angular Data Grid from Yopsilon.

216 lines 27.8 kB
import * as tslib_1 from "tslib"; /** * Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company. * @link https://truedirective.com/ * @license MIT */ import { Output, Directive, ElementRef, Renderer2, EventEmitter } from '@angular/core'; import { Mask } from '@true-directive/base'; import { Keys } from '@true-directive/base'; import { MaskSectionAction, MaskResult } from '@true-directive/base'; import { InternationalizationService } from '../internationalization/internationalization.service'; let MaskBaseDirective = class MaskBaseDirective { constructor(_renderer, _elementRef, intl) { this._renderer = _renderer; this._elementRef = _elementRef; this.intl = intl; this._undo = []; this._redo = []; // Current text value this._txtValue = ''; this._mask = new Mask(); this.android_behavior = false; // On state change this.stateChange = new EventEmitter(); this.maskValueChanged = new EventEmitter(); // Fetching mask state this._state = null; this._localeSubscription = this.intl.onLocaleChanged.subscribe(locale => this.setLocale(locale)); } get state() { return this._state; } set state(v) { if (this._state !== v) { this._state = v; this.stateChange.emit(this._state); // Emitting event } } updateState() { // } processAndroid(txt) { const res = this.currentRes(); // Possibly we have carriage position const key = Keys.whichKeyHasBeenPressed(this.last_res.newValue, txt, this.last_res.selStart, res.selStart, this.last_res.selLength); const r = this.processKey({ keyCode: -1, key: key.code, char: key.char, shiftKey: false, ctrlKey: false, target: { selectionStart: this.last_res.selStart, selectionEnd: 0 }, preventDefault: (_) => { } }); if (!r) { this.setRes(this.last_res); // Reversing, value has not been accepted } this.android_behavior = false; return; } doInput(txt) { if (this.android_behavior) { this.processAndroid(txt); return; } // Thus we're trying to apply a mask to value entered const masked = this._mask.applyMask(txt); if (masked !== this._txtValue) { this.setText(masked, true); } } processKey(e) { if (e.keyCode === 229 || e.keyCode === 0 || e.keyCode === undefined) { // Android detected this.android_behavior = true; this.last_res = this.currentRes(); return; } let c = e.char; if (c === undefined) { c = e.key; } let selStart = e.target.selectionStart; let selEnd = e.target.selectionEnd; let s = this._txtValue; if (Keys.isFunctional(e.keyCode)) { return true; } if (e.keyCode === Keys.TAB || e.keyCode === Keys.ESCAPE) { return true; } if (e.keyCode === Keys.HOME || e.keyCode === Keys.END) { return true; } if (e.shiftKey && (e.keyCode === Keys.DELETE || e.keyCode === Keys.INSERT)) { return true; } if (e.altKey && (e.keyCode === Keys.DOWN || e.keyCode === Keys.UP)) { return true; } if (e.ctrlKey && e.keyCode === Keys.Z) { // UNDO const undoRes = this._undo.pop(); if (undoRes) { this._redo.push(this.getRes(s, selStart, selEnd)); this.setRes(undoRes); } e.preventDefault(); return false; } if (e.ctrlKey && e.keyCode === Keys.Y) { // REDO const redoRes = this._redo.pop(); if (redoRes) { this._undo.push(this.getRes(s, selStart, selEnd)); this.setRes(redoRes); } e.preventDefault(); return false; } // Остальные Ctrl+* нас не интересуют if (e.ctrlKey) { return true; } // If everything is selected if (selStart === 0 && selEnd === this._txtValue.length) { if (e.keyCode === Keys.DELETE || e.keyCode === Keys.BACKSPACE) { return true; } // If ArrowLeft key has been pressed, result should equal to pressing of Home if (e.keyCode === Keys.LEFT) { return true; } if (e.keyCode === Keys.RIGHT) { return true; } } if (selStart === 0 && selEnd === this._txtValue.length) { s = ''; selStart = 0; selEnd = 0; } // Applying everything that's left const res = this._mask.applyKeyAtPos(s, e.keyCode, c, selStart, selEnd); if (res !== null && res.action === MaskSectionAction.APPLY) { // If value has been changed we'll add it to UNDO stack if (res.newValue !== s) { this._undo.push(this.getRes(s, selStart, selEnd)); this._redo = []; } this.setRes(res); if (this.android_behavior) { return true; } e.preventDefault(); } return false; } // Setting value and carriage position setRes(res) { if (this.android_behavior) { res.selLength = 0; } this.setText(res.newValue); this._renderer.setProperty(this._elementRef.nativeElement, 'selectionStart', res.selStart); this._renderer.setProperty(this._elementRef.nativeElement, 'selectionEnd', res.selStart + res.selLength); } currentRes() { const res = new MaskResult(this._txtValue, MaskSectionAction.APPLY, 0); res.selStart = this._elementRef.nativeElement.selectionStart; res.selLength = this._elementRef.nativeElement.selectionEnd - res.selStart; return res; } // Retrieving current mask value and carriage position getRes(s, selStart, selEnd) { const res = new MaskResult(s, MaskSectionAction.APPLY, 0); res.selStart = selStart; res.selLength = selEnd - selStart; return res; } // Following method should be overridden toModel() { } // Writing a text to control setText(displayedValue, toModel = true) { // Displaying this._txtValue = displayedValue; this._renderer.setProperty(this._elementRef.nativeElement, 'value', this._txtValue); // Sending to model if (toModel) { this.toModel(); } } setLocale(locale) { this._mask.setLocale(locale); } ngOnDestroy() { this._localeSubscription.unsubscribe(); } }; tslib_1.__decorate([ Output('stateChange'), tslib_1.__metadata("design:type", Object) ], MaskBaseDirective.prototype, "stateChange", void 0); tslib_1.__decorate([ Output('maskValueChanged'), tslib_1.__metadata("design:type", Object) ], MaskBaseDirective.prototype, "maskValueChanged", void 0); MaskBaseDirective = tslib_1.__decorate([ Directive({ selector: 'true-mask-base' }), tslib_1.__metadata("design:paramtypes", [Renderer2, ElementRef, InternationalizationService]) ], MaskBaseDirective); export { MaskBaseDirective }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFzay1iYXNlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B0cnVlLWRpcmVjdGl2ZS9ncmlkLyIsInNvdXJjZXMiOlsic3JjL21hc2svbWFzay1iYXNlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7RUFJRTtBQUNGLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsSUFBSSxFQUFXLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSXJFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBTW5HLElBQWEsaUJBQWlCLEdBQTlCLE1BQWEsaUJBQWlCO0lBZ1AxQixZQUFzQixTQUFvQixFQUFZLFdBQXVCLEVBQVksSUFBaUM7UUFBcEcsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUFZLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQVksU0FBSSxHQUFKLElBQUksQ0FBNkI7UUE5T2xILFVBQUssR0FBc0IsRUFBRSxDQUFDO1FBQzlCLFVBQUssR0FBc0IsRUFBRSxDQUFDO1FBRXRDLHFCQUFxQjtRQUNYLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDTixVQUFLLEdBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUlsQyxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFHbkMsa0JBQWtCO1FBRWxCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztRQUc1QyxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRTNDLHNCQUFzQjtRQUNkLFdBQU0sR0FBYyxJQUFJLENBQUM7UUEyTi9CLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDbkcsQ0FBQztJQTFORCxJQUFXLEtBQUs7UUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVELElBQVcsS0FBSyxDQUFDLENBQVk7UUFDM0IsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUNoQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxpQkFBaUI7U0FDdEQ7SUFDSCxDQUFDO0lBRVMsV0FBVztRQUNuQixFQUFFO0lBQ0osQ0FBQztJQUVTLGNBQWMsQ0FBQyxHQUFRO1FBRS9CLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUU5QixxQ0FBcUM7UUFDckMsTUFBTSxHQUFHLEdBQVksSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFDeEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRW5FLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQ3ZCO1lBQ0UsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNYLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSTtZQUNiLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtZQUNkLFFBQVEsRUFBRSxLQUFLO1lBQ2YsT0FBTyxFQUFFLEtBQUs7WUFDZCxNQUFNLEVBQUUsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRTtZQUNuRSxjQUFjLEVBQUUsQ0FBQyxDQUFNLEVBQUUsRUFBRSxHQUFFLENBQUM7U0FDL0IsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLENBQUMsRUFBRTtZQUNOLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMseUNBQXlDO1NBQ3RFO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUM5QixPQUFPO0lBQ1QsQ0FBQztJQUVTLE9BQU8sQ0FBQyxHQUFRO1FBQ3hCLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3pCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekIsT0FBTztTQUNSO1FBRUQscURBQXFEO1FBQ3JELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLElBQUksTUFBTSxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDNUI7SUFDSCxDQUFDO0lBRU0sVUFBVSxDQUFDLENBQU07UUFFdEIsSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUNuRSxtQkFBbUI7WUFDbkIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztZQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQyxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsR0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUNuQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztTQUNYO1FBRUQsSUFBSSxRQUFRLEdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7UUFDL0MsSUFBSSxNQUFNLEdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7UUFDM0MsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUV2QixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2hDLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDdkQsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNyRCxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsSUFBSSxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzFFLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDbEUsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUU7WUFDckMsT0FBTztZQUNQLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDakMsSUFBSSxPQUFPLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDdEI7WUFDRCxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDbkIsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUU7WUFDckMsT0FBTztZQUNQLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDakMsSUFBSSxPQUFPLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDdEI7WUFDRCxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDbkIsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELHFDQUFxQztRQUNyQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUU7WUFDYixPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsNEJBQTRCO1FBQzVCLElBQUksUUFBUSxLQUFLLENBQUMsSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDdEQsSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUM3RCxPQUFPLElBQUksQ0FBQzthQUNiO1lBRUQsNkVBQTZFO1lBQzdFLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUMzQixPQUFPLElBQUksQ0FBQzthQUNiO1lBRUQsSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQzVCLE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUVELElBQUksUUFBUSxLQUFLLENBQUMsSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDdEQsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNQLFFBQVEsR0FBRyxDQUFDLENBQUM7WUFDYixNQUFNLEdBQUcsQ0FBQyxDQUFDO1NBQ1o7UUFFRCxrQ0FBa0M7UUFDbEMsTUFBTSxHQUFHLEdBQWUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNwRixJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUU7WUFDMUQsdURBQXVEO1lBQ3ZELElBQUksR0FBRyxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNsRCxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQzthQUNqQjtZQUVELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFakIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3pCLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFFRCxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDcEI7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxzQ0FBc0M7SUFDNUIsTUFBTSxDQUFDLEdBQWU7UUFFOUIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDekIsR0FBRyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7U0FDbkI7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsY0FBYyxFQUFFLEdBQUcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzNHLENBQUM7SUFFUyxVQUFVO1FBQ2xCLE1BQU0sR0FBRyxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDO1FBQzdELEdBQUcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFDM0UsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsc0RBQXNEO0lBQzVDLE1BQU0sQ0FBQyxDQUFTLEVBQUUsUUFBZ0IsRUFBRSxNQUFjO1FBQzFELE1BQU0sR0FBRyxHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUQsR0FBRyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDeEIsR0FBRyxDQUFDLFNBQVMsR0FBRyxNQUFNLEdBQUcsUUFBUSxDQUFDO1FBQ2xDLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELHdDQUF3QztJQUM5QixPQUFPO0lBRWpCLENBQUM7SUFFRCw0QkFBNEI7SUFDbEIsT0FBTyxDQUFDLGNBQXNCLEVBQUUsVUFBbUIsSUFBSTtRQUUvRCxhQUFhO1FBQ2IsSUFBSSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUM7UUFDaEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVwRixtQkFBbUI7UUFDbkIsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDaEI7SUFDSCxDQUFDO0lBRVMsU0FBUyxDQUFDLE1BQWM7UUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDekMsQ0FBQztDQUtKLENBQUE7QUFuT0c7SUFEQyxNQUFNLENBQUMsYUFBYSxDQUFDOztzREFDc0I7QUFHNUM7SUFEQyxNQUFNLENBQUMsa0JBQWtCLENBQUM7OzJEQUNnQjtBQW5CbEMsaUJBQWlCO0lBSDdCLFNBQVMsQ0FBQztRQUNULFFBQVEsRUFBRSxnQkFBZ0I7S0FDM0IsQ0FBQzs2Q0FpUG1DLFNBQVMsRUFBeUIsVUFBVSxFQUFrQiwyQkFBMkI7R0FoUGpILGlCQUFpQixDQW1QN0I7U0FuUFksaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IEFsZWtzZXkgTWVsbmlrb3YsIFRydWUgRGlyZWN0aXZlIENvbXBhbnkuXHJcbiAqIEBsaW5rIGh0dHBzOi8vdHJ1ZWRpcmVjdGl2ZS5jb20vXHJcbiAqIEBsaWNlbnNlIE1JVFxyXG4qL1xyXG5pbXBvcnQgeyBPdXRwdXQsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgUmVuZGVyZXIyLCBFdmVudEVtaXR0ZXIsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXNrIH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5pbXBvcnQgeyBLZXlzLCBLZXlJbmZvIH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5pbXBvcnQgeyBNYXNrU2VjdGlvbkFjdGlvbiwgTWFza1Jlc3VsdCB9IGZyb20gJ0B0cnVlLWRpcmVjdGl2ZS9iYXNlJztcclxuaW1wb3J0IHsgTWFza1NldHRpbmdzIH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5pbXBvcnQgeyBNYXNrU3RhdGUgfSBmcm9tICdAdHJ1ZS1kaXJlY3RpdmUvYmFzZSc7XHJcblxyXG5pbXBvcnQgeyBJbnRlcm5hdGlvbmFsaXphdGlvblNlcnZpY2UgfSBmcm9tICcuLi9pbnRlcm5hdGlvbmFsaXphdGlvbi9pbnRlcm5hdGlvbmFsaXphdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTG9jYWxlIH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICd0cnVlLW1hc2stYmFzZSdcclxufSlcclxuZXhwb3J0IGNsYXNzIE1hc2tCYXNlRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuXHJcbiAgICBwcml2YXRlIF91bmRvOiBBcnJheTxNYXNrUmVzdWx0PiA9IFtdO1xyXG4gICAgcHJpdmF0ZSBfcmVkbzogQXJyYXk8TWFza1Jlc3VsdD4gPSBbXTtcclxuXHJcbiAgICAvLyBDdXJyZW50IHRleHQgdmFsdWVcclxuICAgIHByb3RlY3RlZCBfdHh0VmFsdWUgPSAnJztcclxuICAgIHByb3RlY3RlZCByZWFkb25seSBfbWFzazogTWFzayA9IG5ldyBNYXNrKCk7XHJcblxyXG4gICAgcHJpdmF0ZSBfbG9jYWxlU3Vic2NyaXB0aW9uOiBhbnk7XHJcblxyXG4gICAgcHJvdGVjdGVkIGFuZHJvaWRfYmVoYXZpb3IgPSBmYWxzZTtcclxuICAgIHByb3RlY3RlZCBsYXN0X3JlczogTWFza1Jlc3VsdDtcclxuXHJcbiAgICAvLyBPbiBzdGF0ZSBjaGFuZ2VcclxuICAgIEBPdXRwdXQoJ3N0YXRlQ2hhbmdlJylcclxuICAgIHN0YXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxNYXNrU3RhdGU+KCk7XHJcblxyXG4gICAgQE91dHB1dCgnbWFza1ZhbHVlQ2hhbmdlZCcpXHJcbiAgICBtYXNrVmFsdWVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gICAgLy8gRmV0Y2hpbmcgbWFzayBzdGF0ZVxyXG4gICAgcHJpdmF0ZSBfc3RhdGU6IE1hc2tTdGF0ZSA9IG51bGw7XHJcblxyXG4gICAgcHVibGljIGdldCBzdGF0ZSgpOiBNYXNrU3RhdGUge1xyXG4gICAgICByZXR1cm4gdGhpcy5fc3RhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBzdGF0ZSh2OiBNYXNrU3RhdGUpIHtcclxuICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSB2KSB7XHJcbiAgICAgICAgdGhpcy5fc3RhdGUgPSB2O1xyXG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2UuZW1pdCh0aGlzLl9zdGF0ZSk7IC8vIEVtaXR0aW5nIGV2ZW50XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgdXBkYXRlU3RhdGUoKSB7XHJcbiAgICAgIC8vXHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NBbmRyb2lkKHR4dDogYW55KTogdm9pZCB7XHJcblxyXG4gICAgICBjb25zdCByZXMgPSB0aGlzLmN1cnJlbnRSZXMoKTtcclxuXHJcbiAgICAgIC8vIFBvc3NpYmx5IHdlIGhhdmUgY2FycmlhZ2UgcG9zaXRpb25cclxuICAgICAgY29uc3Qga2V5OiBLZXlJbmZvID0gS2V5cy53aGljaEtleUhhc0JlZW5QcmVzc2VkKHRoaXMubGFzdF9yZXMubmV3VmFsdWUsIHR4dCxcclxuICAgICAgICAgIHRoaXMubGFzdF9yZXMuc2VsU3RhcnQsIHJlcy5zZWxTdGFydCwgdGhpcy5sYXN0X3Jlcy5zZWxMZW5ndGgpO1xyXG5cclxuICAgICAgY29uc3QgciA9IHRoaXMucHJvY2Vzc0tleShcclxuICAgICAgICB7XHJcbiAgICAgICAgICBrZXlDb2RlOiAtMSxcclxuICAgICAgICAgIGtleToga2V5LmNvZGUsXHJcbiAgICAgICAgICBjaGFyOiBrZXkuY2hhcixcclxuICAgICAgICAgIHNoaWZ0S2V5OiBmYWxzZSxcclxuICAgICAgICAgIGN0cmxLZXk6IGZhbHNlLFxyXG4gICAgICAgICAgdGFyZ2V0OiB7IHNlbGVjdGlvblN0YXJ0OiB0aGlzLmxhc3RfcmVzLnNlbFN0YXJ0LCBzZWxlY3Rpb25FbmQ6IDAgfSxcclxuICAgICAgICAgIHByZXZlbnREZWZhdWx0OiAoXzogYW55KSA9PiB7fVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKCFyKSB7XHJcbiAgICAgICAgdGhpcy5zZXRSZXModGhpcy5sYXN0X3Jlcyk7IC8vIFJldmVyc2luZywgdmFsdWUgaGFzIG5vdCBiZWVuIGFjY2VwdGVkXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuYW5kcm9pZF9iZWhhdmlvciA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGRvSW5wdXQodHh0OiBhbnkpIHtcclxuICAgICAgaWYgKHRoaXMuYW5kcm9pZF9iZWhhdmlvcikge1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc0FuZHJvaWQodHh0KTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFRodXMgd2UncmUgdHJ5aW5nIHRvIGFwcGx5IGEgbWFzayB0byB2YWx1ZSBlbnRlcmVkXHJcbiAgICAgIGNvbnN0IG1hc2tlZCA9IHRoaXMuX21hc2suYXBwbHlNYXNrKHR4dCk7XHJcbiAgICAgIGlmIChtYXNrZWQgIT09IHRoaXMuX3R4dFZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5zZXRUZXh0KG1hc2tlZCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcHJvY2Vzc0tleShlOiBhbnkpOiBib29sZWFuIHtcclxuXHJcbiAgICAgIGlmIChlLmtleUNvZGUgPT09IDIyOSB8fCBlLmtleUNvZGUgPT09IDAgfHwgZS5rZXlDb2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAvLyBBbmRyb2lkIGRldGVjdGVkXHJcbiAgICAgICAgdGhpcy5hbmRyb2lkX2JlaGF2aW9yID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmxhc3RfcmVzID0gdGhpcy5jdXJyZW50UmVzKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgYzogc3RyaW5nID0gZS5jaGFyO1xyXG4gICAgICBpZiAoYyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgYyA9IGUua2V5O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgc2VsU3RhcnQ6IG51bWJlciA9IGUudGFyZ2V0LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICBsZXQgc2VsRW5kOiBudW1iZXIgPSBlLnRhcmdldC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgIGxldCBzID0gdGhpcy5fdHh0VmFsdWU7XHJcblxyXG4gICAgICBpZiAoS2V5cy5pc0Z1bmN0aW9uYWwoZS5rZXlDb2RlKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlzLlRBQiB8fCBlLmtleUNvZGUgPT09IEtleXMuRVNDQVBFKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChlLmtleUNvZGUgPT09IEtleXMuSE9NRSB8fCBlLmtleUNvZGUgPT09IEtleXMuRU5EKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChlLnNoaWZ0S2V5ICYmIChlLmtleUNvZGUgPT09IEtleXMuREVMRVRFIHx8IGUua2V5Q29kZSA9PT0gS2V5cy5JTlNFUlQpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChlLmFsdEtleSAmJiAoZS5rZXlDb2RlID09PSBLZXlzLkRPV04gfHwgZS5rZXlDb2RlID09PSBLZXlzLlVQKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZS5jdHJsS2V5ICYmIGUua2V5Q29kZSA9PT0gS2V5cy5aKSB7XHJcbiAgICAgICAgLy8gVU5ET1xyXG4gICAgICAgIGNvbnN0IHVuZG9SZXMgPSB0aGlzLl91bmRvLnBvcCgpO1xyXG4gICAgICAgIGlmICh1bmRvUmVzKSB7XHJcbiAgICAgICAgICB0aGlzLl9yZWRvLnB1c2godGhpcy5nZXRSZXMocywgc2VsU3RhcnQsIHNlbEVuZCkpO1xyXG4gICAgICAgICAgdGhpcy5zZXRSZXModW5kb1Jlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChlLmN0cmxLZXkgJiYgZS5rZXlDb2RlID09PSBLZXlzLlkpIHtcclxuICAgICAgICAvLyBSRURPXHJcbiAgICAgICAgY29uc3QgcmVkb1JlcyA9IHRoaXMuX3JlZG8ucG9wKCk7XHJcbiAgICAgICAgaWYgKHJlZG9SZXMpIHtcclxuICAgICAgICAgIHRoaXMuX3VuZG8ucHVzaCh0aGlzLmdldFJlcyhzLCBzZWxTdGFydCwgc2VsRW5kKSk7XHJcbiAgICAgICAgICB0aGlzLnNldFJlcyhyZWRvUmVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8g0J7RgdGC0LDQu9GM0L3Ri9C1IEN0cmwrKiDQvdCw0YEg0L3QtSDQuNC90YLQtdGA0LXRgdGD0Y7RglxyXG4gICAgICBpZiAoZS5jdHJsS2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIElmIGV2ZXJ5dGhpbmcgaXMgc2VsZWN0ZWRcclxuICAgICAgaWYgKHNlbFN0YXJ0ID09PSAwICYmIHNlbEVuZCA9PT0gdGhpcy5fdHh0VmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5ERUxFVEUgfHwgZS5rZXlDb2RlID09PSBLZXlzLkJBQ0tTUEFDRSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiBBcnJvd0xlZnQga2V5IGhhcyBiZWVuIHByZXNzZWQsIHJlc3VsdCBzaG91bGQgZXF1YWwgdG8gcHJlc3Npbmcgb2YgSG9tZVxyXG4gICAgICAgIGlmIChlLmtleUNvZGUgPT09IEtleXMuTEVGVCkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlzLlJJR0hUKSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzZWxTdGFydCA9PT0gMCAmJiBzZWxFbmQgPT09IHRoaXMuX3R4dFZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgIHMgPSAnJztcclxuICAgICAgICBzZWxTdGFydCA9IDA7XHJcbiAgICAgICAgc2VsRW5kID0gMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gQXBwbHlpbmcgZXZlcnl0aGluZyB0aGF0J3MgbGVmdFxyXG4gICAgICBjb25zdCByZXM6IE1hc2tSZXN1bHQgPSB0aGlzLl9tYXNrLmFwcGx5S2V5QXRQb3MocywgZS5rZXlDb2RlLCBjLCBzZWxTdGFydCwgc2VsRW5kKTtcclxuICAgICAgaWYgKHJlcyAhPT0gbnVsbCAmJiByZXMuYWN0aW9uID09PSBNYXNrU2VjdGlvbkFjdGlvbi5BUFBMWSkge1xyXG4gICAgICAgIC8vIElmIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQgd2UnbGwgYWRkIGl0IHRvIFVORE8gc3RhY2tcclxuICAgICAgICBpZiAocmVzLm5ld1ZhbHVlICE9PSBzKSB7XHJcbiAgICAgICAgICB0aGlzLl91bmRvLnB1c2godGhpcy5nZXRSZXMocywgc2VsU3RhcnQsIHNlbEVuZCkpO1xyXG4gICAgICAgICAgdGhpcy5fcmVkbyA9IFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXRSZXMocmVzKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYW5kcm9pZF9iZWhhdmlvcikge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZXR0aW5nIHZhbHVlIGFuZCBjYXJyaWFnZSBwb3NpdGlvblxyXG4gICAgcHJvdGVjdGVkIHNldFJlcyhyZXM6IE1hc2tSZXN1bHQpIHtcclxuXHJcbiAgICAgIGlmICh0aGlzLmFuZHJvaWRfYmVoYXZpb3IpIHtcclxuICAgICAgICByZXMuc2VsTGVuZ3RoID0gMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zZXRUZXh0KHJlcy5uZXdWYWx1ZSk7XHJcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3NlbGVjdGlvblN0YXJ0JywgcmVzLnNlbFN0YXJ0KTtcclxuICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnc2VsZWN0aW9uRW5kJywgcmVzLnNlbFN0YXJ0ICsgcmVzLnNlbExlbmd0aCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGN1cnJlbnRSZXMoKSB7XHJcbiAgICAgIGNvbnN0IHJlcyA9IG5ldyBNYXNrUmVzdWx0KHRoaXMuX3R4dFZhbHVlLCBNYXNrU2VjdGlvbkFjdGlvbi5BUFBMWSwgMCk7XHJcbiAgICAgIHJlcy5zZWxTdGFydCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgcmVzLnNlbExlbmd0aCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25FbmQgLSByZXMuc2VsU3RhcnQ7XHJcbiAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmV0cmlldmluZyBjdXJyZW50IG1hc2sgdmFsdWUgYW5kIGNhcnJpYWdlIHBvc2l0aW9uXHJcbiAgICBwcm90ZWN0ZWQgZ2V0UmVzKHM6IHN0cmluZywgc2VsU3RhcnQ6IG51bWJlciwgc2VsRW5kOiBudW1iZXIpOiBNYXNrUmVzdWx0IHtcclxuICAgICAgY29uc3QgcmVzID0gbmV3IE1hc2tSZXN1bHQocywgTWFza1NlY3Rpb25BY3Rpb24uQVBQTFksIDApO1xyXG4gICAgICByZXMuc2VsU3RhcnQgPSBzZWxTdGFydDtcclxuICAgICAgcmVzLnNlbExlbmd0aCA9IHNlbEVuZCAtIHNlbFN0YXJ0O1xyXG4gICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEZvbGxvd2luZyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW5cclxuICAgIHByb3RlY3RlZCB0b01vZGVsKCk6IHZvaWQge1xyXG4gICAgICBcclxuICAgIH1cclxuXHJcbiAgICAvLyBXcml0aW5nIGEgdGV4dCB0byBjb250cm9sXHJcbiAgICBwcm90ZWN0ZWQgc2V0VGV4dChkaXNwbGF5ZWRWYWx1ZTogc3RyaW5nLCB0b01vZGVsOiBib29sZWFuID0gdHJ1ZSkge1xyXG5cclxuICAgICAgLy8gRGlzcGxheWluZ1xyXG4gICAgICB0aGlzLl90eHRWYWx1ZSA9IGRpc3BsYXllZFZhbHVlO1xyXG4gICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHRoaXMuX3R4dFZhbHVlKTtcclxuXHJcbiAgICAgIC8vIFNlbmRpbmcgdG8gbW9kZWxcclxuICAgICAgaWYgKHRvTW9kZWwpIHtcclxuICAgICAgICB0aGlzLnRvTW9kZWwoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzZXRMb2NhbGUobG9jYWxlOiBMb2NhbGUpIHtcclxuICAgICAgdGhpcy5fbWFzay5zZXRMb2NhbGUobG9jYWxlKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgdGhpcy5fbG9jYWxlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9yZW5kZXJlcjogUmVuZGVyZXIyLCBwcm90ZWN0ZWQgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHByb3RlY3RlZCBpbnRsOiBJbnRlcm5hdGlvbmFsaXphdGlvblNlcnZpY2UpIHtcclxuICAgICAgdGhpcy5fbG9jYWxlU3Vic2NyaXB0aW9uID0gdGhpcy5pbnRsLm9uTG9jYWxlQ2hhbmdlZC5zdWJzY3JpYmUobG9jYWxlID0+IHRoaXMuc2V0TG9jYWxlKGxvY2FsZSkpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==