ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
333 lines (281 loc) • 28.8 kB
JavaScript
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
import { dict, EMPTY_ARRAY } from '@glimmer/util';
import { combineTagged } from '@glimmer/reference';
import { PrimitiveReference, UNDEFINED_REFERENCE } from '../references';
export var Arguments = function () {
function Arguments() {
_classCallCheck(this, Arguments);
this.stack = null;
this.positional = new PositionalArguments();
this.named = new NamedArguments();
}
Arguments.prototype.empty = function empty() {
this.setup(null, true);
return this;
};
Arguments.prototype.setup = function setup(stack, synthetic) {
this.stack = stack;
var names = stack.fromTop(0);
var namedCount = names.length;
var positionalCount = stack.fromTop(namedCount + 1);
var start = positionalCount + namedCount + 2;
var positional = this.positional;
positional.setup(stack, start, positionalCount);
var named = this.named;
named.setup(stack, namedCount, names, synthetic);
};
Arguments.prototype.at = function at(pos) {
return this.positional.at(pos);
};
Arguments.prototype.get = function get(name) {
return this.named.get(name);
};
Arguments.prototype.capture = function capture() {
return {
tag: this.tag,
length: this.length,
positional: this.positional.capture(),
named: this.named.capture()
};
};
Arguments.prototype.clear = function clear() {
var stack = this.stack,
length = this.length;
stack.pop(length + 2);
};
_createClass(Arguments, [{
key: 'tag',
get: function () {
return combineTagged([this.positional, this.named]);
}
}, {
key: 'length',
get: function () {
return this.positional.length + this.named.length;
}
}]);
return Arguments;
}();
var PositionalArguments = function () {
function PositionalArguments() {
_classCallCheck(this, PositionalArguments);
this.length = 0;
this.stack = null;
this.start = 0;
this._tag = null;
this._references = null;
}
PositionalArguments.prototype.setup = function setup(stack, start, length) {
this.stack = stack;
this.start = start;
this.length = length;
this._tag = null;
this._references = null;
};
PositionalArguments.prototype.at = function at(position) {
var start = this.start,
length = this.length;
if (position < 0 || position >= length) {
return UNDEFINED_REFERENCE;
}
// stack: pos1, pos2, pos3, named1, named2
// start: 4 (top - 4)
//
// at(0) === pos1 === top - start
// at(1) === pos2 === top - (start - 1)
// at(2) === pos3 === top - (start - 2)
var fromTop = start - position - 1;
return this.stack.fromTop(fromTop);
};
PositionalArguments.prototype.capture = function capture() {
return new CapturedPositionalArguments(this.tag, this.references);
};
_createClass(PositionalArguments, [{
key: 'tag',
get: function () {
var tag = this._tag;
if (!tag) {
tag = this._tag = combineTagged(this.references);
}
return tag;
}
}, {
key: 'references',
get: function () {
var references = this._references;
if (!references) {
var length = this.length;
references = this._references = new Array(length);
for (var i = 0; i < length; i++) {
references[i] = this.at(i);
}
}
return references;
}
}]);
return PositionalArguments;
}();
var CapturedPositionalArguments = function () {
function CapturedPositionalArguments(tag, references) {
var length = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : references.length;
_classCallCheck(this, CapturedPositionalArguments);
this.tag = tag;
this.references = references;
this.length = length;
}
CapturedPositionalArguments.prototype.at = function at(position) {
return this.references[position];
};
CapturedPositionalArguments.prototype.value = function value() {
return this.references.map(this.valueOf);
};
CapturedPositionalArguments.prototype.get = function get(name) {
var references = this.references,
length = this.length;
if (name === 'length') {
return PrimitiveReference.create(length);
} else {
var idx = parseInt(name, 10);
if (idx < 0 || idx >= length) {
return UNDEFINED_REFERENCE;
} else {
return references[idx];
}
}
};
CapturedPositionalArguments.prototype.valueOf = function valueOf(reference) {
return reference.value();
};
return CapturedPositionalArguments;
}();
var NamedArguments = function () {
function NamedArguments() {
_classCallCheck(this, NamedArguments);
this.length = 0;
this._tag = null;
this._references = null;
this._names = null;
this._realNames = EMPTY_ARRAY;
}
NamedArguments.prototype.setup = function setup(stack, length, names, synthetic) {
this.stack = stack;
this.length = length;
this._tag = null;
this._references = null;
if (synthetic) {
this._names = names;
this._realNames = EMPTY_ARRAY;
} else {
this._names = null;
this._realNames = names;
}
};
NamedArguments.prototype.has = function has(name) {
return this.names.indexOf(name) !== -1;
};
NamedArguments.prototype.get = function get(name) {
var names = this.names,
length = this.length;
var idx = names.indexOf(name);
if (idx === -1) {
return UNDEFINED_REFERENCE;
}
// stack: pos1, pos2, pos3, named1, named2
// start: 4 (top - 4)
// namedDict: { named1: 1, named2: 0 };
//
// get('named1') === named1 === top - (start - 1)
// get('named2') === named2 === top - start
var fromTop = length - idx;
return this.stack.fromTop(fromTop);
};
NamedArguments.prototype.capture = function capture() {
return new CapturedNamedArguments(this.tag, this.names, this.references);
};
NamedArguments.prototype.sliceName = function sliceName(name) {
return name.slice(1);
};
_createClass(NamedArguments, [{
key: 'tag',
get: function () {
return combineTagged(this.references);
}
}, {
key: 'names',
get: function () {
var names = this._names;
if (!names) {
names = this._names = this._realNames.map(this.sliceName);
}
return names;
}
}, {
key: 'references',
get: function () {
var references = this._references;
if (!references) {
var names = this.names,
length = this.length;
references = this._references = [];
for (var i = 0; i < length; i++) {
references[i] = this.get(names[i]);
}
}
return references;
}
}]);
return NamedArguments;
}();
var CapturedNamedArguments = function () {
function CapturedNamedArguments(tag, names, references) {
_classCallCheck(this, CapturedNamedArguments);
this.tag = tag;
this.names = names;
this.references = references;
this.length = names.length;
this._map = null;
}
CapturedNamedArguments.prototype.has = function has(name) {
return this.names.indexOf(name) !== -1;
};
CapturedNamedArguments.prototype.get = function get(name) {
var names = this.names,
references = this.references;
var idx = names.indexOf(name);
if (idx === -1) {
return UNDEFINED_REFERENCE;
} else {
return references[idx];
}
};
CapturedNamedArguments.prototype.value = function value() {
var names = this.names,
references = this.references;
var out = dict();
for (var i = 0; i < names.length; i++) {
var name = names[i];
out[name] = references[i].value();
}
return out;
};
_createClass(CapturedNamedArguments, [{
key: 'map',
get: function () {
var map = this._map;
if (!map) {
var names = this.names,
references = this.references;
map = this._map = dict();
for (var i = 0; i < names.length; i++) {
var name = names[i];
map[name] = references[i];
}
}
return map;
}
}]);
return CapturedNamedArguments;
}();
export default new Arguments();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi92bS9hcmd1bWVudHMuanMiXSwibmFtZXMiOlsiZGljdCIsIkVNUFRZX0FSUkFZIiwiY29tYmluZVRhZ2dlZCIsIlByaW1pdGl2ZVJlZmVyZW5jZSIsIlVOREVGSU5FRF9SRUZFUkVOQ0UiLCJBcmd1bWVudHMiLCJzdGFjayIsInBvc2l0aW9uYWwiLCJQb3NpdGlvbmFsQXJndW1lbnRzIiwibmFtZWQiLCJOYW1lZEFyZ3VtZW50cyIsImVtcHR5Iiwic2V0dXAiLCJzeW50aGV0aWMiLCJuYW1lcyIsImZyb21Ub3AiLCJuYW1lZENvdW50IiwibGVuZ3RoIiwicG9zaXRpb25hbENvdW50Iiwic3RhcnQiLCJhdCIsInBvcyIsImdldCIsIm5hbWUiLCJjYXB0dXJlIiwidGFnIiwiY2xlYXIiLCJwb3AiLCJfdGFnIiwiX3JlZmVyZW5jZXMiLCJwb3NpdGlvbiIsIkNhcHR1cmVkUG9zaXRpb25hbEFyZ3VtZW50cyIsInJlZmVyZW5jZXMiLCJBcnJheSIsImkiLCJ2YWx1ZSIsIm1hcCIsInZhbHVlT2YiLCJjcmVhdGUiLCJpZHgiLCJwYXJzZUludCIsInJlZmVyZW5jZSIsIl9uYW1lcyIsIl9yZWFsTmFtZXMiLCJoYXMiLCJpbmRleE9mIiwiQ2FwdHVyZWROYW1lZEFyZ3VtZW50cyIsInNsaWNlTmFtZSIsInNsaWNlIiwiX21hcCIsIm91dCJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLFNBQVNBLElBQVQsRUFBZUMsV0FBZixRQUFrQyxlQUFsQztBQUNBLFNBQVNDLGFBQVQsUUFBOEIsb0JBQTlCO0FBQ0EsU0FBU0Msa0JBQVQsRUFBNkJDLG1CQUE3QixRQUF3RCxlQUF4RDtBQUNBLFdBQWFDLFNBQWI7QUFDSSx5QkFBYztBQUFBOztBQUNWLGFBQUtDLEtBQUwsR0FBYSxJQUFiO0FBQ0EsYUFBS0MsVUFBTCxHQUFrQixJQUFJQyxtQkFBSixFQUFsQjtBQUNBLGFBQUtDLEtBQUwsR0FBYSxJQUFJQyxjQUFKLEVBQWI7QUFDSDs7QUFMTCx3QkFNSUMsS0FOSixvQkFN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V0FBV08sR0FBWCxDQUFQO0FBQ0g7QUFDSixLOztxQ0FDREosSyxvQkFBUTtBQUFBLFlBQ0VyQixLQURGLEdBQ3dCLElBRHhCLENBQ0VBLEtBREY7QUFBQSxZQUNTa0IsVUFEVCxHQUN3QixJQUR4QixDQUNTQSxVQURUOztBQUVKLFlBQUlrQixNQUFNbEQsTUFBVjtBQUNBLGFBQUssSUFBSWtDLElBQUksQ0FBYixFQUFnQkEsSUFBSXBCLE1BQU1HLE1BQTFCLEVBQWtDaUIsR0FBbEMsRUFBdUM7QUFDbkMsZ0JBQUlYLE9BQU9ULE1BQU1vQixDQUFOLENBQVg7QUFDQWdCLGdCQUFJM0IsSUFBSixJQUFZUyxXQUFXRSxDQUFYLEVBQWNDLEtBQWQsRUFBWjtBQUNIO0FBQ0QsZUFBT2UsR0FBUDtBQUNILEs7Ozs7eUJBaENTO0FBQ04sZ0JBQUlkLE1BQU0sS0FBS2EsSUFBZjtBQUNBLGdCQUFJLENBQUNiLEdBQUwsRUFBVTtBQUFBLG9CQUNBdEIsS0FEQSxHQUNzQixJQUR0QixDQUNBQSxLQURBO0FBQUEsb0JBQ09rQixVQURQLEdBQ3NCLElBRHRCLENBQ09BLFVBRFA7O0FBRU5JLHNCQUFNLEtBQUthLElBQUwsR0FBWWpELE1BQWxCO0FBQ0EscUJBQUssSUFBSWtDLElBQUksQ0FBYixFQUFnQkEsSUFBSXBCLE1BQU1HLE1BQTFCLEVBQWtDaUIsR0FBbEMsRUFBdUM7QUFDbkMsd0JBQUlYLE9BQU9ULE1BQU1vQixDQUFOLENBQVg7QUFDQUUsd0JBQUliLElBQUosSUFBWVMsV0FBV0UsQ0FBWCxDQUFaO0FBQ0g7QUFDSjtBQUNELG1CQUFPRSxHQUFQO0FBQ0g7Ozs7OztBQXVCTCxlQUFlLElBQUkvQixTQUFKLEVBQWYiLCJmaWxlIjoibGliL3ZtL2FyZ3VtZW50cy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRpY3QsIEVNUFRZX0FSUkFZIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBjb21iaW5lVGFnZ2VkIH0gZnJvbSAnQGdsaW1tZXIvcmVmZXJlbmNlJztcbmltcG9ydCB7IFByaW1pdGl2ZVJlZmVyZW5jZSwgVU5ERUZJTkVEX1JFRkVSRU5DRSB9IGZyb20gJy4uL3JlZmVyZW5jZXMnO1xuZXhwb3J0IGNsYXNzIEFyZ3VtZW50cyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc3RhY2sgPSBudWxsO1xuICAgICAgICB0aGlzLnBvc2l0aW9uYWwgPSBuZXcgUG9zaXRpb25hbEFyZ3VtZW50cygpO1xuICAgICAgICB0aGlzLm5hbWVkID0gbmV3IE5hbWVkQXJndW1lbnRzKCk7XG4gICAgfVxuICAgIGVtcHR5KCkge1xuICAgICAgICB0aGlzLnNldHVwKG51bGwsIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc2V0dXAoc3RhY2ssIHN5bnRoZXRpYykge1xuICAgICAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgICAgIGxldCBuYW1lcyA9IHN0YWNrLmZyb21Ub3AoMCk7XG4gICAgICAgIGxldCBuYW1lZENvdW50ID0gbmFtZXMubGVuZ3RoO1xuICAgICAgICBsZXQgcG9zaXRpb25hbENvdW50ID0gc3RhY2suZnJvbVRvcChuYW1lZENvdW50ICsgMSk7XG4gICAgICAgIGxldCBzdGFydCA9IHBvc2l0aW9uYWxDb3VudCArIG5hbWVkQ291bnQgKyAyO1xuICAgICAgICBsZXQgcG9zaXRpb25hbCA9IHRoaXMucG9zaXRpb25hbDtcbiAgICAgICAgcG9zaXRpb25hbC5zZXR1cChzdGFjaywgc3RhcnQsIHBvc2l0aW9uYWxDb3VudCk7XG4gICAgICAgIGxldCBuYW1lZCA9IHRoaXMubmFtZWQ7XG4gICAgICAgIG5hbWVkLnNldHVwKHN0YWNrLCBuYW1lZENvdW50LCBuYW1lcywgc3ludGhldGljKTtcbiAgICB9XG4gICAgZ2V0IHRhZygpIHtcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVUYWdnZWQoW3RoaXMucG9zaXRpb25hbCwgdGhpcy5uYW1lZF0pO1xuICAgIH1cbiAgICBnZXQgbGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbmFsLmxlbmd0aCArIHRoaXMubmFtZWQubGVuZ3RoO1xuICAgIH1cbiAgICBhdChwb3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb25hbC5hdChwb3MpO1xuICAgIH1cbiAgICBnZXQobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lZC5nZXQobmFtZSk7XG4gICAgfVxuICAgIGNhcHR1cmUoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0YWc6IHRoaXMudGFnLFxuICAgICAgICAgICAgbGVuZ3RoOiB0aGlzLmxlbmd0aCxcbiAgICAgICAgICAgIHBvc2l0aW9uYWw6IHRoaXMucG9zaXRpb25hbC5jYXB0dXJlKCksXG4gICAgICAgICAgICBuYW1lZDogdGhpcy5uYW1lZC5jYXB0dXJlKClcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIGxldCB7IHN0YWNrLCBsZW5ndGggfSA9IHRoaXM7XG4gICAgICAgIHN0YWNrLnBvcChsZW5ndGggKyAyKTtcbiAgICB9XG59XG5jbGFzcyBQb3NpdGlvbmFsQXJndW1lbnRzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLnN0YWNrID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdGFydCA9IDA7XG4gICAgICAgIHRoaXMuX3RhZyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JlZmVyZW5jZXMgPSBudWxsO1xuICAgIH1cbiAgICBzZXR1cChzdGFjaywgc3RhcnQsIGxlbmd0aCkge1xuICAgICAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIHRoaXMuX3RhZyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JlZmVyZW5jZXMgPSBudWxsO1xuICAgIH1cbiAgICBnZXQgdGFnKCkge1xuICAgICAgICBsZXQgdGFnID0gdGhpcy5fdGFnO1xuICAgICAgICBpZiAoIXRhZykge1xuICAgICAgICAgICAgdGFnID0gdGhpcy5fdGFnID0gY29tYmluZVRhZ2dlZCh0aGlzLnJlZmVyZW5jZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YWc7XG4gICAgfVxuICAgIGF0KHBvc2l0aW9uKSB7XG4gICAgICAgIGxldCB7IHN0YXJ0LCBsZW5ndGggfSA9IHRoaXM7XG4gICAgICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gVU5ERUZJTkVEX1JFRkVSRU5DRTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzdGFjazogcG9zMSwgcG9zMiwgcG9zMywgbmFtZWQxLCBuYW1lZDJcbiAgICAgICAgLy8gc3RhcnQ6IDQgKHRvcCAtIDQpXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGF0KDApID09PSBwb3MxID09PSB0b3AgLSBzdGFydFxuICAgICAgICAvLyBhdCgxKSA9PT0gcG9zMiA9PT0gdG9wIC0gKHN0YXJ0IC0gMSlcbiAgICAgICAgLy8gYXQoMikgPT09IHBvczMgPT09IHRvcCAtIChzdGFydCAtIDIpXG4gICAgICAgIGxldCBmcm9tVG9wID0gc3RhcnQgLSBwb3NpdGlvbiAtIDE7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YWNrLmZyb21Ub3AoZnJvbVRvcCk7XG4gICAgfVxuICAgIGNhcHR1cmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2FwdHVyZWRQb3NpdGlvbmFsQXJndW1lbnRzKHRoaXMudGFnLCB0aGlzLnJlZmVyZW5jZXMpO1xuICAgIH1cbiAgICBnZXQgcmVmZXJlbmNlcygpIHtcbiAgICAgICAgbGV0IHJlZmVyZW5jZXMgPSB0aGlzLl9yZWZlcmVuY2VzO1xuICAgICAgICBpZiAoIXJlZmVyZW5jZXMpIHtcbiAgICAgICAgICAgIGxldCB7IGxlbmd0aCB9ID0gdGhpcztcbiAgICAgICAgICAgIHJlZmVyZW5jZXMgPSB0aGlzLl9yZWZlcmVuY2VzID0gbmV3IEFycmF5KGxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlc1tpXSA9IHRoaXMuYXQoaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZmVyZW5jZXM7XG4gICAgfVxufVxuY2xhc3MgQ2FwdHVyZWRQb3NpdGlvbmFsQXJndW1lbnRzIHtcbiAgICBjb25zdHJ1Y3Rvcih0YWcsIHJlZmVyZW5jZXMsIGxlbmd0aCA9IHJlZmVyZW5jZXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMudGFnID0gdGFnO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZXMgPSByZWZlcmVuY2VzO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICB9XG4gICAgYXQocG9zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmZXJlbmNlc1twb3NpdGlvbl07XG4gICAgfVxuICAgIHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2VzLm1hcCh0aGlzLnZhbHVlT2YpO1xuICAgIH1cbiAgICBnZXQobmFtZSkge1xuICAgICAgICBsZXQgeyByZWZlcmVuY2VzLCBsZW5ndGggfSA9IHRoaXM7XG4gICAgICAgIGlmIChuYW1lID09PSAnbGVuZ3RoJykge1xuICAgICAgICAgICAgcmV0dXJuIFByaW1pdGl2ZVJlZmVyZW5jZS5jcmVhdGUobGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBpZHggPSBwYXJzZUludChuYW1lLCAxMCk7XG4gICAgICAgICAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFVOREVGSU5FRF9SRUZFUkVOQ0U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VzW2lkeF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFsdWVPZihyZWZlcmVuY2UpIHtcbiAgICAgICAgcmV0dXJuIHJlZmVyZW5jZS52YWx1ZSgpO1xuICAgIH1cbn1cbmNsYXNzIE5hbWVkQXJndW1lbnRzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLl90YWcgPSBudWxsO1xuICAgICAgICB0aGlzLl9yZWZlcmVuY2VzID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbmFtZXMgPSBudWxsO1xuICAgICAgICB0aGlzLl9yZWFsTmFtZXMgPSBFTVBUWV9BUlJBWTtcbiAgICB9XG4gICAgc2V0dXAoc3RhY2ssIGxlbmd0aCwgbmFtZXMsIHN5bnRoZXRpYykge1xuICAgICAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB0aGlzLl90YWcgPSBudWxsO1xuICAgICAgICB0aGlzLl9yZWZlcmVuY2VzID0gbnVsbDtcbiAgICAgICAgaWYgKHN5bnRoZXRpYykge1xuICAgICAgICAgICAgdGhpcy5fbmFtZXMgPSBuYW1lcztcbiAgICAgICAgICAgIHRoaXMuX3JlYWxOYW1lcyA9IEVNUFRZX0FSUkFZO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbmFtZXMgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fcmVhbE5hbWVzID0gbmFtZXM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHRhZygpIHtcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVUYWdnZWQodGhpcy5yZWZlcmVuY2VzKTtcbiAgICB9XG4gICAgZ2V0IG5hbWVzKCkge1xuICAgICAgICBsZXQgbmFtZXMgPSB0aGlzLl9uYW1lcztcbiAgICAgICAgaWYgKCFuYW1lcykge1xuICAgICAgICAgICAgbmFtZXMgPSB0aGlzLl9uYW1lcyA9IHRoaXMuX3JlYWxOYW1lcy5tYXAodGhpcy5zbGljZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuYW1lcztcbiAgICB9XG4gICAgaGFzKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZXMuaW5kZXhPZihuYW1lKSAhPT0gLTE7XG4gICAgfVxuICAgIGdldChuYW1lKSB7XG4gICAgICAgIGxldCB7IG5hbWVzLCBsZW5ndGggfSA9IHRoaXM7XG4gICAgICAgIGxldCBpZHggPSBuYW1lcy5pbmRleE9mKG5hbWUpO1xuICAgICAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIFVOREVGSU5FRF9SRUZFUkVOQ0U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc3RhY2s6IHBvczEsIHBvczIsIHBvczMsIG5hbWVkMSwgbmFtZWQyXG4gICAgICAgIC8vIHN0YXJ0OiA0ICh0b3AgLSA0KVxuICAgICAgICAvLyBuYW1lZERpY3Q6IHsgbmFtZWQxOiAxLCBuYW1lZDI6IDAgfTtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gZ2V0KCduYW1lZDEnKSA9PT0gbmFtZWQxID09PSB0b3AgLSAoc3RhcnQgLSAxKVxuICAgICAgICAvLyBnZXQoJ25hbWVkMicpID09PSBuYW1lZDIgPT09IHRvcCAtIHN0YXJ0XG4gICAgICAgIGxldCBmcm9tVG9wID0gbGVuZ3RoIC0gaWR4O1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFjay5mcm9tVG9wKGZyb21Ub3ApO1xuICAgIH1cbiAgICBjYXB0dXJlKCkge1xuICAgICAgICByZXR1cm4gbmV3IENhcHR1cmVkTmFtZWRBcmd1bWVudHModGhpcy50YWcsIHRoaXMubmFtZXMsIHRoaXMucmVmZXJlbmNlcyk7XG4gICAgfVxuICAgIGdldCByZWZlcmVuY2VzKCkge1xuICAgICAgICBsZXQgcmVmZXJlbmNlcyA9IHRoaXMuX3JlZmVyZW5jZXM7XG4gICAgICAgIGlmICghcmVmZXJlbmNlcykge1xuICAgICAgICAgICAgbGV0IHsgbmFtZXMsIGxlbmd0aCB9ID0gdGhpcztcbiAgICAgICAgICAgIHJlZmVyZW5jZXMgPSB0aGlzLl9yZWZlcmVuY2VzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlc1tpXSA9IHRoaXMuZ2V0KG5hbWVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVmZXJlbmNlcztcbiAgICB9XG4gICAgc2xpY2VOYW1lKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5hbWUuc2xpY2UoMSk7XG4gICAgfVxufVxuY2xhc3MgQ2FwdHVyZWROYW1lZEFyZ3VtZW50cyB7XG4gICAgY29uc3RydWN0b3IodGFnLCBuYW1lcywgcmVmZXJlbmNlcykge1xuICAgICAgICB0aGlzLnRhZyA9IHRhZztcbiAgICAgICAgdGhpcy5uYW1lcyA9IG5hbWVzO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZXMgPSByZWZlcmVuY2VzO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IG5hbWVzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5fbWFwID0gbnVsbDtcbiAgICB9XG4gICAgZ2V0IG1hcCgpIHtcbiAgICAgICAgbGV0IG1hcCA9IHRoaXMuX21hcDtcbiAgICAgICAgaWYgKCFtYXApIHtcbiAgICAgICAgICAgIGxldCB7IG5hbWVzLCByZWZlcmVuY2VzIH0gPSB0aGlzO1xuICAgICAgICAgICAgbWFwID0gdGhpcy5fbWFwID0gZGljdCgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBuYW1lID0gbmFtZXNbaV07XG4gICAgICAgICAgICAgICAgbWFwW25hbWVdID0gcmVmZXJlbmNlc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH1cbiAgICBoYXMobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lcy5pbmRleE9mKG5hbWUpICE9PSAtMTtcbiAgICB9XG4gICAgZ2V0KG5hbWUpIHtcbiAgICAgICAgbGV0IHsgbmFtZXMsIHJlZmVyZW5jZXMgfSA9IHRoaXM7XG4gICAgICAgIGxldCBpZHggPSBuYW1lcy5pbmRleE9mKG5hbWUpO1xuICAgICAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIFVOREVGSU5FRF9SRUZFUkVOQ0U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlc1tpZHhdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhbHVlKCkge1xuICAgICAgICBsZXQgeyBuYW1lcywgcmVmZXJlbmNlcyB9ID0gdGhpcztcbiAgICAgICAgbGV0IG91dCA9IGRpY3QoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG5hbWUgPSBuYW1lc1tpXTtcbiAgICAgICAgICAgIG91dFtuYW1lXSA9IHJlZmVyZW5jZXNbaV0udmFsdWUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IG5ldyBBcmd1bWVudHMoKTsiXX0=