UNPKG

@neo-one/smart-contract-compiler

Version:

NEO•ONE TypeScript smart contract compiler.

139 lines (137 loc) 25.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const ts_utils_1 = require("@neo-one/ts-utils"); const utils_1 = require("@neo-one/utils"); const constants_1 = require("../../../constants"); const utils_2 = require("../../../utils"); const constants_2 = require("../../constants"); const BuiltinMemberCall_1 = require("../BuiltinMemberCall"); class SmartContractForBase extends BuiltinMemberCall_1.BuiltinMemberCall { emitCall(sb, func, node, optionsIn) { const options = sb.pushValueOptions(optionsIn); const returnType = sb.context.analysis.getType(node); if (returnType === undefined) { return; } const properties = ts_utils_1.tsUtils.type_.getProperties(returnType); const props = properties.map((prop) => { const propType = sb.context.analysis.getTypeOfSymbol(prop, node); if (propType === undefined) { return undefined; } const propName = ts_utils_1.tsUtils.symbol.getName(prop); if (constants_1.IGNORED_PROPERTIES.has(propName)) { return undefined; } if (constants_1.BUILTIN_PROPERTIES.has(propName)) { return undefined; } const propNode = ts_utils_1.tsUtils.symbol.getValueDeclarationOrThrow(prop); if (ts_utils_1.tsUtils.modifier.isStatic(propNode) || ts_utils_1.tsUtils.modifier.isProtected(propNode) || ts_utils_1.tsUtils.modifier.isPrivate(propNode)) { return undefined; } const result = sb.context.analysis.extractSignatureForType(propNode, propType, { error: true }); if (result === undefined) { return { paramDecls: [], paramTypes: new Map(), returnType: propType, prop: propNode, propName, accessor: true, isReadonly: ts_utils_1.tsUtils.modifier.isReadonly(propNode), }; } return Object.assign({}, result, { prop: propNode, propName, accessor: false, isReadonly: false }); }); const handleParams = (prop, paramDecls, paramTypes, innerOptions) => { sb.emitHelper(prop, innerOptions, sb.helpers.parameters({ params: paramDecls, asArgsArr: true, map: (param, innerInnerOptions, isRestElement) => { let type = paramTypes.get(param); if (type !== undefined && isRestElement) { type = ts_utils_1.tsUtils.type_.getArrayType(type); } sb.emitHelper(param, innerInnerOptions, sb.helpers.unwrapValRecursive({ type })); }, })); }; const addressName = sb.scope.addUnique(); this.emitInitial(sb, func, node, addressName, options); sb.emitHelper(node, options, sb.helpers.createObject); props .filter(utils_1.utils.notNull) .forEach(({ prop, propName, paramDecls, paramTypes, returnType: propReturnType, accessor, isReadonly }) => { sb.emitOp(prop, 'DUP'); sb.emitPushString(prop, propName); if (accessor && !isReadonly) { sb.emitHelper(prop, options, sb.helpers.createFunctionArray({ body: (innerOptionsIn) => { const innerOptions = sb.pushValueOptions(innerOptionsIn); sb.emitPushInt(prop, 0); sb.emitOp(prop, 'PICKITEM'); sb.emitHelper(prop, innerOptions, sb.helpers.unwrapValRecursive({ type: propReturnType })); sb.emitPushInt(prop, 1); sb.emitOp(prop, 'PACK'); sb.emitPushString(prop, utils_2.getSetterName(propName)); const callBuffer = Buffer.from([0, 2]); this.emitInvoke(sb, func, node, prop, addressName, callBuffer, sb.noPushValueOptions(innerOptions)); sb.emitHelper(prop, innerOptions, sb.helpers.wrapUndefined); sb.emitHelper(prop, innerOptions, sb.helpers.return); }, })); sb.emitHelper(prop, options, sb.helpers.createFunctionObject({ property: constants_2.InternalObjectProperty.Call, })); } sb.emitHelper(prop, options, sb.helpers.createFunctionArray({ body: (innerOptionsIn) => { const innerOptions = sb.pushValueOptions(innerOptionsIn); if (accessor) { sb.emitOp(prop, 'DROP'); sb.emitPushInt(prop, 0); sb.emitOp(prop, 'NEWARRAY'); } else { handleParams(prop, paramDecls, paramTypes, innerOptions); } sb.emitPushString(prop, propName); const isVoidReturn = propReturnType !== undefined && ts_utils_1.tsUtils.type_.isVoid(propReturnType); const callBuffer = Buffer.from([isVoidReturn ? 0 : 1, 2]); this.emitInvoke(sb, func, node, prop, addressName, callBuffer, innerOptions); if (isVoidReturn) { sb.emitHelper(prop, innerOptions, sb.helpers.wrapUndefined); } else { sb.emitHelper(prop, innerOptions, sb.helpers.wrapValRecursive({ type: propReturnType, })); } sb.emitHelper(prop, innerOptions, sb.helpers.return); }, })); sb.emitHelper(prop, options, sb.helpers.createFunctionObject({ property: constants_2.InternalObjectProperty.Call, })); if (accessor) { sb.emitHelper(prop, options, sb.helpers.setAccessorPropertyObjectProperty({ hasGet: true, hasSet: !isReadonly })); } else { sb.emitHelper(prop, options, sb.helpers.setDataPropertyObjectProperty); } }); this.emitAdditionalProperties(sb, func, node, options); if (!optionsIn.pushValue) { sb.emitOp(node, 'DROP'); } } emitInitial(_sb, _func, _node, _addressName, _options) { } emitAdditionalProperties(_sb, _func, _node, _options) { } } exports.SmartContractForBase = SmartContractForBase; //# sourceMappingURL=data:application/json;charset=utf8;base64,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Q0FBQyxDQUFDO1FBR0wsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXZELElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFO1lBQ3hCLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUVTLFdBQVcsQ0FDbkIsR0FBa0IsRUFDbEIsS0FBMkIsRUFDM0IsS0FBd0IsRUFDeEIsWUFBa0IsRUFDbEIsUUFBc0I7SUFHeEIsQ0FBQztJQUVTLHdCQUF3QixDQUNoQyxHQUFrQixFQUNsQixLQUEyQixFQUMzQixLQUF3QixFQUN4QixRQUFzQjtJQUd4QixDQUFDO0NBV0Y7QUF0T0Qsb0RBc09DIiwiZmlsZSI6Im5lby1vbmUtc21hcnQtY29udHJhY3QtY29tcGlsZXIvc3JjL2NvbXBpbGUvYnVpbHRpbnMvY29udHJhY3QvU21hcnRDb250cmFjdEZvckJhc2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0c1V0aWxzIH0gZnJvbSAnQG5lby1vbmUvdHMtdXRpbHMnO1xuaW1wb3J0IHsgdXRpbHMgfSBmcm9tICdAbmVvLW9uZS91dGlscyc7XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQgeyBCVUlMVElOX1BST1BFUlRJRVMsIElHTk9SRURfUFJPUEVSVElFUyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRTZXR0ZXJOYW1lIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgSW50ZXJuYWxPYmplY3RQcm9wZXJ0eSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBTY3JpcHRCdWlsZGVyIH0gZnJvbSAnLi4vLi4vc2InO1xuaW1wb3J0IHsgTmFtZSB9IGZyb20gJy4uLy4uL3Njb3BlJztcbmltcG9ydCB7IFZpc2l0T3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEJ1aWx0aW5NZW1iZXJDYWxsIH0gZnJvbSAnLi4vQnVpbHRpbk1lbWJlckNhbGwnO1xuaW1wb3J0IHsgTWVtYmVyTGlrZUV4cHJlc3Npb24gfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTbWFydENvbnRyYWN0Rm9yQmFzZSBleHRlbmRzIEJ1aWx0aW5NZW1iZXJDYWxsIHtcbiAgcHVibGljIGVtaXRDYWxsKFxuICAgIHNiOiBTY3JpcHRCdWlsZGVyLFxuICAgIGZ1bmM6IE1lbWJlckxpa2VFeHByZXNzaW9uLFxuICAgIG5vZGU6IHRzLkNhbGxFeHByZXNzaW9uLFxuICAgIG9wdGlvbnNJbjogVmlzaXRPcHRpb25zLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID0gc2IucHVzaFZhbHVlT3B0aW9ucyhvcHRpb25zSW4pO1xuICAgIGNvbnN0IHJldHVyblR5cGUgPSBzYi5jb250ZXh0LmFuYWx5c2lzLmdldFR5cGUobm9kZSk7XG4gICAgaWYgKHJldHVyblR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gdHNVdGlscy50eXBlXy5nZXRQcm9wZXJ0aWVzKHJldHVyblR5cGUpO1xuICAgIGNvbnN0IHByb3BzID0gcHJvcGVydGllcy5tYXAoKHByb3ApID0+IHtcbiAgICAgIGNvbnN0IHByb3BUeXBlID0gc2IuY29udGV4dC5hbmFseXNpcy5nZXRUeXBlT2ZTeW1ib2wocHJvcCwgbm9kZSk7XG4gICAgICBpZiAocHJvcFR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm9wTmFtZSA9IHRzVXRpbHMuc3ltYm9sLmdldE5hbWUocHJvcCk7XG4gICAgICBpZiAoSUdOT1JFRF9QUk9QRVJUSUVTLmhhcyhwcm9wTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChCVUlMVElOX1BST1BFUlRJRVMuaGFzKHByb3BOYW1lKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgY29uc3QgcHJvcE5vZGUgPSB0c1V0aWxzLnN5bWJvbC5nZXRWYWx1ZURlY2xhcmF0aW9uT3JUaHJvdyhwcm9wKTtcbiAgICAgIGlmIChcbiAgICAgICAgdHNVdGlscy5tb2RpZmllci5pc1N0YXRpYyhwcm9wTm9kZSkgfHxcbiAgICAgICAgdHNVdGlscy5tb2RpZmllci5pc1Byb3RlY3RlZChwcm9wTm9kZSkgfHxcbiAgICAgICAgdHNVdGlscy5tb2RpZmllci5pc1ByaXZhdGUocHJvcE5vZGUpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gc2IuY29udGV4dC5hbmFseXNpcy5leHRyYWN0U2lnbmF0dXJlRm9yVHlwZShwcm9wTm9kZSwgcHJvcFR5cGUsIHsgZXJyb3I6IHRydWUgfSk7XG4gICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gTXVzdCBiZSBhIHByb3BlcnR5LCBub3QgYSBtZXRob2RcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwYXJhbURlY2xzOiBbXSxcbiAgICAgICAgICBwYXJhbVR5cGVzOiBuZXcgTWFwPHRzLlBhcmFtZXRlckRlY2xhcmF0aW9uLCB0cy5UeXBlIHwgdW5kZWZpbmVkPigpLFxuICAgICAgICAgIHJldHVyblR5cGU6IHByb3BUeXBlLFxuICAgICAgICAgIHByb3A6IHByb3BOb2RlLFxuICAgICAgICAgIHByb3BOYW1lLFxuICAgICAgICAgIGFjY2Vzc29yOiB0cnVlLFxuICAgICAgICAgIGlzUmVhZG9ubHk6IHRzVXRpbHMubW9kaWZpZXIuaXNSZWFkb25seShwcm9wTm9kZSksXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IC4uLnJlc3VsdCwgcHJvcDogcHJvcE5vZGUsIHByb3BOYW1lLCBhY2Nlc3NvcjogZmFsc2UsIGlzUmVhZG9ubHk6IGZhbHNlIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBoYW5kbGVQYXJhbXMgPSAoXG4gICAgICBwcm9wOiB0cy5EZWNsYXJhdGlvbixcbiAgICAgIHBhcmFtRGVjbHM6IFJlYWRvbmx5QXJyYXk8dHMuUGFyYW1ldGVyRGVjbGFyYXRpb24+LFxuICAgICAgcGFyYW1UeXBlczogTWFwPHRzLlBhcmFtZXRlckRlY2xhcmF0aW9uLCB0cy5UeXBlIHwgdW5kZWZpbmVkPixcbiAgICAgIGlubmVyT3B0aW9uczogVmlzaXRPcHRpb25zLFxuICAgICkgPT4ge1xuICAgICAgLy8gW3BhcmFtc11cbiAgICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICAgIHByb3AsXG4gICAgICAgIGlubmVyT3B0aW9ucyxcbiAgICAgICAgc2IuaGVscGVycy5wYXJhbWV0ZXJzKHtcbiAgICAgICAgICBwYXJhbXM6IHBhcmFtRGVjbHMsXG4gICAgICAgICAgYXNBcmdzQXJyOiB0cnVlLFxuICAgICAgICAgIG1hcDogKHBhcmFtLCBpbm5lcklubmVyT3B0aW9ucywgaXNSZXN0RWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSBwYXJhbVR5cGVzLmdldChwYXJhbSk7XG4gICAgICAgICAgICBpZiAodHlwZSAhPT0gdW5kZWZpbmVkICYmIGlzUmVzdEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgdHlwZSA9IHRzVXRpbHMudHlwZV8uZ2V0QXJyYXlUeXBlKHR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gW3ZhbHVlXVxuICAgICAgICAgICAgc2IuZW1pdEhlbHBlcihwYXJhbSwgaW5uZXJJbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMudW53cmFwVmFsUmVjdXJzaXZlKHsgdHlwZSB9KSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH07XG5cbiAgICBjb25zdCBhZGRyZXNzTmFtZSA9IHNiLnNjb3BlLmFkZFVuaXF1ZSgpO1xuICAgIHRoaXMuZW1pdEluaXRpYWwoc2IsIGZ1bmMsIG5vZGUsIGFkZHJlc3NOYW1lLCBvcHRpb25zKTtcblxuICAgIC8vIFtvYmplY3RWYWxdXG4gICAgc2IuZW1pdEhlbHBlcihub2RlLCBvcHRpb25zLCBzYi5oZWxwZXJzLmNyZWF0ZU9iamVjdCk7XG4gICAgLy8gW29iamVjdFZhbF1cbiAgICBwcm9wc1xuICAgICAgLmZpbHRlcih1dGlscy5ub3ROdWxsKVxuICAgICAgLmZvckVhY2goKHsgcHJvcCwgcHJvcE5hbWUsIHBhcmFtRGVjbHMsIHBhcmFtVHlwZXMsIHJldHVyblR5cGU6IHByb3BSZXR1cm5UeXBlLCBhY2Nlc3NvciwgaXNSZWFkb25seSB9KSA9PiB7XG4gICAgICAgIC8vIFtvYmplY3RWYWwsIG9iamVjdFZhbF1cbiAgICAgICAgc2IuZW1pdE9wKHByb3AsICdEVVAnKTtcbiAgICAgICAgLy8gW3N0cmluZywgb2JqZWN0VmFsLCBvYmplY3RWYWxdXG4gICAgICAgIHNiLmVtaXRQdXNoU3RyaW5nKHByb3AsIHByb3BOYW1lKTtcbiAgICAgICAgaWYgKGFjY2Vzc29yICYmICFpc1JlYWRvbmx5KSB7XG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgICAgIHByb3AsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgc2IuaGVscGVycy5jcmVhdGVGdW5jdGlvbkFycmF5KHtcbiAgICAgICAgICAgICAgYm9keTogKGlubmVyT3B0aW9uc0luKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5uZXJPcHRpb25zID0gc2IucHVzaFZhbHVlT3B0aW9ucyhpbm5lck9wdGlvbnNJbik7XG4gICAgICAgICAgICAgICAgLy8gWzAsIGFyZ3NhcnJdXG4gICAgICAgICAgICAgICAgc2IuZW1pdFB1c2hJbnQocHJvcCwgMCk7XG4gICAgICAgICAgICAgICAgLy8gW3ZhbF1cbiAgICAgICAgICAgICAgICBzYi5lbWl0T3AocHJvcCwgJ1BJQ0tJVEVNJyk7XG4gICAgICAgICAgICAgICAgLy8gW3ZhbHVlXVxuICAgICAgICAgICAgICAgIHNiLmVtaXRIZWxwZXIocHJvcCwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLnVud3JhcFZhbFJlY3Vyc2l2ZSh7IHR5cGU6IHByb3BSZXR1cm5UeXBlIH0pKTtcbiAgICAgICAgICAgICAgICAvLyBbMSwgdmFsdWVdXG4gICAgICAgICAgICAgICAgc2IuZW1pdFB1c2hJbnQocHJvcCwgMSk7XG4gICAgICAgICAgICAgICAgLy8gW3BhcmFtc11cbiAgICAgICAgICAgICAgICBzYi5lbWl0T3AocHJvcCwgJ1BBQ0snKTtcbiAgICAgICAgICAgICAgICAvLyBbc3RyaW5nLCBwYXJhbXNdXG4gICAgICAgICAgICAgICAgc2IuZW1pdFB1c2hTdHJpbmcocHJvcCwgZ2V0U2V0dGVyTmFtZShwcm9wTmFtZSkpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY2FsbEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKFswLCAyXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0SW52b2tlKHNiLCBmdW5jLCBub2RlLCBwcm9wLCBhZGRyZXNzTmFtZSwgY2FsbEJ1ZmZlciwgc2Iubm9QdXNoVmFsdWVPcHRpb25zKGlubmVyT3B0aW9ucykpO1xuICAgICAgICAgICAgICAgIC8vIFt2YWxdXG4gICAgICAgICAgICAgICAgc2IuZW1pdEhlbHBlcihwcm9wLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMud3JhcFVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgLy8gW11cbiAgICAgICAgICAgICAgICBzYi5lbWl0SGVscGVyKHByb3AsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy5yZXR1cm4pO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBzYi5oZWxwZXJzLmNyZWF0ZUZ1bmN0aW9uT2JqZWN0KHtcbiAgICAgICAgICAgICAgcHJvcGVydHk6IEludGVybmFsT2JqZWN0UHJvcGVydHkuQ2FsbCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gW2ZhcnIsIHN0cmluZywgb2JqZWN0VmFsLCBvYmplY3RWYWxdXG4gICAgICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICAgICAgcHJvcCxcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIHNiLmhlbHBlcnMuY3JlYXRlRnVuY3Rpb25BcnJheSh7XG4gICAgICAgICAgICBib2R5OiAoaW5uZXJPcHRpb25zSW4pID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgaW5uZXJPcHRpb25zID0gc2IucHVzaFZhbHVlT3B0aW9ucyhpbm5lck9wdGlvbnNJbik7XG4gICAgICAgICAgICAgIGlmIChhY2Nlc3Nvcikge1xuICAgICAgICAgICAgICAgIC8vIFtdXG4gICAgICAgICAgICAgICAgc2IuZW1pdE9wKHByb3AsICdEUk9QJyk7XG4gICAgICAgICAgICAgICAgLy8gW251bWJlcl1cbiAgICAgICAgICAgICAgICBzYi5lbWl0UHVzaEludChwcm9wLCAwKTtcbiAgICAgICAgICAgICAgICAvLyBbcGFyYW1zXVxuICAgICAgICAgICAgICAgIHNiLmVtaXRPcChwcm9wLCAnTkVXQVJSQVknKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBbcGFyYW1zXVxuICAgICAgICAgICAgICAgIGhhbmRsZVBhcmFtcyhwcm9wLCBwYXJhbURlY2xzLCBwYXJhbVR5cGVzLCBpbm5lck9wdGlvbnMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIFtzdHJpbmcsIHBhcmFtc11cbiAgICAgICAgICAgICAgc2IuZW1pdFB1c2hTdHJpbmcocHJvcCwgcHJvcE5hbWUpO1xuXG4gICAgICAgICAgICAgIGNvbnN0IGlzVm9pZFJldHVybiA9IHByb3BSZXR1cm5UeXBlICE9PSB1bmRlZmluZWQgJiYgdHNVdGlscy50eXBlXy5pc1ZvaWQocHJvcFJldHVyblR5cGUpO1xuICAgICAgICAgICAgICBjb25zdCBjYWxsQnVmZmVyID0gQnVmZmVyLmZyb20oW2lzVm9pZFJldHVybiA/IDAgOiAxLCAyXSk7XG4gICAgICAgICAgICAgIHRoaXMuZW1pdEludm9rZShzYiwgZnVuYywgbm9kZSwgcHJvcCwgYWRkcmVzc05hbWUsIGNhbGxCdWZmZXIsIGlubmVyT3B0aW9ucyk7XG5cbiAgICAgICAgICAgICAgaWYgKGlzVm9pZFJldHVybikge1xuICAgICAgICAgICAgICAgIHNiLmVtaXRIZWxwZXIocHJvcCwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLndyYXBVbmRlZmluZWQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFt2YWxdXG4gICAgICAgICAgICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgICAgICAgICAgIHByb3AsXG4gICAgICAgICAgICAgICAgICBpbm5lck9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICBzYi5oZWxwZXJzLndyYXBWYWxSZWN1cnNpdmUoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBwcm9wUmV0dXJuVHlwZSxcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBbXVxuICAgICAgICAgICAgICBzYi5lbWl0SGVscGVyKHByb3AsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy5yZXR1cm4pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgLy8gW2ZvYmosIHN0cmluZywgb2JqZWN0VmFsLCBvYmplY3RWYWxdXG4gICAgICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICAgICAgcHJvcCxcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIHNiLmhlbHBlcnMuY3JlYXRlRnVuY3Rpb25PYmplY3Qoe1xuICAgICAgICAgICAgcHJvcGVydHk6IEludGVybmFsT2JqZWN0UHJvcGVydHkuQ2FsbCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGFjY2Vzc29yKSB7XG4gICAgICAgICAgLy8gW29iamVjdFZhbF1cbiAgICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBzYi5oZWxwZXJzLnNldEFjY2Vzc29yUHJvcGVydHlPYmplY3RQcm9wZXJ0eSh7IGhhc0dldDogdHJ1ZSwgaGFzU2V0OiAhaXNSZWFkb25seSB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFtvYmplY3RWYWxdXG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihwcm9wLCBvcHRpb25zLCBzYi5oZWxwZXJzLnNldERhdGFQcm9wZXJ0eU9iamVjdFByb3BlcnR5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAvLyBbb2JqZWN0VmFsXVxuICAgIHRoaXMuZW1pdEFkZGl0aW9uYWxQcm9wZXJ0aWVzKHNiLCBmdW5jLCBub2RlLCBvcHRpb25zKTtcblxuICAgIGlmICghb3B0aW9uc0luLnB1c2hWYWx1ZSkge1xuICAgICAgc2IuZW1pdE9wKG5vZGUsICdEUk9QJyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRJbml0aWFsKFxuICAgIF9zYjogU2NyaXB0QnVpbGRlcixcbiAgICBfZnVuYzogTWVtYmVyTGlrZUV4cHJlc3Npb24sXG4gICAgX25vZGU6IHRzLkNhbGxFeHByZXNzaW9uLFxuICAgIF9hZGRyZXNzTmFtZTogTmFtZSxcbiAgICBfb3B0aW9uczogVmlzaXRPcHRpb25zLFxuICApOiB2b2lkIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEFkZGl0aW9uYWxQcm9wZXJ0aWVzKFxuICAgIF9zYjogU2NyaXB0QnVpbGRlcixcbiAgICBfZnVuYzogTWVtYmVyTGlrZUV4cHJlc3Npb24sXG4gICAgX25vZGU6IHRzLkNhbGxFeHByZXNzaW9uLFxuICAgIF9vcHRpb25zOiBWaXNpdE9wdGlvbnMsXG4gICk6IHZvaWQge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBlbWl0SW52b2tlKFxuICAgIHNiOiBTY3JpcHRCdWlsZGVyLFxuICAgIGZ1bmM6IE1lbWJlckxpa2VFeHByZXNzaW9uLFxuICAgIG5vZGU6IHRzLkNhbGxFeHByZXNzaW9uLFxuICAgIHByb3A6IHRzLkRlY2xhcmF0aW9uLFxuICAgIGFkZHJlc3NOYW1lOiBOYW1lLFxuICAgIGNhbGxCdWZmZXI6IEJ1ZmZlcixcbiAgICBvcHRpb25zSW46IFZpc2l0T3B0aW9ucyxcbiAgKTogdm9pZDtcbn1cbiJdfQ==