materialize-angular
Version:
Material UI Angular library
310 lines • 25.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: app/completed-components/html-visualizer/html-visualizer.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @license
* Copyright Workylab. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://raw.githubusercontent.com/workylab/materialize-angular/master/LICENSE
*/
import { Component, Input } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
import { config } from '../../config';
var HTMLVisualizerComponent = /** @class */ (function () {
function HTMLVisualizerComponent(sanitizer) {
this.sanitizer = sanitizer;
this.className = HTMLVisualizerComponent.defaultProps.className;
this.html = HTMLVisualizerComponent.defaultProps.html;
this.prefix = config.components.prefix;
}
/**
* @return {?}
*/
HTMLVisualizerComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.htmlContent = this.render(this.html);
};
/**
* @param {?} html
* @return {?}
*/
HTMLVisualizerComponent.prototype.render = /**
* @param {?} html
* @return {?}
*/
function (html) {
/** @type {?} */
var tags = this.splitByTags(html);
/** @type {?} */
var lines = [];
/** @type {?} */
var depth = 0;
for (var i = 0; i < tags.length; i++) {
/** @type {?} */
var currentTag = tags[i];
/** @type {?} */
var nextTag = tags[i + 1];
/** @type {?} */
var lastTag = tags[i + 2];
/** @type {?} */
var result = this.createLineLogic(currentTag, nextTag, lastTag, depth, i);
depth = result.depth;
i = result.cycle;
lines.push(result.line);
}
return lines.join('<br />');
};
/**
* @param {?} content
* @param {?} className
* @return {?}
*/
HTMLVisualizerComponent.prototype.createNode = /**
* @param {?} content
* @param {?} className
* @return {?}
*/
function (content, className) {
/** @type {?} */
var escapedContent = content.replace(/&/g, '&');
escapedContent = escapedContent.trim();
escapedContent = escapedContent.replace(/\[\[/g, '{{');
escapedContent = escapedContent.replace(/\]\]/g, '}}');
escapedContent = escapedContent.replace(/</g, '<');
escapedContent = escapedContent.replace(/>/g, '>');
escapedContent = escapedContent.replace(/(\S+)="([^']*?)"/g, (/**
* @param {?} match
* @return {?}
*/
function (match) {
/** @type {?} */
var value = match.match(/"([^']*?)"/g);
/** @type {?} */
var attribute = match.match(/(\S+)=/g);
/** @type {?} */
var attributeValidated = (attribute && attribute[0]) || '';
/** @type {?} */
var valueValidated = (value && value[0]) || '';
/** @type {?} */
var attributeTag = "<span class=\"" + HTMLVisualizerComponent.ATTRIBUTE_CLASS + "\">" + attributeValidated + "</span>";
/** @type {?} */
var valueTag = "<span class=\"" + HTMLVisualizerComponent.VALUE_CLASS + "\">" + valueValidated + "</span>";
return attributeTag + valueTag;
}));
escapedContent = escapedContent.replace(/(<\/|<)/g, (/**
* @param {?} match
* @return {?}
*/
function (match) {
return "<span class=\"" + HTMLVisualizerComponent.SYMBOL_CLASS + "\"><" + (match.includes('/') ? '/' : '') + "</span>";
}));
escapedContent = escapedContent.replace(/(\/>|>)/g, (/**
* @param {?} match
* @return {?}
*/
function (match) {
return "<span class=\"" + HTMLVisualizerComponent.SYMBOL_CLASS + "\">" + (match.includes('/') ? '/' : '') + "></span>";
}));
return "<span class=\"" + className + "\">" + escapedContent + "</span>";
};
/**
* @param {?} depth
* @param {?} content
* @return {?}
*/
HTMLVisualizerComponent.prototype.indentNode = /**
* @param {?} depth
* @param {?} content
* @return {?}
*/
function (depth, content) {
/** @type {?} */
var indentationBase = '  ';
/** @type {?} */
var indentation = indentationBase.repeat(depth);
return "" + indentation + content;
};
/**
* @param {?} xml
* @return {?}
*/
HTMLVisualizerComponent.prototype.splitByTags = /**
* @param {?} xml
* @return {?}
*/
function (xml) {
/** @type {?} */
var tags = xml.split(/(<\/?[^>]+>)/g);
/** @type {?} */
var cleanedTags = tags.filter((/**
* @param {?} line
* @return {?}
*/
function (line) { return line.trim() !== ''; }));
return cleanedTags;
};
/**
* @param {?} contentNode
* @return {?}
*/
HTMLVisualizerComponent.prototype.isTag = /**
* @param {?} contentNode
* @return {?}
*/
function (contentNode) {
return (/<[^>!]+>/).test(contentNode);
};
/**
* @param {?} contentNode
* @return {?}
*/
HTMLVisualizerComponent.prototype.isOpeningTag = /**
* @param {?} contentNode
* @return {?}
*/
function (contentNode) {
if (this.isTag(contentNode) && !this.isClosingTag(contentNode) && !this.isSelfClosingTag(contentNode)) {
return true;
}
return false;
};
/**
* @param {?} contentNode
* @return {?}
*/
HTMLVisualizerComponent.prototype.isClosingTag = /**
* @param {?} contentNode
* @return {?}
*/
function (contentNode) {
return (/<\/+[^>]+>/).test(contentNode);
};
/**
* @param {?} contentNode
* @return {?}
*/
HTMLVisualizerComponent.prototype.isSelfClosingTag = /**
* @param {?} contentNode
* @return {?}
*/
function (contentNode) {
return (/<[^>]+\/>/).test(contentNode);
};
/**
* @param {?} firstTag
* @param {?} middleTag
* @param {?} lastTag
* @param {?} depth
* @param {?} cycle
* @return {?}
*/
HTMLVisualizerComponent.prototype.createLineLogic = /**
* @param {?} firstTag
* @param {?} middleTag
* @param {?} lastTag
* @param {?} depth
* @param {?} cycle
* @return {?}
*/
function (firstTag, middleTag, lastTag, depth, cycle) {
if (this.isOpeningTag(firstTag) && this.isClosingTag(middleTag)) {
/** @type {?} */
var openNode = this.createNode(firstTag, 'tag');
/** @type {?} */
var closeNode = this.createNode(middleTag, 'tag');
return {
cycle: cycle + 1,
depth: depth,
line: this.indentNode(depth, "" + openNode + closeNode)
};
}
if (this.isOpeningTag(firstTag) && !this.isTag(middleTag)) {
/** @type {?} */
var openNode = this.createNode(firstTag, 'tag');
/** @type {?} */
var contentNode = this.createNode(middleTag, 'string');
/** @type {?} */
var closeNode = this.createNode(lastTag, 'tag');
return {
cycle: cycle + 2,
depth: depth,
line: this.indentNode(depth, "" + openNode + contentNode + closeNode)
};
}
if (this.isSelfClosingTag(firstTag)) {
/** @type {?} */
var selfClosingNode = this.createNode(firstTag, 'tag');
return {
cycle: cycle,
depth: depth,
line: this.indentNode(depth, selfClosingNode)
};
}
if (this.isClosingTag(firstTag)) {
/** @type {?} */
var closeNode = this.createNode(firstTag, 'tag');
return {
cycle: cycle,
depth: depth - 1,
line: this.indentNode(depth - 1, closeNode)
};
}
return {
cycle: cycle,
depth: depth + 1,
line: this.indentNode(depth, this.createNode(firstTag, 'text'))
};
};
HTMLVisualizerComponent.ATTRIBUTE_CLASS = config.components.prefix + "-html-visualizer-attribute";
HTMLVisualizerComponent.VALUE_CLASS = config.components.prefix + "-html-visualizer-value";
HTMLVisualizerComponent.SYMBOL_CLASS = config.components.prefix + "-html-visualizer-symbol";
HTMLVisualizerComponent.defaultProps = {
className: '',
html: ''
};
HTMLVisualizerComponent.decorators = [
{ type: Component, args: [{
selector: config.components.prefix + "-html-visualizer",
template: "<div [ngClass]=\"prefix + '-html-visualizer'\">\n <div [ngClass]=\"prefix + '-html-visualizer-content'\" [innerHTML]=\"htmlContent\" ngNonBindable></div>\n</div>\n"
}] }
];
/** @nocollapse */
HTMLVisualizerComponent.ctorParameters = function () { return [
{ type: DomSanitizer }
]; };
HTMLVisualizerComponent.propDecorators = {
className: [{ type: Input }],
html: [{ type: Input }]
};
return HTMLVisualizerComponent;
}());
export { HTMLVisualizerComponent };
if (false) {
/** @type {?} */
HTMLVisualizerComponent.ATTRIBUTE_CLASS;
/** @type {?} */
HTMLVisualizerComponent.VALUE_CLASS;
/** @type {?} */
HTMLVisualizerComponent.SYMBOL_CLASS;
/** @type {?} */
HTMLVisualizerComponent.defaultProps;
/** @type {?} */
HTMLVisualizerComponent.prototype.className;
/** @type {?} */
HTMLVisualizerComponent.prototype.html;
/** @type {?} */
HTMLVisualizerComponent.prototype.htmlContent;
/** @type {?} */
HTMLVisualizerComponent.prototype.prefix;
/**
* @type {?}
* @private
*/
HTMLVisualizerComponent.prototype.sanitizer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC12aXN1YWxpemVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21hdGVyaWFsaXplLWFuZ3VsYXIvIiwic291cmNlcyI6WyJhcHAvY29tcGxldGVkLWNvbXBvbmVudHMvaHRtbC12aXN1YWxpemVyL2h0bWwtdmlzdWFsaXplci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBUUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHdEM7SUFvQkUsaUNBQW9CLFNBQXVCO1FBQXZCLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFObEMsY0FBUyxHQUFXLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUM7UUFDbkUsU0FBSSxHQUFXLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7UUFHM0QsV0FBTSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO0lBR3pDLENBQUM7Ozs7SUFFRCwwQ0FBUTs7O0lBQVI7UUFDRSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7Ozs7O0lBRUQsd0NBQU07Ozs7SUFBTixVQUFPLElBQVk7O1lBQ1gsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDOztZQUM3QixLQUFLLEdBQUcsRUFBRTs7WUFFWixLQUFLLEdBQUcsQ0FBQztRQUViLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOztnQkFDOUIsVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7O2dCQUNwQixP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Q3BGLHFDQUFzRjs7SUFFdEYscUNBR0U7O0lBRUYsNENBQTRFOztJQUM1RSx1Q0FBa0U7O0lBRWxFLDhDQUE2Qjs7SUFDN0IseUNBQXlDOzs7OztJQUU3Qiw0Q0FBK0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgV29ya3lsYWIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3dvcmt5bGFiL21hdGVyaWFsaXplLWFuZ3VsYXIvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBIVE1MVmlzdWFsaXplck1vZGVsIH0gZnJvbSAnLi9odG1sLXZpc3VhbGl6ZXIubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IGAkeyBjb25maWcuY29tcG9uZW50cy5wcmVmaXggfS1odG1sLXZpc3VhbGl6ZXJgLFxuICB0ZW1wbGF0ZVVybDogJy4vaHRtbC12aXN1YWxpemVyLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBIVE1MVmlzdWFsaXplckNvbXBvbmVudCBpbXBsZW1lbnRzIEhUTUxWaXN1YWxpemVyTW9kZWwsIE9uSW5pdCB7XG4gIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfQ0xBU1MgPSBgJHsgY29uZmlnLmNvbXBvbmVudHMucHJlZml4IH0taHRtbC12aXN1YWxpemVyLWF0dHJpYnV0ZWA7XG4gIHN0YXRpYyByZWFkb25seSBWQUxVRV9DTEFTUyA9IGAkeyBjb25maWcuY29tcG9uZW50cy5wcmVmaXggfS1odG1sLXZpc3VhbGl6ZXItdmFsdWVgO1xuICBzdGF0aWMgcmVhZG9ubHkgU1lNQk9MX0NMQVNTID0gYCR7IGNvbmZpZy5jb21wb25lbnRzLnByZWZpeCB9LWh0bWwtdmlzdWFsaXplci1zeW1ib2xgO1xuXG4gIHN0YXRpYyByZWFkb25seSBkZWZhdWx0UHJvcHM6IEhUTUxWaXN1YWxpemVyTW9kZWwgPSB7XG4gICAgY2xhc3NOYW1lOiAnJyxcbiAgICBodG1sOiAnJ1xuICB9O1xuXG4gIEBJbnB1dCgpIGNsYXNzTmFtZTogc3RyaW5nID0gSFRNTFZpc3VhbGl6ZXJDb21wb25lbnQuZGVmYXVsdFByb3BzLmNsYXNzTmFtZTtcbiAgQElucHV0KCkgaHRtbDogc3RyaW5nID0gSFRNTFZpc3VhbGl6ZXJDb21wb25lbnQuZGVmYXVsdFByb3BzLmh0bWw7XG5cbiAgcHVibGljIGh0bWxDb250ZW50OiBTYWZlSHRtbDtcbiAgcHVibGljIHByZWZpeCA9IGNvbmZpZy5jb21wb25lbnRzLnByZWZpeDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmh0bWxDb250ZW50ID0gdGhpcy5yZW5kZXIodGhpcy5odG1sKTtcbiAgfVxuXG4gIHJlbmRlcihodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRhZ3MgPSB0aGlzLnNwbGl0QnlUYWdzKGh0bWwpO1xuICAgIGNvbnN0IGxpbmVzID0gW107XG5cbiAgICBsZXQgZGVwdGggPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjdXJyZW50VGFnID0gdGFnc1tpXTtcbiAgICAgIGNvbnN0IG5leHRUYWcgPSB0YWdzW2kgKyAxXTtcbiAgICAgIGNvbnN0IGxhc3RUYWcgPSB0YWdzW2kgKyAyXTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jcmVhdGVMaW5lTG9naWMoY3VycmVudFRhZywgbmV4dFRhZywgbGFzdFRhZywgZGVwdGgsIGkpO1xuXG4gICAgICBkZXB0aCA9IHJlc3VsdC5kZXB0aDtcbiAgICAgIGkgPSByZXN1bHQuY3ljbGU7XG4gICAgICBsaW5lcy5wdXNoKHJlc3VsdC5saW5lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZXMuam9pbignPGJyIC8+Jyk7XG4gIH1cblxuICBjcmVhdGVOb2RlKGNvbnRlbnQ6IHN0cmluZywgY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBsZXQgZXNjYXBlZENvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoLyYvZywgJyZhbXA7Jyk7XG5cbiAgICBlc2NhcGVkQ29udGVudCA9IGVzY2FwZWRDb250ZW50LnRyaW0oKTtcbiAgICBlc2NhcGVkQ29udGVudCA9IGVzY2FwZWRDb250ZW50LnJlcGxhY2UoL1xcW1xcWy9nLCAnJiMxMjMmIzEyMzsnKTtcbiAgICBlc2NhcGVkQ29udGVudCA9IGVzY2FwZWRDb250ZW50LnJlcGxhY2UoL1xcXVxcXS9nLCAnJiMxMjUmIzEyNTsnKTtcblxuICAgIGVzY2FwZWRDb250ZW50ID0gZXNjYXBlZENvbnRlbnQucmVwbGFjZSgvPC9nLCAnJmx0OycpO1xuICAgIGVzY2FwZWRDb250ZW50ID0gZXNjYXBlZENvbnRlbnQucmVwbGFjZSgvPi9nLCAnJmd0OycpO1xuXG4gICAgZXNjYXBlZENvbnRlbnQgPSBlc2NhcGVkQ29udGVudC5yZXBsYWNlKC8oXFxTKyk9XCIoW14nXSo/KVwiL2csIG1hdGNoID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gbWF0Y2gubWF0Y2goL1wiKFteJ10qPylcIi9nKTtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IG1hdGNoLm1hdGNoKC8oXFxTKyk9L2cpO1xuICAgICAgY29uc3QgYXR0cmlidXRlVmFsaWRhdGVkID0gKGF0dHJpYnV0ZSAmJiBhdHRyaWJ1dGVbMF0pIHx8ICcnO1xuICAgICAgY29uc3QgdmFsdWVWYWxpZGF0ZWQgPSAodmFsdWUgJiYgdmFsdWVbMF0pIHx8ICcnO1xuXG4gICAgICBjb25zdCBhdHRyaWJ1dGVUYWcgPSBgPHNwYW4gY2xhc3M9XCIkeyBIVE1MVmlzdWFsaXplckNvbXBvbmVudC5BVFRSSUJVVEVfQ0xBU1MgfVwiPiR7IGF0dHJpYnV0ZVZhbGlkYXRlZCB9PC9zcGFuPmA7XG4gICAgICBjb25zdCB2YWx1ZVRhZyA9IGA8c3BhbiBjbGFzcz1cIiR7IEhUTUxWaXN1YWxpemVyQ29tcG9uZW50LlZBTFVFX0NMQVNTIH1cIj4keyB2YWx1ZVZhbGlkYXRlZCB9PC9zcGFuPmA7XG5cbiAgICAgIHJldHVybiBhdHRyaWJ1dGVUYWcgKyB2YWx1ZVRhZztcbiAgICB9KTtcblxuICAgIGVzY2FwZWRDb250ZW50ID0gZXNjYXBlZENvbnRlbnQucmVwbGFjZSgvKCZsdDtcXC98Jmx0OykvZywgbWF0Y2ggPT5cbiAgICAgIGA8c3BhbiBjbGFzcz1cIiR7IEhUTUxWaXN1YWxpemVyQ29tcG9uZW50LlNZTUJPTF9DTEFTUyB9XCI+Jmx0OyR7IG1hdGNoLmluY2x1ZGVzKCcvJykgPyAnLycgOiAnJyB9PC9zcGFuPmBcbiAgICApO1xuXG4gICAgZXNjYXBlZENvbnRlbnQgPSBlc2NhcGVkQ29udGVudC5yZXBsYWNlKC8oXFwvJmd0O3wmZ3Q7KS9nLCBtYXRjaCA9PlxuICAgICAgYDxzcGFuIGNsYXNzPVwiJHsgSFRNTFZpc3VhbGl6ZXJDb21wb25lbnQuU1lNQk9MX0NMQVNTIH1cIj4keyBtYXRjaC5pbmNsdWRlcygnLycpID8gJy8nIDogJycgfSZndDs8L3NwYW4+YFxuICAgICk7XG5cbiAgICByZXR1cm4gYDxzcGFuIGNsYXNzPVwiJHsgY2xhc3NOYW1lIH1cIj4keyBlc2NhcGVkQ29udGVudCB9PC9zcGFuPmA7XG4gIH1cblxuICBpbmRlbnROb2RlKGRlcHRoOiBudW1iZXIsIGNvbnRlbnQ6IHN0cmluZykge1xuICAgIGNvbnN0IGluZGVudGF0aW9uQmFzZSA9ICcmZW1zcDsmZW1zcDsnO1xuICAgIGNvbnN0IGluZGVudGF0aW9uID0gaW5kZW50YXRpb25CYXNlLnJlcGVhdChkZXB0aCk7XG5cbiAgICByZXR1cm4gYCR7IGluZGVudGF0aW9uIH0keyBjb250ZW50IH1gO1xuICB9XG5cbiAgc3BsaXRCeVRhZ3MoeG1sOiBzdHJpbmcpOiBBcnJheTxzdHJpbmc+IHtcbiAgICBjb25zdCB0YWdzID0geG1sLnNwbGl0KC8oPFxcLz9bXj5dKz4pL2cpO1xuICAgIGNvbnN0IGNsZWFuZWRUYWdzID0gdGFncy5maWx0ZXIobGluZSA9PiBsaW5lLnRyaW0oKSAhPT0gJycpO1xuXG4gICAgcmV0dXJuIGNsZWFuZWRUYWdzO1xuICB9XG5cbiAgaXNUYWcoY29udGVudE5vZGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoLzxbXj4hXSs+LykudGVzdChjb250ZW50Tm9kZSk7XG4gIH1cblxuICBpc09wZW5pbmdUYWcoY29udGVudE5vZGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzVGFnKGNvbnRlbnROb2RlKSAmJiAhdGhpcy5pc0Nsb3NpbmdUYWcoY29udGVudE5vZGUpICYmICF0aGlzLmlzU2VsZkNsb3NpbmdUYWcoY29udGVudE5vZGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpc0Nsb3NpbmdUYWcoY29udGVudE5vZGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoLzxcXC8rW14+XSs+LykudGVzdChjb250ZW50Tm9kZSk7XG4gIH1cblxuICBpc1NlbGZDbG9zaW5nVGFnKGNvbnRlbnROb2RlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKC88W14+XStcXC8+LykudGVzdChjb250ZW50Tm9kZSk7XG4gIH1cblxuICBjcmVhdGVMaW5lTG9naWMoZmlyc3RUYWc6IHN0cmluZywgbWlkZGxlVGFnOiBzdHJpbmcsIGxhc3RUYWc6IHN0cmluZywgZGVwdGg6IG51bWJlciwgY3ljbGU6IG51bWJlcik6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNPcGVuaW5nVGFnKGZpcnN0VGFnKSAmJiB0aGlzLmlzQ2xvc2luZ1RhZyhtaWRkbGVUYWcpKSB7XG4gICAgICBjb25zdCBvcGVuTm9kZSA9IHRoaXMuY3JlYXRlTm9kZShmaXJzdFRhZywgJ3RhZycpO1xuICAgICAgY29uc3QgY2xvc2VOb2RlID0gdGhpcy5jcmVhdGVOb2RlKG1pZGRsZVRhZywgJ3RhZycpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjeWNsZTogY3ljbGUgKyAxLFxuICAgICAgICBkZXB0aDogZGVwdGgsXG4gICAgICAgIGxpbmU6IHRoaXMuaW5kZW50Tm9kZShkZXB0aCwgYCR7IG9wZW5Ob2RlIH0keyBjbG9zZU5vZGUgfWApXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzT3BlbmluZ1RhZyhmaXJzdFRhZykgJiYgIXRoaXMuaXNUYWcobWlkZGxlVGFnKSkge1xuICAgICAgY29uc3Qgb3Blbk5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoZmlyc3RUYWcsICd0YWcnKTtcbiAgICAgIGNvbnN0IGNvbnRlbnROb2RlID0gdGhpcy5jcmVhdGVOb2RlKG1pZGRsZVRhZywgJ3N0cmluZycpO1xuICAgICAgY29uc3QgY2xvc2VOb2RlID0gdGhpcy5jcmVhdGVOb2RlKGxhc3RUYWcsICd0YWcnKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3ljbGU6IGN5Y2xlICsgMixcbiAgICAgICAgZGVwdGg6IGRlcHRoLFxuICAgICAgICBsaW5lOiB0aGlzLmluZGVudE5vZGUoZGVwdGgsIGAkeyBvcGVuTm9kZSB9JHsgY29udGVudE5vZGUgfSR7IGNsb3NlTm9kZSB9YClcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNTZWxmQ2xvc2luZ1RhZyhmaXJzdFRhZykpIHtcbiAgICAgIGNvbnN0IHNlbGZDbG9zaW5nTm9kZSA9IHRoaXMuY3JlYXRlTm9kZShmaXJzdFRhZywgJ3RhZycpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjeWNsZTogY3ljbGUsXG4gICAgICAgIGRlcHRoOiBkZXB0aCxcbiAgICAgICAgbGluZTogdGhpcy5pbmRlbnROb2RlKGRlcHRoLCBzZWxmQ2xvc2luZ05vZGUpXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQ2xvc2luZ1RhZyhmaXJzdFRhZykpIHtcbiAgICAgIGNvbnN0IGNsb3NlTm9kZSA9IHRoaXMuY3JlYXRlTm9kZShmaXJzdFRhZywgJ3RhZycpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjeWNsZTogY3ljbGUsXG4gICAgICAgIGRlcHRoOiBkZXB0aCAtIDEsXG4gICAgICAgIGxpbmU6IHRoaXMuaW5kZW50Tm9kZShkZXB0aCAtIDEsIGNsb3NlTm9kZSlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGN5Y2xlOiBjeWNsZSxcbiAgICAgIGRlcHRoOiBkZXB0aCArIDEsXG4gICAgICBsaW5lOiB0aGlzLmluZGVudE5vZGUoZGVwdGgsIHRoaXMuY3JlYXRlTm9kZShmaXJzdFRhZywgJ3RleHQnKSlcbiAgICB9O1xuICB9XG59XG4iXX0=