@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
138 lines (136 loc) • 22.7 kB
JavaScript
;
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 DiagnosticCode_1 = require("../../../DiagnosticCode");
const DiagnosticMessage_1 = require("../../../DiagnosticMessage");
const Helper_1 = require("../Helper");
const boolean_1 = require("./boolean");
const undefined_1 = require("./undefined");
class ForTypeHelper extends Helper_1.Helper {
constructor({ type, types, single, singleUndefined, singleFalse, defaultCase, optional = false, }) {
super();
this.type = type;
this.types = types;
this.single = single === undefined ? false : single;
this.singleUndefined = singleUndefined;
this.singleFalse = singleFalse;
this.optional = optional;
this.defaultCase = defaultCase;
}
emit(sb, node, optionsIn) {
const noCastOptions = sb.noCastOptions(optionsIn);
const options = sb.pushValueOptions(sb.noCastOptions(optionsIn));
let typeIn = this.type === undefined ? optionsIn.cast : this.type;
let checkUndefinedSingle = false;
let checkFalseSingle = false;
if (typeIn !== undefined &&
this.single &&
(this.optional || undefined_1.hasUndefined(sb.context, node, typeIn)) &&
this.singleUndefined !== undefined) {
typeIn = ts_utils_1.tsUtils.type_.getNonNullableType(typeIn);
checkUndefinedSingle = true;
}
if (typeIn !== undefined &&
this.single &&
boolean_1.hasBooleanFalse(sb.context, node, typeIn) &&
this.singleFalse !== undefined) {
typeIn = ts_utils_1.tsUtils.type_.filterUnion(sb.context.typeChecker, typeIn, (tpe) => !boolean_1.isBooleanFalse(sb.context, node, tpe));
checkFalseSingle = true;
}
const type = typeIn;
const types = type === undefined ? this.types : this.types.filter((testType) => testType.hasType(type));
const groupedTypes = new Map();
for (const forType of types) {
const mutableTypes = groupedTypes.get(forType.process);
if (mutableTypes === undefined) {
groupedTypes.set(forType.process, [forType]);
}
else {
mutableTypes.push(forType);
}
}
let defaultCase = this.defaultCase === undefined
? (innerOptions) => {
sb.emitOp(node, 'DROP');
sb.emitHelper(node, innerOptions, sb.helpers.throwTypeError);
}
: this.defaultCase;
if (this.single && (types.length !== 1 || (checkUndefinedSingle && checkFalseSingle))) {
sb.context.reportError(node, DiagnosticCode_1.DiagnosticCode.UnknownType, DiagnosticMessage_1.DiagnosticMessage.ResolveOneType);
return;
}
if (types.length === 0) {
defaultCase(noCastOptions);
}
else if (groupedTypes.size === 1) {
const singleUndefined = this.singleUndefined;
const singleFalse = this.singleFalse;
if (checkUndefinedSingle && singleUndefined !== undefined) {
sb.emitHelper(node, options, sb.helpers.if({
condition: () => {
sb.emitOp(node, 'DUP');
sb.emitOp(node, 'SIZE');
sb.emitPushInt(node, 0);
sb.emitOp(node, 'NUMEQUAL');
},
whenTrue: () => {
singleUndefined(options);
},
whenFalse: () => {
types[0].process(noCastOptions);
},
}));
}
else if (checkFalseSingle && singleFalse !== undefined) {
sb.emitHelper(node, options, sb.helpers.if({
condition: () => {
sb.emitOp(node, 'DUP');
sb.emitOp(node, 'SIZE');
sb.emitPushInt(node, 0);
sb.emitOp(node, 'NUMEQUAL');
},
whenTrue: () => {
singleFalse(options);
},
whenFalse: () => {
types[0].process(noCastOptions);
},
}));
}
else {
types[0].process(noCastOptions);
}
}
else {
const groupedTypesOrdered = lodash_1.default.sortBy([...groupedTypes.entries()], [(value) => value[1].length]);
let caseTypes = groupedTypesOrdered;
if (this.defaultCase === undefined) {
caseTypes = groupedTypesOrdered.slice(0, -1);
defaultCase = (innerOptions) => {
const [processType] = groupedTypesOrdered[groupedTypesOrdered.length - 1];
processType(innerOptions);
};
}
sb.emitHelper(node, options, sb.helpers.case(caseTypes.map(([processType, forTypes]) => ({
condition: () => {
sb.emitOp(node, 'DUP');
forTypes[0].isRuntimeType(options);
forTypes.slice(1).forEach((forType) => {
sb.emitOp(node, 'OVER');
forType.isRuntimeType(options);
sb.emitOp(node, 'BOOLOR');
});
},
whenTrue: () => {
processType(noCastOptions);
},
})), () => {
defaultCase(noCastOptions);
}));
}
}
}
exports.ForTypeHelper = ForTypeHelper;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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LENBQUMsT0FBTyxDQUFDLElBQUksQ0FDYixTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7b0JBRWQsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBRXZCLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBR25DLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7d0JBRXBDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO3dCQUV4QixPQUFPLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUUvQixFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztvQkFDNUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxRQUFRLEVBQUUsR0FBRyxFQUFFO29CQUNiLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDN0IsQ0FBQzthQUNGLENBQUMsQ0FBQyxFQUNILEdBQUcsRUFBRTtnQkFDSCxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDN0IsQ0FBQyxDQUNGLENBQ0YsQ0FBQztTQUNIO0lBQ0gsQ0FBQztDQUNGO0FBM0xELHNDQTJMQyIsImZpbGUiOiJuZW8tb25lLXNtYXJ0LWNvbnRyYWN0LWNvbXBpbGVyL3NyYy9jb21waWxlL2hlbHBlci90eXBlcy9Gb3JUeXBlSGVscGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHNVdGlscyB9IGZyb20gJ0BuZW8tb25lL3RzLXV0aWxzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQgeyBEaWFnbm9zdGljQ29kZSB9IGZyb20gJy4uLy4uLy4uL0RpYWdub3N0aWNDb2RlJztcbmltcG9ydCB7IERpYWdub3N0aWNNZXNzYWdlIH0gZnJvbSAnLi4vLi4vLi4vRGlhZ25vc3RpY01lc3NhZ2UnO1xuaW1wb3J0IHsgU2NyaXB0QnVpbGRlciB9IGZyb20gJy4uLy4uL3NiJztcbmltcG9ydCB7IFZpc2l0T3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEhlbHBlciB9IGZyb20gJy4uL0hlbHBlcic7XG5pbXBvcnQgeyBoYXNCb29sZWFuRmFsc2UsIGlzQm9vbGVhbkZhbHNlIH0gZnJvbSAnLi9ib29sZWFuJztcbmltcG9ydCB7IGhhc1VuZGVmaW5lZCB9IGZyb20gJy4vdW5kZWZpbmVkJztcblxudHlwZSBQcm9jZXNzID0gKG9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JUeXBlIHtcbiAgcmVhZG9ubHkgaGFzVHlwZTogKHR5cGU6IHRzLlR5cGUpID0+IGJvb2xlYW47XG4gIHJlYWRvbmx5IGlzUnVudGltZVR5cGU6IChvcHRpb25zOiBWaXNpdE9wdGlvbnMpID0+IHZvaWQ7XG4gIHJlYWRvbmx5IHByb2Nlc3M6IFByb2Nlc3M7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9yVHlwZUhlbHBlck9wdGlvbnMge1xuICByZWFkb25seSB0eXBlOiB0cy5UeXBlIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSB0eXBlczogUmVhZG9ubHlBcnJheTxGb3JUeXBlPjtcbiAgcmVhZG9ubHkgc2luZ2xlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2luZ2xlVW5kZWZpbmVkPzogKG9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4gdm9pZDtcbiAgcmVhZG9ubHkgc2luZ2xlRmFsc2U/OiAob3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB2b2lkO1xuICByZWFkb25seSBvcHRpb25hbD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGRlZmF1bHRDYXNlPzogKG9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4gdm9pZDtcbn1cblxuLy8gSW5wdXQ6IFt2YWxdXG4vLyBPdXRwdXQ6IFtdXG5leHBvcnQgY2xhc3MgRm9yVHlwZUhlbHBlciBleHRlbmRzIEhlbHBlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHlwZTogdHMuVHlwZSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSB0eXBlczogUmVhZG9ubHlBcnJheTxGb3JUeXBlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzaW5nbGU6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgc2luZ2xlVW5kZWZpbmVkOiAoKG9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2luZ2xlRmFsc2U6ICgob3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25hbDogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0Q2FzZTogKChvcHRpb25zOiBWaXNpdE9wdGlvbnMpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih7XG4gICAgdHlwZSxcbiAgICB0eXBlcyxcbiAgICBzaW5nbGUsXG4gICAgc2luZ2xlVW5kZWZpbmVkLFxuICAgIHNpbmdsZUZhbHNlLFxuICAgIGRlZmF1bHRDYXNlLFxuICAgIG9wdGlvbmFsID0gZmFsc2UsXG4gIH06IEZvclR5cGVIZWxwZXJPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMudHlwZXMgPSB0eXBlcztcbiAgICB0aGlzLnNpbmdsZSA9IHNpbmdsZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBzaW5nbGU7XG4gICAgdGhpcy5zaW5nbGVVbmRlZmluZWQgPSBzaW5nbGVVbmRlZmluZWQ7XG4gICAgdGhpcy5zaW5nbGVGYWxzZSA9IHNpbmdsZUZhbHNlO1xuICAgIHRoaXMub3B0aW9uYWwgPSBvcHRpb25hbDtcbiAgICB0aGlzLmRlZmF1bHRDYXNlID0gZGVmYXVsdENhc2U7XG4gIH1cblxuICBwdWJsaWMgZW1pdChzYjogU2NyaXB0QnVpbGRlciwgbm9kZTogdHMuTm9kZSwgb3B0aW9uc0luOiBWaXNpdE9wdGlvbnMpOiB2b2lkIHtcbiAgICBjb25zdCBub0Nhc3RPcHRpb25zID0gc2Iubm9DYXN0T3B0aW9ucyhvcHRpb25zSW4pO1xuICAgIGNvbnN0IG9wdGlvbnMgPSBzYi5wdXNoVmFsdWVPcHRpb25zKHNiLm5vQ2FzdE9wdGlvbnMob3B0aW9uc0luKSk7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLXVubmVjZXNzYXJ5LXR5cGUtYW5ub3RhdGlvblxuICAgIGxldCB0eXBlSW46IHRzLlR5cGUgfCB1bmRlZmluZWQgPSB0aGlzLnR5cGUgPT09IHVuZGVmaW5lZCA/IG9wdGlvbnNJbi5jYXN0IDogdGhpcy50eXBlO1xuICAgIGxldCBjaGVja1VuZGVmaW5lZFNpbmdsZSA9IGZhbHNlO1xuICAgIGxldCBjaGVja0ZhbHNlU2luZ2xlID0gZmFsc2U7XG4gICAgaWYgKFxuICAgICAgdHlwZUluICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMuc2luZ2xlICYmXG4gICAgICAodGhpcy5vcHRpb25hbCB8fCBoYXNVbmRlZmluZWQoc2IuY29udGV4dCwgbm9kZSwgdHlwZUluKSkgJiZcbiAgICAgIHRoaXMuc2luZ2xlVW5kZWZpbmVkICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHR5cGVJbiA9IHRzVXRpbHMudHlwZV8uZ2V0Tm9uTnVsbGFibGVUeXBlKHR5cGVJbik7XG4gICAgICBjaGVja1VuZGVmaW5lZFNpbmdsZSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHR5cGVJbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLnNpbmdsZSAmJlxuICAgICAgaGFzQm9vbGVhbkZhbHNlKHNiLmNvbnRleHQsIG5vZGUsIHR5cGVJbikgJiZcbiAgICAgIHRoaXMuc2luZ2xlRmFsc2UgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdHlwZUluID0gdHNVdGlscy50eXBlXy5maWx0ZXJVbmlvbihcbiAgICAgICAgc2IuY29udGV4dC50eXBlQ2hlY2tlcixcbiAgICAgICAgdHlwZUluLFxuICAgICAgICAodHBlKSA9PiAhaXNCb29sZWFuRmFsc2Uoc2IuY29udGV4dCwgbm9kZSwgdHBlKSxcbiAgICAgICk7XG4gICAgICBjaGVja0ZhbHNlU2luZ2xlID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IHR5cGVJbjtcbiAgICBjb25zdCB0eXBlcyA9IHR5cGUgPT09IHVuZGVmaW5lZCA/IHRoaXMudHlwZXMgOiB0aGlzLnR5cGVzLmZpbHRlcigodGVzdFR5cGUpID0+IHRlc3RUeXBlLmhhc1R5cGUodHlwZSkpO1xuXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIHJlYWRvbmx5LWFycmF5XG4gICAgY29uc3QgZ3JvdXBlZFR5cGVzID0gbmV3IE1hcDxQcm9jZXNzLCBGb3JUeXBlW10+KCk7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3Atc3RhdGVtZW50XG4gICAgZm9yIChjb25zdCBmb3JUeXBlIG9mIHR5cGVzKSB7XG4gICAgICBjb25zdCBtdXRhYmxlVHlwZXMgPSBncm91cGVkVHlwZXMuZ2V0KGZvclR5cGUucHJvY2Vzcyk7XG4gICAgICBpZiAobXV0YWJsZVR5cGVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZ3JvdXBlZFR5cGVzLnNldChmb3JUeXBlLnByb2Nlc3MsIFtmb3JUeXBlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtdXRhYmxlVHlwZXMucHVzaChmb3JUeXBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZGVmYXVsdENhc2UgPVxuICAgICAgdGhpcy5kZWZhdWx0Q2FzZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gKGlubmVyT3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RST1AnKTtcbiAgICAgICAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLnRocm93VHlwZUVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIDogdGhpcy5kZWZhdWx0Q2FzZTtcblxuICAgIGlmICh0aGlzLnNpbmdsZSAmJiAodHlwZXMubGVuZ3RoICE9PSAxIHx8IChjaGVja1VuZGVmaW5lZFNpbmdsZSAmJiBjaGVja0ZhbHNlU2luZ2xlKSkpIHtcbiAgICAgIHNiLmNvbnRleHQucmVwb3J0RXJyb3Iobm9kZSwgRGlhZ25vc3RpY0NvZGUuVW5rbm93blR5cGUsIERpYWdub3N0aWNNZXNzYWdlLlJlc29sdmVPbmVUeXBlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlZmF1bHRDYXNlKG5vQ2FzdE9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoZ3JvdXBlZFR5cGVzLnNpemUgPT09IDEpIHtcbiAgICAgIGNvbnN0IHNpbmdsZVVuZGVmaW5lZCA9IHRoaXMuc2luZ2xlVW5kZWZpbmVkO1xuICAgICAgY29uc3Qgc2luZ2xlRmFsc2UgPSB0aGlzLnNpbmdsZUZhbHNlO1xuICAgICAgaWYgKGNoZWNrVW5kZWZpbmVkU2luZ2xlICYmIHNpbmdsZVVuZGVmaW5lZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIHNiLmhlbHBlcnMuaWYoe1xuICAgICAgICAgICAgY29uZGl0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIFt2YWx1ZSwgdmFsdWVdXG4gICAgICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnRFVQJyk7XG4gICAgICAgICAgICAgIC8vIFtudW1iZXIsIHZhbHVlXVxuICAgICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ1NJWkUnKTtcbiAgICAgICAgICAgICAgLy8gW251bWJlciwgbnVtYmVyLCB2YWx1ZV1cbiAgICAgICAgICAgICAgc2IuZW1pdFB1c2hJbnQobm9kZSwgMCk7XG4gICAgICAgICAgICAgIC8vIFtib29sZWFuLCB2YWx1ZV1cbiAgICAgICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdOVU1FUVVBTCcpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdoZW5UcnVlOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHNpbmdsZVVuZGVmaW5lZChvcHRpb25zKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3aGVuRmFsc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgdHlwZXNbMF0ucHJvY2Vzcyhub0Nhc3RPcHRpb25zKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGNoZWNrRmFsc2VTaW5nbGUgJiYgc2luZ2xlRmFsc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICBzYi5oZWxwZXJzLmlmKHtcbiAgICAgICAgICAgIGNvbmRpdGlvbjogKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBbdmFsdWUsIHZhbHVlXVxuICAgICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RVUCcpO1xuICAgICAgICAgICAgICAvLyBbbnVtYmVyLCB2YWx1ZV1cbiAgICAgICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdTSVpFJyk7XG4gICAgICAgICAgICAgIC8vIFtudW1iZXIsIG51bWJlciwgdmFsdWVdXG4gICAgICAgICAgICAgIHNiLmVtaXRQdXNoSW50KG5vZGUsIDApO1xuICAgICAgICAgICAgICAvLyBbYm9vbGVhbiwgdmFsdWVdXG4gICAgICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnTlVNRVFVQUwnKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3aGVuVHJ1ZTogKCkgPT4ge1xuICAgICAgICAgICAgICBzaW5nbGVGYWxzZShvcHRpb25zKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3aGVuRmFsc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgdHlwZXNbMF0ucHJvY2Vzcyhub0Nhc3RPcHRpb25zKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlc1swXS5wcm9jZXNzKG5vQ2FzdE9wdGlvbnMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBncm91cGVkVHlwZXNPcmRlcmVkID0gXy5zb3J0QnkoXG4gICAgICAgIFsuLi5ncm91cGVkVHlwZXMuZW50cmllcygpXSxcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIHJlYWRvbmx5LWFycmF5XG4gICAgICAgIFsodmFsdWU6IFtQcm9jZXNzLCBGb3JUeXBlW11dKSA9PiB2YWx1ZVsxXS5sZW5ndGhdLFxuICAgICAgKTtcbiAgICAgIGxldCBjYXNlVHlwZXMgPSBncm91cGVkVHlwZXNPcmRlcmVkO1xuICAgICAgaWYgKHRoaXMuZGVmYXVsdENhc2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjYXNlVHlwZXMgPSBncm91cGVkVHlwZXNPcmRlcmVkLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgZGVmYXVsdENhc2UgPSAoaW5uZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgY29uc3QgW3Byb2Nlc3NUeXBlXSA9IGdyb3VwZWRUeXBlc09yZGVyZWRbZ3JvdXBlZFR5cGVzT3JkZXJlZC5sZW5ndGggLSAxXTtcbiAgICAgICAgICBwcm9jZXNzVHlwZShpbm5lck9wdGlvbnMpO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICBub2RlLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBzYi5oZWxwZXJzLmNhc2UoXG4gICAgICAgICAgY2FzZVR5cGVzLm1hcCgoW3Byb2Nlc3NUeXBlLCBmb3JUeXBlc10pID0+ICh7XG4gICAgICAgICAgICBjb25kaXRpb246ICgpID0+IHtcbiAgICAgICAgICAgICAgLy8gW3ZhbCwgdmFsXVxuICAgICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RVUCcpO1xuICAgICAgICAgICAgICAvLyBbYm9vbGVhbiwgdmFsXVxuICAgICAgICAgICAgICBmb3JUeXBlc1swXS5pc1J1bnRpbWVUeXBlKG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAgIC8vIFtib29sZWFuLCB2YWxdXG4gICAgICAgICAgICAgIGZvclR5cGVzLnNsaWNlKDEpLmZvckVhY2goKGZvclR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBbdmFsLCBib29sZWFuLCB2YWxdXG4gICAgICAgICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdPVkVSJyk7XG4gICAgICAgICAgICAgICAgLy8gW2Jvb2xlYW4sIGJvb2xlYW4sIHZhbF1cbiAgICAgICAgICAgICAgICBmb3JUeXBlLmlzUnVudGltZVR5cGUob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgLy8gW2Jvb2xlYW4sIHZhbF1cbiAgICAgICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0JPT0xPUicpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3aGVuVHJ1ZTogKCkgPT4ge1xuICAgICAgICAgICAgICBwcm9jZXNzVHlwZShub0Nhc3RPcHRpb25zKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIGRlZmF1bHRDYXNlKG5vQ2FzdE9wdGlvbnMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19