blob: 3c2a5698c1b16747f7202b790802e3490d9b7a38 [file] [log] [blame]
'use strict';
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var postcss = require('postcss');
var gonzales = require('gonzales-pe');
var DEFAULT_RAWS_ROOT = {
before: ''
};
var DEFAULT_RAWS_RULE = {
before: '',
between: ''
};
var DEFAULT_RAWS_DECL = {
before: '',
between: '',
semicolon: false
};
var DEFAULT_COMMENT_DECL = {
before: '',
left: '',
right: ''
};
var SassParser = function () {
function SassParser(input) {
_classCallCheck(this, SassParser);
this.input = input;
}
_createClass(SassParser, [{
key: 'parse',
value: function parse() {
try {
this.node = gonzales.parse(this.input.css, { syntax: 'sass' });
} catch (error) {
throw this.input.error(error.message, error.line, 1);
}
this.lines = this.input.css.match(/^.*(\r?\n|$)/gm);
this.root = this.stylesheet(this.node);
}
}, {
key: 'extractSource',
value: function extractSource(start, end) {
var nodeLines = this.lines.slice(start.line - 1, end.line);
nodeLines[0] = nodeLines[0].substring(start.column - 1);
var last = nodeLines.length - 1;
nodeLines[last] = nodeLines[last].substring(0, end.column);
return nodeLines.join('');
}
}, {
key: 'stylesheet',
value: function stylesheet(node) {
var _this = this;
// Create and set parameters for Root node
var root = postcss.root();
root.source = {
start: node.start,
end: node.end,
input: this.input
// Raws for root node
};root.raws = {
semicolon: DEFAULT_RAWS_ROOT.semicolon,
before: DEFAULT_RAWS_ROOT.before
// Store spaces before root (if exist)
};this.raws = {
before: ''
};
node.content.forEach(function (contentNode) {
return _this.process(contentNode, root);
});
return root;
}
}, {
key: 'process',
value: function process(node, parent) {
if (this[node.type]) {
return this[node.type](node, parent) || null;
} else {
return null;
}
}
}, {
key: 'ruleset',
value: function ruleset(node, parent) {
var _this2 = this;
// Loop to find the deepest ruleset node
this.raws.multiRuleProp = '';
node.content.forEach(function (contentNode) {
switch (contentNode.type) {
case 'block':
{
// Create Rule node
var rule = postcss.rule();
rule.selector = '';
// Object to store raws for Rule
var ruleRaws = {
before: _this2.raws.before || DEFAULT_RAWS_RULE.before,
between: DEFAULT_RAWS_RULE.between
// Variable to store spaces and symbols before declaration property
};_this2.raws.before = '';
_this2.raws.comment = false;
// Look up throw all nodes in current ruleset node
node.content.filter(function (content) {
return content.type === 'block';
}).forEach(function (innerContentNode) {
return _this2.process(innerContentNode, rule);
});
if (rule.nodes.length) {
// Write selector to Rule
rule.selector = _this2.extractSource(node.start, contentNode.start).slice(0, -1).replace(/\s+$/, function (spaces) {
ruleRaws.between = spaces;
return '';
});
// Set parameters for Rule node
rule.parent = parent;
rule.source = {
start: node.start,
end: node.end,
input: _this2.input
};
rule.raws = ruleRaws;
parent.nodes.push(rule);
}
break;
}
default:
}
});
}
}, {
key: 'block',
value: function block(node, parent) {
var _this3 = this;
// If nested rules exist, wrap current rule in new rule node
if (this.raws.multiRule) {
if (this.raws.multiRulePropVariable) {
this.raws.multiRuleProp = '$' + this.raws.multiRuleProp;
}
var multiRule = Object.assign(postcss.rule(), {
source: {
start: {
line: node.start.line - 1,
column: node.start.column
},
end: node.end,
input: this.input
},
raws: {
before: this.raws.before || DEFAULT_RAWS_RULE.before,
between: DEFAULT_RAWS_RULE.between
},
parent: parent,
selector: (this.raws.customProperty ? '--' : '') + this.raws.multiRuleProp
});
parent.push(multiRule);
parent = multiRule;
}
this.raws.before = '';
// Looking for declaration node in block node
node.content.forEach(function (contentNode) {
return _this3.process(contentNode, parent);
});
if (this.raws.multiRule) {
this.raws.beforeMulti = this.raws.before;
}
}
}, {
key: 'declaration',
value: function declaration(node, parent) {
var _this4 = this;
var isBlockInside = false;
// Create Declaration node
var declarationNode = postcss.decl();
declarationNode.prop = '';
// Object to store raws for Declaration
var declarationRaws = Object.assign(declarationNode.raws, {
before: this.raws.before || DEFAULT_RAWS_DECL.before,
between: DEFAULT_RAWS_DECL.between,
semicolon: DEFAULT_RAWS_DECL.semicolon
});
this.raws.property = false;
this.raws.betweenBefore = false;
this.raws.comment = false;
// Looking for property and value node in declaration node
node.content.forEach(function (contentNode) {
switch (contentNode.type) {
case 'customProperty':
_this4.raws.customProperty = true;
// fall through
case 'property':
{
/* this.raws.property to detect is property is already defined in current object */
_this4.raws.property = true;
_this4.raws.multiRuleProp = contentNode.content[0].content;
_this4.raws.multiRulePropVariable = contentNode.content[0].type === 'variable';
_this4.process(contentNode, declarationNode);
break;
}
case 'propertyDelimiter':
{
if (_this4.raws.property && !_this4.raws.betweenBefore) {
/* If property is already defined and there's no ':' before it */
declarationRaws.between += contentNode.content;
_this4.raws.multiRuleProp += contentNode.content;
} else {
/* If ':' goes before property declaration, like :width 100px */
_this4.raws.betweenBefore = true;
declarationRaws.before += contentNode.content;
_this4.raws.multiRuleProp += contentNode.content;
}
break;
}
case 'space':
{
declarationRaws.between += contentNode.content;
break;
}
case 'value':
{
// Look up for a value for current property
switch (contentNode.content[0].type) {
case 'block':
{
isBlockInside = true;
// If nested rules exist
if (Array.isArray(contentNode.content[0].content)) {
_this4.raws.multiRule = true;
}
_this4.process(contentNode.content[0], parent);
break;
}
case 'variable':
{
declarationNode.value = '$';
_this4.process(contentNode, declarationNode);
break;
}
case 'color':
{
declarationNode.value = '#';
_this4.process(contentNode, declarationNode);
break;
}
case 'number':
{
if (contentNode.content.length > 1) {
declarationNode.value = contentNode.content.join('');
} else {
_this4.process(contentNode, declarationNode);
}
break;
}
case 'parentheses':
{
declarationNode.value = '(';
_this4.process(contentNode, declarationNode);
break;
}
default:
{
_this4.process(contentNode, declarationNode);
}
}
break;
}
default:
}
});
if (!isBlockInside) {
// Set parameters for Declaration node
declarationNode.source = {
start: node.start,
end: node.end,
input: this.input
};
declarationNode.parent = parent;
parent.nodes.push(declarationNode);
}
this.raws.before = '';
this.raws.customProperty = false;
this.raws.multiRuleProp = '';
this.raws.property = false;
}
}, {
key: 'customProperty',
value: function customProperty(node, parent) {
this.property(node, parent);
parent.prop = '--' + parent.prop;
}
}, {
key: 'property',
value: function property(node, parent) {
// Set property for Declaration node
switch (node.content[0].type) {
case 'variable':
{
parent.prop += '$';
break;
}
case 'interpolation':
{
this.raws.interpolation = true;
parent.prop += '#{';
break;
}
default:
}
parent.prop += node.content[0].content;
if (this.raws.interpolation) {
parent.prop += '}';
this.raws.interpolation = false;
}
}
}, {
key: 'value',
value: function value(node, parent) {
if (!parent.value) {
parent.value = '';
}
// Set value for Declaration node
if (node.content.length) {
node.content.forEach(function (contentNode) {
switch (contentNode.type) {
case 'important':
{
parent.raws.important = contentNode.content;
parent.important = true;
var match = parent.value.match(/^(.*?)(\s*)$/);
if (match) {
parent.raws.important = match[2] + parent.raws.important;
parent.value = match[1];
}
break;
}
case 'parentheses':
{
parent.value += contentNode.content.join('') + ')';
break;
}
case 'percentage':
{
parent.value += contentNode.content.join('') + '%';
break;
}
default:
{
if (contentNode.content.constructor === Array) {
parent.value += contentNode.content.join('');
} else {
parent.value += contentNode.content;
}
}
}
});
}
}
}, {
key: 'singlelineComment',
value: function singlelineComment(node, parent) {
return this.comment(node, parent, true);
}
}, {
key: 'multilineComment',
value: function multilineComment(node, parent) {
return this.comment(node, parent, false);
}
}, {
key: 'comment',
value: function comment(node, parent, inline) {
// https://github.com/nodesecurity/eslint-plugin-security#detect-unsafe-regex
// eslint-disable-next-line security/detect-unsafe-regex
var text = node.content.match(/^(\s*)((?:\S[\s\S]*?)?)(\s*)$/);
this.raws.comment = true;
var comment = Object.assign(postcss.comment(), {
text: text[2],
raws: {
before: this.raws.before || DEFAULT_COMMENT_DECL.before,
left: text[1],
right: text[3],
inline: inline
},
source: {
start: {
line: node.start.line,
column: node.start.column
},
end: node.end,
input: this.input
},
parent: parent
});
if (this.raws.beforeMulti) {
comment.raws.before += this.raws.beforeMulti;
this.raws.beforeMulti = undefined;
}
parent.nodes.push(comment);
this.raws.before = '';
}
}, {
key: 'space',
value: function space(node, parent) {
// Spaces before root and rule
switch (parent.type) {
case 'root':
{
this.raws.before += node.content;
break;
}
case 'rule':
{
if (this.raws.comment) {
this.raws.before += node.content;
} else if (this.raws.loop) {
parent.selector += node.content;
} else {
this.raws.before = (this.raws.before || '\n') + node.content;
}
break;
}
default:
}
}
}, {
key: 'declarationDelimiter',
value: function declarationDelimiter(node) {
this.raws.before += node.content;
}
}, {
key: 'loop',
value: function loop(node, parent) {
var _this5 = this;
var loop = postcss.rule();
this.raws.comment = false;
this.raws.multiRule = false;
this.raws.loop = true;
loop.selector = '';
loop.raws = {
before: this.raws.before || DEFAULT_RAWS_RULE.before,
between: DEFAULT_RAWS_RULE.between
};
if (this.raws.beforeMulti) {
loop.raws.before += this.raws.beforeMulti;
this.raws.beforeMulti = undefined;
}
node.content.forEach(function (contentNode, i) {
if (node.content[i + 1] && node.content[i + 1].type === 'block') {
_this5.raws.loop = false;
}
_this5.process(contentNode, loop);
});
parent.nodes.push(loop);
this.raws.loop = false;
}
}, {
key: 'atkeyword',
value: function atkeyword(node, parent) {
parent.selector += '@' + node.content;
}
}, {
key: 'operator',
value: function operator(node, parent) {
parent.selector += node.content;
}
}, {
key: 'variable',
value: function variable(node, parent) {
if (this.raws.loop) {
parent.selector += '$' + node.content[0].content;
} else {
parent.selector += '#' + node.content[0].content;
}
}
}, {
key: 'ident',
value: function ident(node, parent) {
parent.selector += node.content;
}
}]);
return SassParser;
}();
module.exports = SassParser;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBhcnNlci5lczYiXSwibmFtZXMiOlsicG9zdGNzcyIsInJlcXVpcmUiLCJnb256YWxlcyIsIkRFRkFVTFRfUkFXU19ST09UIiwiYmVmb3JlIiwiREVGQVVMVF9SQVdTX1JVTEUiLCJiZXR3ZWVuIiwiREVGQVVMVF9SQVdTX0RFQ0wiLCJzZW1pY29sb24iLCJERUZBVUxUX0NPTU1FTlRfREVDTCIsImxlZnQiLCJyaWdodCIsIlNhc3NQYXJzZXIiLCJpbnB1dCIsIm5vZGUiLCJwYXJzZSIsImNzcyIsInN5bnRheCIsImVycm9yIiwibWVzc2FnZSIsImxpbmUiLCJsaW5lcyIsIm1hdGNoIiwicm9vdCIsInN0eWxlc2hlZXQiLCJzdGFydCIsImVuZCIsIm5vZGVMaW5lcyIsInNsaWNlIiwic3Vic3RyaW5nIiwiY29sdW1uIiwibGFzdCIsImxlbmd0aCIsImpvaW4iLCJzb3VyY2UiLCJyYXdzIiwiY29udGVudCIsImZvckVhY2giLCJwcm9jZXNzIiwiY29udGVudE5vZGUiLCJwYXJlbnQiLCJ0eXBlIiwibXVsdGlSdWxlUHJvcCIsInJ1bGUiLCJzZWxlY3RvciIsInJ1bGVSYXdzIiwiY29tbWVudCIsImZpbHRlciIsImlubmVyQ29udGVudE5vZGUiLCJub2RlcyIsImV4dHJhY3RTb3VyY2UiLCJyZXBsYWNlIiwic3BhY2VzIiwicHVzaCIsIm11bHRpUnVsZSIsIm11bHRpUnVsZVByb3BWYXJpYWJsZSIsIk9iamVjdCIsImFzc2lnbiIsImN1c3RvbVByb3BlcnR5IiwiYmVmb3JlTXVsdGkiLCJpc0Jsb2NrSW5zaWRlIiwiZGVjbGFyYXRpb25Ob2RlIiwiZGVjbCIsInByb3AiLCJkZWNsYXJhdGlvblJhd3MiLCJwcm9wZXJ0eSIsImJldHdlZW5CZWZvcmUiLCJBcnJheSIsImlzQXJyYXkiLCJ2YWx1ZSIsImludGVycG9sYXRpb24iLCJpbXBvcnRhbnQiLCJjb25zdHJ1Y3RvciIsImlubGluZSIsInRleHQiLCJ1bmRlZmluZWQiLCJsb29wIiwiaSIsIm1vZHVsZSIs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LFVBQWpCIiwiZmlsZSI6InBhcnNlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IHBvc3Rjc3MgPSByZXF1aXJlKCdwb3N0Y3NzJylcbmNvbnN0IGdvbnphbGVzID0gcmVxdWlyZSgnZ29uemFsZXMtcGUnKVxuXG5jb25zdCBERUZBVUxUX1JBV1NfUk9PVCA9IHtcbiAgYmVmb3JlOiAnJ1xufVxuXG5jb25zdCBERUZBVUxUX1JBV1NfUlVMRSA9IHtcbiAgYmVmb3JlOiAnJyxcbiAgYmV0d2VlbjogJydcbn1cblxuY29uc3QgREVGQVVMVF9SQVdTX0RFQ0wgPSB7XG4gIGJlZm9yZTogJycsXG4gIGJldHdlZW46ICcnLFxuICBzZW1pY29sb246IGZhbHNlXG59XG5cbmNvbnN0IERFRkFVTFRfQ09NTUVOVF9ERUNMID0ge1xuICBiZWZvcmU6ICcnLFxuICBsZWZ0OiAnJyxcbiAgcmlnaHQ6ICcnXG59XG5cbmNsYXNzIFNhc3NQYXJzZXIge1xuICBjb25zdHJ1Y3RvciAoaW5wdXQpIHtcbiAgICB0aGlzLmlucHV0ID0gaW5wdXRcbiAgfVxuICBwYXJzZSAoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubm9kZSA9IGdvbnphbGVzLnBhcnNlKHRoaXMuaW5wdXQuY3NzLCB7IHN5bnRheDogJ3Nhc3MnIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IHRoaXMuaW5wdXQuZXJyb3IoZXJyb3IubWVzc2FnZSwgZXJyb3IubGluZSwgMSlcbiAgICB9XG4gICAgdGhpcy5saW5lcyA9IHRoaXMuaW5wdXQuY3NzLm1hdGNoKC9eLiooXFxyP1xcbnwkKS9nbSlcbiAgICB0aGlzLnJvb3QgPSB0aGlzLnN0eWxlc2hlZXQodGhpcy5ub2RlKVxuICB9XG4gIGV4dHJhY3RTb3VyY2UgKHN0YXJ0LCBlbmQpIHtcbiAgICBsZXQgbm9kZUxpbmVzID0gdGhpcy5saW5lcy5zbGljZShcbiAgICAgIHN0YXJ0LmxpbmUgLSAxLFxuICAgICAgZW5kLmxpbmVcbiAgICApXG5cbiAgICBub2RlTGluZXNbMF0gPSBub2RlTGluZXNbMF0uc3Vic3RyaW5nKHN0YXJ0LmNvbHVtbiAtIDEpXG4gICAgbGV0IGxhc3QgPSBub2RlTGluZXMubGVuZ3RoIC0gMVxuICAgIG5vZGVMaW5lc1tsYXN0XSA9IG5vZGVMaW5lc1tsYXN0XS5zdWJzdHJpbmcoMCwgZW5kLmNvbHVtbilcblxuICAgIHJldHVybiBub2RlTGluZXMuam9pbignJylcbiAgfVxuICBzdHlsZXNoZWV0IChub2RlKSB7XG4gICAgLy8gQ3JlYXRlIGFuZCBzZXQgcGFyYW1ldGVycyBmb3IgUm9vdCBub2RlXG4gICAgbGV0IHJvb3QgPSBwb3N0Y3NzLnJvb3QoKVxuICAgIHJvb3Quc291cmNlID0ge1xuICAgICAgc3RhcnQ6IG5vZGUuc3RhcnQsXG4gICAgICBlbmQ6IG5vZGUuZW5kLFxuICAgICAgaW5wdXQ6IHRoaXMuaW5wdXRcbiAgICB9XG4gICAgLy8gUmF3cyBmb3Igcm9vdCBub2RlXG4gICAgcm9vdC5yYXdzID0ge1xuICAgICAgc2VtaWNvbG9uOiBERUZBVUxUX1JBV1NfUk9PVC5zZW1pY29sb24sXG4gICAgICBiZWZvcmU6IERFRkFVTFRfUkFXU19ST09ULmJlZm9yZVxuICAgIH1cbiAgICAvLyBTdG9yZSBzcGFjZXMgYmVmb3JlIHJvb3QgKGlmIGV4aXN0KVxuICAgIHRoaXMucmF3cyA9IHtcbiAgICAgIGJlZm9yZTogJydcbiAgICB9XG4gICAgbm9kZS5jb250ZW50LmZvckVhY2goY29udGVudE5vZGUgPT4gdGhpcy5wcm9jZXNzKGNvbnRlbnROb2RlLCByb290KSlcbiAgICByZXR1cm4gcm9vdFxuICB9XG4gIHByb2Nlc3MgKG5vZGUsIHBhcmVudCkge1xuICAgIGlmICh0aGlzW25vZGUudHlwZV0pIHtcbiAgICAgIHJldHVybiB0aGlzW25vZGUudHlwZV0obm9kZSwgcGFyZW50KSB8fCBudWxsXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG4gIHJ1bGVzZXQgKG5vZGUsIHBhcmVudCkge1xuICAgIC8vIExvb3AgdG8gZmluZCB0aGUgZGVlcGVzdCBydWxlc2V0IG5vZGVcbiAgICB0aGlzLnJhd3MubXVsdGlSdWxlUHJvcCA9ICcnXG5cbiAgICBub2RlLmNvbnRlbnQuZm9yRWFjaChjb250ZW50Tm9kZSA9PiB7XG4gICAgICBzd2l0Y2ggKGNvbnRlbnROb2RlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnYmxvY2snOiB7XG4gICAgICAgICAgLy8gQ3JlYXRlIFJ1bGUgbm9kZVxuICAgICAgICAgIGxldCBydWxlID0gcG9zdGNzcy5ydWxlKClcbiAgICAgICAgICBydWxlLnNlbGVjdG9yID0gJydcbiAgICAgICAgICAvLyBPYmplY3QgdG8gc3RvcmUgcmF3cyBmb3IgUnVsZVxuICAgICAgICAgIGxldCBydWxlUmF3cyA9IHtcbiAgICAgICAgICAgIGJlZm9yZTogdGhpcy5yYXdzLmJlZm9yZSB8fCBERUZBVUxUX1JBV1NfUlVMRS5iZWZvcmUsXG4gICAgICAgICAgICBiZXR3ZWVuOiBERUZBVUxUX1JBV1NfUlVMRS5iZXR3ZWVuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVmFyaWFibGUgdG8gc3RvcmUgc3BhY2VzIGFuZCBzeW1ib2xzIGJlZm9yZSBkZWNsYXJhdGlvbiBwcm9wZXJ0eVxuICAgICAgICAgIHRoaXMucmF3cy5iZWZvcmUgPSAnJ1xuICAgICAgICAgIHRoaXMucmF3cy5jb21tZW50ID0gZmFsc2VcblxuICAgICAgICAgIC8vIExvb2sgdXAgdGhyb3cgYWxsIG5vZGVzIGluIGN1cnJlbnQgcnVsZXNldCBub2RlXG4gICAgICAgICAgbm9kZS5jb250ZW50XG4gICAgICAgICAgICAuZmlsdGVyKGNvbnRlbnQgPT4gY29udGVudC50eXBlID09PSAnYmxvY2snKVxuICAgICAgICAgICAgLmZvckVhY2goaW5uZXJDb250ZW50Tm9kZSA9PiB0aGlzLnByb2Nlc3MoaW5uZXJDb250ZW50Tm9kZSwgcnVsZSkpXG5cbiAgICAgICAgICBpZiAocnVsZS5ub2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIFdyaXRlIHNlbGVjdG9yIHRvIFJ1bGVcbiAgICAgICAgICAgIHJ1bGUuc2VsZWN0b3IgPSB0aGlzLmV4dHJhY3RTb3VyY2UoXG4gICAgICAgICAgICAgIG5vZGUuc3RhcnQsXG4gICAgICAgICAgICAgIGNvbnRlbnROb2RlLnN0YXJ0XG4gICAgICAgICAgICApLnNsaWNlKDAsIC0xKS5yZXBsYWNlKC9cXHMrJC8sIHNwYWNlcyA9PiB7XG4gICAgICAgICAgICAgIHJ1bGVSYXdzLmJldHdlZW4gPSBzcGFjZXNcbiAgICAgICAgICAgICAgcmV0dXJuICcnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLy8gU2V0IHBhcmFtZXRlcnMgZm9yIFJ1bGUgbm9kZVxuICAgICAgICAgICAgcnVsZS5wYXJlbnQgPSBwYXJlbnRcbiAgICAgICAgICAgIHJ1bGUuc291cmNlID0ge1xuICAgICAgICAgICAgICBzdGFydDogbm9kZS5zdGFydCxcbiAgICAgICAgICAgICAgZW5kOiBub2RlLmVuZCxcbiAgICAgICAgICAgICAgaW5wdXQ6IHRoaXMuaW5wdXRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJ1bGUucmF3cyA9IHJ1bGVSYXdzXG4gICAgICAgICAgICBwYXJlbnQubm9kZXMucHVzaChydWxlKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICB9XG4gICAgfSlcbiAgfVxuICBibG9jayAobm9kZSwgcGFyZW50KSB7XG4gICAgLy8gSWYgbmVzdGVkIHJ1bGVzIGV4aXN0LCB3cmFwIGN1cnJlbnQgcnVsZSBpbiBuZXcgcnVsZSBub2RlXG4gICAgaWYgKHRoaXMucmF3cy5tdWx0aVJ1bGUpIHtcbiAgICAgIGlmICh0aGlzLnJhd3MubXVsdGlSdWxlUHJvcFZhcmlhYmxlKSB7XG4gICAgICAgIHRoaXMucmF3cy5tdWx0aVJ1bGVQcm9wID0gYCQkeyB0aGlzLnJhd3MubXVsdGlSdWxlUHJvcCB9YFxuICAgICAgfVxuICAgICAgbGV0IG11bHRpUnVsZSA9IE9iamVjdC5hc3NpZ24ocG9zdGNzcy5ydWxlKCksIHtcbiAgICAgICAgc291cmNlOiB7XG4gICAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICAgIGxpbmU6IG5vZGUuc3RhcnQubGluZSAtIDEsXG4gICAgICAgICAgICBjb2x1bW46IG5vZGUuc3RhcnQuY29sdW1uXG4gICAgICAgICAgfSxcbiAgICAgICAgICBlbmQ6IG5vZGUuZW5kLFxuICAgICAgICAgIGlucHV0OiB0aGlzLmlucHV0XG4gICAgICAgIH0sXG4gICAgICAgIHJhd3M6IHtcbiAgICAgICAgICBiZWZvcmU6IHRoaXMucmF3cy5iZWZvcmUgfHwgREVGQVVMVF9SQVdTX1JVTEUuYmVmb3JlLFxuICAgICAgICAgIGJldHdlZW46IERFRkFVTFRfUkFXU19SVUxFLmJldHdlZW5cbiAgICAgICAgfSxcbiAgICAgICAgcGFyZW50LFxuICAgICAgICBzZWxlY3RvcjogKHRoaXMucmF3cy5jdXN0b21Qcm9wZXJ0eSA/ICctLScgOiAnJykgKyB0aGlzLnJhd3MubXVsdGlSdWxlUHJvcFxuICAgICAgfSlcbiAgICAgIHBhcmVudC5wdXNoKG11bHRpUnVsZSlcbiAgICAgIHBhcmVudCA9IG11bHRpUnVsZVxuICAgIH1cblxuICAgIHRoaXMucmF3cy5iZWZvcmUgPSAnJ1xuXG4gICAgLy8gTG9va2luZyBmb3IgZGVjbGFyYXRpb24gbm9kZSBpbiBibG9jayBub2RlXG4gICAgbm9kZS5jb250ZW50LmZvckVhY2goY29udGVudE5vZGUgPT4gdGhpcy5wcm9jZXNzKGNvbnRlbnROb2RlLCBwYXJlbnQpKVxuICAgIGlmICh0aGlzLnJhd3MubXVsdGlSdWxlKSB7XG4gICAgICB0aGlzLnJhd3MuYmVmb3JlTXVsdGkgPSB0aGlzLnJhd3MuYmVmb3JlXG4gICAgfVxuICB9XG4gIGRlY2xhcmF0aW9uIChub2RlLCBwYXJlbnQpIHtcbiAgICBsZXQgaXNCbG9ja0luc2lkZSA9IGZhbHNlXG4gICAgLy8gQ3JlYXRlIERlY2xhcmF0aW9uIG5vZGVcbiAgICBsZXQgZGVjbGFyYXRpb25Ob2RlID0gcG9zdGNzcy5kZWNsKClcbiAgICBkZWNsYXJhdGlvbk5vZGUucHJvcCA9ICcnXG5cbiAgICAvLyBPYmplY3QgdG8gc3RvcmUgcmF3cyBmb3IgRGVjbGFyYXRpb25cbiAgICBsZXQgZGVjbGFyYXRpb25SYXdzID0gT2JqZWN0LmFzc2lnbihkZWNsYXJhdGlvbk5vZGUucmF3cywge1xuICAgICAgYmVmb3JlOiB0aGlzLnJhd3MuYmVmb3JlIHx8IERFRkFVTFRfUkFXU19ERUNMLmJlZm9yZSxcbiAgICAgIGJldHdlZW46IERFRkFVTFRfUkFXU19ERUNMLmJldHdlZW4sXG4gICAgICBzZW1pY29sb246IERFRkFVTFRfUkFXU19ERUNMLnNlbWljb2xvblxuICAgIH0pXG5cbiAgICB0aGlzLnJhd3MucHJvcGVydHkgPSBmYWxzZVxuICAgIHRoaXMucmF3cy5iZXR3ZWVuQmVmb3JlID0gZmFsc2VcbiAgICB0aGlzLnJhd3MuY29tbWVudCA9IGZhbHNlXG4gICAgLy8gTG9va2luZyBmb3IgcHJvcGVydHkgYW5kIHZhbHVlIG5vZGUgaW4gZGVjbGFyYXRpb24gbm9kZVxuICAgIG5vZGUuY29udGVudC5mb3JFYWNoKGNvbnRlbnROb2RlID0+IHtcbiAgICAgIHN3aXRjaCAoY29udGVudE5vZGUudHlwZSkge1xuICAgICAgICBjYXNlICdjdXN0b21Qcm9wZXJ0eSc6XG4gICAgICAgICAgdGhpcy5yYXdzLmN1c3RvbVByb3BlcnR5ID0gdHJ1ZVxuICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaFxuICAgICAgICBjYXNlICdwcm9wZXJ0eSc6IHtcbiAgICAgICAgICAvKiB0aGlzLnJhd3MucHJvcGVydHkgdG8gZGV0ZWN0IGlzIHByb3BlcnR5IGlzIGFscmVhZHkgZGVmaW5lZCBpbiBjdXJyZW50IG9iamVjdCAqL1xuICAgICAgICAgIHRoaXMucmF3cy5wcm9wZXJ0eSA9IHRydWVcbiAgICAgICAgICB0aGlzLnJhd3MubXVsdGlSdWxlUHJvcCA9IGNvbnRlbnROb2RlLmNvbnRlbnRbMF0uY29udGVudFxuICAgICAgICAgIHRoaXMucmF3cy5tdWx0aVJ1bGVQcm9wVmFyaWFibGUgPSBjb250ZW50Tm9kZS5jb250ZW50WzBdLnR5cGUgPT09ICd2YXJpYWJsZSdcbiAgICAgICAgICB0aGlzLnByb2Nlc3MoY29udGVudE5vZGUsIGRlY2xhcmF0aW9uTm9kZSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Byb3BlcnR5RGVsaW1pdGVyJzoge1xuICAgICAgICAgIGlmICh0aGlzLnJhd3MucHJvcGVydHkgJiYgIXRoaXMucmF3cy5iZXR3ZWVuQmVmb3JlKSB7XG4gICAgICAgICAgICAvKiBJZiBwcm9wZXJ0eSBpcyBhbHJlYWR5IGRlZmluZWQgYW5kIHRoZXJlJ3Mgbm8gJzonIGJlZm9yZSBpdCAqL1xuICAgICAgICAgICAgZGVjbGFyYXRpb25SYXdzLmJldHdlZW4gKz0gY29udGVudE5vZGUuY29udGVudFxuICAgICAgICAgICAgdGhpcy5yYXdzLm11bHRpUnVsZVByb3AgKz0gY29udGVudE5vZGUuY29udGVudFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvKiBJZiAnOicgZ29lcyBiZWZvcmUgcHJvcGVydHkgZGVjbGFyYXRpb24sIGxpa2UgOndpZHRoIDEwMHB4ICovXG4gICAgICAgICAgICB0aGlzLnJhd3MuYmV0d2VlbkJlZm9yZSA9IHRydWVcbiAgICAgICAgICAgIGRlY2xhcmF0aW9uUmF3cy5iZWZvcmUgKz0gY29udGVudE5vZGUuY29udGVudFxuICAgICAgICAgICAgdGhpcy5yYXdzLm11bHRpUnVsZVByb3AgKz0gY29udGVudE5vZGUuY29udGVudFxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3NwYWNlJzoge1xuICAgICAgICAgIGRlY2xhcmF0aW9uUmF3cy5iZXR3ZWVuICs9IGNvbnRlbnROb2RlLmNvbnRlbnRcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3ZhbHVlJzoge1xuICAgICAgICAgIC8vIExvb2sgdXAgZm9yIGEgdmFsdWUgZm9yIGN1cnJlbnQgcHJvcGVydHlcbiAgICAgICAgICBzd2l0Y2ggKGNvbnRlbnROb2RlLmNvbnRlbnRbMF0udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnYmxvY2snOiB7XG4gICAgICAgICAgICAgIGlzQmxvY2tJbnNpZGUgPSB0cnVlXG4gICAgICAgICAgICAgIC8vIElmIG5lc3RlZCBydWxlcyBleGlzdFxuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250ZW50Tm9kZS5jb250ZW50WzBdLmNvbnRlbnQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yYXdzLm11bHRpUnVsZSA9IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLnByb2Nlc3MoY29udGVudE5vZGUuY29udGVudFswXSwgcGFyZW50KVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAndmFyaWFibGUnOiB7XG4gICAgICAgICAgICAgIGRlY2xhcmF0aW9uTm9kZS52YWx1ZSA9ICckJ1xuICAgICAgICAgICAgICB0aGlzLnByb2Nlc3MoY29udGVudE5vZGUsIGRlY2xhcmF0aW9uTm9kZSlcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2NvbG9yJzoge1xuICAgICAgICAgICAgICBkZWNsYXJhdGlvbk5vZGUudmFsdWUgPSAnIydcbiAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzKGNvbnRlbnROb2RlLCBkZWNsYXJhdGlvbk5vZGUpXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgICAgICAgIGlmIChjb250ZW50Tm9kZS5jb250ZW50Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbk5vZGUudmFsdWUgPSBjb250ZW50Tm9kZS5jb250ZW50LmpvaW4oJycpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzKGNvbnRlbnROb2RlLCBkZWNsYXJhdGlvbk5vZGUpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ3BhcmVudGhlc2VzJzoge1xuICAgICAgICAgICAgICBkZWNsYXJhdGlvbk5vZGUudmFsdWUgPSAnKCdcbiAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzKGNvbnRlbnROb2RlLCBkZWNsYXJhdGlvbk5vZGUpXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgIHRoaXMucHJvY2Vzcyhjb250ZW50Tm9kZSwgZGVjbGFyYXRpb25Ob2RlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICB9XG4gICAgfSlcblxuICAgIGlmICghaXNCbG9ja0luc2lkZSkge1xuICAgICAgLy8gU2V0IHBhcmFtZXRlcnMgZm9yIERlY2xhcmF0aW9uIG5vZGVcbiAgICAgIGRlY2xhcmF0aW9uTm9kZS5zb3VyY2UgPSB7XG4gICAgICAgIHN0YXJ0OiBub2RlLnN0YXJ0LFxuICAgICAgICBlbmQ6IG5vZGUuZW5kLFxuICAgICAgICBpbnB1dDogdGhpcy5pbnB1dFxuICAgICAgfVxuICAgICAgZGVjbGFyYXRpb25Ob2RlLnBhcmVudCA9IHBhcmVudFxuICAgICAgcGFyZW50Lm5vZGVzLnB1c2goZGVjbGFyYXRpb25Ob2RlKVxuICAgIH1cblxuICAgIHRoaXMucmF3cy5iZWZvcmUgPSAnJ1xuICAgIHRoaXMucmF3cy5jdXN0b21Qcm9wZXJ0eSA9IGZhbHNlXG4gICAgdGhpcy5yYXdzLm11bHRpUnVsZVByb3AgPSAnJ1xuICAgIHRoaXMucmF3cy5wcm9wZXJ0eSA9IGZhbHNlXG4gIH1cbiAgY3VzdG9tUHJvcGVydHkgKG5vZGUsIHBhcmVudCkge1xuICAgIHRoaXMucHJvcGVydHkobm9kZSwgcGFyZW50KVxuICAgIHBhcmVudC5wcm9wID0gYC0tJHsgcGFyZW50LnByb3AgfWBcbiAgfVxuICBwcm9wZXJ0eSAobm9kZSwgcGFyZW50KSB7XG4gICAgLy8gU2V0IHByb3BlcnR5IGZvciBEZWNsYXJhdGlvbiBub2RlXG4gICAgc3dpdGNoIChub2RlLmNvbnRlbnRbMF0udHlwZSkge1xuICAgICAgY2FzZSAndmFyaWFibGUnOiB7XG4gICAgICAgIHBhcmVudC5wcm9wICs9ICckJ1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnaW50ZXJwb2xhdGlvbic6IHtcbiAgICAgICAgdGhpcy5yYXdzLmludGVycG9sYXRpb24gPSB0cnVlXG4gICAgICAgIHBhcmVudC5wcm9wICs9ICcjeydcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICAgIHBhcmVudC5wcm9wICs9IG5vZGUuY29udGVudFswXS5jb250ZW50XG4gICAgaWYgKHRoaXMucmF3cy5pbnRlcnBvbGF0aW9uKSB7XG4gICAgICBwYXJlbnQucHJvcCArPSAnfSdcbiAgICAgIHRoaXMucmF3cy5pbnRlcnBvbGF0aW9uID0gZmFsc2VcbiAgICB9XG4gIH1cbiAgdmFsdWUgKG5vZGUsIHBhcmVudCkge1xuICAgIGlmICghcGFyZW50LnZhbHVlKSB7XG4gICAgICBwYXJlbnQudmFsdWUgPSAnJ1xuICAgIH1cbiAgICAvLyBTZXQgdmFsdWUgZm9yIERlY2xhcmF0aW9uIG5vZGVcbiAgICBpZiAobm9kZS5jb250ZW50Lmxlbmd0aCkge1xuICAgICAgbm9kZS5jb250ZW50LmZvckVhY2goY29udGVudE5vZGUgPT4ge1xuICAgICAgICBzd2l0Y2ggKGNvbnRlbnROb2RlLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdpbXBvcnRhbnQnOiB7XG4gICAgICAgICAgICBwYXJlbnQucmF3cy5pbXBvcnRhbnQgPSBjb250ZW50Tm9kZS5jb250ZW50XG4gICAgICAgICAgICBwYXJlbnQuaW1wb3J0YW50ID0gdHJ1ZVxuICAgICAgICAgICAgbGV0IG1hdGNoID0gcGFyZW50LnZhbHVlLm1hdGNoKC9eKC4qPykoXFxzKikkLylcbiAgICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgICBwYXJlbnQucmF3cy5pbXBvcnRhbnQgPSBtYXRjaFsyXSArIHBhcmVudC5yYXdzLmltcG9ydGFudFxuICAgICAgICAgICAgICBwYXJlbnQudmFsdWUgPSBtYXRjaFsxXVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAncGFyZW50aGVzZXMnOiB7XG4gICAgICAgICAgICBwYXJlbnQudmFsdWUgKz0gY29udGVudE5vZGUuY29udGVudC5qb2luKCcnKSArICcpJ1xuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAncGVyY2VudGFnZSc6IHtcbiAgICAgICAgICAgIHBhcmVudC52YWx1ZSArPSBjb250ZW50Tm9kZS5jb250ZW50LmpvaW4oJycpICsgJyUnXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBpZiAoY29udGVudE5vZGUuY29udGVudC5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHtcbiAgICAgICAgICAgICAgcGFyZW50LnZhbHVlICs9IGNvbnRlbnROb2RlLmNvbnRlbnQuam9pbignJylcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBhcmVudC52YWx1ZSArPSBjb250ZW50Tm9kZS5jb250ZW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuICBzaW5nbGVsaW5lQ29tbWVudCAobm9kZSwgcGFyZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuY29tbWVudChub2RlLCBwYXJlbnQsIHRydWUpXG4gIH1cbiAgbXVsdGlsaW5lQ29tbWVudCAobm9kZSwgcGFyZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuY29tbWVudChub2RlLCBwYXJlbnQsIGZhbHNlKVxuICB9XG4gIGNvbW1lbnQgKG5vZGUsIHBhcmVudCwgaW5saW5lKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVzZWN1cml0eS9lc2xpbnQtcGx1Z2luLXNlY3VyaXR5I2RldGVjdC11bnNhZmUtcmVnZXhcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc2VjdXJpdHkvZGV0ZWN0LXVuc2FmZS1yZWdleFxuICAgIGxldCB0ZXh0ID0gbm9kZS5jb250ZW50Lm1hdGNoKC9eKFxccyopKCg/OlxcU1tcXHNcXFNdKj8pPykoXFxzKikkLylcblxuICAgIHRoaXMucmF3cy5jb21tZW50ID0gdHJ1ZVxuXG4gICAgbGV0IGNvbW1lbnQgPSBPYmplY3QuYXNzaWduKHBvc3Rjc3MuY29tbWVudCgpLCB7XG4gICAgICB0ZXh0OiB0ZXh0WzJdLFxuICAgICAgcmF3czoge1xuICAgICAgICBiZWZvcmU6IHRoaXMucmF3cy5iZWZvcmUgfHwgREVGQVVMVF9DT01NRU5UX0RFQ0wuYmVmb3JlLFxuICAgICAgICBsZWZ0OiB0ZXh0WzFdLFxuICAgICAgICByaWdodDogdGV4dFszXSxcbiAgICAgICAgaW5saW5lXG4gICAgICB9LFxuICAgICAgc291cmNlOiB7XG4gICAgICAgIHN0YXJ0OiB7XG4gICAgICAgICAgbGluZTogbm9kZS5zdGFydC5saW5lLFxuICAgICAgICAgIGNvbHVtbjogbm9kZS5zdGFydC5jb2x1bW5cbiAgICAgICAgfSxcbiAgICAgICAgZW5kOiBub2RlLmVuZCxcbiAgICAgICAgaW5wdXQ6IHRoaXMuaW5wdXRcbiAgICAgIH0sXG4gICAgICBwYXJlbnRcbiAgICB9KVxuXG4gICAgaWYgKHRoaXMucmF3cy5iZWZvcmVNdWx0aSkge1xuICAgICAgY29tbWVudC5yYXdzLmJlZm9yZSArPSB0aGlzLnJhd3MuYmVmb3JlTXVsdGlcbiAgICAgIHRoaXMucmF3cy5iZWZvcmVNdWx0aSA9IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIHBhcmVudC5ub2Rlcy5wdXNoKGNvbW1lbnQpXG4gICAgdGhpcy5yYXdzLmJlZm9yZSA9ICcnXG4gIH1cbiAgc3BhY2UgKG5vZGUsIHBhcmVudCkge1xuICAgIC8vIFNwYWNlcyBiZWZvcmUgcm9vdCBhbmQgcnVsZVxuICAgIHN3aXRjaCAocGFyZW50LnR5cGUpIHtcbiAgICAgIGNhc2UgJ3Jvb3QnOiB7XG4gICAgICAgIHRoaXMucmF3cy5iZWZvcmUgKz0gbm9kZS5jb250ZW50XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdydWxlJzoge1xuICAgICAgICBpZiAodGhpcy5yYXdzLmNvbW1lbnQpIHtcbiAgICAgICAgICB0aGlzLnJhd3MuYmVmb3JlICs9IG5vZGUuY29udGVudFxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmF3cy5sb29wKSB7XG4gICAgICAgICAgcGFyZW50LnNlbGVjdG9yICs9IG5vZGUuY29udGVudFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmF3cy5iZWZvcmUgPSAodGhpcy5yYXdzLmJlZm9yZSB8fCAnXFxuJykgKyBub2RlLmNvbnRlbnRcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICB9XG4gIH1cbiAgZGVjbGFyYXRpb25EZWxpbWl0ZXIgKG5vZGUpIHtcbiAgICB0aGlzLnJhd3MuYmVmb3JlICs9IG5vZGUuY29udGVudFxuICB9XG4gIGxvb3AgKG5vZGUsIHBhcmVudCkge1xuICAgIGxldCBsb29wID0gcG9zdGNzcy5ydWxlKClcbiAgICB0aGlzLnJhd3MuY29tbWVudCA9IGZhbHNlXG4gICAgdGhpcy5yYXdzLm11bHRpUnVsZSA9IGZhbHNlXG4gICAgdGhpcy5yYXdzLmxvb3AgPSB0cnVlXG4gICAgbG9vcC5zZWxlY3RvciA9ICcnXG4gICAgbG9vcC5yYXdzID0ge1xuICAgICAgYmVmb3JlOiB0aGlzLnJhd3MuYmVmb3JlIHx8IERFRkFVTFRfUkFXU19SVUxFLmJlZm9yZSxcbiAgICAgIGJldHdlZW46IERFRkFVTFRfUkFXU19SVUxFLmJldHdlZW5cbiAgICB9XG4gICAgaWYgKHRoaXMucmF3cy5iZWZvcmVNdWx0aSkge1xuICAgICAgbG9vcC5yYXdzLmJlZm9yZSArPSB0aGlzLnJhd3MuYmVmb3JlTXVsdGlcbiAgICAgIHRoaXMucmF3cy5iZWZvcmVNdWx0aSA9IHVuZGVmaW5lZFxuICAgIH1cbiAgICBub2RlLmNvbnRlbnQuZm9yRWFjaCgoY29udGVudE5vZGUsIGkpID0+IHtcbiAgICAgIGlmIChub2RlLmNvbnRlbnRbaSArIDFdICYmIG5vZGUuY29udGVudFtpICsgMV0udHlwZSA9PT0gJ2Jsb2NrJykge1xuICAgICAgICB0aGlzLnJhd3MubG9vcCA9IGZhbHNlXG4gICAgICB9XG4gICAgICB0aGlzLnByb2Nlc3MoY29udGVudE5vZGUsIGxvb3ApXG4gICAgfSlcbiAgICBwYXJlbnQubm9kZXMucHVzaChsb29wKVxuICAgIHRoaXMucmF3cy5sb29wID0gZmFsc2VcbiAgfVxuICBhdGtleXdvcmQgKG5vZGUsIHBhcmVudCkge1xuICAgIHBhcmVudC5zZWxlY3RvciArPSBgQCR7IG5vZGUuY29udGVudCB9YFxuICB9XG4gIG9wZXJhdG9yIChub2RlLCBwYXJlbnQpIHtcbiAgICBwYXJlbnQuc2VsZWN0b3IgKz0gbm9kZS5jb250ZW50XG4gIH1cbiAgdmFyaWFibGUgKG5vZGUsIHBhcmVudCkge1xuICAgIGlmICh0aGlzLnJhd3MubG9vcCkge1xuICAgICAgcGFyZW50LnNlbGVjdG9yICs9IGAkJHsgbm9kZS5jb250ZW50WzBdLmNvbnRlbnQgfWBcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50LnNlbGVjdG9yICs9IGAjJHsgbm9kZS5jb250ZW50WzBdLmNvbnRlbnQgfWBcbiAgICB9XG4gIH1cbiAgaWRlbnQgKG5vZGUsIHBhcmVudCkge1xuICAgIHBhcmVudC5zZWxlY3RvciArPSBub2RlLmNvbnRlbnRcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNhc3NQYXJzZXJcbiJdfQ==