@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
291 lines (226 loc) • 23.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.dynamicAttribute = dynamicAttribute;
exports.OptionSelectedDynamicAttribute = exports.InputValueDynamicAttribute = exports.SafeDynamicAttribute = exports.SafeDynamicProperty = exports.DefaultDynamicProperty = exports.SimpleDynamicAttribute = exports.DynamicAttribute = void 0;
var _globalContext = require("@glimmer/global-context");
var _normalize = require("../../dom/normalize");
var _props = require("../../dom/props");
var _sanitizedValues = require("../../dom/sanitized-values");
var _env2 = require("@glimmer/env");
function dynamicAttribute(element, attr, namespace, isTrusting = false) {
let {
tagName,
namespaceURI
} = element;
let attribute = {
element,
name: attr,
namespace
};
if (_env2.DEBUG && attr === 'style' && !isTrusting) {
return new DebugStyleAttributeManager(attribute);
}
if (namespaceURI === "http://www.w3.org/2000/svg"
/* SVG */
) {
return buildDynamicAttribute(tagName, attr, attribute);
}
let {
type,
normalized
} = (0, _props.normalizeProperty)(element, attr);
if (type === 'attr') {
return buildDynamicAttribute(tagName, normalized, attribute);
} else {
return buildDynamicProperty(tagName, normalized, attribute);
}
}
function buildDynamicAttribute(tagName, name, attribute) {
if ((0, _sanitizedValues.requiresSanitization)(tagName, name)) {
return new SafeDynamicAttribute(attribute);
} else {
return new SimpleDynamicAttribute(attribute);
}
}
function buildDynamicProperty(tagName, name, attribute) {
if ((0, _sanitizedValues.requiresSanitization)(tagName, name)) {
return new SafeDynamicProperty(name, attribute);
}
if (isUserInputValue(tagName, name)) {
return new InputValueDynamicAttribute(name, attribute);
}
if (isOptionSelected(tagName, name)) {
return new OptionSelectedDynamicAttribute(name, attribute);
}
return new DefaultDynamicProperty(name, attribute);
}
class DynamicAttribute {
constructor(attribute) {
this.attribute = attribute;
}
}
exports.DynamicAttribute = DynamicAttribute;
class SimpleDynamicAttribute extends DynamicAttribute {
set(dom, value, _env) {
let normalizedValue = normalizeValue(value);
if (normalizedValue !== null) {
let {
name,
namespace
} = this.attribute;
dom.__setAttribute(name, normalizedValue, namespace);
}
}
update(value, _env) {
let normalizedValue = normalizeValue(value);
let {
element,
name
} = this.attribute;
if (normalizedValue === null) {
element.removeAttribute(name);
} else {
element.setAttribute(name, normalizedValue);
}
}
}
exports.SimpleDynamicAttribute = SimpleDynamicAttribute;
class DefaultDynamicProperty extends DynamicAttribute {
constructor(normalizedName, attribute) {
super(attribute);
this.normalizedName = normalizedName;
}
set(dom, value, _env) {
if (value !== null && value !== undefined) {
this.value = value;
dom.__setProperty(this.normalizedName, value);
}
}
update(value, _env) {
let {
element
} = this.attribute;
if (this.value !== value) {
element[this.normalizedName] = this.value = value;
if (value === null || value === undefined) {
this.removeAttribute();
}
}
}
removeAttribute() {
// TODO this sucks but to preserve properties first and to meet current
// semantics we must do this.
let {
element,
namespace
} = this.attribute;
if (namespace) {
element.removeAttributeNS(namespace, this.normalizedName);
} else {
element.removeAttribute(this.normalizedName);
}
}
}
exports.DefaultDynamicProperty = DefaultDynamicProperty;
class SafeDynamicProperty extends DefaultDynamicProperty {
set(dom, value, env) {
let {
element,
name
} = this.attribute;
let sanitized = (0, _sanitizedValues.sanitizeAttributeValue)(element, name, value);
super.set(dom, sanitized, env);
}
update(value, env) {
let {
element,
name
} = this.attribute;
let sanitized = (0, _sanitizedValues.sanitizeAttributeValue)(element, name, value);
super.update(sanitized, env);
}
}
exports.SafeDynamicProperty = SafeDynamicProperty;
class SafeDynamicAttribute extends SimpleDynamicAttribute {
set(dom, value, env) {
let {
element,
name
} = this.attribute;
let sanitized = (0, _sanitizedValues.sanitizeAttributeValue)(element, name, value);
super.set(dom, sanitized, env);
}
update(value, env) {
let {
element,
name
} = this.attribute;
let sanitized = (0, _sanitizedValues.sanitizeAttributeValue)(element, name, value);
super.update(sanitized, env);
}
}
exports.SafeDynamicAttribute = SafeDynamicAttribute;
class InputValueDynamicAttribute extends DefaultDynamicProperty {
set(dom, value) {
dom.__setProperty('value', (0, _normalize.normalizeStringValue)(value));
}
update(value) {
let input = this.attribute.element;
let currentValue = input.value;
let normalizedValue = (0, _normalize.normalizeStringValue)(value);
if (currentValue !== normalizedValue) {
input.value = normalizedValue;
}
}
}
exports.InputValueDynamicAttribute = InputValueDynamicAttribute;
class OptionSelectedDynamicAttribute extends DefaultDynamicProperty {
set(dom, value) {
if (value !== null && value !== undefined && value !== false) {
dom.__setProperty('selected', true);
}
}
update(value) {
let option = this.attribute.element;
if (value) {
option.selected = true;
} else {
option.selected = false;
}
}
}
exports.OptionSelectedDynamicAttribute = OptionSelectedDynamicAttribute;
function isOptionSelected(tagName, attribute) {
return tagName === 'OPTION' && attribute === 'selected';
}
function isUserInputValue(tagName, attribute) {
return (tagName === 'INPUT' || tagName === 'TEXTAREA') && attribute === 'value';
}
function normalizeValue(value) {
if (value === false || value === undefined || value === null || typeof value.toString === 'undefined') {
return null;
}
if (value === true) {
return '';
} // onclick function etc in SSR
if (typeof value === 'function') {
return null;
}
return String(value);
}
let DebugStyleAttributeManager;
if (_env2.DEBUG) {
DebugStyleAttributeManager = class extends SimpleDynamicAttribute {
set(dom, value, env) {
(0, _globalContext.warnIfStyleNotTrusted)(value);
super.set(dom, value, env);
}
update(value, env) {
(0, _globalContext.warnIfStyleNotTrusted)(value);
super.update(value, env);
}
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL3ZtL2F0dHJpYnV0ZXMvZHluYW1pYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVFBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUdNLFNBQUEsZ0JBQUEsQ0FBQSxPQUFBLEVBQUEsSUFBQSxFQUFBLFNBQUEsRUFJSixVQUFVLEdBSk4sS0FBQSxFQUljO0FBRWxCLE1BQUk7QUFBQSxJQUFBLE9BQUE7QUFBVyxJQUFBO0FBQVgsTUFBSixPQUFBO0FBQ0EsTUFBSSxTQUFTLEdBQUc7QUFBQSxJQUFBLE9BQUE7QUFBVyxJQUFBLElBQUksRUFBZixJQUFBO0FBQXVCLElBQUE7QUFBdkIsR0FBaEI7O0FBRUEsTUFBSSxlQUFTLElBQUksS0FBYixPQUFBLElBQTZCLENBQWpDLFVBQUEsRUFBOEM7QUFDNUMsV0FBTyxJQUFBLDBCQUFBLENBQVAsU0FBTyxDQUFQO0FBQ0Q7O0FBRUQsTUFBSSxZQUFZLEtBQUE7QUFBQTtBQUFoQixJQUFvQztBQUNsQyxhQUFPLHFCQUFxQixDQUFBLE9BQUEsRUFBQSxJQUFBLEVBQTVCLFNBQTRCLENBQTVCO0FBQ0Q7O0FBRUQsTUFBSTtBQUFBLElBQUEsSUFBQTtBQUFRLElBQUE7QUFBUixNQUF1Qiw4QkFBaUIsT0FBakIsRUFBM0IsSUFBMkIsQ0FBM0I7O0FBRUEsTUFBSSxJQUFJLEtBQVIsTUFBQSxFQUFxQjtBQUNuQixXQUFPLHFCQUFxQixDQUFBLE9BQUEsRUFBQSxVQUFBLEVBQTVCLFNBQTRCLENBQTVCO0FBREYsR0FBQSxNQUVPO0FBQ0wsV0FBTyxvQkFBb0IsQ0FBQSxPQUFBLEVBQUEsVUFBQSxFQUEzQixTQUEyQixDQUEzQjtBQUNEO0FBQ0Y7O0FBRUQsU0FBQSxxQkFBQSxDQUFBLE9BQUEsRUFBQSxJQUFBLEVBQUEsU0FBQSxFQUc0QjtBQUUxQixNQUFJLDJDQUFvQixPQUFwQixFQUFKLElBQUksQ0FBSixF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Q0FBQSxLQUFBLEVBQUEsR0FBQSxFQUFpQztBQUNyQyxnREFBQSxLQUFBO0FBRUEsWUFBQSxNQUFBLENBQUEsS0FBQSxFQUFBLEdBQUE7QUFDRDs7QUFWOEQsR0FBakU7QUFZRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpY3QsXG4gIEVudmlyb25tZW50LFxuICBPcHRpb24sXG4gIEVsZW1lbnRCdWlsZGVyLFxuICBBdHRyaWJ1dGVPcGVyYXRpb24sXG4gIEF0dHJpYnV0ZUN1cnNvcixcbn0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyB3YXJuSWZTdHlsZU5vdFRydXN0ZWQgfSBmcm9tICdAZ2xpbW1lci9nbG9iYWwtY29udGV4dCc7XG5pbXBvcnQgeyBBdHRyTmFtZXNwYWNlLCBOYW1lc3BhY2UsIFNpbXBsZUVsZW1lbnQgfSBmcm9tICdAc2ltcGxlLWRvbS9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgbm9ybWFsaXplU3RyaW5nVmFsdWUgfSBmcm9tICcuLi8uLi9kb20vbm9ybWFsaXplJztcbmltcG9ydCB7IG5vcm1hbGl6ZVByb3BlcnR5IH0gZnJvbSAnLi4vLi4vZG9tL3Byb3BzJztcbmltcG9ydCB7IHJlcXVpcmVzU2FuaXRpemF0aW9uLCBzYW5pdGl6ZUF0dHJpYnV0ZVZhbHVlIH0gZnJvbSAnLi4vLi4vZG9tL3Nhbml0aXplZC12YWx1ZXMnO1xuaW1wb3J0IHsgREVCVUcgfSBmcm9tICdAZ2xpbW1lci9lbnYnO1xuaW1wb3J0IHsgY2FzdFRvQnJvd3NlciB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gZHluYW1pY0F0dHJpYnV0ZShcbiAgZWxlbWVudDogU2ltcGxlRWxlbWVudCxcbiAgYXR0cjogc3RyaW5nLFxuICBuYW1lc3BhY2U6IE9wdGlvbjxBdHRyTmFtZXNwYWNlPixcbiAgaXNUcnVzdGluZyA9IGZhbHNlXG4pOiBEeW5hbWljQXR0cmlidXRlIHtcbiAgbGV0IHsgdGFnTmFtZSwgbmFtZXNwYWNlVVJJIH0gPSBlbGVtZW50O1xuICBsZXQgYXR0cmlidXRlID0geyBlbGVtZW50LCBuYW1lOiBhdHRyLCBuYW1lc3BhY2UgfTtcblxuICBpZiAoREVCVUcgJiYgYXR0ciA9PT0gJ3N0eWxlJyAmJiAhaXNUcnVzdGluZykge1xuICAgIHJldHVybiBuZXcgRGVidWdTdHlsZUF0dHJpYnV0ZU1hbmFnZXIoYXR0cmlidXRlKTtcbiAgfVxuXG4gIGlmIChuYW1lc3BhY2VVUkkgPT09IE5hbWVzcGFjZS5TVkcpIHtcbiAgICByZXR1cm4gYnVpbGREeW5hbWljQXR0cmlidXRlKHRhZ05hbWUsIGF0dHIsIGF0dHJpYnV0ZSk7XG4gIH1cblxuICBsZXQgeyB0eXBlLCBub3JtYWxpemVkIH0gPSBub3JtYWxpemVQcm9wZXJ0eShlbGVtZW50LCBhdHRyKTtcblxuICBpZiAodHlwZSA9PT0gJ2F0dHInKSB7XG4gICAgcmV0dXJuIGJ1aWxkRHluYW1pY0F0dHJpYnV0ZSh0YWdOYW1lLCBub3JtYWxpemVkLCBhdHRyaWJ1dGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBidWlsZER5bmFtaWNQcm9wZXJ0eSh0YWdOYW1lLCBub3JtYWxpemVkLCBhdHRyaWJ1dGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRHluYW1pY0F0dHJpYnV0ZShcbiAgdGFnTmFtZTogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGF0dHJpYnV0ZTogQXR0cmlidXRlQ3Vyc29yXG4pOiBEeW5hbWljQXR0cmlidXRlIHtcbiAgaWYgKHJlcXVpcmVzU2FuaXRpemF0aW9uKHRhZ05hbWUsIG5hbWUpKSB7XG4gICAgcmV0dXJuIG5ldyBTYWZlRHluYW1pY0F0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgU2ltcGxlRHluYW1pY0F0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRHluYW1pY1Byb3BlcnR5KFxuICB0YWdOYW1lOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgYXR0cmlidXRlOiBBdHRyaWJ1dGVDdXJzb3Jcbik6IER5bmFtaWNBdHRyaWJ1dGUge1xuICBpZiAocmVxdWlyZXNTYW5pdGl6YXRpb24odGFnTmFtZSwgbmFtZSkpIHtcbiAgICByZXR1cm4gbmV3IFNhZmVEeW5hbWljUHJvcGVydHkobmFtZSwgYXR0cmlidXRlKTtcbiAgfVxuXG4gIGlmIChpc1VzZXJJbnB1dFZhbHVlKHRhZ05hbWUsIG5hbWUpKSB7XG4gICAgcmV0dXJuIG5ldyBJbnB1dFZhbHVlRHluYW1pY0F0dHJpYnV0ZShuYW1lLCBhdHRyaWJ1dGUpO1xuICB9XG5cbiAgaWYgKGlzT3B0aW9uU2VsZWN0ZWQodGFnTmFtZSwgbmFtZSkpIHtcbiAgICByZXR1cm4gbmV3IE9wdGlvblNlbGVjdGVkRHluYW1pY0F0dHJpYnV0ZShuYW1lLCBhdHRyaWJ1dGUpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBEZWZhdWx0RHluYW1pY1Byb3BlcnR5KG5hbWUsIGF0dHJpYnV0ZSk7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEeW5hbWljQXR0cmlidXRlIGltcGxlbWVudHMgQXR0cmlidXRlT3BlcmF0aW9uIHtcbiAgY29uc3RydWN0b3IocHVibGljIGF0dHJpYnV0ZTogQXR0cmlidXRlQ3Vyc29yKSB7fVxuXG4gIGFic3RyYWN0IHNldChkb206IEVsZW1lbnRCdWlsZGVyLCB2YWx1ZTogdW5rbm93biwgZW52OiBFbnZpcm9ubWVudCk6IHZvaWQ7XG4gIGFic3RyYWN0IHVwZGF0ZSh2YWx1ZTogdW5rbm93biwgZW52OiBFbnZpcm9ubWVudCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTaW1wbGVEeW5hbWljQXR0cmlidXRlIGV4dGVuZHMgRHluYW1pY0F0dHJpYnV0ZSB7XG4gIHNldChkb206IEVsZW1lbnRCdWlsZGVyLCB2YWx1ZTogdW5rbm93biwgX2VudjogRW52aXJvbm1lbnQpOiB2b2lkIHtcbiAgICBsZXQgbm9ybWFsaXplZFZhbHVlID0gbm9ybWFsaXplVmFsdWUodmFsdWUpO1xuXG4gICAgaWYgKG5vcm1hbGl6ZWRWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgbGV0IHsgbmFtZSwgbmFtZXNwYWNlIH0gPSB0aGlzLmF0dHJpYnV0ZTtcbiAgICAgIGRvbS5fX3NldEF0dHJpYnV0ZShuYW1lLCBub3JtYWxpemVkVmFsdWUsIG5hbWVzcGFjZSk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlKHZhbHVlOiB1bmtub3duLCBfZW52OiBFbnZpcm9ubWVudCk6IHZvaWQge1xuICAgIGxldCBub3JtYWxpemVkVmFsdWUgPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG4gICAgbGV0IHsgZWxlbWVudCwgbmFtZSB9ID0gdGhpcy5hdHRyaWJ1dGU7XG5cbiAgICBpZiAobm9ybWFsaXplZFZhbHVlID09PSBudWxsKSB7XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgbm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlZmF1bHREeW5hbWljUHJvcGVydHkgZXh0ZW5kcyBEeW5hbWljQXR0cmlidXRlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBub3JtYWxpemVkTmFtZTogc3RyaW5nLCBhdHRyaWJ1dGU6IEF0dHJpYnV0ZUN1cnNvcikge1xuICAgIHN1cGVyKGF0dHJpYnV0ZSk7XG4gIH1cblxuICB2YWx1ZTogdW5rbm93bjtcbiAgc2V0KGRvbTogRWxlbWVudEJ1aWxkZXIsIHZhbHVlOiB1bmtub3duLCBfZW52OiBFbnZpcm9ubWVudCk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICBkb20uX19zZXRQcm9wZXJ0eSh0aGlzLm5vcm1hbGl6ZWROYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlKHZhbHVlOiB1bmtub3duLCBfZW52OiBFbnZpcm9ubWVudCk6IHZvaWQge1xuICAgIGxldCB7IGVsZW1lbnQgfSA9IHRoaXMuYXR0cmlidXRlO1xuXG4gICAgaWYgKHRoaXMudmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICAoZWxlbWVudCBhcyBhbnkpW3RoaXMubm9ybWFsaXplZE5hbWVdID0gdGhpcy52YWx1ZSA9IHZhbHVlO1xuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCByZW1vdmVBdHRyaWJ1dGUoKSB7XG4gICAgLy8gVE9ETyB0aGlzIHN1Y2tzIGJ1dCB0byBwcmVzZXJ2ZSBwcm9wZXJ0aWVzIGZpcnN0IGFuZCB0byBtZWV0IGN1cnJlbnRcbiAgICAvLyBzZW1hbnRpY3Mgd2UgbXVzdCBkbyB0aGlzLlxuICAgIGxldCB7IGVsZW1lbnQsIG5hbWVzcGFjZSB9ID0gdGhpcy5hdHRyaWJ1dGU7XG5cbiAgICBpZiAobmFtZXNwYWNlKSB7XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZU5TKG5hbWVzcGFjZSwgdGhpcy5ub3JtYWxpemVkTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKHRoaXMubm9ybWFsaXplZE5hbWUpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2FmZUR5bmFtaWNQcm9wZXJ0eSBleHRlbmRzIERlZmF1bHREeW5hbWljUHJvcGVydHkge1xuICBzZXQoZG9tOiBFbGVtZW50QnVpbGRlciwgdmFsdWU6IHVua25vd24sIGVudjogRW52aXJvbm1lbnQpOiB2b2lkIHtcbiAgICBsZXQgeyBlbGVtZW50LCBuYW1lIH0gPSB0aGlzLmF0dHJpYnV0ZTtcbiAgICBsZXQgc2FuaXRpemVkID0gc2FuaXRpemVBdHRyaWJ1dGVWYWx1ZShlbGVtZW50LCBuYW1lLCB2YWx1ZSk7XG4gICAgc3VwZXIuc2V0KGRvbSwgc2FuaXRpemVkLCBlbnYpO1xuICB9XG5cbiAgdXBkYXRlKHZhbHVlOiB1bmtub3duLCBlbnY6IEVudmlyb25tZW50KTogdm9pZCB7XG4gICAgbGV0IHsgZWxlbWVudCwgbmFtZSB9ID0gdGhpcy5hdHRyaWJ1dGU7XG4gICAgbGV0IHNhbml0aXplZCA9IHNhbml0aXplQXR0cmlidXRlVmFsdWUoZWxlbWVudCwgbmFtZSwgdmFsdWUpO1xuICAgIHN1cGVyLnVwZGF0ZShzYW5pdGl6ZWQsIGVudik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNhZmVEeW5hbWljQXR0cmlidXRlIGV4dGVuZHMgU2ltcGxlRHluYW1pY0F0dHJpYnV0ZSB7XG4gIHNldChkb206IEVsZW1lbnRCdWlsZGVyLCB2YWx1ZTogdW5rbm93biwgZW52OiBFbnZpcm9ubWVudCk6IHZvaWQge1xuICAgIGxldCB7IGVsZW1lbnQsIG5hbWUgfSA9IHRoaXMuYXR0cmlidXRlO1xuICAgIGxldCBzYW5pdGl6ZWQgPSBzYW5pdGl6ZUF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQsIG5hbWUsIHZhbHVlKTtcbiAgICBzdXBlci5zZXQoZG9tLCBzYW5pdGl6ZWQsIGVudik7XG4gIH1cblxuICB1cGRhdGUodmFsdWU6IHVua25vd24sIGVudjogRW52aXJvbm1lbnQpOiB2b2lkIHtcbiAgICBsZXQgeyBlbGVtZW50LCBuYW1lIH0gPSB0aGlzLmF0dHJpYnV0ZTtcbiAgICBsZXQgc2FuaXRpemVkID0gc2FuaXRpemVBdHRyaWJ1dGVWYWx1ZShlbGVtZW50LCBuYW1lLCB2YWx1ZSk7XG4gICAgc3VwZXIudXBkYXRlKHNhbml0aXplZCwgZW52KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW5wdXRWYWx1ZUR5bmFtaWNBdHRyaWJ1dGUgZXh0ZW5kcyBEZWZhdWx0RHluYW1pY1Byb3BlcnR5IHtcbiAgc2V0KGRvbTogRWxlbWVudEJ1aWxkZXIsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgZG9tLl9fc2V0UHJvcGVydHkoJ3ZhbHVlJywgbm9ybWFsaXplU3RyaW5nVmFsdWUodmFsdWUpKTtcbiAgfVxuXG4gIHVwZGF0ZSh2YWx1ZTogdW5rbm93bikge1xuICAgIGxldCBpbnB1dCA9IGNhc3RUb0Jyb3dzZXIodGhpcy5hdHRyaWJ1dGUuZWxlbWVudCwgWydpbnB1dCcsICd0ZXh0YXJlYSddKTtcbiAgICBsZXQgY3VycmVudFZhbHVlID0gaW5wdXQudmFsdWU7XG4gICAgbGV0IG5vcm1hbGl6ZWRWYWx1ZSA9IG5vcm1hbGl6ZVN0cmluZ1ZhbHVlKHZhbHVlKTtcbiAgICBpZiAoY3VycmVudFZhbHVlICE9PSBub3JtYWxpemVkVmFsdWUpIHtcbiAgICAgIGlucHV0LnZhbHVlID0gbm9ybWFsaXplZFZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT3B0aW9uU2VsZWN0ZWREeW5hbWljQXR0cmlidXRlIGV4dGVuZHMgRGVmYXVsdER5bmFtaWNQcm9wZXJ0eSB7XG4gIHNldChkb206IEVsZW1lbnRCdWlsZGVyLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBmYWxzZSkge1xuICAgICAgZG9tLl9fc2V0UHJvcGVydHkoJ3NlbGVjdGVkJywgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlKHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgbGV0IG9wdGlvbiA9IGNhc3RUb0Jyb3dzZXIodGhpcy5hdHRyaWJ1dGUuZWxlbWVudCwgJ29wdGlvbicpO1xuXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBvcHRpb24uc2VsZWN0ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb24uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNPcHRpb25TZWxlY3RlZCh0YWdOYW1lOiBzdHJpbmcsIGF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gIHJldHVybiB0YWdOYW1lID09PSAnT1BUSU9OJyAmJiBhdHRyaWJ1dGUgPT09ICdzZWxlY3RlZCc7XG59XG5cbmZ1bmN0aW9uIGlzVXNlcklucHV0VmFsdWUodGFnTmFtZTogc3RyaW5nLCBhdHRyaWJ1dGU6IHN0cmluZykge1xuICByZXR1cm4gKHRhZ05hbWUgPT09ICdJTlBVVCcgfHwgdGFnTmFtZSA9PT0gJ1RFWFRBUkVBJykgJiYgYXR0cmlidXRlID09PSAndmFsdWUnO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZTogdW5rbm93bik6IE9wdGlvbjxzdHJpbmc+IHtcbiAgaWYgKFxuICAgIHZhbHVlID09PSBmYWxzZSB8fFxuICAgIHZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgIHR5cGVvZiAodmFsdWUgYXMgRGljdCkudG9TdHJpbmcgPT09ICd1bmRlZmluZWQnXG4gICkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICAvLyBvbmNsaWNrIGZ1bmN0aW9uIGV0YyBpbiBTU1JcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG59XG5cbmxldCBEZWJ1Z1N0eWxlQXR0cmlidXRlTWFuYWdlcjoge1xuICBuZXcgKGF0dHJpYnV0ZTogQXR0cmlidXRlQ3Vyc29yKTogQXR0cmlidXRlT3BlcmF0aW9uO1xufTtcblxuaWYgKERFQlVHKSB7XG4gIERlYnVnU3R5bGVBdHRyaWJ1dGVNYW5hZ2VyID0gY2xhc3MgZXh0ZW5kcyBTaW1wbGVEeW5hbWljQXR0cmlidXRlIHtcbiAgICBzZXQoZG9tOiBFbGVtZW50QnVpbGRlciwgdmFsdWU6IHVua25vd24sIGVudjogRW52aXJvbm1lbnQpOiB2b2lkIHtcbiAgICAgIHdhcm5JZlN0eWxlTm90VHJ1c3RlZCh2YWx1ZSk7XG5cbiAgICAgIHN1cGVyLnNldChkb20sIHZhbHVlLCBlbnYpO1xuICAgIH1cbiAgICB1cGRhdGUodmFsdWU6IHVua25vd24sIGVudjogRW52aXJvbm1lbnQpOiB2b2lkIHtcbiAgICAgIHdhcm5JZlN0eWxlTm90VHJ1c3RlZCh2YWx1ZSk7XG5cbiAgICAgIHN1cGVyLnVwZGF0ZSh2YWx1ZSwgZW52KTtcbiAgICB9XG4gIH07XG59XG4iXSwic291cmNlUm9vdCI6IiJ9