@true-directive/grid
Version:
Angular Data Grid from Yopsilon.
223 lines • 28.7 kB
JavaScript
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';
var MaskBaseDirective = /** @class */ (function () {
function MaskBaseDirective(_renderer, _elementRef, intl) {
var _this = this;
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(function (locale) { return _this.setLocale(locale); });
}
Object.defineProperty(MaskBaseDirective.prototype, "state", {
get: function () {
return this._state;
},
set: function (v) {
if (this._state !== v) {
this._state = v;
this.stateChange.emit(this._state); // Emitting event
}
},
enumerable: true,
configurable: true
});
MaskBaseDirective.prototype.updateState = function () {
//
};
MaskBaseDirective.prototype.processAndroid = function (txt) {
var res = this.currentRes();
// Possibly we have carriage position
var key = Keys.whichKeyHasBeenPressed(this.last_res.newValue, txt, this.last_res.selStart, res.selStart, this.last_res.selLength);
var r = this.processKey({
keyCode: -1,
key: key.code,
char: key.char,
shiftKey: false,
ctrlKey: false,
target: { selectionStart: this.last_res.selStart, selectionEnd: 0 },
preventDefault: function (_) { }
});
if (!r) {
this.setRes(this.last_res); // Reversing, value has not been accepted
}
this.android_behavior = false;
return;
};
MaskBaseDirective.prototype.doInput = function (txt) {
if (this.android_behavior) {
this.processAndroid(txt);
return;
}
// Thus we're trying to apply a mask to value entered
var masked = this._mask.applyMask(txt);
if (masked !== this._txtValue) {
this.setText(masked, true);
}
};
MaskBaseDirective.prototype.processKey = function (e) {
if (e.keyCode === 229 || e.keyCode === 0 || e.keyCode === undefined) {
// Android detected
this.android_behavior = true;
this.last_res = this.currentRes();
return;
}
var c = e.char;
if (c === undefined) {
c = e.key;
}
var selStart = e.target.selectionStart;
var selEnd = e.target.selectionEnd;
var 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
var 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
var 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
var 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
MaskBaseDirective.prototype.setRes = function (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);
};
MaskBaseDirective.prototype.currentRes = function () {
var 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
MaskBaseDirective.prototype.getRes = function (s, selStart, selEnd) {
var res = new MaskResult(s, MaskSectionAction.APPLY, 0);
res.selStart = selStart;
res.selLength = selEnd - selStart;
return res;
};
// Following method should be overridden
MaskBaseDirective.prototype.toModel = function () {
};
// Writing a text to control
MaskBaseDirective.prototype.setText = function (displayedValue, toModel) {
if (toModel === void 0) { toModel = true; }
// Displaying
this._txtValue = displayedValue;
this._renderer.setProperty(this._elementRef.nativeElement, 'value', this._txtValue);
// Sending to model
if (toModel) {
this.toModel();
}
};
MaskBaseDirective.prototype.setLocale = function (locale) {
this._mask.setLocale(locale);
};
MaskBaseDirective.prototype.ngOnDestroy = function () {
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);
return MaskBaseDirective;
}());
export { MaskBaseDirective };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFzay1iYXNlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B0cnVlLWRpcmVjdGl2ZS9ncmlkLyIsInNvdXJjZXMiOlsic3JjL21hc2svbWFzay1iYXNlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7RUFJRTtBQUNGLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsSUFBSSxFQUFXLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSXJFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBTW5HO0lBZ1BJLDJCQUFzQixTQUFvQixFQUFZLFdBQXVCLEVBQVksSUFBaUM7UUFBMUgsaUJBRUM7UUFGcUIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUFZLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQVksU0FBSSxHQUFKLElBQUksQ0FBNkI7UUE5T2xILFVBQUssR0FBc0IsRUFBRSxDQUFDO1FBQzlCLFVBQUssR0FBc0IsRUFBRSxDQUFDO1FBRXRDLHFCQUFxQjtRQUNYLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDTixVQUFLLEdBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUlsQyxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFHbkMsa0JBQWtCO1FBRWxCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztRQUc1QyxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRTNDLHNCQUFzQjtRQUNkLFdBQU0sR0FBYyxJQUFJLENBQUM7UUEyTi9CLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsSUFBSSxD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QUFqQixVQUFrQixjQUFzQixFQUFFLE9BQXVCO1FBQXZCLHdCQUFBLEVBQUEsY0FBdUI7UUFFL0QsYUFBYTtRQUNiLElBQUksQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFcEYsbUJBQW1CO1FBQ25CLElBQUksT0FBTyxFQUFFO1lBQ1gsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2hCO0lBQ0gsQ0FBQztJQUVTLHFDQUFTLEdBQW5CLFVBQW9CLE1BQWM7UUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELHVDQUFXLEdBQVg7UUFDRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDekMsQ0FBQztJQTlORDtRQURDLE1BQU0sQ0FBQyxhQUFhLENBQUM7OzBEQUNzQjtJQUc1QztRQURDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQzs7K0RBQ2dCO0lBbkJsQyxpQkFBaUI7UUFIN0IsU0FBUyxDQUFDO1lBQ1QsUUFBUSxFQUFFLGdCQUFnQjtTQUMzQixDQUFDO2lEQWlQbUMsU0FBUyxFQUF5QixVQUFVLEVBQWtCLDJCQUEyQjtPQWhQakgsaUJBQWlCLENBbVA3QjtJQUFELHdCQUFDO0NBQUEsQUFuUEQsSUFtUEM7U0FuUFksaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IEFsZWtzZXkgTWVsbmlrb3YsIFRydWUgRGlyZWN0aXZlIENvbXBhbnkuXHJcbiAqIEBsaW5rIGh0dHBzOi8vdHJ1ZWRpcmVjdGl2ZS5jb20vXHJcbiAqIEBsaWNlbnNlIE1JVFxyXG4qL1xyXG5pbXBvcnQgeyBPdXRwdXQsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgUmVuZGVyZXIyLCBFdmVudEVtaXR0ZXIsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXNrIH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5pbXBvcnQgeyBLZXlzLCBLZXlJbmZvIH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5pbXBvcnQgeyBNYXNrU2VjdGlvbkFjdGlvbiwgTWFza1Jlc3VsdCB9IGZyb20gJ0B0cnVlLWRpcmVjdGl2ZS9iYXNlJztcclxuaW1wb3J0IHsgTWFza1NldHRpbmdzIH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5pbXBvcnQgeyBNYXNrU3RhdGUgfSBmcm9tICdAdHJ1ZS1kaXJlY3RpdmUvYmFzZSc7XHJcblxyXG5pbXBvcnQgeyBJbnRlcm5hdGlvbmFsaXphdGlvblNlcnZpY2UgfSBmcm9tICcuLi9pbnRlcm5hdGlvbmFsaXphdGlvbi9pbnRlcm5hdGlvbmFsaXphdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTG9jYWxlIH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICd0cnVlLW1hc2stYmFzZSdcclxufSlcclxuZXhwb3J0IGNsYXNzIE1hc2tCYXNlRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuXHJcbiAgICBwcml2YXRlIF91bmRvOiBBcnJheTxNYXNrUmVzdWx0PiA9IFtdO1xyXG4gICAgcHJpdmF0ZSBfcmVkbzogQXJyYXk8TWFza1Jlc3VsdD4gPSBbXTtcclxuXHJcbiAgICAvLyBDdXJyZW50IHRleHQgdmFsdWVcclxuICAgIHByb3RlY3RlZCBfdHh0VmFsdWUgPSAnJztcclxuICAgIHByb3RlY3RlZCByZWFkb25seSBfbWFzazogTWFzayA9IG5ldyBNYXNrKCk7XHJcblxyXG4gICAgcHJpdmF0ZSBfbG9jYWxlU3Vic2NyaXB0aW9uOiBhbnk7XHJcblxyXG4gICAgcHJvdGVjdGVkIGFuZHJvaWRfYmVoYXZpb3IgPSBmYWxzZTtcclxuICAgIHByb3RlY3RlZCBsYXN0X3JlczogTWFza1Jlc3VsdDtcclxuXHJcbiAgICAvLyBPbiBzdGF0ZSBjaGFuZ2VcclxuICAgIEBPdXRwdXQoJ3N0YXRlQ2hhbmdlJylcclxuICAgIHN0YXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxNYXNrU3RhdGU+KCk7XHJcblxyXG4gICAgQE91dHB1dCgnbWFza1ZhbHVlQ2hhbmdlZCcpXHJcbiAgICBtYXNrVmFsdWVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gICAgLy8gRmV0Y2hpbmcgbWFzayBzdGF0ZVxyXG4gICAgcHJpdmF0ZSBfc3RhdGU6IE1hc2tTdGF0ZSA9IG51bGw7XHJcblxyXG4gICAgcHVibGljIGdldCBzdGF0ZSgpOiBNYXNrU3RhdGUge1xyXG4gICAgICByZXR1cm4gdGhpcy5fc3RhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBzdGF0ZSh2OiBNYXNrU3RhdGUpIHtcclxuICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSB2KSB7XHJcbiAgICAgICAgdGhpcy5fc3RhdGUgPSB2O1xyXG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2UuZW1pdCh0aGlzLl9zdGF0ZSk7IC8vIEVtaXR0aW5nIGV2ZW50XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgdXBkYXRlU3RhdGUoKSB7XHJcbiAgICAgIC8vXHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NBbmRyb2lkKHR4dDogYW55KTogdm9pZCB7XHJcblxyXG4gICAgICBjb25zdCByZXMgPSB0aGlzLmN1cnJlbnRSZXMoKTtcclxuXHJcbiAgICAgIC8vIFBvc3NpYmx5IHdlIGhhdmUgY2FycmlhZ2UgcG9zaXRpb25cclxuICAgICAgY29uc3Qga2V5OiBLZXlJbmZvID0gS2V5cy53aGljaEtleUhhc0JlZW5QcmVzc2VkKHRoaXMubGFzdF9yZXMubmV3VmFsdWUsIHR4dCxcclxuICAgICAgICAgIHRoaXMubGFzdF9yZXMuc2VsU3RhcnQsIHJlcy5zZWxTdGFydCwgdGhpcy5sYXN0X3Jlcy5zZWxMZW5ndGgpO1xyXG5cclxuICAgICAgY29uc3QgciA9IHRoaXMucHJvY2Vzc0tleShcclxuICAgICAgICB7XHJcbiAgICAgICAgICBrZXlDb2RlOiAtMSxcclxuICAgICAgICAgIGtleToga2V5LmNvZGUsXHJcbiAgICAgICAgICBjaGFyOiBrZXkuY2hhcixcclxuICAgICAgICAgIHNoaWZ0S2V5OiBmYWxzZSxcclxuICAgICAgICAgIGN0cmxLZXk6IGZhbHNlLFxyXG4gICAgICAgICAgdGFyZ2V0OiB7IHNlbGVjdGlvblN0YXJ0OiB0aGlzLmxhc3RfcmVzLnNlbFN0YXJ0LCBzZWxlY3Rpb25FbmQ6IDAgfSxcclxuICAgICAgICAgIHByZXZlbnREZWZhdWx0OiAoXzogYW55KSA9PiB7fVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKCFyKSB7XHJcbiAgICAgICAgdGhpcy5zZXRSZXModGhpcy5sYXN0X3Jlcyk7IC8vIFJldmVyc2luZywgdmFsdWUgaGFzIG5vdCBiZWVuIGFjY2VwdGVkXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuYW5kcm9pZF9iZWhhdmlvciA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGRvSW5wdXQodHh0OiBhbnkpIHtcclxuICAgICAgaWYgKHRoaXMuYW5kcm9pZF9iZWhhdmlvcikge1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc0FuZHJvaWQodHh0KTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFRodXMgd2UncmUgdHJ5aW5nIHRvIGFwcGx5IGEgbWFzayB0byB2YWx1ZSBlbnRlcmVkXHJcbiAgICAgIGNvbnN0IG1hc2tlZCA9IHRoaXMuX21hc2suYXBwbHlNYXNrKHR4dCk7XHJcbiAgICAgIGlmIChtYXNrZWQgIT09IHRoaXMuX3R4dFZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5zZXRUZXh0KG1hc2tlZCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcHJvY2Vzc0tleShlOiBhbnkpOiBib29sZWFuIHtcclxuXHJcbiAgICAgIGlmIChlLmtleUNvZGUgPT09IDIyOSB8fCBlLmtleUNvZGUgPT09IDAgfHwgZS5rZXlDb2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAvLyBBbmRyb2lkIGRldGVjdGVkXHJcbiAgICAgICAgdGhpcy5hbmRyb2lkX2JlaGF2aW9yID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmxhc3RfcmVzID0gdGhpcy5jdXJyZW50UmVzKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgYzogc3RyaW5nID0gZS5jaGFyO1xyXG4gICAgICBpZiAoYyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgYyA9IGUua2V5O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgc2VsU3RhcnQ6IG51bWJlciA9IGUudGFyZ2V0LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICBsZXQgc2VsRW5kOiBudW1iZXIgPSBlLnRhcmdldC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgIGxldCBzID0gdGhpcy5fdHh0VmFsdWU7XHJcblxyXG4gICAgICBpZiAoS2V5cy5pc0Z1bmN0aW9uYWwoZS5rZXlDb2RlKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlzLlRBQiB8fCBlLmtleUNvZGUgPT09IEtleXMuRVNDQVBFKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChlLmtleUNvZGUgPT09IEtleXMuSE9NRSB8fCBlLmtleUNvZGUgPT09IEtleXMuRU5EKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChlLnNoaWZ0S2V5ICYmIChlLmtleUNvZGUgPT09IEtleXMuREVMRVRFIHx8IGUua2V5Q29kZSA9PT0gS2V5cy5JTlNFUlQpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChlLmFsdEtleSAmJiAoZS5rZXlDb2RlID09PSBLZXlzLkRPV04gfHwgZS5rZXlDb2RlID09PSBLZXlzLlVQKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZS5jdHJsS2V5ICYmIGUua2V5Q29kZSA9PT0gS2V5cy5aKSB7XHJcbiAgICAgICAgLy8gVU5ET1xyXG4gICAgICAgIGNvbnN0IHVuZG9SZXMgPSB0aGlzLl91bmRvLnBvcCgpO1xyXG4gICAgICAgIGlmICh1bmRvUmVzKSB7XHJcbiAgICAgICAgICB0aGlzLl9yZWRvLnB1c2godGhpcy5nZXRSZXMocywgc2VsU3RhcnQsIHNlbEVuZCkpO1xyXG4gICAgICAgICAgdGhpcy5zZXRSZXModW5kb1Jlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChlLmN0cmxLZXkgJiYgZS5rZXlDb2RlID09PSBLZXlzLlkpIHtcclxuICAgICAgICAvLyBSRURPXHJcbiAgICAgICAgY29uc3QgcmVkb1JlcyA9IHRoaXMuX3JlZG8ucG9wKCk7XHJcbiAgICAgICAgaWYgKHJlZG9SZXMpIHtcclxuICAgICAgICAgIHRoaXMuX3VuZG8ucHVzaCh0aGlzLmdldFJlcyhzLCBzZWxTdGFydCwgc2VsRW5kKSk7XHJcbiAgICAgICAgICB0aGlzLnNldFJlcyhyZWRvUmVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8g0J7RgdGC0LDQu9GM0L3Ri9C1IEN0cmwrKiDQvdCw0YEg0L3QtSDQuNC90YLQtdGA0LXRgdGD0Y7RglxyXG4gICAgICBpZiAoZS5jdHJsS2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIElmIGV2ZXJ5dGhpbmcgaXMgc2VsZWN0ZWRcclxuICAgICAgaWYgKHNlbFN0YXJ0ID09PSAwICYmIHNlbEVuZCA9PT0gdGhpcy5fdHh0VmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5ERUxFVEUgfHwgZS5rZXlDb2RlID09PSBLZXlzLkJBQ0tTUEFDRSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiBBcnJvd0xlZnQga2V5IGhhcyBiZWVuIHByZXNzZWQsIHJlc3VsdCBzaG91bGQgZXF1YWwgdG8gcHJlc3Npbmcgb2YgSG9tZVxyXG4gICAgICAgIGlmIChlLmtleUNvZGUgPT09IEtleXMuTEVGVCkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlzLlJJR0hUKSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzZWxTdGFydCA9PT0gMCAmJiBzZWxFbmQgPT09IHRoaXMuX3R4dFZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgIHMgPSAnJztcclxuICAgICAgICBzZWxTdGFydCA9IDA7XHJcbiAgICAgICAgc2VsRW5kID0gMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gQXBwbHlpbmcgZXZlcnl0aGluZyB0aGF0J3MgbGVmdFxyXG4gICAgICBjb25zdCByZXM6IE1hc2tSZXN1bHQgPSB0aGlzLl9tYXNrLmFwcGx5S2V5QXRQb3MocywgZS5rZXlDb2RlLCBjLCBzZWxTdGFydCwgc2VsRW5kKTtcclxuICAgICAgaWYgKHJlcyAhPT0gbnVsbCAmJiByZXMuYWN0aW9uID09PSBNYXNrU2VjdGlvbkFjdGlvbi5BUFBMWSkge1xyXG4gICAgICAgIC8vIElmIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQgd2UnbGwgYWRkIGl0IHRvIFVORE8gc3RhY2tcclxuICAgICAgICBpZiAocmVzLm5ld1ZhbHVlICE9PSBzKSB7XHJcbiAgICAgICAgICB0aGlzLl91bmRvLnB1c2godGhpcy5nZXRSZXMocywgc2VsU3RhcnQsIHNlbEVuZCkpO1xyXG4gICAgICAgICAgdGhpcy5fcmVkbyA9IFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXRSZXMocmVzKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYW5kcm9pZF9iZWhhdmlvcikge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZXR0aW5nIHZhbHVlIGFuZCBjYXJyaWFnZSBwb3NpdGlvblxyXG4gICAgcHJvdGVjdGVkIHNldFJlcyhyZXM6IE1hc2tSZXN1bHQpIHtcclxuXHJcbiAgICAgIGlmICh0aGlzLmFuZHJvaWRfYmVoYXZpb3IpIHtcclxuICAgICAgICByZXMuc2VsTGVuZ3RoID0gMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zZXRUZXh0KHJlcy5uZXdWYWx1ZSk7XHJcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3NlbGVjdGlvblN0YXJ0JywgcmVzLnNlbFN0YXJ0KTtcclxuICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnc2VsZWN0aW9uRW5kJywgcmVzLnNlbFN0YXJ0ICsgcmVzLnNlbExlbmd0aCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGN1cnJlbnRSZXMoKSB7XHJcbiAgICAgIGNvbnN0IHJlcyA9IG5ldyBNYXNrUmVzdWx0KHRoaXMuX3R4dFZhbHVlLCBNYXNrU2VjdGlvbkFjdGlvbi5BUFBMWSwgMCk7XHJcbiAgICAgIHJlcy5zZWxTdGFydCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgcmVzLnNlbExlbmd0aCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25FbmQgLSByZXMuc2VsU3RhcnQ7XHJcbiAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmV0cmlldmluZyBjdXJyZW50IG1hc2sgdmFsdWUgYW5kIGNhcnJpYWdlIHBvc2l0aW9uXHJcbiAgICBwcm90ZWN0ZWQgZ2V0UmVzKHM6IHN0cmluZywgc2VsU3RhcnQ6IG51bWJlciwgc2VsRW5kOiBudW1iZXIpOiBNYXNrUmVzdWx0IHtcclxuICAgICAgY29uc3QgcmVzID0gbmV3IE1hc2tSZXN1bHQocywgTWFza1NlY3Rpb25BY3Rpb24uQVBQTFksIDApO1xyXG4gICAgICByZXMuc2VsU3RhcnQgPSBzZWxTdGFydDtcclxuICAgICAgcmVzLnNlbExlbmd0aCA9IHNlbEVuZCAtIHNlbFN0YXJ0O1xyXG4gICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEZvbGxvd2luZyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW5cclxuICAgIHByb3RlY3RlZCB0b01vZGVsKCk6IHZvaWQge1xyXG4gICAgICBcclxuICAgIH1cclxuXHJcbiAgICAvLyBXcml0aW5nIGEgdGV4dCB0byBjb250cm9sXHJcbiAgICBwcm90ZWN0ZWQgc2V0VGV4dChkaXNwbGF5ZWRWYWx1ZTogc3RyaW5nLCB0b01vZGVsOiBib29sZWFuID0gdHJ1ZSkge1xyXG5cclxuICAgICAgLy8gRGlzcGxheWluZ1xyXG4gICAgICB0aGlzLl90eHRWYWx1ZSA9IGRpc3BsYXllZFZhbHVlO1xyXG4gICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHRoaXMuX3R4dFZhbHVlKTtcclxuXHJcbiAgICAgIC8vIFNlbmRpbmcgdG8gbW9kZWxcclxuICAgICAgaWYgKHRvTW9kZWwpIHtcclxuICAgICAgICB0aGlzLnRvTW9kZWwoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzZXRMb2NhbGUobG9jYWxlOiBMb2NhbGUpIHtcclxuICAgICAgdGhpcy5fbWFzay5zZXRMb2NhbGUobG9jYWxlKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgdGhpcy5fbG9jYWxlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9yZW5kZXJlcjogUmVuZGVyZXIyLCBwcm90ZWN0ZWQgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHByb3RlY3RlZCBpbnRsOiBJbnRlcm5hdGlvbmFsaXphdGlvblNlcnZpY2UpIHtcclxuICAgICAgdGhpcy5fbG9jYWxlU3Vic2NyaXB0aW9uID0gdGhpcy5pbnRsLm9uTG9jYWxlQ2hhbmdlZC5zdWJzY3JpYmUobG9jYWxlID0+IHRoaXMuc2V0TG9jYWxlKGxvY2FsZSkpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==