@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
114 lines (112 loc) • 19.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const ts_utils_1 = require("@neo-one/ts-utils");
const utils_1 = require("@neo-one/utils");
const typescript_1 = tslib_1.__importDefault(require("typescript"));
const constants_1 = require("../constants");
const contract_1 = require("../contract");
const DiagnosticCode_1 = require("../DiagnosticCode");
const DiagnosticMessage_1 = require("../DiagnosticMessage");
const builtins_1 = require("./builtins");
const PARAMETERS = ['String', 'Array'];
const RETURN_TYPE = 'Buffer';
const getSmartContract = (context, sourceFile) => {
const classDecls = ts_utils_1.tsUtils.statement
.getStatements(sourceFile)
.filter(typescript_1.default.isClassDeclaration)
.filter((decl) => ts_utils_1.tsUtils.modifier.isNamedExport(decl))
.filter((decl) => context.analysis.isSmartContract(decl));
if (classDecls.length === 0) {
return undefined;
}
if (classDecls.length === 1) {
return classDecls[0];
}
context.reportError(classDecls[1], DiagnosticCode_1.DiagnosticCode.InvalidContract, DiagnosticMessage_1.DiagnosticMessage.InvalidContractMultipleInFile);
return classDecls[0];
};
const addOverrideSymbol = (context, contractInfo, overrideSymbol) => {
const superSymbol = context.analysis.getSymbol(contractInfo.smartContract);
if (superSymbol === undefined) {
return;
}
if (overrideSymbol !== undefined) {
context.builtins.addOverride(superSymbol, overrideSymbol);
}
const superSmartContract = contractInfo.superSmartContract;
if (superSmartContract !== undefined) {
addOverrideSymbol(context, superSmartContract, superSymbol);
}
};
const addContractInfo = (context, contractInfo) => {
const propertyNameToOverride = new Map();
contract_1.getAllPropInfos(contractInfo).forEach((propInfo) => {
const symbol = context.analysis.getSymbol(propInfo.classDecl);
if (symbol !== undefined &&
propInfo.type !== 'deploy' &&
propInfo.type !== 'refundAssets' &&
propInfo.type !== 'upgrade' &&
propInfo.type !== 'completeSend') {
const memberSymbol = propInfo.symbol;
switch (propInfo.type) {
case 'function':
if (typescript_1.default.isPropertyDeclaration(propInfo.decl)) {
context.builtins.addMember(symbol, memberSymbol, new builtins_1.BuiltinInstanceMemberCallableProperty(propInfo.decl));
}
else {
context.builtins.addMember(symbol, memberSymbol, new builtins_1.BuiltinInstanceMemberMethod(propInfo.decl));
}
break;
case 'accessor':
context.builtins.addMember(symbol, memberSymbol, new builtins_1.BuiltinInstanceMemberAccessor(propInfo.getter === undefined ? undefined : propInfo.getter.decl, propInfo.setter === undefined ? undefined : propInfo.setter.decl));
break;
case 'property':
if (propInfo.structuredStorageType === undefined) {
context.builtins.addMember(symbol, memberSymbol, new builtins_1.BuiltinInstanceMemberStorageProperty(propInfo.name));
}
else {
context.builtins.addMember(symbol, memberSymbol, new builtins_1.BuiltinInstanceMemberStructuredStorageProperty(propInfo.structuredStorageType, propInfo.name));
}
break;
default:
utils_1.utils.assertNever(propInfo);
throw new Error('For TS');
}
const memberName = ts_utils_1.tsUtils.symbol.getName(memberSymbol);
const overrideSymbol = propertyNameToOverride.get(memberName);
if (overrideSymbol === undefined) {
propertyNameToOverride.set(memberName, memberSymbol);
}
else {
context.builtins.addOverride(memberSymbol, overrideSymbol);
}
}
});
addOverrideSymbol(context, contractInfo);
};
exports.getSmartContractInfo = (context, sourceFile) => {
const smartContract = getSmartContract(context, sourceFile);
const contractInfo = smartContract === undefined ? undefined : contract_1.getContractInfo(context, smartContract);
const properties = smartContract === undefined ? constants_1.DEFAULT_CONTRACT_PROPERTIES : contract_1.getContractProperties(context, smartContract);
const payable = contractInfo === undefined
? true
: contractInfo.propInfos.some((propInfo) => propInfo.type === 'function' && propInfo.receive);
if (contractInfo !== undefined) {
addContractInfo(context, contractInfo);
return {
contractInfo,
abi: contract_1.getABI(context, contractInfo),
contract: Object.assign({ parameters: PARAMETERS, returnType: RETURN_TYPE }, properties, { storage: true, dynamicInvoke: true, payable }),
};
}
return {
contractInfo,
abi: {
functions: [],
events: [],
},
contract: Object.assign({ parameters: PARAMETERS, returnType: RETURN_TYPE }, properties, { storage: true, dynamicInvoke: true, payable }),
};
};
//# sourceMappingURL=data:application/json;charset=utf8;base64,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LENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxVQUFVLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xHLElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTtRQUM5QixlQUFlLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRXZDLE9BQU87WUFDTCxZQUFZO1lBQ1osR0FBRyxFQUFFLGlCQUFNLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQztZQUNsQyxRQUFRLGtCQUNOLFVBQVUsRUFBRSxVQUFVLEVBQ3RCLFVBQVUsRUFBRSxXQUFXLElBQ3BCLFVBQVUsSUFDYixPQUFPLEVBQUUsSUFBSSxFQUNiLGFBQWEsRUFBRSxJQUFJLEVBQ25CLE9BQU8sR0FDUjtTQUNGLENBQUM7S0FDSDtJQUVELE9BQU87UUFDTCxZQUFZO1FBQ1osR0FBRyxFQUFFO1lBQ0gsU0FBUyxFQUFFLEVBQUU7WUFDYixNQUFNLEVBQUUsRUFBRTtTQUNYO1FBQ0QsUUFBUSxrQkFDTixVQUFVLEVBQUUsVUFBVSxFQUN0QixVQUFVLEVBQUUsV0FBVyxJQUNwQixVQUFVLElBQ2IsT0FBTyxFQUFFLElBQUksRUFDYixhQUFhLEVBQUUsSUFBSSxFQUNuQixPQUFPLEdBQ1I7S0FDRixDQUFDO0FBQ0osQ0FBQyxDQUFDIiwiZmlsZSI6Im5lby1vbmUtc21hcnQtY29udHJhY3QtY29tcGlsZXIvc3JjL2NvbXBpbGUvZ2V0U21hcnRDb250cmFjdEluZm8uanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBQkksIENvbnRyYWN0UGFyYW1ldGVyVHlwZSB9IGZyb20gJ0BuZW8tb25lL2NsaWVudC1jb21tb24nO1xuaW1wb3J0IHsgQ29udHJhY3RSZWdpc3RlciB9IGZyb20gJ0BuZW8tb25lL2NsaWVudC1mdWxsLWNvcmUnO1xuaW1wb3J0IHsgdHNVdGlscyB9IGZyb20gJ0BuZW8tb25lL3RzLXV0aWxzJztcbmltcG9ydCB7IE9taXRTdHJpY3QsIHV0aWxzIH0gZnJvbSAnQG5lby1vbmUvdXRpbHMnO1xuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuaW1wb3J0IHsgREVGQVVMVF9DT05UUkFDVF9QUk9QRVJUSUVTIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tICcuLi9Db250ZXh0JztcbmltcG9ydCB7IENvbnRyYWN0SW5mbywgZ2V0QUJJLCBnZXRBbGxQcm9wSW5mb3MsIGdldENvbnRyYWN0SW5mbywgZ2V0Q29udHJhY3RQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vY29udHJhY3QnO1xuaW1wb3J0IHsgRGlhZ25vc3RpY0NvZGUgfSBmcm9tICcuLi9EaWFnbm9zdGljQ29kZSc7XG5pbXBvcnQgeyBEaWFnbm9zdGljTWVzc2FnZSB9IGZyb20gJy4uL0RpYWdub3N0aWNNZXNzYWdlJztcbmltcG9ydCB7XG4gIEJ1aWx0aW5JbnN0YW5jZU1lbWJlckFjY2Vzc29yLFxuICBCdWlsdGluSW5zdGFuY2VNZW1iZXJDYWxsYWJsZVByb3BlcnR5LFxuICBCdWlsdGluSW5zdGFuY2VNZW1iZXJNZXRob2QsXG4gIEJ1aWx0aW5JbnN0YW5jZU1lbWJlclN0b3JhZ2VQcm9wZXJ0eSxcbiAgQnVpbHRpbkluc3RhbmNlTWVtYmVyU3RydWN0dXJlZFN0b3JhZ2VQcm9wZXJ0eSxcbn0gZnJvbSAnLi9idWlsdGlucyc7XG5cbmNvbnN0IFBBUkFNRVRFUlM6IFJlYWRvbmx5QXJyYXk8Q29udHJhY3RQYXJhbWV0ZXJUeXBlPiA9IFsnU3RyaW5nJywgJ0FycmF5J107XG5jb25zdCBSRVRVUk5fVFlQRTogQ29udHJhY3RQYXJhbWV0ZXJUeXBlID0gJ0J1ZmZlcic7XG5cbmNvbnN0IGdldFNtYXJ0Q29udHJhY3QgPSAoY29udGV4dDogQ29udGV4dCwgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSkgPT4ge1xuICBjb25zdCBjbGFzc0RlY2xzID0gdHNVdGlscy5zdGF0ZW1lbnRcbiAgICAuZ2V0U3RhdGVtZW50cyhzb3VyY2VGaWxlKVxuICAgIC5maWx0ZXIodHMuaXNDbGFzc0RlY2xhcmF0aW9uKVxuICAgIC5maWx0ZXIoKGRlY2wpID0+IHRzVXRpbHMubW9kaWZpZXIuaXNOYW1lZEV4cG9ydChkZWNsKSlcbiAgICAuZmlsdGVyKChkZWNsKSA9PiBjb250ZXh0LmFuYWx5c2lzLmlzU21hcnRDb250cmFjdChkZWNsKSk7XG5cbiAgaWYgKGNsYXNzRGVjbHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChjbGFzc0RlY2xzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBjbGFzc0RlY2xzWzBdO1xuICB9XG5cbiAgY29udGV4dC5yZXBvcnRFcnJvcihjbGFzc0RlY2xzWzFdLCBEaWFnbm9zdGljQ29kZS5JbnZhbGlkQ29udHJhY3QsIERpYWdub3N0aWNNZXNzYWdlLkludmFsaWRDb250cmFjdE11bHRpcGxlSW5GaWxlKTtcblxuICByZXR1cm4gY2xhc3NEZWNsc1swXTtcbn07XG5cbmNvbnN0IGFkZE92ZXJyaWRlU3ltYm9sID0gKGNvbnRleHQ6IENvbnRleHQsIGNvbnRyYWN0SW5mbzogQ29udHJhY3RJbmZvLCBvdmVycmlkZVN5bWJvbD86IHRzLlN5bWJvbCkgPT4ge1xuICBjb25zdCBzdXBlclN5bWJvbCA9IGNvbnRleHQuYW5hbHlzaXMuZ2V0U3ltYm9sKGNvbnRyYWN0SW5mby5zbWFydENvbnRyYWN0KTtcbiAgaWYgKHN1cGVyU3ltYm9sID09PSB1bmRlZmluZWQpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChvdmVycmlkZVN5bWJvbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29udGV4dC5idWlsdGlucy5hZGRPdmVycmlkZShzdXBlclN5bWJvbCwgb3ZlcnJpZGVTeW1ib2wpO1xuICB9XG5cbiAgY29uc3Qgc3VwZXJTbWFydENvbnRyYWN0ID0gY29udHJhY3RJbmZvLnN1cGVyU21hcnRDb250cmFjdDtcbiAgaWYgKHN1cGVyU21hcnRDb250cmFjdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYWRkT3ZlcnJpZGVTeW1ib2woY29udGV4dCwgc3VwZXJTbWFydENvbnRyYWN0LCBzdXBlclN5bWJvbCk7XG4gIH1cbn07XG5cbmNvbnN0IGFkZENvbnRyYWN0SW5mbyA9IChjb250ZXh0OiBDb250ZXh0LCBjb250cmFjdEluZm86IENvbnRyYWN0SW5mbykgPT4ge1xuICBjb25zdCBwcm9wZXJ0eU5hbWVUb092ZXJyaWRlID0gbmV3IE1hcDxzdHJpbmcsIHRzLlN5bWJvbD4oKTtcbiAgZ2V0QWxsUHJvcEluZm9zKGNvbnRyYWN0SW5mbykuZm9yRWFjaCgocHJvcEluZm8pID0+IHtcbiAgICBjb25zdCBzeW1ib2wgPSBjb250ZXh0LmFuYWx5c2lzLmdldFN5bWJvbChwcm9wSW5mby5jbGFzc0RlY2wpO1xuICAgIGlmIChcbiAgICAgIHN5bWJvbCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBwcm9wSW5mby50eXBlICE9PSAnZGVwbG95JyAmJlxuICAgICAgcHJvcEluZm8udHlwZSAhPT0gJ3JlZnVuZEFzc2V0cycgJiZcbiAgICAgIHByb3BJbmZvLnR5cGUgIT09ICd1cGdyYWRlJyAmJlxuICAgICAgcHJvcEluZm8udHlwZSAhPT0gJ2NvbXBsZXRlU2VuZCdcbiAgICApIHtcbiAgICAgIGNvbnN0IG1lbWJlclN5bWJvbCA9IHByb3BJbmZvLnN5bWJvbDtcbiAgICAgIHN3aXRjaCAocHJvcEluZm8udHlwZSkge1xuICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgaWYgKHRzLmlzUHJvcGVydHlEZWNsYXJhdGlvbihwcm9wSW5mby5kZWNsKSkge1xuICAgICAgICAgICAgY29udGV4dC5idWlsdGlucy5hZGRNZW1iZXIoc3ltYm9sLCBtZW1iZXJTeW1ib2wsIG5ldyBCdWlsdGluSW5zdGFuY2VNZW1iZXJDYWxsYWJsZVByb3BlcnR5KHByb3BJbmZvLmRlY2wpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGV4dC5idWlsdGlucy5hZGRNZW1iZXIoc3ltYm9sLCBtZW1iZXJTeW1ib2wsIG5ldyBCdWlsdGluSW5zdGFuY2VNZW1iZXJNZXRob2QocHJvcEluZm8uZGVjbCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYWNjZXNzb3InOlxuICAgICAgICAgIGNvbnRleHQuYnVpbHRpbnMuYWRkTWVtYmVyKFxuICAgICAgICAgICAgc3ltYm9sLFxuICAgICAgICAgICAgbWVtYmVyU3ltYm9sLFxuICAgICAgICAgICAgbmV3IEJ1aWx0aW5JbnN0YW5jZU1lbWJlckFjY2Vzc29yKFxuICAgICAgICAgICAgICBwcm9wSW5mby5nZXR0ZXIgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHByb3BJbmZvLmdldHRlci5kZWNsLFxuICAgICAgICAgICAgICBwcm9wSW5mby5zZXR0ZXIgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHByb3BJbmZvLnNldHRlci5kZWNsLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwcm9wZXJ0eSc6XG4gICAgICAgICAgaWYgKHByb3BJbmZvLnN0cnVjdHVyZWRTdG9yYWdlVHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250ZXh0LmJ1aWx0aW5zLmFkZE1lbWJlcihzeW1ib2wsIG1lbWJlclN5bWJvbCwgbmV3IEJ1aWx0aW5JbnN0YW5jZU1lbWJlclN0b3JhZ2VQcm9wZXJ0eShwcm9wSW5mby5uYW1lKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRleHQuYnVpbHRpbnMuYWRkTWVtYmVyKFxuICAgICAgICAgICAgICBzeW1ib2wsXG4gICAgICAgICAgICAgIG1lbWJlclN5bWJvbCxcbiAgICAgICAgICAgICAgbmV3IEJ1aWx0aW5JbnN0YW5jZU1lbWJlclN0cnVjdHVyZWRTdG9yYWdlUHJvcGVydHkocHJvcEluZm8uc3RydWN0dXJlZFN0b3JhZ2VUeXBlLCBwcm9wSW5mby5uYW1lKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgdXRpbHMuYXNzZXJ0TmV2ZXIocHJvcEluZm8pO1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3IgVFMnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWVtYmVyTmFtZSA9IHRzVXRpbHMuc3ltYm9sLmdldE5hbWUobWVtYmVyU3ltYm9sKTtcbiAgICAgIGNvbnN0IG92ZXJyaWRlU3ltYm9sID0gcHJvcGVydHlOYW1lVG9PdmVycmlkZS5nZXQobWVtYmVyTmFtZSk7XG4gICAgICBpZiAob3ZlcnJpZGVTeW1ib2wgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wZXJ0eU5hbWVUb092ZXJyaWRlLnNldChtZW1iZXJOYW1lLCBtZW1iZXJTeW1ib2wpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGV4dC5idWlsdGlucy5hZGRPdmVycmlkZShtZW1iZXJTeW1ib2wsIG92ZXJyaWRlU3ltYm9sKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGFkZE92ZXJyaWRlU3ltYm9sKGNvbnRleHQsIGNvbnRyYWN0SW5mbyk7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFNtYXJ0Q29udHJhY3RJbmZvIHtcbiAgcmVhZG9ubHkgY29udHJhY3RJbmZvOiBDb250cmFjdEluZm8gfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGFiaTogQUJJO1xuICByZWFkb25seSBjb250cmFjdDogT21pdFN0cmljdDxDb250cmFjdFJlZ2lzdGVyLCAnc2NyaXB0Jz47XG59XG5cbmV4cG9ydCBjb25zdCBnZXRTbWFydENvbnRyYWN0SW5mbyA9IChjb250ZXh0OiBDb250ZXh0LCBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlKTogU21hcnRDb250cmFjdEluZm8gPT4ge1xuICBjb25zdCBzbWFydENvbnRyYWN0ID0gZ2V0U21hcnRDb250cmFjdChjb250ZXh0LCBzb3VyY2VGaWxlKTtcbiAgY29uc3QgY29udHJhY3RJbmZvID0gc21hcnRDb250cmFjdCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZ2V0Q29udHJhY3RJbmZvKGNvbnRleHQsIHNtYXJ0Q29udHJhY3QpO1xuICBjb25zdCBwcm9wZXJ0aWVzID1cbiAgICBzbWFydENvbnRyYWN0ID09PSB1bmRlZmluZWQgPyBERUZBVUxUX0NPTlRSQUNUX1BST1BFUlRJRVMgOiBnZXRDb250cmFjdFByb3BlcnRpZXMoY29udGV4dCwgc21hcnRDb250cmFjdCk7XG4gIGNvbnN0IHBheWFibGUgPVxuICAgIGNvbnRyYWN0SW5mbyA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHRydWVcbiAgICAgIDogY29udHJhY3RJbmZvLnByb3BJbmZvcy5zb21lKChwcm9wSW5mbykgPT4gcHJvcEluZm8udHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiBwcm9wSW5mby5yZWNlaXZlKTtcbiAgaWYgKGNvbnRyYWN0SW5mbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYWRkQ29udHJhY3RJbmZvKGNvbnRleHQsIGNvbnRyYWN0SW5mbyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udHJhY3RJbmZvLFxuICAgICAgYWJpOiBnZXRBQkkoY29udGV4dCwgY29udHJhY3RJbmZvKSxcbiAgICAgIGNvbnRyYWN0OiB7XG4gICAgICAgIHBhcmFtZXRlcnM6IFBBUkFNRVRFUlMsXG4gICAgICAgIHJldHVyblR5cGU6IFJFVFVSTl9UWVBFLFxuICAgICAgICAuLi5wcm9wZXJ0aWVzLFxuICAgICAgICBzdG9yYWdlOiB0cnVlLFxuICAgICAgICBkeW5hbWljSW52b2tlOiB0cnVlLFxuICAgICAgICBwYXlhYmxlLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjb250cmFjdEluZm8sXG4gICAgYWJpOiB7XG4gICAgICBmdW5jdGlvbnM6IFtdLFxuICAgICAgZXZlbnRzOiBbXSxcbiAgICB9LFxuICAgIGNvbnRyYWN0OiB7XG4gICAgICBwYXJhbWV0ZXJzOiBQQVJBTUVURVJTLFxuICAgICAgcmV0dXJuVHlwZTogUkVUVVJOX1RZUEUsXG4gICAgICAuLi5wcm9wZXJ0aWVzLFxuICAgICAgc3RvcmFnZTogdHJ1ZSxcbiAgICAgIGR5bmFtaWNJbnZva2U6IHRydWUsXG4gICAgICBwYXlhYmxlLFxuICAgIH0sXG4gIH07XG59O1xuIl19