ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
514 lines (499 loc) • 58 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.BasicOpcodeBuilder = undefined;
var _util = require('@glimmer/util');
var _compiler = require('../../compiler');
var _opcodes = require('../../opcodes');
var _functions = require('../../syntax/functions');
var _rawBlock = require('../../syntax/raw-block');
var _rawBlock2 = _interopRequireDefault(_rawBlock);
var _content = require('../opcodes/content');
var _content2 = require('./content');
var content = _interopRequireWildcard(_content2);
var _vm = require('./vm');
var vm = _interopRequireWildcard(_vm);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
class Labels {
constructor() {
this.labels = (0, _util.dict)();
this.targets = [];
}
label(name, index) {
this.labels[name] = index;
}
target(at, Target, target) {
this.targets.push({ at, Target, target });
}
patch(program) {
let { targets, labels } = this;
for (let i = 0; i < targets.length; i++) {
let { at, target } = targets[i];
let goto = labels[target] - at;
program.heap.setbyaddr(at + 1, goto);
}
}
}
class BasicOpcodeBuilder {
constructor(env, meta, program) {
this.env = env;
this.meta = meta;
this.program = program;
this.labelsStack = new _util.Stack();
this.constants = program.constants;
this.heap = program.heap;
this.start = this.heap.malloc();
}
get pos() {
return (0, _util.typePos)(this.heap.size());
}
get nextPos() {
return this.heap.size();
}
upvars(count) {
return (0, _util.fillNulls)(count);
}
reserve(name) {
this.push(name, 0, 0, 0);
}
push(name, op1 = 0, op2 = 0, op3 = 0) {
this.heap.push(name);
this.heap.push(op1);
this.heap.push(op2);
this.heap.push(op3);
}
finalize() {
this.push(22 /* Return */);
this.heap.finishMalloc(this.start);
return this.start;
}
// args
pushArgs(synthetic) {
this.push(58 /* PushArgs */, synthetic === true ? 1 : 0);
}
// helpers
get labels() {
return (0, _util.expect)(this.labelsStack.current, 'bug: not in a label stack');
}
startLabels() {
this.labelsStack.push(new Labels());
}
stopLabels() {
let label = (0, _util.expect)(this.labelsStack.pop(), 'unbalanced push and pop labels');
label.patch(this.program);
}
// components
pushComponentManager(definition) {
this.push(56 /* PushComponentManager */, this.other(definition));
}
pushDynamicComponentManager() {
this.push(57 /* PushDynamicComponentManager */);
}
prepareArgs(state) {
this.push(59 /* PrepareArgs */, state);
}
createComponent(state, hasDefault, hasInverse) {
let flag = (hasDefault === true ? 1 : 0) | (hasInverse === true ? 1 : 0) << 1;
this.push(60 /* CreateComponent */, flag, state);
}
registerComponentDestructor(state) {
this.push(61 /* RegisterComponentDestructor */, state);
}
beginComponentTransaction() {
this.push(65 /* BeginComponentTransaction */);
}
commitComponentTransaction() {
this.push(66 /* CommitComponentTransaction */);
}
pushComponentOperations() {
this.push(62 /* PushComponentOperations */);
}
getComponentSelf(state) {
this.push(63 /* GetComponentSelf */, state);
}
getComponentLayout(state) {
this.push(64 /* GetComponentLayout */, state);
}
didCreateElement(state) {
this.push(67 /* DidCreateElement */, state);
}
didRenderLayout(state) {
this.push(68 /* DidRenderLayout */, state);
}
// partial
getPartialTemplate() {
this.push(69 /* GetPartialTemplate */);
}
resolveMaybeLocal(name) {
this.push(70 /* ResolveMaybeLocal */, this.string(name));
}
// debugger
debugger(symbols, evalInfo) {
this.push(71 /* Debugger */, this.constants.other(symbols), this.constants.array(evalInfo));
}
// content
dynamicContent(Opcode) {
this.push(26 /* DynamicContent */, this.other(Opcode));
}
cautiousAppend() {
this.dynamicContent(new content.OptimizedCautiousAppendOpcode());
}
trustingAppend() {
this.dynamicContent(new content.OptimizedTrustingAppendOpcode());
}
// dom
text(text) {
this.push(24 /* Text */, this.constants.string(text));
}
openPrimitiveElement(tag) {
this.push(27 /* OpenElement */, this.constants.string(tag));
}
openElementWithOperations(tag) {
this.push(28 /* OpenElementWithOperations */, this.constants.string(tag));
}
openDynamicElement() {
this.push(29 /* OpenDynamicElement */);
}
flushElement() {
this.push(33 /* FlushElement */);
}
closeElement() {
this.push(34 /* CloseElement */);
}
staticAttr(_name, _namespace, _value) {
let name = this.constants.string(_name);
let namespace = _namespace ? this.constants.string(_namespace) : 0;
let value = this.constants.string(_value);
this.push(30 /* StaticAttr */, name, value, namespace);
}
dynamicAttrNS(_name, _namespace, trusting) {
let name = this.constants.string(_name);
let namespace = this.constants.string(_namespace);
this.push(32 /* DynamicAttrNS */, name, namespace, trusting === true ? 1 : 0);
}
dynamicAttr(_name, trusting) {
let name = this.constants.string(_name);
this.push(31 /* DynamicAttr */, name, trusting === true ? 1 : 0);
}
comment(_comment) {
let comment = this.constants.string(_comment);
this.push(25 /* Comment */, comment);
}
modifier(_definition) {
this.push(35 /* Modifier */, this.other(_definition));
}
// lists
putIterator() {
this.push(54 /* PutIterator */);
}
enterList(start) {
this.reserve(52 /* EnterList */);
this.labels.target(this.pos, 52 /* EnterList */, start);
}
exitList() {
this.push(53 /* ExitList */);
}
iterate(breaks) {
this.reserve(55 /* Iterate */);
this.labels.target(this.pos, 55 /* Iterate */, breaks);
}
// expressions
setVariable(symbol) {
this.push(4 /* SetVariable */, symbol);
}
getVariable(symbol) {
this.push(5 /* GetVariable */, symbol);
}
getProperty(key) {
this.push(6 /* GetProperty */, this.string(key));
}
getBlock(symbol) {
this.push(8 /* GetBlock */, symbol);
}
hasBlock(symbol) {
this.push(9 /* HasBlock */, symbol);
}
hasBlockParams(symbol) {
this.push(10 /* HasBlockParams */, symbol);
}
concat(size) {
this.push(11 /* Concat */, size);
}
function(f) {
this.push(2 /* Function */, this.func(f));
}
load(register) {
this.push(17 /* Load */, register);
}
fetch(register) {
this.push(18 /* Fetch */, register);
}
dup(register = _opcodes.Register.sp, offset = 0) {
return this.push(15 /* Dup */, register, offset);
}
pop(count = 1) {
return this.push(16 /* Pop */, count);
}
// vm
pushRemoteElement() {
this.push(36 /* PushRemoteElement */);
}
popRemoteElement() {
this.push(37 /* PopRemoteElement */);
}
label(name) {
this.labels.label(name, this.nextPos);
}
pushRootScope(symbols, bindCallerScope) {
this.push(19 /* RootScope */, symbols, bindCallerScope ? 1 : 0);
}
pushChildScope() {
this.push(20 /* ChildScope */);
}
popScope() {
this.push(21 /* PopScope */);
}
returnTo(label) {
this.reserve(23 /* ReturnTo */);
this.labels.target(this.pos, 23 /* ReturnTo */, label);
}
pushDynamicScope() {
this.push(39 /* PushDynamicScope */);
}
popDynamicScope() {
this.push(40 /* PopDynamicScope */);
}
pushImmediate(value) {
this.push(13 /* Constant */, this.other(value));
}
primitive(_primitive) {
let flag = 0;
let primitive;
switch (typeof _primitive) {
case 'number':
if (_primitive % 1 === 0 && _primitive > 0) {
primitive = _primitive;
} else {
primitive = this.float(_primitive);
flag = 1;
}
break;
case 'string':
primitive = this.string(_primitive);
flag = 2;
break;
case 'boolean':
primitive = _primitive | 0;
flag = 3;
break;
case 'object':
// assume null
primitive = 2;
flag = 3;
break;
case 'undefined':
primitive = 3;
flag = 3;
break;
default:
throw new Error('Invalid primitive passed to pushPrimitive');
}
this.push(14 /* PrimitiveReference */, flag << 30 | primitive);
}
helper(func) {
this.push(1 /* Helper */, this.func(func));
}
pushBlock(block) {
this.push(7 /* PushBlock */, this.block(block));
}
bindDynamicScope(_names) {
this.push(38 /* BindDynamicScope */, this.names(_names));
}
enter(args) {
this.push(49 /* Enter */, args);
}
exit() {
this.push(50 /* Exit */);
}
return() {
this.push(22 /* Return */);
}
pushFrame() {
this.push(47 /* PushFrame */);
}
popFrame() {
this.push(48 /* PopFrame */);
}
compileDynamicBlock() {
this.push(41 /* CompileDynamicBlock */);
}
invokeDynamic(invoker) {
this.push(43 /* InvokeDynamic */, this.other(invoker));
}
invokeStatic(block, callerCount = 0) {
let { parameters } = block.symbolTable;
let calleeCount = parameters.length;
let count = Math.min(callerCount, calleeCount);
this.pushFrame();
if (count) {
this.pushChildScope();
for (let i = 0; i < count; i++) {
this.dup(_opcodes.Register.fp, callerCount - i);
this.setVariable(parameters[i]);
}
}
let _block = this.constants.block(block);
this.push(42 /* InvokeStatic */, _block);
if (count) {
this.popScope();
}
this.popFrame();
}
test(testFunc) {
let _func;
if (testFunc === 'const') {
_func = vm.ConstTest;
} else if (testFunc === 'simple') {
_func = vm.SimpleTest;
} else if (testFunc === 'environment') {
_func = vm.EnvironmentTest;
} else if (typeof testFunc === 'function') {
_func = testFunc;
} else {
throw new Error('unreachable');
}
let func = this.constants.function(_func);
this.push(51 /* Test */, func);
}
jump(target) {
this.reserve(44 /* Jump */);
this.labels.target(this.pos, 44 /* Jump */, target);
}
jumpIf(target) {
this.reserve(45 /* JumpIf */);
this.labels.target(this.pos, 45 /* JumpIf */, target);
}
jumpUnless(target) {
this.reserve(46 /* JumpUnless */);
this.labels.target(this.pos, 46 /* JumpUnless */, target);
}
string(_string) {
return this.constants.string(_string);
}
float(num) {
return this.constants.float(num);
}
names(_names) {
let names = [];
for (let i = 0; i < _names.length; i++) {
let n = _names[i];
names[i] = this.constants.string(n);
}
return this.constants.array(names);
}
symbols(symbols) {
return this.constants.array(symbols);
}
other(value) {
return this.constants.other(value);
}
block(block) {
return block ? this.constants.block(block) : 0;
}
func(func) {
return this.constants.function(func);
}
}
exports.BasicOpcodeBuilder = BasicOpcodeBuilder;
function isCompilableExpression(expr) {
return typeof expr === 'object' && expr !== null && typeof expr.compile === 'function';
}
class OpcodeBuilder extends BasicOpcodeBuilder {
constructor(env, meta, program = env.program) {
super(env, meta, program);
this.component = new _compiler.ComponentBuilder(this);
}
compileArgs(params, hash, synthetic) {
let positional = 0;
if (params) {
for (let i = 0; i < params.length; i++) {
(0, _functions.expr)(params[i], this);
}
positional = params.length;
}
this.pushImmediate(positional);
let names = _util.EMPTY_ARRAY;
if (hash) {
names = hash[0];
let val = hash[1];
for (let i = 0; i < val.length; i++) {
(0, _functions.expr)(val[i], this);
}
}
this.pushImmediate(names);
this.pushArgs(synthetic);
}
compile(expr) {
if (isCompilableExpression(expr)) {
return expr.compile(this);
} else {
return expr;
}
}
guardedAppend(expression, trusting) {
this.startLabels();
this.pushFrame();
this.returnTo('END');
(0, _functions.expr)(expression, this);
this.dup();
this.test(reference => {
return _content.IsComponentDefinitionReference.create(reference);
});
this.enter(2);
this.jumpUnless('ELSE');
this.pushDynamicComponentManager();
this.invokeComponent(null, null, null, null, null);
this.exit();
this.return();
this.label('ELSE');
if (trusting) {
this.trustingAppend();
} else {
this.cautiousAppend();
}
this.exit();
this.return();
this.label('END');
this.popFrame();
this.stopLabels();
}
invokeComponent(attrs, params, hash, block, inverse = null) {
this.fetch(_opcodes.Register.s0);
this.dup(_opcodes.Register.sp, 1);
this.load(_opcodes.Register.s0);
this.pushBlock(block);
this.pushBlock(inverse);
this.compileArgs(params, hash, false);
this.prepareArgs(_opcodes.Register.s0);
this.beginComponentTransaction();
this.pushDynamicScope();
this.createComponent(_opcodes.Register.s0, block !== null, inverse !== null);
this.registerComponentDestructor(_opcodes.Register.s0);
this.getComponentSelf(_opcodes.Register.s0);
this.getComponentLayout(_opcodes.Register.s0);
this.invokeDynamic(new _functions.InvokeDynamicLayout(attrs && attrs.scan()));
this.popFrame();
this.popScope();
this.popDynamicScope();
this.commitComponentTransaction();
this.load(_opcodes.Register.s0);
}
template(block) {
if (!block) return null;
return new _rawBlock2.default(this.meta, block.statements, block.parameters);
}
}
exports.default = OpcodeBuilder;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21waWxlZC9vcGNvZGVzL2J1aWxkZXIuanMiXSwibmFtZXMiOlsiY29udGVudCIsInZtIiwiTGFiZWxzIiwiY29uc3RydWN0b3IiLCJsYWJlbHMiLCJ0YXJnZXRzIiwibGFiZWwiLCJuYW1lIiwiaW5kZXgiLCJ0YXJnZXQiLCJhdCIsIlRhcmdldCIsInB1c2giLCJwYXRjaCIsInByb2dyYW0iLCJpIiwibGVuZ3RoIiwiZ290byIsImhlYXAiLCJzZXRieWFkZHIiLCJCYXNpY09wY29kZUJ1aWxkZXIiLCJlbnYiLCJtZXRhIiwibGFiZWxzU3RhY2siLCJjb25zdGFudHMiLCJzdGFydCIsIm1hbGxvYyIsInBvcyIsInNpemUiLCJuZXh0UG9zIiwidXB2YXJzIiwiY291bnQiLCJyZXNlcnZlIiwib3AxIiwib3AyIiwib3AzIiwiZmluYWxpemUiLCJmaW5pc2hNYWxsb2MiLCJwdXNoQXJncyIsInN5bnRoZXRpYyIsImN1cnJlbnQiLCJzdGFydExhYmVscyIsInN0b3BMYWJlbHMiLCJwb3AiLCJwdXNoQ29tcG9uZW50TWFuYWdlciIsImRlZmluaXRpb24iLCJvdGhlciIsInB1c2hEeW5hbWljQ29tcG9uZW50TWFuYWdlciIsInByZXBhcmVBcmdzIiwic3RhdGUiLCJjcmVhdGVDb21wb25lbnQiLCJoYXNEZWZhdWx0IiwiaGFzSW52ZXJzZSIsImZsYWciLCJyZWdpc3RlckNvbXBvbmVudERlc3RydWN0b3IiLCJiZWdpbkNvbXBvbmVudFRyYW5zYWN0aW9uIiwiY29tbWl0Q29tcG9uZW50VHJhbnNhY3Rpb24iLCJwdXNoQ29tcG9uZW50T3BlcmF0aW9ucyIsImdldENvbXBvbmVudFNlbGYiLCJnZXRDb21wb25lbnRMYXlvdXQiLCJkaWRDcmVhdGVFbGVtZW50IiwiZGlkUmVuZGVyTGF5b3V0IiwiZ2V0UGFydGlhbFRlbXBsYXRlIiwicmVzb2x2ZU1heWJlTG9jYWwiLCJzdHJpbmciLCJkZWJ1Z2dlciIsInN5bWJvbHMiLCJldmFsSW5mbyIsImFycmF5IiwiZHluYW1pY0NvbnRlbnQiLCJPcGNvZGUiLCJjYXV0aW91c0FwcGVuZCIsIk9wdGltaXplZENhdXRpb3VzQXBwZW5kT3Bjb2RlIiwidHJ1c3RpbmdBcHBlbmQiLCJPcHRpbWl6ZWRUcnVzdGluZ0FwcGVuZE9wY29kZSIsInRleHQiLCJvcGVuUHJpbWl0aXZlRWxlbWVudCIsInRhZyIsIm9wZW5FbGVtZW50V2l0aE9wZXJhdGlvbnMiLCJvcGVuRHluYW1pY0VsZW1lbnQiLCJmbHVzaEVsZW1lbnQiLCJjbG9zZUVsZW1lbnQiLCJzdGF0aWNBdHRyIiwiX25hbWUiLCJfbmFtZXNwYWNlIiwiX3ZhbHVlIiwibmFtZXNwYWNlIiwidmFsdWUiLCJkeW5hbWljQXR0ck5TIiwidHJ1c3RpbmciLCJkeW5hbWljQXR0ciIsImNvbW1lbnQiLCJfY29tbWVudCIsIm1vZGlmaWVyIiwiX2RlZmluaXRpb24iLCJwdXRJdGVyYXRvciIsImVudGVyTGlzdCIsImV4aXRMaXN0IiwiaXRlcmF0ZSIsImJyZWFrcyIsInNldFZhcmlhYmxlIiwic3ltYm9sIiwiZ2V0VmFyaWFibGUiLCJnZXRQcm9wZXJ0eSIsImtleSIsImdldEJsb2NrIiwiaGFzQmxvY2siLCJoYXNCbG9ja1BhcmFtcyIsImNvbmNhdCIsImZ1bmN0aW9uIiwiZiIsImZ1bmMiLCJsb2FkIiwicmVnaXN0ZXIiLCJmZXRjaCIsImR1cCIsInNwIiwib2Zmc2V0IiwicHVzaFJlbW90ZUVsZW1lbnQiLCJwb3BSZW1vdGVFbGVtZW50IiwicHVzaFJvb3RTY29wZSIsImJpbmRDYWxsZXJTY29wZSIsInB1c2hDaGlsZFNjb3BlIiwicG9wU2NvcGUiLCJyZXR1cm5UbyIsInB1c2hEeW5hbWljU2NvcGUiLCJwb3BEeW5hbWljU2NvcGUiLCJwdXNoSW1tZWRpYXRlIiwicHJpbWl0aXZlIiwiX3ByaW1pdGl2ZSIsImZsb2F0IiwiRXJyb3IiLCJoZWxwZXIiLCJwdXNoQmxvY2siLCJibG9jayIsImJpbmREeW5hbWljU2NvcGUiLCJfbmFtZXMiLCJuYW1lcyIsImVudGVyIiwiYXJncyIsImV4aXQiLCJyZXR1cm4iLCJwdXNoRnJhbWUiLCJwb3BGcmFtZSIsImNvbXBpbGVEeW5hbWljQmxvY2siLCJpbnZva2VEeW5hbWljIiwiaW52b2tlciIsImludm9rZVN0YXRpYyIsImNhbGxlckNvdW50IiwicGFyYW1ldGVycyIsInN5bWJvbFRhYmxlIiwiY2FsbGVlQ291bnQiLCJNYXRoIiwibWluIiwiZnAiLCJfYmxvY2siLCJ0ZXN0IiwidGVzdEZ1bmMiLCJfZnVuYyIsIkNvbnN0VGVzdCIsIlNpbXBsZVRlc3QiLCJFbnZpcm9ubWVudFRlc3QiLCJqdW1wIiwianVtcElmIiwianVtcFVubGVzcyIsIl9zdHJpbmciLCJudW0iLCJuIiwiaXNDb21waWxhYmxlRXhwcmVzc2lvbiIsImV4cHIiLCJjb21waWxlIiwiT3Bjb2RlQnVpbGRlciIsImNvbXBvbmVudCIsImNvbXBpbGVBcmdzIiwicGFyYW1zIiwiaGFzaCIsInBvc2l0aW9uYWwiLCJ2YWwiLCJndWFyZGVkQXBwZW5kIiwiZXhwcmVzc2lvbiIsInJlZmVyZW5jZSIsImNyZWF0ZSIsImludm9rZUNvbXBvbmVudCIsImF0dHJzIiwiaW52ZXJzZSIsInMwIiwic2NhbiIsInRlbXBsYXRlIiwic3RhdGVtZW50cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBQ0E7O0FBQ0E7O0lBQVlBLE87O0FBQ1o7O0lBQVlDLEU7Ozs7OztBQUNaLE1BQU1DLE1BQU4sQ0FBYTtBQUNUQyxrQkFBYztBQUNWLGFBQUtDLE1BQUwsR0FBYyxpQkFBZDtBQUNBLGFBQUtDLE9BQUwsR0FBZSxFQUFmO0FBQ0g7QUFDREMsVUFBTUMsSUFBTixFQUFZQyxLQUFaLEVBQW1CO0FBQ2YsYUFBS0osTUFBTCxDQUFZRyxJQUFaLElBQW9CQyxLQUFwQjtBQUNIO0FBQ0RDLFdBQU9DLEVBQVAsRUFBV0MsTUFBWCxFQUFtQkYsTUFBbkIsRUFBMkI7QUFDdkIsYUFBS0osT0FBTCxDQUFhTyxJQUFiLENBQWtCLEVBQUVGLEVBQUYs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LFVBQXBDLEVBQWdEdEQsTUFBTWUsVUFBdEQsQ0FBUDtBQUNIO0FBbkZ5RDtrQkFBekNzQixhIiwiZmlsZSI6ImxpYi9jb21waWxlZC9vcGNvZGVzL2J1aWxkZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkaWN0LCBFTVBUWV9BUlJBWSwgZXhwZWN0LCBmaWxsTnVsbHMsIFN0YWNrLCB0eXBlUG9zIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBDb21wb25lbnRCdWlsZGVyIH0gZnJvbSAnLi4vLi4vY29tcGlsZXInO1xuaW1wb3J0IHsgUmVnaXN0ZXIgfSBmcm9tICcuLi8uLi9vcGNvZGVzJztcbmltcG9ydCB7IGV4cHIsIEludm9rZUR5bmFtaWNMYXlvdXQgfSBmcm9tICcuLi8uLi9zeW50YXgvZnVuY3Rpb25zJztcbmltcG9ydCBSYXdJbmxpbmVCbG9jayBmcm9tICcuLi8uLi9zeW50YXgvcmF3LWJsb2NrJztcbmltcG9ydCB7IElzQ29tcG9uZW50RGVmaW5pdGlvblJlZmVyZW5jZSB9IGZyb20gJy4uL29wY29kZXMvY29udGVudCc7XG5pbXBvcnQgKiBhcyBjb250ZW50IGZyb20gJy4vY29udGVudCc7XG5pbXBvcnQgKiBhcyB2bSBmcm9tICcuL3ZtJztcbmNsYXNzIExhYmVscyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubGFiZWxzID0gZGljdCgpO1xuICAgICAgICB0aGlzLnRhcmdldHMgPSBbXTtcbiAgICB9XG4gICAgbGFiZWwobmFtZSwgaW5kZXgpIHtcbiAgICAgICAgdGhpcy5sYWJlbHNbbmFtZV0gPSBpbmRleDtcbiAgICB9XG4gICAgdGFyZ2V0KGF0LCBUYXJnZXQsIHRhcmdldCkge1xuICAgICAgICB0aGlzLnRhcmdldHMucHVzaCh7IGF0LCBUYXJnZXQsIHRhcmdldCB9KTtcbiAgICB9XG4gICAgcGF0Y2gocHJvZ3JhbSkge1xuICAgICAgICBsZXQgeyB0YXJnZXRzLCBsYWJlbHMgfSA9IHRoaXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFyZ2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHsgYXQsIHRhcmdldCB9ID0gdGFyZ2V0c1tpXTtcbiAgICAgICAgICAgIGxldCBnb3RvID0gbGFiZWxzW3RhcmdldF0gLSBhdDtcbiAgICAgICAgICAgIHByb2dyYW0uaGVhcC5zZXRieWFkZHIoYXQgKyAxLCBnb3RvKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBCYXNpY09wY29kZUJ1aWxkZXIge1xuICAgIGNvbnN0cnVjdG9yKGVudiwgbWV0YSwgcHJvZ3JhbSkge1xuICAgICAgICB0aGlzLmVudiA9IGVudjtcbiAgICAgICAgdGhpcy5tZXRhID0gbWV0YTtcbiAgICAgICAgdGhpcy5wcm9ncmFtID0gcHJvZ3JhbTtcbiAgICAgICAgdGhpcy5sYWJlbHNTdGFjayA9IG5ldyBTdGFjaygpO1xuICAgICAgICB0aGlzLmNvbnN0YW50cyA9IHByb2dyYW0uY29uc3RhbnRzO1xuICAgICAgICB0aGlzLmhlYXAgPSBwcm9ncmFtLmhlYXA7XG4gICAgICAgIHRoaXMuc3RhcnQgPSB0aGlzLmhlYXAubWFsbG9jKCk7XG4gICAgfVxuICAgIGdldCBwb3MoKSB7XG4gICAgICAgIHJldHVybiB0eXBlUG9zKHRoaXMuaGVhcC5zaXplKCkpO1xuICAgIH1cbiAgICBnZXQgbmV4dFBvcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhcC5zaXplKCk7XG4gICAgfVxuICAgIHVwdmFycyhjb3VudCkge1xuICAgICAgICByZXR1cm4gZmlsbE51bGxzKGNvdW50KTtcbiAgICB9XG4gICAgcmVzZXJ2ZShuYW1lKSB7XG4gICAgICAgIHRoaXMucHVzaChuYW1lLCAwLCAwLCAwKTtcbiAgICB9XG4gICAgcHVzaChuYW1lLCBvcDEgPSAwLCBvcDIgPSAwLCBvcDMgPSAwKSB7XG4gICAgICAgIHRoaXMuaGVhcC5wdXNoKG5hbWUpO1xuICAgICAgICB0aGlzLmhlYXAucHVzaChvcDEpO1xuICAgICAgICB0aGlzLmhlYXAucHVzaChvcDIpO1xuICAgICAgICB0aGlzLmhlYXAucHVzaChvcDMpO1xuICAgIH1cbiAgICBmaW5hbGl6ZSgpIHtcbiAgICAgICAgdGhpcy5wdXNoKDIyIC8qIFJldHVybiAqLyk7XG4gICAgICAgIHRoaXMuaGVhcC5maW5pc2hNYWxsb2ModGhpcy5zdGFydCk7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXJ0O1xuICAgIH1cbiAgICAvLyBhcmdzXG4gICAgcHVzaEFyZ3Moc3ludGhldGljKSB7XG4gICAgICAgIHRoaXMucHVzaCg1OCAvKiBQdXNoQXJncyAqLywgc3ludGhldGljID09PSB0cnVlID8gMSA6IDApO1xuICAgIH1cbiAgICAvLyBoZWxwZXJzXG4gICAgZ2V0IGxhYmVscygpIHtcbiAgICAgICAgcmV0dXJuIGV4cGVjdCh0aGlzLmxhYmVsc1N0YWNrLmN1cnJlbnQsICdidWc6IG5vdCBpbiBhIGxhYmVsIHN0YWNrJyk7XG4gICAgfVxuICAgIHN0YXJ0TGFiZWxzKCkge1xuICAgICAgICB0aGlzLmxhYmVsc1N0YWNrLnB1c2gobmV3IExhYmVscygpKTtcbiAgICB9XG4gICAgc3RvcExhYmVscygpIHtcbiAgICAgICAgbGV0IGxhYmVsID0gZXhwZWN0KHRoaXMubGFiZWxzU3RhY2sucG9wKCksICd1bmJhbGFuY2VkIHB1c2ggYW5kIHBvcCBsYWJlbHMnKTtcbiAgICAgICAgbGFiZWwucGF0Y2godGhpcy5wcm9ncmFtKTtcbiAgICB9XG4gICAgLy8gY29tcG9uZW50c1xuICAgIHB1c2hDb21wb25lbnRNYW5hZ2VyKGRlZmluaXRpb24pIHtcbiAgICAgICAgdGhpcy5wdXNoKDU2IC8qIFB1c2hDb21wb25lbnRNYW5hZ2VyICovLCB0aGlzLm90aGVyKGRlZmluaXRpb24pKTtcbiAgICB9XG4gICAgcHVzaER5bmFtaWNDb21wb25lbnRNYW5hZ2VyKCkge1xuICAgICAgICB0aGlzLnB1c2goNTcgLyogUHVzaER5bmFtaWNDb21wb25lbnRNYW5hZ2VyICovKTtcbiAgICB9XG4gICAgcHJlcGFyZUFyZ3Moc3RhdGUpIHtcbiAgICAgICAgdGhpcy5wdXNoKDU5IC8qIFByZXBhcmVBcmdzICovLCBzdGF0ZSk7XG4gICAgfVxuICAgIGNyZWF0ZUNvbXBvbmVudChzdGF0ZSwgaGFzRGVmYXVsdCwgaGFzSW52ZXJzZSkge1xuICAgICAgICBsZXQgZmxhZyA9IChoYXNEZWZhdWx0ID09PSB0cnVlID8gMSA6IDApIHwgKGhhc0ludmVyc2UgPT09IHRydWUgPyAxIDogMCkgPDwgMTtcbiAgICAgICAgdGhpcy5wdXNoKDYwIC8qIENyZWF0ZUNvbXBvbmVudCAqLywgZmxhZywgc3RhdGUpO1xuICAgIH1cbiAgICByZWdpc3RlckNvbXBvbmVudERlc3RydWN0b3Ioc3RhdGUpIHtcbiAgICAgICAgdGhpcy5wdXNoKDYxIC8qIFJlZ2lzdGVyQ29tcG9uZW50RGVzdHJ1Y3RvciAqLywgc3RhdGUpO1xuICAgIH1cbiAgICBiZWdpbkNvbXBvbmVudFRyYW5zYWN0aW9uKCkge1xuICAgICAgICB0aGlzLnB1c2goNjUgLyogQmVnaW5Db21wb25lbnRUcmFuc2FjdGlvbiAqLyk7XG4gICAgfVxuICAgIGNvbW1pdENvbXBvbmVudFRyYW5zYWN0aW9uKCkge1xuICAgICAgICB0aGlzLnB1c2goNjYgLyogQ29tbWl0Q29tcG9uZW50VHJhbnNhY3Rpb24gKi8pO1xuICAgIH1cbiAgICBwdXNoQ29tcG9uZW50T3BlcmF0aW9ucygpIHtcbiAgICAgICAgdGhpcy5wdXNoKDYyIC8qIFB1c2hDb21wb25lbnRPcGVyYXRpb25zICovKTtcbiAgICB9XG4gICAgZ2V0Q29tcG9uZW50U2VsZihzdGF0ZSkge1xuICAgICAgICB0aGlzLnB1c2goNjMgLyogR2V0Q29tcG9uZW50U2VsZiAqLywgc3RhdGUpO1xuICAgIH1cbiAgICBnZXRDb21wb25lbnRMYXlvdXQoc3RhdGUpIHtcbiAgICAgICAgdGhpcy5wdXNoKDY0IC8qIEdldENvbXBvbmVudExheW91dCAqLywgc3RhdGUpO1xuICAgIH1cbiAgICBkaWRDcmVhdGVFbGVtZW50KHN0YXRlKSB7XG4gICAgICAgIHRoaXMucHVzaCg2NyAvKiBEaWRDcmVhdGVFbGVtZW50ICovLCBzdGF0ZSk7XG4gICAgfVxuICAgIGRpZFJlbmRlckxheW91dChzdGF0ZSkge1xuICAgICAgICB0aGlzLnB1c2goNjggLyogRGlkUmVuZGVyTGF5b3V0ICovLCBzdGF0ZSk7XG4gICAgfVxuICAgIC8vIHBhcnRpYWxcbiAgICBnZXRQYXJ0aWFsVGVtcGxhdGUoKSB7XG4gICAgICAgIHRoaXMucHVzaCg2OSAvKiBHZXRQYXJ0aWFsVGVtcGxhdGUgKi8pO1xuICAgIH1cbiAgICByZXNvbHZlTWF5YmVMb2NhbChuYW1lKSB7XG4gICAgICAgIHRoaXMucHVzaCg3MCAvKiBSZXNvbHZlTWF5YmVMb2NhbCAqLywgdGhpcy5zdHJpbmcobmFtZSkpO1xuICAgIH1cbiAgICAvLyBkZWJ1Z2dlclxuICAgIGRlYnVnZ2VyKHN5bWJvbHMsIGV2YWxJbmZvKSB7XG4gICAgICAgIHRoaXMucHVzaCg3MSAvKiBEZWJ1Z2dlciAqLywgdGhpcy5jb25zdGFudHMub3RoZXIoc3ltYm9scyksIHRoaXMuY29uc3RhbnRzLmFycmF5KGV2YWxJbmZvKSk7XG4gICAgfVxuICAgIC8vIGNvbnRlbnRcbiAgICBkeW5hbWljQ29udGVudChPcGNvZGUpIHtcbiAgICAgICAgdGhpcy5wdXNoKDI2IC8qIER5bmFtaWNDb250ZW50ICovLCB0aGlzLm90aGVyKE9wY29kZSkpO1xuICAgIH1cbiAgICBjYXV0aW91c0FwcGVuZCgpIHtcbiAgICAgICAgdGhpcy5keW5hbWljQ29udGVudChuZXcgY29udGVudC5PcHRpbWl6ZWRDYXV0aW91c0FwcGVuZE9wY29kZSgpKTtcbiAgICB9XG4gICAgdHJ1c3RpbmdBcHBlbmQoKSB7XG4gICAgICAgIHRoaXMuZHluYW1pY0NvbnRlbnQobmV3IGNvbnRlbnQuT3B0aW1pemVkVHJ1c3RpbmdBcHBlbmRPcGNvZGUoKSk7XG4gICAgfVxuICAgIC8vIGRvbVxuICAgIHRleHQodGV4dCkge1xuICAgICAgICB0aGlzLnB1c2goMjQgLyogVGV4dCAqLywgdGhpcy5jb25zdGFudHMuc3RyaW5nKHRleHQpKTtcbiAgICB9XG4gICAgb3BlblByaW1pdGl2ZUVsZW1lbnQodGFnKSB7XG4gICAgICAgIHRoaXMucHVzaCgyNyAvKiBPcGVuRWxlbWVudCAqLywgdGhpcy5jb25zdGFudHMuc3RyaW5nKHRhZykpO1xuICAgIH1cbiAgICBvcGVuRWxlbWVudFdpdGhPcGVyYXRpb25zKHRhZykge1xuICAgICAgICB0aGlzLnB1c2goMjggLyogT3BlbkVsZW1lbnRXaXRoT3BlcmF0aW9ucyAqLywgdGhpcy5jb25zdGFudHMuc3RyaW5nKHRhZykpO1xuICAgIH1cbiAgICBvcGVuRHluYW1pY0VsZW1lbnQoKSB7XG4gICAgICAgIHRoaXMucHVzaCgyOSAvKiBPcGVuRHluYW1pY0VsZW1lbnQgKi8pO1xuICAgIH1cbiAgICBmbHVzaEVsZW1lbnQoKSB7XG4gICAgICAgIHRoaXMucHVzaCgzMyAvKiBGbHVzaEVsZW1lbnQgKi8pO1xuICAgIH1cbiAgICBjbG9zZUVsZW1lbnQoKSB7XG4gICAgICAgIHRoaXMucHVzaCgzNCAvKiBDbG9zZUVsZW1lbnQgKi8pO1xuICAgIH1cbiAgICBzdGF0aWNBdHRyKF9uYW1lLCBfbmFtZXNwYWNlLCBfdmFsdWUpIHtcbiAgICAgICAgbGV0IG5hbWUgPSB0aGlzLmNvbnN0YW50cy5zdHJpbmcoX25hbWUpO1xuICAgICAgICBsZXQgbmFtZXNwYWNlID0gX25hbWVzcGFjZSA/IHRoaXMuY29uc3RhbnRzLnN0cmluZyhfbmFtZXNwYWNlKSA6IDA7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuY29uc3RhbnRzLnN0cmluZyhfdmFsdWUpO1xuICAgICAgICB0aGlzLnB1c2goMzAgLyogU3RhdGljQXR0ciAqLywgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZSk7XG4gICAgfVxuICAgIGR5bmFtaWNBdHRyTlMoX25hbWUsIF9uYW1lc3BhY2UsIHRydXN0aW5nKSB7XG4gICAgICAgIGxldCBuYW1lID0gdGhpcy5jb25zdGFudHMuc3RyaW5nKF9uYW1lKTtcbiAgICAgICAgbGV0IG5hbWVzcGFjZSA9IHRoaXMuY29uc3RhbnRzLnN0cmluZyhfbmFtZXNwYWNlKTtcbiAgICAgICAgdGhpcy5wdXNoKDMyIC8qIER5bmFtaWNBdHRyTlMgKi8sIG5hbWUsIG5hbWVzcGFjZSwgdHJ1c3RpbmcgPT09IHRydWUgPyAxIDogMCk7XG4gICAgfVxuICAgIGR5bmFtaWNBdHRyKF9uYW1lLCB0cnVzdGluZykge1xuICAgICAgICBsZXQgbmFtZSA9IHRoaXMuY29uc3RhbnRzLnN0cmluZyhfbmFtZSk7XG4gICAgICAgIHRoaXMucHVzaCgzMSAvKiBEeW5hbWljQXR0ciAqLywgbmFtZSwgdHJ1c3RpbmcgPT09IHRydWUgPyAxIDogMCk7XG4gICAgfVxuICAgIGNvbW1lbnQoX2NvbW1lbnQpIHtcbiAgICAgICAgbGV0IGNvbW1lbnQgPSB0aGlzLmNvbnN0YW50cy5zdHJpbmcoX2NvbW1lbnQpO1xuICAgICAgICB0aGlzLnB1c2goMjUgLyogQ29tbWVudCAqLywgY29tbWVudCk7XG4gICAgfVxuICAgIG1vZGlmaWVyKF9kZWZpbml0aW9uKSB7XG4gICAgICAgIHRoaXMucHVzaCgzNSAvKiBNb2RpZmllciAqLywgdGhpcy5vdGhlcihfZGVmaW5pdGlvbikpO1xuICAgIH1cbiAgICAvLyBsaXN0c1xuICAgIHB1dEl0ZXJhdG9yKCkge1xuICAgICAgICB0aGlzLnB1c2goNTQgLyogUHV0SXRlcmF0b3IgKi8pO1xuICAgIH1cbiAgICBlbnRlckxpc3Qoc3RhcnQpIHtcbiAgICAgICAgdGhpcy5yZXNlcnZlKDUyIC8qIEVudGVyTGlzdCAqLyk7XG4gICAgICAgIHRoaXMubGFiZWxzLnRhcmdldCh0aGlzLnBvcywgNTIgLyogRW50ZXJMaXN0ICovLCBzdGFydCk7XG4gICAgfVxuICAgIGV4aXRMaXN0KCkge1xuICAgICAgICB0aGlzLnB1c2goNTMgLyogRXhpdExpc3QgKi8pO1xuICAgIH1cbiAgICBpdGVyYXRlKGJyZWFrcykge1xuICAgICAgICB0aGlzLnJlc2VydmUoNTUgLyogSXRlcmF0ZSAqLyk7XG4gICAgICAgIHRoaXMubGFiZWxzLnRhcmdldCh0aGlzLnBvcywgNTUgLyogSXRlcmF0ZSAqLywgYnJlYWtzKTtcbiAgICB9XG4gICAgLy8gZXhwcmVzc2lvbnNcbiAgICBzZXRWYXJpYWJsZShzeW1ib2wpIHtcbiAgICAgICAgdGhpcy5wdXNoKDQgLyogU2V0VmFyaWFibGUgKi8sIHN5bWJvbCk7XG4gICAgfVxuICAgIGdldFZhcmlhYmxlKHN5bWJvbCkge1xuICAgICAgICB0aGlzLnB1c2goNSAvKiBHZXRWYXJpYWJsZSAqLywgc3ltYm9sKTtcbiAgICB9XG4gICAgZ2V0UHJvcGVydHkoa2V5KSB7XG4gICAgICAgIHRoaXMucHVzaCg2IC8qIEdldFByb3BlcnR5ICovLCB0aGlzLnN0cmluZyhrZXkpKTtcbiAgICB9XG4gICAgZ2V0QmxvY2soc3ltYm9sKSB7XG4gICAgICAgIHRoaXMucHVzaCg4IC8qIEdldEJsb2NrICovLCBzeW1ib2wpO1xuICAgIH1cbiAgICBoYXNCbG9jayhzeW1ib2wpIHtcbiAgICAgICAgdGhpcy5wdXNoKDkgLyogSGFzQmxvY2sgKi8sIHN5bWJvbCk7XG4gICAgfVxuICAgIGhhc0Jsb2NrUGFyYW1zKHN5bWJvbCkge1xuICAgICAgICB0aGlzLnB1c2goMTAgLyogSGFzQmxvY2tQYXJhbXMgKi8sIHN5bWJvbCk7XG4gICAgfVxuICAgIGNvbmNhdChzaXplKSB7XG4gICAgICAgIHRoaXMucHVzaCgxMSAvKiBDb25jYXQgKi8sIHNpemUpO1xuICAgIH1cbiAgICBmdW5jdGlvbihmKSB7XG4gICAgICAgIHRoaXMucHVzaCgyIC8qIEZ1bmN0aW9uICovLCB0aGlzLmZ1bmMoZikpO1xuICAgIH1cbiAgICBsb2FkKHJlZ2lzdGVyKSB7XG4gICAgICAgIHRoaXMucHVzaCgxNyAvKiBMb2FkICovLCByZWdpc3Rlcik7XG4gICAgfVxuICAgIGZldGNoKHJlZ2lzdGVyKSB7XG4gICAgICAgIHRoaXMucHVzaCgxOCAvKiBGZXRjaCAqLywgcmVnaXN0ZXIpO1xuICAgIH1cbiAgICBkdXAocmVnaXN0ZXIgPSBSZWdpc3Rlci5zcCwgb2Zmc2V0ID0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wdXNoKDE1IC8qIER1cCAqLywgcmVnaXN0ZXIsIG9mZnNldCk7XG4gICAgfVxuICAgIHBvcChjb3VudCA9IDEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHVzaCgxNiAvKiBQb3AgKi8sIGNvdW50KTtcbiAgICB9XG4gICAgLy8gdm1cbiAgICBwdXNoUmVtb3RlRWxlbWVudCgpIHtcbiAgICAgICAgdGhpcy5wdXNoKDM2IC8qIFB1c2hSZW1vdGVFbGVtZW50ICovKTtcbiAgICB9XG4gICAgcG9wUmVtb3RlRWxlbWVudCgpIHtcbiAgICAgICAgdGhpcy5wdXNoKDM3IC8qIFBvcFJlbW90ZUVsZW1lbnQgKi8pO1xuICAgIH1cbiAgICBsYWJlbChuYW1lKSB7XG4gICAgICAgIHRoaXMubGFiZWxzLmxhYmVsKG5hbWUsIHRoaXMubmV4dFBvcyk7XG4gICAgfVxuICAgIHB1c2hSb290U2NvcGUoc3ltYm9scywgYmluZENhbGxlclNjb3BlKSB7XG4gICAgICAgIHRoaXMucHVzaCgxOSAvKiBSb290U2NvcGUgKi8sIHN5bWJvbHMsIGJpbmRDYWxsZXJTY29wZSA/IDEgOiAwKTtcbiAgICB9XG4gICAgcHVzaENoaWxkU2NvcGUoKSB7XG4gICAgICAgIHRoaXMucHVzaCgyMCAvKiBDaGlsZFNjb3BlICovKTtcbiAgICB9XG4gICAgcG9wU2NvcGUoKSB7XG4gICAgICAgIHRoaXMucHVzaCgyMSAvKiBQb3BTY29wZSAqLyk7XG4gICAgfVxuICAgIHJldHVyblRvKGxhYmVsKSB7XG4gICAgICAgIHRoaXMucmVzZXJ2ZSgyMyAvKiBSZXR1cm5UbyAqLyk7XG4gICAgICAgIHRoaXMubGFiZWxzLnRhcmdldCh0aGlzLnBvcywgMjMgLyogUmV0dXJuVG8gKi8sIGxhYmVsKTtcbiAgICB9XG4gICAgcHVzaER5bmFtaWNTY29wZSgpIHtcbiAgICAgICAgdGhpcy5wdXNoKDM5IC8qIFB1c2hEeW5hbWljU2NvcGUgKi8pO1xuICAgIH1cbiAgICBwb3BEeW5hbWljU2NvcGUoKSB7XG4gICAgICAgIHRoaXMucHVzaCg0MCAvKiBQb3BEeW5hbWljU2NvcGUgKi8pO1xuICAgIH1cbiAgICBwdXNoSW1tZWRpYXRlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMucHVzaCgxMyAvKiBDb25zdGFudCAqLywgdGhpcy5vdGhlcih2YWx1ZSkpO1xuICAgIH1cbiAgICBwcmltaXRpdmUoX3ByaW1pdGl2ZSkge1xuICAgICAgICBsZXQgZmxhZyA9IDA7XG4gICAgICAgIGxldCBwcmltaXRpdmU7XG4gICAgICAgIHN3aXRjaCAodHlwZW9mIF9wcmltaXRpdmUpIHtcbiAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICAgICAgaWYgKF9wcmltaXRpdmUgJSAxID09PSAwICYmIF9wcmltaXRpdmUgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHByaW1pdGl2ZSA9IF9wcmltaXRpdmU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlID0gdGhpcy5mbG9hdChfcHJpbWl0aXZlKTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICBwcmltaXRpdmUgPSB0aGlzLnN0cmluZyhfcHJpbWl0aXZlKTtcbiAgICAgICAgICAgICAgICBmbGFnID0gMjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgICAgIHByaW1pdGl2ZSA9IF9wcmltaXRpdmUgfCAwO1xuICAgICAgICAgICAgICAgIGZsYWcgPSAzO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICAgICAgICAvLyBhc3N1bWUgbnVsbFxuICAgICAgICAgICAgICAgIHByaW1pdGl2ZSA9IDI7XG4gICAgICAgICAgICAgICAgZmxhZyA9IDM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICAgICAgICAgIHByaW1pdGl2ZSA9IDM7XG4gICAgICAgICAgICAgICAgZmxhZyA9IDM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwcmltaXRpdmUgcGFzc2VkIHRvIHB1c2hQcmltaXRpdmUnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnB1c2goMTQgLyogUHJpbWl0aXZlUmVmZXJlbmNlICovLCBmbGFnIDw8IDMwIHwgcHJpbWl0aXZlKTtcbiAgICB9XG4gICAgaGVscGVyKGZ1bmMpIHtcbiAgICAgICAgdGhpcy5wdXNoKDEgLyogSG