tibas-form-json-generator
Version:
Fully configured form generator via JSON data with a custom template for each attribute + onChange events.
403 lines • 47.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/dynamic-template/dynamic-template.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Compiler, Component, EventEmitter, Injector, Input, NgModule, NgModuleRef, Output, ViewChild, ViewContainerRef } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { AttributeModel } from '../models/attribute.model';
import { ItemModel } from '../models/item.model';
import { ParentFunctionEnum } from '../models/parent.function.enum';
import { FormModel } from '../models/form.model';
import { ReferencesService } from '../services/references.service';
import { AttributeSourceTypeEnum } from '../models/attribute-sourceType.enum';
/**
* Created by TIBAS-Mohammed on 2020-07-6.
*/
export class DynamicTemplateComponent {
/**
* @param {?} compiler
* @param {?} injector
* @param {?} moduleRef
* @param {?} referencesService
*/
constructor(compiler, injector, moduleRef, referencesService) {
this.compiler = compiler;
this.injector = injector;
this.moduleRef = moduleRef;
this.referencesService = referencesService;
this.changedtrigger = new EventEmitter();
this.script = '';
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.createComponentFromRaw(this.template, this.attribute, this.item, this.headerOrFooter, this.position);
}
/**
* @private
* @param {?} template
* @param {?} attribute
* @param {?} item
* @param {?} headerOrFooter
* @param {?} position
* @return {?}
*/
createComponentFromRaw(template, attribute, item, headerOrFooter, position) {
if (!template) {
return;
}
/** @type {?} */
const styles = [];
if (attribute.onChange) {
template = template.split('onChange-Function').join(attribute.onChange);
}
else {
template = template.split('(change)="onChange-Function"').join('');
}
if (attribute.hiddenlevels) {
if (this.level && attribute.hiddenlevels.length > 0) {
attribute.hidden = attribute.hiddenlevels.indexOf(this.level) > -1;
if (attribute.hidden) {
attribute.required = false;
}
}
}
if (attribute && this.mode === 'EDIT') {
attribute.required = false;
}
if ((attribute.typeSource === AttributeSourceTypeEnum.CALCULATED_ENTRY && item)
|| this.mode === 'READ' || this.mode === 'READWITHTAB') {
attribute.disable = true;
attribute.required = false;
}
/**
* @return {?}
*/
function TmpCmpConstructor() {
this.attribute = attribute;
this.item = item;
this.reloadData = (/**
* @param {?} refTable
* @param {?} apiUrl
* @return {?}
*/
(refTable, apiUrl) => {
if (position !== 'BODY' && headerOrFooter !== null && headerOrFooter !== undefined
&& (headerOrFooter.header.length > 0 || headerOrFooter.footer.length > 0)
&& attribute.value && refTable && apiUrl) {
/** @type {?} */
let id;
attribute.refValues.forEach((/**
* @param {?} value
* @return {?}
*/
value => {
if (value.label === attribute.value) {
id = value.id;
}
}));
if (id) {
ReferencesService.getData(apiUrl + '/' + id).subscribe((/**
* @param {?} response
* @return {?}
*/
response => {
/** @type {?} */
const atts = [];
headerOrFooter.header.forEach((/**
* @param {?} attr
* @return {?}
*/
attr => {
if (attr.refTable === refTable) {
atts.push(attr);
}
}));
headerOrFooter.footer.forEach((/**
* @param {?} attr
* @return {?}
*/
attr => {
if (attr.refTable === refTable) {
atts.push(attr);
}
}));
if (atts.length > 0) {
atts.forEach((/**
* @param {?} att
* @return {?}
*/
att => {
att.refValues = [];
att.value = '';
if (response['data'] && response['data'].length > 0) {
att.refValues = response['data'];
}
}));
}
}));
}
}
});
}
/** @type {?} */
const tmpCmp = Component({ template, styles })(new TmpCmpConstructor().constructor);
/** @type {?} */
const tmpModule = NgModule({
imports: [CommonModule, FormsModule, ReactiveFormsModule],
declarations: [tmpCmp],
providers: [ReferencesService]
})(class {
});
this.compiler.compileModuleAndAllComponentsAsync(tmpModule)
.then((/**
* @param {?} factories
* @return {?}
*/
(factories) => {
/** @type {?} */
const f = factories.componentFactories[0];
this.cmpRef = f.create(this.injector, [], null, this.moduleRef);
this.cmpRef.instance.name = 'tibas-dynamic-component';
this.valueITtempl.insert(this.cmpRef.hostView);
this.changedtrigger.emit(true);
if (attribute.typeSource === AttributeSourceTypeEnum.CALCULATED_ENTRY && item) {
this.script = ' $(document).ready(function(){ \n';
if (attribute.forumlaItems && attribute.forumlaItems.function && item.children && item.children.length > 0) {
/** @type {?} */
let func = ' \n';
item.children.forEach((/**
* @param {?} child
* @return {?}
*/
child => {
this.script += '$("#' + child.code + '_' + attribute.code + '").change(' + item.code + '_' + attribute.code + '); \n';
if (attribute.forumlaItems.function === ParentFunctionEnum.SUM) {
func += 'if ($("#' + child.code + '_' + attribute.code + '").val()) {\n' +
'var val = parseInt($("#' + child.code + '_' + attribute.code + '").val(),10);\n' +
'finalValue += (!isNaN(val) ? val : 0);\n' +
'}\n';
}
if (attribute.forumlaItems.function === ParentFunctionEnum.AVG) {
func += 'if ($("#' + child.code + '_' + attribute.code + '").val()) {\n' +
'var val = parseInt($("#' + child.code + '_' + attribute.code + '").val(),10);\n' +
'finalValue += (!isNaN(val) ? val : 0);\n' +
'}\n';
}
if (attribute.forumlaItems.function === ParentFunctionEnum.MULTIP) {
func += 'if ($("#' + child.code + '_' + attribute.code + '").val()) {\n' +
'var val = parseInt($("#' + child.code + '_' + attribute.code + '").val(),10);\n' +
'finalValue = finalValue * (!isNaN(val) ? val : 0);\n' +
'}\n';
}
}));
/** @type {?} */
let finalValueVar = '';
/** @type {?} */
let avgFinalValue = '';
if (attribute.forumlaItems.function === ParentFunctionEnum.SUM) {
finalValueVar = 'var finalValue = 0;';
}
if (attribute.forumlaItems.function === ParentFunctionEnum.AVG) {
finalValueVar = 'var finalValue = 0;';
avgFinalValue = ' finalValue = finalValue/' + item.children.length + '\n';
}
if (attribute.forumlaItems.function === ParentFunctionEnum.MULTIP) {
finalValueVar = 'var finalValue = 1;';
}
/** @type {?} */
const calledFunct = ' function ' + item.code + '_' + attribute.code + '(){ \n' +
' ' + finalValueVar + ' \n' +
' ' + func + ' \n' +
' ' + avgFinalValue + ' \n' +
' $("#' + item.code + '_' + attribute.code + '").val(finalValue);\n' +
' $("#' + item.code + '_' + attribute.code + '").trigger("change");\n' +
' }';
this.script += ' \n ' + calledFunct + ' \n ';
}
else if (attribute.forumlaAttribute && attribute.forumlaAttribute.depends.length > 0 && attribute.forumlaAttribute.function) {
/** @type {?} */
let functionReplaced = attribute.forumlaAttribute.function;
attribute.forumlaAttribute.depends.forEach((/**
* @param {?} depend
* @return {?}
*/
depend => {
this.script += '$("#' + item.code + '_' + depend + '").change(function(){ \n';
functionReplaced = functionReplaced.split(depend).join(item.code + '_' + depend);
}));
functionReplaced = functionReplaced.split(attribute.code).join(item.code + '_' + attribute.code);
this.script += functionReplaced + '\n ';
this.script += '$("#' + item.code + '_' + attribute.code + '").trigger("change");\n }); \n';
}
this.script += ' }); ';
/** @type {?} */
const tjs = document.createElement('script');
tjs.innerHTML = this.script;
this.valueITtempl.element.nativeElement.appendChild(tjs);
}
// Required
if (attribute.mandatory && this.mode === 'VIEW') {
if (attribute.mandatory.depends.length > 0 && attribute.mandatory.function) {
this.script = ' $(document).ready(function(){ \n';
/** @type {?} */
let functionReplaced = attribute.mandatory.function;
/** @type {?} */
let idElement = '';
if (this.position === 'BODY') {
idElement = item.code + '_' + attribute.code;
attribute.mandatory.depends.forEach((/**
* @param {?} depend
* @return {?}
*/
depend => {
this.script += '$("#' + item.code + '_' + depend + '").change(RequiredFunc_' + idElement + '); \n';
functionReplaced = functionReplaced.split(depend).join(item.code + '_' + depend);
}));
functionReplaced = functionReplaced.split(attribute.code).join(item.code + '_' + attribute.code);
}
if (this.position === 'HEADER' || this.position === 'FOOTER') {
idElement = attribute.code;
attribute.mandatory.depends.forEach((/**
* @param {?} depend
* @return {?}
*/
depend => {
this.script += '$("#' + depend + '").change(RequiredFunc_' + idElement + '); \n';
}));
}
this.script += ' function RequiredFunc_' + idElement + '(){ \n';
this.script += 'if(' + functionReplaced + '){ \n';
this.script += '$("#' + idElement + '").prop("required",true); \n';
this.script += ' } else {\n';
this.script += '$("#' + idElement + '").prop("required",false); \n';
this.script += ' } \n' +
' $("#' + idElement + '").trigger("change");\n}\n' +
'$("#' + idElement + '").change(function(){ \n' +
'if($(this).prop(\'required\')){\n' +
' if ($(this).val()==\'\'){\n' +
' if ($(this).hasClass("ng-valid")){\n' +
' $(this).removeClass("ng-valid");\n' +
' }\n' +
' if (!$(this).hasClass("ng-invalid")){\n' +
' $(this).addClass("ng-invalid");\n' +
' }\n' +
'\n' +
' } else {\n' +
' if ($(this).hasClass("ng-invalid")){\n' +
' $(this).removeClass("ng-invalid");\n' +
' }\n' +
' if (!$(this).hasClass("ng-valid")){\n' +
' $(this).addClass("ng-valid");\n' +
' }\n' +
'}\n' +
' } else {\n' +
' if ($(this).hasClass("ng-invalid")){\n' +
' $(this).removeClass("ng-invalid");\n' +
' }\n' +
' if (!$(this).hasClass("ng-valid")){\n' +
' $(this).addClass("ng-valid");\n' +
' }\n' +
' }\n' +
'});\n';
this.script += ' }); \n';
/** @type {?} */
const tjss = document.createElement('script');
tjss.innerHTML = this.script;
this.valueITtempl.element.nativeElement.appendChild(tjss);
}
}
}));
}
/**
* @return {?}
*/
ngOnDestroy() {
this.changedtrigger.emit(true);
if (this.cmpRef) {
this.cmpRef.destroy();
}
}
}
DynamicTemplateComponent.decorators = [
{ type: Component, args: [{
selector: '[dynamic-template]',
template: `
<div #valueITtempl></div>
`
}] }
];
/** @nocollapse */
DynamicTemplateComponent.ctorParameters = () => [
{ type: Compiler },
{ type: Injector },
{ type: NgModuleRef },
{ type: ReferencesService }
];
DynamicTemplateComponent.propDecorators = {
valueITtempl: [{ type: ViewChild, args: ['valueITtempl', { static: false, read: ViewContainerRef },] }],
template: [{ type: Input }],
attribute: [{ type: Input }],
item: [{ type: Input }],
headerOrFooter: [{ type: Input }],
position: [{ type: Input }],
level: [{ type: Input }],
mode: [{ type: Input }],
changedtrigger: [{ type: Output }]
};
if (false) {
/** @type {?} */
DynamicTemplateComponent.prototype.valueITtempl;
/** @type {?} */
DynamicTemplateComponent.prototype.template;
/** @type {?} */
DynamicTemplateComponent.prototype.attribute;
/** @type {?} */
DynamicTemplateComponent.prototype.item;
/** @type {?} */
DynamicTemplateComponent.prototype.headerOrFooter;
/** @type {?} */
DynamicTemplateComponent.prototype.position;
/** @type {?} */
DynamicTemplateComponent.prototype.level;
/** @type {?} */
DynamicTemplateComponent.prototype.mode;
/** @type {?} */
DynamicTemplateComponent.prototype.changedtrigger;
/** @type {?} */
DynamicTemplateComponent.prototype.script;
/**
* @type {?}
* @private
*/
DynamicTemplateComponent.prototype.cmpRef;
/**
* @type {?}
* @private
*/
DynamicTemplateComponent.prototype.reloadData;
/**
* @type {?}
* @private
*/
DynamicTemplateComponent.prototype.compiler;
/**
* @type {?}
* @private
*/
DynamicTemplateComponent.prototype.injector;
/**
* @type {?}
* @private
*/
DynamicTemplateComponent.prototype.moduleRef;
/**
* @type {?}
* @private
*/
DynamicTemplateComponent.prototype.referencesService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy10ZW1wbGF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly90aWJhcy1mb3JtLWpzb24tZ2VuZXJhdG9yLyIsInNvdXJjZXMiOlsibGliL2R5bmFtaWMtdGVtcGxhdGUvZHluYW1pYy10ZW1wbGF0ZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBRUwsUUFBUSxFQUNSLFNBQVMsRUFFVCxZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFDTCxRQUFRLEVBQ1IsV0FBVyxFQUVYLE1BQU0sRUFDTixTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsV0FBVyxFQUFFLG1CQUFtQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDL0MsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0scUNBQXFDLENBQUM7Ozs7QUFXNUUsTUFBTSxPQUFPLHdCQUF3Qjs7Ozs7OztJQW1DbkMsWUFBb0IsUUFBa0IsRUFDbEIsUUFBa0IsRUFDbEIsU0FBMkIsRUFDM0IsaUJBQW9DO1FBSHBDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBWnhELG1CQUFjLEdB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dXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBpbGVyLFxuICBDb21wb25lbnQsXG4gIENvbXBvbmVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE5nTW9kdWxlLFxuICBOZ01vZHVsZVJlZixcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q29tbW9uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtBdHRyaWJ1dGVNb2RlbH0gZnJvbSAnLi4vbW9kZWxzL2F0dHJpYnV0ZS5tb2RlbCc7XG5pbXBvcnQge0l0ZW1Nb2RlbH0gZnJvbSAnLi4vbW9kZWxzL2l0ZW0ubW9kZWwnO1xuaW1wb3J0IHtQYXJlbnRGdW5jdGlvbkVudW19IGZyb20gJy4uL21vZGVscy9wYXJlbnQuZnVuY3Rpb24uZW51bSc7XG5pbXBvcnQge0Zvcm1Nb2RlbH0gZnJvbSAnLi4vbW9kZWxzL2Zvcm0ubW9kZWwnO1xuaW1wb3J0IHtSZWZlcmVuY2VzU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvcmVmZXJlbmNlcy5zZXJ2aWNlJztcbmltcG9ydCB7QXR0cmlidXRlU291cmNlVHlwZUVudW19IGZyb20gJy4uL21vZGVscy9hdHRyaWJ1dGUtc291cmNlVHlwZS5lbnVtJztcblxuLyoqXG4gKiBDcmVhdGVkIGJ5IFRJQkFTLU1vaGFtbWVkIG9uIDIwMjAtMDctNi5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnW2R5bmFtaWMtdGVtcGxhdGVdJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2ICN2YWx1ZUlUdGVtcGw+PC9kaXY+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY1RlbXBsYXRlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZCgndmFsdWVJVHRlbXBsJywge3N0YXRpYzogZmFsc2UsIHJlYWQ6IFZpZXdDb250YWluZXJSZWZ9KVxuICB2YWx1ZUlUdGVtcGw6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgQElucHV0KClcbiAgdGVtcGxhdGU6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBhdHRyaWJ1dGU6IEF0dHJpYnV0ZU1vZGVsO1xuXG4gIEBJbnB1dCgpXG4gIGl0ZW06IEl0ZW1Nb2RlbDtcblxuICBASW5wdXQoKVxuICBoZWFkZXJPckZvb3RlcjogRm9ybU1vZGVsO1xuXG4gIEBJbnB1dCgpXG4gIHBvc2l0aW9uOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgbGV2ZWw6IG51bWJlcjtcblxuICBASW5wdXQoKVxuICBtb2RlOiBzdHJpbmc7XG5cbiAgQE91dHB1dCgpXG4gIGNoYW5nZWR0cmlnZ2VyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIHNjcmlwdCA9ICcnO1xuXG4gIHByaXZhdGUgY21wUmVmOiBDb21wb25lbnRSZWY8YW55PjtcblxuICBwcml2YXRlIHJlbG9hZERhdGE6ICgpID0+IHZvaWQ7XG5cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbXBpbGVyOiBDb21waWxlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgICAgICAgIHByaXZhdGUgbW9kdWxlUmVmOiBOZ01vZHVsZVJlZjxhbnk+LFxuICAgICAgICAgICAgICBwcml2YXRlIHJlZmVyZW5jZXNTZXJ2aWNlOiBSZWZlcmVuY2VzU2VydmljZVxuICApIHtcblxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuY3JlYXRlQ29tcG9uZW50RnJvbVJhdyh0aGlzLnRlbXBsYXRlLCB0aGlzLmF0dHJpYnV0ZSwgdGhpcy5pdGVtLCB0aGlzLmhlYWRlck9yRm9vdGVyLCB0aGlzLnBvc2l0aW9uKTtcbiAgfVxuXG5cbiAgcHJpdmF0ZSBjcmVhdGVDb21wb25lbnRGcm9tUmF3KHRlbXBsYXRlOiBzdHJpbmcsIGF0dHJpYnV0ZTogQXR0cmlidXRlTW9kZWwsIGl0ZW06IEl0ZW1Nb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlck9yRm9vdGVyOiBGb3JtTW9kZWwsIHBvc2l0aW9uOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRlbXBsYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN0eWxlcyA9IFtdO1xuICAgIGlmIChhdHRyaWJ1dGUub25DaGFuZ2UpIHtcbiAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUuc3BsaXQoJ29uQ2hhbmdlLUZ1bmN0aW9uJykuam9pbihhdHRyaWJ1dGUub25DaGFuZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnNwbGl0KCcoY2hhbmdlKT1cIm9uQ2hhbmdlLUZ1bmN0aW9uXCInKS5qb2luKCcnKTtcbiAgICB9XG4gICAgaWYgKGF0dHJpYnV0ZS5oaWRkZW5sZXZlbHMpIHtcbiAgICAgIGlmICh0aGlzLmxldmVsICYmIGF0dHJpYnV0ZS5oaWRkZW5sZXZlbHMubGVuZ3RoID4gMCkge1xuICAgICAgICBhdHRyaWJ1dGUuaGlkZGVuID0gYXR0cmlidXRlLmhpZGRlbmxldmVscy5pbmRleE9mKHRoaXMubGV2ZWwpID4gLTE7XG4gICAgICAgIGlmIChhdHRyaWJ1dGUuaGlkZGVuKSB7XG4gICAgICAgICAgYXR0cmlidXRlLnJlcXVpcmVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGF0dHJpYnV0ZSAmJiB0aGlzLm1vZGUgPT09ICdFRElUJykge1xuICAgICAgYXR0cmlidXRlLnJlcXVpcmVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKChhdHRyaWJ1dGUudHlwZVNvdXJjZSA9PT0gQXR0cmlidXRlU291cmNlVHlwZUVudW0uQ0FMQ1VMQVRFRF9FTlRSWSAmJiBpdGVtKVxuICAgICAgfHwgdGhpcy5tb2RlID09PSAnUkVBRCcgfHwgdGhpcy5tb2RlID09PSAnUkVBRFdJVEhUQUInKSB7XG4gICAgICBhdHRyaWJ1dGUuZGlzYWJsZSA9IHRydWU7XG4gICAgICBhdHRyaWJ1dGUucmVxdWlyZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBUbXBDbXBDb25zdHJ1Y3RvcigpIHtcbiAgICAgIHRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlO1xuICAgICAgdGhpcy5pdGVtID0gaXRlbTtcblxuICAgICAgdGhpcy5yZWxvYWREYXRhID0gKHJlZlRhYmxlOiBzdHJpbmcsIGFwaVVybDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChwb3NpdGlvbiAhPT0gJ0JPRFknICYmIGhlYWRlck9yRm9vdGVyICE9PSBudWxsICYmIGhlYWRlck9yRm9vdGVyICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAmJiAoaGVhZGVyT3JGb290ZXIuaGVhZGVyLmxlbmd0aCA+IDAgfHwgaGVhZGVyT3JGb290ZXIuZm9vdGVyLmxlbmd0aCA+IDApXG4gICAgICAgICAgJiYgYXR0cmlidXRlLnZhbHVlICYmIHJlZlRhYmxlICYmIGFwaVVybCkge1xuICAgICAgICAgIGxldCBpZDogbnVtYmVyO1xuICAgICAgICAgIGF0dHJpYnV0ZS5yZWZWYWx1ZXMuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICBpZiAodmFsdWUubGFiZWwgPT09IGF0dHJpYnV0ZS52YWx1ZSkge1xuICAgICAgICAgICAgICBpZCA9IHZhbHVlLmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgUmVmZXJlbmNlc1NlcnZpY2UuZ2V0RGF0YShhcGlVcmwgKyAnLycgKyBpZCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgYXR0czogQXR0cmlidXRlTW9kZWxbXSA9IFtdO1xuICAgICAgICAgICAgICBoZWFkZXJPckZvb3Rlci5oZWFkZXIuZm9yRWFjaChhdHRyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYXR0ci5yZWZUYWJsZSA9PT0gcmVmVGFibGUpIHtcbiAgICAgICAgICAgICAgICAgIGF0dHMucHVzaChhdHRyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBoZWFkZXJPckZvb3Rlci5mb290ZXIuZm9yRWFjaChhdHRyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYXR0ci5yZWZUYWJsZSA9PT0gcmVmVGFibGUpIHtcbiAgICAgICAgICAgICAgICAgIGF0dHMucHVzaChhdHRyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBpZiAoYXR0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYXR0cy5mb3JFYWNoKGF0dCA9PiB7XG4gICAgICAgICAgICAgICAgICBhdHQucmVmVmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgICBhdHQudmFsdWUgPSAnJztcbiAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZVsnZGF0YSddICYmIHJlc3BvbnNlWydkYXRhJ10ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBhdHQucmVmVmFsdWVzID0gcmVzcG9uc2VbJ2RhdGEnXTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHRtcENtcCA9IENvbXBvbmVudCh7dGVtcGxhdGUsIHN0eWxlc30pKG5ldyBUbXBDbXBDb25zdHJ1Y3RvcigpLmNvbnN0cnVjdG9yKTtcblxuICAgIGNvbnN0IHRtcE1vZHVsZSA9IE5nTW9kdWxlKHtcbiAgICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlXSxcbiAgICAgIGRlY2xhcmF0aW9uczogW3RtcENtcF0sXG4gICAgICBwcm92aWRlcnM6IFtSZWZlcmVuY2VzU2VydmljZV1cbiAgICB9KShjbGFzcyB7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbXBpbGVyLmNvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzQXN5bmModG1wTW9kdWxlKVxuICAgICAgLnRoZW4oKGZhY3RvcmllcykgPT4ge1xuICAgICAgICAgIGNvbnN0IGYgPSBmYWN0b3JpZXMuY29tcG9uZW50RmFjdG9yaWVzWzBdO1xuICAgICAgICAgIHRoaXMuY21wUmVmID0gZi5jcmVhdGUodGhpcy5pbmplY3RvciwgW10sIG51bGwsIHRoaXMubW9kdWxlUmVmKTtcbiAgICAgICAgICB0aGlzLmNtcFJlZi5pbnN0YW5jZS5uYW1lID0gJ3RpYmFzLWR5bmFtaWMtY29tcG9uZW50JztcbiAgICAgICAgICB0aGlzLnZhbHVlSVR0ZW1wbC5pbnNlcnQodGhpcy5jbXBSZWYuaG9zdFZpZXcpO1xuICAgICAgICAgIHRoaXMuY2hhbmdlZHRyaWdnZXIuZW1pdCh0cnVlKTtcblxuICAgICAgICAgIGlmIChhdHRyaWJ1dGUudHlwZVNvdXJjZSA9PT0gQXR0cmlidXRlU291cmNlVHlwZUVudW0uQ0FMQ1VMQVRFRF9FTlRSWSAmJiBpdGVtKSB7XG4gICAgICAgICAgICB0aGlzLnNjcmlwdCA9ICcgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXsgIFxcbic7XG4gICAgICAgICAgICBpZiAoYXR0cmlidXRlLmZvcnVtbGFJdGVtcyAmJiBhdHRyaWJ1dGUuZm9ydW1sYUl0ZW1zLmZ1bmN0aW9uICYmIGl0ZW0uY2hpbGRyZW4gJiYgaXRlbS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGxldCBmdW5jID0gJyBcXG4nO1xuICAgICAgICAgICAgICBpdGVtLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2NyaXB0ICs9ICckKFwiIycgKyBjaGlsZC5jb2RlICsgJ18nICsgYXR0cmlidXRlLmNvZGUgKyAnXCIpLmNoYW5nZSgnICsgaXRlbS5jb2RlICsgJ18nICsgYXR0cmlidXRlLmNvZGUgKyAnKTsgXFxuJztcblxuICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUuZm9ydW1sYUl0ZW1zLmZ1bmN0aW9uID09PSBQYXJlbnRGdW5jdGlvbkVudW0uU1VNKSB7XG4gICAgICAgICAgICAgICAgICBmdW5jICs9ICdpZiAoJChcIiMnICsgY2hpbGQuY29kZSArICdfJyArIGF0dHJpYnV0ZS5jb2RlICsgJ1wiKS52YWwoKSkge1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAndmFyIHZhbCA9IHBhcnNlSW50KCQoXCIjJyArIGNoaWxkLmNvZGUgKyAnXycgKyBhdHRyaWJ1dGUuY29kZSArICdcIikudmFsKCksMTApO1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAnZmluYWxWYWx1ZSArPSAoIWlzTmFOKHZhbCkgPyB2YWwgOiAwKTtcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJ31cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlLmZvcnVtbGFJdGVtcy5mdW5jdGlvbiA9PT0gUGFyZW50RnVuY3Rpb25FbnVtLkFWRykge1xuICAgICAgICAgICAgICAgICAgZnVuYyArPSAnaWYgKCQoXCIjJyArIGNoaWxkLmNvZGUgKyAnXycgKyBhdHRyaWJ1dGUuY29kZSArICdcIikudmFsKCkpIHtcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJ3ZhciB2YWwgPSBwYXJzZUludCgkKFwiIycgKyBjaGlsZC5jb2RlICsgJ18nICsgYXR0cmlidXRlLmNvZGUgKyAnXCIpLnZhbCgpLDEwKTtcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJ2ZpbmFsVmFsdWUgKz0gKCFpc05hTih2YWwpID8gdmFsIDogMCk7XFxuJyArXG4gICAgICAgICAgICAgICAgICAgICd9XFxuJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZS5mb3J1bWxhSXRlbXMuZnVuY3Rpb24gPT09IFBhcmVudEZ1bmN0aW9uRW51bS5NVUxUSVApIHtcbiAgICAgICAgICAgICAgICAgIGZ1bmMgKz0gJ2lmICgkKFwiIycgKyBjaGlsZC5jb2RlICsgJ18nICsgYXR0cmlidXRlLmNvZGUgKyAnXCIpLnZhbCgpKSB7XFxuJyArXG4gICAgICAgICAgICAgICAgICAgICd2YXIgdmFsID0gcGFyc2VJbnQoJChcIiMnICsgY2hpbGQuY29kZSArICdfJyArIGF0dHJpYnV0ZS5jb2RlICsgJ1wiKS52YWwoKSwxMCk7XFxuJyArXG4gICAgICAgICAgICAgICAgICAgICdmaW5hbFZhbHVlID0gZmluYWxWYWx1ZSAqICghaXNOYU4odmFsKSA/IHZhbCA6IDApO1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAnfVxcbic7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBsZXQgZmluYWxWYWx1ZVZhciA9ICcnO1xuICAgICAgICAgICAgICBsZXQgYXZnRmluYWxWYWx1ZSA9ICcnO1xuXG4gICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUuZm9ydW1sYUl0ZW1zLmZ1bmN0aW9uID09PSBQYXJlbnRGdW5jdGlvbkVudW0uU1VNKSB7XG4gICAgICAgICAgICAgICAgZmluYWxWYWx1ZVZhciA9ICd2YXIgZmluYWxWYWx1ZSA9IDA7JztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlLmZvcnVtbGFJdGVtcy5mdW5jdGlvbiA9PT0gUGFyZW50RnVuY3Rpb25FbnVtLkFWRykge1xuICAgICAgICAgICAgICAgIGZpbmFsVmFsdWVWYXIgPSAndmFyIGZpbmFsVmFsdWUgPSAwOyc7XG4gICAgICAgICAgICAgICAgYXZnRmluYWxWYWx1ZSA9ICcgZmluYWxWYWx1ZSA9IGZpbmFsVmFsdWUvJyArIGl0ZW0uY2hpbGRyZW4ubGVuZ3RoICsgJ1xcbic7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZS5mb3J1bWxhSXRlbXMuZnVuY3Rpb24gPT09IFBhcmVudEZ1bmN0aW9uRW51bS5NVUxUSVApIHtcbiAgICAgICAgICAgICAgICBmaW5hbFZhbHVlVmFyID0gJ3ZhciBmaW5hbFZhbHVlID0gMTsnO1xuICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICBjb25zdCBjYWxsZWRGdW5jdCA9ICcgZnVuY3Rpb24gJyArIGl0ZW0uY29kZSArICdfJyArIGF0dHJpYnV0ZS5jb2RlICsgJygpeyBcXG4nICtcbiAgICAgICAgICAgICAgICAnICcgKyBmaW5hbFZhbHVlVmFyICsgJyBcXG4nICtcbiAgICAgICAgICAgICAgICAnICcgKyBmdW5jICsgJyBcXG4nICtcbiAgICAgICAgICAgICAgICAnICcgKyBhdmdGaW5hbFZhbHVlICsgJyBcXG4nICtcbiAgICAgICAgICAgICAgICAnICAkKFwiIycgKyBpdGVtLmNvZGUgKyAnXycgKyBhdHRyaWJ1dGUuY29kZSArICdcIikudmFsKGZpbmFsVmFsdWUpO1xcbicgK1xuICAgICAgICAgICAgICAgICcgICQoXCIjJyArIGl0ZW0uY29kZSArICdfJyArIGF0dHJpYnV0ZS5jb2RlICsgJ1wiKS50cmlnZ2VyKFwiY2hhbmdlXCIpO1xcbicgK1xuICAgICAgICAgICAgICAgICcgfSc7XG5cbiAgICAgICAgICAgICAgdGhpcy5zY3JpcHQgKz0gJyBcXG4gJyArIGNhbGxlZEZ1bmN0ICsgJyBcXG4gJztcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJ1dGUuZm9ydW1sYUF0dHJpYnV0ZSAmJiBhdHRyaWJ1dGUuZm9ydW1sYUF0dHJpYnV0ZS5kZXBlbmRzLmxlbmd0aCA+IDAgJiYgYXR0cmlidXRlLmZvcnVtbGFBdHRyaWJ1dGUuZnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgbGV0IGZ1bmN0aW9uUmVwbGFjZWQgPSBhdHRyaWJ1dGUuZm9ydW1sYUF0dHJpYnV0ZS5mdW5jdGlvbjtcblxuICAgICAgICAgICAgICBhdHRyaWJ1dGUuZm9ydW1sYUF0dHJpYnV0ZS5kZXBlbmRzLmZvckVhY2goZGVwZW5kID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcmlwdCArPSAnJChcIiMnICsgaXRlbS5jb2RlICsgJ18nICsgZGVwZW5kICsgJ1wiKS5jaGFuZ2UoZnVuY3Rpb24oKXsgXFxuJztcbiAgICAgICAgICAgICAgICBmdW5jdGlvblJlcGxhY2VkID0gZnVuY3Rpb25SZXBsYWNlZC5zcGxpdChkZXBlbmQpLmpvaW4oaXRlbS5jb2RlICsgJ18nICsgZGVwZW5kKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGZ1bmN0aW9uUmVwbGFjZWQgPSBmdW5jdGlvblJlcGxhY2VkLnNwbGl0KGF0dHJpYnV0ZS5jb2RlKS5qb2luKGl0ZW0uY29kZSArICdfJyArIGF0dHJpYnV0ZS5jb2RlKTtcbiAgICAgICAgICAgICAgdGhpcy5zY3JpcHQgKz0gZnVuY3Rpb25SZXBsYWNlZCArICdcXG4gJztcbiAgICAgICAgICAgICAgdGhpcy5zY3JpcHQgKz0gJyQoXCIjJyArIGl0ZW0uY29kZSArICdfJyArIGF0dHJpYnV0ZS5jb2RlICsgJ1wiKS50cmlnZ2VyKFwiY2hhbmdlXCIpO1xcbiB9KTsgXFxuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2NyaXB0ICs9ICcgfSk7ICc7XG4gICAgICAgICAgICBjb25zdCB0anMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgICAgIHRqcy5pbm5lckhUTUwgPSB0aGlzLnNjcmlwdDtcbiAgICAgICAgICAgIHRoaXMudmFsdWVJVHRlbXBsLmVsZW1lbnQubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZCh0anMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlcXVpcmVkXG4gICAgICAgICAgaWYgKGF0dHJpYnV0ZS5tYW5kYXRvcnkgJiYgdGhpcy5tb2RlID09PSAnVklFVycpIHtcbiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUubWFuZGF0b3J5LmRlcGVuZHMubGVuZ3RoID4gMCAmJiBhdHRyaWJ1dGUubWFuZGF0b3J5LmZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2NyaXB0ID0gJyAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpeyAgXFxuJztcbiAgICAgICAgICAgICAgbGV0IGZ1bmN0aW9uUmVwbGFjZWQgPSBhdHRyaWJ1dGUubWFuZGF0b3J5LmZ1bmN0aW9uO1xuICAgICAgICAgICAgICBsZXQgaWRFbGVtZW50ID0gJyc7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnBvc2l0aW9uID09PSAnQk9EWScpIHtcbiAgICAgICAgICAgICAgICBpZEVsZW1lbnQgPSBpdGVtLmNvZGUgKyAnXycgKyBhdHRyaWJ1dGUuY29kZTtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGUubWFuZGF0b3J5LmRlcGVuZHMuZm9yRWFjaChkZXBlbmQgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5zY3JpcHQgKz0gJyQoXCIjJyArIGl0ZW0uY29kZSArICdfJyArIGRlcGVuZCArICdcIikuY2hhbmdlKFJlcXVpcmVkRnVuY18nICsgaWRFbGVtZW50ICsgJyk7IFxcbic7XG5cbiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uUmVwbGFjZWQgPSBmdW5jdGlvblJlcGxhY2VkLnNwbGl0KGRlcGVuZCkuam9pbihpdGVtLmNvZGUgKyAnXycgKyBkZXBlbmQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uUmVwbGFjZWQgPSBmdW5jdGlvblJlcGxhY2VkLnNwbGl0KGF0dHJpYnV0ZS5jb2RlKS5qb2luKGl0ZW0uY29kZSArICdfJyArIGF0dHJpYnV0ZS5jb2RlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA9PT0gJ0hFQURFUicgfHwgdGhpcy5wb3NpdGlvbiA9PT0gJ0ZPT1RFUicpIHtcbiAgICAgICAgICAgICAgICBpZEVsZW1lbnQgPSBhdHRyaWJ1dGUuY29kZTtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGUubWFuZGF0b3J5LmRlcGVuZHMuZm9yRWFjaChkZXBlbmQgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5zY3JpcHQgKz0gJyQoXCIjJyArIGRlcGVuZCArICdcIikuY2hhbmdlKFJlcXVpcmVkRnVuY18nICsgaWRFbGVtZW50ICsgJyk7IFxcbic7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5zY3JpcHQgKz0gJyBmdW5jdGlvbiBSZXF1aXJlZEZ1bmNfJyArIGlkRWxlbWVudCArICcoKXsgXFxuJztcbiAgICAgICAgICAgICAgdGhpcy5zY3JpcHQgKz0gJ2lmKCcgKyBmdW5jdGlvblJlcGxhY2VkICsgJyl7IFxcbic7XG4gICAgICAgICAgICAgIHRoaXMuc2NyaXB0ICs9ICckKFwiIycgKyBpZEVsZW1lbnQgKyAnXCIpLnByb3AoXCJyZXF1aXJlZFwiLHRydWUpOyBcXG4nO1xuICAgICAgICAgICAgICB0aGlzLnNjcmlwdCArPSAnIH0gZWxzZSB7XFxuJztcbiAgICAgICAgICAgICAgdGhpcy5zY3JpcHQgKz0gJyQoXCIjJyArIGlkRWxlbWVudCArICdcIikucHJvcChcInJlcXVpcmVkXCIsZmFsc2UpOyBcXG4nO1xuICAgICAgICAgICAgICB0aGlzLnNjcmlwdCArPSAnIH0gXFxuJyArXG4gICAgICAgICAgICAgICAgJyAgJChcIiMnICsgaWRFbGVtZW50ICsgJ1wiKS50cmlnZ2VyKFwiY2hhbmdlXCIpO1xcbn1cXG4nICtcbiAgICAgICAgICAgICAgICAnJChcIiMnICsgaWRFbGVtZW50ICsgJ1wiKS5jaGFuZ2UoZnVuY3Rpb24oKXsgXFxuJyArXG4gICAgICAgICAgICAgICAgJ2lmKCQodGhpcykucHJvcChcXCdyZXF1aXJlZFxcJykpe1xcbicgK1xuICAgICAgICAgICAgICAgICcgICAgICAgICBpZiAoJCh0aGlzKS52YWwoKT09XFwnXFwnKXtcXG4nICtcbiAgICAgICAgICAgICAgICAnICAgICAgICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoXCJuZy12YWxpZFwiKSl7XFxuJyArXG4gICAgICAgICAgICAgICAgJyAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcyhcIm5nLXZhbGlkXCIpO1xcbicgK1xuICAgICAgICAgICAgICAgICcgICAgICAgIH1cXG4nICtcbiAgICAgICAgICAgICAgICAnICAgICAgICAgaWYgKCEkKHRoaXMpLmhhc0NsYXNzKFwibmctaW52YWxpZFwiKSl7XFxuJyArXG4gICAgICAgICAgICAgICAgJyAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcyhcIm5nLWludmFsaWRcIik7XFxuJyArXG4gICAgICAgICAgICAgICAgJyAgICAgICAgfVxcbicgK1xuICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAnICB9IGVsc2Uge1xcbicgK1xuICAgICAgICAgICAgICAgICcgICAgICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKFwibmctaW52YWxpZFwiKSl7XFxuJyArXG4gICAgICAgICAgICAgICAgJyAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoXCJuZy1pbnZhbGlkXCIpO1xcbicgK1xuICAgICAgICAgICAgICAgICcgICAgICAgIH1cXG4nICtcbiAgICAgICAgICAgICAgICAnICAgICAgIGlmICghJCh0aGlzKS5oYXNDbGFzcyhcIm5nLXZhbGlkXCIpKXtcXG4nICtcbiAgICAgICAgICAgICAgICAnICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcyhcIm5nLXZhbGlkXCIpO1xcbicgK1xuICAgICAgICAgICAgICAgICcgICAgICAgIH1cXG4nICtcbiAgICAgICAgICAgICAgICAnfVxcbicgK1xuICAgICAgICAgICAgICAgICcgICAgfSBlbHNlIHtcXG4nICtcbiAgICAgICAgICAgICAgICAnICAgICAgICAgICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKFwibmctaW52YWxpZFwiKSl7XFxuJyArXG4gICAgICAgICAgICAgICAgJyAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoXCJuZy1pbnZhbGlkXCIpO1xcbicgK1xuICAgICAgICAgICAgICAgICcgICAgICAgIH1cXG4nICtcbiAgICAgICAgICAgICAgICAnICAgICAgIGlmICghJCh0aGlzKS5oYXNDbGFzcyhcIm5nLXZhbGlkXCIpKXtcXG4nICtcbiAgICAgICAgICAgICAgICAnICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcyhcIm5nLXZhbGlkXCIpO1xcbicgK1xuICAgICAgICAgICAgICAgICcgICAgICAgIH1cXG4nICtcbiAgICAgICAgICAgICAgICAnICAgIH1cXG4nICtcbiAgICAgICAgICAgICAgICAnfSk7XFxuJztcbiAgICAgICAgICAgICAgdGhpcy5zY3JpcHQgKz0gJyB9KTsgXFxuJztcbiAgICAgICAgICAgICAgY29uc3QgdGpzcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICAgICAgICB0anNzLmlubmVySFRNTCA9IHRoaXMuc2NyaXB0O1xuICAgICAgICAgICAgICB0aGlzLnZhbHVlSVR0ZW1wbC5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQodGpzcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gIH1cblxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuY2hhbmdlZHRyaWdnZXIuZW1pdCh0cnVlKTtcbiAgICBpZiAodGhpcy5jbXBSZWYpIHtcbiAgICAgIHRoaXMuY21wUmVmLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==