ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
384 lines (313 loc) • 31.6 kB
JavaScript
function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
export var CONSTANT = 0;
export var INITIAL = 1;
export var VOLATILE = NaN;
export var RevisionTag = function () {
function RevisionTag() {
_classCallCheck(this, RevisionTag);
}
RevisionTag.prototype.validate = function validate(snapshot) {
return this.value() === snapshot;
};
return RevisionTag;
}();
RevisionTag.id = 0;
var VALUE = [];
var VALIDATE = [];
export var TagWrapper = function () {
function TagWrapper(type, inner) {
_classCallCheck(this, TagWrapper);
this.type = type;
this.inner = inner;
}
TagWrapper.prototype.value = function value() {
var func = VALUE[this.type];
return func(this.inner);
};
TagWrapper.prototype.validate = function validate(snapshot) {
var func = VALIDATE[this.type];
return func(this.inner, snapshot);
};
return TagWrapper;
}();
function register(Type) {
var type = VALUE.length;
VALUE.push(function (tag) {
return tag.value();
});
VALIDATE.push(function (tag, snapshot) {
return tag.validate(snapshot);
});
Type.id = type;
}
///
// CONSTANT: 0
VALUE.push(function () {
return CONSTANT;
});
VALIDATE.push(function (_tag, snapshot) {
return snapshot === CONSTANT;
});
export var CONSTANT_TAG = new TagWrapper(0, null);
// VOLATILE: 1
VALUE.push(function () {
return VOLATILE;
});
VALIDATE.push(function (_tag, snapshot) {
return snapshot === VOLATILE;
});
export var VOLATILE_TAG = new TagWrapper(1, null);
// CURRENT: 2
VALUE.push(function () {
return $REVISION;
});
VALIDATE.push(function (_tag, snapshot) {
return snapshot === $REVISION;
});
export var CURRENT_TAG = new TagWrapper(2, null);
///
var $REVISION = INITIAL;
export var DirtyableTag = function (_RevisionTag) {
_inherits(DirtyableTag, _RevisionTag);
DirtyableTag.create = function create() {
var revision = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $REVISION;
return new TagWrapper(this.id, new DirtyableTag(revision));
};
function DirtyableTag() {
var revision = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $REVISION;
_classCallCheck(this, DirtyableTag);
var _this = _possibleConstructorReturn(this, _RevisionTag.call(this));
_this.revision = revision;
return _this;
}
DirtyableTag.prototype.value = function value() {
return this.revision;
};
DirtyableTag.prototype.dirty = function dirty() {
this.revision = ++$REVISION;
};
return DirtyableTag;
}(RevisionTag);
register(DirtyableTag);
export function combineTagged(tagged) {
var optimized = [];
for (var i = 0, l = tagged.length; i < l; i++) {
var tag = tagged[i].tag;
if (tag === VOLATILE_TAG) return VOLATILE_TAG;
if (tag === CONSTANT_TAG) continue;
optimized.push(tag);
}
return _combine(optimized);
}
export function combineSlice(slice) {
var optimized = [];
var node = slice.head();
while (node !== null) {
var tag = node.tag;
if (tag === VOLATILE_TAG) return VOLATILE_TAG;
if (tag !== CONSTANT_TAG) optimized.push(tag);
node = slice.nextNode(node);
}
return _combine(optimized);
}
export function combine(tags) {
var optimized = [];
for (var i = 0, l = tags.length; i < l; i++) {
var tag = tags[i];
if (tag === VOLATILE_TAG) return VOLATILE_TAG;
if (tag === CONSTANT_TAG) continue;
optimized.push(tag);
}
return _combine(optimized);
}
function _combine(tags) {
switch (tags.length) {
case 0:
return CONSTANT_TAG;
case 1:
return tags[0];
case 2:
return TagsPair.create(tags[0], tags[1]);
default:
return TagsCombinator.create(tags);
}
;
}
export var CachedTag = function (_RevisionTag2) {
_inherits(CachedTag, _RevisionTag2);
function CachedTag() {
_classCallCheck(this, CachedTag);
var _this2 = _possibleConstructorReturn(this, _RevisionTag2.apply(this, arguments));
_this2.lastChecked = null;
_this2.lastValue = null;
return _this2;
}
CachedTag.prototype.value = function value() {
var lastChecked = this.lastChecked,
lastValue = this.lastValue;
if (lastChecked !== $REVISION) {
this.lastChecked = $REVISION;
this.lastValue = lastValue = this.compute();
}
return this.lastValue;
};
CachedTag.prototype.invalidate = function invalidate() {
this.lastChecked = null;
};
return CachedTag;
}(RevisionTag);
var TagsPair = function (_CachedTag) {
_inherits(TagsPair, _CachedTag);
TagsPair.create = function create(first, second) {
return new TagWrapper(this.id, new TagsPair(first, second));
};
function TagsPair(first, second) {
_classCallCheck(this, TagsPair);
var _this3 = _possibleConstructorReturn(this, _CachedTag.call(this));
_this3.first = first;
_this3.second = second;
return _this3;
}
TagsPair.prototype.compute = function compute() {
return Math.max(this.first.value(), this.second.value());
};
return TagsPair;
}(CachedTag);
register(TagsPair);
var TagsCombinator = function (_CachedTag2) {
_inherits(TagsCombinator, _CachedTag2);
TagsCombinator.create = function create(tags) {
return new TagWrapper(this.id, new TagsCombinator(tags));
};
function TagsCombinator(tags) {
_classCallCheck(this, TagsCombinator);
var _this4 = _possibleConstructorReturn(this, _CachedTag2.call(this));
_this4.tags = tags;
return _this4;
}
TagsCombinator.prototype.compute = function compute() {
var tags = this.tags;
var max = -1;
for (var i = 0; i < tags.length; i++) {
var value = tags[i].value();
max = Math.max(value, max);
}
return max;
};
return TagsCombinator;
}(CachedTag);
register(TagsCombinator);
export var UpdatableTag = function (_CachedTag3) {
_inherits(UpdatableTag, _CachedTag3);
UpdatableTag.create = function create(tag) {
return new TagWrapper(this.id, new UpdatableTag(tag));
};
function UpdatableTag(tag) {
_classCallCheck(this, UpdatableTag);
var _this5 = _possibleConstructorReturn(this, _CachedTag3.call(this));
_this5.tag = tag;
_this5.lastUpdated = INITIAL;
return _this5;
}
UpdatableTag.prototype.compute = function compute() {
return Math.max(this.lastUpdated, this.tag.value());
};
UpdatableTag.prototype.update = function update(tag) {
if (tag !== this.tag) {
this.tag = tag;
this.lastUpdated = $REVISION;
this.invalidate();
}
};
return UpdatableTag;
}(CachedTag);
register(UpdatableTag);
export var CachedReference = function () {
function CachedReference() {
_classCallCheck(this, CachedReference);
this.lastRevision = null;
this.lastValue = null;
}
CachedReference.prototype.value = function value() {
var tag = this.tag,
lastRevision = this.lastRevision,
lastValue = this.lastValue;
if (!lastRevision || !tag.validate(lastRevision)) {
lastValue = this.lastValue = this.compute();
this.lastRevision = tag.value();
}
return lastValue;
};
CachedReference.prototype.invalidate = function invalidate() {
this.lastRevision = null;
};
return CachedReference;
}();
var MapperReference = function (_CachedReference) {
_inherits(MapperReference, _CachedReference);
function MapperReference(reference, mapper) {
_classCallCheck(this, MapperReference);
var _this6 = _possibleConstructorReturn(this, _CachedReference.call(this));
_this6.tag = reference.tag;
_this6.reference = reference;
_this6.mapper = mapper;
return _this6;
}
MapperReference.prototype.compute = function compute() {
var reference = this.reference,
mapper = this.mapper;
return mapper(reference.value());
};
return MapperReference;
}(CachedReference);
export function map(reference, mapper) {
return new MapperReference(reference, mapper);
}
//////////
export var ReferenceCache = function () {
function ReferenceCache(reference) {
_classCallCheck(this, ReferenceCache);
this.lastValue = null;
this.lastRevision = null;
this.initialized = false;
this.tag = reference.tag;
this.reference = reference;
}
ReferenceCache.prototype.peek = function peek() {
if (!this.initialized) {
return this.initialize();
}
return this.lastValue;
};
ReferenceCache.prototype.revalidate = function revalidate() {
if (!this.initialized) {
return this.initialize();
}
var reference = this.reference,
lastRevision = this.lastRevision;
var tag = reference.tag;
if (tag.validate(lastRevision)) return NOT_MODIFIED;
this.lastRevision = tag.value();
var lastValue = this.lastValue;
var value = reference.value();
if (value === lastValue) return NOT_MODIFIED;
this.lastValue = value;
return value;
};
ReferenceCache.prototype.initialize = function initialize() {
var reference = this.reference;
var value = this.lastValue = reference.value();
this.lastRevision = reference.tag.value();
this.initialized = true;
return value;
};
return ReferenceCache;
}();
var NOT_MODIFIED = "adb3b78e-3d22-4e4b-877a-6317c2c5c145";
export function isModified(value) {
return value !== NOT_MODIFIED;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi92YWxpZGF0b3JzLmpzIl0sIm5hbWVzIjpbIkNPTlNUQU5UIiwiSU5JVElBTCIsIlZPTEFUSUxFIiwiTmFOIiwiUmV2aXNpb25UYWciLCJ2YWxpZGF0ZSIsInNuYXBzaG90IiwidmFsdWUiLCJpZCIsIlZBTFVFIiwiVkFMSURBVEUiLCJUYWdXcmFwcGVyIiwidHlwZSIsImlubmVyIiwiZnVuYyIsInJlZ2lzdGVyIiwiVHlwZSIsImxlbmd0aCIsInB1c2giLCJ0YWciLCJfdGFnIiwiQ09OU1RBTlRfVEFHIiwiVk9MQVRJTEVfVEFHIiwiJFJFVklTSU9OIiwiQ1VSUkVOVF9UQUciLCJEaXJ0eWFibGVUYWciLCJjcmVhdGUiLCJyZXZpc2lvbiIsImRpcnR5IiwiY29tYmluZVRhZ2dlZCIsInRhZ2dlZCIsIm9wdGltaXplZCIsImkiLCJsIiwiX2NvbWJpbmUiLCJjb21iaW5lU2xpY2UiLCJzbGljZSIsIm5vZGUiLCJoZWFkIiwibmV4dE5vZGUiLCJjb21iaW5lIiwidGFncyIsIlRhZ3NQYWlyIiwiVGFnc0NvbWJpbmF0b3IiLCJDYWNoZWRUYWciLCJhcmd1bWVudHMiLCJsYXN0Q2hlY2tlZCIsImxhc3RWYWx1ZSIsImNvbXB1dGUiLCJpbnZhbGlkYXRlIiwiZmlyc3QiLCJzZWNvbmQiLCJNYXRoIiwibWF4IiwiVXBkYXRhYmxlVGFnIiwibGFzdFVwZGF0ZWQiLCJ1cGRhdGUiLCJDYWNoZWRSZWZlcmVuY2UiLCJsYXN0UmV2aXNpb24iLCJNYXBwZXJSZWZlcmVuY2UiLCJyZWZlcmVuY2UiLCJtYXBwZXIiLCJtYXAiLCJSZWZlcmVuY2VDYWNoZSIsImluaXRpYWxpemVkIiwicGVlayIsImluaXRpYWxpemUiLCJyZXZhbGlkYXRlIiwiTk9UX01PRElGSUVEIiwiaXNNb2RpZmllZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxPQUFPLElBQU1BLFdBQVcsQ0FBakI7QUFDUCxPQUFPLElBQU1DLFVBQVUsQ0FBaEI7QUFDUCxPQUFPLElBQU1DLFdBQVdDLEdB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b0I5RCxLQUFwQixFQUEyQjtBQUM5QixXQUFPQSxVQUFVNkQsWUFBakI7QUFDSCIsImZpbGUiOiJsaWIvdmFsaWRhdG9ycy5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBDT05TVEFOVCA9IDA7XG5leHBvcnQgY29uc3QgSU5JVElBTCA9IDE7XG5leHBvcnQgY29uc3QgVk9MQVRJTEUgPSBOYU47XG5leHBvcnQgY2xhc3MgUmV2aXNpb25UYWcge1xuICAgIHZhbGlkYXRlKHNuYXBzaG90KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlKCkgPT09IHNuYXBzaG90O1xuICAgIH1cbn1cblJldmlzaW9uVGFnLmlkID0gMDtcbmNvbnN0IFZBTFVFID0gW107XG5jb25zdCBWQUxJREFURSA9IFtdO1xuZXhwb3J0IGNsYXNzIFRhZ1dyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHR5cGUsIGlubmVyKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuaW5uZXIgPSBpbm5lcjtcbiAgICB9XG4gICAgdmFsdWUoKSB7XG4gICAgICAgIGxldCBmdW5jID0gVkFMVUVbdGhpcy50eXBlXTtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcy5pbm5lcik7XG4gICAgfVxuICAgIHZhbGlkYXRlKHNuYXBzaG90KSB7XG4gICAgICAgIGxldCBmdW5jID0gVkFMSURBVEVbdGhpcy50eXBlXTtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcy5pbm5lciwgc25hcHNob3QpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlZ2lzdGVyKFR5cGUpIHtcbiAgICBsZXQgdHlwZSA9IFZBTFVFLmxlbmd0aDtcbiAgICBWQUxVRS5wdXNoKHRhZyA9PiB0YWcudmFsdWUoKSk7XG4gICAgVkFMSURBVEUucHVzaCgodGFnLCBzbmFwc2hvdCkgPT4gdGFnLnZhbGlkYXRlKHNuYXBzaG90KSk7XG4gICAgVHlwZS5pZCA9IHR5cGU7XG59XG4vLy9cbi8vIENPTlNUQU5UOiAwXG5WQUxVRS5wdXNoKCgpID0+IENPTlNUQU5UKTtcblZBTElEQVRFLnB1c2goKF90YWcsIHNuYXBzaG90KSA9PiBzbmFwc2hvdCA9PT0gQ09OU1RBTlQpO1xuZXhwb3J0IGNvbnN0IENPTlNUQU5UX1RBRyA9IG5ldyBUYWdXcmFwcGVyKDAsIG51bGwpO1xuLy8gVk9MQVRJTEU6IDFcblZBTFVFLnB1c2goKCkgPT4gVk9MQVRJTEUpO1xuVkFMSURBVEUucHVzaCgoX3RhZywgc25hcHNob3QpID0+IHNuYXBzaG90ID09PSBWT0xBVElMRSk7XG5leHBvcnQgY29uc3QgVk9MQVRJTEVfVEFHID0gbmV3IFRhZ1dyYXBwZXIoMSwgbnVsbCk7XG4vLyBDVVJSRU5UOiAyXG5WQUxVRS5wdXNoKCgpID0+ICRSRVZJU0lPTik7XG5WQUxJREFURS5wdXNoKChfdGFnLCBzbmFwc2hvdCkgPT4gc25hcHNob3QgPT09ICRSRVZJU0lPTik7XG5leHBvcnQgY29uc3QgQ1VSUkVOVF9UQUcgPSBuZXcgVGFnV3JhcHBlcigyLCBudWxsKTtcbi8vL1xubGV0ICRSRVZJU0lPTiA9IElOSVRJQUw7XG5leHBvcnQgY2xhc3MgRGlydHlhYmxlVGFnIGV4dGVuZHMgUmV2aXNpb25UYWcge1xuICAgIHN0YXRpYyBjcmVhdGUocmV2aXNpb24gPSAkUkVWSVNJT04pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWdXcmFwcGVyKHRoaXMuaWQsIG5ldyBEaXJ0eWFibGVUYWcocmV2aXNpb24pKTtcbiAgICB9XG4gICAgY29uc3RydWN0b3IocmV2aXNpb24gPSAkUkVWSVNJT04pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZXZpc2lvbiA9IHJldmlzaW9uO1xuICAgIH1cbiAgICB2YWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV2aXNpb247XG4gICAgfVxuICAgIGRpcnR5KCkge1xuICAgICAgICB0aGlzLnJldmlzaW9uID0gKyskUkVWSVNJT047XG4gICAgfVxufVxucmVnaXN0ZXIoRGlydHlhYmxlVGFnKTtcbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lVGFnZ2VkKHRhZ2dlZCkge1xuICAgIGxldCBvcHRpbWl6ZWQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRhZ2dlZC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgbGV0IHRhZyA9IHRhZ2dlZFtpXS50YWc7XG4gICAgICAgIGlmICh0YWcgPT09IFZPTEFUSUxFX1RBRykgcmV0dXJuIFZPTEFUSUxFX1RBRztcbiAgICAgICAgaWYgKHRhZyA9PT0gQ09OU1RBTlRfVEFHKSBjb250aW51ZTtcbiAgICAgICAgb3B0aW1pemVkLnB1c2godGFnKTtcbiAgICB9XG4gICAgcmV0dXJuIF9jb21iaW5lKG9wdGltaXplZCk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tYmluZVNsaWNlKHNsaWNlKSB7XG4gICAgbGV0IG9wdGltaXplZCA9IFtdO1xuICAgIGxldCBub2RlID0gc2xpY2UuaGVhZCgpO1xuICAgIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgICAgIGxldCB0YWcgPSBub2RlLnRhZztcbiAgICAgICAgaWYgKHRhZyA9PT0gVk9MQVRJTEVfVEFHKSByZXR1cm4gVk9MQVRJTEVfVEFHO1xuICAgICAgICBpZiAodGFnICE9PSBDT05TVEFOVF9UQUcpIG9wdGltaXplZC5wdXNoKHRhZyk7XG4gICAgICAgIG5vZGUgPSBzbGljZS5uZXh0Tm9kZShub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIF9jb21iaW5lKG9wdGltaXplZCk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tYmluZSh0YWdzKSB7XG4gICAgbGV0IG9wdGltaXplZCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGFncy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgbGV0IHRhZyA9IHRhZ3NbaV07XG4gICAgICAgIGlmICh0YWcgPT09IFZPTEFUSUxFX1RBRykgcmV0dXJuIFZPTEFUSUxFX1RBRztcbiAgICAgICAgaWYgKHRhZyA9PT0gQ09OU1RBTlRfVEFHKSBjb250aW51ZTtcbiAgICAgICAgb3B0aW1pemVkLnB1c2godGFnKTtcbiAgICB9XG4gICAgcmV0dXJuIF9jb21iaW5lKG9wdGltaXplZCk7XG59XG5mdW5jdGlvbiBfY29tYmluZSh0YWdzKSB7XG4gICAgc3dpdGNoICh0YWdzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICByZXR1cm4gQ09OU1RBTlRfVEFHO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICByZXR1cm4gdGFnc1swXTtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgcmV0dXJuIFRhZ3NQYWlyLmNyZWF0ZSh0YWdzWzBdLCB0YWdzWzFdKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBUYWdzQ29tYmluYXRvci5jcmVhdGUodGFncyk7XG4gICAgfVxuICAgIDtcbn1cbmV4cG9ydCBjbGFzcyBDYWNoZWRUYWcgZXh0ZW5kcyBSZXZpc2lvblRhZyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubGFzdENoZWNrZWQgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RWYWx1ZSA9IG51bGw7XG4gICAgfVxuICAgIHZhbHVlKCkge1xuICAgICAgICBsZXQgeyBsYXN0Q2hlY2tlZCwgbGFzdFZhbHVlIH0gPSB0aGlzO1xuICAgICAgICBpZiAobGFzdENoZWNrZWQgIT09ICRSRVZJU0lPTikge1xuICAgICAgICAgICAgdGhpcy5sYXN0Q2hlY2tlZCA9ICRSRVZJU0lPTjtcbiAgICAgICAgICAgIHRoaXMubGFzdFZhbHVlID0gbGFzdFZhbHVlID0gdGhpcy5jb21wdXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubGFzdFZhbHVlO1xuICAgIH1cbiAgICBpbnZhbGlkYXRlKCkge1xuICAgICAgICB0aGlzLmxhc3RDaGVja2VkID0gbnVsbDtcbiAgICB9XG59XG5jbGFzcyBUYWdzUGFpciBleHRlbmRzIENhY2hlZFRhZyB7XG4gICAgc3RhdGljIGNyZWF0ZShmaXJzdCwgc2Vjb25kKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFnV3JhcHBlcih0aGlzLmlkLCBuZXcgVGFnc1BhaXIoZmlyc3QsIHNlY29uZCkpO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihmaXJzdCwgc2Vjb25kKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZmlyc3QgPSBmaXJzdDtcbiAgICAgICAgdGhpcy5zZWNvbmQgPSBzZWNvbmQ7XG4gICAgfVxuICAgIGNvbXB1dGUoKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLmZpcnN0LnZhbHVlKCksIHRoaXMuc2Vjb25kLnZhbHVlKCkpO1xuICAgIH1cbn1cbnJlZ2lzdGVyKFRhZ3NQYWlyKTtcbmNsYXNzIFRhZ3NDb21iaW5hdG9yIGV4dGVuZHMgQ2FjaGVkVGFnIHtcbiAgICBzdGF0aWMgY3JlYXRlKHRhZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWdXcmFwcGVyKHRoaXMuaWQsIG5ldyBUYWdzQ29tYmluYXRvcih0YWdzKSk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHRhZ3MpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50YWdzID0gdGFncztcbiAgICB9XG4gICAgY29tcHV0ZSgpIHtcbiAgICAgICAgbGV0IHsgdGFncyB9ID0gdGhpcztcbiAgICAgICAgbGV0IG1heCA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRhZ3NbaV0udmFsdWUoKTtcbiAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KHZhbHVlLCBtYXgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXg7XG4gICAgfVxufVxucmVnaXN0ZXIoVGFnc0NvbWJpbmF0b3IpO1xuZXhwb3J0IGNsYXNzIFVwZGF0YWJsZVRhZyBleHRlbmRzIENhY2hlZFRhZyB7XG4gICAgc3RhdGljIGNyZWF0ZSh0YWcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWdXcmFwcGVyKHRoaXMuaWQsIG5ldyBVcGRhdGFibGVUYWcodGFnKSk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHRhZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRhZyA9IHRhZztcbiAgICAgICAgdGhpcy5sYXN0VXBkYXRlZCA9IElOSVRJQUw7XG4gICAgfVxuICAgIGNvbXB1dGUoKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLmxhc3RVcGRhdGVkLCB0aGlzLnRhZy52YWx1ZSgpKTtcbiAgICB9XG4gICAgdXBkYXRlKHRhZykge1xuICAgICAgICBpZiAodGFnICE9PSB0aGlzLnRhZykge1xuICAgICAgICAgICAgdGhpcy50YWcgPSB0YWc7XG4gICAgICAgICAgICB0aGlzLmxhc3RVcGRhdGVkID0gJFJFVklTSU9OO1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5yZWdpc3RlcihVcGRhdGFibGVUYWcpO1xuZXhwb3J0IGNsYXNzIENhY2hlZFJlZmVyZW5jZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubGFzdFJldmlzaW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0VmFsdWUgPSBudWxsO1xuICAgIH1cbiAgICB2YWx1ZSgpIHtcbiAgICAgICAgbGV0IHsgdGFnLCBsYXN0UmV2aXNpb24sIGxhc3RWYWx1ZSB9ID0gdGhpcztcbiAgICAgICAgaWYgKCFsYXN0UmV2aXNpb24gfHwgIXRhZy52YWxpZGF0ZShsYXN0UmV2aXNpb24pKSB7XG4gICAgICAgICAgICBsYXN0VmFsdWUgPSB0aGlzLmxhc3RWYWx1ZSA9IHRoaXMuY29tcHV0ZSgpO1xuICAgICAgICAgICAgdGhpcy5sYXN0UmV2aXNpb24gPSB0YWcudmFsdWUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGFzdFZhbHVlO1xuICAgIH1cbiAgICBpbnZhbGlkYXRlKCkge1xuICAgICAgICB0aGlzLmxhc3RSZXZpc2lvbiA9IG51bGw7XG4gICAgfVxufVxuY2xhc3MgTWFwcGVyUmVmZXJlbmNlIGV4dGVuZHMgQ2FjaGVkUmVmZXJlbmNlIHtcbiAgICBjb25zdHJ1Y3RvcihyZWZlcmVuY2UsIG1hcHBlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRhZyA9IHJlZmVyZW5jZS50YWc7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlID0gcmVmZXJlbmNlO1xuICAgICAgICB0aGlzLm1hcHBlciA9IG1hcHBlcjtcbiAgICB9XG4gICAgY29tcHV0ZSgpIHtcbiAgICAgICAgbGV0IHsgcmVmZXJlbmNlLCBtYXBwZXIgfSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBtYXBwZXIocmVmZXJlbmNlLnZhbHVlKCkpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBtYXAocmVmZXJlbmNlLCBtYXBwZXIpIHtcbiAgICByZXR1cm4gbmV3IE1hcHBlclJlZmVyZW5jZShyZWZlcmVuY2UsIG1hcHBlcik7XG59XG4vLy8vLy8vLy8vXG5leHBvcnQgY2xhc3MgUmVmZXJlbmNlQ2FjaGUge1xuICAgIGNvbnN0cnVjdG9yKHJlZmVyZW5jZSkge1xuICAgICAgICB0aGlzLmxhc3RWYWx1ZSA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdFJldmlzaW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRhZyA9IHJlZmVyZW5jZS50YWc7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlID0gcmVmZXJlbmNlO1xuICAgIH1cbiAgICBwZWVrKCkge1xuICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxpemUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sYXN0VmFsdWU7XG4gICAgfVxuICAgIHJldmFsaWRhdGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCB7IHJlZmVyZW5jZSwgbGFzdFJldmlzaW9uIH0gPSB0aGlzO1xuICAgICAgICBsZXQgdGFnID0gcmVmZXJlbmNlLnRhZztcbiAgICAgICAgaWYgKHRhZy52YWxpZGF0ZShsYXN0UmV2aXNpb24pKSByZXR1cm4gTk9UX01PRElGSUVEO1xuICAgICAgICB0aGlzLmxhc3RSZXZpc2lvbiA9IHRhZy52YWx1ZSgpO1xuICAgICAgICBsZXQgeyBsYXN0VmFsdWUgfSA9IHRoaXM7XG4gICAgICAgIGxldCB2YWx1ZSA9IHJlZmVyZW5jZS52YWx1ZSgpO1xuICAgICAgICBpZiAodmFsdWUgPT09IGxhc3RWYWx1ZSkgcmV0dXJuIE5PVF9NT0RJRklFRDtcbiAgICAgICAgdGhpcy5sYXN0VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpbml0aWFsaXplKCkge1xuICAgICAgICBsZXQgeyByZWZlcmVuY2UgfSA9IHRoaXM7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMubGFzdFZhbHVlID0gcmVmZXJlbmNlLnZhbHVlKCk7XG4gICAgICAgIHRoaXMubGFzdFJldmlzaW9uID0gcmVmZXJlbmNlLnRhZy52YWx1ZSgpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbn1cbmNvbnN0IE5PVF9NT0RJRklFRCA9IFwiYWRiM2I3OGUtM2QyMi00ZTRiLTg3N2EtNjMxN2MyYzVjMTQ1XCI7XG5leHBvcnQgZnVuY3Rpb24gaXNNb2RpZmllZCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gTk9UX01PRElGSUVEO1xufSJdfQ==