UNPKG

ember-legacy-class-transform

Version:
393 lines (386 loc) 52.5 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.PatchElementOpcode = exports.DynamicAttribute = exports.StaticAttribute = exports.UpdateModifierOpcode = exports.ComponentElementOperations = exports.SimpleElementOperations = undefined; var _reference = require('@glimmer/reference'); var _util = require('@glimmer/util'); var _opcodes = require('../../opcodes'); var _references = require('../../references'); var _vm = require('./vm'); _opcodes.APPEND_OPCODES.add(24 /* Text */, (vm, { op1: text }) => { vm.elements().appendText(vm.constants.getString(text)); }); _opcodes.APPEND_OPCODES.add(25 /* Comment */, (vm, { op1: text }) => { vm.elements().appendComment(vm.constants.getString(text)); }); _opcodes.APPEND_OPCODES.add(27 /* OpenElement */, (vm, { op1: tag }) => { vm.elements().openElement(vm.constants.getString(tag)); }); _opcodes.APPEND_OPCODES.add(28 /* OpenElementWithOperations */, (vm, { op1: tag }) => { let tagName = vm.constants.getString(tag); let operations = vm.stack.pop(); vm.elements().openElement(tagName, operations); }); _opcodes.APPEND_OPCODES.add(29 /* OpenDynamicElement */, vm => { let operations = vm.stack.pop(); let tagName = vm.stack.pop().value(); vm.elements().openElement(tagName, operations); }); _opcodes.APPEND_OPCODES.add(36 /* PushRemoteElement */, vm => { let elementRef = vm.stack.pop(); let nextSiblingRef = vm.stack.pop(); let element; let nextSibling; if ((0, _reference.isConst)(elementRef)) { element = elementRef.value(); } else { let cache = new _reference.ReferenceCache(elementRef); element = cache.peek(); vm.updateWith(new _vm.Assert(cache)); } if ((0, _reference.isConst)(nextSiblingRef)) { nextSibling = nextSiblingRef.value(); } else { let cache = new _reference.ReferenceCache(nextSiblingRef); nextSibling = cache.peek(); vm.updateWith(new _vm.Assert(cache)); } vm.elements().pushRemoteElement(element, nextSibling); }); _opcodes.APPEND_OPCODES.add(37 /* PopRemoteElement */, vm => vm.elements().popRemoteElement()); class ClassList { constructor() { this.list = null; this.isConst = true; } append(reference) { let { list, isConst } = this; if (list === null) list = this.list = []; list.push(reference); this.isConst = isConst && (0, _reference.isConst)(reference); } toReference() { let { list, isConst } = this; if (!list) return _references.NULL_REFERENCE; if (isConst) return _references.PrimitiveReference.create(toClassName(list)); return new ClassListReference(list); } } class ClassListReference extends _reference.CachedReference { constructor(list) { super(); this.list = []; this.tag = (0, _reference.combineTagged)(list); this.list = list; } compute() { return toClassName(this.list); } } function toClassName(list) { let ret = []; for (let i = 0; i < list.length; i++) { let value = list[i].value(); if (value !== false && value !== null && value !== undefined) ret.push(value); } return ret.length === 0 ? null : ret.join(' '); } class SimpleElementOperations { constructor(env) { this.env = env; this.opcodes = null; this.classList = null; } addStaticAttribute(element, name, value) { if (name === 'class') { this.addClass(_references.PrimitiveReference.create(value)); } else { this.env.getAppendOperations().setAttribute(element, name, value); } } addStaticAttributeNS(element, namespace, name, value) { this.env.getAppendOperations().setAttribute(element, name, value, namespace); } addDynamicAttribute(element, name, reference, isTrusting) { if (name === 'class') { this.addClass(reference); } else { let attributeManager = this.env.attributeFor(element, name, isTrusting); let attribute = new DynamicAttribute(element, attributeManager, name, reference); this.addAttribute(attribute); } } addDynamicAttributeNS(element, namespace, name, reference, isTrusting) { let attributeManager = this.env.attributeFor(element, name, isTrusting, namespace); let nsAttribute = new DynamicAttribute(element, attributeManager, name, reference, namespace); this.addAttribute(nsAttribute); } flush(element, vm) { let { env } = vm; let { opcodes, classList } = this; for (let i = 0; opcodes && i < opcodes.length; i++) { vm.updateWith(opcodes[i]); } if (classList) { let attributeManager = env.attributeFor(element, 'class', false); let attribute = new DynamicAttribute(element, attributeManager, 'class', classList.toReference()); let opcode = attribute.flush(env); if (opcode) { vm.updateWith(opcode); } } this.opcodes = null; this.classList = null; } addClass(reference) { let { classList } = this; if (!classList) { classList = this.classList = new ClassList(); } classList.append(reference); } addAttribute(attribute) { let opcode = attribute.flush(this.env); if (opcode) { let { opcodes } = this; if (!opcodes) { opcodes = this.opcodes = []; } opcodes.push(opcode); } } } exports.SimpleElementOperations = SimpleElementOperations; class ComponentElementOperations { constructor(env) { this.env = env; this.attributeNames = null; this.attributes = null; this.classList = null; } addStaticAttribute(element, name, value) { if (name === 'class') { this.addClass(_references.PrimitiveReference.create(value)); } else if (this.shouldAddAttribute(name)) { this.addAttribute(name, new StaticAttribute(element, name, value)); } } addStaticAttributeNS(element, namespace, name, value) { if (this.shouldAddAttribute(name)) { this.addAttribute(name, new StaticAttribute(element, name, value, namespace)); } } addDynamicAttribute(element, name, reference, isTrusting) { if (name === 'class') { this.addClass(reference); } else if (this.shouldAddAttribute(name)) { let attributeManager = this.env.attributeFor(element, name, isTrusting); let attribute = new DynamicAttribute(element, attributeManager, name, reference); this.addAttribute(name, attribute); } } addDynamicAttributeNS(element, namespace, name, reference, isTrusting) { if (this.shouldAddAttribute(name)) { let attributeManager = this.env.attributeFor(element, name, isTrusting, namespace); let nsAttribute = new DynamicAttribute(element, attributeManager, name, reference, namespace); this.addAttribute(name, nsAttribute); } } flush(element, vm) { let { env } = this; let { attributes, classList } = this; for (let i = 0; attributes && i < attributes.length; i++) { let opcode = attributes[i].flush(env); if (opcode) { vm.updateWith(opcode); } } if (classList) { let attributeManager = env.attributeFor(element, 'class', false); let attribute = new DynamicAttribute(element, attributeManager, 'class', classList.toReference()); let opcode = attribute.flush(env); if (opcode) { vm.updateWith(opcode); } } } shouldAddAttribute(name) { return !this.attributeNames || this.attributeNames.indexOf(name) === -1; } addClass(reference) { let { classList } = this; if (!classList) { classList = this.classList = new ClassList(); } classList.append(reference); } addAttribute(name, attribute) { let { attributeNames, attributes } = this; if (!attributeNames) { attributeNames = this.attributeNames = []; attributes = this.attributes = []; } attributeNames.push(name); (0, _util.unwrap)(attributes).push(attribute); } } exports.ComponentElementOperations = ComponentElementOperations; _opcodes.APPEND_OPCODES.add(33 /* FlushElement */, vm => { let stack = vm.elements(); let action = 'FlushElementOpcode#evaluate'; stack.expectOperations(action).flush(stack.expectConstructing(action), vm); stack.flushElement(); }); _opcodes.APPEND_OPCODES.add(34 /* CloseElement */, vm => vm.elements().closeElement()); _opcodes.APPEND_OPCODES.add(30 /* StaticAttr */, (vm, { op1: _name, op2: _value, op3: _namespace }) => { let name = vm.constants.getString(_name); let value = vm.constants.getString(_value); if (_namespace) { let namespace = vm.constants.getString(_namespace); vm.elements().setStaticAttributeNS(namespace, name, value); } else { vm.elements().setStaticAttribute(name, value); } }); _opcodes.APPEND_OPCODES.add(35 /* Modifier */, (vm, { op1: _manager }) => { let manager = vm.constants.getOther(_manager); let stack = vm.stack; let args = stack.pop(); let tag = args.tag; let { constructing: element, updateOperations } = vm.elements(); let dynamicScope = vm.dynamicScope(); let modifier = manager.create(element, args, dynamicScope, updateOperations); args.clear(); vm.env.scheduleInstallModifier(modifier, manager); let destructor = manager.getDestructor(modifier); if (destructor) { vm.newDestroyable(destructor); } vm.updateWith(new UpdateModifierOpcode(tag, manager, modifier)); }); class UpdateModifierOpcode extends _opcodes.UpdatingOpcode { constructor(tag, manager, modifier) { super(); this.tag = tag; this.manager = manager; this.modifier = modifier; this.type = 'update-modifier'; this.lastUpdated = tag.value(); } evaluate(vm) { let { manager, modifier, tag, lastUpdated } = this; if (!tag.validate(lastUpdated)) { vm.env.scheduleUpdateModifier(modifier, manager); this.lastUpdated = tag.value(); } } toJSON() { return { guid: this._guid, type: this.type }; } } exports.UpdateModifierOpcode = UpdateModifierOpcode; class StaticAttribute { constructor(element, name, value, namespace) { this.element = element; this.name = name; this.value = value; this.namespace = namespace; } flush(env) { env.getAppendOperations().setAttribute(this.element, this.name, this.value, this.namespace); return null; } } exports.StaticAttribute = StaticAttribute; class DynamicAttribute { constructor(element, attributeManager, name, reference, namespace) { this.element = element; this.attributeManager = attributeManager; this.name = name; this.reference = reference; this.namespace = namespace; this.cache = null; this.tag = reference.tag; } patch(env) { let { element, cache } = this; let value = (0, _util.expect)(cache, 'must patch after flush').revalidate(); if ((0, _reference.isModified)(value)) { this.attributeManager.updateAttribute(env, element, value, this.namespace); } } flush(env) { let { reference, element } = this; if ((0, _reference.isConst)(reference)) { let value = reference.value(); this.attributeManager.setAttribute(env, element, value, this.namespace); return null; } else { let cache = this.cache = new _reference.ReferenceCache(reference); let value = cache.peek(); this.attributeManager.setAttribute(env, element, value, this.namespace); return new PatchElementOpcode(this); } } toJSON() { let { element, namespace, name, cache } = this; let formattedElement = formatElement(element); let lastValue = (0, _util.expect)(cache, 'must serialize after flush').peek(); if (namespace) { return { element: formattedElement, lastValue, name, namespace, type: 'attribute' }; } return { element: formattedElement, lastValue, name, namespace: namespace === undefined ? null : namespace, type: 'attribute' }; } } exports.DynamicAttribute = DynamicAttribute; function formatElement(element) { return JSON.stringify(`<${element.tagName.toLowerCase()} />`); } _opcodes.APPEND_OPCODES.add(32 /* DynamicAttrNS */, (vm, { op1: _name, op2: _namespace, op3: trusting }) => { let name = vm.constants.getString(_name); let namespace = vm.constants.getString(_namespace); let reference = vm.stack.pop(); vm.elements().setDynamicAttributeNS(namespace, name, reference, !!trusting); }); _opcodes.APPEND_OPCODES.add(31 /* DynamicAttr */, (vm, { op1: _name, op2: trusting }) => { let name = vm.constants.getString(_name); let reference = vm.stack.pop(); vm.elements().setDynamicAttribute(name, reference, !!trusting); }); class PatchElementOpcode extends _opcodes.UpdatingOpcode { constructor(operation) { super(); this.type = 'patch-element'; this.tag = operation.tag; this.operation = operation; } evaluate(vm) { this.operation.patch(vm.env); } toJSON() { let { _guid, type, operation } = this; return { details: operation.toJSON(), guid: _guid, type }; } } exports.PatchElementOpcode = PatchElementOpcode; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21waWxlZC9vcGNvZGVzL2RvbS5qcyJdLCJuYW1lcyI6WyJhZGQiLCJ2bSIsIm9wMSIsInRleHQiLCJlbGVtZW50cyIsImFwcGVuZFRleHQiLCJjb25zdGFudHMiLCJnZXRTdHJpbmciLCJhcHBlbmRDb21tZW50IiwidGFnIiwib3BlbkVsZW1lbnQiLCJ0YWdOYW1lIiwib3BlcmF0aW9ucyIsInN0YWNrIiwicG9wIiwidmFsdWUiLCJlbGVtZW50UmVmIiwibmV4dFNpYmxpbmdSZWYiLCJlbGVtZW50IiwibmV4dFNpYmxpbmciLCJjYWNoZSIsInBlZWsiLCJ1cGRhdGVXaXRoIiwicHVzaFJlbW90ZUVsZW1lbnQiLCJwb3BSZW1vdGVFbGVtZW50IiwiQ2xhc3NMaXN0IiwiY29uc3RydWN0b3IiLCJsaXN0IiwiaXNDb25zdCIsImFwcGVuZCIsInJlZmVyZW5jZSIsInB1c2giLCJ0b1JlZmVyZW5jZSIsImNyZWF0ZSIsInRvQ2xhc3NOYW1lIiwiQ2xhc3NMaXN0UmVmZXJlbmNlIiwiY29tcHV0ZSIsInJldCIsImkiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJqb2luIiwiU2ltcGxlRWxlbWVudE9wZXJhdGlvbnMiLCJlbnYiLCJvcGNvZGVzIiwiY2xhc3NMaXN0IiwiYWRkU3RhdGljQXR0cmlidXRlIiwibmFtZSIsImFkZENsYXNzIiwiZ2V0QXBwZW5kT3BlcmF0aW9ucyIsInNldEF0dHJpYnV0ZSIsImFkZFN0YXRpY0F0dHJpYnV0ZU5TIiwibmFtZXNwYWNlIiwiYWRkRHluYW1pY0F0dHJpYnV0ZSIsImlzVHJ1c3RpbmciLCJhdHRyaWJ1dGVNYW5hZ2VyIiwiYXR0cmlidXRlRm9yIiwiYXR0cmlidXRlIiwiRHluYW1pY0F0dHJpYnV0ZSIsImFkZEF0dHJpYnV0ZSIsImFkZER5bmFtaWNBdHRyaWJ1dGVOUyIsIm5zQXR0cmlidXRlIiwiZmx1c2giLCJvcGNvZGUiLCJDb21wb25lbnRFbGVtZW50T3BlcmF0aW9ucyIsImF0dHJpYnV0ZU5hbWVzIiwiYXR0cmlidXRlcyIsInNob3VsZEFkZEF0dHJpYnV0ZSIsIlN0YXRpY0F0dHJpYnV0ZSIsImluZGV4T2YiLCJhY3Rpb24iLCJleHBlY3RPcGVyYXRpb25zIiwiZXhwZWN0Q29uc3RydWN0aW5nIiwiZmx1c2hFbGVtZW50IiwiY2xvc2VFbGVtZW50IiwiX25hbWUiLCJvcDIiLCJfdmFsdWUiLCJvcDMiLCJfbmFtZXNwYWNlIiwic2V0U3RhdGljQXR0cmlidXRlTlMiLCJzZXRTdGF0aWNBdHRyaWJ1dGUiLCJfbWFuYWdlciIsIm1hbmFnZXIiLCJnZXRPdGhlciIsImFyZ3MiLCJjb25zdHJ1Y3RpbmciLCJ1cGRhdGVPcGVyYXRpb25zIiwiZHluYW1pY1Njb3BlIiwibW9kaWZpZXIiLCJjbGVhciIsInNjaGVkdWxlSW5zdGFsbE1vZGlmaWVyIiwiZGVzdHJ1Y3RvciIsImdldERlc3RydWN0b3IiLCJuZXdEZXN0cm95YWJsZSIsIlVwZGF0ZU1vZGlmaWVyT3Bjb2RlIiwidHlwZSIsImxhc3RVcGRhdGVkIiwiZXZhbHVhdGUiLCJ2YWxpZGF0ZSIsInNjaGVkdWxlVXBkYXRlTW9kaWZpZXIiLCJ0b0pTT04iLCJndWlkIiwiX2d1aWQiLCJwYXRjaCIsInJldmFsaWRhdGUiLCJ1cGRhdGVBdHRyaWJ1dGUiLCJQYXRjaEVsZW1lbnRPcGNvZGUiLCJmb3JtYXR0ZWRFbGVtZW50IiwiZm9ybWF0RWxlbWVudCIsImxhc3RWYWx1ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0b0xvd2VyQ2FzZSIsInRydXN0aW5nIiwic2V0RHluYW1pY0F0dHJpYnV0ZU5TIiwic2V0RHluYW1pY0F0dHJpYnV0ZSIsIm9wZXJhdGlvbiIsImRldGFpbHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQSx3QkFBZUEsR0FBZixDQUFtQixFQUFuQixDQUFzQixVQUF0QixFQUFrQyxDQUFDQyxFQUFELEVBQUssRUFBRUMsS0FBS0MsSUFBUCxFQUFMLEtBQXVCO0FBQ3JERixPQUFHRyxRQUFILEdBQWND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QyxDQUFDb0YsUUFBckQ7QUFDSCxDQUpEO0FBS08sTUFBTVAsa0JBQU4saUNBQWdEO0FBQ25EakYsZ0JBQVkyRixTQUFaLEVBQXVCO0FBQ25CO0FBQ0EsYUFBS3JCLElBQUwsR0FBWSxlQUFaO0FBQ0EsYUFBS3ZGLEdBQUwsR0FBVzRHLFVBQVU1RyxHQUFyQjtBQUNBLGFBQUs0RyxTQUFMLEdBQWlCQSxTQUFqQjtBQUNIO0FBQ0RuQixhQUFTakcsRUFBVCxFQUFhO0FBQ1QsYUFBS29ILFNBQUwsQ0FBZWIsS0FBZixDQUFxQnZHLEdBQUcwQyxHQUF4QjtBQUNIO0FBQ0QwRCxhQUFTO0FBQ0wsWUFBSSxFQUFFRSxLQUFGLEVBQVNQLElBQVQsRUFBZXFCLFNBQWYsS0FBNkIsSUFBakM7QUFDQSxlQUFPO0FBQ0hDLHFCQUFTRCxVQUFVaEIsTUFBVixFQUROO0FBRUhDLGtCQUFNQyxLQUZIO0FBR0hQO0FBSEcsU0FBUDtBQUtIO0FBakJrRDtRQUExQ1csa0IsR0FBQUEsa0IiLCJmaWxlIjoibGliL2NvbXBpbGVkL29wY29kZXMvZG9tLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2FjaGVkUmVmZXJlbmNlLCBjb21iaW5lVGFnZ2VkLCBpc0NvbnN0IGFzIGlzQ29uc3RSZWZlcmVuY2UsIGlzTW9kaWZpZWQsIFJlZmVyZW5jZUNhY2hlIH0gZnJvbSAnQGdsaW1tZXIvcmVmZXJlbmNlJztcbmltcG9ydCB7IGV4cGVjdCwgdW53cmFwIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBBUFBFTkRfT1BDT0RFUywgVXBkYXRpbmdPcGNvZGUgfSBmcm9tICcuLi8uLi9vcGNvZGVzJztcbmltcG9ydCB7IE5VTExfUkVGRVJFTkNFLCBQcmltaXRpdmVSZWZlcmVuY2UgfSBmcm9tICcuLi8uLi9yZWZlcmVuY2VzJztcbmltcG9ydCB7IEFzc2VydCB9IGZyb20gJy4vdm0nO1xuQVBQRU5EX09QQ09ERVMuYWRkKDI0IC8qIFRleHQgKi8sICh2bSwgeyBvcDE6IHRleHQgfSkgPT4ge1xuICAgIHZtLmVsZW1lbnRzKCkuYXBwZW5kVGV4dCh2bS5jb25zdGFudHMuZ2V0U3RyaW5nKHRleHQpKTtcbn0pO1xuQVBQRU5EX09QQ09ERVMuYWRkKDI1IC8qIENvbW1lbnQgKi8sICh2bSwgeyBvcDE6IHRleHQgfSkgPT4ge1xuICAgIHZtLmVsZW1lbnRzKCkuYXBwZW5kQ29tbWVudCh2bS5jb25zdGFudHMuZ2V0U3RyaW5nKHRleHQpKTtcbn0pO1xuQVBQRU5EX09QQ09ERVMuYWRkKDI3IC8qIE9wZW5FbGVtZW50ICovLCAodm0sIHsgb3AxOiB0YWcgfSkgPT4ge1xuICAgIHZtLmVsZW1lbnRzKCkub3BlbkVsZW1lbnQodm0uY29uc3RhbnRzLmdldFN0cmluZyh0YWcpKTtcbn0pO1xuQVBQRU5EX09QQ09ERVMuYWRkKDI4IC8qIE9wZW5FbGVtZW50V2l0aE9wZXJhdGlvbnMgKi8sICh2bSwgeyBvcDE6IHRhZyB9KSA9PiB7XG4gICAgbGV0IHRhZ05hbWUgPSB2bS5jb25zdGFudHMuZ2V0U3RyaW5nKHRhZyk7XG4gICAgbGV0IG9wZXJhdGlvbnMgPSB2bS5zdGFjay5wb3AoKTtcbiAgICB2bS5lbGVtZW50cygpLm9wZW5FbGVtZW50KHRhZ05hbWUsIG9wZXJhdGlvbnMpO1xufSk7XG5BUFBFTkRfT1BDT0RFUy5hZGQoMjkgLyogT3BlbkR5bmFtaWNFbGVtZW50ICovLCB2bSA9PiB7XG4gICAgbGV0IG9wZXJhdGlvbnMgPSB2bS5zdGFjay5wb3AoKTtcbiAgICBsZXQgdGFnTmFtZSA9IHZtLnN0YWNrLnBvcCgpLnZhbHVlKCk7XG4gICAgdm0uZWxlbWVudHMoKS5vcGVuRWxlbWVudCh0YWdOYW1lLCBvcGVyYXRpb25zKTtcbn0pO1xuQVBQRU5EX09QQ09ERVMuYWRkKDM2IC8qIFB1c2hSZW1vdGVFbGVtZW50ICovLCB2bSA9PiB7XG4gICAgbGV0IGVsZW1lbnRSZWYgPSB2bS5zdGFjay5wb3AoKTtcbiAgICBsZXQgbmV4dFNpYmxpbmdSZWYgPSB2bS5zdGFjay5wb3AoKTtcbiAgICBsZXQgZWxlbWVudDtcbiAgICBsZXQgbmV4dFNpYmxpbmc7XG4gICAgaWYgKGlzQ29uc3RSZWZlcmVuY2UoZWxlbWVudFJlZikpIHtcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnRSZWYudmFsdWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgY2FjaGUgPSBuZXcgUmVmZXJlbmNlQ2FjaGUoZWxlbWVudFJlZik7XG4gICAgICAgIGVsZW1lbnQgPSBjYWNoZS5wZWVrKCk7XG4gICAgICAgIHZtLnVwZGF0ZVdpdGgobmV3IEFzc2VydChjYWNoZSkpO1xuICAgIH1cbiAgICBpZiAoaXNDb25zdFJlZmVyZW5jZShuZXh0U2libGluZ1JlZikpIHtcbiAgICAgICAgbmV4dFNpYmxpbmcgPSBuZXh0U2libGluZ1JlZi52YWx1ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBjYWNoZSA9IG5ldyBSZWZlcmVuY2VDYWNoZShuZXh0U2libGluZ1JlZik7XG4gICAgICAgIG5leHRTaWJsaW5nID0gY2FjaGUucGVlaygpO1xuICAgICAgICB2bS51cGRhdGVXaXRoKG5ldyBBc3NlcnQoY2FjaGUpKTtcbiAgICB9XG4gICAgdm0uZWxlbWVudHMoKS5wdXNoUmVtb3RlRWxlbWVudChlbGVtZW50LCBuZXh0U2libGluZyk7XG59KTtcbkFQUEVORF9PUENPREVTLmFkZCgzNyAvKiBQb3BSZW1vdGVFbGVtZW50ICovLCB2bSA9PiB2bS5lbGVtZW50cygpLnBvcFJlbW90ZUVsZW1lbnQoKSk7XG5jbGFzcyBDbGFzc0xpc3Qge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxpc3QgPSBudWxsO1xuICAgICAgICB0aGlzLmlzQ29uc3QgPSB0cnVlO1xuICAgIH1cbiAgICBhcHBlbmQocmVmZXJlbmNlKSB7XG4gICAgICAgIGxldCB7IGxpc3QsIGlzQ29uc3QgfSA9IHRoaXM7XG4gICAgICAgIGlmIChsaXN0ID09PSBudWxsKSBsaXN0ID0gdGhpcy5saXN0ID0gW107XG4gICAgICAgIGxpc3QucHVzaChyZWZlcmVuY2UpO1xuICAgICAgICB0aGlzLmlzQ29uc3QgPSBpc0NvbnN0ICYmIGlzQ29uc3RSZWZlcmVuY2UocmVmZXJlbmNlKTtcbiAgICB9XG4gICAgdG9SZWZlcmVuY2UoKSB7XG4gICAgICAgIGxldCB7IGxpc3QsIGlzQ29uc3QgfSA9IHRoaXM7XG4gICAgICAgIGlmICghbGlzdCkgcmV0dXJuIE5VTExfUkVGRVJFTkNFO1xuICAgICAgICBpZiAoaXNDb25zdCkgcmV0dXJuIFByaW1pdGl2ZVJlZmVyZW5jZS5jcmVhdGUodG9DbGFzc05hbWUobGlzdCkpO1xuICAgICAgICByZXR1cm4gbmV3IENsYXNzTGlzdFJlZmVyZW5jZShsaXN0KTtcbiAgICB9XG59XG5jbGFzcyBDbGFzc0xpc3RSZWZlcmVuY2UgZXh0ZW5kcyBDYWNoZWRSZWZlcmVuY2Uge1xuICAgIGNvbnN0cnVjdG9yKGxpc3QpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5saXN0ID0gW107XG4gICAgICAgIHRoaXMudGFnID0gY29tYmluZVRhZ2dlZChsaXN0KTtcbiAgICAgICAgdGhpcy5saXN0ID0gbGlzdDtcbiAgICB9XG4gICAgY29tcHV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRvQ2xhc3NOYW1lKHRoaXMubGlzdCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdG9DbGFzc05hbWUobGlzdCkge1xuICAgIGxldCByZXQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHZhbHVlID0gbGlzdFtpXS52YWx1ZSgpO1xuICAgICAgICBpZiAodmFsdWUgIT09IGZhbHNlICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHJldC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldC5sZW5ndGggPT09IDAgPyBudWxsIDogcmV0LmpvaW4oJyAnKTtcbn1cbmV4cG9ydCBjbGFzcyBTaW1wbGVFbGVtZW50T3BlcmF0aW9ucyB7XG4gICAgY29uc3RydWN0b3IoZW52KSB7XG4gICAgICAgIHRoaXMuZW52ID0gZW52O1xuICAgICAgICB0aGlzLm9wY29kZXMgPSBudWxsO1xuICAgICAgICB0aGlzLmNsYXNzTGlzdCA9IG51bGw7XG4gICAgfVxuICAgIGFkZFN0YXRpY0F0dHJpYnV0ZShlbGVtZW50LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgdGhpcy5hZGRDbGFzcyhQcmltaXRpdmVSZWZlcmVuY2UuY3JlYXRlKHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVudi5nZXRBcHBlbmRPcGVyYXRpb25zKCkuc2V0QXR0cmlidXRlKGVsZW1lbnQsIG5hbWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGRTdGF0aWNBdHRyaWJ1dGVOUyhlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZW52LmdldEFwcGVuZE9wZXJhdGlvbnMoKS5zZXRBdHRyaWJ1dGUoZWxlbWVudCwgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZSk7XG4gICAgfVxuICAgIGFkZER5bmFtaWNBdHRyaWJ1dGUoZWxlbWVudCwgbmFtZSwgcmVmZXJlbmNlLCBpc1RydXN0aW5nKSB7XG4gICAgICAgIGlmIChuYW1lID09PSAnY2xhc3MnKSB7XG4gICAgICAgICAgICB0aGlzLmFkZENsYXNzKHJlZmVyZW5jZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgYXR0cmlidXRlTWFuYWdlciA9IHRoaXMuZW52LmF0dHJpYnV0ZUZvcihlbGVtZW50LCBuYW1lLCBpc1RydXN0aW5nKTtcbiAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPSBuZXcgRHluYW1pY0F0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGVNYW5hZ2VyLCBuYW1lLCByZWZlcmVuY2UpO1xuICAgICAgICAgICAgdGhpcy5hZGRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGREeW5hbWljQXR0cmlidXRlTlMoZWxlbWVudCwgbmFtZXNwYWNlLCBuYW1lLCByZWZlcmVuY2UsIGlzVHJ1c3RpbmcpIHtcbiAgICAgICAgbGV0IGF0dHJpYnV0ZU1hbmFnZXIgPSB0aGlzLmVudi5hdHRyaWJ1dGVGb3IoZWxlbWVudCwgbmFtZSwgaXNUcnVzdGluZywgbmFtZXNwYWNlKTtcbiAgICAgICAgbGV0IG5zQXR0cmlidXRlID0gbmV3IER5bmFtaWNBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlTWFuYWdlciwgbmFtZSwgcmVmZXJlbmNlLCBuYW1lc3BhY2UpO1xuICAgICAgICB0aGlzLmFkZEF0dHJpYnV0ZShuc0F0dHJpYnV0ZSk7XG4gICAgfVxuICAgIGZsdXNoKGVsZW1lbnQsIHZtKSB7XG4gICAgICAgIGxldCB7IGVudiB9ID0gdm07XG4gICAgICAgIGxldCB7IG9wY29kZXMsIGNsYXNzTGlzdCB9ID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IG9wY29kZXMgJiYgaSA8IG9wY29kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZtLnVwZGF0ZVdpdGgob3Bjb2Rlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNsYXNzTGlzdCkge1xuICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZU1hbmFnZXIgPSBlbnYuYXR0cmlidXRlRm9yKGVsZW1lbnQsICdjbGFzcycsIGZhbHNlKTtcbiAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPSBuZXcgRHluYW1pY0F0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGVNYW5hZ2VyLCAnY2xhc3MnLCBjbGFzc0xpc3QudG9SZWZlcmVuY2UoKSk7XG4gICAgICAgICAgICBsZXQgb3Bjb2RlID0gYXR0cmlidXRlLmZsdXNoKGVudik7XG4gICAgICAgICAgICBpZiAob3Bjb2RlKSB7XG4gICAgICAgICAgICAgICAgdm0udXBkYXRlV2l0aChvcGNvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub3Bjb2RlcyA9IG51bGw7XG4gICAgICAgIHRoaXMuY2xhc3NMaXN0ID0gbnVsbDtcbiAgICB9XG4gICAgYWRkQ2xhc3MocmVmZXJlbmNlKSB7XG4gICAgICAgIGxldCB7IGNsYXNzTGlzdCB9ID0gdGhpcztcbiAgICAgICAgaWYgKCFjbGFzc0xpc3QpIHtcbiAgICAgICAgICAgIGNsYXNzTGlzdCA9IHRoaXMuY2xhc3NMaXN0ID0gbmV3IENsYXNzTGlzdCgpO1xuICAgICAgICB9XG4gICAgICAgIGNsYXNzTGlzdC5hcHBlbmQocmVmZXJlbmNlKTtcbiAgICB9XG4gICAgYWRkQXR0cmlidXRlKGF0dHJpYnV0ZSkge1xuICAgICAgICBsZXQgb3Bjb2RlID0gYXR0cmlidXRlLmZsdXNoKHRoaXMuZW52KTtcbiAgICAgICAgaWYgKG9wY29kZSkge1xuICAgICAgICAgICAgbGV0IHsgb3Bjb2RlcyB9ID0gdGhpcztcbiAgICAgICAgICAgIGlmICghb3Bjb2Rlcykge1xuICAgICAgICAgICAgICAgIG9wY29kZXMgPSB0aGlzLm9wY29kZXMgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wY29kZXMucHVzaChvcGNvZGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudEVsZW1lbnRPcGVyYXRpb25zIHtcbiAgICBjb25zdHJ1Y3RvcihlbnYpIHtcbiAgICAgICAgdGhpcy5lbnYgPSBlbnY7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlTmFtZXMgPSBudWxsO1xuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBudWxsO1xuICAgICAgICB0aGlzLmNsYXNzTGlzdCA9IG51bGw7XG4gICAgfVxuICAgIGFkZFN0YXRpY0F0dHJpYnV0ZShlbGVtZW50LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgdGhpcy5hZGRDbGFzcyhQcmltaXRpdmVSZWZlcmVuY2UuY3JlYXRlKHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaG91bGRBZGRBdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKG5hbWUsIG5ldyBTdGF0aWNBdHRyaWJ1dGUoZWxlbWVudCwgbmFtZSwgdmFsdWUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGRTdGF0aWNBdHRyaWJ1dGVOUyhlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZEFkZEF0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5hZGRBdHRyaWJ1dGUobmFtZSwgbmV3IFN0YXRpY0F0dHJpYnV0ZShlbGVtZW50LCBuYW1lLCB2YWx1ZSwgbmFtZXNwYWNlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkRHluYW1pY0F0dHJpYnV0ZShlbGVtZW50LCBuYW1lLCByZWZlcmVuY2UsIGlzVHJ1c3RpbmcpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdjbGFzcycpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQ2xhc3MocmVmZXJlbmNlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNob3VsZEFkZEF0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZU1hbmFnZXIgPSB0aGlzLmVudi5hdHRyaWJ1dGVGb3IoZWxlbWVudCwgbmFtZSwgaXNUcnVzdGluZyk7XG4gICAgICAgICAgICBsZXQgYXR0cmlidXRlID0gbmV3IER5bmFtaWNBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlTWFuYWdlciwgbmFtZSwgcmVmZXJlbmNlKTtcbiAgICAgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKG5hbWUsIGF0dHJpYnV0ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkRHluYW1pY0F0dHJpYnV0ZU5TKGVsZW1lbnQsIG5hbWVzcGFjZSwgbmFtZSwgcmVmZXJlbmNlLCBpc1RydXN0aW5nKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZEFkZEF0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZU1hbmFnZXIgPSB0aGlzLmVudi5hdHRyaWJ1dGVGb3IoZWxlbWVudCwgbmFtZSwgaXNUcnVzdGluZywgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgIGxldCBuc0F0dHJpYnV0ZSA9IG5ldyBEeW5hbWljQXR0cmlidXRlKGVsZW1lbnQsIGF0dHJpYnV0ZU1hbmFnZXIsIG5hbWUsIHJlZmVyZW5jZSwgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKG5hbWUsIG5zQXR0cmlidXRlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmbHVzaChlbGVtZW50LCB2bSkge1xuICAgICAgICBsZXQgeyBlbnYgfSA9IHRoaXM7XG4gICAgICAgIGxldCB7IGF0dHJpYnV0ZXMsIGNsYXNzTGlzdCB9ID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGF0dHJpYnV0ZXMgJiYgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBvcGNvZGUgPSBhdHRyaWJ1dGVzW2ldLmZsdXNoKGVudik7XG4gICAgICAgICAgICBpZiAob3Bjb2RlKSB7XG4gICAgICAgICAgICAgICAgdm0udXBkYXRlV2l0aChvcGNvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjbGFzc0xpc3QpIHtcbiAgICAgICAgICAgIGxldCBhdHRyaWJ1dGVNYW5hZ2VyID0gZW52LmF0dHJpYnV0ZUZvcihlbGVtZW50LCAnY2xhc3MnLCBmYWxzZSk7XG4gICAgICAgICAgICBsZXQgYXR0cmlidXRlID0gbmV3IER5bmFtaWNBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlTWFuYWdlciwgJ2NsYXNzJywgY2xhc3NMaXN0LnRvUmVmZXJlbmNlKCkpO1xuICAgICAgICAgICAgbGV0IG9wY29kZSA9IGF0dHJpYnV0ZS5mbHVzaChlbnYpO1xuICAgICAgICAgICAgaWYgKG9wY29kZSkge1xuICAgICAgICAgICAgICAgIHZtLnVwZGF0ZVdpdGgob3Bjb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBzaG91bGRBZGRBdHRyaWJ1dGUobmFtZSkge1xuICAgICAgICByZXR1cm4gIXRoaXMuYXR0cmlidXRlTmFtZXMgfHwgdGhpcy5hdHRyaWJ1dGVOYW1lcy5pbmRleE9mKG5hbWUpID09PSAtMTtcbiAgICB9XG4gICAgYWRkQ2xhc3MocmVmZXJlbmNlKSB7XG4gICAgICAgIGxldCB7IGNsYXNzTGlzdCB9ID0gdGhpcztcbiAgICAgICAgaWYgKCFjbGFzc0xpc3QpIHtcbiAgICAgICAgICAgIGNsYXNzTGlzdCA9IHRoaXMuY2xhc3NMaXN0ID0gbmV3IENsYXNzTGlzdCgpO1xuICAgICAgICB9XG4gICAgICAgIGNsYXNzTGlzdC5hcHBlbmQocmVmZXJlbmNlKTtcbiAgICB9XG4gICAgYWRkQXR0cmlidXRlKG5hbWUsIGF0dHJpYnV0ZSkge1xuICAgICAgICBsZXQgeyBhdHRyaWJ1dGVOYW1lcywgYXR0cmlidXRlcyB9ID0gdGhpcztcbiAgICAgICAgaWYgKCFhdHRyaWJ1dGVOYW1lcykge1xuICAgICAgICAgICAgYXR0cmlidXRlTmFtZXMgPSB0aGlzLmF0dHJpYnV0ZU5hbWVzID0gW107XG4gICAgICAgICAgICBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgYXR0cmlidXRlTmFtZXMucHVzaChuYW1lKTtcbiAgICAgICAgdW53cmFwKGF0dHJpYnV0ZXMpLnB1c2goYXR0cmlidXRlKTtcbiAgICB9XG59XG5BUFBFTkRfT1BDT0RFUy5hZGQoMzMgLyogRmx1c2hFbGVtZW50ICovLCB2bSA9PiB7XG4gICAgbGV0IHN0YWNrID0gdm0uZWxlbWVudHMoKTtcbiAgICBsZXQgYWN0aW9uID0gJ0ZsdXNoRWxlbWVudE9wY29kZSNldmFsdWF0ZSc7XG4gICAgc3RhY2suZXhwZWN0T3BlcmF0aW9ucyhhY3Rpb24pLmZsdXNoKHN0YWNrLmV4cGVjdENvbnN0cnVjdGluZyhhY3Rpb24pLCB2bSk7XG4gICAgc3RhY2suZmx1c2hFbGVtZW50KCk7XG59KTtcbkFQUEVORF9PUENPREVTLmFkZCgzNCAvKiBDbG9zZUVsZW1lbnQgKi8sIHZtID0+IHZtLmVsZW1lbnRzKCkuY2xvc2VFbGVtZW50KCkpO1xuQVBQRU5EX09QQ09ERVMuYWRkKDMwIC8qIFN0YXRpY0F0dHIgKi8sICh2bSwgeyBvcDE6IF9uYW1lLCBvcDI6IF92YWx1ZSwgb3AzOiBfbmFtZXNwYWNlIH0pID0+IHtcbiAgICBsZXQgbmFtZSA9IHZtLmNvbnN0YW50cy5nZXRTdHJpbmcoX25hbWUpO1xuICAgIGxldCB2YWx1ZSA9IHZtLmNvbnN0YW50cy5nZXRTdHJpbmcoX3ZhbHVlKTtcbiAgICBpZiAoX25hbWVzcGFjZSkge1xuICAgICAgICBsZXQgbmFtZXNwYWNlID0gdm0uY29uc3RhbnRzLmdldFN0cmluZyhfbmFtZXNwYWNlKTtcbiAgICAgICAgdm0uZWxlbWVudHMoKS5zZXRTdGF0aWNBdHRyaWJ1dGVOUyhuYW1lc3BhY2UsIG5hbWUsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB2bS5lbGVtZW50cygpLnNldFN0YXRpY0F0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gICAgfVxufSk7XG5BUFBFTkRfT1BDT0RFUy5hZGQoMzUgLyogTW9kaWZpZXIgKi8sICh2bSwgeyBvcDE6IF9tYW5hZ2VyIH0pID0+IHtcbiAgICBsZXQgbWFuYWdlciA9IHZtLmNvbnN0YW50cy5nZXRPdGhlcihfbWFuYWdlcik7XG4gICAgbGV0IHN0YWNrID0gdm0uc3RhY2s7XG4gICAgbGV0IGFyZ3MgPSBzdGFjay5wb3AoKTtcbiAgICBsZXQgdGFnID0gYXJncy50YWc7XG4gICAgbGV0IHsgY29uc3RydWN0aW5nOiBlbGVtZW50LCB1cGRhdGVPcGVyYXRpb25zIH0gPSB2bS5lbGVtZW50cygpO1xuICAgIGxldCBkeW5hbWljU2NvcGUgPSB2bS5keW5hbWljU2NvcGUoKTtcbiAgICBsZXQgbW9kaWZpZXIgPSBtYW5hZ2VyLmNyZWF0ZShlbGVtZW50LCBhcmdzLCBkeW5hbWljU2NvcGUsIHVwZGF0ZU9wZXJhdGlvbnMpO1xuICAgIGFyZ3MuY2xlYXIoKTtcbiAgICB2bS5lbnYuc2NoZWR1bGVJbnN0YWxsTW9kaWZpZXIobW9kaWZpZXIsIG1hbmFnZXIpO1xuICAgIGxldCBkZXN0cnVjdG9yID0gbWFuYWdlci5nZXREZXN0cnVjdG9yKG1vZGlmaWVyKTtcbiAgICBpZiAoZGVzdHJ1Y3Rvcikge1xuICAgICAgICB2bS5uZXdEZXN0cm95YWJsZShkZXN0cnVjdG9yKTtcbiAgICB9XG4gICAgdm0udXBkYXRlV2l0aChuZXcgVXBkYXRlTW9kaWZpZXJPcGNvZGUodGFnLCBtYW5hZ2VyLCBtb2RpZmllcikpO1xufSk7XG5leHBvcnQgY2xhc3MgVXBkYXRlTW9kaWZpZXJPcGNvZGUgZXh0ZW5kcyBVcGRhdGluZ09wY29kZSB7XG4gICAgY29uc3RydWN0b3IodGFnLCBtYW5hZ2VyLCBtb2RpZmllcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRhZyA9IHRhZztcbiAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjtcbiAgICAgICAgdGhpcy5tb2RpZmllciA9IG1vZGlmaWVyO1xuICAgICAgICB0aGlzLnR5cGUgPSAndXBkYXRlLW1vZGlmaWVyJztcbiAgICAgICAgdGhpcy5sYXN0VXBkYXRlZCA9IHRhZy52YWx1ZSgpO1xuICAgIH1cbiAgICBldmFsdWF0ZSh2bSkge1xuICAgICAgICBsZXQgeyBtYW5hZ2VyLCBtb2RpZmllciwgdGFnLCBsYXN0VXBkYXRlZCB9ID0gdGhpcztcbiAgICAgICAgaWYgKCF0YWcudmFsaWRhdGUobGFzdFVwZGF0ZWQpKSB7XG4gICAgICAgICAgICB2bS5lbnYuc2NoZWR1bGVVcGRhdGVNb2RpZmllcihtb2RpZmllciwgbWFuYWdlcik7XG4gICAgICAgICAgICB0aGlzLmxhc3RVcGRhdGVkID0gdGFnLnZhbHVlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZ3VpZDogdGhpcy5fZ3VpZCxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZVxuICAgICAgICB9O1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBTdGF0aWNBdHRyaWJ1dGUge1xuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQsIG5hbWUsIHZhbHVlLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcbiAgICB9XG4gICAgZmx1c2goZW52KSB7XG4gICAgICAgIGVudi5nZXRBcHBlbmRPcGVyYXRpb25zKCkuc2V0QXR0cmlidXRlKHRoaXMuZWxlbWVudCwgdGhpcy5uYW1lLCB0aGlzLnZhbHVlLCB0aGlzLm5hbWVzcGFjZSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBEeW5hbWljQXR0cmlidXRlIHtcbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50LCBhdHRyaWJ1dGVNYW5hZ2VyLCBuYW1lLCByZWZlcmVuY2UsIG5hbWVzcGFjZSkge1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLmF0dHJpYnV0ZU1hbmFnZXIgPSBhdHRyaWJ1dGVNYW5hZ2VyO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTtcbiAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gICAgICAgIHRoaXMuY2FjaGUgPSBudWxsO1xuICAgICAgICB0aGlzLnRhZyA9IHJlZmVyZW5jZS50YWc7XG4gICAgfVxuICAgIHBhdGNoKGVudikge1xuICAgICAgICBsZXQgeyBlbGVtZW50LCBjYWNoZSB9ID0gdGhpcztcbiAgICAgICAgbGV0IHZhbHVlID0gZXhwZWN0KGNhY2hlLCAnbXVzdCBwYXRjaCBhZnRlciBmbHVzaCcpLnJldmFsaWRhdGUoKTtcbiAgICAgICAgaWYgKGlzTW9kaWZpZWQodmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZU1hbmFnZXIudXBkYXRlQXR0cmlidXRlKGVudiwgZWxlbWVudCwgdmFsdWUsIHRoaXMubmFtZXNwYWNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmbHVzaChlbnYpIHtcbiAgICAgICAgbGV0IHsgcmVmZXJlbmNlLCBlbGVtZW50IH0gPSB0aGlzO1xuICAgICAgICBpZiAoaXNDb25zdFJlZmVyZW5jZShyZWZlcmVuY2UpKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSByZWZlcmVuY2UudmFsdWUoKTtcbiAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlTWFuYWdlci5zZXRBdHRyaWJ1dGUoZW52LCBlbGVtZW50LCB2YWx1ZSwgdGhpcy5uYW1lc3BhY2UpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgY2FjaGUgPSB0aGlzLmNhY2hlID0gbmV3IFJlZmVyZW5jZUNhY2hlKHJlZmVyZW5jZSk7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBjYWNoZS5wZWVrKCk7XG4gICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZU1hbmFnZXIuc2V0QXR0cmlidXRlKGVudiwgZWxlbWVudCwgdmFsdWU