@tarienna/ng-tri-state-checkbox
Version:
A TriStateCheckbox for Angular 9
222 lines • 24.3 kB
JavaScript
import { __decorate, __values } from "tslib";
import { Component, ElementRef, forwardRef, Input, OnDestroy, Renderer2, ViewChild, ViewEncapsulation } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { TriStateCheckboxState } from './tri-state-checkbox.types';
var NgTriStateCheckboxComponent = /** @class */ (function () {
function NgTriStateCheckboxComponent(renderer) {
this.renderer = renderer;
this.checkboxClass = 'tri-state-checkbox-default';
this._isDisabled = false;
this.controls = new Map();
this.currentState = TriStateCheckboxState.NONE;
this.onChanged = function (_) { };
this.onTouched = function () { };
}
NgTriStateCheckboxComponent_1 = NgTriStateCheckboxComponent;
NgTriStateCheckboxComponent.prototype.ngOnDestroy = function () {
this.controls.clear();
};
NgTriStateCheckboxComponent.prototype.registerOnChange = function (fn) {
if (typeof fn === 'function') {
this.onChanged = fn;
}
else {
this.onChanged = function (_) { };
}
};
NgTriStateCheckboxComponent.prototype.registerOnTouched = function (fn) {
if (typeof fn === 'function') {
this.onTouched = fn;
}
else {
this.onTouched = function () { };
}
};
NgTriStateCheckboxComponent.prototype.setDisabledState = function (isDisabled) {
var e_1, _a;
this._isDisabled = isDisabled;
try {
for (var _b = __values(this.controls.keys()), _c = _b.next(); !_c.done; _c = _b.next()) {
var currentControl = _c.value;
currentControl.setDisabled(isDisabled);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
};
Object.defineProperty(NgTriStateCheckboxComponent.prototype, "isDisabled", {
get: function () {
return this._isDisabled;
},
enumerable: true,
configurable: true
});
NgTriStateCheckboxComponent.prototype.addControl = function (control) {
var _this = this;
if (!!control) {
this.controls.set(control, control.readValue());
this.refreshState();
setTimeout(function () {
_this.emitValueChanged();
});
}
};
NgTriStateCheckboxComponent.prototype.removeControl = function (control) {
var _this = this;
this.controls.delete(control);
this.refreshState();
setTimeout(function () {
_this.emitValueChanged();
});
};
NgTriStateCheckboxComponent.prototype.changeControlValue = function (control, value) {
this.controls.set(control, value);
this.refreshState();
this.emitValueChanged();
};
NgTriStateCheckboxComponent.prototype.refreshState = function () {
this.currentState = this.getState();
this.refreshCheckboxState();
};
NgTriStateCheckboxComponent.prototype.getState = function () {
var e_2, _a;
var anyWasFalse = false;
var result = TriStateCheckboxState.NONE;
try {
for (var _b = __values(this.controls.values()), _c = _b.next(); !_c.done; _c = _b.next()) {
var currentValue = _c.value;
if (!!currentValue) {
result = TriStateCheckboxState.SOME;
}
if (!currentValue) {
anyWasFalse = true;
}
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_2) throw e_2.error; }
}
if (!anyWasFalse && result === TriStateCheckboxState.SOME) {
result = TriStateCheckboxState.ALL;
}
return result;
};
NgTriStateCheckboxComponent.prototype.onClick = function () {
var currentState = this.getState();
if (currentState === TriStateCheckboxState.SOME || currentState === TriStateCheckboxState.ALL) {
// gets unselected
this.writeAllControlValues(false);
this.currentState = TriStateCheckboxState.NONE;
}
else if (currentState === TriStateCheckboxState.NONE) {
this.writeAllControlValues(true);
this.currentState = TriStateCheckboxState.ALL;
}
this.refreshCheckboxState();
this.emitValueChanged();
};
NgTriStateCheckboxComponent.prototype.writeAllControlValues = function (nValue) {
var e_3, _a;
try {
for (var _b = __values(this.controls.keys()), _c = _b.next(); !_c.done; _c = _b.next()) {
var currentControl = _c.value;
if (currentControl) {
currentControl.writeValue(nValue);
}
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_3) throw e_3.error; }
}
};
NgTriStateCheckboxComponent.prototype.refreshCheckboxState = function () {
if (this.customCheckbox && this.customCheckbox.nativeElement) {
var checked = false;
var indeterminate = false;
if (this.currentState === TriStateCheckboxState.ALL) {
checked = true;
indeterminate = false;
}
else if (this.currentState === TriStateCheckboxState.SOME) {
checked = true;
indeterminate = true;
}
this.renderer.setProperty(this.customCheckbox.nativeElement, 'checked', checked);
// Browser Support for indeterminate: https://caniuse.com/#search=indeterminate
this.customCheckbox.nativeElement.indeterminate = indeterminate;
}
};
NgTriStateCheckboxComponent.prototype.emitValueChanged = function () {
var e_4, _a;
var values = [];
try {
for (var _b = __values(this.controls.values()), _c = _b.next(); !_c.done; _c = _b.next()) {
var value = _c.value;
if (!!value) {
values.push(value);
}
}
}
catch (e_4_1) { e_4 = { error: e_4_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_4) throw e_4.error; }
}
this.onChanged(values);
this.onTouched();
};
NgTriStateCheckboxComponent.prototype.reset = function () {
this.writeAllControlValues(false);
this.refreshState();
this.emitValueChanged();
};
NgTriStateCheckboxComponent.prototype.writeValue = function (obj) {
if (!!obj && obj.hasOwnProperty('length') && obj.length > 0) {
console.warn('It\'s currently not possible to set values. Maybe later there is a solution to do that.');
}
};
var NgTriStateCheckboxComponent_1;
NgTriStateCheckboxComponent.ctorParameters = function () { return [
{ type: Renderer2 }
]; };
__decorate([
Input()
], NgTriStateCheckboxComponent.prototype, "checkboxClass", void 0);
__decorate([
ViewChild('customCheckbox', { static: false })
], NgTriStateCheckboxComponent.prototype, "customCheckbox", void 0);
NgTriStateCheckboxComponent = NgTriStateCheckboxComponent_1 = __decorate([
Component({
selector: 'ng-tri-state-checkbox',
template: "<input type=\"checkbox\" [class]=\"checkboxClass\" (change)=\"onClick()\" #customCheckbox [disabled]=\"isDisabled\">\n",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return NgTriStateCheckboxComponent_1; }),
multi: true
}
],
exportAs: 'ngTriStateCheckbox',
encapsulation: ViewEncapsulation.None,
styles: [".tri-state-checkbox-default{height:1rem;width:1rem;display:block;position:relative;pointer-events:auto;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;background-image:none;border:1px solid #adb5bd;border-radius:.15rem;box-sizing:border-box}.tri-state-checkbox-default:checked:not(:indeterminate){background-color:#0099da;color:#fff}.tri-state-checkbox-default:checked:not(:indeterminate):after{content:\"\";display:block;position:absolute;top:-1px;left:-1px;width:1rem;height:1rem;pointer-events:none;color:#fff;background-color:#0099da;background-repeat:no-repeat;background-size:50% 50%;background-position:50%;background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\");border:1px solid #0099da;border-radius:.15rem}.tri-state-checkbox-default:indeterminate{background-color:#fff;color:#adb5bd;border-color:#0099da}.tri-state-checkbox-default:indeterminate:after{content:\"\";display:block;position:absolute;top:calc(.225rem - 1px);left:calc(.225rem - 1px);width:.55rem;height:.55rem;pointer-events:none;background-color:#0099da;border:1px solid #0099da;border-radius:.15rem}"]
})
], NgTriStateCheckboxComponent);
return NgTriStateCheckboxComponent;
}());
export { NgTriStateCheckboxComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctdHJpLXN0YXRlLWNoZWNrYm94LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B0YXJpZW5uYS9uZy10cmktc3RhdGUtY2hlY2tib3gvIiwic291cmNlcyI6WyJsaWIvbmctdHJpLXN0YXRlLWNoZWNrYm94LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3SCxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLHFCQUFxQixFQUFrRCxNQUFNLDRCQUE0QixDQUFDO0FBZ0JuSDtJQWdCSSxxQ0FBc0IsUUFBbUI7UUFBbkIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQWR6QyxrQkFBYSxHQUFHLDRCQUE0QixDQUFDO1FBRXJDLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBRTVCLGFBQVEsR0FBdUMsSUFBSSxHQUFHLEVBQWlDLENBQUM7UUFFeEYsaUJBQVksR0FBMEIscUJBQXFCLENBQUMsSUFBSSxDQUFDO1FBS2pFLGNBQVMsR0FBcUIsVUFBQyxDQUFNLElBQU0sQ0FBQyxDQUFDO1FBQzdDLGNBQVMsR0FBZSxjQUFPLENBQUMsQ0FBQztJQUVXLENBQUM7b0NBaEJwQywyQkFBMkI7SUFrQnBDLGlEQUFXLEdBQVg7UUFDSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxzREFBZ0IsR0FBaEIsVUFBaUIsRUFBTztRQUNwQixJQUFJLE9BQU8sRUFBRSxLQUFLLFVBQVUsRUFBRTtZQUMxQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztTQUN2QjthQUFNO1lBQ0gsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFDLENBQU0sSUFBTSxDQUFD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cUM7SUFTN0M7UUFEQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7dUVBQ3BCO0lBWGxCLDJCQUEyQjtRQWR2QyxTQUFTLENBQUM7WUFDUCxRQUFRLEVBQUUsdUJBQXVCO1lBQ2pDLGtJQUFxRDtZQUVyRCxTQUFTLEVBQUU7Z0JBQ1A7b0JBQ0ksT0FBTyxFQUFFLGlCQUFpQjtvQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxjQUFNLE9BQUEsNkJBQTJCLEVBQTNCLENBQTJCLENBQUM7b0JBQzFELEtBQUssRUFBRSxJQUFJO2lCQUNkO2FBQ0o7WUFDRCxRQUFRLEVBQUUsb0JBQW9CO1lBQzlCLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJOztTQUN4QyxDQUFDO09BQ1csMkJBQTJCLENBaUt2QztJQUFELGtDQUFDO0NBQUEsQUFqS0QsSUFpS0M7U0FqS1ksMkJBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBmb3J3YXJkUmVmLCBJbnB1dCwgT25EZXN0cm95LCBSZW5kZXJlcjIsIFZpZXdDaGlsZCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRyaVN0YXRlQ2hlY2tib3hTdGF0ZSwgSVRyaVN0YXRlQ2hlY2tib3hDb250cm9sLCBJVHJpQ2hlY2tib3hSZWdpc3RlciB9IGZyb20gJy4vdHJpLXN0YXRlLWNoZWNrYm94LnR5cGVzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduZy10cmktc3RhdGUtY2hlY2tib3gnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9uZy10cmktc3RhdGUtY2hlY2tib3guY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL25nLXRyaS1zdGF0ZS1jaGVja2JveC5jb21wb25lbnQuc2NzcyddLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5nVHJpU3RhdGVDaGVja2JveENvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZVxuICAgICAgICB9XG4gICAgXSxcbiAgICBleHBvcnRBczogJ25nVHJpU3RhdGVDaGVja2JveCcsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBOZ1RyaVN0YXRlQ2hlY2tib3hDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBJVHJpQ2hlY2tib3hSZWdpc3RlciB7XG4gICAgQElucHV0KClcbiAgICBjaGVja2JveENsYXNzID0gJ3RyaS1zdGF0ZS1jaGVja2JveC1kZWZhdWx0JztcblxuICAgIHByaXZhdGUgX2lzRGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIGNvbnRyb2xzOiBNYXA8SVRyaVN0YXRlQ2hlY2tib3hDb250cm9sLCBhbnk+ID0gbmV3IE1hcDxJVHJpU3RhdGVDaGVja2JveENvbnRyb2wsIGFueT4oKTtcblxuICAgIGN1cnJlbnRTdGF0ZTogVHJpU3RhdGVDaGVja2JveFN0YXRlID0gVHJpU3RhdGVDaGVja2JveFN0YXRlLk5PTkU7XG5cbiAgICBAVmlld0NoaWxkKCdjdXN0b21DaGVja2JveCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICAgIGN1c3RvbUNoZWNrYm94OiBFbGVtZW50UmVmO1xuXG4gICAgb25DaGFuZ2VkOiAoXzogYW55KSA9PiB2b2lkID0gKF86IGFueSkgPT4ge307XG4gICAgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVuZGVyZXI6IFJlbmRlcmVyMikge31cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbnRyb2xzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2VkID0gZm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlZCA9IChfOiBhbnkpID0+IHt9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vblRvdWNoZWQgPSAoKSA9PiB7fTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9pc0Rpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICAgICAgZm9yIChjb25zdCBjdXJyZW50Q29udHJvbCBvZiB0aGlzLmNvbnRyb2xzLmtleXMoKSkge1xuICAgICAgICAgICAgY3VycmVudENvbnRyb2wuc2V0RGlzYWJsZWQoaXNEaXNhYmxlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgaXNEaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgYWRkQ29udHJvbChjb250cm9sOiBJVHJpU3RhdGVDaGVja2JveENvbnRyb2wpOiB2b2lkIHtcbiAgICAgICAgaWYgKCEhY29udHJvbCkge1xuICAgICAgICAgICAgdGhpcy5jb250cm9scy5zZXQoY29udHJvbCwgY29udHJvbC5yZWFkVmFsdWUoKSk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hTdGF0ZSgpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0VmFsdWVDaGFuZ2VkKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbW92ZUNvbnRyb2woY29udHJvbDogSVRyaVN0YXRlQ2hlY2tib3hDb250cm9sKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZGVsZXRlKGNvbnRyb2wpO1xuICAgICAgICB0aGlzLnJlZnJlc2hTdGF0ZSgpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdFZhbHVlQ2hhbmdlZCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjaGFuZ2VDb250cm9sVmFsdWUoY29udHJvbDogSVRyaVN0YXRlQ2hlY2tib3hDb250cm9sLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuY29udHJvbHMuc2V0KGNvbnRyb2wsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoU3RhdGUoKTtcbiAgICAgICAgdGhpcy5lbWl0VmFsdWVDaGFuZ2VkKCk7XG4gICAgfVxuXG4gICAgcmVmcmVzaFN0YXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoQ2hlY2tib3hTdGF0ZSgpO1xuICAgIH1cblxuICAgIGdldFN0YXRlKCk6IFRyaVN0YXRlQ2hlY2tib3hTdGF0ZSB7XG4gICAgICAgIGxldCBhbnlXYXNGYWxzZSA9IGZhbHNlO1xuICAgICAgICBsZXQgcmVzdWx0OiBUcmlTdGF0ZUNoZWNrYm94U3RhdGUgPSBUcmlTdGF0ZUNoZWNrYm94U3RhdGUuTk9ORTtcblxuICAgICAgICBmb3IgKGNvbnN0IGN1cnJlbnRWYWx1ZSBvZiB0aGlzLmNvbnRyb2xzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBpZiAoISFjdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBUcmlTdGF0ZUNoZWNrYm94U3RhdGUuU09NRTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgYW55V2FzRmFsc2UgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFhbnlXYXNGYWxzZSAmJiByZXN1bHQgPT09IFRyaVN0YXRlQ2hlY2tib3hTdGF0ZS5TT01FKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBUcmlTdGF0ZUNoZWNrYm94U3RhdGUuQUxMO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBvbkNsaWNrKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLmdldFN0YXRlKCk7XG4gICAgICAgIGlmIChjdXJyZW50U3RhdGUgPT09IFRyaVN0YXRlQ2hlY2tib3hTdGF0ZS5TT01FIHx8IGN1cnJlbnRTdGF0ZSA9PT0gVHJpU3RhdGVDaGVja2JveFN0YXRlLkFMTCkge1xuICAgICAgICAgICAgLy8gZ2V0cyB1bnNlbGVjdGVkXG4gICAgICAgICAgICB0aGlzLndyaXRlQWxsQ29udHJvbFZhbHVlcyhmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IFRyaVN0YXRlQ2hlY2tib3hTdGF0ZS5OT05FO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRTdGF0ZSA9PT0gVHJpU3RhdGVDaGVja2JveFN0YXRlLk5PTkUpIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVBbGxDb250cm9sVmFsdWVzKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUgPSBUcmlTdGF0ZUNoZWNrYm94U3RhdGUuQUxMO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVmcmVzaENoZWNrYm94U3RhdGUoKTtcbiAgICAgICAgdGhpcy5lbWl0VmFsdWVDaGFuZ2VkKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlQWxsQ29udHJvbFZhbHVlcyhuVmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgZm9yIChjb25zdCBjdXJyZW50Q29udHJvbCBvZiB0aGlzLmNvbnRyb2xzLmtleXMoKSkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRDb250cm9sKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudENvbnRyb2wud3JpdGVWYWx1ZShuVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVmcmVzaENoZWNrYm94U3RhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmN1c3RvbUNoZWNrYm94ICYmIHRoaXMuY3VzdG9tQ2hlY2tib3gubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgbGV0IGNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBpbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50U3RhdGUgPT09IFRyaVN0YXRlQ2hlY2tib3hTdGF0ZS5BTEwpIHtcbiAgICAgICAgICAgICAgICBjaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFN0YXRlID09PSBUcmlTdGF0ZUNoZWNrYm94U3RhdGUuU09NRSkge1xuICAgICAgICAgICAgICAgIGNoZWNrZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGluZGV0ZXJtaW5hdGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmN1c3RvbUNoZWNrYm94Lm5hdGl2ZUVsZW1lbnQsICdjaGVja2VkJywgY2hlY2tlZCk7XG5cbiAgICAgICAgICAgIC8vIEJyb3dzZXIgU3VwcG9ydCBmb3IgaW5kZXRlcm1pbmF0ZTogaHR0cHM6Ly9jYW5pdXNlLmNvbS8jc2VhcmNoPWluZGV0ZXJtaW5hdGVcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tQ2hlY2tib3gubmF0aXZlRWxlbWVudC5pbmRldGVybWluYXRlID0gaW5kZXRlcm1pbmF0ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVtaXRWYWx1ZUNoYW5nZWQoKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHRoaXMuY29udHJvbHMudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGlmICghIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vbkNoYW5nZWQodmFsdWVzKTtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB9XG5cbiAgICByZXNldCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy53cml0ZUFsbENvbnRyb2xWYWx1ZXMoZmFsc2UpO1xuICAgICAgICB0aGlzLnJlZnJlc2hTdGF0ZSgpO1xuICAgICAgICB0aGlzLmVtaXRWYWx1ZUNoYW5nZWQoKTtcbiAgICB9XG5cbiAgICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICghIW9iaiAmJiBvYmouaGFzT3duUHJvcGVydHkoJ2xlbmd0aCcpICYmIG9iai5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0l0XFwncyBjdXJyZW50bHkgbm90IHBvc3NpYmxlIHRvIHNldCB2YWx1ZXMuIE1heWJlIGxhdGVyIHRoZXJlIGlzIGEgc29sdXRpb24gdG8gZG8gdGhhdC4nKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==