947 lines
132 KiB
JavaScript
947 lines
132 KiB
JavaScript
'use strict';
|
|
|
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
|
var defu = require('defu');
|
|
var unplugin$1 = require('unplugin');
|
|
var pluginutils = require('@rollup/pluginutils');
|
|
var MagicString = require('magic-string');
|
|
var reactivityTransform = require('@vue/reactivity-transform');
|
|
var utils = require('@antfu/utils');
|
|
var compilerCore = require('@vue/compiler-core');
|
|
var compilerDom = require('@vue/compiler-dom');
|
|
var shared = require('@vue/shared');
|
|
var babel = require('@babel/core');
|
|
var parser = require('@babel/parser');
|
|
var g = require('@babel/generator');
|
|
var babel_traverse = require('@babel/traverse');
|
|
|
|
function _interopNamespaceDefault(e) {
|
|
var n = Object.create(null);
|
|
if (e) {
|
|
Object.keys(e).forEach(function (k) {
|
|
if (k !== 'default') {
|
|
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
Object.defineProperty(n, k, d.get ? d : {
|
|
enumerable: true,
|
|
get: function () { return e[k]; }
|
|
});
|
|
}
|
|
});
|
|
}
|
|
n.default = e;
|
|
return Object.freeze(n);
|
|
}
|
|
|
|
var babel__namespace = /*#__PURE__*/_interopNamespaceDefault(babel);
|
|
var babel_traverse__namespace = /*#__PURE__*/_interopNamespaceDefault(babel_traverse);
|
|
|
|
var _a, _b, _c;
|
|
const t = (babel__namespace.default || babel__namespace).types;
|
|
const generate = g.default || g;
|
|
const traverse = (_c = (_b = (_a = babel_traverse__namespace == null ? void 0 : babel_traverse__namespace.default) == null ? void 0 : _a.default) != null ? _b : babel_traverse__namespace == null ? void 0 : babel_traverse__namespace.default) != null ? _c : babel_traverse__namespace;
|
|
|
|
function getIdentifierDeclarations(nodes) {
|
|
let result;
|
|
let programScopeUid;
|
|
traverse(t.file(t.program(nodes)), {
|
|
Program(path) {
|
|
result = new Set(Object.keys(path.scope.bindings));
|
|
programScopeUid = path.scope.uid;
|
|
},
|
|
// FIXME: babel bug, temporary add TSEnumDeclaration and TSModuleDeclaration logic
|
|
TSEnumDeclaration(path) {
|
|
if (path.scope.uid === programScopeUid)
|
|
result.add(path.node.id.name);
|
|
},
|
|
TSModuleDeclaration(path) {
|
|
if (path.scope.uid === programScopeUid) {
|
|
const id = path.node.id;
|
|
if (id.type === "Identifier")
|
|
result.add(id.name);
|
|
}
|
|
}
|
|
});
|
|
return Array.from(result);
|
|
}
|
|
function getFileGlobals(result) {
|
|
let globals;
|
|
let programScopeUid;
|
|
traverse(result, {
|
|
Program(path) {
|
|
globals = new Set(Object.keys(path.scope.globals));
|
|
programScopeUid = path.scope.uid;
|
|
},
|
|
// FIXME: babel bug, temporary add TSEnumDeclaration and TSModuleDeclaration logic
|
|
TSEnumDeclaration(path) {
|
|
if (path.scope.uid === programScopeUid)
|
|
globals.delete(path.node.id.name);
|
|
},
|
|
TSModuleDeclaration(path) {
|
|
if (path.scope.uid === programScopeUid) {
|
|
const id = path.node.id;
|
|
if (id.type === "Identifier")
|
|
globals.delete(id.name);
|
|
}
|
|
}
|
|
});
|
|
return Array.from(globals);
|
|
}
|
|
|
|
const pascalize = (str) => shared.capitalize(shared.camelize(str));
|
|
function exhaustiveCheckReturnUndefined(_param) {
|
|
return void 0;
|
|
}
|
|
|
|
var NodeTypes;
|
|
((NodeTypes2) => {
|
|
NodeTypes2.ROOT = 0;
|
|
NodeTypes2.ELEMENT = 1;
|
|
NodeTypes2.TEXT = 2;
|
|
NodeTypes2.COMMENT = 3;
|
|
NodeTypes2.SIMPLE_EXPRESSION = 4;
|
|
NodeTypes2.INTERPOLATION = 5;
|
|
NodeTypes2.ATTRIBUTE = 6;
|
|
NodeTypes2.DIRECTIVE = 7;
|
|
NodeTypes2.COMPOUND_EXPRESSION = 8;
|
|
NodeTypes2.IF = 9;
|
|
NodeTypes2.IF_BRANCH = 10;
|
|
NodeTypes2.FOR = 11;
|
|
NodeTypes2.TEXT_CALL = 12;
|
|
NodeTypes2.VNODE_CALL = 13;
|
|
NodeTypes2.JS_CALL_EXPRESSION = 14;
|
|
NodeTypes2.JS_OBJECT_EXPRESSION = 15;
|
|
NodeTypes2.JS_PROPERTY = 16;
|
|
NodeTypes2.JS_ARRAY_EXPRESSION = 17;
|
|
NodeTypes2.JS_FUNCTION_EXPRESSION = 18;
|
|
NodeTypes2.JS_CONDITIONAL_EXPRESSION = 19;
|
|
NodeTypes2.JS_CACHE_EXPRESSION = 20;
|
|
NodeTypes2.JS_BLOCK_STATEMENT = 21;
|
|
NodeTypes2.JS_TEMPLATE_LITERAL = 22;
|
|
NodeTypes2.JS_IF_STATEMENT = 23;
|
|
NodeTypes2.JS_ASSIGNMENT_EXPRESSION = 24;
|
|
NodeTypes2.JS_SEQUENCE_EXPRESSION = 25;
|
|
NodeTypes2.JS_RETURN_STATEMENT = 26;
|
|
})(NodeTypes || (NodeTypes = {}));
|
|
var ElementTypes;
|
|
((ElementTypes2) => {
|
|
ElementTypes2.ELEMENT = 0;
|
|
ElementTypes2.COMPONENT = 1;
|
|
ElementTypes2.SLOT = 2;
|
|
ElementTypes2.TEMPLATE = 3;
|
|
})(ElementTypes || (ElementTypes = {}));
|
|
const BUILD_IN_DIRECTIVES = /* @__PURE__ */ new Set([
|
|
"if",
|
|
"else",
|
|
"else-if",
|
|
"for",
|
|
"once",
|
|
"model",
|
|
"on",
|
|
"bind",
|
|
"slot",
|
|
"slot-scope",
|
|
"key",
|
|
"ref",
|
|
"text",
|
|
"html",
|
|
"show",
|
|
"pre",
|
|
"cloak"
|
|
// 'el',
|
|
// 'ref',
|
|
]);
|
|
function getComponents(node) {
|
|
var _a;
|
|
const current = node.type === NodeTypes.ELEMENT && node.tagType === ElementTypes.COMPONENT ? [node.tag] : node.type === NodeTypes.ELEMENT && node.tagType === ElementTypes.ELEMENT ? [node.tag] : [];
|
|
const children = node.type === NodeTypes.IF ? node.branches : node.type === NodeTypes.ELEMENT || node.type === NodeTypes.IF_BRANCH || node.type === NodeTypes.FOR ? node.children : node.type === NodeTypes.TEXT || node.type === NodeTypes.COMMENT || node.type === NodeTypes.COMPOUND_EXPRESSION || node.type === NodeTypes.TEXT_CALL || node.type === NodeTypes.INTERPOLATION ? [] : (_a = exhaustiveCheckReturnUndefined()) != null ? _a : [];
|
|
return [...current, ...children.flatMap(getComponents)];
|
|
}
|
|
function getDirectiveNames(node) {
|
|
if (node.type === NodeTypes.ELEMENT) {
|
|
const directives = node.props.flatMap(
|
|
(x) => x.type === NodeTypes.DIRECTIVE ? [x.name] : []
|
|
);
|
|
return [...directives, ...node.children.flatMap(getDirectiveNames)];
|
|
} else if (node.type === NodeTypes.IF) {
|
|
return node.branches.flatMap(getDirectiveNames);
|
|
} else if (node.type === NodeTypes.IF_BRANCH || node.type === NodeTypes.FOR) {
|
|
return node.children.flatMap(getDirectiveNames);
|
|
} else if (node.type === NodeTypes.INTERPOLATION || node.type === NodeTypes.COMPOUND_EXPRESSION || node.type === NodeTypes.TEXT || node.type === NodeTypes.COMMENT || node.type === NodeTypes.TEXT_CALL) {
|
|
return [];
|
|
} else {
|
|
return [];
|
|
}
|
|
}
|
|
function getFreeVariablesForText(input) {
|
|
const inputWithPrefix = input.trimStart()[0] === "{" ? `(${input})` : input;
|
|
return getFileGlobals(parser.parse(inputWithPrefix));
|
|
}
|
|
function getFreeVariablesForPropsNode(node) {
|
|
if (node.type === NodeTypes.DIRECTIVE) {
|
|
const arg = node.arg === void 0 ? [] : getFreeVariablesForNode(node.arg);
|
|
const exp = node.exp === void 0 ? [] : getFreeVariablesForNode(node.exp);
|
|
return [...arg, ...exp];
|
|
}
|
|
return [];
|
|
}
|
|
function getFreeVariablesForNode(node) {
|
|
var _a, _b, _c;
|
|
if (node.type === NodeTypes.SIMPLE_EXPRESSION) {
|
|
return node.isStatic ? [] : getFreeVariablesForText(node.content);
|
|
} else if (node.type === NodeTypes.COMPOUND_EXPRESSION) {
|
|
return node.children.flatMap(
|
|
(x) => typeof x !== "object" ? [] : getFreeVariablesForNode(x)
|
|
);
|
|
} else if (node.type === NodeTypes.INTERPOLATION) {
|
|
return getFreeVariablesForNode(node.content);
|
|
} else if (node.type === NodeTypes.ELEMENT) {
|
|
const children = node.children.flatMap(getFreeVariablesForNode);
|
|
const directiveProps = node.props.flatMap(
|
|
(x) => x.type === NodeTypes.DIRECTIVE ? [x] : []
|
|
);
|
|
const attributeProps = node.props.flatMap(
|
|
(x) => x.type === NodeTypes.ATTRIBUTE ? [x] : []
|
|
);
|
|
const refNode = attributeProps.find(
|
|
(node2) => node2.name === "ref" && node2.value !== void 0
|
|
);
|
|
const refIdentifier = (_a = refNode == null ? void 0 : refNode.value) == null ? void 0 : _a.content;
|
|
const vSlotNode = directiveProps.find((node2) => node2.name === "slot");
|
|
const vSlotArgIdentifiers = (vSlotNode == null ? void 0 : vSlotNode.arg) === void 0 ? [] : getFreeVariablesForNode(vSlotNode.arg);
|
|
const vSlotExpVariableShadowingIdentifiers = [];
|
|
const vForNode = directiveProps.find((node2) => node2.name === "for");
|
|
const vForIdentifiers = ((_b = vForNode == null ? void 0 : vForNode.exp) == null ? void 0 : _b.type) === NodeTypes.SIMPLE_EXPRESSION ? getFreeVariablesForText(
|
|
vForNode.exp.content.replace(/^.*\s(?:in|of)\s/, "")
|
|
) : [];
|
|
const vForExpVariableShadowingIdentifiers = [];
|
|
const props = directiveProps.filter(({ name }) => name !== "slot" && name !== "for").flatMap(getFreeVariablesForPropsNode);
|
|
const shadowingIdentifiers = /* @__PURE__ */ new Set([
|
|
...vSlotExpVariableShadowingIdentifiers,
|
|
...vForExpVariableShadowingIdentifiers
|
|
]);
|
|
return [
|
|
...vSlotArgIdentifiers,
|
|
refIdentifier,
|
|
...vForIdentifiers,
|
|
...[...children, ...props].filter((x) => !shadowingIdentifiers.has(x))
|
|
].filter(utils.notNullish);
|
|
} else if (node.type === NodeTypes.FOR) {
|
|
return [node.source, ...node.children].flatMap(getFreeVariablesForNode);
|
|
} else if (node.type === NodeTypes.IF) {
|
|
return ((_c = node.branches) != null ? _c : []).flatMap(getFreeVariablesForNode);
|
|
} else if (node.type === NodeTypes.IF_BRANCH) {
|
|
return [node.condition, ...node.children].filter(utils.notNullish).flatMap(getFreeVariablesForNode);
|
|
} else if (node.type === NodeTypes.TEXT || node.type === NodeTypes.COMMENT || node.type === NodeTypes.TEXT_CALL) {
|
|
return [];
|
|
} else {
|
|
return [];
|
|
}
|
|
}
|
|
function findReferencesForSFC(templateNode) {
|
|
var _a, _b, _c;
|
|
const components = (_a = templateNode == null ? void 0 : templateNode.children.flatMap(getComponents)) != null ? _a : [];
|
|
const directives = (_b = templateNode == null ? void 0 : templateNode.children.flatMap(getDirectiveNames)) != null ? _b : [];
|
|
const identifiers = (_c = templateNode == null ? void 0 : templateNode.children.flatMap(getFreeVariablesForNode)) != null ? _c : [];
|
|
return {
|
|
components,
|
|
directives,
|
|
identifiers
|
|
};
|
|
}
|
|
function getBabelParserOptions(lang) {
|
|
lang = lang || "js";
|
|
const pluginsDict = {
|
|
js: [],
|
|
ts: ["typescript"],
|
|
jsx: ["jsx"],
|
|
tsx: ["jsx", "typescript"]
|
|
};
|
|
const plugins = pluginsDict[lang];
|
|
if (plugins === void 0)
|
|
throw new SyntaxError(`Unsupported script language: ${lang}`);
|
|
return {
|
|
sourceType: "module",
|
|
plugins
|
|
};
|
|
}
|
|
async function parseSFC(code, id, options) {
|
|
var _a, _b, _c;
|
|
const elementChildren = compilerCore.baseParse(code, compilerDom.parserOptions).children.flatMap(
|
|
(x) => x.type === NodeTypes.ELEMENT && x.tagType === ElementTypes.ELEMENT ? [x] : []
|
|
);
|
|
const templateNode = elementChildren.find((x) => x.tag === "template");
|
|
const [scriptSetupChildNodes, scriptChildNodes] = utils.partition(
|
|
elementChildren.filter((x) => x.tag === "script"),
|
|
(x) => x.props.some((p) => p.type === NodeTypes.ATTRIBUTE && p.name === "setup")
|
|
);
|
|
const getScriptTagMeta = (n, astTransforms = (x) => x) => {
|
|
var _a2, _b2, _c2, _d, _e, _f;
|
|
if (n === void 0) {
|
|
const content2 = "";
|
|
const ast2 = parser.parse(content2, {
|
|
sourceType: "module",
|
|
plugins: []
|
|
}).program;
|
|
return {
|
|
start: 0,
|
|
end: 0,
|
|
contentStart: 0,
|
|
contentEnd: 0,
|
|
content: content2,
|
|
attrs: {},
|
|
found: false,
|
|
ast: ast2
|
|
};
|
|
}
|
|
const attrs = Object.fromEntries(
|
|
n.props.flatMap(
|
|
(x) => {
|
|
var _a3;
|
|
return !(x.type === NodeTypes.ATTRIBUTE && typeof ((_a3 = x.value) == null ? void 0 : _a3.content) === "string") ? [] : [[x.name, x.value.content]];
|
|
}
|
|
)
|
|
);
|
|
const content = (_b2 = (_a2 = n.children[0]) == null ? void 0 : _a2.loc.source) != null ? _b2 : "";
|
|
const contentStart = (_d = (_c2 = n.children[0]) == null ? void 0 : _c2.loc.start.offset) != null ? _d : 0;
|
|
const contentEnd = (_f = (_e = n.children[0]) == null ? void 0 : _e.loc.end.offset) != null ? _f : 0;
|
|
const ast = astTransforms(
|
|
parser.parse(content, getBabelParserOptions(attrs.lang)).program
|
|
);
|
|
return {
|
|
start: n.loc.start.offset,
|
|
end: n.loc.end.offset,
|
|
contentStart,
|
|
contentEnd,
|
|
content,
|
|
attrs,
|
|
found: true,
|
|
ast
|
|
};
|
|
};
|
|
const scriptSetup = getScriptTagMeta(
|
|
scriptSetupChildNodes[0],
|
|
(_a = options == null ? void 0 : options.astTransforms) == null ? void 0 : _a.scriptSetup
|
|
);
|
|
const script = getScriptTagMeta(
|
|
scriptChildNodes[0],
|
|
(_b = options == null ? void 0 : options.astTransforms) == null ? void 0 : _b.script
|
|
);
|
|
if (script.found && scriptSetup.found && scriptSetup.attrs.lang !== script.attrs.lang) {
|
|
throw new SyntaxError(
|
|
"<script setup> language must be the same as <script>"
|
|
);
|
|
}
|
|
const codeOfTemplate = templateNode == null ? void 0 : templateNode.props.some(
|
|
(p) => {
|
|
var _a2;
|
|
return p.type === NodeTypes.ATTRIBUTE && p.name === "lang" && ((_a2 = p.value) == null ? void 0 : _a2.type) === NodeTypes.TEXT && p.value.content === "pug";
|
|
}
|
|
) ? compilerCore.baseParse(
|
|
(await import('pug')).compile(
|
|
templateNode.children.map((x) => x.loc.source).join(""),
|
|
{
|
|
filename: id
|
|
}
|
|
)(),
|
|
compilerDom.parserOptions
|
|
) : templateNode;
|
|
const result = codeOfTemplate ? findReferencesForSFC(codeOfTemplate) : void 0;
|
|
return {
|
|
id,
|
|
template: {
|
|
components: new Set(result == null ? void 0 : result.components.map(pascalize)),
|
|
directives: new Set(
|
|
result == null ? void 0 : result.directives.filter((x) => !BUILD_IN_DIRECTIVES.has(x)).map(shared.camelize)
|
|
),
|
|
identifiers: new Set(result == null ? void 0 : result.identifiers)
|
|
},
|
|
scriptSetup,
|
|
script,
|
|
parserOptions: getBabelParserOptions(
|
|
(_c = script.attrs.lang) != null ? _c : scriptSetup.attrs.lang
|
|
),
|
|
extraDeclarations: []
|
|
};
|
|
}
|
|
|
|
const DEFINE_PROPS = "defineProps";
|
|
const DEFINE_EMITS = "defineEmits";
|
|
const DEFINE_EXPOSE = "defineExpose";
|
|
const WITH_DEFAULTS = "withDefaults";
|
|
function applyMacros(nodes) {
|
|
let hasDefinePropsCall = false;
|
|
let hasDefineEmitCall = false;
|
|
let propsRuntimeDecl;
|
|
let propsRuntimeDefaults;
|
|
let propsTypeDecl;
|
|
let propsTypeDeclRaw;
|
|
let emitsRuntimeDecl;
|
|
let emitsTypeDecl;
|
|
let emitsTypeDeclRaw;
|
|
let exposeDecl;
|
|
const typeDeclaredProps = {};
|
|
const declaredTypes = {};
|
|
function error(msg, _node) {
|
|
throw new Error(msg);
|
|
}
|
|
function processDefineProps(node) {
|
|
if (!isCallOf(node, DEFINE_PROPS))
|
|
return false;
|
|
if (hasDefinePropsCall)
|
|
error(`duplicate ${DEFINE_PROPS}() call`);
|
|
hasDefinePropsCall = true;
|
|
propsRuntimeDecl = node.arguments[0];
|
|
if (node.typeParameters) {
|
|
if (propsRuntimeDecl) {
|
|
error(
|
|
`${DEFINE_PROPS}() cannot accept both type and non-type arguments at the same time. Use one or the other.`);
|
|
}
|
|
propsTypeDeclRaw = node.typeParameters.params[0];
|
|
propsTypeDecl = resolveQualifiedType(
|
|
propsTypeDeclRaw,
|
|
(node2) => node2.type === "TSTypeLiteral"
|
|
);
|
|
if (!propsTypeDecl) {
|
|
error(
|
|
`type argument passed to ${DEFINE_PROPS}() must be a literal type, or a reference to an interface or literal type.`);
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function processWithDefaults(node) {
|
|
if (!isCallOf(node, WITH_DEFAULTS))
|
|
return false;
|
|
if (processDefineProps(node.arguments[0])) {
|
|
if (propsRuntimeDecl) {
|
|
error(
|
|
`${WITH_DEFAULTS} can only be used with type-based ${DEFINE_PROPS} declaration.`);
|
|
}
|
|
propsRuntimeDefaults = node.arguments[1];
|
|
} else {
|
|
error(
|
|
`${WITH_DEFAULTS}' first argument must be a ${DEFINE_PROPS} call.`,
|
|
node.arguments[0] || node
|
|
);
|
|
}
|
|
return true;
|
|
}
|
|
function processDefineEmits(node) {
|
|
if (!isCallOf(node, DEFINE_EMITS))
|
|
return false;
|
|
if (hasDefineEmitCall)
|
|
error(`duplicate ${DEFINE_EMITS}() call`);
|
|
hasDefineEmitCall = true;
|
|
emitsRuntimeDecl = node.arguments[0];
|
|
if (node.typeParameters) {
|
|
if (emitsRuntimeDecl) {
|
|
error(
|
|
`${DEFINE_EMITS}() cannot accept both type and non-type arguments at the same time. Use one or the other.`);
|
|
}
|
|
emitsTypeDeclRaw = node.typeParameters.params[0];
|
|
emitsTypeDecl = resolveQualifiedType(
|
|
emitsTypeDeclRaw,
|
|
(node2) => node2.type === "TSFunctionType" || node2.type === "TSTypeLiteral"
|
|
);
|
|
if (!emitsTypeDecl) {
|
|
error(
|
|
`type argument passed to ${DEFINE_EMITS}() must be a function type, a literal type with call signatures, or a reference to the above types.`);
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function resolveQualifiedType(node, qualifier) {
|
|
if (qualifier(node))
|
|
return node;
|
|
if (node.type === "TSTypeReference" && node.typeName.type === "Identifier") {
|
|
const refName = node.typeName.name;
|
|
const isQualifiedType = (node2) => {
|
|
if (node2.type === "TSInterfaceDeclaration" && node2.id.name === refName)
|
|
return node2.body;
|
|
else if (node2.type === "TSTypeAliasDeclaration" && node2.id.name === refName && qualifier(node2.typeAnnotation))
|
|
return node2.typeAnnotation;
|
|
else if (node2.type === "ExportNamedDeclaration" && node2.declaration)
|
|
return isQualifiedType(node2.declaration);
|
|
};
|
|
for (const node2 of nodes) {
|
|
const qualified = isQualifiedType(node2);
|
|
if (qualified)
|
|
return qualified;
|
|
}
|
|
}
|
|
}
|
|
function processDefineExpose(node) {
|
|
if (!isCallOf(node, DEFINE_EXPOSE))
|
|
return false;
|
|
if (exposeDecl)
|
|
error(`duplicate ${DEFINE_EXPOSE}() call`);
|
|
if (node.arguments.length !== 1)
|
|
error(`${DEFINE_EXPOSE}() requires one argument`);
|
|
exposeDecl = node.arguments[0];
|
|
return true;
|
|
}
|
|
function genRuntimeProps(props) {
|
|
const keys = Object.keys(props);
|
|
if (!keys.length)
|
|
return void 0;
|
|
const hasStaticDefaults = propsRuntimeDefaults && propsRuntimeDefaults.type === "ObjectExpression" && propsRuntimeDefaults.properties.every(
|
|
(node) => node.type === "ObjectProperty" && !node.computed
|
|
);
|
|
return t.objectExpression(
|
|
Object.entries(props).map(([key, value]) => {
|
|
const prop = hasStaticDefaults ? propsRuntimeDefaults.properties.find((node) => node.key.name === key) : void 0;
|
|
if (prop)
|
|
value.required = false;
|
|
const entries = Object.entries(value).map(
|
|
([key2, value2]) => key2 === "type" ? t.objectProperty(t.identifier(key2), typeof value2 === "string" ? t.identifier(value2) : t.arrayExpression(value2.map((i) => t.identifier(i)))) : t.objectProperty(t.identifier(key2), parser.parseExpression(JSON.stringify(value2)))
|
|
);
|
|
if (prop)
|
|
entries.push(t.objectProperty(t.identifier("default"), prop.value));
|
|
return t.objectProperty(
|
|
t.identifier(key),
|
|
t.objectExpression(entries)
|
|
);
|
|
})
|
|
);
|
|
}
|
|
function getProps() {
|
|
if (propsRuntimeDecl)
|
|
return propsRuntimeDecl;
|
|
if (propsTypeDecl) {
|
|
extractRuntimeProps(propsTypeDecl, typeDeclaredProps, declaredTypes);
|
|
return genRuntimeProps(typeDeclaredProps);
|
|
}
|
|
}
|
|
function throwIfAwait(node) {
|
|
if (node.type === "AwaitExpression")
|
|
error("top-level await is not supported in Vue 2");
|
|
}
|
|
nodes = nodes.map((raw) => {
|
|
let node = raw;
|
|
if (raw.type === "ExpressionStatement")
|
|
node = raw.expression;
|
|
if (node.type === "VariableDeclaration" && !node.declare) {
|
|
const total = node.declarations.length;
|
|
for (let i = 0; i < total; i++) {
|
|
const decl = node.declarations[i];
|
|
if (decl.init) {
|
|
if (processDefineEmits(decl.init))
|
|
decl.init = t.memberExpression(t.identifier("__ctx"), t.identifier("emit"));
|
|
else if (processDefineProps(decl.init) || processWithDefaults(decl.init))
|
|
decl.init = t.identifier("__props");
|
|
else
|
|
throwIfAwait(decl.init);
|
|
}
|
|
}
|
|
}
|
|
if (processWithDefaults(node) || processDefineEmits(node) || processDefineProps(node) || processDefineExpose(node))
|
|
return null;
|
|
throwIfAwait(node);
|
|
return raw;
|
|
}).filter(Boolean);
|
|
return {
|
|
nodes,
|
|
props: getProps(),
|
|
expose: exposeDecl
|
|
};
|
|
}
|
|
function isCallOf(node, test) {
|
|
return !!(node && node.type === "CallExpression" && node.callee.type === "Identifier" && (typeof test === "string" ? node.callee.name === test : test(node.callee.name)));
|
|
}
|
|
function extractRuntimeProps(node, props, declaredTypes) {
|
|
const members = node.type === "TSTypeLiteral" ? node.members : node.body;
|
|
for (const m of members) {
|
|
if ((m.type === "TSPropertySignature" || m.type === "TSMethodSignature") && m.key.type === "Identifier") {
|
|
let type;
|
|
if (m.type === "TSMethodSignature") {
|
|
type = ["Function"];
|
|
} else if (m.typeAnnotation) {
|
|
type = inferRuntimeType(
|
|
m.typeAnnotation.typeAnnotation,
|
|
declaredTypes
|
|
);
|
|
}
|
|
props[m.key.name] = {
|
|
key: m.key.name,
|
|
required: !m.optional,
|
|
type: (type == null ? void 0 : type.length) === 1 ? type[0] : type || "null"
|
|
};
|
|
}
|
|
}
|
|
}
|
|
function inferRuntimeType(node, declaredTypes) {
|
|
switch (node.type) {
|
|
case "TSStringKeyword":
|
|
return ["String"];
|
|
case "TSNumberKeyword":
|
|
return ["Number"];
|
|
case "TSBooleanKeyword":
|
|
return ["Boolean"];
|
|
case "TSObjectKeyword":
|
|
return ["Object"];
|
|
case "TSTypeLiteral":
|
|
return ["Object"];
|
|
case "TSFunctionType":
|
|
return ["Function"];
|
|
case "TSArrayType":
|
|
case "TSTupleType":
|
|
return ["Array"];
|
|
case "TSLiteralType":
|
|
switch (node.literal.type) {
|
|
case "StringLiteral":
|
|
return ["String"];
|
|
case "BooleanLiteral":
|
|
return ["Boolean"];
|
|
case "NumericLiteral":
|
|
case "BigIntLiteral":
|
|
return ["Number"];
|
|
default:
|
|
return ["null"];
|
|
}
|
|
case "TSTypeReference":
|
|
if (node.typeName.type === "Identifier") {
|
|
if (declaredTypes[node.typeName.name])
|
|
return declaredTypes[node.typeName.name];
|
|
switch (node.typeName.name) {
|
|
case "Array":
|
|
case "Function":
|
|
case "Object":
|
|
case "Set":
|
|
case "Map":
|
|
case "WeakSet":
|
|
case "WeakMap":
|
|
return [node.typeName.name];
|
|
case "Record":
|
|
case "Partial":
|
|
case "Readonly":
|
|
case "Pick":
|
|
case "Omit":
|
|
case "Exclude":
|
|
case "Extract":
|
|
case "Required":
|
|
case "InstanceType":
|
|
return ["Object"];
|
|
}
|
|
}
|
|
return ["null"];
|
|
case "TSParenthesizedType":
|
|
return inferRuntimeType(node.typeAnnotation, declaredTypes);
|
|
case "TSUnionType":
|
|
return [
|
|
...new Set(
|
|
[].concat(
|
|
...node.types.map((t2) => inferRuntimeType(t2, declaredTypes))
|
|
)
|
|
)
|
|
];
|
|
case "TSIntersectionType":
|
|
return ["Object"];
|
|
default:
|
|
return ["null"];
|
|
}
|
|
}
|
|
|
|
function isAsyncImport(node) {
|
|
if (t.isVariableDeclaration(node)) {
|
|
const declaration = node.declarations[0];
|
|
return declaration !== void 0 && t.isCallExpression(declaration.init) && t.isIdentifier(declaration.init.callee) && declaration.init.callee.name === "defineAsyncComponent";
|
|
}
|
|
return false;
|
|
}
|
|
function transformScriptSetup(sfc, options) {
|
|
var _a, _b;
|
|
const { scriptSetup, script, template } = sfc;
|
|
const { nodes: body, props, expose } = applyMacros(scriptSetup.ast.body);
|
|
const [hoisted, setupBody] = utils.partition(
|
|
body,
|
|
(n) => isAsyncImport(n) || t.isImportDeclaration(n) || t.isExportNamedDeclaration(n) || n.type.startsWith("TS")
|
|
);
|
|
const declarationArray = utils.uniq([
|
|
...getIdentifierDeclarations(hoisted),
|
|
...getIdentifierDeclarations(setupBody),
|
|
...getIdentifierDeclarations(script.ast.body)
|
|
]).filter(utils.notNullish);
|
|
const returns = declarationArray.filter((i) => template.identifiers.has(i)).map((i) => {
|
|
const id = t.identifier(i);
|
|
return t.objectProperty(id, id, false, true);
|
|
});
|
|
const components = Array.from(template.components).map(
|
|
(component) => {
|
|
var _a2;
|
|
return (_a2 = declarationArray.find((declare) => declare === component)) != null ? _a2 : declarationArray.find((declare) => pascalize(declare) === component);
|
|
}
|
|
).filter(utils.notNullish);
|
|
const directiveDeclaration = Array.from(template.directives).map((directive) => {
|
|
const identifier = declarationArray.find(
|
|
(declaration) => declaration === `v${shared.capitalize(directive)}`
|
|
);
|
|
if (identifier === void 0)
|
|
return void 0;
|
|
return { identifier, directive };
|
|
}).filter(utils.notNullish);
|
|
const __sfc = t.identifier("__sfc_main");
|
|
let hasBody = false;
|
|
const bodyNodes = script.ast.body.map((node) => {
|
|
if (node.type === "ExportDefaultDeclaration") {
|
|
hasBody = true;
|
|
return t.variableDeclaration("const", [
|
|
t.variableDeclarator(__sfc, node.declaration)
|
|
]);
|
|
}
|
|
return node;
|
|
});
|
|
let ast = t.program([
|
|
...sfc.extraDeclarations,
|
|
...hoisted,
|
|
...bodyNodes
|
|
]);
|
|
if (!hasBody) {
|
|
ast.body.push(
|
|
t.variableDeclaration("const", [
|
|
t.variableDeclarator(__sfc, t.objectExpression([]))
|
|
])
|
|
);
|
|
}
|
|
if (props) {
|
|
hasBody = true;
|
|
ast.body.push(
|
|
t.expressionStatement(
|
|
t.assignmentExpression(
|
|
"=",
|
|
t.memberExpression(__sfc, t.identifier("props")),
|
|
props
|
|
)
|
|
)
|
|
);
|
|
}
|
|
if (body.length) {
|
|
hasBody = true;
|
|
const returnExpr = expose ? t.callExpression(
|
|
t.memberExpression(t.identifier("Object"), t.identifier("assign")),
|
|
[t.objectExpression(returns), expose]
|
|
) : t.objectExpression(returns);
|
|
const returnStatement = t.returnStatement(returnExpr);
|
|
ast.body.push(
|
|
t.expressionStatement(
|
|
t.assignmentExpression(
|
|
"=",
|
|
t.memberExpression(__sfc, t.identifier("setup")),
|
|
t.arrowFunctionExpression(
|
|
[t.identifier("__props"), t.identifier("__ctx")],
|
|
t.blockStatement([...setupBody, returnStatement])
|
|
)
|
|
)
|
|
)
|
|
);
|
|
}
|
|
if (components.length) {
|
|
hasBody = true;
|
|
const componentsObject = t.objectExpression(
|
|
components.map((i) => {
|
|
const id = t.identifier(i);
|
|
return t.objectProperty(id, id, false, true);
|
|
})
|
|
);
|
|
ast.body.push(
|
|
t.expressionStatement(
|
|
t.assignmentExpression(
|
|
"=",
|
|
t.memberExpression(__sfc, t.identifier("components")),
|
|
t.callExpression(
|
|
t.memberExpression(t.identifier("Object"), t.identifier("assign")),
|
|
[
|
|
componentsObject,
|
|
t.memberExpression(__sfc, t.identifier("components"))
|
|
]
|
|
)
|
|
)
|
|
)
|
|
);
|
|
}
|
|
if (directiveDeclaration.length) {
|
|
hasBody = true;
|
|
const directivesObject = t.objectExpression(
|
|
directiveDeclaration.map(
|
|
({ directive, identifier }) => t.objectProperty(
|
|
t.identifier(directive),
|
|
t.identifier(identifier),
|
|
false,
|
|
false
|
|
)
|
|
)
|
|
);
|
|
ast.body.push(
|
|
t.expressionStatement(
|
|
t.assignmentExpression(
|
|
"=",
|
|
t.memberExpression(__sfc, t.identifier("directives")),
|
|
t.callExpression(
|
|
t.memberExpression(t.identifier("Object"), t.identifier("assign")),
|
|
[
|
|
directivesObject,
|
|
t.memberExpression(__sfc, t.identifier("directives"))
|
|
]
|
|
)
|
|
)
|
|
)
|
|
);
|
|
}
|
|
if (!hasBody && !(options == null ? void 0 : options.astTransforms)) {
|
|
return {
|
|
ast: null,
|
|
code: ""
|
|
};
|
|
}
|
|
ast.body.push(t.exportDefaultDeclaration(__sfc));
|
|
ast = ((_b = (_a = options == null ? void 0 : options.astTransforms) == null ? void 0 : _a.post) == null ? void 0 : _b.call(_a, ast, sfc)) || ast;
|
|
return {
|
|
ast,
|
|
code: generate(ast).code
|
|
};
|
|
}
|
|
|
|
function transformSfcRefSugar(sfc, options) {
|
|
const importedHelpers = /* @__PURE__ */ new Set();
|
|
for (const script of [sfc.script, sfc.scriptSetup]) {
|
|
if (reactivityTransform.shouldTransform(script.content)) {
|
|
const s = new MagicString(script.content);
|
|
const { importedHelpers: imports } = reactivityTransform.transformAST(script.ast, s);
|
|
Array.from(imports).forEach((helper) => importedHelpers.add(helper));
|
|
script.content = s.toString();
|
|
script.ast = parser.parse(script.content, sfc.parserOptions).program;
|
|
}
|
|
}
|
|
if (importedHelpers.size) {
|
|
sfc.extraDeclarations = [
|
|
t.importDeclaration(
|
|
Array.from(importedHelpers).map((i) => t.importSpecifier(t.identifier(`_${i}`), t.identifier(i))),
|
|
t.stringLiteral(options.importHelpersFrom)
|
|
)
|
|
];
|
|
}
|
|
}
|
|
|
|
function resolveOptions(options = {}) {
|
|
return Object.assign(
|
|
{},
|
|
{
|
|
sourceMap: true,
|
|
reactivityTransform: false,
|
|
importHelpersFrom: "@vue/composition-api",
|
|
astTransforms: {}
|
|
},
|
|
options
|
|
);
|
|
}
|
|
|
|
var __defProp = Object.defineProperty;
|
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
var __spreadValues = (a, b) => {
|
|
for (var prop in b || (b = {}))
|
|
if (__hasOwnProp.call(b, prop))
|
|
__defNormalProp(a, prop, b[prop]);
|
|
if (__getOwnPropSymbols)
|
|
for (var prop of __getOwnPropSymbols(b)) {
|
|
if (__propIsEnum.call(b, prop))
|
|
__defNormalProp(a, prop, b[prop]);
|
|
}
|
|
return a;
|
|
};
|
|
const scriptSetupRE = /<script\s(.*\s)?setup(\s.*)?>/;
|
|
function shouldTransform(code, id, options) {
|
|
if (code.includes("export default __sfc_main"))
|
|
return false;
|
|
return (options == null ? void 0 : options.reactivityTransform) && reactivityTransform.shouldTransform(code) || scriptSetupRE.test(code);
|
|
}
|
|
async function transform(input, id, options) {
|
|
if (!shouldTransform(input, id, options))
|
|
return null;
|
|
const resolved = resolveOptions(options);
|
|
if (id.endsWith(".vue") || id.includes(".vue?vue"))
|
|
return await transformVue(input, id, resolved);
|
|
else
|
|
return transformNonVue(input, id, resolved);
|
|
}
|
|
function transformNonVue(input, id, options) {
|
|
if (options.reactivityTransform && reactivityTransform.shouldTransform(input)) {
|
|
return reactivityTransform.transform(input, {
|
|
filename: id,
|
|
sourceMap: options.sourceMap,
|
|
importHelpersFrom: options.importHelpersFrom
|
|
});
|
|
}
|
|
return null;
|
|
}
|
|
async function transformVue(input, id, options) {
|
|
const s = new MagicString(input);
|
|
const sfc = await parseSFC(input, id);
|
|
if (options.reactivityTransform)
|
|
transformSfcRefSugar(sfc, options);
|
|
const { code } = transformScriptSetup(sfc, options);
|
|
const attributes = __spreadValues(__spreadValues({}, sfc.script.attrs), sfc.scriptSetup.attrs);
|
|
delete attributes.setup;
|
|
const attr = Object.entries(attributes).map(([key, value]) => value ? `${key}="${value}"` : key).join(" ");
|
|
if (code) {
|
|
const block = `<script ${attr}>
|
|
${code}
|
|
<\/script>`;
|
|
s.remove(sfc.script.start, sfc.script.end);
|
|
if (sfc.scriptSetup.start !== sfc.scriptSetup.end) {
|
|
s.overwrite(
|
|
sfc.scriptSetup.start,
|
|
sfc.scriptSetup.end,
|
|
block
|
|
);
|
|
} else {
|
|
s.prependLeft(0, `${block}
|
|
`);
|
|
}
|
|
}
|
|
return {
|
|
code: s.toString(),
|
|
map: options.sourceMap ? s.generateMap({
|
|
source: id,
|
|
includeContent: true
|
|
}) : null
|
|
};
|
|
}
|
|
|
|
const unplugin = unplugin$1.createUnplugin((options = {}) => {
|
|
const filter = pluginutils.createFilter(
|
|
options.include || (options.reactivityTransform ? [/\.vue$/, /\.vue\?vue/, /\.[jt]sx?$/] : [/\.vue$/, /\.vue\?vue/]),
|
|
options.exclude || [/node_modules/, /\.git/, /\.nuxt/]
|
|
);
|
|
return {
|
|
name: "unplugin-vue2-script-setup",
|
|
enforce: "pre",
|
|
transformInclude(id) {
|
|
return filter(id);
|
|
},
|
|
async transform(code, id) {
|
|
try {
|
|
return await transform(code, id, options);
|
|
} catch (e) {
|
|
this.error(e);
|
|
}
|
|
}
|
|
};
|
|
});
|
|
|
|
function scriptSetupModule(inlineOptions = {}) {
|
|
const options = defu(inlineOptions, this.nuxt.options.scriptSetup);
|
|
this.extendBuild((config) => {
|
|
config.plugins = config.plugins || [];
|
|
config.plugins.unshift(unplugin.webpack(options));
|
|
});
|
|
this.nuxt.hook("vite:extend", async (vite) => {
|
|
vite.config.plugins = vite.config.plugins || [];
|
|
vite.config.plugins.push(unplugin.vite(options));
|
|
});
|
|
}
|
|
|
|
exports.default = scriptSetupModule;
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnV4dC5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NvcmUvYmFiZWwudHMiLCIuLi9zcmMvY29yZS9pZGVudGlmaWVycy50cyIsIi4uL3NyYy9jb3JlL3V0aWxzLnRzIiwiLi4vc3JjL2NvcmUvcGFyc2VTRkMudHMiLCIuLi9zcmMvY29yZS9tYWNyb3MudHMiLCIuLi9zcmMvY29yZS90cmFuc2Zvcm1TY3JpcHRTZXR1cC50cyIsIi4uL3NyYy9jb3JlL3RyYW5zZm9ybVNmY1JlZlN1Z2FyLnRzIiwiLi4vc3JjL2NvcmUvb3B0aW9ucy50cyIsIi4uL3NyYy9jb3JlL3RyYW5zZm9ybS50cyIsIi4uL3NyYy9pbmRleC50cyIsIi4uL3NyYy9udXh0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGJhYmVsIGZyb20gJ0BiYWJlbC9jb3JlJ1xuaW1wb3J0IHsgcGFyc2UsIHBhcnNlRXhwcmVzc2lvbiB9IGZyb20gJ0BiYWJlbC9wYXJzZXInXG5pbXBvcnQgZyBmcm9tICdAYmFiZWwvZ2VuZXJhdG9yJ1xuaW1wb3J0ICogYXMgYmFiZWxfdHJhdmVyc2UgZnJvbSAnQGJhYmVsL3RyYXZlcnNlJ1xuXG5leHBvcnQgY29uc3QgdDogdHlwZW9mIGJhYmVsWyd0eXBlcyddID0gKChiYWJlbCBhcyBhbnkpLmRlZmF1bHQgfHwgYmFiZWwpLnR5cGVzXG5leHBvcnQgY29uc3QgZ2VuZXJhdGU6IHR5cGVvZiBnID0gKChnIGFzIGFueSkuZGVmYXVsdCB8fCBnKVxuZXhwb3J0IGNvbnN0IHRyYXZlcnNlID0gKChiYWJlbF90cmF2ZXJzZSBhcyBhbnkpPy5kZWZhdWx0Py5kZWZhdWx0IGFzIG51bGwpID8/IGJhYmVsX3RyYXZlcnNlPy5kZWZhdWx0ID8/IGJhYmVsX3RyYXZlcnNlXG5leHBvcnQgeyBwYXJzZUV4cHJlc3Npb24sIHBhcnNlIH1cbiIsImltcG9ydCB0eXBlIHtcbiAgRXhwcmVzc2lvbixcbiAgRmlsZSxcbiAgUHJpdmF0ZU5hbWUsXG4gIFNwcmVhZEVsZW1lbnQsXG4gIFN0YXRlbWVudCxcbiAgVFNUeXBlLFxufSBmcm9tICdAYmFiZWwvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IFBhcnNlUmVzdWx0IH0gZnJvbSAnQGJhYmVsL3BhcnNlcidcbmltcG9ydCB7IHQsIHRyYXZlcnNlIH0gZnJvbSAnLi9iYWJlbCdcblxuZXhwb3J0IGZ1bmN0aW9uIGdldElkZW50aWZpZXJEZWNsYXJhdGlvbnMobm9kZXM6IFN0YXRlbWVudFtdKSB7XG4gIGxldCByZXN1bHQhOiBTZXQ8c3RyaW5nPlxuICBsZXQgcHJvZ3JhbVNjb3BlVWlkOiBudW1iZXJcbiAgdHJhdmVyc2UodC5maWxlKHQucHJvZ3JhbShub2RlcykpLCB7XG4gICAgUHJvZ3JhbShwYXRoKSB7XG4gICAgICByZXN1bHQgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHBhdGguc2NvcGUuYmluZGluZ3MpKVxuICAgICAgcHJvZ3JhbVNjb3BlVWlkID0gKHBhdGguc2NvcGUgYXMgYW55KS51aWRcbiAgICB9LFxuICAgIC8vIEZJWE1FOiBiYWJlbCBidWcsIHRlbXBvcmFyeSBhZGQgVFNFbnVtRGVjbGFyYXRpb24gYW5kIFRTTW9kdWxlRGVjbGFyYXRpb24gbG9naWNcbiAgICBUU0VudW1EZWNsYXJhdGlvbihwYXRoKSB7XG4gICAgICBpZiAoKHBhdGguc2NvcGUgYXMgYW55KS51aWQgPT09IHByb2dyYW1TY29wZVVpZClcbiAgICAgICAgcmVzdWx0LmFkZChwYXRoLm5vZGUuaWQubmFtZSlcbiAgICB9LFxuICAgIFRTTW9kdWxlRGVjbGFyYXRpb24ocGF0aCkge1xuICAgICAgaWYgKChwYXRoLnNjb3BlIGFzIGFueSkudWlkID09PSBwcm9ncmFtU2NvcGVVaWQpIHtcbiAgICAgICAgY29uc3QgaWQgPSBwYXRoLm5vZGUuaWRcbiAgICAgICAgaWYgKGlkLnR5cGUgPT09ICdJZGVudGlmaWVyJylcbiAgICAgICAgICByZXN1bHQuYWRkKGlkLm5hbWUpXG4gICAgICB9XG4gICAgfSxcbiAgfSlcbiAgcmV0dXJuIEFycmF5LmZyb20ocmVzdWx0KVxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBgZ2V0RmlsZUdsb2JhbHNgIGluc3RlYWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldElkZW50aWZpZXJVc2FnZXMobm9kZT86IEV4cHJlc3Npb24gfCBUU1R5cGUgfCBTcHJlYWRFbGVtZW50IHwgUHJpdmF0ZU5hbWUgfCBTdGF0ZW1lbnQgfCBudWxsLCBpZGVudGlmaWVycyA9IG5ldyBTZXQ8c3RyaW5nPigpKSB7XG4gIGlmICghbm9kZSlcbiAgICByZXR1cm4gaWRlbnRpZmllcnNcblxuICBpZiAobm9kZS50eXBlID09PSAnQmxvY2tTdGF0ZW1lbnQnKSB7XG4gICAgbm9kZS5ib2R5LmZvckVhY2goY2hpbGQgPT4gZ2V0SWRlbnRpZmllclVzYWdlcyhjaGlsZCwgaWRlbnRpZmllcnMpKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ0V4cHJlc3Npb25TdGF0ZW1lbnQnKSB7XG4gICAgZ2V0SWRlbnRpZmllclVzYWdlcyhub2RlLmV4cHJlc3Npb24sIGlkZW50aWZpZXJzKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ0lkZW50aWZpZXInKSB7XG4gICAgaWRlbnRpZmllcnMuYWRkKG5vZGUubmFtZSlcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdNZW1iZXJFeHByZXNzaW9uJyB8fCBub2RlLnR5cGUgPT09ICdPcHRpb25hbE1lbWJlckV4cHJlc3Npb24nKSB7XG4gICAgZ2V0SWRlbnRpZmllclVzYWdlcyhub2RlLm9iamVjdCwgaWRlbnRpZmllcnMpXG4gICAgaWYgKG5vZGUuY29tcHV0ZWQpXG4gICAgICBnZXRJZGVudGlmaWVyVXNhZ2VzKG5vZGUucHJvcGVydHksIGlkZW50aWZpZXJzKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ0NhbGxFeHByZXNzaW9uJyB8fCBub2RlLnR5cGUgPT09ICdPcHRpb25hbENhbGxFeHByZXNzaW9uJykge1xuICAgIGdldElkZW50aWZpZXJVc2FnZXMobm9kZS5jYWxsZWUgYXMgRXhwcmVzc2lvbiwgaWRlbnRpZmllcnMpXG4gICAgbm9kZS5hcmd1bWVudHMuZm9yRWFjaChhcmcgPT4gZ2V0SWRlbnRpZmllclVzYWdlcyhhcmcgYXMgRXhwcmVzc2lvbiwgaWRlbnRpZmllcnMpKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ0JpbmFyeUV4cHJlc3Npb24nIHx8IG5vZGUudHlwZSA9PT0gJ0xvZ2ljYWxFeHByZXNzaW9uJykge1xuICAgIGdldElkZW50aWZpZXJVc2FnZXMobm9kZS5sZWZ0LCBpZGVudGlmaWVycylcbiAgICBnZXRJZGVudGlmaWVyVXNhZ2VzKG5vZGUucmlnaHQsIGlkZW50aWZpZXJzKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ1VuYXJ5RXhwcmVzc2lvbicpIHtcbiAgICBnZXRJZGVudGlmaWVyVXNhZ2VzKG5vZGUuYXJndW1lbnQsIGlkZW50aWZpZXJzKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ0Zvck9mU3RhdGVtZW50JyB8fCBub2RlLnR5cGUgPT09ICdGb3JJblN0YXRlbWVudCcpIHtcbiAgICBnZXRJZGVudGlmaWVyVXNhZ2VzKG5vZGUucmlnaHQsIGlkZW50aWZpZXJzKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ0NvbmRpdGlvbmFsRXhwcmVzc2lvbicpIHtcbiAgICBnZXRJZGVudGlmaWVyVXNhZ2VzKG5vZGUudGVzdCwgaWRlbnRpZmllcnMpXG4gICAgZ2V0SWRlbnRpZmllclVzYWdlcyhub2RlLmNvbnNlcXVlbnQsIGlkZW50aWZpZXJzKVxuICAgIGdldElkZW50aWZpZXJVc2FnZXMobm9kZS5hbHRlcm5hdGUsIGlkZW50aWZpZXJzKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ09iamVjdEV4cHJlc3Npb24nKSB7XG4gICAgbm9kZS5wcm9wZXJ0aWVzLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgIGlmIChwcm9wLnR5cGUgPT09ICdPYmplY3RQcm9wZXJ0eScpIHtcbiAgICAgICAgaWYgKHByb3AuY29tcHV0ZWQpXG4gICAgICAgICAgZ2V0SWRlbnRpZmllclVzYWdlcyhwcm9wLmtleSwgaWRlbnRpZmllcnMpXG4gICAgICAgIGdldElkZW50aWZpZXJVc2FnZXMocHJvcC52YWx1ZSBhcyBFeHByZXNzaW9uLCBpZGVudGlmaWVycylcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHByb3AudHlwZSA9PT0gJ1NwcmVhZEVsZW1lbnQnKSB7XG4gICAgICAgIGdldElkZW50aWZpZXJVc2FnZXMocHJvcCwgaWRlbnRpZmllcnMpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdBcnJheUV4cHJlc3Npb24nKSB7XG4gICAgbm9kZS5lbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4gZ2V0SWRlbnRpZmllclVzYWdlcyhlbGVtZW50LCBpZGVudGlmaWVycykpXG4gIH1cbiAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnU3ByZWFkRWxlbWVudCcgfHwgbm9kZS50eXBlID09PSAnUmV0dXJuU3RhdGVtZW50Jykge1xuICAgIGdldElkZW50aWZpZXJVc2FnZXMobm9kZS5hcmd1bWVudCwgaWRlbnRpZmllcnMpXG4gIH1cbiAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnTmV3RXhwcmVzc2lvbicpIHtcbiAgICBnZXRJZGVudGlmaWVyVXNhZ2VzKG5vZGUuY2FsbGVlIGFzIEV4cHJlc3Npb24sIGlkZW50aWZpZXJzKVxuICAgIG5vZGUuYXJndW1lbnRzLmZvckVhY2goYXJnID0+IGdldElkZW50aWZpZXJVc2FnZXMoYXJnIGFzIEV4cHJlc3Npb24sIGlkZW50aWZpZXJzKSlcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbicgfHwgbm9kZS50eXBlID09PSAnRnVuY3Rpb25EZWNsYXJhdGlvbicgfHwgbm9kZS50eXBlID09PSAnRnVuY3Rpb25FeHByZXNzaW9uJykge1xuICAgIGdldElkZW50aWZpZXJVc2FnZXMobm9kZS5ib2R5LCBpZGVudGlmaWVycylcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdUZW1wbGF0ZUxpdGVyYWwnKSB7XG4gICAgbm9kZS5leHByZXNzaW9ucy5mb3JFYWNoKGV4cHIgPT4gZ2V0SWRlbnRpZmllclVzYWdlcyhleHByLCBpZGVudGlmaWVycykpXG4gIH1cbiAgLy8gZWxzZSB7XG4gIC8vICAgY29uc29sZS5sb2cobm9kZSlcbiAgLy8gfVxuICByZXR1cm4gaWRlbnRpZmllcnNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVHbG9iYWxzKHJlc3VsdDogUGFyc2VSZXN1bHQ8RmlsZT4pIHtcbiAgbGV0IGdsb2JhbHMhOiBTZXQ8c3RyaW5nPlxuICBsZXQgcHJvZ3JhbVNjb3BlVWlkOiBudW1iZXJcbiAgdHJhdmVyc2UocmVzdWx0LCB7XG4gICAgUHJvZ3JhbShwYXRoKSB7XG4gICAgICBnbG9iYWxzID0gbmV3IFNldChPYmplY3Qua2V5cygocGF0aC5zY29wZSBhcyBhbnkpLmdsb2JhbHMpKVxuICAgICAgcHJvZ3JhbVNjb3BlVWlkID0gKHBhdGguc2NvcGUgYXMgYW55KS51aWRcbiAgICB9LFxuICAgIC8vIEZJWE1FOiBiYWJlbCBidWcsIHRlbXBvcmFyeSBhZGQgVFNFbnVtRGVjbGFyYXRpb24gYW5kIFRTTW9kdWxlRGVjbGFyYXRpb24gbG9naWNcbiAgICBUU0VudW1EZWNsYXJhdGlvbihwYXRoKSB7XG4gICAgICBpZiAoKHBhdGguc2NvcGUgYXMgYW55KS51aWQgPT09IHByb2dyYW1TY29wZVVpZClcbiAgICAgICAgZ2xvYmFscy5kZWxldGUocGF0aC5ub2RlLmlkLm5hbWUpXG4gICAgfSxcbiAgICBUU01vZHVsZURlY2xhcmF0aW9uKHBhdGgpIHtcbiAgICAgIGlmICgocGF0aC5zY29wZSBhcyBhbnkpLnVpZCA9PT0gcHJvZ3JhbVNjb3BlVWlkKSB7XG4gICAgICAgIGNvbnN0IGlkID0gcGF0aC5ub2RlLmlkXG4gICAgICAgIGlmIChpZC50eXBlID09PSAnSWRlbnRpZmllcicpXG4gICAgICAgICAgZ2xvYmFscy5kZWxldGUoaWQubmFtZSlcbiAgICAgIH1cbiAgICB9LFxuICB9KVxuICByZXR1cm4gQXJyYXkuZnJvbShnbG9iYWxzKVxufVxuIiwiaW1wb3J0IHsgY2FtZWxpemUsIGNhcGl0YWxpemUgfSBmcm9tICdAdnVlL3NoYXJlZCdcblxuZXhwb3J0IGNvbnN0IHBhc2NhbGl6ZSA9IChzdHI6IHN0cmluZykgPT4gY2FwaXRhbGl6ZShjYW1lbGl6ZShzdHIpKVxuXG5leHBvcnQgY29uc3QgaXNOb3ROaWwgPSA8VD4odmFsdWU6IFQpOiB2YWx1ZSBpcyBOb25OdWxsYWJsZTxUPiA9PiB2YWx1ZSAhPSBudWxsXG5cbmV4cG9ydCBmdW5jdGlvbiBleGhhdXN0aXZlQ2hlY2tSZXR1cm5VbmRlZmluZWQoX3BhcmFtOiBuZXZlcikge1xuICByZXR1cm4gdW5kZWZpbmVkIGFzIG5ldmVyXG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBvbmUtdmFyICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlICovXG5pbXBvcnQgeyBub3ROdWxsaXNoLCBwYXJ0aXRpb24gfSBmcm9tICdAYW50ZnUvdXRpbHMnXG5pbXBvcnQgdHlwZSB7IFByb2dyYW0gfSBmcm9tICdAYmFiZWwvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IFBhcnNlclBsdWdpbiB9IGZyb20gJ0BiYWJlbC9wYXJzZXInXG5pbXBvcnQgdHlwZSB7XG4gIEF0dHJpYnV0ZU5vZGUsXG4gIERpcmVjdGl2ZU5vZGUsXG4gIEV4cHJlc3Npb25Ob2RlLFxuICBQbGFpbkVsZW1lbnROb2RlLFxuICBSb290Tm9kZSxcbiAgVGVtcGxhdGVDaGlsZE5vZGUsXG59IGZyb20gJ0B2dWUvY29tcGlsZXItY29yZSdcbmltcG9ydCB7IGJhc2VQYXJzZSB9IGZyb20gJ0B2dWUvY29tcGlsZXItY29yZSdcbmltcG9ydCB7IHBhcnNlck9wdGlvbnMgfSBmcm9tICdAdnVlL2NvbXBpbGVyLWRvbSdcbmltcG9ydCB7IGNhbWVsaXplIH0gZnJvbSAnQHZ1ZS9zaGFyZWQnXG5pbXBvcnQgdHlwZSB7XG4gIFBhcnNlZFNGQyxcbiAgU2NyaXB0U2V0dXBUcmFuc2Zvcm1PcHRpb25zLFxuICBTY3JpcHRUYWdNZXRhLFxufSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IGdldEZpbGVHbG9iYWxzIH0gZnJvbSAnLi9pZGVudGlmaWVycydcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAnLi9iYWJlbCdcbmltcG9ydCB7IGV4aGF1c3RpdmVDaGVja1JldHVyblVuZGVmaW5lZCwgcGFzY2FsaXplIH0gZnJvbSAnLi91dGlscydcblxubmFtZXNwYWNlIE5vZGVUeXBlcyB7XG4gIGV4cG9ydCBjb25zdCBST09UID0gMCxcbiAgICBFTEVNRU5UID0gMSxcbiAgICBURVhUID0gMixcbiAgICBDT01NRU5UID0gMyxcbiAgICBTSU1QTEVfRVhQUkVTU0lPTiA9IDQsXG4gICAgSU5URVJQT0xBVElPTiA9IDUsXG4gICAgQVRUUklCVVRFID0gNixcbiAgICBESVJFQ1RJVkUgPSA3LFxuICAgIENPTVBPVU5EX0VYUFJFU1NJT04gPSA4LFxuICAgIElGID0gOSxcbiAgICBJRl9CUkFOQ0ggPSAxMCxcbiAgICBGT1IgPSAxMSxcbiAgICBURVhUX0NBTEwgPSAxMixcbiAgICBWTk9ERV9DQUxMID0gMTMsXG4gICAgSlNfQ0FMTF9FWFBSRVNTSU9OID0gMTQsXG4gICAgSlNfT0JKRUNUX0VYUFJFU1NJT04gPSAxNSxcbiAgICBKU19QUk9QRVJUWSA9IDE2LFxuICAgIEpTX0FSUkFZX0VYUFJFU1NJT04gPSAxNyxcbiAgICBKU19GVU5DVElPTl9FWFBSRVNTSU9OID0gMTgsXG4gICAgSlNfQ09ORElUSU9OQUxfRVhQUkVTU0lPTiA9IDE5LFxuICAgIEpTX0NBQ0hFX0VYUFJFU1NJT04gPSAyMCxcbiAgICBKU19CTE9DS19TVEFURU1FTlQgPSAyMSxcbiAgICBKU19URU1QTEFURV9MSVRFUkFMID0gMjIsXG4gICAgSlNfSUZfU1RBVEVNRU5UID0gMjMsXG4gICAgSlNfQVNTSUdOTUVOVF9FWFBSRVNTSU9OID0gMjQsXG4gICAgSlNfU0VRVUVOQ0VfRVhQUkVTU0lPTiA9IDI1LFxuICAgIEpTX1JFVFVSTl9TVEFURU1FTlQgPSAyNlxufVxuXG5uYW1lc3BhY2UgRWxlbWVudFR5cGVzIHtcbiAgZXhwb3J0IGNvbnN0IEVMRU1FTlQgPSAwLFxuICAgIENPTVBPTkVOVCA9IDEsXG4gICAgU0xPVCA9IDIsXG4gICAgVEVNUExBVEUgPSAzXG59XG5cbmNvbnN0IEJVSUxEX0lOX0RJUkVDVElWRVMgPSBuZXcgU2V0KFtcbiAgJ2lmJyxcbiAgJ2Vsc2UnLFxuICAnZWxzZS1pZicsXG4gICdmb3InLFxuICAnb25jZScsXG4gICdtb2RlbCcsXG4gICdvbicsXG4gICdiaW5kJyxcbiAgJ3Nsb3QnLFxuICAnc2xvdC1zY29wZScsXG4gICdrZXknLFxuICAncmVmJyxcbiAgJ3RleHQnLFxuICAnaHRtbCcsXG4gICdzaG93JyxcbiAgJ3ByZScsXG4gICdjbG9haycsXG4gIC8vICdlbCcsXG4gIC8vICdyZWYnLFxuXSlcblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50cyhub2RlOiBUZW1wbGF0ZUNoaWxkTm9kZSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgY3VycmVudFxuICAgID0gbm9kZS50eXBlID09PSBOb2RlVHlwZXMuRUxFTUVOVCAmJiBub2RlLnRhZ1R5cGUgPT09IEVsZW1lbnRUeXBlcy5DT01QT05FTlRcbiAgICAgID8gW25vZGUudGFnXVxuICAgICAgOiBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5FTEVNRU5UICYmIG5vZGUudGFnVHlwZSA9PT0gRWxlbWVudFR5cGVzLkVMRU1FTlRcbiAgICAgICAgPyBbbm9kZS50YWddXG4gICAgICAgIDogW11cblxuICBjb25zdCBjaGlsZHJlblxuICAgID0gbm9kZS50eXBlID09PSBOb2RlVHlwZXMuSUZcbiAgICAgID8gbm9kZS5icmFuY2hlc1xuICAgICAgOiBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5FTEVNRU5UXG4gICAgICAgIHx8IG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLklGX0JSQU5DSFxuICAgICAgICB8fCBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5GT1JcbiAgICAgICAgPyBub2RlLmNoaWxkcmVuXG4gICAgICAgIDogbm9kZS50eXBlID09PSBOb2RlVHlwZXMuVEVYVFxuICAgICAgICB8fCBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5DT01NRU5UXG4gICAgICAgIHx8IG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLkNPTVBPVU5EX0VYUFJFU1NJT05cbiAgICAgICAgfHwgbm9kZS50eXBlID09PSBOb2RlVHlwZXMuVEVYVF9DQUxMXG4gICAgICAgIHx8IG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLklOVEVSUE9MQVRJT05cbiAgICAgICAgICA/IFtdXG4gICAgICAgICAgOiBleGhhdXN0aXZlQ2hlY2tSZXR1cm5VbmRlZmluZWQobm9kZSkgPz8gW11cblxuICByZXR1cm4gWy4uLmN1cnJlbnQsIC4uLmNoaWxkcmVuLmZsYXRNYXAoZ2V0Q29tcG9uZW50cyldXG59XG5cbmZ1bmN0aW9uIGdldERpcmVjdGl2ZU5hbWVzKG5vZGU6IFRlbXBsYXRlQ2hpbGROb2RlKTogc3RyaW5nW10ge1xuICBpZiAobm9kZS50eXBlID09PSBOb2RlVHlwZXMuRUxFTUVOVCkge1xuICAgIGNvbnN0IGRpcmVjdGl2ZXMgPSBub2RlLnByb3BzLmZsYXRNYXAoeCA9PlxuICAgICAgeC50eXBlID09PSBOb2RlVHlwZXMuRElSRUNUSVZFID8gW3gubmFtZV0gOiBbXSxcbiAgICApXG4gICAgcmV0dXJuIFsuLi5kaXJlY3RpdmVzLCAuLi5ub2RlLmNoaWxkcmVuLmZsYXRNYXAoZ2V0RGlyZWN0aXZlTmFtZXMpXVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLklGKSB7XG4gICAgcmV0dXJuIG5vZGUuYnJhbmNoZXMuZmxhdE1hcChnZXREaXJlY3RpdmVOYW1lcylcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5JRl9CUkFOQ0ggfHwgbm9kZS50eXBlID09PSBOb2RlVHlwZXMuRk9SKSB7XG4gICAgcmV0dXJuIG5vZGUuY2hpbGRyZW4uZmxhdE1hcChnZXREaXJlY3RpdmVOYW1lcylcbiAgfVxuICBlbHNlIGlmIChcbiAgICBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5JTlRFUlBPTEFUSU9OXG4gICAgfHwgbm9kZS50eXBlID09PSBOb2RlVHlwZXMuQ09NUE9VTkRfRVhQUkVTU0lPTlxuICAgIHx8IG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLlRFWFRcbiAgICB8fCBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5DT01NRU5UXG4gICAgfHwgbm9kZS50eXBlID09PSBOb2RlVHlwZXMuVEVYVF9DQUxMXG4gICkge1xuICAgIHJldHVybiBbXVxuICB9XG4gIGVsc2Uge1xuICAgIGV4aGF1c3RpdmVDaGVja1JldHVyblVuZGVmaW5lZChub2RlKVxuICAgIHJldHVybiBbXVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldEZyZWVWYXJpYWJsZXNGb3JUZXh0KGlucHV0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGlucHV0V2l0aFByZWZpeCA9IGlucHV0LnRyaW1TdGFydCgpWzBdID09PSAneycgPyBgKCR7aW5wdXR9KWAgOiBpbnB1dFxuICByZXR1cm4gZ2V0RmlsZUdsb2JhbHMocGFyc2UoaW5wdXRXaXRoUHJlZml4KSlcbn1cblxuZnVuY3Rpb24gZ2V0RnJlZVZhcmlhYmxlc0ZvclByb3BzTm9kZShcbiAgbm9kZTogQXR0cmlidXRlTm9kZSB8IERpcmVjdGl2ZU5vZGUsXG4pOiBzdHJpbmdbXSB7XG4gIGlmIChub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5ESVJFQ1RJVkUpIHtcbiAgICBjb25zdCBhcmcgPSBub2RlLmFyZyA9PT0gdW5kZWZpbmVkID8gW10gOiBnZXRGcmVlVmFyaWFibGVzRm9yTm9kZShub2RlLmFyZylcbiAgICBjb25zdCBleHAgPSBub2RlLmV4cCA9PT0gdW5kZWZpbmVkID8gW10gOiBnZXRGcmVlVmFyaWFibGVzRm9yTm9kZShub2RlLmV4cClcbiAgICByZXR1cm4gWy4uLmFyZywgLi4uZXhwXVxuICB9XG4gIHJldHVybiBbXVxufVxuXG5mdW5jdGlvbiBnZXRGcmVlVmFyaWFibGVzRm9yTm9kZShcbiAgbm9kZTogVGVtcGxhdGVDaGlsZE5vZGUgfCBFeHByZXNzaW9uTm9kZSxcbik6IHN0cmluZ1tdIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLlNJTVBMRV9FWFBSRVNTSU9OKSB7XG4gICAgcmV0dXJuIG5vZGUuaXNTdGF0aWMgPyBbXSA6IGdldEZyZWVWYXJpYWJsZXNGb3JUZXh0KG5vZGUuY29udGVudClcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5DT01QT1VORF9FWFBSRVNTSU9OKSB7XG4gICAgcmV0dXJuIG5vZGUuY2hpbGRyZW4uZmxhdE1hcCh4ID0+XG4gICAgICB0eXBlb2YgeCAhPT0gJ29iamVjdCcgPyBbXSA6IGdldEZyZWVWYXJpYWJsZXNGb3JOb2RlKHgpLFxuICAgIClcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5JTlRFUlBPTEFUSU9OKSB7XG4gICAgcmV0dXJuIGdldEZyZWVWYXJpYWJsZXNGb3JOb2RlKG5vZGUuY29udGVudClcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5FTEVNRU5UKSB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLmZsYXRNYXAoZ2V0RnJlZVZhcmlhYmxlc0Zvck5vZGUpXG5cbiAgICBjb25zdCBkaXJlY3RpdmVQcm9wcyA9IG5vZGUucHJvcHMuZmxhdE1hcCh4ID0+XG4gICAgICB4LnR5cGUgPT09IE5vZGVUeXBlcy5ESVJFQ1RJVkUgPyBbeF0gOiBbXSxcbiAgICApXG4gICAgY29uc3QgYXR0cmlidXRlUHJvcHMgPSBub2RlLnByb3BzLmZsYXRNYXAoeCA9PlxuICAgICAgeC50eXBlID09PSBOb2RlVHlwZXMuQVRUUklCVVRFID8gW3hdIDogW10sXG4gICAgKVxuXG4gICAgY29uc3QgcmVmTm9kZSA9IGF0dHJpYnV0ZVByb3BzLmZpbmQoXG4gICAgICBub2RlID0+IG5vZGUubmFtZSA9PT0gJ3JlZicgJiYgbm9kZS52YWx1ZSAhPT0gdW5kZWZpbmVkLFxuICAgIClcbiAgICBjb25zdCByZWZJZGVudGlmaWVyID0gcmVmTm9kZT8udmFsdWU/LmNvbnRlbnRcblxuICAgIGNvbnN0IHZTbG90Tm9kZSA9IGRpcmVjdGl2ZVByb3BzLmZpbmQobm9kZSA9PiBub2RlLm5hbWUgPT09ICdzbG90JylcbiAgICBjb25zdCB2U2xvdEFyZ0lkZW50aWZpZXJzXG4gICAgICA9IHZTbG90Tm9kZT8uYXJnID09PSB1bmRlZmluZWQgPyBbXSA6IGdldEZyZWVWYXJpYWJsZXNGb3JOb2RlKHZTbG90Tm9kZS5hcmcpXG4gICAgLy8gVE9ETzogVmFyaWFibGUgc2hhZG93aW5nXG4gICAgY29uc3QgdlNsb3RFeHBWYXJpYWJsZVNoYWRvd2luZ0lkZW50aWZpZXJzOiBzdHJpbmdbXSA9IFtdXG5cbiAgICBjb25zdCB2Rm9yTm9kZSA9IGRpcmVjdGl2ZVByb3BzLmZpbmQobm9kZSA9PiBub2RlLm5hbWUgPT09ICdmb3InKVxuICAgIGNvbnN0IHZGb3JJZGVudGlmaWVyc1xuICAgICAgPSB2Rm9yTm9kZT8uZXhwPy50eXBlID09PSBOb2RlVHlwZXMuU0lNUExFX0VYUFJFU1NJT05cbiAgICAgICAgPyBnZXRGcmVlVmFyaWFibGVzRm9yVGV4dChcbiAgICAgICAgICB2Rm9yTm9kZS5leHAuY29udGVudC5yZXBsYWNlKC9eLipcXHMoPzppbnxvZilcXHMvLCAnJyksXG4gICAgICAgIClcbiAgICAgICAgOiBbXVxuICAgIC8vIFRPRE86IFZhcmlhYmxlIHNoYWRvd2luZ1xuICAgIGNvbnN0IHZGb3JFeHBWYXJpYWJsZVNoYWRvd2luZ0lkZW50aWZpZXJzOiBzdHJpbmdbXSA9IFtdXG5cbiAgICBjb25zdCBwcm9wcyA9IGRpcmVjdGl2ZVByb3BzXG4gICAgICAuZmlsdGVyKCh7IG5hbWUgfSkgPT4gbmFtZSAhPT0gJ3Nsb3QnICYmIG5hbWUgIT09ICdmb3InKVxuICAgICAgLmZsYXRNYXAoZ2V0RnJlZVZhcmlhYmxlc0ZvclByb3BzTm9kZSlcblxuICAgIGNvbnN0IHNoYWRvd2luZ0lkZW50aWZpZXJzID0gbmV3IFNldChbXG4gICAgICAuLi52U2xvdEV4cFZhcmlhYmxlU2hhZG93aW5nSWRlbnRpZmllcnMsXG4gICAgICAuLi52Rm9yRXhwVmFyaWFibGVTaGFkb3dpbmdJZGVudGlmaWVycyxcbiAgICBdKVxuICAgIHJldHVybiBbXG4gICAgICAuLi52U2xvdEFyZ0lkZW50aWZpZXJzLFxuICAgICAgcmVmSWRlbnRpZmllcixcbiAgICAgIC4uLnZGb3JJZGVudGlmaWVycyxcbiAgICAgIC4uLlsuLi5jaGlsZHJlbiwgLi4ucHJvcHNdLmZpbHRlcih4ID0+ICFzaGFkb3dpbmdJZGVudGlmaWVycy5oYXMoeCkpLFxuICAgIF0uZmlsdGVyKG5vdE51bGxpc2gpXG4gIH1cbiAgZWxzZSBpZiAobm9kZS50eXBlID09PSBOb2RlVHlwZXMuRk9SKSB7XG4gICAgLy8gSWYgd2UgdXNlIGBiYXNlQ29tcGlsZXJgLCB3ZSBuZWVkIGFkZCB2YXJpYWJsZSBzaGFkb3dpbmcgaGVyZVxuICAgIC8vIEJ1dCB3ZSB1c2UgYGJhc2VQYXJzZWAgbm93LiBTbyB0aGlzIGJyYW5jaCB3aWxsIG5ldmVyIGJlIHJlYWNoZWQuXG4gICAgLy8gYE5vZGVUeXBlcy5JRmAgYW5kIGBOb2RlVHlwZXMuSUZfQlJBTkNIYCB3aWxsIG5ldmVyIGJlIHJlYWNoZWQsIGFsc28uXG5cbiAgICAvLyBjb25zdCB7IGtleUFsaWFzLCB2YWx1ZUFsaWFzIH0gPSBub2RlXG4gICAgcmV0dXJuIFtub2RlLnNvdXJjZSwgLi4ubm9kZS5jaGlsZHJlbl0uZmxhdE1hcChnZXRGcmVlVmFyaWFibGVzRm9yTm9kZSlcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5JRikge1xuICAgIHJldHVybiAobm9kZS5icmFuY2hlcyA/PyBbXSkuZmxhdE1hcChnZXRGcmVlVmFyaWFibGVzRm9yTm9kZSlcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5JRl9CUkFOQ0gpIHtcbiAgICByZXR1cm4gW25vZGUuY29uZGl0aW9uLCAuLi5ub2RlLmNoaWxkcmVuXVxuICAgICAgLmZpbHRlcihub3ROdWxsaXNoKVxuICAgICAgLmZsYXRNYXAoZ2V0RnJlZVZhcmlhYmxlc0Zvck5vZGUpXG4gIH1cbiAgZWxzZSBpZiAoXG4gICAgbm9kZS50eXBlID09PSBOb2RlVHlwZXMuVEVYVFxuICAgIHx8IG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLkNPTU1FTlRcbiAgICB8fCBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5URVhUX0NBTExcbiAgKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cbiAgZWxzZSB7XG4gICAgZXhoYXVzdGl2ZUNoZWNrUmV0dXJuVW5kZWZpbmVkKG5vZGUpXG4gICAgcmV0dXJuIFtdXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRSZWZlcmVuY2VzRm9yU0ZDKFxuICB0ZW1wbGF0ZU5vZGU6IFJvb3ROb2RlIHwgUGxhaW5FbGVtZW50Tm9kZSB8IHVuZGVmaW5lZCxcbikge1xuICBjb25zdCBjb21wb25lbnRzID0gdGVtcGxhdGVOb2RlPy5jaGlsZHJlbi5mbGF0TWFwKGdldENvbXBvbmVudHMpID8/IFtdXG4gIGNvbnN0IGRpcmVjdGl2ZXMgPSB0ZW1wbGF0ZU5vZGU/LmNoaWxkcmVuLmZsYXRNYXAoZ2V0RGlyZWN0aXZlTmFtZXMpID8/IFtdXG4gIGNvbnN0IGlkZW50aWZpZXJzXG4gICAgPSB0ZW1wbGF0ZU5vZGU/LmNoaWxkcmVuLmZsYXRNYXAoZ2V0RnJlZVZhcmlhYmxlc0Zvck5vZGUpID8/IFtdXG5cbiAgcmV0dXJuIHtcbiAgICBjb21wb25lbnRzLFxuICAgIGRpcmVjdGl2ZXMsXG4gICAgaWRlbnRpZmllcnMsXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0QmFiZWxQYXJzZXJPcHRpb25zKGxhbmc6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgbGFuZyA9IGxhbmcgfHwgJ2pzJ1xuICBjb25zdCBwbHVnaW5zRGljdDogUmVjb3JkPHN0cmluZywgQXJyYXk8UGFyc2VyUGx1Z2luPj4gPSB7XG4gICAganM6IFtdLFxuICAgIHRzOiBbJ3R5cGVzY3JpcHQnXSxcbiAgICBqc3g6IFsnanN4J10sXG4gICAgdHN4OiBbJ2pzeCcsICd0eXBlc2NyaXB0J10sXG4gIH1cbiAgY29uc3QgcGx1Z2lucyA9IHBsdWdpbnNEaWN0W2xhbmddXG4gIGlmIChwbHVnaW5zID09PSB1bmRlZmluZWQpXG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBVbnN1cHBvcnRlZCBzY3JpcHQgbGFuZ3VhZ2U6ICR7bGFuZ31gKVxuICByZXR1cm4ge1xuICAgIHNvdXJjZVR5cGU6ICdtb2R1bGUnIGFzIGNvbnN0LFxuICAgIHBsdWdpbnMsXG4gIH1cbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXJzZVNGQyhcbiAgY29kZTogc3RyaW5nLFxuICBpZD86IHN0cmluZyxcbiAgb3B0aW9ucz86IFNjcmlwdFNldHVwVHJhbnNmb3JtT3B0aW9ucyxcbik6IFByb21pc2U8UGFyc2VkU0ZDPiB7XG4gIGNvbnN0IGVsZW1lbnRDaGlsZHJlbiA9IGJhc2VQYXJzZShjb2RlLCBwYXJzZXJPcHRpb25zKS5jaGlsZHJlbi5mbGF0TWFwKHggPT5cbiAgICB4LnR5cGUgPT09IE5vZGVUeXBlcy5FTEVNRU5UICYmIHgudGFnVHlwZSA9PT0gRWxlbWVudFR5cGVzLkVMRU1FTlRcbiAgICAgID8gW3hdXG4gICAgICA6IFtdLFxuICApXG4gIGNvbnN0IHRlbXBsYXRlTm9kZSA9IGVsZW1lbnRDaGlsZHJlbi5maW5kKHggPT4geC50YWcgPT09ICd0ZW1wbGF0ZScpXG5cbiAgY29uc3QgW3NjcmlwdFNldHVwQ2hpbGROb2Rlcywgc2NyaXB0Q2hpbGROb2Rlc10gPSBwYXJ0aXRpb24oXG4gICAgZWxlbWVudENoaWxkcmVuLmZpbHRlcih4ID0+IHgudGFnID09PSAnc2NyaXB0JyksXG4gICAgeCA9PiB4LnByb3BzLnNvbWUocCA9PiBwLnR5cGUgPT09IE5vZGVUeXBlcy5BVFRSSUJVVEUgJiYgcC5uYW1lID09PSAnc2V0dXAnKSxcbiAgKVxuXG4gIGNvbnN0IGdldFNjcmlwdFRhZ01ldGEgPSAoXG4gICAgbjogUGxhaW5FbGVtZW50Tm9kZSB8IHVuZGVmaW5lZCxcbiAgICBhc3RUcmFuc2Zvcm1zOiAoYXN0OiBQcm9ncmFtKSA9PiBQcm9ncmFtID0geCA9PiB4LFxuICApOiBTY3JpcHRUYWdNZXRhID0+IHtcbiAgICBpZiAobiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gJydcbiAgICAgIGNvbnN0IGFzdCA9IHBhcnNlKGNvbnRlbnQsIHtcbiAgICAgICAgc291cmNlVHlwZTogJ21vZHVsZScsXG4gICAgICAgIHBsdWdpbnM6IFtdLFxuICAgICAgfSkucHJvZ3JhbVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgIGVuZDogMCxcbiAgICAgICAgY29udGVudFN0YXJ0OiAwLFxuICAgICAgICBjb250ZW50RW5kOiAwLFxuICAgICAgICBjb250ZW50LFxuICAgICAgICBhdHRyczoge30sXG4gICAgICAgIGZvdW5kOiBmYWxzZSxcbiAgICAgICAgYXN0LFxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBhdHRycyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIG4ucHJvcHMuZmxhdE1hcCh4ID0+XG4gICAgICAgICEoXG4gICAgICAgICAgeC50eXBlID09PSBOb2RlVHlwZXMuQVRUUklCVVRFICYmIHR5cGVvZiB4LnZhbHVlPy5jb250ZW50ID09PSAnc3RyaW5nJ1xuICAgICAgICApXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogW1t4Lm5hbWUsIHgudmFsdWUuY29udGVudF1dLFxuICAgICAgKSxcbiAgICApXG4gICAgY29uc3QgY29udGVudCA9IG4uY2hpbGRyZW5bMF0/LmxvYy5zb3VyY2UgPz8gJydcbiAgICBjb25zdCBjb250ZW50U3RhcnQgPSBuLmNoaWxkcmVuWzBdPy5sb2Muc3RhcnQub2Zmc2V0ID8/IDBcbiAgICBjb25zdCBjb250ZW50RW5kID0gbi5jaGlsZHJlblswXT8ubG9jLmVuZC5vZmZzZXQgPz8gMFxuICAgIGNvbnN0IGFzdCA9IGFzdFRyYW5zZm9ybXMoXG4gICAgICBwYXJzZShjb250ZW50LCBnZXRCYWJlbFBhcnNlck9wdGlvbnMoYXR0cnMubGFuZykpLnByb2dyYW0sXG4gICAgKVxuICAgIHJldHVybiB7XG4gICAgICBzdGFydDogbi5sb2Muc3RhcnQub2Zmc2V0LFxuICAgICAgZW5kOiBuLmxvYy5lbmQub2Zmc2V0LFxuICAgICAgY29udGVudFN0YXJ0LFxuICAgICAgY29udGVudEVuZCxcbiAgICAgIGNvbnRlbnQsXG4gICAgICBhdHRycyxcbiAgICAgIGZvdW5kOiB0cnVlLFxuICAgICAgYXN0LFxuICAgIH1cbiAgfVxuICBjb25zdCBzY3JpcHRTZXR1cCA9IGdldFNjcmlwdFRhZ01ldGEoXG4gICAgc2NyaXB0U2V0dXBDaGlsZE5vZGVzWzBdLFxuICAgIG9wdGlvbnM/LmFzdFRyYW5zZm9ybXM/LnNjcmlwdFNldHVwLFxuICApXG4gIGNvbnN0IHNjcmlwdCA9IGdldFNjcmlwdFRhZ01ldGEoXG4gICAgc2NyaXB0Q2hpbGROb2Rlc1swXSxcbiAgICBvcHRpb25zPy5hc3RUcmFuc2Zvcm1zPy5zY3JpcHQsXG4gIClcblxuICBpZiAoXG4gICAgc2NyaXB0LmZvdW5kXG4gICAgJiYgc2NyaXB0U2V0dXAuZm91bmRcbiAgICAmJiBzY3JpcHRTZXR1cC5hdHRycy5sYW5nICE9PSBzY3JpcHQuYXR0cnMubGFuZ1xuICApIHtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXG4gICAgICAnPHNjcmlwdCBzZXR1cD4gbGFuZ3VhZ2UgbXVzdCBiZSB0aGUgc2FtZSBhcyA8c2NyaXB0PicsXG4gICAgKVxuICB9XG5cbiAgY29uc3QgY29kZU9mVGVtcGxhdGVcbiAgICA9IHRlbXBsYXRlTm9kZSA9PSBudWxsXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiB0ZW1wbGF0ZU5vZGUucHJvcHMuc29tZShcbiAgICAgICAgcCA9PlxuICAgICAgICAgIHAudHlwZSA9PT0gTm9kZVR5cGVzLkFUVFJJQlVURVxuICAgICAgICAgICAgJiYgcC5uYW1lID09PSAnbGFuZydcbiAgICAgICAgICAgICYmIHAudmFsdWU/LnR5cGUgPT09IE5vZGVUeXBlcy5URVhUXG4gICAgICAgICAgICAmJiBwLnZhbHVlLmNvbnRlbnQgPT09ICdwdWcnLFxuICAgICAgKVxuICAgICAgICA/IGJhc2VQYXJzZShcbiAgICAgICAgICAoYXdhaXQgaW1wb3J0KCdwdWcnKSkuY29tcGlsZShcbiAgICAgICAgICAgIHRlbXBsYXRlTm9kZS5jaGlsZHJlbi5tYXAoeCA9PiB4LmxvYy5zb3VyY2UpLmpvaW4oJycpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBmaWxlbmFtZTogaWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICkoKSxcbiAgICAgICAgICBwYXJzZXJPcHRpb25zLFxuICAgICAgICApXG4gICAgICAgIDogdGVtcGxhdGVOb2RlXG5cbiAgY29uc3QgcmVzdWx0ID0gY29kZU9mVGVtcGxhdGVcbiAgICA/IGZpbmRSZWZlcmVuY2VzRm9yU0ZDKGNvZGVPZlRlbXBsYXRlKVxuICAgIDogdW5kZWZpbmVkXG5cbiAgcmV0dXJuIHtcbiAgICBpZCxcbiAgICB0ZW1wbGF0ZToge1xuICAgICAgY29tcG9uZW50czogbmV3IFNldChyZXN1bHQ/LmNvbXBvbmVudHMubWFwKHBhc2NhbGl6ZSkpLFxuICAgICAgZGlyZWN0aXZlczogbmV3IFNldChcbiAgICAgICAgcmVzdWx0Py5kaXJlY3RpdmVzXG4gICAgICAgICAgLmZpbHRlcih4ID0+ICFCVUlMRF9JTl9ESVJFQ1RJVkVTLmhhcyh4KSlcbiAgICAgICAgICAubWFwKGNhbWVsaXplKSxcbiAgICAgICksXG4gICAgICBpZGVudGlmaWVyczogbmV3IFNldChyZXN1bHQ/LmlkZW50aWZpZXJzKSxcbiAgICB9LFxuICAgIHNjcmlwdFNldHVwLFxuICAgIHNjcmlwdCxcbiAgICBwYXJzZXJPcHRpb25zOiBnZXRCYWJlbFBhcnNlck9wdGlvbnMoXG4gICAgICBzY3JpcHQuYXR0cnMubGFuZyA/PyBzY3JpcHRTZXR1cC5hdHRycy5sYW5nLFxuICAgICksXG4gICAgZXh0cmFEZWNsYXJhdGlvbnM6IFtdLFxuICB9XG59XG4iLCIvLyBtb2RpZmllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUtbmV4dC9ibG9iL21haW4vcGFja2FnZXMvY29tcGlsZXItc2ZjL3NyYy9jb21waWxlU2NyaXB0LnRzXG5cbmltcG9ydCB0eXBlIHtcbiAgQ2FsbEV4cHJlc3Npb24sXG4gIE5vZGUsXG4gIE9iamVjdEV4cHJlc3Npb24sXG4gIE9iamVjdFByb3BlcnR5LFxuICBTdGF0ZW1lbnQsXG4gIFRTRnVuY3Rpb25UeXBlLFxuICBUU0ludGVyZmFjZUJvZHksXG4gIFRTVHlwZSxcbiAgVFNUeXBlTGl0ZXJhbCxcbn0gZnJvbSAnQGJhYmVsL3R5cGVzJ1xuaW1wb3J0IHsgcGFyc2VFeHByZXNzaW9uLCB0IH0gZnJvbSAnLi9iYWJlbCdcblxuLy8gU3BlY2lhbCBjb21waWxlciBtYWNyb3NcbmNvbnN0IERFRklORV9QUk9QUyA9ICdkZWZpbmVQcm9wcydcbmNvbnN0IERFRklORV9FTUlUUyA9ICdkZWZpbmVFbWl0cydcbmNvbnN0IERFRklORV9FWFBPU0UgPSAnZGVmaW5lRXhwb3NlJ1xuY29uc3QgV0lUSF9ERUZBVUxUUyA9ICd3aXRoRGVmYXVsdHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvcFR5cGVEYXRhIHtcbiAga2V5OiBzdHJpbmdcbiAgdHlwZTogc3RyaW5nW10gfCBzdHJpbmdcbiAgcmVxdWlyZWQ6IGJvb2xlYW5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TWFjcm9zKG5vZGVzOiBTdGF0ZW1lbnRbXSkge1xuICBsZXQgaGFzRGVmaW5lUHJvcHNDYWxsID0gZmFsc2VcbiAgbGV0IGhhc0RlZmluZUVtaXRDYWxsID0gZmFsc2VcbiAgbGV0IHByb3BzUnVudGltZURlY2w6IE5vZGUgfCB1bmRlZmluZWRcbiAgbGV0IHByb3BzUnVudGltZURlZmF1bHRzOiBOb2RlIHwgdW5kZWZpbmVkXG4gIGxldCBwcm9wc1R5cGVEZWNsOiBUU1R5cGVMaXRlcmFsIHwgVFNJbnRlcmZhY2VCb2R5IHwgdW5kZWZpbmVkXG4gIGxldCBwcm9wc1R5cGVEZWNsUmF3OiBOb2RlIHwgdW5kZWZpbmVkXG4gIGxldCBlbWl0c1J1bnRpbWVEZWNsOiBOb2RlIHwgdW5kZWZpbmVkXG4gIGxldCBlbWl0c1R5cGVEZWNsOlxuICB8IFRTRnVuY3Rpb25UeXBlXG4gIHwgVFNUeXBlTGl0ZXJhbFxuICB8IFRTSW50ZXJmYWNlQm9keVxuICB8IHVuZGVmaW5lZFxuICBsZXQgZW1pdHNUeXBlRGVjbFJhdzogTm9kZSB8IHVuZGVmaW5lZFxuICBsZXQgZXhwb3NlRGVjbDogQ2FsbEV4cHJlc3Npb25bJ2FyZ3VtZW50cyddW251bWJlcl0gfCB1bmRlZmluZWRcblxuICAvLyBwcm9wcy9lbWl0cyBkZWNsYXJlZCB2aWEgdHlwZXNcbiAgY29uc3QgdHlwZURlY2xhcmVkUHJvcHM6IFJlY29yZDxzdHJpbmcsIFByb3BUeXBlRGF0YT4gPSB7fVxuICAvLyByZWNvcmQgZGVjbGFyZWQgdHlwZXMgZm9yIHJ1bnRpbWUgcHJvcHMgdHlwZSBnZW5lcmF0aW9uXG4gIGNvbnN0IGRlY2xhcmVkVHlwZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9XG5cbiAgZnVuY3Rpb24gZXJyb3IoXG4gICAgbXNnOiBzdHJpbmcsXG5cbiAgICBfbm9kZTogTm9kZSxcbiAgKTogbmV2ZXIge1xuICAgIHRocm93IG5ldyBFcnJvcihtc2cpXG4gIH1cblxuICBmdW5jdGlvbiBwcm9jZXNzRGVmaW5lUHJvcHMobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICAgIGlmICghaXNDYWxsT2Yobm9kZSwgREVGSU5FX1BST1BTKSlcbiAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgaWYgKGhhc0RlZmluZVByb3BzQ2FsbClcbiAgICAgIGVycm9yKGBkdXBsaWNhdGUgJHtERUZJTkVfUFJPUFN9KCkgY2FsbGAsIG5vZGUpXG5cbiAgICBoYXNEZWZpbmVQcm9wc0NhbGwgPSB0cnVlXG5cbiAgICBwcm9wc1J1bnRpbWVEZWNsID0gbm9kZS5hcmd1bWVudHNbMF1cblxuICAgIC8vIGNhbGwgaGFzIHR5cGUgcGFyYW1ldGVycyAtIGluZmVyIHJ1bnRpbWUgdHlwZXMgZnJvbSBpdFxuICAgIGlmIChub2RlLnR5cGVQYXJhbWV0ZXJzKSB7XG4gICAgICBpZiAocHJvcHNSdW50aW1lRGVjbCkge1xuICAgICAgICBlcnJvcihcbiAgICAgICAgICBgJHtERUZJTkVfUFJPUFN9KCkgY2Fubm90IGFjY2VwdCBib3RoIHR5cGUgYW5kIG5vbi10eXBlIGFyZ3VtZW50cyBgXG4gICAgICAgICAgICArICdhdCB0aGUgc2FtZSB0aW1lLiBVc2Ugb25lIG9yIHRoZSBvdGhlci4nLFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgcHJvcHNUeXBlRGVjbFJhdyA9IG5vZGUudHlwZVBhcmFtZXRlcnMucGFyYW1zWzBdXG4gICAgICBwcm9wc1R5cGVEZWNsID0gcmVzb2x2ZVF1YWxpZmllZFR5cGUoXG4gICAgICAgIHByb3BzVHlwZURlY2xSYXcsXG4gICAgICAgIG5vZGUgPT4gbm9kZS50eXBlID09PSAnVFNUeXBlTGl0ZXJhbCcsXG4gICAgICApIGFzIFRTVHlwZUxpdGVyYWwgfCBUU0ludGVyZmFjZUJvZHkgfCB1bmRlZmluZWRcblxuICAgICAgaWYgKCFwcm9wc1R5cGVEZWNsKSB7XG4gICAgICAgIGVycm9yKFxuICAgICAgICAgIGB0eXBlIGFyZ3VtZW50IHBhc3NlZCB0byAke0RFRklORV9QUk9QU30oKSBtdXN0IGJlIGEgbGl0ZXJhbCB0eXBlLCBgXG4gICAgICAgICAgICArICdvciBhIHJlZmVyZW5jZSB0byBhbiBpbnRlcmZhY2Ugb3IgbGl0ZXJhbCB0eXBlLicsXG4gICAgICAgICAgcHJvcHNUeXBlRGVjbFJhdyxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBmdW5jdGlvbiBwcm9jZXNzV2l0aERlZmF1bHRzKG5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgICBpZiAoIWlzQ2FsbE9mKG5vZGUsIFdJVEhfREVGQVVMVFMpKVxuICAgICAgcmV0dXJuIGZhbHNlXG5cbiAgICBpZiAocHJvY2Vzc0RlZmluZVByb3BzKG5vZGUuYXJndW1lbnRzWzBdKSkge1xuICAgICAgaWYgKHByb3BzUnVudGltZURlY2wpIHtcbiAgICAgICAgZXJyb3IoXG4gICAgICAgICAgYCR7V0lUSF9ERUZBVUxUU30gY2FuIG9ubHkgYmUgdXNlZCB3aXRoIHR5cGUtYmFzZWQgYFxuICAgICAgICAgICAgKyBgJHtERUZJTkVfUFJPUFN9IGRlY2xhcmF0aW9uLmAsXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcHJvcHNSdW50aW1lRGVmYXVsdHMgPSBub2RlLmFyZ3VtZW50c1sxXVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGVycm9yKFxuICAgICAgICBgJHtXSVRIX0RFRkFVTFRTfScgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhICR7REVGSU5FX1BST1BTfSBjYWxsLmAsXG4gICAgICAgIG5vZGUuYXJndW1lbnRzWzBdIHx8IG5vZGUsXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBmdW5jdGlvbiBwcm9jZXNzRGVmaW5lRW1pdHMobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICAgIGlmICghaXNDYWxsT2Yobm9kZSwgREVGSU5FX0VNSVRTKSlcbiAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgaWYgKGhhc0RlZmluZUVtaXRDYWxsKVxuICAgICAgZXJyb3IoYGR1cGxpY2F0ZSAke0RFRklORV9FTUlUU30oKSBjYWxsYCwgbm9kZSlcblxuICAgIGhhc0RlZmluZUVtaXRDYWxsID0gdHJ1ZVxuICAgIGVtaXRzUnVudGltZURlY2wgPSBub2RlLmFyZ3VtZW50c1swXVxuICAgIGlmIChub2RlLnR5cGVQYXJhbWV0ZXJzKSB7XG4gICAgICBpZiAoZW1pdHNSdW50aW1lRGVjbCkge1xuICAgICAgICBlcnJvcihcbiAgICAgICAgICBgJHtERUZJTkVfRU1JVFN9KCkgY2Fubm90IGFjY2VwdCBib3RoIHR5cGUgYW5kIG5vbi10eXBlIGFyZ3VtZW50cyBgXG4gICAgICAgICAgICArICdhdCB0aGUgc2FtZSB0aW1lLiBVc2Ugb25lIG9yIHRoZSBvdGhlci4nLFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgZW1pdHNUeXBlRGVjbFJhdyA9IG5vZGUudHlwZVBhcmFtZXRlcnMucGFyYW1zWzBdXG4gICAgICBlbWl0c1R5cGVEZWNsID0gcmVzb2x2ZVF1YWxpZmllZFR5cGUoXG4gICAgICAgIGVtaXRzVHlwZURlY2xSYXcsXG4gICAgICAgIG5vZGUgPT4gbm9kZS50eXBlID09PSAnVFNGdW5jdGlvblR5cGUnIHx8IG5vZGUudHlwZSA9PT0gJ1RTVHlwZUxpdGVyYWwnLFxuICAgICAgKSBhcyBUU0Z1bmN0aW9uVHlwZSB8IFRTVHlwZUxpdGVyYWwgfCBUU0ludGVyZmFjZUJvZHkgfCB1bmRlZmluZWRcblxuICAgICAgaWYgKCFlbWl0c1R5cGVEZWNsKSB7XG4gICAgICAgIGVycm9yKFxuICAgICAgICAgIGB0eXBlIGFyZ3VtZW50IHBhc3NlZCB0byAke0RFRklORV9FTUlUU30oKSBtdXN0IGJlIGEgZnVuY3Rpb24gdHlwZSwgYFxuICAgICAgICAgICAgKyAnYSBsaXRlcmFsIHR5cGUgd2l0aCBjYWxsIHNpZ25hdHVyZXMsIG9yIGEgcmVmZXJlbmNlIHRvIHRoZSBhYm92ZSB0eXBlcy4nLFxuICAgICAgICAgIGVtaXRzVHlwZURlY2xSYXcsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc29sdmVRdWFsaWZpZWRUeXBlKFxuICAgIG5vZGU6IE5vZGUsXG4gICAgcXVhbGlmaWVyOiAobm9kZTogTm9kZSkgPT4gYm9vbGVhbixcbiAgKSB7XG4gICAgaWYgKHF1YWxpZmllcihub2RlKSlcbiAgICAgIHJldHVybiBub2RlXG5cbiAgICBpZiAoXG4gICAgICBub2RlLnR5cGUgPT09ICdUU1R5cGVSZWZlcmVuY2UnXG4gICAgICAmJiBub2RlLnR5cGVOYW1lLnR5cGUgPT09ICdJZGVudGlmaWVyJ1xuICAgICkge1xuICAgICAgY29uc3QgcmVmTmFtZSA9IG5vZGUudHlwZU5hbWUubmFtZVxuICAgICAgY29uc3QgaXNRdWFsaWZpZWRUeXBlID0gKG5vZGU6IE5vZGUpOiBOb2RlIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5vZGUudHlwZSA9PT0gJ1RTSW50ZXJmYWNlRGVjbGFyYXRpb24nXG4gICAgICAgICAgJiYgbm9kZS5pZC5uYW1lID09PSByZWZOYW1lXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gbm9kZS5ib2R5XG5cbiAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgbm9kZS50eXBlID09PSAnVFNUeXBlQWxpYXNEZWNsYXJhdGlvbidcbiAgICAgICAgICAmJiBub2RlLmlkLm5hbWUgPT09IHJlZk5hbWVcbiAgICAgICAgICAmJiBxdWFsaWZpZXIobm9kZS50eXBlQW5ub3RhdGlvbilcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiBub2RlLnR5cGVBbm5vdGF0aW9uXG5cbiAgICAgICAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnRXhwb3J0TmFtZWREZWNsYXJhdGlvbicgJiYgbm9kZS5kZWNsYXJhdGlvbilcbiAgICAgICAgICByZXR1cm4gaXNRdWFsaWZpZWRUeXBlKG5vZGUuZGVjbGFyYXRpb24pXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgICBjb25zdCBxdWFsaWZpZWQgPSBpc1F1YWxpZmllZFR5cGUobm9kZSlcbiAgICAgICAgaWYgKHF1YWxpZmllZClcbiAgICAgICAgICByZXR1cm4gcXVhbGlmaWVkXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0RlZmluZUV4cG9zZShub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gICAgaWYgKCFpc0NhbGxPZihub2RlLCBERUZJTkVfRVhQT1NFKSlcbiAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgaWYgKGV4cG9zZURlY2wpXG4gICAgICBlcnJvcihgZHVwbGljYXRlICR7REVGSU5FX0VYUE9TRX0oKSBjYWxsYCwgbm9kZSlcblxuICAgIGlmIChub2RlLmFyZ3VtZW50cy5sZW5ndGggIT09IDEpXG4gICAgICBlcnJvcihgJHtERUZJTkVfRVhQT1NFfSgpIHJlcXVpcmVzIG9uZSBhcmd1bWVudGAsIG5vZGUpXG5cbiAgICBleHBvc2VEZWNsID0gbm9kZS5hcmd1bWVudHNbMF1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBmdW5jdGlvbiBnZW5SdW50aW1lUHJvcHMocHJvcHM6IFJlY29yZDxzdHJpbmcsIFByb3BUeXBlRGF0YT4pIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocHJvcHMpXG4gICAgaWYgKCFrZXlzLmxlbmd0aClcbiAgICAgIHJldHVybiB1bmRlZmluZWRcblxuICAgIC8vIGNoZWNrIGRlZmF1bHRzLiBJZiB0aGUgZGVmYXVsdCBvYmplY3QgaXMgYW4gb2JqZWN0IGxpdGVyYWwgd2l0aCBvbmx5XG4gICAgLy8gc3RhdGljIHByb3BlcnRpZXMsIHdlIGNhbiBkaXJlY3RseSBnZW5lcmF0ZSBtb3JlIG9wdGltemllZCBkZWZhdWx0XG4gICAgLy8gZGVjYWxyYXRpb25zLiBPdGhlcndpc2Ugd2Ugd2lsbCBoYXZlIHRvIGZhbGxiYWNrIHRvIHJ1bnRpbWUgbWVyZ2luZy5cbiAgICBjb25zdCBoYXNTdGF0aWNEZWZhdWx0cyA9IHByb3BzUnVudGltZURlZmF1bHRzXG4gICAgICAmJiBwcm9wc1J1bnRpbWVEZWZhdWx0cy50eXBlID09PSAnT2JqZWN0RXhwcmVzc2lvbidcbiAgICAgICYmIHByb3BzUnVudGltZURlZmF1bHRzLnByb3BlcnRpZXMuZXZlcnkoXG4gICAgICAgIG5vZGUgPT4gbm9kZS50eXBlID09PSAnT2JqZWN0UHJvcGVydHknICYmICFub2RlLmNvbXB1dGVkLFxuICAgICAgKVxuXG4gICAgcmV0dXJuIHQub2JqZWN0RXhwcmVzc2lvbihcbiAgICAgIE9iamVjdC5lbnRyaWVzKHByb3BzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBjb25zdCBwcm9wID0gaGFzU3RhdGljRGVmYXVsdHNcbiAgICAgICAgICA/IChwcm9wc1J1bnRpbWVEZWZhdWx0cyBhcyBPYmplY3RFeHByZXNzaW9uKS5wcm9wZXJ0aWVzLmZpbmQoKG5vZGU6IGFueSkgPT4gbm9kZS5rZXkubmFtZSA9PT0ga2V5KSBhcyBPYmplY3RQcm9wZXJ0eVxuICAgICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgICAgaWYgKHByb3ApXG4gICAgICAgICAgdmFsdWUucmVxdWlyZWQgPSBmYWxzZVxuXG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyh2YWx1ZSkubWFwKChba2V5LCB2YWx1ZV0pID0+IGtleSA9PT0gJ3R5cGUnXG4gICAgICAgICAgPyB0Lm9iamVjdFByb3BlcnR5KHQuaWRlbnRpZmllcihrZXkpLCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdC5pZGVudGlmaWVyKHZhbHVlKSA6IHQuYXJyYXlFeHByZXNzaW9uKHZhbHVlLm1hcCgoaTogYW55KSA9PiB0LmlkZW50aWZpZXIoaSkpKSBhcyBhbnkpXG4gICAgICAgICAgOiB0Lm9iamVjdFByb3BlcnR5KHQuaWRlbnRpZmllcihrZXkpLCBwYXJzZUV4cHJlc3Npb24oSlNPTi5zdHJpbmdpZnkodmFsdWUpKSBhcyBhbnkpLFxuICAgICAgICApXG5cbiAgICAgICAgaWYgKHByb3ApXG4gICAgICAgICAgZW50cmllcy5wdXNoKHQub2JqZWN0UHJvcGVydHkodC5pZGVudGlmaWVyKCdkZWZhdWx0JyksIHByb3AudmFsdWUgYXMgYW55KSlcblxuICAgICAgICByZXR1cm4gdC5vYmplY3RQcm9wZXJ0eShcbiAgICAgICAgICB0LmlkZW50aWZpZXIoa2V5KSxcbiAgICAgICAgICB0Lm9iamVjdEV4cHJlc3Npb24oZW50cmllcyksXG4gICAgICAgIClcbiAgICAgIH0pLFxuICAgIClcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFByb3BzKCkge1xuICAgIGlmIChwcm9wc1J1bnRpbWVEZWNsKVxuICAgICAgcmV0dXJuIHByb3BzUnVudGltZURlY2xcblxuICAgIGlmIChwcm9wc1R5cGVEZWNsKSB7XG4gICAgICBleHRyYWN0UnVudGltZVByb3BzKHByb3BzVHlwZURlY2wsIHR5cGVEZWNsYXJlZFByb3BzLCBkZWNsYXJlZFR5cGVzKVxuICAgICAgcmV0dXJuIGdlblJ1bnRpbWVQcm9wcyh0eXBlRGVjbGFyZWRQcm9wcylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0aHJvd0lmQXdhaXQobm9kZTogTm9kZSkge1xuICAgIGlmIChub2RlLnR5cGUgPT09ICdBd2FpdEV4cHJlc3Npb24nKVxuICAgICAgZXJyb3IoJ3RvcC1sZXZlbCBhd2FpdCBpcyBub3Qgc3VwcG9ydGVkIGluIFZ1ZSAyJywgbm9kZSlcbiAgfVxuXG4gIG5vZGVzID0gbm9kZXNcbiAgICAubWFwKChyYXc6IE5vZGUpID0+IHtcbiAgICAgIGxldCBub2RlID0gcmF3XG4gICAgICBpZiAocmF3LnR5cGUgPT09ICdFeHByZXNzaW9uU3RhdGVtZW50JylcbiAgICAgICAgbm9kZSA9IHJhdy5leHByZXNzaW9uXG5cbiAgICAgIGlmIChub2RlLnR5cGUgPT09ICdWYXJpYWJsZURlY2xhcmF0aW9uJyAmJiAhbm9kZS5kZWNsYXJlKSB7XG4gICAgICAgIGNvbnN0IHRvdGFsID0gbm9kZS5kZWNsYXJhdGlvbnMubGVuZ3RoXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG90YWw7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGRlY2wgPSBub2RlLmRlY2xhcmF0aW9uc1tpXVxuICAgICAgICAgIGlmIChkZWNsLmluaXQpIHtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzRGVmaW5lRW1pdHMoZGVjbC5pbml0KSlcbiAgICAgICAgICAgICAgZGVjbC5pbml0ID0gdC5tZW1iZXJFeHByZXNzaW9uKHQuaWRlbnRpZmllcignX19jdHgnKSwgdC5pZGVudGlmaWVyKCdlbWl0JykpIGFzIGFueVxuICAgICAgICAgICAgZWxzZSBpZiAocHJvY2Vzc0RlZmluZVByb3BzKGRlY2wuaW5pdCkgfHwgcHJvY2Vzc1dpdGhEZWZhdWx0cyhkZWNsLmluaXQpKVxuICAgICAgICAgICAgICBkZWNsLmluaXQgPSB0LmlkZW50aWZpZXIoJ19fcHJvcHMnKSBhcyBhbnlcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgdGhyb3dJZkF3YWl0KGRlY2wuaW5pdClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHByb2Nlc3NXaXRoRGVmYXVsdHMobm9kZSkgfHwgcHJvY2Vzc0RlZmluZUVtaXRzKG5vZGUpIHx8IHByb2Nlc3NEZWZpbmVQcm9wcyhub2RlKSB8fCBwcm9jZXNzRGVmaW5lRXhwb3NlKG5vZGUpKVxuICAgICAgICByZXR1cm4gbnVsbFxuXG4gICAgICB0aHJvd0lmQXdhaXQobm9kZSlcblxuICAgICAgcmV0dXJuIHJhd1xuICAgIH0pXG4gICAgLmZpbHRlcihCb29sZWFuKSBhcyBTdGF0ZW1lbnRbXVxuXG4gIHJldHVybiB7XG4gICAgbm9kZXMsXG4gICAgcHJvcHM6IGdldFByb3BzKCksXG4gICAgZXhwb3NlOiBleHBvc2VEZWNsLFxuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ2FsbE9mKFxuICBub2RlOiBOb2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgdGVzdDogc3RyaW5nIHwgKChpZDogc3RyaW5nKSA9PiBib29sZWFuKSxcbik6IG5vZGUgaXMgQ2FsbEV4cHJlc3Npb24ge1xuICByZXR1cm4gISEoXG4gICAgbm9kZVxuICAgICYmIG5vZGUudHlwZSA9PT0gJ0NhbGxFeHByZXNzaW9uJ1xuICAgICYmIG5vZGUuY2FsbGVlLnR5cGUgPT09ICdJZGVudGlmaWVyJ1xuICAgICYmICh0eXBlb2YgdGVzdCA9PT0gJ3N0cmluZydcbiAgICAgID8gbm9kZS5jYWxsZWUubmFtZSA9PT0gdGVzdFxuICAgICAgOiB0ZXN0KG5vZGUuY2FsbGVlLm5hbWUpKVxuICApXG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RSdW50aW1lUHJvcHMoXG4gIG5vZGU6IFRTVHlwZUxpdGVyYWwgfCBUU0ludGVyZmFjZUJvZHksXG4gIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBQcm9wVHlwZURhdGE+LFxuICBkZWNsYXJlZFR5cGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4sXG4pIHtcbiAgY29uc3QgbWVtYmVycyA9IG5vZGUudHlwZSA9PT0gJ1RTVHlwZUxpdGVyYWwnID8gbm9kZS5tZW1iZXJzIDogbm9kZS5ib2R5XG4gIGZvciAoY29uc3QgbSBvZiBtZW1iZXJzKSB7XG4gICAgaWYgKFxuICAgICAgKG0udHlwZSA9PT0gJ1RTUHJvcGVydHlTaWduYXR1cmUnIHx8IG0udHlwZSA9PT0gJ1RTTWV0aG9kU2lnbmF0dXJlJylcbiAgICAgICYmIG0ua2V5LnR5cGUgPT09ICdJZGVudGlmaWVyJ1xuICAgICkge1xuICAgICAgbGV0IHR5cGU6IHN0cmluZ1tdIHwgdW5kZWZpbmVkXG4gICAgICBpZiAobS50eXBlID09PSAnVFNNZXRob2RTaWduYXR1cmUnKSB7XG4gICAgICAgIHR5cGUgPSBbJ0Z1bmN0aW9uJ11cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG0udHlwZUFubm90YXRpb24pIHtcbiAgICAgICAgdHlwZSA9IGluZmVyUnVudGltZVR5cGUoXG4gICAgICAgICAgbS50eXBlQW5ub3RhdGlvbi50eXBlQW5ub3RhdGlvbixcbiAgICAgICAgICBkZWNsYXJlZFR5cGVzLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBwcm9wc1ttLmtleS5uYW1lXSA9IHtcbiAgICAgICAga2V5OiBtLmtleS5uYW1lLFxuICAgICAgICByZXF1aXJlZDogIW0ub3B0aW9uYWwsXG4gICAgICAgIHR5cGU6IHR5cGU/Lmxlbmd0aCA9PT0gMSA/IHR5cGVbMF0gOiB0eXBlIHx8ICdudWxsJyxcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5mZXJSdW50aW1lVHlwZShcbiAgbm9kZTogVFNUeXBlLFxuICBkZWNsYXJlZFR5cGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4sXG4pOiBzdHJpbmdbXSB7XG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSAnVFNTdHJpbmdLZXl3b3JkJzpcbiAgICAgIHJldHVybiBbJ1N0cmluZyddXG4gICAgY2FzZSAnVFNOdW1iZXJLZXl3b3JkJzpcbiAgICAgIHJldHVybiBbJ051bWJlciddXG4gICAgY2FzZSAnVFNCb29sZWFuS2V5d29yZCc6XG4gICAgICByZXR1cm4gWydCb29sZWFuJ11cbiAgICBjYXNlICdUU09iamVjdEtleXdvcmQnOlxuICAgICAgcmV0dXJuIFsnT2JqZWN0J11cbiAgICBjYXNlICdUU1R5cGVMaXRlcmFsJzpcbiAgICAgIC8vIFRPRE8gKG5pY2UgdG8gaGF2ZSkgZ2VuZXJhdGUgcnVudGltZSBwcm9wZXJ0eSB2YWxpZGF0aW9uXG4gICAgICByZXR1cm4gWydPYmplY3QnXVxuICAgIGNhc2UgJ1RTRnVuY3Rpb25UeXBlJzpcbiAgICAgIHJldHVybiBbJ0Z1bmN0aW9uJ11cbiAgICBjYXNlICdUU0FycmF5VHlwZSc6XG4gICAgY2FzZSAnVFNUdXBsZVR5cGUnOlxuICAgICAgLy8gVE9ETyAobmljZSB0byBoYXZlKSBnZW5lcmF0ZSBydW50aW1lIGVsZW1lbnQgdHlwZS9sZW5ndGggY2hlY2tzXG4gICAgICByZXR1cm4gWydBcnJheSddXG5cbiAgICBjYXNlICdUU0xpdGVyYWxUeXBlJzpcbiAgICAgIHN3aXRjaCAobm9kZS5saXRlcmFsLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnU3RyaW5nTGl0ZXJhbCc6XG4gICAgICAgICAgcmV0dXJuIFsnU3RyaW5nJ11cbiAgICAgICAgY2FzZSAnQm9vbGVhbkxpdGVyYWwnOlxuICAgICAgICAgIHJldHVybiBbJ0Jvb2xlYW4nXVxuICAgICAgICBjYXNlICdOdW1lcmljTGl0ZXJhbCc6XG4gICAgICAgIGNhc2UgJ0JpZ0ludExpdGVyYWwnOlxuICAgICAgICAgIHJldHVybiBbJ051bWJlciddXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIFsnbnVsbCddXG4gICAgICB9XG5cbiAgICBjYXNlICdUU1R5cGVSZWZlcmVuY2UnOlxuICAgICAgaWYgKG5vZGUudHlwZU5hbWUudHlwZSA9PT0gJ0lkZW50aWZpZXInKSB7XG4gICAgICAgIGlmIChkZWNsYXJlZFR5cGVzW25vZGUudHlwZU5hbWUubmFtZV0pXG4gICAgICAgICAgcmV0dXJuIGRlY2xhcmVkVHlwZXNbbm9kZS50eXBlTmFtZS5uYW1lXVxuXG4gICAgICAgIHN3aXRjaCAobm9kZS50eXBlTmFtZS5uYW1lKSB7XG4gICAgICAgICAgY2FzZSAnQXJyYXknOlxuICAgICAgICAgIGNhc2UgJ0Z1bmN0aW9uJzpcbiAgICAgICAgICBjYXNlICdPYmplY3QnOlxuICAgICAgICAgIGNhc2UgJ1NldCc6XG4gICAgICAgICAgY2FzZSAnTWFwJzpcbiAgICAgICAgICBjYXNlICdXZWFrU2V0JzpcbiAgICAgICAgICBjYXNlICdXZWFrTWFwJzpcbiAgICAgICAgICAgIHJldHVybiBbbm9kZS50eXBlTmFtZS5uYW1lXVxuICAgICAgICAgIGNhc2UgJ1JlY29yZCc6XG4gICAgICAgICAgY2FzZSAnUGFydGlhbCc6XG4gICAgICAgICAgY2FzZSAnUmVhZG9ubHknOlxuICAgICAgICAgIGNhc2UgJ1BpY2snOlxuICAgICAgICAgIGNhc2UgJ09taXQnOlxuICAgICAgICAgIGNhc2UgJ0V4Y2x1ZGUnOlxuICAgICAgICAgIGNhc2UgJ0V4dHJhY3QnOlxuICAgICAgICAgIGNhc2UgJ1JlcXVpcmVkJzpcbiAgICAgICAgICBjYXNlICdJbnN0YW5jZVR5cGUnOlxuICAgICAgICAgICAgcmV0dXJuIFsnT2JqZWN0J11cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIFsnbnVsbCddXG5cbiAgICBjYXNlICdUU1BhcmVudGhlc2l6ZWRUeXBlJzpcbiAgICAgIHJldHVybiBpbmZlclJ1bnRpbWVUeXBlKG5vZGUudHlwZUFubm90YXRpb24sIGRlY2xhcmVkVHlwZXMpXG4gICAgY2FzZSAnVFNVbmlvblR5cGUnOlxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLi4ubmV3IFNldChcbiAgICAgICAgICBbXS5jb25jYXQoXG4gICAgICAgICAgICAuLi4obm9kZS50eXBlcy5tYXAodCA9PiBpbmZlclJ1bnRpbWVUeXBlKHQsIGRlY2xhcmVkVHlwZXMpKSBhcyBhbnkpLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICBdXG4gICAgY2FzZSAnVFNJbnRlcnNlY3Rpb25UeXBlJzpcbiAgICAgIHJldHVybiBbJ09iamVjdCddXG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFsnbnVsbCddIC8vIG5vIHJ1bnRpbWUgY2hlY2tcbiAgfVxufVxuIiwiaW1wb3J0IHsgY2FwaXRhbGl6ZSB9IGZyb20gJ0B2dWUvc2hhcmVkJ1xuaW1wb3J0IHR5cGUgeyBOb2RlLCBPYmplY3RFeHByZXNzaW9uLCBTdGF0ZW1lbnQgfSBmcm9tICdAYmFiZWwvdHlwZXMnXG5pbXBvcnQgeyBub3ROdWxsaXNoLCBwYXJ0aXRpb24sIHVuaXEgfSBmcm9tICdAYW50ZnUvdXRpbHMnXG5pbXBvcnQgdHlwZSB7IFBhcnNlZFNGQywgU2NyaXB0U2V0dXBUcmFuc2Zvcm1PcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBhcHBseU1hY3JvcyB9IGZyb20gJy4vbWFjcm9zJ1xuaW1wb3J0IHsgZ2V0SWRlbnRpZmllckRlY2xhcmF0aW9ucyB9IGZyb20gJy4vaWRlbnRpZmllcnMnXG5pbXBvcnQgeyBnZW5lcmF0ZSwgdCB9IGZyb20gJy4vYmFiZWwnXG5pbXBvcnQgeyBwYXNjYWxpemUgfSBmcm9tICcuL3V0aWxzJ1xuXG5mdW5jdGlvbiBpc0FzeW5jSW1wb3J0KG5vZGU6IFN0YXRlbWVudCkge1xuICBpZiAodC5pc1ZhcmlhYmxlRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IG5vZGUuZGVjbGFyYXRpb25zWzBdXG5cbiAgICByZXR1cm4gKFxuICAgICAgZGVjbGFyYXRpb24gIT09IHVuZGVmaW5lZFxuICAgICAgJiYgdC5pc0NhbGxFeHByZXNzaW9uKGRlY2xhcmF0aW9uLmluaXQpXG4gICAgICAmJiB0LmlzSWRlbnRpZmllcihkZWNsYXJhdGlvbi5pbml0LmNhbGxlZSlcbiAgICAgICYmIGRlY2xhcmF0aW9uLmluaXQuY2FsbGVlLm5hbWUgPT09ICdkZWZpbmVBc3luY0NvbXBvbmVudCdcbiAgICApXG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybVNjcmlwdFNldHVwKFxuICBzZmM6IFBhcnNlZFNGQyxcbiAgb3B0aW9ucz86IFNjcmlwdFNldHVwVHJhbnNmb3JtT3B0aW9ucyxcbikge1xuICBjb25zdCB7IHNjcmlwdFNldHVwLCBzY3JpcHQsIHRlbXBsYXRlIH0gPSBzZmNcblxuICBjb25zdCB7IG5vZGVzOiBib2R5LCBwcm9wcywgZXhwb3NlIH0gPSBhcHBseU1hY3JvcyhzY3JpcHRTZXR1cC5hc3QuYm9keSlcblxuICBjb25zdCBbaG9pc3RlZCwgc2V0dXBCb2R5XSA9IHBhcnRpdGlvbihcbiAgICBib2R5LFxuICAgIG4gPT5cbiAgICAgIGlzQXN5bmNJbXBvcnQobilcbiAgICAgIHx8IHQuaXNJbXBvcnREZWNsYXJhdGlvbihuKVxuICAgICAgfHwgdC5pc0V4cG9ydE5hbWVkRGVjbGFyYXRpb24obilcbiAgICAgIHx8IG4udHlwZS5zdGFydHNXaXRoKCdUUycpLFxuICApXG5cbiAgLy8gZ2V0IGFsbCBpZGVudGlmaWVycyBpbiBgPHNjcmlwdCBzZXR1cD5gIGFuZCBgPHNjcmlwdD5gXG4gIGNvbnN0IGRlY2xhcmF0aW9uQXJyYXkgPSB1bmlxKFtcbiAgICAuLi5nZXRJZGVudGlmaWVyRGVjbGFyYXRpb25zKGhvaXN0ZWQpLFxuICAgIC4uLmdldElkZW50aWZpZXJEZWNsYXJhdGlvbnMoc2V0dXBCb2R5KSxcbiAgICAuLi5nZXRJZGVudGlmaWVyRGVjbGFyYXRpb25zKHNjcmlwdC5hc3QuYm9keSksXG4gIF0pLmZpbHRlcihub3ROdWxsaXNoKVxuXG4gIC8vIGZpbHRlciBvdXQgaWRlbnRpZmllcnMgdGhhdCBhcmUgdXNlZCBpbiBgPHRlbXBsYXRlPmBcbiAgY29uc3QgcmV0dXJuczogT2JqZWN0RXhwcmVzc2lvblsncHJvcGVydGllcyddID0gZGVjbGFyYXRpb25BcnJheVxuICAgIC5maWx0ZXIoaSA9PiB0ZW1wbGF0ZS5pZGVudGlmaWVycy5oYXMoaSkpXG4gICAgLm1hcCgoaSkgPT4ge1xuICAgICAgY29uc3QgaWQgPSB0LmlkZW50aWZpZXIoaSlcbiAgICAgIHJldHVybiB0Lm9iamVjdFByb3BlcnR5KGlkLCBpZCwgZmFsc2UsIHRydWUpXG4gICAgfSlcblxuICBjb25zdCBjb21wb25lbnRzID0gQXJyYXkuZnJvbSh0ZW1wbGF0ZS5jb21wb25lbnRzKVxuICAgIC5tYXAoXG4gICAgICBjb21wb25lbnQgPT5cbiAgICAgICAgZGVjbGFyYXRpb25BcnJheS5maW5kKGRlY2xhcmUgPT4gZGVjbGFyZSA9PT0gY29tcG9uZW50KVxuICAgICAgICA/PyBkZWNsYXJhdGlvbkFycmF5LmZpbmQoZGVjbGFyZSA9PiBwYXNjYWxpemUoZGVjbGFyZSkgPT09IGNvbXBvbmVudCksXG4gICAgKVxuICAgIC5maWx0ZXIobm90TnVsbGlzaClcblxuICBjb25zdCBkaXJlY3RpdmVEZWNsYXJhdGlvbiA9IEFycmF5LmZyb20odGVtcGxhdGUuZGlyZWN0aXZlcylcbiAgICAubWFwKChkaXJlY3RpdmUpID0+IHtcbiAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBkZWNsYXJhdGlvbkFycmF5LmZpbmQoXG4gICAgICAgIGRlY2xhcmF0aW9uID0+IGRlY2xhcmF0aW9uID09PSBgdiR7Y2FwaXRhbGl6ZShkaXJlY3RpdmUpfWAsXG4gICAgICApXG4gICAgICBpZiAoaWRlbnRpZmllciA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICAgIHJldHVybiB7IGlkZW50aWZpZXIsIGRpcmVjdGl2ZSB9XG4gICAgfSlcbiAgICAuZmlsdGVyKG5vdE51bGxpc2gpXG5cbiAgLy8gYXBwZW5kIGA8c2NyaXB0IHNldHVwPmAgaW1wb3J0cyB0byBgPHNjcmlwdD5gXG5cbiAgY29uc3QgX19zZmMgPSB0LmlkZW50aWZpZXIoJ19fc2ZjX21haW4nKVxuXG4gIGxldCBoYXNCb2R5ID0gZmFsc2VcblxuICBjb25zdCBib2R5Tm9kZXMgPSBzY3JpcHQuYXN0LmJvZHkubWFwKChub2RlOiBOb2RlKSA9PiB7XG4gICAgLy8gcmVwbGFjZSBgZXhwb3J0IGRlZmF1bHRgIHdpdGggYSB0ZW1wcm9yYXkgdmFyaWFibGVcbiAgICAvLyBgY29uc3QgX19zZmNfbWFpbiA9IHsgLi4uIH1gXG4gICAgaWYgKG5vZGUudHlwZSA9PT0gJ0V4cG9ydERlZmF1bHREZWNsYXJhdGlvbicpIHtcbiAgICAgIGhhc0JvZHkgPSB0cnVlXG4gICAgICByZXR1cm4gdC52YXJpYWJsZURlY2xhcmF0aW9uKCdjb25zdCcsIFtcbiAgICAgICAgdC52YXJpYWJsZURlY2xhcmF0b3IoX19zZmMsIG5vZGUuZGVjbGFyYXRpb24gYXMgYW55KSxcbiAgICAgIF0pXG4gICAgfVxuICAgIHJldHVybiBub2RlXG4gIH0pXG5cbiAgbGV0IGFzdCA9IHQucHJvZ3JhbShbXG4gICAgLi4uc2ZjLmV4dHJhRGVjbGFyYXRpb25zLFxuICAgIC4uLmhvaXN0ZWQsXG4gICAgLi4uYm9keU5vZGVzLFxuICBdIGFzIFN0YXRlbWVudFtdKVxuXG4gIC8vIGluamVjdCBgY29uc3QgX19zZmNfbWFpbiA9IHt9YCBpZiBgPHNjcmlwdD5gIGhhcyBkZWZhdWx0IGV4cG9ydFxuICBpZiAoIWhhc0JvZHkpIHtcbiAgICBhc3QuYm9keS5wdXNoKFxuICAgICAgdC52YXJpYWJsZURlY2xhcmF0aW9uKCdjb25zdCcsIFtcbiAgICAgICAgdC52YXJpYWJsZURlY2xhcmF0b3IoX19zZmMsIHQub2JqZWN0RXhwcmVzc2lvbihbXSkpLFxuICAgICAgXSksXG4gICAgKVxuICB9XG5cbiAgLy8gaW5qZWN0IHByb3BzIGZ1bmN0aW9uXG4gIC8vIGBfX3NmY19tYWluLnByb3BzID0geyAuLi4gfWBcbiAgaWYgKHByb3BzKSB7XG4gICAgaGFzQm9keSA9IHRydWVcbiAgICBhc3QuYm9keS5wdXNoKFxuICAgICAgdC5leHByZXNzaW9uU3RhdGVtZW50KFxuICAgICAgICB0LmFzc2lnbm1lbnRFeHByZXNzaW9uKFxuICAgICAgICAgICc9JyxcbiAgICAgICAgICB0Lm1lbWJlckV4cHJlc3Npb24oX19zZmMsIHQuaWRlbnRpZmllcigncHJvcHMnKSksXG4gICAgICAgICAgcHJvcHMgYXMgYW55LFxuICAgICAgICApLFxuICAgICAgKSBhcyBhbnksXG4gICAgKVxuICB9XG5cbiAgLy8gaW5qZWN0IHNldHVwIGZ1bmN0aW9uXG4gIC8vIGBfX3NmY19tYWluLnNldHVwID0gKCkgPT4ge31gXG4gIGlmIChib2R5Lmxlbmd0aCkge1xuICAgIGhhc0JvZHkgPSB0cnVlXG4gICAgY29uc3QgcmV0dXJuRXhwciA9IGV4cG9zZVxuICAgICAgPyB0LmNhbGxFeHByZXNzaW9uKFxuICAgICAgICB0Lm1lbWJlckV4cHJlc3Npb24odC5pZGVudGlmaWVyKCdPYmplY3QnKSwgdC5pZGVudGlmaWVyKCdhc3NpZ24nKSksXG4gICAgICAgIFt0Lm9iamVjdEV4cHJlc3Npb24ocmV0dXJucyksIGV4cG9zZV0sXG4gICAgICApXG4gICAgICA6IHQub2JqZWN0RXhwcmVzc2lvbihyZXR1cm5zKVxuICAgIGNvbnN0IHJldHVyblN0YXRlbWVudCA9IHQucmV0dXJuU3RhdGVtZW50KHJldHVybkV4cHIpXG5cbiAgICBhc3QuYm9keS5wdXNoKFxuICAgICAgdC5leHByZXNzaW9uU3RhdGVtZW50KFxuICAgICAgICB0LmFzc2lnbm1lbnRFeHByZXNzaW9uKFxuICAgICAgICAgICc9JyxcbiAgICAgICAgICB0Lm1lbWJlckV4cHJlc3Npb24oX19zZmMsIHQuaWRlbnRpZmllcignc2V0dXAnKSksXG4gICAgICAgICAgdC5hcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbihcbiAgICAgICAgICAgIFt0LmlkZW50aWZpZXIoJ19fcHJvcHMnKSwgdC5pZGVudGlmaWVyKCdfX2N0eCcpXSxcbiAgICAgICAgICAgIHQuYmxvY2tTdGF0ZW1lbnQoWy4uLnNldHVwQm9keSwgcmV0dXJuU3RhdGVtZW50IGFzIGFueV0pLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApIGFzIGFueSxcbiAgICApXG4gIH1cblxuICAvLyBpbmplY3QgY29tcG9uZW50c1xuICAvLyBgX19zZmNfbWFpbi5jb21wb25lbnRzID0gT2JqZWN0LmFzc2lnbih7IC4uLiB9LCBfX3NmY19tYWluLmNvbXBvbmVudHMpYFxuICBpZiAoY29tcG9uZW50cy5sZW5ndGgpIHtcbiAgICBoYXNCb2R5ID0gdHJ1ZVxuICAgIGNvbnN0IGNvbXBvbmVudHNPYmplY3QgPSB0Lm9iamVjdEV4cHJlc3Npb24oXG4gICAgICBjb21wb25lbnRzLm1hcCgoaSkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IHQuaWRlbnRpZmllcihpKVxuICAgICAgICByZXR1cm4gdC5vYmplY3RQcm9wZXJ0eShpZCwgaWQsIGZhbHNlLCB0cnVlKVxuICAgICAgfSksXG4gICAgKVxuXG4gICAgYXN0LmJvZHkucHVzaChcbiAgICAgIHQuZXhwcmVzc2lvblN0YXRlbWVudChcbiAgICAgICAgdC5hc3NpZ25tZW50RXhwcmVzc2lvbihcbiAgICAgICAgICAnPScsXG4gICAgICAgICAgdC5tZW1iZXJFeHByZXNzaW9uKF9fc2ZjLCB0LmlkZW50aWZpZXIoJ2NvbXBvbmVudHMnKSksXG4gICAgICAgICAgdC5jYWxsRXhwcmVzc2lvbihcbiAgICAgICAgICAgIHQubWVtYmVyRXhwcmVzc2lvbih0LmlkZW50aWZpZXIoJ09iamVjdCcpLCB0LmlkZW50aWZpZXIoJ2Fzc2lnbicpKSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgY29tcG9uZW50c09iamVjdCxcbiAgICAgICAgICAgICAgdC5tZW1iZXJFeHByZXNzaW9uKF9fc2ZjLCB0LmlkZW50aWZpZXIoJ2NvbXBvbmVudHMnKSksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApIGFzIGFueSxcbiAgICApXG4gIH1cblxuICAvLyBpbmplY3QgZGlyZWN0aXZlc1xuICAvLyBgX19zZmNfbWFpbi5kaXJlY3RpdmVzID0gT2JqZWN0LmFzc2lnbih7IC4uLiB9LCBfX3NmY19tYWluLmRpcmVjdGl2ZXMpYFxuICBpZiAoZGlyZWN0aXZlRGVjbGFyYXRpb24ubGVuZ3RoKSB7XG4gICAgaGFzQm9keSA9IHRydWVcbiAgICBjb25zdCBkaXJlY3RpdmVzT2JqZWN0ID0gdC5vYmplY3RFeHByZXNzaW9uKFxuICAgICAgZGlyZWN0aXZlRGVjbGFyYXRpb24ubWFwKCh7IGRpcmVjdGl2ZSwgaWRlbnRpZmllciB9KSA9PlxuICAgICAgICB0Lm9iamVjdFByb3BlcnR5KFxuICAgICAgICAgIHQuaWRlbnRpZmllcihkaXJlY3RpdmUpLFxuICAgICAgICAgIHQuaWRlbnRpZmllcihpZGVudGlmaWVyKSxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKVxuXG4gICAgYXN0LmJvZHkucHVzaChcbiAgICAgIHQuZXhwcmVzc2lvblN0YXRlbWVudChcbiAgICAgICAgdC5hc3NpZ25tZW50RXhwcmVzc2lvbihcbiAgICAgICAgICAnPScsXG4gICAgICAgICAgdC5tZW1iZXJFeHByZXNzaW9uKF9fc2ZjLCB0LmlkZW50aWZpZXIoJ2RpcmVjdGl2ZXMnKSksXG4gICAgICAgICAgdC5jYWxsRXhwcmVzc2lvbihcbiAgICAgICAgICAgIHQubWVtYmVyRXhwcmVzc2lvbih0LmlkZW50aWZpZXIoJ09iamVjdCcpLCB0LmlkZW50aWZpZXIoJ2Fzc2lnbicpKSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgZGlyZWN0aXZlc09iamVjdCxcbiAgICAgICAgICAgICAgdC5tZW1iZXJFeHByZXNzaW9uKF9fc2ZjLCB0LmlkZW50aWZpZXIoJ2RpcmVjdGl2ZXMnKSksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApIGFzIGFueSxcbiAgICApXG4gIH1cblxuICBpZiAoIWhhc0JvZHkgJiYgIW9wdGlvbnM/LmFzdFRyYW5zZm9ybXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXN0OiBudWxsLFxuICAgICAgY29kZTogJycsXG4gICAgfVxuICB9XG5cbiAgLy8gcmUtZXhwb3J0XG4gIC8vIGBleHBvcnQgZGVmYXVsdCBfX3NmY19tYWluYFxuICBhc3QuYm9keS5wdXNoKHQuZXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uKF9fc2ZjKSBhcyBhbnkpXG5cbiAgYXN0ID0gb3B0aW9ucz8uYXN0VHJhbnNmb3Jtcz8ucG9zdD8uKGFzdCwgc2ZjKSB8fCBhc3RcblxuICByZXR1cm4ge1xuICAgIGFzdCxcbiAgICBjb2RlOiBnZW5lcmF0ZShhc3QpLmNvZGUsXG4gIH1cbn1cbiIsImltcG9ydCB7IHNob3VsZFRyYW5zZm9ybSwgdHJhbnNmb3JtQVNUIH0gZnJvbSAnQHZ1ZS9yZWFjdGl2aXR5LXRyYW5zZm9ybSdcbmltcG9ydCBNYWdpY1N0cmluZyBmcm9tICdtYWdpYy1zdHJpbmcnXG5pbXBvcnQgdHlwZSB7IFBhcnNlZFNGQywgUmVzb2x2ZWRPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBwYXJzZSwgdCB9IGZyb20gJy4vYmFiZWwnXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1TZmNSZWZTdWdhcihzZmM6IFBhcnNlZFNGQywgb3B0aW9uczogUmVzb2x2ZWRPcHRpb25zKSB7XG4gIGNvbnN0IGltcG9ydGVkSGVscGVycyA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbiAgZm9yIChjb25zdCBzY3JpcHQgb2YgW3NmYy5zY3JpcHQsIHNmYy5zY3JpcHRTZXR1cF0pIHtcbiAgICBpZiAoc2hvdWxkVHJhbnNmb3JtKHNjcmlwdC5jb250ZW50KSkge1xuICAgICAgY29uc3QgcyA9IG5ldyBNYWdpY1N0cmluZyhzY3JpcHQuY29udGVudClcbiAgICAgIGNvbnN0IHsgaW1wb3J0ZWRIZWxwZXJzOiBpbXBvcnRzIH0gPSB0cmFuc2Zvcm1BU1Qoc2NyaXB0LmFzdCwgcylcbiAgICAgIEFycmF5LmZyb20oaW1wb3J0cykuZm9yRWFjaChoZWxwZXIgPT4gaW1wb3J0ZWRIZWxwZXJzLmFkZChoZWxwZXIpKVxuICAgICAgc2NyaXB0LmNvbnRlbnQgPSBzLnRvU3RyaW5nKClcbiAgICAgIHNjcmlwdC5hc3QgPSBwYXJzZShzY3JpcHQuY29udGVudCwgc2ZjLnBhcnNlck9wdGlvbnMpLnByb2dyYW1cbiAgICB9XG4gIH1cblxuICBpZiAoaW1wb3J0ZWRIZWxwZXJzLnNpemUpIHtcbiAgICBzZmMuZXh0cmFEZWNsYXJhdGlvbnMgPSBbXG4gICAgICB0LmltcG9ydERlY2xhcmF0aW9uKFxuICAgICAgICBBcnJheS5mcm9tKGltcG9ydGVkSGVscGVycykubWFwKGkgPT4gdC5pbXBvcnRTcGVjaWZpZXIodC5pZGVudGlmaWVyKGBfJHtpfWApLCB0LmlkZW50aWZpZXIoaSkpKSxcbiAgICAgICAgdC5zdHJpbmdMaXRlcmFsKG9wdGlvbnMuaW1wb3J0SGVscGVyc0Zyb20pLFxuICAgICAgKSxcbiAgICBdXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgUmVzb2x2ZWRPcHRpb25zLCBTY3JpcHRTZXR1cFRyYW5zZm9ybU9wdGlvbnMgfSBmcm9tICcuLi90eXBlcydcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVPcHRpb25zKG9wdGlvbnM6IFNjcmlwdFNldHVwVHJhbnNmb3JtT3B0aW9ucyA9IHt9KTogUmVzb2x2ZWRPcHRpb25zIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXG4gICAge30sXG4gICAge1xuICAgICAgc291cmNlTWFwOiB0cnVlLFxuICAgICAgcmVhY3Rpdml0eVRyYW5zZm9ybTogZmFsc2UsXG4gICAgICBpbXBvcnRIZWxwZXJzRnJvbTogJ0B2dWUvY29tcG9zaXRpb24tYXBpJyxcbiAgICAgIGFzdFRyYW5zZm9ybXM6IHt9LFxuICAgIH0sXG4gICAgb3B0aW9ucyxcbiAgKVxufVxuIiwiaW1wb3J0IE1hZ2ljU3RyaW5nIGZyb20gJ21hZ2ljLXN0cmluZydcbmltcG9ydCB7IHNob3VsZFRyYW5zZm9ybSBhcyBzaG91bGRUcmFuc2Zvcm1SZWZTdWdhciwgdHJhbnNmb3JtIGFzIHRyYW5zZm9ybVJlZiB9IGZyb20gJ0B2dWUvcmVhY3Rpdml0eS10cmFuc2Zvcm0nXG5pbXBvcnQgdHlwZSB7IFJlc29sdmVkT3B0aW9ucywgU2NyaXB0U2V0dXBUcmFuc2Zvcm1PcHRpb25zLCBUcmFuc2Zvcm1SZXN1bHQgfSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IHBhcnNlU0ZDIH0gZnJvbSAnLi9wYXJzZVNGQydcbmltcG9ydCB7IHRyYW5zZm9ybVNjcmlwdFNldHVwIH0gZnJvbSAnLi90cmFuc2Zvcm1TY3JpcHRTZXR1cCdcbmltcG9ydCB7IHRyYW5zZm9ybVNmY1JlZlN1Z2FyIH0gZnJvbSAnLi90cmFuc2Zvcm1TZmNSZWZTdWdhcidcbmltcG9ydCB7IHJlc29sdmVPcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zJ1xuXG5jb25zdCBzY3JpcHRTZXR1cFJFID0gLzxzY3JpcHRcXHMoLipcXHMpP3NldHVwKFxccy4qKT8+L1xuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkVHJhbnNmb3JtKGNvZGU6IHN0cmluZywgaWQ6IHN0cmluZywgb3B0aW9ucz86IFNjcmlwdFNldHVwVHJhbnNmb3JtT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAvLyBhdm9pZCB0cmFuc2Zvcm1pbmcgdHdpY2VcbiAgaWYgKGNvZGUuaW5jbHVkZXMoJ2V4cG9ydCBkZWZhdWx0IF9fc2ZjX21haW4nKSlcbiAgICByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIChvcHRpb25zPy5yZWFjdGl2aXR5VHJhbnNmb3JtICYmIHNob3VsZFRyYW5zZm9ybVJlZlN1Z2FyKGNvZGUpKSB8fCBzY3JpcHRTZXR1cFJFLnRlc3QoY29kZSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyYW5zZm9ybShpbnB1dDogc3RyaW5nLCBpZDogc3RyaW5nLCBvcHRpb25zPzogU2NyaXB0U2V0dXBUcmFuc2Zvcm1PcHRpb25zKTogUHJvbWlzZTxUcmFuc2Zvcm1SZXN1bHQ+IHtcbiAgaWYgKCFzaG91bGRUcmFuc2Zvcm0oaW5wdXQsIGlkLCBvcHRpb25zKSlcbiAgICByZXR1cm4gbnVsbFxuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVPcHRpb25zKG9wdGlvbnMpXG4gIGlmIChpZC5lbmRzV2l0aCgnLnZ1ZScpIHx8IGlkLmluY2x1ZGVzKCcudnVlP3Z1ZScpKVxuICAgIHJldHVybiBhd2FpdCB0cmFuc2Zvcm1WdWUoaW5wdXQsIGlkLCByZXNvbHZlZClcbiAgZWxzZVxuICAgIHJldHVybiB0cmFuc2Zvcm1Ob25WdWUoaW5wdXQsIGlkLCByZXNvbHZlZClcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtTm9uVnVlKGlucHV0OiBzdHJpbmcsIGlkOiBzdHJpbmcsIG9wdGlvbnM6IFJlc29sdmVkT3B0aW9ucyk6IFRyYW5zZm9ybVJlc3VsdCB7XG4gIGlmIChvcHRpb25zLnJlYWN0aXZpdHlUcmFuc2Zvcm0gJiYgc2hvdWxkVHJhbnNmb3JtUmVmU3VnYXIoaW5wdXQpKSB7XG4gICAgcmV0dXJuIHRyYW5zZm9ybVJlZihpbnB1dCwge1xuICAgICAgZmlsZW5hbWU6IGlkLFxuICAgICAgc291cmNlTWFwOiBvcHRpb25zLnNvdXJjZU1hcCxcbiAgICAgIGltcG9ydEhlbHBlcnNGcm9tOiBvcHRpb25zLmltcG9ydEhlbHBlcnNGcm9tLFxuICAgIH0pIGFzIGFueVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRyYW5zZm9ybVZ1ZShpbnB1dDogc3RyaW5nLCBpZDogc3RyaW5nLCBvcHRpb25zOiBSZXNvbHZlZE9wdGlvbnMpOiBQcm9taXNlPFRyYW5zZm9ybVJlc3VsdD4ge1xuICBjb25zdCBzID0gbmV3IE1hZ2ljU3RyaW5nKGlucHV0KVxuXG4gIGNvbnN0IHNmYyA9IGF3YWl0IHBhcnNlU0ZDKGlucHV0LCBpZClcblxuICBpZiAob3B0aW9ucy5yZWFjdGl2aXR5VHJhbnNmb3JtKVxuICAgIHRyYW5zZm9ybVNmY1JlZlN1Z2FyKHNmYywgb3B0aW9ucylcblxuICBjb25zdCB7IGNvZGUgfSA9IHRyYW5zZm9ybVNjcmlwdFNldHVwKHNmYywgb3B0aW9ucylcblxuICBjb25zdCBhdHRyaWJ1dGVzID0ge1xuICAgIC4uLnNmYy5zY3JpcHQuYXR0cnMsXG4gICAgLi4uc2ZjLnNjcmlwdFNldHVwLmF0dHJzLFxuICB9XG4gIGRlbGV0ZSBhdHRyaWJ1dGVzLnNldHVwXG4gIGNvbnN0IGF0dHIgPSBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzKVxuICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gdmFsdWUgPyBgJHtrZXl9PVwiJHt2YWx1ZX1cImAgOiBrZXkpXG4gICAgLmpvaW4oJyAnKVxuXG4gIGlmIChjb2RlKSB7XG4gICAgY29uc3QgYmxvY2sgPSBgPHNjcmlwdCAke2F0dHJ9PlxcbiR7Y29kZX1cXG48L3NjcmlwdD5gXG5cbiAgICBzLnJlbW92ZShzZmMuc2NyaXB0LnN0YXJ0LCBzZmMuc2NyaXB0LmVuZClcbiAgICBpZiAoc2ZjLnNjcmlwdFNldHVwLnN0YXJ0ICE9PSBzZmMuc2NyaXB0U2V0dXAuZW5kKSB7XG4gICAgICBzLm92ZXJ3cml0ZShcbiAgICAgICAgc2ZjLnNjcmlwdFNldHVwLnN0YXJ0LFxuICAgICAgICBzZmMuc2NyaXB0U2V0dXAuZW5kLFxuICAgICAgICBibG9jayxcbiAgICAgIClcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnByZXBlbmRMZWZ0KDAsIGAke2Jsb2NrfVxcbmApXG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgY29kZTogcy50b1N0cmluZygpLFxuICAgIG1hcDogb3B0aW9ucy5zb3VyY2VNYXBcbiAgICAgID8gcy5nZW5lcmF0ZU1hcCh7XG4gICAgICAgIHNvdXJjZTogaWQsXG4gICAgICAgIGluY2x1ZGVDb250ZW50OiB0cnVlLFxuICAgICAgfSkgYXMgYW55XG4gICAgICA6IG51bGwsXG4gIH1cbn1cbiIsImltcG9ydCB7IGNyZWF0ZVVucGx1Z2luIH0gZnJvbSAndW5wbHVnaW4nXG5pbXBvcnQgeyBjcmVhdGVGaWx0ZXIgfSBmcm9tICdAcm9sbHVwL3BsdWdpbnV0aWxzJ1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5PcHRpb25zIH0gZnJvbSAnLi90eXBlcydcbmltcG9ydCB7IHRyYW5zZm9ybSB9IGZyb20gJy4vY29yZSdcblxuZXhwb3J0ICogZnJvbSAnLi9jb3JlJ1xuXG5leHBvcnQgY29uc3QgdW5wbHVnaW4gPSBjcmVhdGVVbnBsdWdpbjxQbHVnaW5PcHRpb25zPigob3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IGZpbHRlciA9IGNyZWF0ZUZpbHRlcihcbiAgICBvcHRpb25zLmluY2x1ZGUgfHwgKG9wdGlvbnMucmVhY3Rpdml0eVRyYW5zZm9ybSA/IFsvXFwudnVlJC8sIC9cXC52dWVcXD92dWUvLCAvXFwuW2p0XXN4PyQvXSA6IFsvXFwudnVlJC8sIC9cXC52dWVcXD92dWUvXSksXG4gICAgb3B0aW9ucy5leGNsdWRlIHx8IFsvbm9kZV9tb2R1bGVzLywgL1xcLmdpdC8sIC9cXC5udXh0L10sXG4gIClcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICd1bnBsdWdpbi12dWUyLXNjcmlwdC1zZXR1cCcsXG4gICAgZW5mb3JjZTogJ3ByZScsXG4gICAgdHJhbnNmb3JtSW5jbHVkZShpZCkge1xuICAgICAgcmV0dXJuIGZpbHRlcihpZClcbiAgICB9LFxuICAgIGFzeW5jIHRyYW5zZm9ybShjb2RlLCBpZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRyYW5zZm9ybShjb2RlLCBpZCwgb3B0aW9ucylcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5lcnJvcihlKVxuICAgICAgfVxuICAgIH0sXG4gIH1cbn0pXG5cbmV4cG9ydCBkZWZhdWx0IHVucGx1Z2luXG4iLCJpbXBvcnQgZGVmdSBmcm9tICdkZWZ1J1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5PcHRpb25zIH0gZnJvbSAnLi90eXBlcydcbmltcG9ydCB1bnBsdWdpbiBmcm9tICcuJ1xuXG5mdW5jdGlvbiBzY3JpcHRTZXR1cE1vZHVsZSh0aGlzOiBhbnksIGlubGluZU9wdGlvbnM6IFBsdWdpbk9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBvcHRpb25zID0gZGVmdShpbmxpbmVPcHRpb25zLCB0aGlzLm51eHQub3B0aW9ucy5zY3JpcHRTZXR1cClcblxuICAvLyBpbnN0YWxsIHdlYnBhY2sgcGx1Z2luXG4gIHRoaXMuZXh0ZW5kQnVpbGQoKGNvbmZpZzogYW55KSA9PiB7XG4gICAgY29uZmlnLnBsdWdpbnMgPSBjb25maWcucGx1Z2lucyB8fCBbXVxuICAgIGNvbmZpZy5wbHVnaW5zLnVuc2hpZnQodW5wbHVnaW4ud2VicGFjayhvcHRpb25zKSlcbiAgfSlcblxuICAvLyBpbnN0YWxsIHZpdGUgcGx1Z2luXG4gIHRoaXMubnV4dC5ob29rKCd2aXRlOmV4dGVuZCcsIGFzeW5jICh2aXRlOiBhbnkpID0+IHtcbiAgICB2aXRlLmNvbmZpZy5wbHVnaW5zID0gdml0ZS5jb25maWcucGx1Z2lucyB8fCBbXVxuICAgIHZpdGUuY29uZmlnLnBsdWdpbnMucHVzaCh1bnBsdWdpbi52aXRlKG9wdGlvbnMpKVxuICB9KVxufVxuXG5leHBvcnQgZGVmYXVsdCBzY3JpcHRTZXR1cE1vZHVsZVxuIl0sIm5hbWVzIjpbImJhYmVsIiwiYmFiZWxfdHJhdmVyc2UiLCJjYXBpdGFsaXplIiwiY2FtZWxpemUiLCJOb2RlVHlwZXMiLCJFbGVtZW50VHlwZXMiLCJwYXJzZSIsIm5vZGUiLCJub3ROdWxsaXNoIiwiYmFzZVBhcnNlIiwicGFyc2VyT3B0aW9ucyIsInBhcnRpdGlvbiIsIl9hIiwiX2IiLCJfYyIsImNvbnRlbnQiLCJhc3QiLCJrZXkiLCJ2YWx1ZSIsInBhcnNlRXhwcmVzc2lvbiIsInQiLCJ1bmlxIiwic2hvdWxkVHJhbnNmb3JtIiwidHJhbnNmb3JtQVNUIiwic2hvdWxkVHJhbnNmb3JtUmVmU3VnYXIiLCJ0cmFuc2Zvcm1SZWYiLCJjcmVhdGVVbnBsdWdpbiIsImNyZWF0ZUZpbHRlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxDQUFBO0FBS2EsTUFBQSxDQUFBLEdBQUEsQ0FBNkJBLGdCQUFjLENBQUEsT0FBQSxJQUFXQSxnQkFBTyxFQUFBLEtBQUEsQ0FBQTtBQUM3RCxNQUFBLFFBQUEsR0FBdUIsRUFBVSxPQUFXLElBQUEsQ0FBQSxDQUFBO0FBQzVDLE1BQUEsUUFBQSxHQUFBLENBQWEsd0ZBQXdCLE9BQXhCLEtBQUEsSUFBQSxHQUFBLEtBQUEsQ0FBQSxHQUFBLEVBQUEsQ0FBaUMsWUFBakMsSUFBcUQsR0FBQSxFQUFBLEdBQUFDLHlCQUFBLElBQUEsSUFBQSxHQUFBLEtBQUEsQ0FBQSxHQUFBQSx5QkFBQSxDQUFnQixZQUFyRSxJQUFnRixHQUFB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
|