@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
346 lines (316 loc) • 28.8 kB
JavaScript
import { toBool } from '@glimmer/global-context';
import { valueForRef, isConstRef, createPrimitiveRef, UNDEFINED_REFERENCE, NULL_REFERENCE, TRUE_REFERENCE, FALSE_REFERENCE, createComputeRef, createConstRef } from '@glimmer/reference';
import { CONSTANT_TAG, valueForTag, validateTag, INITIAL, beginTrackFrame, endTrackFrame, consumeTag } from '@glimmer/validator';
import { assert, decodeHandle, decodeImmediate, isHandle } from '@glimmer/util';
import { stackAssert } from './assert';
import { APPEND_OPCODES } from '../../opcodes';
import { CONSTANTS } from '../../symbols';
APPEND_OPCODES.add(39
/* ChildScope */
, vm => vm.pushChildScope());
APPEND_OPCODES.add(40
/* PopScope */
, vm => vm.popScope());
APPEND_OPCODES.add(59
/* PushDynamicScope */
, vm => vm.pushDynamicScope());
APPEND_OPCODES.add(60
/* PopDynamicScope */
, vm => vm.popDynamicScope());
APPEND_OPCODES.add(28
/* Constant */
, (vm, {
op1: other
}) => {
vm.stack.push(vm[CONSTANTS].getValue(decodeHandle(other)));
});
APPEND_OPCODES.add(29
/* ConstantReference */
, (vm, {
op1: other
}) => {
vm.stack.push(createConstRef(vm[CONSTANTS].getValue(decodeHandle(other)), false));
});
APPEND_OPCODES.add(30
/* Primitive */
, (vm, {
op1: primitive
}) => {
let stack = vm.stack;
if (isHandle(primitive)) {
// it is a handle which does not already exist on the stack
let value = vm[CONSTANTS].getValue(decodeHandle(primitive));
stack.push(value);
} else {
// is already an encoded immediate or primitive handle
stack.push(decodeImmediate(primitive));
}
});
APPEND_OPCODES.add(31
/* PrimitiveReference */
, vm => {
let stack = vm.stack;
let value = stack.pop();
let ref;
if (value === undefined) {
ref = UNDEFINED_REFERENCE;
} else if (value === null) {
ref = NULL_REFERENCE;
} else if (value === true) {
ref = TRUE_REFERENCE;
} else if (value === false) {
ref = FALSE_REFERENCE;
} else {
ref = createPrimitiveRef(value);
}
stack.push(ref);
});
APPEND_OPCODES.add(33
/* Dup */
, (vm, {
op1: register,
op2: offset
}) => {
let position = vm.fetchValue(register) - offset;
vm.stack.dup(position);
});
APPEND_OPCODES.add(34
/* Pop */
, (vm, {
op1: count
}) => {
vm.stack.pop(count);
});
APPEND_OPCODES.add(35
/* Load */
, (vm, {
op1: register
}) => {
vm.load(register);
});
APPEND_OPCODES.add(36
/* Fetch */
, (vm, {
op1: register
}) => {
vm.fetch(register);
});
APPEND_OPCODES.add(58
/* BindDynamicScope */
, (vm, {
op1: _names
}) => {
let names = vm[CONSTANTS].getArray(_names);
vm.bindDynamicScope(names);
});
APPEND_OPCODES.add(69
/* Enter */
, (vm, {
op1: args
}) => {
vm.enter(args);
});
APPEND_OPCODES.add(70
/* Exit */
, vm => {
vm.exit();
});
APPEND_OPCODES.add(63
/* PushSymbolTable */
, (vm, {
op1: _table
}) => {
let stack = vm.stack;
stack.push(vm[CONSTANTS].getValue(_table));
});
APPEND_OPCODES.add(62
/* PushBlockScope */
, vm => {
let stack = vm.stack;
stack.push(vm.scope());
});
APPEND_OPCODES.add(61
/* CompileBlock */
, vm => {
let stack = vm.stack;
let block = stack.pop();
if (block) {
stack.push(vm.compile(block));
} else {
stack.push(null);
}
});
APPEND_OPCODES.add(64
/* InvokeYield */
, vm => {
let {
stack
} = vm;
let handle = stack.pop();
let scope = stack.pop();
let table = stack.pop();
(false && assert(table === null || table && typeof table === 'object' && Array.isArray(table.parameters), stackAssert('Option<BlockSymbolTable>', table)));
let args = stack.pop();
if (table === null) {
// To balance the pop{Frame,Scope}
vm.pushFrame();
vm.pushScope(scope !== null && scope !== void 0 ? scope : vm.scope());
return;
}
let invokingScope = scope; // If necessary, create a child scope
{
let locals = table.parameters;
let localsCount = locals.length;
if (localsCount > 0) {
invokingScope = invokingScope.child();
for (let i = 0; i < localsCount; i++) {
invokingScope.bindSymbol(locals[i], args.at(i));
}
}
}
vm.pushFrame();
vm.pushScope(invokingScope);
vm.call(handle);
});
APPEND_OPCODES.add(65
/* JumpIf */
, (vm, {
op1: target
}) => {
let reference = vm.stack.pop();
let value = Boolean(valueForRef(reference));
if (isConstRef(reference)) {
if (value === true) {
vm.goto(target);
}
} else {
if (value === true) {
vm.goto(target);
}
vm.updateWith(new Assert(reference));
}
});
APPEND_OPCODES.add(66
/* JumpUnless */
, (vm, {
op1: target
}) => {
let reference = vm.stack.pop();
let value = Boolean(valueForRef(reference));
if (isConstRef(reference)) {
if (value === false) {
vm.goto(target);
}
} else {
if (value === false) {
vm.goto(target);
}
vm.updateWith(new Assert(reference));
}
});
APPEND_OPCODES.add(67
/* JumpEq */
, (vm, {
op1: target,
op2: comparison
}) => {
let other = vm.stack.peek();
if (other === comparison) {
vm.goto(target);
}
});
APPEND_OPCODES.add(68
/* AssertSame */
, vm => {
let reference = vm.stack.peek();
if (isConstRef(reference) === false) {
vm.updateWith(new Assert(reference));
}
});
APPEND_OPCODES.add(71
/* ToBoolean */
, vm => {
let {
stack
} = vm;
let valueRef = stack.pop();
stack.push(createComputeRef(() => toBool(valueForRef(valueRef))));
});
export class Assert {
constructor(ref) {
this.ref = ref;
this.last = valueForRef(ref);
}
evaluate(vm) {
let {
last,
ref
} = this;
let current = valueForRef(ref);
if (last !== current) {
vm.throw();
}
}
}
export class AssertFilter {
constructor(ref, filter) {
this.ref = ref;
this.filter = filter;
this.last = filter(valueForRef(ref));
}
evaluate(vm) {
let {
last,
ref,
filter
} = this;
let current = filter(valueForRef(ref));
if (last !== current) {
vm.throw();
}
}
}
export class JumpIfNotModifiedOpcode {
constructor() {
this.tag = CONSTANT_TAG;
this.lastRevision = INITIAL;
}
finalize(tag, target) {
this.target = target;
this.didModify(tag);
}
evaluate(vm) {
let {
tag,
target,
lastRevision
} = this;
if (!vm.alwaysRevalidate && validateTag(tag, lastRevision)) {
consumeTag(tag);
vm.goto(target);
}
}
didModify(tag) {
this.tag = tag;
this.lastRevision = valueForTag(this.tag);
consumeTag(tag);
}
}
export class BeginTrackFrameOpcode {
constructor(debugLabel) {
this.debugLabel = debugLabel;
}
evaluate() {
beginTrackFrame(this.debugLabel);
}
}
export class EndTrackFrameOpcode {
constructor(target) {
this.target = target;
}
evaluate() {
let tag = endTrackFrame();
this.target.didModify(tag);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2NvbXBpbGVkL29wY29kZXMvdm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsU0FBUyxNQUFULFFBQXVCLHlCQUF2QjtBQUVBLFNBRUUsV0FGRixFQUdFLFVBSEYsRUFJRSxrQkFKRixFQUtFLG1CQUxGLEVBTUUsY0FORixFQU9FLGNBUEYsRUFRRSxlQVJGLEVBU0UsZ0JBVEYsRUFVRSxjQVZGLFFBV08sb0JBWFA7QUFZQSxTQUNFLFlBREYsRUFJRSxXQUpGLEVBS0UsV0FMRixFQU1FLE9BTkYsRUFPRSxlQVBGLEVBUUUsYUFSRixFQVNFLFVBVEYsUUFVTyxvQkFWUDtBQVdBLFNBQVMsTUFBVCxFQUFpQixZQUFqQixFQUErQixlQUEvQixFQUF3RCxRQUF4RCxRQUF3RSxlQUF4RTtBQVVBLFNBQVMsV0FBVCxRQUE0QixVQUE1QjtBQUNBLFNBQVMsY0FBVCxRQUErQixlQUEvQjtBQUlBLFNBQVMsU0FBVCxRQUEwQixlQUExQjtBQUdBLGNBQWMsQ0FBQyxHQUFmLENBQWtCO0FBQUE7QUFBbEIsRUFBbUMsRUFBRCxJQUFRLEVBQUUsQ0FBQyxjQUFILEVBQTFDO0FBRUEsY0FBYyxDQUFDLEdBQWYsQ0FBa0I7QUFBQTtBQUFsQixFQUFpQyxFQUFELElBQVEsRUFBRSxDQUFDLFFBQUgsRUFBeEM7QUFFQSxjQUFjLENBQUMsR0FBZixDQUFrQjtBQUFBO0FBQWxCLEVBQXlDLEVBQUQsSUFBUSxFQUFFLENBQUMsZ0JBQUgsRUFBaEQ7QUFFQSxjQUFjLENBQUMsR0FBZixDQUFrQjtBQUFBO0FBQWxCLEVBQXdDLEVBQUQsSUFBUSxFQUFFLENBQUMsZUFBSCxFQUEvQztBQUVBLGNBQWMsQ0FBQyxHQUFmLENBQWtCO0FBQUE7QUFBbEIsRUFBZ0MsQ0FBQyxFQUFELEVBQUs7QUFBRSxFQUFBLEdBQUcsRUFBRTtBQUFQLENBQUwsS0FBdUI7QUFDckQsRUFBQSxFQUFFLENBQUMs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QU4sQ0FBZjtBQUNEOztBQUwrQjtBQVFsQyxPQUFNLE1BQU8sbUJBQVAsQ0FBMEI7QUFDOUIsRUFBQSxXQUFBLENBQW9CLE1BQXBCLEVBQW1EO0FBQS9CLFNBQUEsTUFBQSxHQUFBLE1BQUE7QUFBbUM7O0FBRXZELEVBQUEsUUFBUSxHQUFBO0FBQ04sUUFBSSxHQUFHLEdBQUcsYUFBYSxFQUF2QjtBQUNBLFNBQUssTUFBTCxDQUFZLFNBQVosQ0FBc0IsR0FBdEI7QUFDRDs7QUFONkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0b0Jvb2wgfSBmcm9tICdAZ2xpbW1lci9nbG9iYWwtY29udGV4dCc7XG5pbXBvcnQgeyBDb21waWxhYmxlVGVtcGxhdGUsIE9wdGlvbiwgT3AsIFVwZGF0aW5nT3Bjb2RlIH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQge1xuICBSZWZlcmVuY2UsXG4gIHZhbHVlRm9yUmVmLFxuICBpc0NvbnN0UmVmLFxuICBjcmVhdGVQcmltaXRpdmVSZWYsXG4gIFVOREVGSU5FRF9SRUZFUkVOQ0UsXG4gIE5VTExfUkVGRVJFTkNFLFxuICBUUlVFX1JFRkVSRU5DRSxcbiAgRkFMU0VfUkVGRVJFTkNFLFxuICBjcmVhdGVDb21wdXRlUmVmLFxuICBjcmVhdGVDb25zdFJlZixcbn0gZnJvbSAnQGdsaW1tZXIvcmVmZXJlbmNlJztcbmltcG9ydCB7XG4gIENPTlNUQU5UX1RBRyxcbiAgUmV2aXNpb24sXG4gIFRhZyxcbiAgdmFsdWVGb3JUYWcsXG4gIHZhbGlkYXRlVGFnLFxuICBJTklUSUFMLFxuICBiZWdpblRyYWNrRnJhbWUsXG4gIGVuZFRyYWNrRnJhbWUsXG4gIGNvbnN1bWVUYWcsXG59IGZyb20gJ0BnbGltbWVyL3ZhbGlkYXRvcic7XG5pbXBvcnQgeyBhc3NlcnQsIGRlY29kZUhhbmRsZSwgZGVjb2RlSW1tZWRpYXRlLCBleHBlY3QsIGlzSGFuZGxlIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQge1xuICBDaGVja051bWJlcixcbiAgY2hlY2ssXG4gIENoZWNrSW5zdGFuY2VvZixcbiAgQ2hlY2tPcHRpb24sXG4gIENoZWNrQmxvY2tTeW1ib2xUYWJsZSxcbiAgQ2hlY2tIYW5kbGUsXG4gIENoZWNrUHJpbWl0aXZlLFxufSBmcm9tICdAZ2xpbW1lci9kZWJ1Zyc7XG5pbXBvcnQgeyBzdGFja0Fzc2VydCB9IGZyb20gJy4vYXNzZXJ0JztcbmltcG9ydCB7IEFQUEVORF9PUENPREVTIH0gZnJvbSAnLi4vLi4vb3Bjb2Rlcyc7XG5pbXBvcnQgeyBVcGRhdGluZ1ZNIH0gZnJvbSAnLi4vLi4vdm0nO1xuaW1wb3J0IHsgVk1Bcmd1bWVudHNJbXBsIH0gZnJvbSAnLi4vLi4vdm0vYXJndW1lbnRzJztcbmltcG9ydCB7IENoZWNrUmVmZXJlbmNlLCBDaGVja1Njb3BlIH0gZnJvbSAnLi8tZGVidWctc3RyaXAnO1xuaW1wb3J0IHsgQ09OU1RBTlRTIH0gZnJvbSAnLi4vLi4vc3ltYm9scyc7XG5pbXBvcnQgeyBJbnRlcm5hbFZNIH0gZnJvbSAnLi4vLi4vdm0vYXBwZW5kJztcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkNoaWxkU2NvcGUsICh2bSkgPT4gdm0ucHVzaENoaWxkU2NvcGUoKSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Qb3BTY29wZSwgKHZtKSA9PiB2bS5wb3BTY29wZSgpKTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlB1c2hEeW5hbWljU2NvcGUsICh2bSkgPT4gdm0ucHVzaER5bmFtaWNTY29wZSgpKTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlBvcER5bmFtaWNTY29wZSwgKHZtKSA9PiB2bS5wb3BEeW5hbWljU2NvcGUoKSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Db25zdGFudCwgKHZtLCB7IG9wMTogb3RoZXIgfSkgPT4ge1xuICB2bS5zdGFjay5wdXNoKHZtW0NPTlNUQU5UU10uZ2V0VmFsdWUoZGVjb2RlSGFuZGxlKG90aGVyKSkpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Db25zdGFudFJlZmVyZW5jZSwgKHZtLCB7IG9wMTogb3RoZXIgfSkgPT4ge1xuICB2bS5zdGFjay5wdXNoKGNyZWF0ZUNvbnN0UmVmKHZtW0NPTlNUQU5UU10uZ2V0VmFsdWUoZGVjb2RlSGFuZGxlKG90aGVyKSksIGZhbHNlKSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlByaW1pdGl2ZSwgKHZtLCB7IG9wMTogcHJpbWl0aXZlIH0pID0+IHtcbiAgbGV0IHN0YWNrID0gdm0uc3RhY2s7XG5cbiAgaWYgKGlzSGFuZGxlKHByaW1pdGl2ZSkpIHtcbiAgICAvLyBpdCBpcyBhIGhhbmRsZSB3aGljaCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IG9uIHRoZSBzdGFja1xuICAgIGxldCB2YWx1ZSA9IHZtW0NPTlNUQU5UU10uZ2V0VmFsdWUoZGVjb2RlSGFuZGxlKHByaW1pdGl2ZSkpO1xuICAgIHN0YWNrLnB1c2godmFsdWUgYXMgb2JqZWN0KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpcyBhbHJlYWR5IGFuIGVuY29kZWQgaW1tZWRpYXRlIG9yIHByaW1pdGl2ZSBoYW5kbGVcbiAgICBzdGFjay5wdXNoKGRlY29kZUltbWVkaWF0ZShwcmltaXRpdmUpKTtcbiAgfVxufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5QcmltaXRpdmVSZWZlcmVuY2UsICh2bSkgPT4ge1xuICBsZXQgc3RhY2sgPSB2bS5zdGFjaztcbiAgbGV0IHZhbHVlID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrUHJpbWl0aXZlKTtcbiAgbGV0IHJlZjtcblxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJlZiA9IFVOREVGSU5FRF9SRUZFUkVOQ0U7XG4gIH0gZWxzZSBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZWYgPSBOVUxMX1JFRkVSRU5DRTtcbiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgIHJlZiA9IFRSVUVfUkVGRVJFTkNFO1xuICB9IGVsc2UgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgIHJlZiA9IEZBTFNFX1JFRkVSRU5DRTtcbiAgfSBlbHNlIHtcbiAgICByZWYgPSBjcmVhdGVQcmltaXRpdmVSZWYodmFsdWUpO1xuICB9XG5cbiAgc3RhY2sucHVzaChyZWYpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5EdXAsICh2bSwgeyBvcDE6IHJlZ2lzdGVyLCBvcDI6IG9mZnNldCB9KSA9PiB7XG4gIGxldCBwb3NpdGlvbiA9IGNoZWNrKHZtLmZldGNoVmFsdWUocmVnaXN0ZXIpLCBDaGVja051bWJlcikgLSBvZmZzZXQ7XG4gIHZtLnN0YWNrLmR1cChwb3NpdGlvbik7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlBvcCwgKHZtLCB7IG9wMTogY291bnQgfSkgPT4ge1xuICB2bS5zdGFjay5wb3AoY291bnQpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Mb2FkLCAodm0sIHsgb3AxOiByZWdpc3RlciB9KSA9PiB7XG4gIHZtLmxvYWQocmVnaXN0ZXIpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5GZXRjaCwgKHZtLCB7IG9wMTogcmVnaXN0ZXIgfSkgPT4ge1xuICB2bS5mZXRjaChyZWdpc3Rlcik7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkJpbmREeW5hbWljU2NvcGUsICh2bSwgeyBvcDE6IF9uYW1lcyB9KSA9PiB7XG4gIGxldCBuYW1lcyA9IHZtW0NPTlNUQU5UU10uZ2V0QXJyYXk8c3RyaW5nPihfbmFtZXMpO1xuICB2bS5iaW5kRHluYW1pY1Njb3BlKG5hbWVzKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuRW50ZXIsICh2bSwgeyBvcDE6IGFyZ3MgfSkgPT4ge1xuICB2bS5lbnRlcihhcmdzKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuRXhpdCwgKHZtKSA9PiB7XG4gIHZtLmV4aXQoKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuUHVzaFN5bWJvbFRhYmxlLCAodm0sIHsgb3AxOiBfdGFibGUgfSkgPT4ge1xuICBsZXQgc3RhY2sgPSB2bS5zdGFjaztcbiAgc3RhY2sucHVzaCh2bVtDT05TVEFOVFNdLmdldFZhbHVlKF90YWJsZSkpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5QdXNoQmxvY2tTY29wZSwgKHZtKSA9PiB7XG4gIGxldCBzdGFjayA9IHZtLnN0YWNrO1xuICBzdGFjay5wdXNoKHZtLnNjb3BlKCkpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Db21waWxlQmxvY2ssICh2bTogSW50ZXJuYWxWTSkgPT4ge1xuICBsZXQgc3RhY2sgPSB2bS5zdGFjaztcbiAgbGV0IGJsb2NrID0gc3RhY2sucG9wPE9wdGlvbjxDb21waWxhYmxlVGVtcGxhdGU+IHwgMD4oKTtcblxuICBpZiAoYmxvY2spIHtcbiAgICBzdGFjay5wdXNoKHZtLmNvbXBpbGUoYmxvY2spKTtcbiAgfSBlbHNlIHtcbiAgICBzdGFjay5wdXNoKG51bGwpO1xuICB9XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkludm9rZVlpZWxkLCAodm0pID0+IHtcbiAgbGV0IHsgc3RhY2sgfSA9IHZtO1xuXG4gIGxldCBoYW5kbGUgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tPcHRpb24oQ2hlY2tIYW5kbGUpKTtcbiAgbGV0IHNjb3BlID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrT3B0aW9uKENoZWNrU2NvcGUpKTtcbiAgbGV0IHRhYmxlID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrT3B0aW9uKENoZWNrQmxvY2tTeW1ib2xUYWJsZSkpO1xuXG4gIGFzc2VydChcbiAgICB0YWJsZSA9PT0gbnVsbCB8fCAodGFibGUgJiYgdHlwZW9mIHRhYmxlID09PSAnb2JqZWN0JyAmJiBBcnJheS5pc0FycmF5KHRhYmxlLnBhcmFtZXRlcnMpKSxcbiAgICBzdGFja0Fzc2VydCgnT3B0aW9uPEJsb2NrU3ltYm9sVGFibGU+JywgdGFibGUpXG4gICk7XG5cbiAgbGV0IGFyZ3MgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tJbnN0YW5jZW9mKFZNQXJndW1lbnRzSW1wbCkpO1xuXG4gIGlmICh0YWJsZSA9PT0gbnVsbCkge1xuICAgIC8vIFRvIGJhbGFuY2UgdGhlIHBvcHtGcmFtZSxTY29wZX1cbiAgICB2bS5wdXNoRnJhbWUoKTtcbiAgICB2bS5wdXNoU2NvcGUoc2NvcGUgPz8gdm0uc2NvcGUoKSk7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgaW52b2tpbmdTY29wZSA9IGV4cGVjdChzY29wZSwgJ0JVRzogZXhwZWN0ZWQgc2NvcGUnKTtcblxuICAvLyBJZiBuZWNlc3NhcnksIGNyZWF0ZSBhIGNoaWxkIHNjb3BlXG4gIHtcbiAgICBsZXQgbG9jYWxzID0gdGFibGUucGFyYW1ldGVycztcbiAgICBsZXQgbG9jYWxzQ291bnQgPSBsb2NhbHMubGVuZ3RoO1xuXG4gICAgaWYgKGxvY2Fsc0NvdW50ID4gMCkge1xuICAgICAgaW52b2tpbmdTY29wZSA9IGludm9raW5nU2NvcGUuY2hpbGQoKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbHNDb3VudDsgaSsrKSB7XG4gICAgICAgIGludm9raW5nU2NvcGUuYmluZFN5bWJvbChsb2NhbHMhW2ldLCBhcmdzLmF0KGkpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2bS5wdXNoRnJhbWUoKTtcbiAgdm0ucHVzaFNjb3BlKGludm9raW5nU2NvcGUpO1xuICB2bS5jYWxsKGhhbmRsZSEpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5KdW1wSWYsICh2bSwgeyBvcDE6IHRhcmdldCB9KSA9PiB7XG4gIGxldCByZWZlcmVuY2UgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICBsZXQgdmFsdWUgPSBCb29sZWFuKHZhbHVlRm9yUmVmKHJlZmVyZW5jZSkpO1xuXG4gIGlmIChpc0NvbnN0UmVmKHJlZmVyZW5jZSkpIHtcbiAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgIHZtLmdvdG8odGFyZ2V0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICB2bS5nb3RvKHRhcmdldCk7XG4gICAgfVxuXG4gICAgdm0udXBkYXRlV2l0aChuZXcgQXNzZXJ0KHJlZmVyZW5jZSkpO1xuICB9XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkp1bXBVbmxlc3MsICh2bSwgeyBvcDE6IHRhcmdldCB9KSA9PiB7XG4gIGxldCByZWZlcmVuY2UgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICBsZXQgdmFsdWUgPSBCb29sZWFuKHZhbHVlRm9yUmVmKHJlZmVyZW5jZSkpO1xuXG4gIGlmIChpc0NvbnN0UmVmKHJlZmVyZW5jZSkpIHtcbiAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICB2bS5nb3RvKHRhcmdldCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgIHZtLmdvdG8odGFyZ2V0KTtcbiAgICB9XG5cbiAgICB2bS51cGRhdGVXaXRoKG5ldyBBc3NlcnQocmVmZXJlbmNlKSk7XG4gIH1cbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuSnVtcEVxLCAodm0sIHsgb3AxOiB0YXJnZXQsIG9wMjogY29tcGFyaXNvbiB9KSA9PiB7XG4gIGxldCBvdGhlciA9IGNoZWNrKHZtLnN0YWNrLnBlZWsoKSwgQ2hlY2tOdW1iZXIpO1xuXG4gIGlmIChvdGhlciA9PT0gY29tcGFyaXNvbikge1xuICAgIHZtLmdvdG8odGFyZ2V0KTtcbiAgfVxufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Bc3NlcnRTYW1lLCAodm0pID0+IHtcbiAgbGV0IHJlZmVyZW5jZSA9IGNoZWNrKHZtLnN0YWNrLnBlZWsoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuXG4gIGlmIChpc0NvbnN0UmVmKHJlZmVyZW5jZSkgPT09IGZhbHNlKSB7XG4gICAgdm0udXBkYXRlV2l0aChuZXcgQXNzZXJ0KHJlZmVyZW5jZSkpO1xuICB9XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlRvQm9vbGVhbiwgKHZtKSA9PiB7XG4gIGxldCB7IHN0YWNrIH0gPSB2bTtcbiAgbGV0IHZhbHVlUmVmID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcblxuICBzdGFjay5wdXNoKGNyZWF0ZUNvbXB1dGVSZWYoKCkgPT4gdG9Cb29sKHZhbHVlRm9yUmVmKHZhbHVlUmVmKSkpKTtcbn0pO1xuXG5leHBvcnQgY2xhc3MgQXNzZXJ0IGltcGxlbWVudHMgVXBkYXRpbmdPcGNvZGUge1xuICBwcml2YXRlIGxhc3Q6IHVua25vd247XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWY6IFJlZmVyZW5jZSkge1xuICAgIHRoaXMubGFzdCA9IHZhbHVlRm9yUmVmKHJlZik7XG4gIH1cblxuICBldmFsdWF0ZSh2bTogVXBkYXRpbmdWTSkge1xuICAgIGxldCB7IGxhc3QsIHJlZiB9ID0gdGhpcztcbiAgICBsZXQgY3VycmVudCA9IHZhbHVlRm9yUmVmKHJlZik7XG5cbiAgICBpZiAobGFzdCAhPT0gY3VycmVudCkge1xuICAgICAgdm0udGhyb3coKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFzc2VydEZpbHRlcjxULCBVPiBpbXBsZW1lbnRzIFVwZGF0aW5nT3Bjb2RlIHtcbiAgcHJpdmF0ZSBsYXN0OiBVO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVmOiBSZWZlcmVuY2U8VD4sIHByaXZhdGUgZmlsdGVyOiAoZnJvbTogVCkgPT4gVSkge1xuICAgIHRoaXMubGFzdCA9IGZpbHRlcih2YWx1ZUZvclJlZihyZWYpKTtcbiAgfVxuXG4gIGV2YWx1YXRlKHZtOiBVcGRhdGluZ1ZNKSB7XG4gICAgbGV0IHsgbGFzdCwgcmVmLCBmaWx0ZXIgfSA9IHRoaXM7XG4gICAgbGV0IGN1cnJlbnQgPSBmaWx0ZXIodmFsdWVGb3JSZWYocmVmKSk7XG5cbiAgICBpZiAobGFzdCAhPT0gY3VycmVudCkge1xuICAgICAgdm0udGhyb3coKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEp1bXBJZk5vdE1vZGlmaWVkT3Bjb2RlIGltcGxlbWVudHMgVXBkYXRpbmdPcGNvZGUge1xuICBwcml2YXRlIHRhZzogVGFnID0gQ09OU1RBTlRfVEFHO1xuICBwcml2YXRlIGxhc3RSZXZpc2lvbjogUmV2aXNpb24gPSBJTklUSUFMO1xuICBwcml2YXRlIHRhcmdldD86IG51bWJlcjtcblxuICBmaW5hbGl6ZSh0YWc6IFRhZywgdGFyZ2V0OiBudW1iZXIpIHtcbiAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICB0aGlzLmRpZE1vZGlmeSh0YWcpO1xuICB9XG5cbiAgZXZhbHVhdGUodm06IFVwZGF0aW5nVk0pIHtcbiAgICBsZXQgeyB0YWcsIHRhcmdldCwgbGFzdFJldmlzaW9uIH0gPSB0aGlzO1xuXG4gICAgaWYgKCF2bS5hbHdheXNSZXZhbGlkYXRlICYmIHZhbGlkYXRlVGFnKHRhZywgbGFzdFJldmlzaW9uKSkge1xuICAgICAgY29uc3VtZVRhZyh0YWcpO1xuICAgICAgdm0uZ290byhleHBlY3QodGFyZ2V0LCAnVk0gQlVHOiBUYXJnZXQgbXVzdCBiZSBzZXQgYmVmb3JlIGF0dGVtcHRpbmcgdG8ganVtcCcpKTtcbiAgICB9XG4gIH1cblxuICBkaWRNb2RpZnkodGFnOiBUYWcpIHtcbiAgICB0aGlzLnRhZyA9IHRhZztcbiAgICB0aGlzLmxhc3RSZXZpc2lvbiA9IHZhbHVlRm9yVGFnKHRoaXMudGFnKTtcbiAgICBjb25zdW1lVGFnKHRhZyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJlZ2luVHJhY2tGcmFtZU9wY29kZSBpbXBsZW1lbnRzIFVwZGF0aW5nT3Bjb2RlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkZWJ1Z0xhYmVsPzogc3RyaW5nKSB7fVxuXG4gIGV2YWx1YXRlKCkge1xuICAgIGJlZ2luVHJhY2tGcmFtZSh0aGlzLmRlYnVnTGFiZWwpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbmRUcmFja0ZyYW1lT3Bjb2RlIGltcGxlbWVudHMgVXBkYXRpbmdPcGNvZGUge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRhcmdldDogSnVtcElmTm90TW9kaWZpZWRPcGNvZGUpIHt9XG5cbiAgZXZhbHVhdGUoKSB7XG4gICAgbGV0IHRhZyA9IGVuZFRyYWNrRnJhbWUoKTtcbiAgICB0aGlzLnRhcmdldC5kaWRNb2RpZnkodGFnKTtcbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==