@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
231 lines (229 loc) • 43.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const client_common_1 = require("@neo-one/client-common");
const ts_utils_1 = require("@neo-one/ts-utils");
const lodash_1 = tslib_1.__importDefault(require("lodash"));
const Helper_1 = require("../Helper");
const buffer_1 = require("./buffer");
const map_1 = require("./map");
class WrapValRecursiveHelper extends Helper_1.Helper {
constructor(options) {
super();
this.checkValue = options.checkValue === undefined ? false : options.checkValue;
this.type = options.type;
this.optional = options.optional;
}
emit(sb, node, options) {
if (this.type === undefined) {
return;
}
const createHandleValue = (hasValue, body) => (innerOptions) => {
if (!innerOptions.pushValue) {
if (hasValue) {
sb.emitOp(node, 'DROP');
}
return;
}
body(innerOptions);
};
const handleUndefined = createHandleValue(false, (innerOptions) => {
sb.emitOp(node, 'DROP');
sb.emitHelper(node, innerOptions, sb.helpers.wrapUndefined);
});
const handleBoolean = createHandleValue(true, (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.wrapBoolean);
});
const type = ts_utils_1.tsUtils.type_.getNonNullableType(this.type);
sb.emitHelper(node, options, sb.helpers.forBuiltinType({
type: this.type,
single: true,
singleUndefined: handleUndefined,
singleFalse: handleBoolean,
optional: this.optional,
array: createHandleValue(true, (innerOptions) => {
const elements = ts_utils_1.tsUtils.type_.getTupleElements(type);
if (elements === undefined) {
sb.emitHelper(node, innerOptions, sb.helpers.arrMap({
map: (innerInnerOptions) => {
sb.emitHelper(node, innerInnerOptions, sb.helpers.wrapValRecursive({
checkValue: this.checkValue,
type: sb.context.analysis.getNotAnyType(node, ts_utils_1.tsUtils.type_.getArrayType(type)),
}));
},
}));
}
else {
const tupleElements = elements.map((element) => {
const constraintType = ts_utils_1.tsUtils.type_.getConstraint(element);
return sb.context.analysis.getNotAnyType(node, constraintType === undefined ? element : constraintType);
});
lodash_1.default.reverse([...tupleElements]).forEach((element, idx) => {
sb.emitOp(node, 'DUP');
sb.emitPushInt(node, elements.length - idx - 1);
sb.emitOp(node, 'PICKITEM');
sb.emitHelper(node, innerOptions, sb.helpers.wrapValRecursive({ checkValue: this.checkValue, type: element }));
sb.emitOp(node, 'SWAP');
});
sb.emitOp(node, 'DROP');
sb.emitPushInt(node, elements.length);
sb.emitOp(node, 'PACK');
}
sb.emitHelper(node, innerOptions, sb.helpers.wrapArray);
}),
arrayStorage: createHandleValue(true, (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.throwTypeError);
}),
boolean: handleBoolean,
buffer: createHandleValue(true, (innerOptions) => {
if (this.checkValue &&
(buffer_1.isAddress(sb.context, node, type) ||
buffer_1.isHash256(sb.context, node, type) ||
buffer_1.isPublicKey(sb.context, node, type))) {
sb.emitOp(node, 'DUP');
sb.emitOp(node, 'SIZE');
sb.emitHelper(node, innerOptions, sb.helpers.if({
condition: () => {
const expectedSize = buffer_1.isAddress(sb.context, node, type)
? client_common_1.common.UINT160_BUFFER_BYTES
: buffer_1.isHash256(sb.context, node, type)
? client_common_1.common.UINT256_BUFFER_BYTES
: client_common_1.common.ECPOINT_BUFFER_BYTES;
sb.emitPushInt(node, expectedSize);
sb.emitOp(node, 'NUMEQUAL');
},
whenFalse: () => {
sb.emitOp(node, 'DROP');
sb.emitHelper(node, innerOptions, sb.helpers.throwTypeError);
},
}));
}
sb.emitHelper(node, innerOptions, sb.helpers.wrapBuffer);
}),
null: createHandleValue(false, (innerOptions) => {
sb.emitOp(node, 'DROP');
sb.emitHelper(node, innerOptions, sb.helpers.wrapNull);
}),
number: createHandleValue(true, (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.wrapNumber);
}),
object: createHandleValue(true, (innerOptions) => {
sb.emitHelper(node, options, sb.helpers.createObject);
ts_utils_1.tsUtils.type_.getProperties(type).forEach((prop) => {
const propType = sb.context.analysis.getTypeOfSymbol(prop, node);
sb.emitOp(node, 'TUCK');
sb.emitOp(node, 'OVER');
sb.emitPushString(node, ts_utils_1.tsUtils.symbol.getName(prop));
sb.emitOp(node, 'OVER');
sb.emitOp(node, 'OVER');
sb.emitHelper(node, innerOptions, sb.helpers.if({
condition: () => {
sb.emitOp(node, 'HASKEY');
},
whenTrue: () => {
sb.emitOp(node, 'PICKITEM');
sb.emitHelper(node, innerOptions, sb.helpers.wrapValRecursive({ type: propType }));
},
whenFalse: () => {
sb.emitOp(node, 'DROP');
sb.emitOp(node, 'DROP');
sb.emitHelper(node, innerOptions, sb.helpers.wrapUndefined);
},
}));
sb.emitPushString(node, ts_utils_1.tsUtils.symbol.getName(prop));
sb.emitOp(node, 'SWAP');
sb.emitHelper(node, innerOptions, sb.helpers.setDataPropertyObjectProperty);
sb.emitOp(node, 'SWAP');
});
sb.emitOp(node, 'NIP');
}),
string: createHandleValue(true, (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.wrapString);
}),
symbol: createHandleValue(true, (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.wrapSymbol);
}),
undefined: handleUndefined,
map: createHandleValue(true, (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.mapMap({
map: (innerInnerOptions) => {
let keyType;
let valueType;
if (map_1.isOnlyMap(sb.context, node, type)) {
const localKeyType = ts_utils_1.tsUtils.type_.getTypeArgumentsArray(type)[0];
keyType =
localKeyType === undefined ? undefined : sb.context.analysis.getNotAnyType(node, localKeyType);
const localValueType = ts_utils_1.tsUtils.type_.getTypeArgumentsArray(type)[1];
valueType =
localValueType === undefined ? undefined : sb.context.analysis.getNotAnyType(node, localValueType);
}
sb.emitHelper(node, innerInnerOptions, sb.helpers.wrapValRecursive({
checkValue: this.checkValue,
type: keyType,
}));
sb.emitOp(node, 'SWAP');
sb.emitHelper(node, innerInnerOptions, sb.helpers.wrapValRecursive({
checkValue: this.checkValue,
type: valueType,
}));
sb.emitOp(node, 'SWAP');
},
}));
sb.emitHelper(node, innerOptions, sb.helpers.wrapMap);
}),
mapStorage: createHandleValue(true, (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.throwTypeError);
}),
set: createHandleValue(true, (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.throwTypeError);
}),
setStorage: createHandleValue(true, (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.throwTypeError);
}),
error: createHandleValue(true, (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.throwTypeError);
}),
forwardValue: createHandleValue(true, (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.wrapForwardValue);
}),
iteratorResult: createHandleValue(true, (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.throwTypeError);
}),
iterable: createHandleValue(true, (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.throwTypeError);
}),
iterableIterator: createHandleValue(true, (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.throwTypeError);
}),
transaction: createHandleValue(true, (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.wrapTransaction);
}),
output: createHandleValue(true, (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.wrapOutput);
}),
attribute: createHandleValue(true, (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.wrapAttribute);
}),
input: createHandleValue(true, (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.wrapInput);
}),
account: createHandleValue(true, (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.wrapAccount);
}),
asset: createHandleValue(true, (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.wrapAsset);
}),
contract: createHandleValue(true, (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.wrapContract);
}),
header: createHandleValue(true, (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.wrapHeader);
}),
block: createHandleValue(true, (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.wrapBlock);
}),
}));
}
}
exports.WrapValRecursiveHelper = WrapValRecursiveHelper;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldyYXBWYWxSZWN1cnNpdmVIZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMERBQWdEO0FBQ2hELGdEQUE0QztBQUM1Qyw0REFBdUI7QUFJdkIsc0NBQW1DO0FBQ25DLHFDQUE2RDtBQUM3RCwrQkFBa0M7QUFVbEMsTUFBYSxzQkFBdUIsU0FBUSxlQUFNO0lBS2hELFlBQW1CLE9BQXNDO1FBQ3ZELEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ2hGLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDbkMsQ0FBQztJQUVNLElBQUksQ0FBQyxFQUFpQixFQUFFLElBQWEsRUFBRSxPQUFxQjtRQUNqRSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQzNCLE9BQU87U0FDUjtRQUVELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxRQUFpQixFQUFFLElBQXFDLEVBQUUsRUFBRSxDQUFDLENBQ3RGLFlBQTBCLEVBQzFCLEVBQUU7WUFDRixJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRTtnQkFDM0IsSUFBSSxRQUFRLEVBQUU7b0JBQ1osRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7aUJBQ3pCO2dCQUVELE9BQU87YUFDUjtZQUVELElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyQixDQUFDLENBQUM7UUFFRixNQUFNLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRTtZQUNoRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FB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QVksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzVELENBQUMsQ0FBQztZQUNGLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRTtnQkFDOUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUQsQ0FBQyxDQUFDO1lBQ0YsUUFBUSxFQUFFLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFO2dCQUNqRCxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUM3RCxDQUFDLENBQUM7WUFDRixNQUFNLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUMsWUFBWSxFQUFFLEVBQUU7Z0JBQy9DLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzNELENBQUMsQ0FBQztZQUNGLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRTtnQkFDOUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUQsQ0FBQyxDQUFDO1NBQ0gsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0NBQ0Y7QUE1U0Qsd0RBNFNDIiwiZmlsZSI6Im5lby1vbmUtc21hcnQtY29udHJhY3QtY29tcGlsZXIvc3JjL2NvbXBpbGUvaGVscGVyL3R5cGVzL1dyYXBWYWxSZWN1cnNpdmVIZWxwZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21tb24gfSBmcm9tICdAbmVvLW9uZS9jbGllbnQtY29tbW9uJztcbmltcG9ydCB7IHRzVXRpbHMgfSBmcm9tICdAbmVvLW9uZS90cy11dGlscyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuaW1wb3J0IHsgU2NyaXB0QnVpbGRlciB9IGZyb20gJy4uLy4uL3NiJztcbmltcG9ydCB7IFZpc2l0T3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEhlbHBlciB9IGZyb20gJy4uL0hlbHBlcic7XG5pbXBvcnQgeyBpc0FkZHJlc3MsIGlzSGFzaDI1NiwgaXNQdWJsaWNLZXkgfSBmcm9tICcuL2J1ZmZlcic7XG5pbXBvcnQgeyBpc09ubHlNYXAgfSBmcm9tICcuL21hcCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV3JhcFZhbFJlY3Vyc2l2ZUhlbHBlck9wdGlvbnMge1xuICByZWFkb25seSBjaGVja1ZhbHVlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdHlwZTogdHMuVHlwZSB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgb3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG4vLyBJbnB1dDogW3ZhbF1cbi8vIE91dHB1dDogW3ZhbHVlXVxuZXhwb3J0IGNsYXNzIFdyYXBWYWxSZWN1cnNpdmVIZWxwZXIgZXh0ZW5kcyBIZWxwZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGNoZWNrVmFsdWU6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgdHlwZTogdHMuVHlwZSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25hbD86IGJvb2xlYW47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFdyYXBWYWxSZWN1cnNpdmVIZWxwZXJPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNoZWNrVmFsdWUgPSBvcHRpb25zLmNoZWNrVmFsdWUgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogb3B0aW9ucy5jaGVja1ZhbHVlO1xuICAgIHRoaXMudHlwZSA9IG9wdGlvbnMudHlwZTtcbiAgICB0aGlzLm9wdGlvbmFsID0gb3B0aW9ucy5vcHRpb25hbDtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KHNiOiBTY3JpcHRCdWlsZGVyLCBub2RlOiB0cy5Ob2RlLCBvcHRpb25zOiBWaXNpdE9wdGlvbnMpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50eXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjcmVhdGVIYW5kbGVWYWx1ZSA9IChoYXNWYWx1ZTogYm9vbGVhbiwgYm9keTogKG9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4gdm9pZCkgPT4gKFxuICAgICAgaW5uZXJPcHRpb25zOiBWaXNpdE9wdGlvbnMsXG4gICAgKSA9PiB7XG4gICAgICBpZiAoIWlubmVyT3B0aW9ucy5wdXNoVmFsdWUpIHtcbiAgICAgICAgaWYgKGhhc1ZhbHVlKSB7XG4gICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdEUk9QJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGJvZHkoaW5uZXJPcHRpb25zKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVW5kZWZpbmVkID0gY3JlYXRlSGFuZGxlVmFsdWUoZmFsc2UsIChpbm5lck9wdGlvbnMpID0+IHtcbiAgICAgIHNiLmVtaXRPcChub2RlLCAnRFJPUCcpO1xuICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMud3JhcFVuZGVmaW5lZCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBoYW5kbGVCb29sZWFuID0gY3JlYXRlSGFuZGxlVmFsdWUodHJ1ZSwgKGlubmVyT3B0aW9ucykgPT4ge1xuICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMud3JhcEJvb2xlYW4pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdHlwZSA9IHRzVXRpbHMudHlwZV8uZ2V0Tm9uTnVsbGFibGVUeXBlKHRoaXMudHlwZSk7XG5cbiAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgbm9kZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBzYi5oZWxwZXJzLmZvckJ1aWx0aW5UeXBlKHtcbiAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICBzaW5nbGU6IHRydWUsXG4gICAgICAgIHNpbmdsZVVuZGVmaW5lZDogaGFuZGxlVW5kZWZpbmVkLFxuICAgICAgICBzaW5nbGVGYWxzZTogaGFuZGxlQm9vbGVhbixcbiAgICAgICAgb3B0aW9uYWw6IHRoaXMub3B0aW9uYWwsXG4gICAgICAgIGFycmF5OiBjcmVhdGVIYW5kbGVWYWx1ZSh0cnVlLCAoaW5uZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudHMgPSB0c1V0aWxzLnR5cGVfLmdldFR1cGxlRWxlbWVudHModHlwZSk7XG4gICAgICAgICAgaWYgKGVsZW1lbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgIGlubmVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgc2IuaGVscGVycy5hcnJNYXAoe1xuICAgICAgICAgICAgICAgIG1hcDogKGlubmVySW5uZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICAgICAgICBpbm5lcklubmVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgc2IuaGVscGVycy53cmFwVmFsUmVjdXJzaXZlKHtcbiAgICAgICAgICAgICAgICAgICAgICBjaGVja1ZhbHVlOiB0aGlzLmNoZWNrVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogc2IuY29udGV4dC5hbmFseXNpcy5nZXROb3RBbnlUeXBlKG5vZGUsIHRzVXRpbHMudHlwZV8uZ2V0QXJyYXlUeXBlKHR5cGUpKSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdHVwbGVFbGVtZW50cyA9IGVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBjb25zdHJhaW50VHlwZSA9IHRzVXRpbHMudHlwZV8uZ2V0Q29uc3RyYWludChlbGVtZW50KTtcblxuICAgICAgICAgICAgICByZXR1cm4gc2IuY29udGV4dC5hbmFseXNpcy5nZXROb3RBbnlUeXBlKG5vZGUsIGNvbnN0cmFpbnRUeXBlID09PSB1bmRlZmluZWQgPyBlbGVtZW50IDogY29uc3RyYWludFR5cGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBfLnJldmVyc2UoWy4uLnR1cGxlRWxlbWVudHNdKS5mb3JFYWNoKChlbGVtZW50LCBpZHgpID0+IHtcbiAgICAgICAgICAgICAgLy8gW2FyciwgYXJyXVxuICAgICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RVUCcpO1xuICAgICAgICAgICAgICAvLyBbaWR4LCBhcnIsIGFycl1cbiAgICAgICAgICAgICAgc2IuZW1pdFB1c2hJbnQobm9kZSwgZWxlbWVudHMubGVuZ3RoIC0gaWR4IC0gMSk7XG4gICAgICAgICAgICAgIC8vIFt2YWx1ZSwgYXJyXVxuICAgICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ1BJQ0tJVEVNJyk7XG4gICAgICAgICAgICAgIC8vIFt2YWwsIGFycl1cbiAgICAgICAgICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICAgIGlubmVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgICBzYi5oZWxwZXJzLndyYXBWYWxSZWN1cnNpdmUoeyBjaGVja1ZhbHVlOiB0aGlzLmNoZWNrVmFsdWUsIHR5cGU6IGVsZW1lbnQgfSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIC8vIFthcnIsIHZhbF1cbiAgICAgICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdTV0FQJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIFsuLi52YWxdXG4gICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RST1AnKTtcbiAgICAgICAgICAgIC8vIFtudW1iZXIsIC4uLnZhbF1cbiAgICAgICAgICAgIHNiLmVtaXRQdXNoSW50KG5vZGUsIGVsZW1lbnRzLmxlbmd0aCk7XG4gICAgICAgICAgICAvLyBbYXJyXVxuICAgICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdQQUNLJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLndyYXBBcnJheSk7XG4gICAgICAgIH0pLFxuICAgICAgICBhcnJheVN0b3JhZ2U6IGNyZWF0ZUhhbmRsZVZhbHVlKHRydWUsIChpbm5lck9wdGlvbnMpID0+IHtcbiAgICAgICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy50aHJvd1R5cGVFcnJvcik7XG4gICAgICAgIH0pLFxuICAgICAgICBib29sZWFuOiBoYW5kbGVCb29sZWFuLFxuICAgICAgICBidWZmZXI6IGNyZWF0ZUhhbmRsZVZhbHVlKHRydWUsIChpbm5lck9wdGlvbnMpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNoZWNrVmFsdWUgJiZcbiAgICAgICAgICAgIChpc0FkZHJlc3Moc2IuY29udGV4dCwgbm9kZSwgdHlwZSkgfHxcbiAgICAgICAgICAgICAgaXNIYXNoMjU2KHNiLmNvbnRleHQsIG5vZGUsIHR5cGUpIHx8XG4gICAgICAgICAgICAgIGlzUHVibGljS2V5KHNiLmNvbnRleHQsIG5vZGUsIHR5cGUpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gW2J1ZmZlciwgYnVmZmVyXVxuICAgICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdEVVAnKTtcbiAgICAgICAgICAgIC8vIFtzaXplLCBidWZmZXJdXG4gICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ1NJWkUnKTtcbiAgICAgICAgICAgIC8vIFtidWZmZXJdXG4gICAgICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICBpbm5lck9wdGlvbnMsXG4gICAgICAgICAgICAgIHNiLmhlbHBlcnMuaWYoe1xuICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRTaXplID0gaXNBZGRyZXNzKHNiLmNvbnRleHQsIG5vZGUsIHR5cGUpXG4gICAgICAgICAgICAgICAgICAgID8gY29tbW9uLlVJTlQxNjBfQlVGRkVSX0JZVEVTXG4gICAgICAgICAgICAgICAgICAgIDogaXNIYXNoMjU2KHNiLmNvbnRleHQsIG5vZGUsIHR5cGUpXG4gICAgICAgICAgICAgICAgICAgID8gY29tbW9uLlVJTlQyNTZfQlVGRkVSX0JZVEVTXG4gICAgICAgICAgICAgICAgICAgIDogY29tbW9uLkVDUE9JTlRfQlVGRkVSX0JZVEVTO1xuICAgICAgICAgICAgICAgICAgLy8gW251bWJlciwgbnVtYmVyLCBidWZmZXJdXG4gICAgICAgICAgICAgICAgICBzYi5lbWl0UHVzaEludChub2RlLCBleHBlY3RlZFNpemUpO1xuICAgICAgICAgICAgICAgICAgLy8gW2Jvb2xlYW4sIGJ1ZmZlcl1cbiAgICAgICAgICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnTlVNRVFVQUwnKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHdoZW5GYWxzZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdEUk9QJyk7XG4gICAgICAgICAgICAgICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy50aHJvd1R5cGVFcnJvcik7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy53cmFwQnVmZmVyKTtcbiAgICAgICAgfSksXG4gICAgICAgIG51bGw6IGNyZWF0ZUhhbmRsZVZhbHVlKGZhbHNlLCAoaW5uZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdEUk9QJyk7XG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMud3JhcE51bGwpO1xuICAgICAgICB9KSxcbiAgICAgICAgbnVtYmVyOiBjcmVhdGVIYW5kbGVWYWx1ZSh0cnVlLCAoaW5uZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMud3JhcE51bWJlcik7XG4gICAgICAgIH0pLFxuICAgICAgICBvYmplY3Q6IGNyZWF0ZUhhbmRsZVZhbHVlKHRydWUsIChpbm5lck9wdGlvbnMpID0+IHtcbiAgICAgICAgICAvLyBbb2JqZWN0VmFsLCBtYXBdXG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBvcHRpb25zLCBzYi5oZWxwZXJzLmNyZWF0ZU9iamVjdCk7XG4gICAgICAgICAgdHNVdGlscy50eXBlXy5nZXRQcm9wZXJ0aWVzKHR5cGUpLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BUeXBlID0gc2IuY29udGV4dC5hbmFseXNpcy5nZXRUeXBlT2ZTeW1ib2wocHJvcCwgbm9kZSk7XG4gICAgICAgICAgICAvLyBbb2JqZWN0VmFsLCBtYXAsIG9iamVjdFZhbF1cbiAgICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnVFVDSycpO1xuICAgICAgICAgICAgLy8gW21hcCwgb2JqZWN0VmFsLCBtYXAsIG9iamVjdFZhbF1cbiAgICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnT1ZFUicpO1xuICAgICAgICAgICAgLy8gW3N0cmluZywgbWFwLCBvYmplY3RWYWwsIG1hcCwgb2JqZWN0VmFsXVxuICAgICAgICAgICAgc2IuZW1pdFB1c2hTdHJpbmcobm9kZSwgdHNVdGlscy5zeW1ib2wuZ2V0TmFtZShwcm9wKSk7XG4gICAgICAgICAgICAvLyBbbWFwLCBzdHJpbmcsIG1hcCwgb2JqZWN0VmFsLCBtYXAsIG9iamVjdFZhbF1cbiAgICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnT1ZFUicpO1xuICAgICAgICAgICAgLy8gW3N0cmluZywgbWFwLCBzdHJpbmcsIG1hcCwgb2JqZWN0VmFsLCBtYXAsIG9iamVjdFZhbF1cbiAgICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnT1ZFUicpO1xuICAgICAgICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgaW5uZXJPcHRpb25zLFxuICAgICAgICAgICAgICBzYi5oZWxwZXJzLmlmKHtcbiAgICAgICAgICAgICAgICBjb25kaXRpb246ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIC8vIFtib29sZWFuLCBzdHJpbmcsIG1hcCwgb2JqZWN0VmFsLCBtYXAsIG9iamVjdFZhbF1cbiAgICAgICAgICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnSEFTS0VZJyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB3aGVuVHJ1ZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gW3ZhbHVlLCBvYmplY3RWYWwsIG1hcCwgb2JqZWN0VmFsXVxuICAgICAgICAgICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdQSUNLSVRFTScpO1xuICAgICAgICAgICAgICAgICAgLy8gW3ZhbCwgb2JqZWN0VmFsLCBtYXAsIG9iamVjdFZhbF1cbiAgICAgICAgICAgICAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLndyYXBWYWxSZWN1cnNpdmUoeyB0eXBlOiBwcm9wVHlwZSB9KSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB3aGVuRmFsc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIC8vIFttYXAsIG9iamVjdFZhbCwgbWFwLCBvYmplY3RWYWxdXG4gICAgICAgICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RST1AnKTtcbiAgICAgICAgICAgICAgICAgIC8vIFtvYmplY3RWYWwsIG1hcCwgb2JqZWN0VmFsXVxuICAgICAgICAgICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdEUk9QJyk7XG4gICAgICAgICAgICAgICAgICAvLyBbdmFsLCBvYmplY3RWYWwsIG1hcCwgb2JqZWN0VmFsXVxuICAgICAgICAgICAgICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMud3JhcFVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gW3N0cmluZywgdmFsLCBvYmplY3RWYWwsIG1hcCwgb2JqZWN0VmFsXVxuICAgICAgICAgICAgc2IuZW1pdFB1c2hTdHJpbmcobm9kZSwgdHNVdGlscy5zeW1ib2wuZ2V0TmFtZShwcm9wKSk7XG4gICAgICAgICAgICAvLyBbdmFsLCBzdHJpbmcsIG9iamVjdFZhbCwgbWFwLCBvYmplY3RWYWxdXG4gICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ1NXQVAnKTtcbiAgICAgICAgICAgIC8vIFttYXAsIG9iamVjdFZhbF1cbiAgICAgICAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLnNldERhdGFQcm9wZXJ0eU9iamVjdFByb3BlcnR5KTtcbiAgICAgICAgICAgIC8vIFtvYmplY3RWYWwsIG1hcF1cbiAgICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnU1dBUCcpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIFtvYmplY3RWYWxdXG4gICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdOSVAnKTtcbiAgICAgICAgfSksXG4gICAgICAgIHN0cmluZzogY3JlYXRlSGFuZGxlVmFsdWUodHJ1ZSwgKGlubmVyT3B0aW9ucykgPT4ge1xuICAgICAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLndyYXBTdHJpbmcpO1xuICAgICAgICB9KSxcbiAgICAgICAgc3ltYm9sOiBjcmVhdGVIYW5kbGVWYWx1ZSh0cnVlLCAoaW5uZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMud3JhcFN5bWJvbCk7XG4gICAgICAgIH0pLFxuICAgICAgICB1bmRlZmluZWQ6IGhhbmRsZVVuZGVmaW5lZCxcbiAgICAgICAgbWFwOiBjcmVhdGVIYW5kbGVWYWx1ZSh0cnVlLCAoaW5uZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBpbm5lck9wdGlvbnMsXG4gICAgICAgICAgICBzYi5oZWxwZXJzLm1hcE1hcCh7XG4gICAgICAgICAgICAgIG1hcDogKGlubmVySW5uZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGtleVR5cGU6IHRzLlR5cGUgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlVHlwZTogdHMuVHlwZSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoaXNPbmx5TWFwKHNiLmNvbnRleHQsIG5vZGUsIHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBsb2NhbEtleVR5cGUgPSB0c1V0aWxzLnR5cGVfLmdldFR5cGVBcmd1bWVudHNBcnJheSh0eXBlKVswXSBhcyB0cy5UeXBlIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAga2V5VHlwZSA9XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsS2V5VHlwZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2IuY29udGV4dC5hbmFseXNpcy5nZXROb3RBbnlUeXBlKG5vZGUsIGxvY2FsS2V5VHlwZSk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBsb2NhbFZhbHVlVHlwZSA9IHRzVXRpbHMudHlwZV8uZ2V0VHlwZUFyZ3VtZW50c0FycmF5KHR5cGUpWzFdIGFzIHRzLlR5cGUgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICB2YWx1ZVR5cGUgPVxuICAgICAgICAgICAgICAgICAgICBsb2NhbFZhbHVlVHlwZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2IuY29udGV4dC5hbmFseXNpcy5nZXROb3RBbnlUeXBlKG5vZGUsIGxvY2FsVmFsdWVUeXBlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgICAgIGlubmVySW5uZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgc2IuaGVscGVycy53cmFwVmFsUmVjdXJzaXZlKHtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tWYWx1ZTogdGhpcy5jaGVja1ZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBrZXlUeXBlLFxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ1NXQVAnKTtcbiAgICAgICAgICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgICAgIGlubmVySW5uZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgc2IuaGVscGVycy53cmFwVmFsUmVjdXJzaXZlKHtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tWYWx1ZTogdGhpcy5jaGVja1ZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiB2YWx1ZVR5cGUsXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnU1dBUCcpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy53cmFwTWFwKTtcbiAgICAgICAgfSksXG4gICAgICAgIG1hcFN0b3JhZ2U6IGNyZWF0ZUhhbmRsZVZhbHVlKHRydWUsIChpbm5lck9wdGlvbnMpID0+IHtcbiAgICAgICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy50aHJvd1R5cGVFcnJvcik7XG4gICAgICAgIH0pLFxuICAgICAgICBzZXQ6IGNyZWF0ZUhhbmRsZVZhbHVlKHRydWUsIChpbm5lck9wdGlvbnMpID0+IHtcbiAgICAgICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy50aHJvd1R5cGVFcnJvcik7XG4gICAgICAgIH0pLFxuICAgICAgICBzZXRTdG9yYWdlOiBjcmVhdGVIYW5kbGVWYWx1ZSh0cnVlLCAoaW5uZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMudGhyb3dUeXBlRXJyb3IpO1xuICAgICAgICB9KSxcbiAgICAgICAgZXJyb3I6IGNyZWF0ZUhhbmRsZVZhbHVlKHRydWUsIChpbm5lck9wdGlvbnMpID0+IHtcbiAgICAgICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy50aHJvd1R5cGVFcnJvcik7XG4gICAgICAgIH0pLFxuICAgICAgICBmb3J3YXJkVmFsdWU6IGNyZWF0ZUhhbmRsZVZhbHVlKHRydWUsIChpbm5lck9wdGlvbnMpID0+IHtcbiAgICAgICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy53cmFwRm9yd2FyZFZhbHVlKTtcbiAgICAgICAgfSksXG4gICAgICAgIGl0ZXJhdG9yUmVzdWx0OiBjcmVhdGVIYW5kbGVWYWx1ZSh0cnVlLCAoaW5uZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMudGhyb3dUeXBlRXJyb3IpO1xuICAgICAgICB9KSxcbiAgICAgICAgaXRlcmFibGU6IGNyZWF0ZUhhbmRsZVZhbHVlKHRydWUsIChpbm5lck9wdGlvbnMpID0+IHtcbiAgICAgICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy50aHJvd1R5cGVFcnJvcik7XG4gICAgICAgIH0pLFxuICAgICAgICBpdGVyYWJsZUl0ZXJhdG9yOiBjcmVhdGVIYW5kbGVWYWx1ZSh0cnVlLCAoaW5uZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMudGhyb3dUeXBlRXJyb3IpO1xuICAgICAgICB9KSxcbiAgICAgICAgdHJhbnNhY3Rpb246IGNyZWF0ZUhhbmRsZVZhbHVlKHRydWUsIChpbm5lck9wdGlvbnMpID0+IHtcbiAgICAgICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy53cmFwVHJhbnNhY3Rpb24pO1xuICAgICAgICB9KSxcbiAgICAgICAgb3V0cHV0OiBjcmVhdGVIYW5kbGVWYWx1ZSh0cnVlLCAoaW5uZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMud3JhcE91dHB1dCk7XG4gICAgICAgIH0pLFxuICAgICAgICBhdHRyaWJ1dGU6IGNyZWF0ZUhhbmRsZVZhbHVlKHRydWUsIChpbm5lck9wdGlvbnMpID0+IHtcbiAgICAgICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy53cmFwQXR0cmlidXRlKTtcbiAgICAgICAgfSksXG4gICAgICAgIGlucHV0OiBjcmVhdGVIYW5kbGVWYWx1ZSh0cnVlLCAoaW5uZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMud3JhcElucHV0KTtcbiAgICAgICAgfSksXG4gICAgICAgIGFjY291bnQ6IGNyZWF0ZUhhbmRsZVZhbHVlKHRydWUsIChpbm5lck9wdGlvbnMpID0+IHtcbiAgICAgICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy53cmFwQWNjb3VudCk7XG4gICAgICAgIH0pLFxuICAgICAgICBhc3NldDogY3JlYXRlSGFuZGxlVmFsdWUodHJ1ZSwgKGlubmVyT3B0aW9ucykgPT4ge1xuICAgICAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLndyYXBBc3NldCk7XG4gICAgICAgIH0pLFxuICAgICAgICBjb250cmFjdDogY3JlYXRlSGFuZGxlVmFsdWUodHJ1ZSwgKGlubmVyT3B0aW9ucykgPT4ge1xuICAgICAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLndyYXBDb250cmFjdCk7XG4gICAgICAgIH0pLFxuICAgICAgICBoZWFkZXI6IGNyZWF0ZUhhbmRsZVZhbHVlKHRydWUsIChpbm5lck9wdGlvbnMpID0+IHtcbiAgICAgICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy53cmFwSGVhZGVyKTtcbiAgICAgICAgfSksXG4gICAgICAgIGJsb2NrOiBjcmVhdGVIYW5kbGVWYWx1ZSh0cnVlLCAoaW5uZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMud3JhcEJsb2NrKTtcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICApO1xuICB9XG59XG4iXX0=