@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
417 lines (416 loc) • 77.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const ts_utils_1 = require("@neo-one/ts-utils");
const lodash_1 = tslib_1.__importDefault(require("lodash"));
const typescript_1 = tslib_1.__importDefault(require("typescript"));
const DiagnosticCode_1 = require("../../../DiagnosticCode");
const DiagnosticMessage_1 = require("../../../DiagnosticMessage");
const builtins_1 = require("../../builtins");
const constants_1 = require("../../constants");
const Helper_1 = require("../Helper");
class CallLikeHelper extends Helper_1.Helper {
constructor() {
super(...arguments);
this.kind = typescript_1.default.SyntaxKind.CallExpression;
}
emit(sb, expression, optionsIn) {
const expr = typescript_1.default.isCallExpression(expression)
? ts_utils_1.tsUtils.expression.getExpression(expression)
: ts_utils_1.tsUtils.template.getTag(expression);
const valueBuiltin = sb.context.builtins.getValue(expr);
if (valueBuiltin !== undefined && !ts_utils_1.tsUtils.guards.isSuperExpression(expr)) {
if (typescript_1.default.isCallExpression(expression) && builtins_1.isBuiltinCall(valueBuiltin)) {
valueBuiltin.emitCall(sb, expression, optionsIn);
return;
}
if (typescript_1.default.isTaggedTemplateExpression(expression) && builtins_1.isBuiltinTemplate(valueBuiltin)) {
valueBuiltin.emitCall(sb, expression, optionsIn);
return;
}
sb.context.reportError(expr, DiagnosticCode_1.DiagnosticCode.InvalidBuiltinCall, DiagnosticMessage_1.DiagnosticMessage.InvalidBuiltinCall);
}
const throwTypeError = (innerOptions) => {
sb.emitOp(expr, 'DROP');
sb.emitHelper(expr, innerOptions, sb.helpers.throwTypeError);
};
const handleArguments = (innerOptions) => {
if (typescript_1.default.isCallExpression(expression)) {
sb.emitHelper(expression, innerOptions, sb.helpers.args);
}
else {
const template = ts_utils_1.tsUtils.template.getTemplate(expression);
if (typescript_1.default.isNoSubstitutionTemplateLiteral(template)) {
sb.emitPushInt(template, 0);
sb.emitOp(template, 'NEWARRAY');
sb.emitOp(template, 'DUP');
sb.visit(template, innerOptions);
sb.emitOp(template, 'APPEND');
sb.emitHelper(template, innerOptions, sb.helpers.wrapArray);
sb.emitPushInt(template, 1);
sb.emitOp(template, 'PACK');
}
else {
const head = ts_utils_1.tsUtils.template.getTemplateHead(template);
lodash_1.default.reverse([...ts_utils_1.tsUtils.template.getTemplateSpans(template)]).forEach((span) => {
sb.visit(ts_utils_1.tsUtils.expression.getExpression(span), innerOptions);
});
sb.emitPushInt(template, 0);
sb.emitOp(template, 'NEWARRAY');
sb.emitOp(template, 'DUP');
sb.emitPushString(head, ts_utils_1.tsUtils.literal.getLiteralValue(head));
sb.emitHelper(head, innerOptions, sb.helpers.wrapString);
sb.emitOp(head, 'APPEND');
ts_utils_1.tsUtils.template.getTemplateSpans(template).forEach((span) => {
const spanLiteral = ts_utils_1.tsUtils.template.getLiteral(span);
sb.emitOp(spanLiteral, 'DUP');
sb.emitPushString(spanLiteral, ts_utils_1.tsUtils.literal.getLiteralValue(spanLiteral));
sb.emitHelper(head, innerOptions, sb.helpers.wrapString);
sb.emitOp(expr, 'APPEND');
});
sb.emitHelper(template, innerOptions, sb.helpers.wrapArray);
sb.emitPushInt(template, ts_utils_1.tsUtils.template.getTemplateSpans(template).length + 1);
sb.emitOp(template, 'PACK');
}
}
};
const handlePropertyVisit = (lhs, innerOptions) => {
if (ts_utils_1.tsUtils.guards.isSuperExpression(lhs)) {
sb.scope.getThis(sb, lhs, innerOptions);
sb.visit(lhs, innerOptions);
}
else {
sb.visit(lhs, innerOptions);
sb.emitOp(lhs, 'DUP');
}
};
const isValidBuiltinCall = (builtinProp) => {
if (typescript_1.default.isCallExpression(expression)) {
return builtins_1.isBuiltinMemberCall(builtinProp) || builtins_1.isBuiltinInstanceMemberCall(builtinProp);
}
if (typescript_1.default.isTaggedTemplateExpression(expression)) {
return builtins_1.isBuiltinMemberTemplate(builtinProp) || builtins_1.isBuiltinInstanceMemberTemplate(builtinProp);
}
return false;
};
const handleBuiltinMemberCall = (builtinProp, memberLike, visited) => {
if (typescript_1.default.isCallExpression(expression)) {
if (builtins_1.isBuiltinMemberCall(builtinProp)) {
builtinProp.emitCall(sb, memberLike, expression, optionsIn);
return;
}
if (builtins_1.isBuiltinInstanceMemberCall(builtinProp)) {
builtinProp.emitCall(sb, memberLike, expression, optionsIn, visited);
return;
}
}
else if (typescript_1.default.isTaggedTemplateExpression(expression)) {
if (builtins_1.isBuiltinMemberTemplate(builtinProp)) {
builtinProp.emitCall(sb, memberLike, expression, optionsIn);
return;
}
if (builtins_1.isBuiltinInstanceMemberTemplate(builtinProp)) {
builtinProp.emitCall(sb, memberLike, expression, optionsIn, visited);
return;
}
}
};
const superExpression = typescript_1.default.isCallExpression(expression) ? ts_utils_1.tsUtils.expression.getExpression(expression) : undefined;
if (typescript_1.default.isCallExpression(expression) &&
superExpression !== undefined &&
ts_utils_1.tsUtils.guards.isSuperExpression(superExpression)) {
if (optionsIn.handleSuperConstruct !== undefined) {
optionsIn.handleSuperConstruct(expression, superExpression, optionsIn);
return;
}
const superClass = optionsIn.superClass;
if (superClass === undefined) {
throw new Error('Something went wrong, expected super class to be defined.');
}
const options = sb.pushValueOptions(sb.noSetValueOptions(optionsIn));
handleArguments(options);
sb.scope.getThis(sb, expression, options);
sb.scope.get(sb, expression, options, superClass);
sb.emitHelper(expression, sb.noPushValueOptions(options), sb.helpers.invokeConstruct());
}
else if (typescript_1.default.isPropertyAccessExpression(expr)) {
const value = ts_utils_1.tsUtils.expression.getExpression(expr);
const valueType = sb.context.analysis.getType(value);
const name = ts_utils_1.tsUtils.node.getNameNode(expr);
const nameValue = ts_utils_1.tsUtils.node.getName(expr);
const builtinProp = sb.context.builtins.getMember(value, name);
if (builtinProp !== undefined && isValidBuiltinCall(builtinProp)) {
handleBuiltinMemberCall(builtinProp, expr, false);
return;
}
const createProcessBuiltin = (valueName) => {
const member = sb.context.builtins.getOnlyMember(valueName, nameValue);
if (member === undefined) {
return throwTypeError;
}
return () => {
sb.emitOp(expression, 'DROP');
handleBuiltinMemberCall(member, expr, true);
};
};
const processObject = (innerOptions) => {
handleArguments(innerOptions);
sb.emitOp(expr, 'ROT');
sb.emitOp(expr, 'ROT');
sb.emitPushString(name, nameValue);
sb.emitHelper(expr, innerOptions, sb.helpers.getPropertyObjectProperty);
sb.emitHelper(expr, optionsIn, sb.helpers.invokeCall({ bindThis: true }));
};
const options = sb.pushValueOptions(sb.noSetValueOptions(optionsIn));
handlePropertyVisit(value, options);
sb.emitHelper(value, options, sb.helpers.forBuiltinType({
type: valueType,
array: createProcessBuiltin('Array'),
arrayStorage: createProcessBuiltin('ArrayStorage'),
boolean: createProcessBuiltin('Boolean'),
buffer: createProcessBuiltin('Buffer'),
null: throwTypeError,
number: createProcessBuiltin('Number'),
object: processObject,
string: createProcessBuiltin('String'),
symbol: createProcessBuiltin('Symbol'),
undefined: throwTypeError,
map: createProcessBuiltin('Map'),
mapStorage: createProcessBuiltin('MapStorage'),
set: createProcessBuiltin('Set'),
setStorage: createProcessBuiltin('SetStorage'),
error: createProcessBuiltin('Error'),
forwardValue: createProcessBuiltin('ForwardValue'),
iteratorResult: createProcessBuiltin('IteratorResult'),
iterable: createProcessBuiltin('Iterable'),
iterableIterator: createProcessBuiltin('IterableIterator'),
transaction: createProcessBuiltin('TransactionBase'),
output: createProcessBuiltin('Output'),
attribute: createProcessBuiltin('AttributeBase'),
input: createProcessBuiltin('Input'),
account: createProcessBuiltin('Account'),
asset: createProcessBuiltin('Asset'),
contract: createProcessBuiltin('Contract'),
header: createProcessBuiltin('Header'),
block: createProcessBuiltin('Block'),
}));
}
else if (typescript_1.default.isElementAccessExpression(expr)) {
const value = ts_utils_1.tsUtils.expression.getExpression(expr);
const valueType = sb.context.analysis.getType(value);
const prop = ts_utils_1.tsUtils.expression.getArgumentExpressionOrThrow(expr);
const propType = sb.context.analysis.getType(prop);
const builtinProp = sb.context.builtins.getMember(value, prop);
if (builtinProp !== undefined && isValidBuiltinCall(builtinProp)) {
handleBuiltinMemberCall(builtinProp, expr, false);
return;
}
const getCallCases = (instanceName, useSymbol = false) => sb.context.builtins
.getMembers(instanceName, (call) => builtins_1.isBuiltinInstanceMemberCall(call) || builtins_1.isBuiltinInstanceMemberTemplate(call), (call) => (typescript_1.default.isCallExpression(expression) &&
builtins_1.isBuiltinInstanceMemberCall(call) &&
call.canCall(sb, expr, expression, optionsIn)) ||
(typescript_1.default.isTaggedTemplateExpression(expression) &&
builtins_1.isBuiltinInstanceMemberTemplate(call) &&
call.canCall(sb, expr, expression, optionsIn)), useSymbol)
.map(([propName, builtin]) => ({
condition: () => {
sb.emitOp(prop, 'DUP');
sb.emitPushString(prop, propName);
sb.emitOp(prop, 'EQUAL');
},
whenTrue: () => {
sb.emitOp(expr, 'DROP');
sb.emitOp(expr, 'DROP');
handleBuiltinMemberCall(builtin, expr, true);
},
}));
const throwInnerTypeError = (innerOptions) => {
sb.emitOp(expr, 'DROP');
sb.emitOp(expr, 'DROP');
throwTypeError(innerOptions);
};
const createHandleProp = (handleString, handleNumber, handleSymbol) => (innerOptions) => {
sb.visit(prop, innerOptions);
sb.emitHelper(prop, innerOptions, sb.helpers.forBuiltinType({
type: propType,
array: throwInnerTypeError,
arrayStorage: throwInnerTypeError,
boolean: throwInnerTypeError,
buffer: throwInnerTypeError,
null: throwInnerTypeError,
number: handleNumber,
object: throwInnerTypeError,
string: handleString,
symbol: handleSymbol,
undefined: throwInnerTypeError,
map: throwInnerTypeError,
mapStorage: throwInnerTypeError,
set: throwInnerTypeError,
setStorage: throwInnerTypeError,
error: throwInnerTypeError,
forwardValue: throwInnerTypeError,
iteratorResult: throwInnerTypeError,
iterable: throwInnerTypeError,
iterableIterator: throwInnerTypeError,
transaction: throwInnerTypeError,
output: throwInnerTypeError,
attribute: throwInnerTypeError,
input: throwInnerTypeError,
account: throwInnerTypeError,
asset: throwInnerTypeError,
contract: throwInnerTypeError,
header: throwInnerTypeError,
block: throwInnerTypeError,
}));
};
const createProcessBuiltin = (instanceName) => {
const handleStringBase = (innerInnerOptions) => {
sb.emitHelper(expr, innerInnerOptions, sb.helpers.case(getCallCases(instanceName, false), () => {
throwInnerTypeError(innerInnerOptions);
}));
};
const handleString = (innerInnerOptions) => {
sb.emitHelper(prop, innerInnerOptions, sb.helpers.unwrapString);
handleStringBase(innerInnerOptions);
};
const handleNumber = (innerInnerOptions) => {
sb.emitHelper(prop, innerInnerOptions, sb.helpers.toString({ type: propType, knownType: constants_1.Types.Number }));
handleStringBase(innerInnerOptions);
};
const handleSymbol = (innerInnerOptions) => {
sb.emitHelper(prop, innerInnerOptions, sb.helpers.unwrapSymbol);
sb.emitHelper(expr, innerInnerOptions, sb.helpers.case(getCallCases(instanceName, true), () => {
throwInnerTypeError(innerInnerOptions);
}));
};
return createHandleProp(handleString, handleNumber, handleSymbol);
};
const createProcessArray = () => {
const handleNumberBase = (innerInnerOptions) => {
sb.emitOp(expr, 'NIP');
handleArguments(innerInnerOptions);
sb.emitOp(expr, 'ROT');
sb.emitOp(expr, 'ROT');
sb.emitOp(expr, 'OVER');
sb.emitOp(expr, 'SWAP');
sb.emitHelper(expr, innerInnerOptions, sb.helpers.getArrayIndex);
sb.emitHelper(expr, optionsIn, sb.helpers.invokeCall({ bindThis: true }));
};
const handleString = (innerInnerOptions) => {
sb.emitHelper(prop, innerInnerOptions, sb.helpers.unwrapString);
sb.emitHelper(expr, innerInnerOptions, sb.helpers.case(getCallCases('Array', false), () => {
sb.emitHelper(prop, innerInnerOptions, sb.helpers.wrapString);
sb.emitHelper(prop, innerInnerOptions, sb.helpers.toNumber({ type: propType, knownType: constants_1.Types.String }));
handleNumberBase(innerInnerOptions);
}));
};
const handleNumber = (innerInnerOptions) => {
sb.emitHelper(prop, innerInnerOptions, sb.helpers.unwrapNumber);
handleNumberBase(innerInnerOptions);
};
const handleSymbol = (innerInnerOptions) => {
sb.emitHelper(prop, innerInnerOptions, sb.helpers.unwrapSymbol);
sb.emitHelper(expr, innerInnerOptions, sb.helpers.case(getCallCases('Array', true), () => {
throwInnerTypeError(innerInnerOptions);
}));
};
return createHandleProp(handleString, handleNumber, handleSymbol);
};
const processObject = (innerOptions) => {
const handleStringBase = (innerInnerOptions) => {
sb.emitHelper(expr, innerInnerOptions, sb.helpers.getPropertyObjectProperty);
sb.emitHelper(expr, optionsIn, sb.helpers.invokeCall({ bindThis: true }));
};
const handleNumber = (innerInnerOptions) => {
sb.emitHelper(prop, innerInnerOptions, sb.helpers.toString({ type: propType, knownType: constants_1.Types.Number }));
handleStringBase(innerInnerOptions);
};
const handleString = (innerInnerOptions) => {
sb.emitHelper(prop, innerInnerOptions, sb.helpers.unwrapString);
handleStringBase(innerInnerOptions);
};
const handleSymbol = (innerInnerOptions) => {
sb.emitHelper(prop, innerInnerOptions, sb.helpers.unwrapSymbol);
sb.emitHelper(expr, innerInnerOptions, sb.helpers.getSymbolObjectProperty);
sb.emitHelper(expr, optionsIn, sb.helpers.invokeCall({ bindThis: true }));
};
handleArguments(innerOptions);
sb.emitOp(expression, 'ROT');
sb.emitOp(expression, 'ROT');
sb.visit(prop, innerOptions);
sb.emitHelper(prop, innerOptions, sb.helpers.forBuiltinType({
type: propType,
array: throwInnerTypeError,
arrayStorage: throwInnerTypeError,
boolean: throwInnerTypeError,
buffer: throwInnerTypeError,
null: throwInnerTypeError,
number: handleNumber,
object: throwInnerTypeError,
string: handleString,
symbol: handleSymbol,
undefined: throwInnerTypeError,
map: throwInnerTypeError,
mapStorage: throwInnerTypeError,
set: throwInnerTypeError,
setStorage: throwInnerTypeError,
error: throwInnerTypeError,
forwardValue: throwInnerTypeError,
iteratorResult: throwInnerTypeError,
iterable: throwInnerTypeError,
iterableIterator: throwInnerTypeError,
transaction: throwInnerTypeError,
output: throwInnerTypeError,
attribute: throwInnerTypeError,
input: throwInnerTypeError,
account: throwInnerTypeError,
asset: throwInnerTypeError,
contract: throwInnerTypeError,
header: throwInnerTypeError,
block: throwInnerTypeError,
}));
};
const options = sb.pushValueOptions(sb.noSetValueOptions(optionsIn));
handlePropertyVisit(value, options);
sb.emitHelper(value, options, sb.helpers.forBuiltinType({
type: valueType,
array: createProcessArray(),
arrayStorage: createProcessBuiltin('ArrayStorage'),
boolean: createProcessBuiltin('Boolean'),
buffer: createProcessBuiltin('Buffer'),
null: throwTypeError,
number: createProcessBuiltin('Number'),
object: processObject,
string: createProcessBuiltin('String'),
symbol: createProcessBuiltin('Symbol'),
undefined: throwTypeError,
map: createProcessBuiltin('Map'),
mapStorage: createProcessBuiltin('MapStorage'),
set: createProcessBuiltin('Set'),
setStorage: createProcessBuiltin('SetStorage'),
error: createProcessBuiltin('Error'),
forwardValue: createProcessBuiltin('ForwardValue'),
iteratorResult: createProcessBuiltin('IteratorResult'),
iterable: createProcessBuiltin('Iterable'),
iterableIterator: createProcessBuiltin('IterableIterator'),
transaction: createProcessBuiltin('TransactionBase'),
output: createProcessBuiltin('Output'),
attribute: createProcessBuiltin('AttributeBase'),
input: createProcessBuiltin('Input'),
account: createProcessBuiltin('Account'),
asset: createProcessBuiltin('Asset'),
contract: createProcessBuiltin('Contract'),
header: createProcessBuiltin('Header'),
block: createProcessBuiltin('Block'),
}));
}
else {
const options = sb.pushValueOptions(sb.noSetValueOptions(optionsIn));
handleArguments(options);
sb.visit(expr, options);
sb.emitHelper(expr, optionsIn, sb.helpers.invokeCall({ bindThis: false }));
}
}
}
exports.CallLikeHelper = CallLikeHelper;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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LENBQUMsT0FBTyxDQUFDO2dCQUNwQyxRQUFRLEVBQUUsb0JBQW9CLENBQUMsVUFBVSxDQUFDO2dCQUMxQyxNQUFNLEVBQUUsb0JBQW9CLENBQUMsUUFBUSxDQUFDO2dCQUN0QyxLQUFLLEVBQUUsb0JBQW9CLENBQUMsT0FBTyxDQUFDO2FBQ3JDLENBQUMsQ0FDSCxDQUFDO1NBQ0g7YUFBTTtZQUNMLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUVyRSxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFekIsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDeEIsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztTQUM1RTtJQUNILENBQUM7Q0FDRjtBQXpqQkQsd0NBeWpCQyIsImZpbGUiOiJuZW8tb25lLXNtYXJ0LWNvbnRyYWN0LWNvbXBpbGVyL3NyYy9jb21waWxlL2hlbHBlci9mdW5jdGlvbi9DYWxsTGlrZUhlbHBlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHRzVXRpbHMgfSBmcm9tICdAbmVvLW9uZS90cy11dGlscyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuaW1wb3J0IHsgRGlhZ25vc3RpY0NvZGUgfSBmcm9tICcuLi8uLi8uLi9EaWFnbm9zdGljQ29kZSc7XG5pbXBvcnQgeyBEaWFnbm9zdGljTWVzc2FnZSB9IGZyb20gJy4uLy4uLy4uL0RpYWdub3N0aWNNZXNzYWdlJztcbmltcG9ydCB7XG4gIEJ1aWx0aW4sXG4gIEJ1aWx0aW5JbnN0YW5jZU1lbWJlclRlbXBsYXRlLFxuICBDYWxsTWVtYmVyTGlrZUV4cHJlc3Npb24sXG4gIGlzQnVpbHRpbkNhbGwsXG4gIGlzQnVpbHRpbkluc3RhbmNlTWVtYmVyQ2FsbCxcbiAgaXNCdWlsdGluSW5zdGFuY2VNZW1iZXJUZW1wbGF0ZSxcbiAgaXNCdWlsdGluTWVtYmVyQ2FsbCxcbiAgaXNCdWlsdGluTWVtYmVyVGVtcGxhdGUsXG4gIGlzQnVpbHRpblRlbXBsYXRlLFxufSBmcm9tICcuLi8uLi9idWlsdGlucyc7XG5pbXBvcnQgeyBCdWlsdGluSW5zdGFuY2VNZW1iZXJDYWxsIH0gZnJvbSAnLi4vLi4vYnVpbHRpbnMvQnVpbHRpbkluc3RhbmNlTWVtYmVyQ2FsbCc7XG5pbXBvcnQgeyBUeXBlcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBTY3JpcHRCdWlsZGVyIH0gZnJvbSAnLi4vLi4vc2InO1xuaW1wb3J0IHsgVmlzaXRPcHRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgSGVscGVyIH0gZnJvbSAnLi4vSGVscGVyJztcblxuZXhwb3J0IGNsYXNzIENhbGxMaWtlSGVscGVyIGV4dGVuZHMgSGVscGVyPHRzLkNhbGxFeHByZXNzaW9uIHwgdHMuVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uPiB7XG4gIHB1YmxpYyByZWFkb25seSBraW5kID0gdHMuU3ludGF4S2luZC5DYWxsRXhwcmVzc2lvbjtcblxuICBwdWJsaWMgZW1pdChcbiAgICBzYjogU2NyaXB0QnVpbGRlcixcbiAgICBleHByZXNzaW9uOiB0cy5DYWxsRXhwcmVzc2lvbiB8IHRzLlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbixcbiAgICBvcHRpb25zSW46IFZpc2l0T3B0aW9ucyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZXhwciA9IHRzLmlzQ2FsbEV4cHJlc3Npb24oZXhwcmVzc2lvbilcbiAgICAgID8gdHNVdGlscy5leHByZXNzaW9uLmdldEV4cHJlc3Npb24oZXhwcmVzc2lvbilcbiAgICAgIDogdHNVdGlscy50ZW1wbGF0ZS5nZXRUYWcoZXhwcmVzc2lvbik7XG5cbiAgICBjb25zdCB2YWx1ZUJ1aWx0aW4gPSBzYi5jb250ZXh0LmJ1aWx0aW5zLmdldFZhbHVlKGV4cHIpO1xuICAgIGlmICh2YWx1ZUJ1aWx0aW4gIT09IHVuZGVmaW5lZCAmJiAhdHNVdGlscy5ndWFyZHMuaXNTdXBlckV4cHJlc3Npb24oZXhwcikpIHtcbiAgICAgIC8vIE90aGVyd2lzZSwgYWxyZWFkeSByZXBvcnRlZCBhcyBhbiBlcnJvciBieSB0eXBlc2NyaXB0IGNoZWNrZXJcbiAgICAgIGlmICh0cy5pc0NhbGxFeHByZXNzaW9uKGV4cHJlc3Npb24pICYmIGlzQnVpbHRpbkNhbGwodmFsdWVCdWlsdGluKSkge1xuICAgICAgICB2YWx1ZUJ1aWx0aW4uZW1pdENhbGwoc2IsIGV4cHJlc3Npb24sIG9wdGlvbnNJbik7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodHMuaXNUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24oZXhwcmVzc2lvbikgJiYgaXNCdWlsdGluVGVtcGxhdGUodmFsdWVCdWlsdGluKSkge1xuICAgICAgICB2YWx1ZUJ1aWx0aW4uZW1pdENhbGwoc2IsIGV4cHJlc3Npb24sIG9wdGlvbnNJbik7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzYi5jb250ZXh0LnJlcG9ydEVycm9yKGV4cHIsIERpYWdub3N0aWNDb2RlLkludmFsaWRCdWlsdGluQ2FsbCwgRGlhZ25vc3RpY01lc3NhZ2UuSW52YWxpZEJ1aWx0aW5DYWxsKTtcbiAgICB9XG5cbiAgICBjb25zdCB0aHJvd1R5cGVFcnJvciA9IChpbm5lck9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4ge1xuICAgICAgLy8gW11cbiAgICAgIHNiLmVtaXRPcChleHByLCAnRFJPUCcpO1xuICAgICAgc2IuZW1pdEhlbHBlcihleHByLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMudGhyb3dUeXBlRXJyb3IpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVBcmd1bWVudHMgPSAoaW5uZXJPcHRpb25zOiBWaXNpdE9wdGlvbnMpID0+IHtcbiAgICAgIGlmICh0cy5pc0NhbGxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgICAgIC8vIFthcmdzYXJyXVxuICAgICAgICBzYi5lbWl0SGVscGVyKGV4cHJlc3Npb24sIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy5hcmdzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0gdHNVdGlscy50ZW1wbGF0ZS5nZXRUZW1wbGF0ZShleHByZXNzaW9uKTtcbiAgICAgICAgaWYgKHRzLmlzTm9TdWJzdGl0dXRpb25UZW1wbGF0ZUxpdGVyYWwodGVtcGxhdGUpKSB7XG4gICAgICAgICAgLy8gWzBdXG4gICAgICAgICAgc2IuZW1pdFB1c2hJbnQodGVtcGxhdGUsIDApO1xuICAgICAgICAgIC8vIFtsaXRlcmFsc0Fycl1cbiAgICAgICAgICBzYi5lbWl0T3AodGVtcGxhdGUsICdORVdBUlJBWScpO1xuICAgICAgICAgIC8vIFtsaXRlcmFsc0FyciwgbGl0ZXJhbHNBcnJdXG4gICAgICAgICAgc2IuZW1pdE9wKHRlbXBsYXRlLCAnRFVQJyk7XG4gICAgICAgICAgLy8gW3N0cmluZ1ZhbF1cbiAgICAgICAgICBzYi52aXNpdCh0ZW1wbGF0ZSwgaW5uZXJPcHRpb25zKTtcbiAgICAgICAgICAvLyBbbGl0ZXJhbHNBcnJdXG4gICAgICAgICAgc2IuZW1pdE9wKHRlbXBsYXRlLCAnQVBQRU5EJyk7XG4gICAgICAgI