@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
346 lines (307 loc) • 34.7 kB
JavaScript
import { valueForRef, isConstRef, createComputeRef } from '@glimmer/reference';
import { valueForTag, validateTag, consumeTag, CURRENT_TAG } from '@glimmer/validator';
import { $t0 } from '@glimmer/vm';
import { APPEND_OPCODES } from '../../opcodes';
import { Assert } from './vm';
import { CONSTANTS } from '../../symbols';
import { assign, debugToString, isObject } from '@glimmer/util';
import { isCurriedType, resolveCurriedValue } from '../../curried-value';
import { DEBUG } from '@glimmer/env';
import { associateDestroyableChild, destroy } from '@glimmer/destroyable';
APPEND_OPCODES.add(41
/* Text */
, (vm, {
op1: text
}) => {
vm.elements().appendText(vm[CONSTANTS].getValue(text));
});
APPEND_OPCODES.add(42
/* Comment */
, (vm, {
op1: text
}) => {
vm.elements().appendComment(vm[CONSTANTS].getValue(text));
});
APPEND_OPCODES.add(48
/* OpenElement */
, (vm, {
op1: tag
}) => {
vm.elements().openElement(vm[CONSTANTS].getValue(tag));
});
APPEND_OPCODES.add(49
/* OpenDynamicElement */
, vm => {
let tagName = valueForRef(vm.stack.pop());
vm.elements().openElement(tagName);
});
APPEND_OPCODES.add(50
/* PushRemoteElement */
, vm => {
let elementRef = vm.stack.pop();
let insertBeforeRef = vm.stack.pop();
let guidRef = vm.stack.pop();
let element = valueForRef(elementRef);
let insertBefore = valueForRef(insertBeforeRef);
let guid = valueForRef(guidRef);
if (!isConstRef(elementRef)) {
vm.updateWith(new Assert(elementRef));
}
if (insertBefore !== undefined && !isConstRef(insertBeforeRef)) {
vm.updateWith(new Assert(insertBeforeRef));
}
let block = vm.elements().pushRemoteElement(element, guid, insertBefore);
if (block) vm.associateDestroyable(block);
});
APPEND_OPCODES.add(56
/* PopRemoteElement */
, vm => {
vm.elements().popRemoteElement();
});
APPEND_OPCODES.add(54
/* FlushElement */
, vm => {
let operations = vm.fetchValue($t0);
let modifiers = null;
if (operations) {
modifiers = operations.flush(vm);
vm.loadValue($t0, null);
}
vm.elements().flushElement(modifiers);
});
APPEND_OPCODES.add(55
/* CloseElement */
, vm => {
let modifiers = vm.elements().closeElement();
if (modifiers) {
modifiers.forEach(modifier => {
vm.env.scheduleInstallModifier(modifier);
let {
manager,
state
} = modifier;
let d = manager.getDestroyable(state);
if (d) {
vm.associateDestroyable(d);
}
});
}
});
APPEND_OPCODES.add(57
/* Modifier */
, (vm, {
op1: handle
}) => {
if (vm.env.isInteractive === false) {
return;
}
let owner = vm.getOwner();
let args = vm.stack.pop();
let definition = vm[CONSTANTS].getValue(handle);
let {
manager
} = definition;
let {
constructing
} = vm.elements();
let state = manager.create(owner, constructing, definition.state, args.capture());
let instance = {
manager,
state,
definition
};
let operations = vm.fetchValue($t0);
operations.addModifier(instance);
let tag = manager.getTag(state);
if (tag !== null) {
consumeTag(tag);
return vm.updateWith(new UpdateModifierOpcode(tag, instance));
}
});
APPEND_OPCODES.add(108
/* DynamicModifier */
, vm => {
if (vm.env.isInteractive === false) {
return;
}
let {
stack,
[CONSTANTS]: constants
} = vm;
let ref = stack.pop();
let args = stack.pop().capture();
let {
constructing
} = vm.elements();
let initialOwner = vm.getOwner();
let instanceRef = createComputeRef(() => {
let value = valueForRef(ref);
let owner;
if (!isObject(value)) {
return;
}
let hostDefinition;
if (isCurriedType(value, 2
/* Modifier */
)) {
let {
definition: resolvedDefinition,
owner: curriedOwner,
positional,
named
} = resolveCurriedValue(value);
hostDefinition = resolvedDefinition;
owner = curriedOwner;
if (positional !== undefined) {
args.positional = positional.concat(args.positional);
}
if (named !== undefined) {
args.named = assign({}, ...named, args.named);
}
} else {
hostDefinition = value;
owner = initialOwner;
}
let handle = constants.modifier(hostDefinition, null, true);
if (DEBUG && handle === null) {
throw new Error(`Expected a dynamic modifier definition, but received an object or function that did not have a modifier manager associated with it. The dynamic invocation was \`{{${ref.debugLabel}}}\`, and the incorrect definition is the value at the path \`${ref.debugLabel}\`, which was: ${debugToString(hostDefinition)}`);
}
let definition = constants.getValue(handle);
let {
manager
} = definition;
let state = manager.create(owner, constructing, definition.state, args);
return {
manager,
state,
definition
};
});
let instance = valueForRef(instanceRef);
let tag = null;
if (instance !== undefined) {
let operations = vm.fetchValue($t0);
operations.addModifier(instance);
tag = instance.manager.getTag(instance.state);
if (tag !== null) {
consumeTag(tag);
}
}
if (!isConstRef(ref) || tag) {
return vm.updateWith(new UpdateDynamicModifierOpcode(tag, instance, instanceRef));
}
});
export class UpdateModifierOpcode {
constructor(tag, modifier) {
this.tag = tag;
this.modifier = modifier;
this.lastUpdated = valueForTag(tag);
}
evaluate(vm) {
let {
modifier,
tag,
lastUpdated
} = this;
consumeTag(tag);
if (!validateTag(tag, lastUpdated)) {
vm.env.scheduleUpdateModifier(modifier);
this.lastUpdated = valueForTag(tag);
}
}
}
export class UpdateDynamicModifierOpcode {
constructor(tag, instance, instanceRef) {
this.tag = tag;
this.instance = instance;
this.instanceRef = instanceRef;
this.lastUpdated = valueForTag(tag !== null && tag !== void 0 ? tag : CURRENT_TAG);
}
evaluate(vm) {
let {
tag,
lastUpdated,
instance,
instanceRef
} = this;
let newInstance = valueForRef(instanceRef);
if (newInstance !== instance) {
if (instance !== undefined) {
let destroyable = instance.manager.getDestroyable(instance.state);
if (destroyable !== null) {
destroy(destroyable);
}
}
if (newInstance !== undefined) {
let {
manager,
state
} = newInstance;
let destroyable = manager.getDestroyable(state);
if (destroyable !== null) {
associateDestroyableChild(this, destroyable);
}
tag = manager.getTag(state);
if (tag !== null) {
this.lastUpdated = valueForTag(tag);
}
this.tag = tag;
vm.env.scheduleInstallModifier(newInstance);
}
this.instance = newInstance;
} else if (tag !== null && !validateTag(tag, lastUpdated)) {
vm.env.scheduleUpdateModifier(instance);
this.lastUpdated = valueForTag(tag);
}
if (tag !== null) {
consumeTag(tag);
}
}
}
APPEND_OPCODES.add(51
/* StaticAttr */
, (vm, {
op1: _name,
op2: _value,
op3: _namespace
}) => {
let name = vm[CONSTANTS].getValue(_name);
let value = vm[CONSTANTS].getValue(_value);
let namespace = _namespace ? vm[CONSTANTS].getValue(_namespace) : null;
vm.elements().setStaticAttribute(name, value, namespace);
});
APPEND_OPCODES.add(52
/* DynamicAttr */
, (vm, {
op1: _name,
op2: _trusting,
op3: _namespace
}) => {
let name = vm[CONSTANTS].getValue(_name);
let trusting = vm[CONSTANTS].getValue(_trusting);
let reference = vm.stack.pop();
let value = valueForRef(reference);
let namespace = _namespace ? vm[CONSTANTS].getValue(_namespace) : null;
let attribute = vm.elements().setDynamicAttribute(name, value, trusting, namespace);
if (!isConstRef(reference)) {
vm.updateWith(new UpdateDynamicAttributeOpcode(reference, attribute, vm.env));
}
});
export class UpdateDynamicAttributeOpcode {
constructor(reference, attribute, env) {
let initialized = false;
this.updateRef = createComputeRef(() => {
let value = valueForRef(reference);
if (initialized === true) {
attribute.update(value, env);
} else {
initialized = true;
}
});
valueForRef(this.updateRef);
}
evaluate() {
valueForRef(this.updateRef);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2NvbXBpbGVkL29wY29kZXMvZG9tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFNBQW9CLFdBQXBCLEVBQWlDLFVBQWpDLEVBQTZDLGdCQUE3QyxRQUFxRSxvQkFBckU7QUFDQSxTQUdFLFdBSEYsRUFJRSxXQUpGLEVBS0UsVUFMRixFQU1FLFdBTkYsUUFPTyxvQkFQUDtBQTZCQSxTQUFTLEdBQVQsUUFBb0IsYUFBcEI7QUFDQSxTQUFTLGNBQVQsUUFBK0IsZUFBL0I7QUFDQSxTQUFTLE1BQVQsUUFBdUIsTUFBdkI7QUFHQSxTQUFTLFNBQVQsUUFBMEIsZUFBMUI7QUFDQSxTQUFTLE1BQVQsRUFBaUIsYUFBakIsRUFBd0MsUUFBeEMsUUFBd0QsZUFBeEQ7QUFDQSxTQUF1QixhQUF2QixFQUFzQyxtQkFBdEMsUUFBaUUscUJBQWpFO0FBQ0EsU0FBUyxLQUFULFFBQXNCLGNBQXRCO0FBQ0EsU0FBUyx5QkFBVCxFQUFvQyxPQUFwQyxRQUFtRCxzQkFBbkQ7QUFFQSxjQUFjLENBQUMsR0FBZixDQUFrQjtBQUFBO0FBQWxCLEVBQTRCLENBQUMsRUFBRCxFQUFLO0FBQUUsRUFBQSxHQUFHLEVBQUU7QUFBUCxDQUFMLEtBQXNCO0FBQ2hELEVBQUEsRUFBRSxDQUFDLFFBQUgsR0FBYyxVQUFkLENBQXlCLEVBQUUsQ0FBQyxTQUFELENBQUYsQ0FBYyxRQUFkLENBQXVCLElBQXZCLENBQXpCO0FBQ0QsQ0FGRDtBQUlBLGNBQWMsQ0FBQyxHQUFmLENBQWtCO0FBQUE7QUFBbEIsRUFBK0IsQ0FBQyxFQUFELEVBQUs7QUFBRSxFQUFBLEdBQUcsRUFBRTtBQUFQLENBQUwsS0FBc0I7QUFDbkQsRUFBQSxFQUFFLENBQUMsUUFBSCxHQUFjLGFBQWQsQ0FBNEIsRUFBRSxDQUFDLFNBQUQsQ0FBRixDQUFjLFFBQWQsQ0FBdUIsSUFBdkIsQ0FBNUI7QUFDRCxDQUZEO0FBSUEsY0FB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QUZELE1BRU87QUFDTCxRQUFBLFdBQVcsR0FBRyxJQUFkO0FBQ0Q7QUFDRixLQVJnQyxDQUFqQztBQVVBLElBQUEsV0FBVyxDQUFDLEtBQUssU0FBTixDQUFYO0FBQ0Q7O0FBRUQsRUFBQSxRQUFRLEdBQUE7QUFDTixJQUFBLFdBQVcsQ0FBQyxLQUFLLFNBQU4sQ0FBWDtBQUNEOztBQXJCc0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWZlcmVuY2UsIHZhbHVlRm9yUmVmLCBpc0NvbnN0UmVmLCBjcmVhdGVDb21wdXRlUmVmIH0gZnJvbSAnQGdsaW1tZXIvcmVmZXJlbmNlJztcbmltcG9ydCB7XG4gIFJldmlzaW9uLFxuICBUYWcsXG4gIHZhbHVlRm9yVGFnLFxuICB2YWxpZGF0ZVRhZyxcbiAgY29uc3VtZVRhZyxcbiAgQ1VSUkVOVF9UQUcsXG59IGZyb20gJ0BnbGltbWVyL3ZhbGlkYXRvcic7XG5pbXBvcnQge1xuICBjaGVjayxcbiAgQ2hlY2tTdHJpbmcsXG4gIENoZWNrRWxlbWVudCxcbiAgQ2hlY2tPcHRpb24sXG4gIENoZWNrTm9kZSxcbiAgQ2hlY2tNYXliZSxcbn0gZnJvbSAnQGdsaW1tZXIvZGVidWcnO1xuaW1wb3J0IHtcbiAgT3AsXG4gIE9wdGlvbixcbiAgTW9kaWZpZXJEZWZpbml0aW9uLFxuICBNb2RpZmllckluc3RhbmNlLFxuICBPd25lcixcbiAgQ2FwdHVyZWRQb3NpdGlvbmFsQXJndW1lbnRzLFxuICBDdXJyaWVkVHlwZSxcbiAgTW9kaWZpZXJEZWZpbml0aW9uU3RhdGUsXG4gIEVudmlyb25tZW50LFxuICBVcGRhdGluZ1ZNLFxuICBVcGRhdGluZ09wY29kZSxcbn0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyAkdDAgfSBmcm9tICdAZ2xpbW1lci92bSc7XG5pbXBvcnQgeyBBUFBFTkRfT1BDT0RFUyB9IGZyb20gJy4uLy4uL29wY29kZXMnO1xuaW1wb3J0IHsgQXNzZXJ0IH0gZnJvbSAnLi92bSc7XG5pbXBvcnQgeyBEeW5hbWljQXR0cmlidXRlIH0gZnJvbSAnLi4vLi4vdm0vYXR0cmlidXRlcy9keW5hbWljJztcbmltcG9ydCB7IENoZWNrUmVmZXJlbmNlLCBDaGVja0FyZ3VtZW50cywgQ2hlY2tPcGVyYXRpb25zIH0gZnJvbSAnLi8tZGVidWctc3RyaXAnO1xuaW1wb3J0IHsgQ09OU1RBTlRTIH0gZnJvbSAnLi4vLi4vc3ltYm9scyc7XG5pbXBvcnQgeyBhc3NpZ24sIGRlYnVnVG9TdHJpbmcsIGV4cGVjdCwgaXNPYmplY3QgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcbmltcG9ydCB7IEN1cnJpZWRWYWx1ZSwgaXNDdXJyaWVkVHlwZSwgcmVzb2x2ZUN1cnJpZWRWYWx1ZSB9IGZyb20gJy4uLy4uL2N1cnJpZWQtdmFsdWUnO1xuaW1wb3J0IHsgREVCVUcgfSBmcm9tICdAZ2xpbW1lci9lbnYnO1xuaW1wb3J0IHsgYXNzb2NpYXRlRGVzdHJveWFibGVDaGlsZCwgZGVzdHJveSB9IGZyb20gJ0BnbGltbWVyL2Rlc3Ryb3lhYmxlJztcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlRleHQsICh2bSwgeyBvcDE6IHRleHQgfSkgPT4ge1xuICB2bS5lbGVtZW50cygpLmFwcGVuZFRleHQodm1bQ09OU1RBTlRTXS5nZXRWYWx1ZSh0ZXh0KSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkNvbW1lbnQsICh2bSwgeyBvcDE6IHRleHQgfSkgPT4ge1xuICB2bS5lbGVtZW50cygpLmFwcGVuZENvbW1lbnQodm1bQ09OU1RBTlRTXS5nZXRWYWx1ZSh0ZXh0KSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLk9wZW5FbGVtZW50LCAodm0sIHsgb3AxOiB0YWcgfSkgPT4ge1xuICB2bS5lbGVtZW50cygpLm9wZW5FbGVtZW50KHZtW0NPTlNUQU5UU10uZ2V0VmFsdWUodGFnKSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLk9wZW5EeW5hbWljRWxlbWVudCwgKHZtKSA9PiB7XG4gIGxldCB0YWdOYW1lID0gY2hlY2sodmFsdWVGb3JSZWYoY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKSksIENoZWNrU3RyaW5nKTtcbiAgdm0uZWxlbWVudHMoKS5vcGVuRWxlbWVudCh0YWdOYW1lKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuUHVzaFJlbW90ZUVsZW1lbnQsICh2bSkgPT4ge1xuICBsZXQgZWxlbWVudFJlZiA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG4gIGxldCBpbnNlcnRCZWZvcmVSZWYgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICBsZXQgZ3VpZFJlZiA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG5cbiAgbGV0IGVsZW1lbnQgPSBjaGVjayh2YWx1ZUZvclJlZihlbGVtZW50UmVmKSwgQ2hlY2tFbGVtZW50KTtcbiAgbGV0IGluc2VydEJlZm9yZSA9IGNoZWNrKHZhbHVlRm9yUmVmKGluc2VydEJlZm9yZVJlZiksIENoZWNrTWF5YmUoQ2hlY2tPcHRpb24oQ2hlY2tOb2RlKSkpO1xuICBsZXQgZ3VpZCA9IHZhbHVlRm9yUmVmKGd1aWRSZWYpIGFzIHN0cmluZztcblxuICBpZiAoIWlzQ29uc3RSZWYoZWxlbWVudFJlZikpIHtcbiAgICB2bS51cGRhdGVXaXRoKG5ldyBBc3NlcnQoZWxlbWVudFJlZikpO1xuICB9XG5cbiAgaWYgKGluc2VydEJlZm9yZSAhPT0gdW5kZWZpbmVkICYmICFpc0NvbnN0UmVmKGluc2VydEJlZm9yZVJlZikpIHtcbiAgICB2bS51cGRhdGVXaXRoKG5ldyBBc3NlcnQoaW5zZXJ0QmVmb3JlUmVmKSk7XG4gIH1cblxuICBsZXQgYmxvY2sgPSB2bS5lbGVtZW50cygpLnB1c2hSZW1vdGVFbGVtZW50KGVsZW1lbnQsIGd1aWQsIGluc2VydEJlZm9yZSk7XG4gIGlmIChibG9jaykgdm0uYXNzb2NpYXRlRGVzdHJveWFibGUoYmxvY2spO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Qb3BSZW1vdGVFbGVtZW50LCAodm0pID0+IHtcbiAgdm0uZWxlbWVudHMoKS5wb3BSZW1vdGVFbGVtZW50KCk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkZsdXNoRWxlbWVudCwgKHZtKSA9PiB7XG4gIGxldCBvcGVyYXRpb25zID0gY2hlY2sodm0uZmV0Y2hWYWx1ZSgkdDApLCBDaGVja09wZXJhdGlvbnMpO1xuICBsZXQgbW9kaWZpZXJzOiBPcHRpb248TW9kaWZpZXJJbnN0YW5jZVtdPiA9IG51bGw7XG5cbiAgaWYgKG9wZXJhdGlvbnMpIHtcbiAgICBtb2RpZmllcnMgPSBvcGVyYXRpb25zLmZsdXNoKHZtKTtcbiAgICB2bS5sb2FkVmFsdWUoJHQwLCBudWxsKTtcbiAgfVxuXG4gIHZtLmVsZW1lbnRzKCkuZmx1c2hFbGVtZW50KG1vZGlmaWVycyk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkNsb3NlRWxlbWVudCwgKHZtKSA9PiB7XG4gIGxldCBtb2RpZmllcnMgPSB2bS5lbGVtZW50cygpLmNsb3NlRWxlbWVudCgpO1xuXG4gIGlmIChtb2RpZmllcnMpIHtcbiAgICBtb2RpZmllcnMuZm9yRWFjaCgobW9kaWZpZXIpID0+IHtcbiAgICAgIHZtLmVudi5zY2hlZHVsZUluc3RhbGxNb2RpZmllcihtb2RpZmllcik7XG4gICAgICBsZXQgeyBtYW5hZ2VyLCBzdGF0ZSB9ID0gbW9kaWZpZXI7XG4gICAgICBsZXQgZCA9IG1hbmFnZXIuZ2V0RGVzdHJveWFibGUoc3RhdGUpO1xuXG4gICAgICBpZiAoZCkge1xuICAgICAgICB2bS5hc3NvY2lhdGVEZXN0cm95YWJsZShkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Nb2RpZmllciwgKHZtLCB7IG9wMTogaGFuZGxlIH0pID0+IHtcbiAgaWYgKHZtLmVudi5pc0ludGVyYWN0aXZlID09PSBmYWxzZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBvd25lciA9IHZtLmdldE93bmVyKCk7XG4gIGxldCBhcmdzID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrQXJndW1lbnRzKTtcbiAgbGV0IGRlZmluaXRpb24gPSB2bVtDT05TVEFOVFNdLmdldFZhbHVlPE1vZGlmaWVyRGVmaW5pdGlvbj4oaGFuZGxlKTtcblxuICBsZXQgeyBtYW5hZ2VyIH0gPSBkZWZpbml0aW9uO1xuXG4gIGxldCB7IGNvbnN0cnVjdGluZyB9ID0gdm0uZWxlbWVudHMoKTtcblxuICBsZXQgc3RhdGUgPSBtYW5hZ2VyLmNyZWF0ZShcbiAgICBvd25lcixcbiAgICBleHBlY3QoY29uc3RydWN0aW5nLCAnQlVHOiBFbGVtZW50TW9kaWZpZXIgY291bGQgbm90IGZpbmQgdGhlIGVsZW1lbnQgaXQgYXBwbGllcyB0bycpLFxuICAgIGRlZmluaXRpb24uc3RhdGUsXG4gICAgYXJncy5jYXB0dXJlKClcbiAgKTtcblxuICBsZXQgaW5zdGFuY2U6IE1vZGlmaWVySW5zdGFuY2UgPSB7XG4gICAgbWFuYWdlcixcbiAgICBzdGF0ZSxcbiAgICBkZWZpbml0aW9uLFxuICB9O1xuXG4gIGxldCBvcGVyYXRpb25zID0gZXhwZWN0KFxuICAgIGNoZWNrKHZtLmZldGNoVmFsdWUoJHQwKSwgQ2hlY2tPcGVyYXRpb25zKSxcbiAgICAnQlVHOiBFbGVtZW50TW9kaWZpZXIgY291bGQgbm90IGZpbmQgb3BlcmF0aW9ucyB0byBhcHBlbmQgdG8nXG4gICk7XG5cbiAgb3BlcmF0aW9ucy5hZGRNb2RpZmllcihpbnN0YW5jZSk7XG5cbiAgbGV0IHRhZyA9IG1hbmFnZXIuZ2V0VGFnKHN0YXRlKTtcblxuICBpZiAodGFnICE9PSBudWxsKSB7XG4gICAgY29uc3VtZVRhZyh0YWcpO1xuICAgIHJldHVybiB2bS51cGRhdGVXaXRoKG5ldyBVcGRhdGVNb2RpZmllck9wY29kZSh0YWcsIGluc3RhbmNlKSk7XG4gIH1cbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuRHluYW1pY01vZGlmaWVyLCAodm0pID0+IHtcbiAgaWYgKHZtLmVudi5pc0ludGVyYWN0aXZlID09PSBmYWxzZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCB7IHN0YWNrLCBbQ09OU1RBTlRTXTogY29uc3RhbnRzIH0gPSB2bTtcbiAgbGV0IHJlZiA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG4gIGxldCBhcmdzID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrQXJndW1lbnRzKS5jYXB0dXJlKCk7XG4gIGxldCB7IGNvbnN0cnVjdGluZyB9ID0gdm0uZWxlbWVudHMoKTtcbiAgbGV0IGluaXRpYWxPd25lciA9IHZtLmdldE93bmVyKCk7XG5cbiAgbGV0IGluc3RhbmNlUmVmID0gY3JlYXRlQ29tcHV0ZVJlZigoKSA9PiB7XG4gICAgbGV0IHZhbHVlID0gdmFsdWVGb3JSZWYocmVmKTtcbiAgICBsZXQgb3duZXI6IE93bmVyO1xuXG4gICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgaG9zdERlZmluaXRpb246IEN1cnJpZWRWYWx1ZSB8IE1vZGlmaWVyRGVmaW5pdGlvblN0YXRlO1xuXG4gICAgaWYgKGlzQ3VycmllZFR5cGUodmFsdWUsIEN1cnJpZWRUeXBlLk1vZGlmaWVyKSkge1xuICAgICAgbGV0IHtcbiAgICAgICAgZGVmaW5pdGlvbjogcmVzb2x2ZWREZWZpbml0aW9uLFxuICAgICAgICBvd25lcjogY3VycmllZE93bmVyLFxuICAgICAgICBwb3NpdGlvbmFsLFxuICAgICAgICBuYW1lZCxcbiAgICAgIH0gPSByZXNvbHZlQ3VycmllZFZhbHVlKHZhbHVlKTtcblxuICAgICAgaG9zdERlZmluaXRpb24gPSByZXNvbHZlZERlZmluaXRpb247XG4gICAgICBvd25lciA9IGN1cnJpZWRPd25lcjtcblxuICAgICAgaWYgKHBvc2l0aW9uYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhcmdzLnBvc2l0aW9uYWwgPSBwb3NpdGlvbmFsLmNvbmNhdChhcmdzLnBvc2l0aW9uYWwpIGFzIENhcHR1cmVkUG9zaXRpb25hbEFyZ3VtZW50cztcbiAgICAgIH1cblxuICAgICAgaWYgKG5hbWVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXJncy5uYW1lZCA9IGFzc2lnbih7fSwgLi4ubmFtZWQsIGFyZ3MubmFtZWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBob3N0RGVmaW5pdGlvbiA9IHZhbHVlO1xuICAgICAgb3duZXIgPSBpbml0aWFsT3duZXI7XG4gICAgfVxuXG4gICAgbGV0IGhhbmRsZSA9IGNvbnN0YW50cy5tb2RpZmllcihob3N0RGVmaW5pdGlvbiwgbnVsbCwgdHJ1ZSk7XG5cbiAgICBpZiAoREVCVUcgJiYgaGFuZGxlID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBFeHBlY3RlZCBhIGR5bmFtaWMgbW9kaWZpZXIgZGVmaW5pdGlvbiwgYnV0IHJlY2VpdmVkIGFuIG9iamVjdCBvciBmdW5jdGlvbiB0aGF0IGRpZCBub3QgaGF2ZSBhIG1vZGlmaWVyIG1hbmFnZXIgYXNzb2NpYXRlZCB3aXRoIGl0LiBUaGUgZHluYW1pYyBpbnZvY2F0aW9uIHdhcyBcXGB7eyR7XG4gICAgICAgICAgcmVmLmRlYnVnTGFiZWxcbiAgICAgICAgfX19XFxgLCBhbmQgdGhlIGluY29ycmVjdCBkZWZpbml0aW9uIGlzIHRoZSB2YWx1ZSBhdCB0aGUgcGF0aCBcXGAke1xuICAgICAgICAgIHJlZi5kZWJ1Z0xhYmVsXG4gICAgICAgIH1cXGAsIHdoaWNoIHdhczogJHtkZWJ1Z1RvU3RyaW5nIShob3N0RGVmaW5pdGlvbil9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgZGVmaW5pdGlvbiA9IGNvbnN0YW50cy5nZXRWYWx1ZTxNb2RpZmllckRlZmluaXRpb24+KFxuICAgICAgZXhwZWN0KGhhbmRsZSwgJ0JVRzogbW9kaWZpZXIgaGFuZGxlIGV4cGVjdGVkJylcbiAgICApO1xuXG4gICAgbGV0IHsgbWFuYWdlciB9ID0gZGVmaW5pdGlvbjtcblxuICAgIGxldCBzdGF0ZSA9IG1hbmFnZXIuY3JlYXRlKFxuICAgICAgb3duZXIsXG4gICAgICBleHBlY3QoY29uc3RydWN0aW5nLCAnQlVHOiBFbGVtZW50TW9kaWZpZXIgY291bGQgbm90IGZpbmQgdGhlIGVsZW1lbnQgaXQgYXBwbGllcyB0bycpLFxuICAgICAgZGVmaW5pdGlvbi5zdGF0ZSxcbiAgICAgIGFyZ3NcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1hbmFnZXIsXG4gICAgICBzdGF0ZSxcbiAgICAgIGRlZmluaXRpb24sXG4gICAgfTtcbiAgfSk7XG5cbiAgbGV0IGluc3RhbmNlID0gdmFsdWVGb3JSZWYoaW5zdGFuY2VSZWYpO1xuICBsZXQgdGFnID0gbnVsbDtcblxuICBpZiAoaW5zdGFuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgIGxldCBvcGVyYXRpb25zID0gZXhwZWN0KFxuICAgICAgY2hlY2sodm0uZmV0Y2hWYWx1ZSgkdDApLCBDaGVja09wZXJhdGlvbnMpLFxuICAgICAgJ0JVRzogRWxlbWVudE1vZGlmaWVyIGNvdWxkIG5vdCBmaW5kIG9wZXJhdGlvbnMgdG8gYXBwZW5kIHRvJ1xuICAgICk7XG5cbiAgICBvcGVyYXRpb25zLmFkZE1vZGlmaWVyKGluc3RhbmNlKTtcblxuICAgIHRhZyA9IGluc3RhbmNlLm1hbmFnZXIuZ2V0VGFnKGluc3RhbmNlLnN0YXRlKTtcblxuICAgIGlmICh0YWcgIT09IG51bGwpIHtcbiAgICAgIGNvbnN1bWVUYWcodGFnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWlzQ29uc3RSZWYocmVmKSB8fCB0YWcpIHtcbiAgICByZXR1cm4gdm0udXBkYXRlV2l0aChuZXcgVXBkYXRlRHluYW1pY01vZGlmaWVyT3Bjb2RlKHRhZywgaW5zdGFuY2UsIGluc3RhbmNlUmVmKSk7XG4gIH1cbn0pO1xuXG5leHBvcnQgY2xhc3MgVXBkYXRlTW9kaWZpZXJPcGNvZGUgaW1wbGVtZW50cyBVcGRhdGluZ09wY29kZSB7XG4gIHByaXZhdGUgbGFzdFVwZGF0ZWQ6IFJldmlzaW9uO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdGFnOiBUYWcsIHByaXZhdGUgbW9kaWZpZXI6IE1vZGlmaWVySW5zdGFuY2UpIHtcbiAgICB0aGlzLmxhc3RVcGRhdGVkID0gdmFsdWVGb3JUYWcodGFnKTtcbiAgfVxuXG4gIGV2YWx1YXRlKHZtOiBVcGRhdGluZ1ZNKSB7XG4gICAgbGV0IHsgbW9kaWZpZXIsIHRhZywgbGFzdFVwZGF0ZWQgfSA9IHRoaXM7XG5cbiAgICBjb25zdW1lVGFnKHRhZyk7XG5cbiAgICBpZiAoIXZhbGlkYXRlVGFnKHRhZywgbGFzdFVwZGF0ZWQpKSB7XG4gICAgICB2bS5lbnYuc2NoZWR1bGVVcGRhdGVNb2RpZmllcihtb2RpZmllcik7XG4gICAgICB0aGlzLmxhc3RVcGRhdGVkID0gdmFsdWVGb3JUYWcodGFnKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVwZGF0ZUR5bmFtaWNNb2RpZmllck9wY29kZSBpbXBsZW1lbnRzIFVwZGF0aW5nT3Bjb2RlIHtcbiAgcHJpdmF0ZSBsYXN0VXBkYXRlZDogUmV2aXNpb247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB0YWc6IFRhZyB8IG51bGwsXG4gICAgcHJpdmF0ZSBpbnN0YW5jZTogTW9kaWZpZXJJbnN0YW5jZSB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIGluc3RhbmNlUmVmOiBSZWZlcmVuY2U8TW9kaWZpZXJJbnN0YW5jZSB8IHVuZGVmaW5lZD5cbiAgKSB7XG4gICAgdGhpcy5sYXN0VXBkYXRlZCA9IHZhbHVlRm9yVGFnKHRhZyA/PyBDVVJSRU5UX1RBRyk7XG4gIH1cblxuICBldmFsdWF0ZSh2bTogVXBkYXRpbmdWTSkge1xuICAgIGxldCB7IHRhZywgbGFzdFVwZGF0ZWQsIGluc3RhbmNlLCBpbnN0YW5jZVJlZiB9ID0gdGhpcztcblxuICAgIGxldCBuZXdJbnN0YW5jZSA9IHZhbHVlRm9yUmVmKGluc3RhbmNlUmVmKTtcblxuICAgIGlmIChuZXdJbnN0YW5jZSAhPT0gaW5zdGFuY2UpIHtcbiAgICAgIGlmIChpbnN0YW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCBkZXN0cm95YWJsZSA9IGluc3RhbmNlLm1hbmFnZXIuZ2V0RGVzdHJveWFibGUoaW5zdGFuY2Uuc3RhdGUpO1xuXG4gICAgICAgIGlmIChkZXN0cm95YWJsZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGRlc3Ryb3koZGVzdHJveWFibGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXdJbnN0YW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCB7IG1hbmFnZXIsIHN0YXRlIH0gPSBuZXdJbnN0YW5jZTtcbiAgICAgICAgbGV0IGRlc3Ryb3lhYmxlID0gbWFuYWdlci5nZXREZXN0cm95YWJsZShzdGF0ZSk7XG5cbiAgICAgICAgaWYgKGRlc3Ryb3lhYmxlICE9PSBudWxsKSB7XG4gICAgICAgICAgYXNzb2NpYXRlRGVzdHJveWFibGVDaGlsZCh0aGlzLCBkZXN0cm95YWJsZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0YWcgPSBtYW5hZ2VyLmdldFRhZyhzdGF0ZSk7XG5cbiAgICAgICAgaWYgKHRhZyAhPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMubGFzdFVwZGF0ZWQgPSB2YWx1ZUZvclRhZyh0YWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50YWcgPSB0YWc7XG4gICAgICAgIHZtLmVudi5zY2hlZHVsZUluc3RhbGxNb2RpZmllcihuZXdJbnN0YW5jZSEpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmluc3RhbmNlID0gbmV3SW5zdGFuY2U7XG4gICAgfSBlbHNlIGlmICh0YWcgIT09IG51bGwgJiYgIXZhbGlkYXRlVGFnKHRhZywgbGFzdFVwZGF0ZWQpKSB7XG4gICAgICB2bS5lbnYuc2NoZWR1bGVVcGRhdGVNb2RpZmllcihpbnN0YW5jZSEpO1xuICAgICAgdGhpcy5sYXN0VXBkYXRlZCA9IHZhbHVlRm9yVGFnKHRhZyk7XG4gICAgfVxuXG4gICAgaWYgKHRhZyAhPT0gbnVsbCkge1xuICAgICAgY29uc3VtZVRhZyh0YWcpO1xuICAgIH1cbiAgfVxufVxuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuU3RhdGljQXR0ciwgKHZtLCB7IG9wMTogX25hbWUsIG9wMjogX3ZhbHVlLCBvcDM6IF9uYW1lc3BhY2UgfSkgPT4ge1xuICBsZXQgbmFtZSA9IHZtW0NPTlNUQU5UU10uZ2V0VmFsdWU8c3RyaW5nPihfbmFtZSk7XG4gIGxldCB2YWx1ZSA9IHZtW0NPTlNUQU5UU10uZ2V0VmFsdWU8c3RyaW5nPihfdmFsdWUpO1xuICBsZXQgbmFtZXNwYWNlID0gX25hbWVzcGFjZSA/IHZtW0NPTlNUQU5UU10uZ2V0VmFsdWU8c3RyaW5nPihfbmFtZXNwYWNlKSA6IG51bGw7XG5cbiAgdm0uZWxlbWVudHMoKS5zZXRTdGF0aWNBdHRyaWJ1dGUobmFtZSwgdmFsdWUsIG5hbWVzcGFjZSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkR5bmFtaWNBdHRyLCAodm0sIHsgb3AxOiBfbmFtZSwgb3AyOiBfdHJ1c3RpbmcsIG9wMzogX25hbWVzcGFjZSB9KSA9PiB7XG4gIGxldCBuYW1lID0gdm1bQ09OU1RBTlRTXS5nZXRWYWx1ZTxzdHJpbmc+KF9uYW1lKTtcbiAgbGV0IHRydXN0aW5nID0gdm1bQ09OU1RBTlRTXS5nZXRWYWx1ZTxib29sZWFuPihfdHJ1c3RpbmcpO1xuICBsZXQgcmVmZXJlbmNlID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcbiAgbGV0IHZhbHVlID0gdmFsdWVGb3JSZWYocmVmZXJlbmNlKTtcbiAgbGV0IG5hbWVzcGFjZSA9IF9uYW1lc3BhY2UgPyB2bVtDT05TVEFOVFNdLmdldFZhbHVlPHN0cmluZz4oX25hbWVzcGFjZSkgOiBudWxsO1xuXG4gIGxldCBhdHRyaWJ1dGUgPSB2bS5lbGVtZW50cygpLnNldER5bmFtaWNBdHRyaWJ1dGUobmFtZSwgdmFsdWUsIHRydXN0aW5nLCBuYW1lc3BhY2UpO1xuXG4gIGlmICghaXNDb25zdFJlZihyZWZlcmVuY2UpKSB7XG4gICAgdm0udXBkYXRlV2l0aChuZXcgVXBkYXRlRHluYW1pY0F0dHJpYnV0ZU9wY29kZShyZWZlcmVuY2UsIGF0dHJpYnV0ZSwgdm0uZW52KSk7XG4gIH1cbn0pO1xuXG5leHBvcnQgY2xhc3MgVXBkYXRlRHluYW1pY0F0dHJpYnV0ZU9wY29kZSBpbXBsZW1lbnRzIFVwZGF0aW5nT3Bjb2RlIHtcbiAgcHJpdmF0ZSB1cGRhdGVSZWY6IFJlZmVyZW5jZTtcblxuICBjb25zdHJ1Y3RvcihyZWZlcmVuY2U6IFJlZmVyZW5jZTx1bmtub3duPiwgYXR0cmlidXRlOiBEeW5hbWljQXR0cmlidXRlLCBlbnY6IEVudmlyb25tZW50KSB7XG4gICAgbGV0IGluaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgICB0aGlzLnVwZGF0ZVJlZiA9IGNyZWF0ZUNvbXB1dGVSZWYoKCkgPT4ge1xuICAgICAgbGV0IHZhbHVlID0gdmFsdWVGb3JSZWYocmVmZXJlbmNlKTtcblxuICAgICAgaWYgKGluaXRpYWxpemVkID09PSB0cnVlKSB7XG4gICAgICAgIGF0dHJpYnV0ZS51cGRhdGUodmFsdWUsIGVudik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB2YWx1ZUZvclJlZih0aGlzLnVwZGF0ZVJlZik7XG4gIH1cblxuICBldmFsdWF0ZSgpIHtcbiAgICB2YWx1ZUZvclJlZih0aGlzLnVwZGF0ZVJlZik7XG4gIH1cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=