ngx-form-validator-super
Version:
A super flexible and time saving Validation logic handeling directive for Angular Reactive forms.
227 lines • 32.1 kB
JavaScript
import { Injectable } from '@angular/core';
import { FormControl, FormArray, FormGroup } from '@angular/forms';
import { PanelLogic } from './panel-logic';
import * as i0 from "@angular/core";
import * as i1 from "./panel-logic";
export class ValidatorLogic {
constructor(panelLogic) {
this.panelLogic = panelLogic;
this.ValidationLabels = {};
}
GetAllControls(controls) {
let extractedControls = [];
for (let ctrl in controls) {
if (controls[ctrl] instanceof FormControl) {
controls[ctrl].name = ctrl;
extractedControls.push(controls[ctrl]);
// Setting control status to valid for elements thata are nto visible on UI
if (!controls[ctrl].nativeElement) {
controls[ctrl].errors = null;
controls[ctrl].status = 'VALID';
}
else if ((!document.body.contains(controls[ctrl].nativeElement))) {
controls[ctrl].setValue(null);
controls[ctrl].errors = null;
controls[ctrl].status = 'VALID';
}
else {
controls[ctrl].updateValueAndValidity({ emitEvent: false });
}
}
if (controls[ctrl] instanceof FormArray) {
extractedControls = [...extractedControls, ...this.GetAllControls(controls[ctrl].controls)];
}
if (controls[ctrl] instanceof FormGroup) {
extractedControls = [...extractedControls, ...this.GetAllControls(controls[ctrl].controls)];
}
}
return extractedControls;
}
ValidateControls(changedControl) {
try {
let allControls = this.GetAllControls(this.formControl.form.controls);
let controls = [];
let selectedControlIndex = -1;
let hasError = false;
if (changedControl) {
selectedControlIndex = allControls.findIndex(x => (x.nativeElement && x.nativeElement.isSameNode(changedControl)));
controls = allControls.map((x, index) => {
if (index != selectedControlIndex) {
return index;
}
else
return -1;
}).filter((x) => x != -1);
}
this.errorControl = null;
allControls.forEach((formControl, index) => {
if (formControl.nativeElement)
if ((!controls.includes(index) && formControl.nativeElement.type == "checkbox") || (selectedControlIndex > -1 && (!controls.includes(index) || (index == selectedControlIndex))) || ((selectedControlIndex == -1) && formControl.nativeElement.type != "checkbox")) {
this.AddRemoveErrorMsg(false, "", formControl.nativeElement);
// Show validation msg only when forms submits not when control value changes
if (!changedControl || index == selectedControlIndex) {
for (let errorName in formControl.errors) {
let erroObj = {};
erroObj[errorName] = formControl.errors[errorName];
hasError = true;
// if(!changedControl)
this.setErrorControl(formControl.nativeElement);
this.AddRemoveErrorMsg(true, erroObj, formControl.nativeElement);
}
}
controls.push(index);
}
});
if (!hasError) {
this.formControl['form'].status = 'VALID';
}
this.panelLogic.updateControlStatus(this.formControl, allControls);
if (this.errorControl && !changedControl) {
// this.toatser.error("Please fill the required details.", "Error !")
this.scrollTo(this.errorControl.ele);
}
return hasError;
}
catch (ex) {
console.error(ex);
}
}
setErrorControl(element) {
let yAxis = element.getBoundingClientRect().y;
if (!this.errorControl) {
this.errorControl = { ele: element, y: yAxis };
return;
}
if (this.errorControl.y > yAxis) {
this.errorControl = { ele: element, y: yAxis };
}
}
scrollTo(element) {
if (element) {
element.scrollIntoView({ behavior: "smooth", block: "center", inline: "nearest" });
let t = null;
let func = () => {
t = setTimeout(() => {
element.focus();
window.onscroll = null;
}, 100);
};
func();
window.onscroll = () => {
if (t) {
clearTimeout(t);
t = null;
}
func();
};
}
}
GetValidationType(ele) {
if (!ele.attributes["validationHint"]) {
return 1;
}
let validationType = ele.attributes["validationHint"].value;
if (validationType = "borderOnly") {
return 2;
}
return 1;
}
GetValidationContainer(ele) {
if (!ele.attributes["validationContainerId"]) {
return null;
}
return document.getElementById(ele.attributes["validationContainerId"].value) || null;
}
AddRemoveErrorMsg(isAdd, error, ele) {
if (!ele || !ele.parentElement) {
return;
}
let validationContainer = this.GetValidationContainer(ele);
let validationType = this.GetValidationType(ele);
let childs = [];
let errorName = error ? Object.keys(error)[0] : null;
let errorObj = error ? error[errorName] : null;
ele.classList.remove('_BrdrError');
if (validationContainer) {
if (validationContainer.childNodes.length > 0) {
childs = validationContainer.childNodes;
}
}
else {
childs = ele.parentElement.childNodes;
}
if (validationType == 2) {
ele.classList.remove('_BrdrError');
if (validationContainer) {
validationContainer.classList.remove('_BrdrError');
}
}
for (let i = 0; i < childs.length; i++) {
if (childs[i].classList && childs[i].classList.contains('_ErX')) {
childs[i].remove();
}
}
if (isAdd) {
let div = document.createElement('div');
if (validationType == 2) {
if (validationContainer) {
validationContainer.classList.add('_BrdrError');
}
else {
ele.classList.add('_BrdrError');
}
return;
}
ele.classList.add('_BrdrError');
div.classList.add('_ErX');
this.GetErrorMsg(errorName, errorLabel => {
if (errorLabel && (errorObj.hasOwnProperty('requiredLength') || errorObj.hasOwnProperty('max'))) {
errorLabel = errorLabel.replace('_', errorObj.requiredLength || errorObj.max);
}
div.innerHTML = ' <small class="ngx-validation-label " >' + errorLabel + '</small>';
// Adding validation msg to given container element
if (validationContainer) {
//If container has childs
if (validationContainer.childNodes.lenght > 0) {
validationContainer.children[validationContainer.children.length - 1].insertAdjacentElement('beforeend', div);
}
else {
// if container has no child
validationContainer.appendChild(div);
}
}
else {
// adding validation on from control it self
ele.parentElement.insertAdjacentElement("beforeend", div);
}
});
}
}
GetErrorMsg(errorCode, cb) {
let eCode = {
required: "This field is required.",
email: "Invalid email.",
number: "Invalid number",
max: "Maxlength exceeds",
minlength: "Minimum length of this field must be _ .",
invalidOfficerTitle: "Select valid Officer Title.",
requiredExpiryDate: "Please enter card's expiry date.",
inavlidExpiryDate: "Past date is not allowed",
phoneLength: "Phone number must be _ digits long.",
zipLength: "Zip must be _ digits long.",
};
cb(this.ValidationLabels[errorCode]);
}
TogglePanel() {
this.panelLogic.IsConsoleShow = !this.panelLogic.IsConsoleShow;
this.panelLogic.updateControlStatus(this.formControl, this.GetAllControls(this.formControl.form.controls));
}
}
ValidatorLogic.ɵprov = i0.ɵɵdefineInjectable({ factory: function ValidatorLogic_Factory() { return new ValidatorLogic(i0.ɵɵinject(i1.PanelLogic)); }, token: ValidatorLogic, providedIn: "root" });
ValidatorLogic.decorators = [
{ type: Injectable, args: [{ providedIn: 'root' },] }
];
ValidatorLogic.ctorParameters = () => [
{ type: PanelLogic }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLWxvZ2ljLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWZvcm0tdmFsaWRhdG9yL3NyYy9saWIvRGlyZWN0aXZlL3ZhbGlkYXRvci1sb2dpYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQUkzQyxNQUFNLE9BQU8sY0FBYztJQU16QixZQUFvQixVQUFxQjtRQUFyQixlQUFVLEdBQVYsVUFBVSxDQUFXO1FBSHpDLHFCQUFnQixHQUFLLEVBQUUsQ0FBQTtJQUdvQixDQUFDO0lBR3BDLGNBQWMsQ0FBQyxRQUFRO1FBRTdCLElBQUksaUJBQWlCLEdBQUcsRUFBRSxDQUFBO1FBQzFCLEtBQUssSUFBSSxJQUFJLElBQUksUUFBUSxFQUFFO1lBRXpCLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLFdBQVcsRUFBRTtnQkFDekMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7Z0JBQzNCLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtnQkFJcEMsMkVBQTJFO2dCQUMzRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsRUFBRztvQkFFbEMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7b0JBQzdCLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO2lCQUNqQztxQkFDSSxJQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxR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QkFBZ0I7WUFDdEIsTUFBTSxFQUFDLGdCQUFnQjtZQUN2QixHQUFHLEVBQUMsbUJBQW1CO1lBQ3ZCLFNBQVMsRUFBQywwQ0FBMEM7WUFDcEQsbUJBQW1CLEVBQUMsNkJBQTZCO1lBQ2pELGtCQUFrQixFQUFDLGtDQUFrQztZQUNyRCxpQkFBaUIsRUFBQywwQkFBMEI7WUFDNUMsV0FBVyxFQUFDLHFDQUFxQztZQUNqRCxTQUFTLEVBQUMsNEJBQTRCO1NBQ3pDLENBQUE7UUFFRCxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFFekMsQ0FBQztJQUVRLFdBQVc7UUFDaEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEdBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUM5RCxJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBRTVHLENBQUM7Ozs7WUFuVEYsVUFBVSxTQUFDLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQzs7O1lBSHRCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50UmVmLCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtQXJyYXksIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgUGFuZWxMb2dpYyB9IGZyb20gJy4vcGFuZWwtbG9naWMnO1xyXG5cclxuXHJcbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOidyb290J30pXHJcbmV4cG9ydCBjbGFzcyBWYWxpZGF0b3JMb2dpYyB7XHJcblxyXG4gIGZvcm1Db250cm9sOiBhbnk7XHJcbiAgVmFsaWRhdGlvbkxhYmVsczphbnk9e31cclxuICBlcnJvckNvbnRyb2w6YW55O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhbmVsTG9naWM6UGFuZWxMb2dpYyl7fVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBHZXRBbGxDb250cm9scyhjb250cm9scykge1xyXG5cclxuICAgIGxldCBleHRyYWN0ZWRDb250cm9scyA9IFtdXHJcbiAgICBmb3IgKGxldCBjdHJsIGluIGNvbnRyb2xzKSB7XHJcblxyXG4gICAgICBpZiAoY29udHJvbHNbY3RybF0gaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkge1xyXG4gICAgICAgIGNvbnRyb2xzW2N0cmxdLm5hbWUgPSBjdHJsO1xyXG4gICAgICAgIGV4dHJhY3RlZENvbnRyb2xzLnB1c2goY29udHJvbHNbY3RybF0pXHJcblxyXG5cclxuXHJcbiAgICAgICAgICAvLyBTZXR0aW5nIGNvbnRyb2wgc3RhdHVzIHRvIHZhbGlkIGZvciBlbGVtZW50cyB0aGF0YSBhcmUgbnRvIHZpc2libGUgb24gVUlcclxuICAgICAgICAgIGlmICghY29udHJvbHNbY3RybF0ubmF0aXZlRWxlbWVudCApIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnRyb2xzW2N0cmxdLmVycm9ycyA9IG51bGw7XHJcbiAgICAgICAgICAgIGNvbnRyb2xzW2N0cmxdLnN0YXR1cyA9ICdWQUxJRCc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmKCghZG9jdW1lbnQuYm9keS5jb250YWlucyhjb250cm9sc1tjdHJsXS5uYXRpdmVFbGVtZW50KSkpe1xyXG4gICAgICAgICAgICBjb250cm9sc1tjdHJsXS5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgICAgICAgY29udHJvbHNbY3RybF0uZXJyb3JzID0gbnVsbDtcclxuICAgICAgICAgICAgY29udHJvbHNbY3RybF0uc3RhdHVzID0gJ1ZBTElEJztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb250cm9sc1tjdHJsXS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjb250cm9sc1tjdHJsXSBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xyXG5cclxuICAgICAgICBleHRyYWN0ZWRDb250cm9scyA9IFsuLi5leHRyYWN0ZWRDb250cm9scywgLi4uIHRoaXMuR2V0QWxsQ29udHJvbHMoY29udHJvbHNbY3RybF0uY29udHJvbHMpXVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY29udHJvbHNbY3RybF0gaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcclxuXHJcbiAgICAgICAgZXh0cmFjdGVkQ29udHJvbHMgPSBbLi4uZXh0cmFjdGVkQ29udHJvbHMsIC4uLiB0aGlzLkdldEFsbENvbnRyb2xzKGNvbnRyb2xzW2N0cmxdLmNvbnRyb2xzKV1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBleHRyYWN0ZWRDb250cm9scztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBWYWxpZGF0ZUNvbnRyb2xzKGNoYW5nZWRDb250cm9sKSB7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGFsbENvbnRyb2xzID0gdGhpcy5HZXRBbGxDb250cm9scyh0aGlzLmZvcm1Db250cm9sLmZvcm0uY29udHJvbHMpO1xyXG4gICAgICBsZXQgY29udHJvbHMgPSBbXVxyXG4gICAgICBsZXQgc2VsZWN0ZWRDb250cm9sSW5kZXggPSAtMTtcclxuICAgICAgbGV0IGhhc0Vycm9yID1mYWxzZTtcclxuXHJcblxyXG4gICAgICBpZiAoY2hhbmdlZENvbnRyb2wpIHtcclxuICAgICAgICBzZWxlY3RlZENvbnRyb2xJbmRleCA9IGFsbENvbnRyb2xzLmZpbmRJbmRleCh4ID0+ICh4Lm5hdGl2ZUVsZW1lbnQgJiYgeC5uYXRpdmVFbGVtZW50LmlzU2FtZU5vZGUoY2hhbmdlZENvbnRyb2wpKSk7XHJcblxyXG4gICAgICAgIGNvbnRyb2xzID0gYWxsQ29udHJvbHMubWFwKCh4LCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGluZGV4ICE9IHNlbGVjdGVkQ29udHJvbEluZGV4KSB7IHJldHVybiBpbmRleCB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9KS5maWx0ZXIoKHgpID0+IHggIT0gLTEpXHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgICB0aGlzLmVycm9yQ29udHJvbD1udWxsXHJcbiAgICAgIGFsbENvbnRyb2xzLmZvckVhY2goKGZvcm1Db250cm9sLCBpbmRleCkgPT4ge1xyXG5cclxuICAgICAgICBpZiAoZm9ybUNvbnRyb2wubmF0aXZlRWxlbWVudClcclxuICAgICAgICAgIGlmICgoIWNvbnRyb2xzLmluY2x1ZGVzKGluZGV4KSAmJiBmb3JtQ29udHJvbC5uYXRpdmVFbGVtZW50LnR5cGUgPT0gXCJjaGVja2JveFwiKSB8fCAoc2VsZWN0ZWRDb250cm9sSW5kZXggPiAtMSAmJiAoIWNvbnRyb2xzLmluY2x1ZGVzKGluZGV4KSB8fCAoaW5kZXggPT0gc2VsZWN0ZWRDb250cm9sSW5kZXgpKSkgfHwgKChzZWxlY3RlZENvbnRyb2xJbmRleCA9PSAtMSkgJiYgZm9ybUNvbnRyb2wubmF0aXZlRWxlbWVudC50eXBlICE9IFwiY2hlY2tib3hcIikpIHtcclxuICAgICAgICAgICAgdGhpcy5BZGRSZW1vdmVFcnJvck1zZyhmYWxzZSwgXCJcIiwgZm9ybUNvbnRyb2wubmF0aXZlRWxlbWVudCk7XHJcblxyXG4gICAgICAgICAgICAvLyBTaG93IHZhbGlkYXRpb24gbXNnIG9ubHkgd2hlbiBmb3JtcyBzdWJtaXRzIG5vdCB3aGVuIGNvbnRyb2wgdmFsdWUgY2hhbmdlc1xyXG4gICAgICAgICAgICBpZiAoIWNoYW5nZWRDb250cm9sIHx8IGluZGV4ID09IHNlbGVjdGVkQ29udHJvbEluZGV4KSB7XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgZXJyb3JOYW1lIGluIGZvcm1Db250cm9sLmVycm9ycykge1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBlcnJvT2JqID0ge307XHJcbiAgICAgICAgICAgICAgICBlcnJvT2JqW2Vycm9yTmFtZV0gPSBmb3JtQ29udHJvbC5lcnJvcnNbZXJyb3JOYW1lXTtcclxuXHJcbiAgICAgICAgICAgICAgICBoYXNFcnJvcj0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBpZighY2hhbmdlZENvbnRyb2wpXHJcbiAgICAgICAgICAgICAgICAgdGhpcy5zZXRFcnJvckNvbnRyb2woZm9ybUNvbnRyb2wubmF0aXZlRWxlbWVudCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5BZGRSZW1vdmVFcnJvck1zZyh0cnVlLCBlcnJvT2JqLCBmb3JtQ29udHJvbC5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29udHJvbHMucHVzaChpbmRleCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH0pXHJcblxyXG4gICAgICBpZighaGFzRXJyb3Ipe1xyXG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2xbJ2Zvcm0nXS5zdGF0dXMgPSdWQUxJRCc7XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgdGhpcy5wYW5lbExvZ2ljLnVwZGF0ZUNvbnRyb2xTdGF0dXModGhpcy5mb3JtQ29udHJvbCxhbGxDb250cm9scyk7XHJcblxyXG5cclxuICAgICAgaWYgKHRoaXMuZXJyb3JDb250cm9sICYmICFjaGFuZ2VkQ29udHJvbCkge1xyXG5cclxuICAgICAgICAgIC8vIHRoaXMudG9hdHNlci5lcnJvcihcIlBsZWFzZSBmaWxsIHRoZSByZXF1aXJlZCBkZXRhaWxzLlwiLCBcIkVycm9yICFcIilcclxuICAgICAgICAgIHRoaXMuc2Nyb2xsVG8odGhpcy5lcnJvckNvbnRyb2wuZWxlKTtcclxuXHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgICByZXR1cm4gaGFzRXJyb3I7XHJcblxyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGV4KSB7XHJcblxyXG4gICAgICBjb25zb2xlLmVycm9yKGV4KVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0RXJyb3JDb250cm9sKGVsZW1lbnQpe1xyXG5cclxuICAgIGxldCB5QXhpcz0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS55XHJcblxyXG4gICAgaWYoIXRoaXMuZXJyb3JDb250cm9sKXtcclxuICAgICAgdGhpcy5lcnJvckNvbnRyb2wgPXsgIGVsZTogZWxlbWVudCx5OnlBeGlzfTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKCAgdGhpcy5lcnJvckNvbnRyb2wueT55QXhpcyl7XHJcbiAgICAgIHRoaXMuZXJyb3JDb250cm9sID17ICBlbGU6IGVsZW1lbnQseTp5QXhpc307XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSAgc2Nyb2xsVG8oZWxlbWVudCl7XHJcbiAgICBpZihlbGVtZW50KXtcclxuICAgICAgZWxlbWVudC5zY3JvbGxJbnRvVmlldyh7YmVoYXZpb3I6IFwic21vb3RoXCIsIGJsb2NrOiBcImNlbnRlclwiLCBpbmxpbmU6IFwibmVhcmVzdFwifSlcclxuICAgICAgbGV0IHQgPW51bGw7XHJcblxyXG4gICAgICBsZXQgZnVuYz0oKT0+e1xyXG4gICAgICAgIHQgPSBzZXRUaW1lb3V0KCgpPT57XHJcbiAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgICB3aW5kb3cub25zY3JvbGw9bnVsbDtcclxuICAgICAgICB9LDEwMClcclxuICAgICAgfVxyXG5cclxuICAgICAgZnVuYygpO1xyXG4gICAgICB3aW5kb3cub25zY3JvbGw9KCk9PntcclxuICAgICAgICBpZih0KXtcclxuICAgICAgICAgIGNsZWFyVGltZW91dCh0KTtcclxuICAgICAgICAgIHQ9bnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZnVuYygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIEdldFZhbGlkYXRpb25UeXBlKGVsZSkge1xyXG5cclxuICAgIGlmICghZWxlLmF0dHJpYnV0ZXNbXCJ2YWxpZGF0aW9uSGludFwiXSkge1xyXG5cclxuICAgICAgcmV0dXJuIDE7XHJcbiAgICB9XHJcbiAgICBsZXQgdmFsaWRhdGlvblR5cGUgPSBlbGUuYXR0cmlidXRlc1tcInZhbGlkYXRpb25IaW50XCJdLnZhbHVlO1xyXG4gICAgaWYgKHZhbGlkYXRpb25UeXBlID0gXCJib3JkZXJPbmx5XCIpIHtcclxuICAgICAgcmV0dXJuIDI7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIDE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIEdldFZhbGlkYXRpb25Db250YWluZXIoZWxlKSB7XHJcbiAgICBpZiAoIWVsZS5hdHRyaWJ1dGVzW1widmFsaWRhdGlvbkNvbnRhaW5lcklkXCJdKSB7XHJcblxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlLmF0dHJpYnV0ZXNbXCJ2YWxpZGF0aW9uQ29udGFpbmVySWRcIl0udmFsdWUpIHx8IG51bGxcclxuICB9XHJcblxyXG4gIHByaXZhdGUgQWRkUmVtb3ZlRXJyb3JNc2coaXNBZGQsIGVycm9yLCBlbGUpIHtcclxuXHJcbiAgICBpZiAoIWVsZSB8fCAhZWxlLnBhcmVudEVsZW1lbnQpIHsgcmV0dXJuOyB9XHJcblxyXG5cclxuICAgIGxldCB2YWxpZGF0aW9uQ29udGFpbmVyID0gdGhpcy5HZXRWYWxpZGF0aW9uQ29udGFpbmVyKGVsZSkgYXMgYW55O1xyXG4gICAgbGV0IHZhbGlkYXRpb25UeXBlID0gdGhpcy5HZXRWYWxpZGF0aW9uVHlwZShlbGUpO1xyXG4gICAgbGV0IGNoaWxkczogYW55W10gPSBbXTtcclxuICAgIGxldCBlcnJvck5hbWUgPSBlcnJvciA/IE9iamVjdC5rZXlzKGVycm9yKVswXSA6IG51bGw7XHJcbiAgICBsZXQgZXJyb3JPYmogPSBlcnJvciA/IGVycm9yW2Vycm9yTmFtZV0gOiBudWxsO1xyXG5cclxuICAgIGVsZS5jbGFzc0xpc3QucmVtb3ZlKCdfQnJkckVycm9yJyk7XHJcblxyXG4gICAgaWYgKHZhbGlkYXRpb25Db250YWluZXIpIHtcclxuXHJcbiAgICAgIGlmICh2YWxpZGF0aW9uQ29udGFpbmVyLmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNoaWxkcyA9IHZhbGlkYXRpb25Db250YWluZXIuY2hpbGROb2RlcztcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjaGlsZHMgPSBlbGUucGFyZW50RWxlbWVudC5jaGlsZE5vZGVzO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh2YWxpZGF0aW9uVHlwZSA9PSAyKSB7XHJcbiAgICAgIGVsZS5jbGFzc0xpc3QucmVtb3ZlKCdfQnJkckVycm9yJyk7XHJcblxyXG4gICAgICBpZiAodmFsaWRhdGlvbkNvbnRhaW5lcikge1xyXG4gICAgICAgIHZhbGlkYXRpb25Db250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnX0JyZHJFcnJvcicpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRzLmxlbmd0aDsgaSsrKSB7XHJcblxyXG4gICAgICBpZiAoY2hpbGRzW2ldLmNsYXNzTGlzdCAmJiBjaGlsZHNbaV0uY2xhc3NMaXN0LmNvbnRhaW5zKCdfRXJYJykpIHtcclxuICAgICAgICBjaGlsZHNbaV0ucmVtb3ZlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNBZGQpIHtcclxuXHJcbiAgICAgIGxldCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHJcbiAgICAgIGlmICh2YWxpZGF0aW9uVHlwZSA9PSAyKSB7XHJcblxyXG5cclxuICAgICAgICBpZiAodmFsaWRhdGlvbkNvbnRhaW5lcikge1xyXG4gICAgICAgICAgdmFsaWRhdGlvbkNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdfQnJkckVycm9yJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgZWxlLmNsYXNzTGlzdC5hZGQoJ19CcmRyRXJyb3InKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBlbGUuY2xhc3NMaXN0LmFkZCgnX0JyZHJFcnJvcicpO1xyXG4gICAgICBkaXYuY2xhc3NMaXN0LmFkZCgnX0VyWCcpXHJcblxyXG4gICAgICB0aGlzLkdldEVycm9yTXNnKGVycm9yTmFtZSwgZXJyb3JMYWJlbCA9PiB7XHJcblxyXG4gICAgICAgIGlmIChlcnJvckxhYmVsICYmIChlcnJvck9iai5oYXNPd25Qcm9wZXJ0eSgncmVxdWlyZWRMZW5ndGgnKSB8fCBlcnJvck9iai5oYXNPd25Qcm9wZXJ0eSgnbWF4JykpKSB7XHJcbiAgICAgICAgICBlcnJvckxhYmVsID0gZXJyb3JMYWJlbC5yZXBsYWNlKCdfJywgZXJyb3JPYmoucmVxdWlyZWRMZW5ndGggfHwgZXJyb3JPYmoubWF4KVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGRpdi5pbm5lckhUTUwgPSAnIDxzbWFsbCAgY2xhc3M9XCJuZ3gtdmFsaWRhdGlvbi1sYWJlbCBcIiA+JyArIGVycm9yTGFiZWwgKyAnPC9zbWFsbD4nO1xyXG5cclxuICAgICAgICAvLyBBZGRpbmcgdmFsaWRhdGlvbiBtc2cgdG8gZ2l2ZW4gY29udGFpbmVyIGVsZW1lbnRcclxuICAgICAgICBpZiAodmFsaWRhdGlvbkNvbnRhaW5lcikge1xyXG5cclxuICAgICAgICAgIC8vSWYgY29udGFpbmVyIGhhcyBjaGlsZHNcclxuICAgICAgICAgIGlmICh2YWxpZGF0aW9uQ29udGFpbmVyLmNoaWxkTm9kZXMubGVuZ2h0ID4gMCkge1xyXG4gICAgICAgICAgICB2YWxpZGF0aW9uQ29udGFpbmVyLmNoaWxkcmVuW3ZhbGlkYXRpb25Db250YWluZXIuY2hpbGRyZW4ubGVuZ3RoIC0gMV0uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdiZWZvcmVlbmQnLCBkaXYpO1xyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgLy8gaWYgY29udGFpbmVyIGhhcyBubyBjaGlsZFxyXG4gICAgICAgICAgICB2YWxpZGF0aW9uQ29udGFpbmVyLmFwcGVuZENoaWxkKGRpdik7XHJcblxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAvLyBhZGRpbmcgdmFsaWRhdGlvbiBvbiBmcm9tIGNvbnRyb2wgaXQgc2VsZlxyXG4gICAgICAgICAgZWxlLnBhcmVudEVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYmVmb3JlZW5kXCIsIGRpdik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSlcclxuXHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIEdldEVycm9yTXNnKGVycm9yQ29kZSxjYil7XHJcbiAgICBsZXQgZUNvZGU9e1xyXG4gICAgICAgIHJlcXVpcmVkOlwiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC5cIixcclxuICAgICAgICBlbWFpbDpcIkludmFsaWQgZW1haWwuXCIsXHJcbiAgICAgICAgbnVtYmVyOlwiSW52YWxpZCBudW1iZXJcIixcclxuICAgICAgICBtYXg6XCJNYXhsZW5ndGggZXhjZWVkc1wiLFxyXG4gICAgICAgIG1pbmxlbmd0aDpcIk1pbmltdW0gbGVuZ3RoIG9mIHRoaXMgZmllbGQgbXVzdCBiZSBfIC5cIixcclxuICAgICAgICBpbnZhbGlkT2ZmaWNlclRpdGxlOlwiU2VsZWN0IHZhbGlkIE9mZmljZXIgVGl0bGUuXCIsXHJcbiAgICAgICAgcmVxdWlyZWRFeHBpcnlEYXRlOlwiUGxlYXNlIGVudGVyIGNhcmQncyBleHBpcnkgZGF0ZS5cIixcclxuICAgICAgICBpbmF2bGlkRXhwaXJ5RGF0ZTpcIlBhc3QgZGF0ZSBpcyBub3QgYWxsb3dlZFwiLFxyXG4gICAgICAgIHBob25lTGVuZ3RoOlwiUGhvbmUgbnVtYmVyIG11c3QgYmUgXyBkaWdpdHMgbG9uZy5cIixcclxuICAgICAgICB6aXBMZW5ndGg6XCJaaXAgbXVzdCBiZSBfIGRpZ2l0cyBsb25nLlwiLFxyXG4gICAgfVxyXG5cclxuICAgIGNiKHRoaXMuVmFsaWRhdGlvbkxhYmVsc1tlcnJvckNvZGVdKTtcclxuXHJcbn1cclxuXHJcbiAgcHVibGljIFRvZ2dsZVBhbmVsKCl7XHJcbiAgICB0aGlzLnBhbmVsTG9naWMuSXNDb25zb2xlU2hvdyA9IXRoaXMucGFuZWxMb2dpYy5Jc0NvbnNvbGVTaG93O1xyXG4gICAgdGhpcy5wYW5lbExvZ2ljLnVwZGF0ZUNvbnRyb2xTdGF0dXModGhpcy5mb3JtQ29udHJvbCx0aGlzLkdldEFsbENvbnRyb2xzKHRoaXMuZm9ybUNvbnRyb2wuZm9ybS5jb250cm9scykpO1xyXG5cclxuICB9XHJcbn1cclxuIl19