ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
455 lines (374 loc) • 45 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 { populateBuiltins as _populateBuiltins } from './syntax/functions';
import { Constants } from './environment/constants';
import { UNDEFINED_REFERENCE, ConditionalReference } from './references';
import { defaultManagers } from './dom/attribute-managers';
import { assert, ensureGuid } from '@glimmer/util';
export var Scope = function () {
function Scope(
// the 0th slot is `self`
slots, callerScope,
// named arguments and blocks passed to a layout that uses eval
evalScope,
// locals in scope when the partial was invoked
partialMap) {
_classCallCheck(this, Scope);
this.slots = slots;
this.callerScope = callerScope;
this.evalScope = evalScope;
this.partialMap = partialMap;
}
Scope.root = function root(self) {
var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var refs = new Array(size + 1);
for (var i = 0; i <= size; i++) {
refs[i] = UNDEFINED_REFERENCE;
}
return new Scope(refs, null, null, null).init({ self: self });
};
Scope.sized = function sized() {
var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
var refs = new Array(size + 1);
for (var i = 0; i <= size; i++) {
refs[i] = UNDEFINED_REFERENCE;
}
return new Scope(refs, null, null, null);
};
Scope.prototype.init = function init(_ref) {
var self = _ref.self;
this.slots[0] = self;
return this;
};
Scope.prototype.getSelf = function getSelf() {
return this.get(0);
};
Scope.prototype.getSymbol = function getSymbol(symbol) {
return this.get(symbol);
};
Scope.prototype.getBlock = function getBlock(symbol) {
return this.get(symbol);
};
Scope.prototype.getEvalScope = function getEvalScope() {
return this.evalScope;
};
Scope.prototype.getPartialMap = function getPartialMap() {
return this.partialMap;
};
Scope.prototype.bind = function bind(symbol, value) {
this.set(symbol, value);
};
Scope.prototype.bindSelf = function bindSelf(self) {
this.set(0, self);
};
Scope.prototype.bindSymbol = function bindSymbol(symbol, value) {
this.set(symbol, value);
};
Scope.prototype.bindBlock = function bindBlock(symbol, value) {
this.set(symbol, value);
};
Scope.prototype.bindEvalScope = function bindEvalScope(map) {
this.evalScope = map;
};
Scope.prototype.bindPartialMap = function bindPartialMap(map) {
this.partialMap = map;
};
Scope.prototype.bindCallerScope = function bindCallerScope(scope) {
this.callerScope = scope;
};
Scope.prototype.getCallerScope = function getCallerScope() {
return this.callerScope;
};
Scope.prototype.child = function child() {
return new Scope(this.slots.slice(), this.callerScope, this.evalScope, this.partialMap);
};
Scope.prototype.get = function get(index) {
if (index >= this.slots.length) {
throw new RangeError('BUG: cannot get $' + index + ' from scope; length=' + this.slots.length);
}
return this.slots[index];
};
Scope.prototype.set = function set(index, value) {
if (index >= this.slots.length) {
throw new RangeError('BUG: cannot get $' + index + ' from scope; length=' + this.slots.length);
}
this.slots[index] = value;
};
return Scope;
}();
var Transaction = function () {
function Transaction() {
_classCallCheck(this, Transaction);
this.scheduledInstallManagers = [];
this.scheduledInstallModifiers = [];
this.scheduledUpdateModifierManagers = [];
this.scheduledUpdateModifiers = [];
this.createdComponents = [];
this.createdManagers = [];
this.updatedComponents = [];
this.updatedManagers = [];
this.destructors = [];
}
Transaction.prototype.didCreate = function didCreate(component, manager) {
this.createdComponents.push(component);
this.createdManagers.push(manager);
};
Transaction.prototype.didUpdate = function didUpdate(component, manager) {
this.updatedComponents.push(component);
this.updatedManagers.push(manager);
};
Transaction.prototype.scheduleInstallModifier = function scheduleInstallModifier(modifier, manager) {
this.scheduledInstallManagers.push(manager);
this.scheduledInstallModifiers.push(modifier);
};
Transaction.prototype.scheduleUpdateModifier = function scheduleUpdateModifier(modifier, manager) {
this.scheduledUpdateModifierManagers.push(manager);
this.scheduledUpdateModifiers.push(modifier);
};
Transaction.prototype.didDestroy = function didDestroy(d) {
this.destructors.push(d);
};
Transaction.prototype.commit = function commit() {
var createdComponents = this.createdComponents,
createdManagers = this.createdManagers;
for (var i = 0; i < createdComponents.length; i++) {
var component = createdComponents[i];
var manager = createdManagers[i];
manager.didCreate(component);
}
var updatedComponents = this.updatedComponents,
updatedManagers = this.updatedManagers;
for (var _i = 0; _i < updatedComponents.length; _i++) {
var _component = updatedComponents[_i];
var _manager = updatedManagers[_i];
_manager.didUpdate(_component);
}
var destructors = this.destructors;
for (var _i2 = 0; _i2 < destructors.length; _i2++) {
destructors[_i2].destroy();
}
var scheduledInstallManagers = this.scheduledInstallManagers,
scheduledInstallModifiers = this.scheduledInstallModifiers;
for (var _i3 = 0; _i3 < scheduledInstallManagers.length; _i3++) {
var _manager2 = scheduledInstallManagers[_i3];
var modifier = scheduledInstallModifiers[_i3];
_manager2.install(modifier);
}
var scheduledUpdateModifierManagers = this.scheduledUpdateModifierManagers,
scheduledUpdateModifiers = this.scheduledUpdateModifiers;
for (var _i4 = 0; _i4 < scheduledUpdateModifierManagers.length; _i4++) {
var _manager3 = scheduledUpdateModifierManagers[_i4];
var _modifier = scheduledUpdateModifiers[_i4];
_manager3.update(_modifier);
}
};
return Transaction;
}();
export var Opcode = function () {
function Opcode(heap) {
_classCallCheck(this, Opcode);
this.heap = heap;
this.offset = 0;
}
_createClass(Opcode, [{
key: 'type',
get: function () {
return this.heap.getbyaddr(this.offset);
}
}, {
key: 'op1',
get: function () {
return this.heap.getbyaddr(this.offset + 1);
}
}, {
key: 'op2',
get: function () {
return this.heap.getbyaddr(this.offset + 2);
}
}, {
key: 'op3',
get: function () {
return this.heap.getbyaddr(this.offset + 3);
}
}]);
return Opcode;
}();
var TableSlotState;
(function (TableSlotState) {
TableSlotState[TableSlotState["Allocated"] = 0] = "Allocated";
TableSlotState[TableSlotState["Freed"] = 1] = "Freed";
TableSlotState[TableSlotState["Purged"] = 2] = "Purged";
TableSlotState[TableSlotState["Pointer"] = 3] = "Pointer";
})(TableSlotState || (TableSlotState = {}));
export var Heap = function () {
function Heap() {
_classCallCheck(this, Heap);
this.heap = [];
this.offset = 0;
this.handle = 0;
/**
* layout:
*
* - pointer into heap
* - size
* - freed (0 or 1)
*/
this.table = [];
}
Heap.prototype.push = function push(item) {
this.heap[this.offset++] = item;
};
Heap.prototype.getbyaddr = function getbyaddr(address) {
return this.heap[address];
};
Heap.prototype.setbyaddr = function setbyaddr(address, value) {
this.heap[address] = value;
};
Heap.prototype.malloc = function malloc() {
this.table.push(this.offset, 0, 0);
var handle = this.handle;
this.handle += 3;
return handle;
};
Heap.prototype.finishMalloc = function finishMalloc(handle) {
var start = this.table[handle];
var finish = this.offset;
this.table[handle + 1] = finish - start;
};
Heap.prototype.size = function size() {
return this.offset;
};
// It is illegal to close over this address, as compaction
// may move it. However, it is legal to use this address
// multiple times between compactions.
Heap.prototype.getaddr = function getaddr(handle) {
return this.table[handle];
};
Heap.prototype.gethandle = function gethandle(address) {
this.table.push(address, 0, TableSlotState.Pointer);
var handle = this.handle;
this.handle += 3;
return handle;
};
Heap.prototype.sizeof = function sizeof(handle) {
if (false) {
return this.table[handle + 1];
}
return -1;
};
Heap.prototype.free = function free(handle) {
this.table[handle + 2] = 1;
};
Heap.prototype.compact = function compact() {
var compactedSize = 0;
var table = this.table,
length = this.table.length,
heap = this.heap;
for (var i = 0; i < length; i += 3) {
var offset = table[i];
var size = table[i + 1];
var state = table[i + 2];
if (state === TableSlotState.Purged) {
continue;
} else if (state === TableSlotState.Freed) {
// transition to "already freed"
// a good improvement would be to reuse
// these slots
table[i + 2] = 2;
compactedSize += size;
} else if (state === TableSlotState.Allocated) {
for (var j = offset; j <= i + size; j++) {
heap[j - compactedSize] = heap[j];
}
table[i] = offset - compactedSize;
} else if (state === TableSlotState.Pointer) {
table[i] = offset - compactedSize;
}
}
this.offset = this.offset - compactedSize;
};
return Heap;
}();
export var Program = function () {
function Program() {
_classCallCheck(this, Program);
this.heap = new Heap();
this._opcode = new Opcode(this.heap);
this.constants = new Constants();
}
Program.prototype.opcode = function opcode(offset) {
this._opcode.offset = offset;
return this._opcode;
};
return Program;
}();
export var Environment = function () {
function Environment(_ref2) {
var appendOperations = _ref2.appendOperations,
updateOperations = _ref2.updateOperations;
_classCallCheck(this, Environment);
this._macros = null;
this._transaction = null;
this.program = new Program();
this.appendOperations = appendOperations;
this.updateOperations = updateOperations;
}
Environment.prototype.toConditionalReference = function toConditionalReference(reference) {
return new ConditionalReference(reference);
};
Environment.prototype.getAppendOperations = function getAppendOperations() {
return this.appendOperations;
};
Environment.prototype.getDOM = function getDOM() {
return this.updateOperations;
};
Environment.prototype.getIdentity = function getIdentity(object) {
return ensureGuid(object) + '';
};
Environment.prototype.begin = function begin() {
assert(!this._transaction, 'a glimmer transaction was begun, but one already exists. You may have a nested transaction');
this._transaction = new Transaction();
};
Environment.prototype.didCreate = function didCreate(component, manager) {
this.transaction.didCreate(component, manager);
};
Environment.prototype.didUpdate = function didUpdate(component, manager) {
this.transaction.didUpdate(component, manager);
};
Environment.prototype.scheduleInstallModifier = function scheduleInstallModifier(modifier, manager) {
this.transaction.scheduleInstallModifier(modifier, manager);
};
Environment.prototype.scheduleUpdateModifier = function scheduleUpdateModifier(modifier, manager) {
this.transaction.scheduleUpdateModifier(modifier, manager);
};
Environment.prototype.didDestroy = function didDestroy(d) {
this.transaction.didDestroy(d);
};
Environment.prototype.commit = function commit() {
var transaction = this.transaction;
this._transaction = null;
transaction.commit();
};
Environment.prototype.attributeFor = function attributeFor(element, attr, isTrusting, namespace) {
return defaultManagers(element, attr, isTrusting, namespace === undefined ? null : namespace);
};
Environment.prototype.macros = function macros() {
var macros = this._macros;
if (!macros) {
this._macros = macros = this.populateBuiltins();
}
return macros;
};
Environment.prototype.populateBuiltins = function populateBuiltins() {
return _populateBuiltins();
};
_createClass(Environment, [{
key: 'transaction',
get: function () {
return this._transaction;
}
}]);
return Environment;
}();
export default Environment;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9lbnZpcm9ubWVudC5qcyJdLCJuYW1lcyI6WyJwb3B1bGF0ZUJ1aWx0aW5zIiwiQ29uc3RhbnRzIiwiVU5ERUZJTkVEX1JFRkVSRU5DRSIsIkNvbmRpdGlvbmFsUmVmZXJlbmNlIiwiZGVmYXVsdE1hbmFnZXJzIiwiYXNzZXJ0IiwiZW5zdXJlR3VpZCIsIlNjb3BlIiwic2xvdHMiLCJjYWxsZXJTY29wZSIsImV2YWxTY29wZSIsInBhcnRpYWxNYXAiLCJyb290Iiwic2VsZiIsInNpemUiLCJyZWZzIiwiQXJyYXkiLCJpIiwiaW5pdCIsInNpemVkIiwiZ2V0U2VsZiIsImdldCIsImdldFN5bWJvbCIsInN5bWJvbCIsImdldEJsb2NrIiwiZ2V0RXZhbFNjb3BlIiwiZ2V0UGFydGlhbE1hcCIsImJpbmQiLCJ2YWx1ZSIsInNldCIsImJpbmRTZWxmIiwiYmluZFN5bWJvbCIsImJpbmRCbG9jayIsImJpbmRFdmFsU2NvcGUiLCJtYXAiLCJiaW5kUGFydGlhbE1hcCIsImJpbmRDYWxsZXJTY29wZSIsInNjb3BlIiwiZ2V0Q2FsbGVyU2NvcGUiLCJjaGlsZCIsInNsaWNlIiwiaW5kZXgiLCJsZW5ndGgiLCJSYW5nZUVycm9yIiwiVHJhbnNhY3Rpb24iLCJzY2hlZHVsZWRJbnN0YWxsTWFuYWdlcnMiLCJzY2hlZHVsZWRJbnN0YWxsTW9kaWZpZXJzIiwic2NoZWR1bGVkVXBkYXRlTW9kaWZpZXJNYW5hZ2VycyIsInNjaGVkdWxlZFVwZGF0ZU1vZGlmaWVycyIsImNyZWF0ZWRDb21wb25lbnRzIiwiY3JlYXRlZE1hbmFnZXJzIiwidXBkYXRlZENvbXBvbmVudHMiLCJ1cGRhdGVkTWFuYWdlcnMiLCJkZXN0cnVjdG9ycyIsImRpZENyZWF0ZSIsImNvbXBvbmVudCIsIm1hbmFnZXIiLCJwdXNoIiwiZGlkVXBkYXRlIiwic2NoZWR1bGVJbnN0YWxsTW9kaWZpZXIiLCJtb2RpZmllciIsInNjaGVkdWxlVXBkYXRlTW9kaWZpZXIiLCJkaWREZXN0cm95IiwiZCIsImNvbW1pdCIsImRlc3Ryb3kiLCJpbnN0YWxsIiwidXBkYXRlIiwiT3Bjb2RlIiwiaGVhcCIsIm9mZnNldCIsImdldGJ5YWRkciIsIlRhYmxlU2xvdFN0YXRlIiwiSGVhcCIsImhhbmRsZSIsInRhYmxlIiwiaXRlbSIsImFkZHJlc3MiLCJzZXRieWFkZHIiLCJtYWxsb2MiLCJmaW5pc2hNYWxsb2MiLCJzdGFydCIsImZpbmlzaCIsImdldGFkZHIiLCJnZXRoYW5kbGUiLCJQb2ludGVyIiwic2l6ZW9mIiwiZnJlZSIsImNvbXBhY3QiLCJjb21wYWN0ZWRTaXplIiwic3RhdGUiLCJQdXJnZWQiLCJGcmVlZCIsIkFsbG9jYXRlZCIsImoiLCJQcm9ncmFtIiwiX29wY29kZSIsImNvbnN0YW50cyIsIm9wY29kZSIsIkVudmlyb25tZW50IiwiYXBwZW5kT3BlcmF0aW9ucyIsInVwZGF0ZU9wZXJhdGlvbnMiLCJfbWFjcm9zIiwiX3RyYW5zYWN0aW9uIiwicHJvZ3JhbSIsInRvQ29uZGl0aW9uYWxSZWZlcmVuY2UiLCJyZWZlcmVuY2UiLCJnZXRBcHBlbmRPcGVyYXRpb25zIiwiZ2V0RE9NIiwiZ2V0SWRlbnRpdHkiLCJvYmplY3QiLCJiZWdpbiIsInRyYW5zYWN0aW9uIiwiYXR0cmlidXRlRm9yIiwiZWxlbWVudCIsImF0dHIiLCJpc1RydXN0aW5nIiwibmFtZXNwYWNlIiwidW5kZWZpbmVkIiwibWFjcm9zIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUEsU0FBU0EscUNBQVQsUUFBaUMsb0JBQWpDO0FBQ0EsU0FBU0MsU0FBVCxRQUEwQix5QkFBMUI7QUFDQSxTQUFTQyxtQkFBVCxFQUE4QkMsb0JBQTlCLFFBQTBELGNBQTFEO0FBQ0EsU0FBU0MsZUFBVCxRQUFnQywwQkFBaEM7QUFDQSxTQUFTQyxNQUFULEVBQWlCQyxVQUFqQixRQUEyQyxlQUEzQzs7QUFFQSxXQUFhQyxLQUFiO0FBQ0k7QUFDQTtBQUNBQyxTQUZBLEVBRU9DLFdBRlA7QUFHQTtBQUNBQyxhQUpBO0FBS0E7QUFDQUMsY0FOQSxFQU1ZO0FBQUE7O0FBQ1IsYUFBS0gsS0FBTCxHQUFhQSxLQUFiO0FBQ0EsYUFBS0MsV0FBTCxHQUFtQkEsV0FBbkI7QUFDQSxhQUFLQyxTQUFMLEdBQWlCQSxTQUFqQjtBQUNBLGFBQUtDLFVBQUwsR0FBa0JBLFVBQWxCO0FBQ0g7O0FBWkwsVUFhV0MsSUFiWCxpQkFhZ0JDLElBYmhCLEVBYWdDO0FBQUEsWUFBVkMsSUFBVSx1RUFBSCxDQUFHOztBQUN4QixZQUFJQyxPQUFPLElBQUlDLEtBQUosQ0FBVUYsT0FBTyxDQUFqQixDQUFYO0FBQ0EsYUFBSyxJQUFJRyxJQUFJLENBQWIsRUFBZ0JBLEtBQUtILElBQXJCLEVBQTJCRyxHQUEzQixFQUFnQztBQUM1QkYsaUJBQUtFLENBQUwsSUFBVWYsbUJBQVY7QUFDSDtBQUNELGVBQU8sSUFBSUssS0FBSixDQUFVUSxJQUFWLEVBQWdCLElBQWhCLEVBQXNCLElBQXRCLEVBQTRCLElBQTVCLEVBQWtDRyxJQUFsQyxDQUF1QyxFQUFFTCxVQUFGLEVBQXZDLENBQVA7QUFDSCxLQW5CTDs7QUFBQSxVQW9CV00sS0FwQlgsb0JBb0IyQjtBQUFBLFlBQVZMLElBQVUsdUVBQUgsQ0FBRzs7QUFDbkIsWUFBSUMsT0FBTyxJQUFJQyxLQUFKLENBQVVGLE9BQU8sQ0FBakIsQ0FBWDtBQUNBLGFBQUssSUFBSUcsSUFBSSxDQUFiLEVBQWdCQSxLQUFLSCxJQUFyQixFQUEyQkcsR0FBM0IsRUFBZ0M7QUFDNUJGLGlCQUFLRSxDQUFMLElBQVVmLG1CQUFWO0FBQ0g7QUFDRCxlQUFPLElBQUlLLEtBQUosQ0FBVVEsSUFBVixFQUFnQixJQUFoQixFQUFzQixJQUF0QixFQUE0QixJQUE1QixDQUFQO0FBQ0gsS0ExQkw7O0FBQUEsb0JBMkJJRyxJQTNCSix1QkEyQm1CO0FBQUEsWUFBUkwsSUFBUSxRQUFSQSxJQUFROztBQUNYLGFBQUtMLEtBQUwsQ0FBVyxDQUFYLElBQWdCSyxJQUFoQjtBQUNBLGVBQU8sSUFBUDtBQUNILEtBOUJMOztBQUFBLG9CQStCSU8sT0EvQkosc0JBK0JjO0FBQ04sZUFBTyxLQUFLQyxHQUFMLENBQVMsQ0FBVCxDQUFQO0FBQ0gsS0FqQ0w7O0FBQUEsb0JBa0NJQyxTQWxDSixzQkFrQ2NDLE1BbENkLEVBa0NzQjtBQUNkLGVBQU8sS0FBS0YsR0FBTCxDQUFTRSxNQUFULENBQVA7QUFDSCxLQXBDTDs7QUFBQSxvQkFxQ0lDLFFBckNKLHFCQXFDYUQsTUFyQ2IsRUFxQ3FCO0FBQ2IsZUFBTyxLQUFLRixHQUFMLENBQVNFLE1BQVQsQ0FBUDtBQUNILEtBdkNMOztBQUFBLG9CQXdDSUUsWUF4Q0osMkJBd0NtQjtBQUNYLGVBQU8sS0FBS2YsU0FBWjtBQUNILEtBMUNMOztBQUFBLG9CQTJDSWdCLGFBM0NKLDRCQTJDb0I7QUFDWixlQUFPLEtBQUtmLFVBQVo7QUFDSCxLQTdDTDs7QUFBQSxvQkE4Q0lnQixJQTlDSixpQkE4Q1NKLE1BOUNULEVBOENpQkssS0E5Q2pCLEVBOEN3QjtBQUNoQixhQUFLQyxHQUFMLENBQVNOLE1BQVQsRUFBaUJLLEtBQWpCO0FBQ0gsS0FoREw7O0FBQUEsb0JBaURJRSxRQWpESixxQkFpRGFqQixJQWpEYixFQWlEbUI7QUFDWCxhQUFLZ0IsR0FBTCxDQUFTLENBQVQsRUFBWWhCLElBQVo7QUFDSCxLQW5ETDs7QUFBQSxvQkFvRElrQixVQXBESix1QkFvRGVSLE1BcERmLEVBb0R1QkssS0FwRHZCLEVBb0Q4QjtBQUN0QixhQUFLQyxHQUFMLENBQVNOLE1BQVQsRUFBaUJLLEtBQWpCO0FBQ0gsS0F0REw7O0FBQUEsb0JBdURJSSxTQXZESixzQkF1RGNULE1BdkRkLEVBdURzQkssS0F2RHRCLEVBdUQ2QjtBQUNyQixhQUFLQyxHQUFMLENBQVNOLE1BQVQsRUFBaUJLLEtBQWpCO0FBQ0gsS0F6REw7O0FBQUEsb0JBMERJSyxhQTFESiwwQkEwRGtCQyxHQTFEbEIsRUEwRHVCO0FBQ2YsYUFBS3hCLFNBQUwsR0FBaUJ3QixHQUFqQjtBQUNILEtBNURMOztBQUFBLG9CQTZESUMsY0E3REosMkJBNkRtQkQsR0E3RG5CLEVBNkR3QjtBQUNoQixhQUFLdkIsVUFBTCxHQUFrQnVCLEdBQWxCO0FBQ0gsS0EvREw7O0FBQUEsb0JBZ0VJRSxlQWhFSiw0QkFnRW9CQyxLQWhFcEIsRUFnRTJCO0FBQ25CLGFBQUs1QixXQUFMLEdBQW1CNEIsS0FBbkI7QUFDSCxLQWxFTDs7QUFBQSxvQkFtRUlDLGNBbkVKLDZCQW1FcUI7QUFDYixlQUFPLEtBQUs3QixXQUFaO0FBQ0gsS0FyRUw7O0FBQUEsb0JBc0VJOEIsS0F0RUosb0JBc0VZO0FBQ0osZUFBTyxJQUFJaEMsS0FBSixDQUFVLEtBQUtDLEtBQUwsQ0FBV2dDLEtBQVgsRUFBVixFQUE4QixLQUFLL0IsV0FBbkMsRUFBZ0QsS0FBS0MsU0FBckQsRUFBZ0UsS0FBS0MsVUFBckUsQ0FBUDtBQUNILEtBeEVMOztBQUFBLG9CQXlFSVUsR0F6RUosZ0JBeUVRb0IsS0F6RVIsRUF5RWU7QUFDUCxZQUFJQSxTQUFTLEtBQUtqQyxLQUFMLENBQVdrQyxNQUF4QixFQUFnQztBQUM1QixrQkFBTSxJQUFJQyxVQUFKLHVCQUFtQ0YsS0FBbkMsNEJBQStELEtBQUtqQyxLQUFMLENBQVdrQyxNQUExRSxDQUFOO0FBQ0g7QUFDRCxlQUFPLEtBQUtsQyxLQUFMLENBQVdpQyxLQUFYLENBQVA7QUFDSCxLQTlFTDs7QUFBQSxvQkErRUlaLEdBL0VKLGdCQStFUVksS0EvRVIsRUErRWViLEtBL0VmLEVBK0VzQjtBQUNkLFlBQUlhLFNBQVMsS0FBS2pDLEtBQUwsQ0FBV2tDLE1BQXhCLEVBQWdDO0FBQzVCLGtCQUFNLElBQUlDLFVBQUosdUJBQW1DRixLQUFuQyw0QkFBK0QsS0FBS2pDLEtBQUwsQ0FBV2tDLE1BQTFFLENBQU47QUFDSDtBQUNELGFBQUtsQyxLQUFMLENBQVdpQyxLQUFYLElBQW9CYixLQUFwQjtBQUNILEtBcEZMOztBQUFBO0FBQUE7O0lBc0ZNZ0IsVztBQUNGLDJCQUFjO0FBQUE7O0FBQ1YsYUFBS0Msd0JBQUwsR0FBZ0MsRUFBaEM7QUFDQSxhQUFLQyx5QkFBTCxHQUFpQyxFQUFqQztBQUNBLGFBQUtDLCtCQUFMLEdBQXVDLEVBQXZDO0FBQ0EsYUFBS0Msd0JBQUwsR0FBZ0MsRUFBaEM7QUFDQSxhQUFLQyxpQkFBTCxHQUF5QixFQUF6QjtBQUNBLGFBQUtDLGVBQUwsR0FBdUIsRUFBdkI7QUFDQSxhQUFLQyxpQkFBTCxHQUF5QixFQUF6QjtBQUNBLGFBQUtDLGVBQUwsR0FBdUIsRUFBdkI7QUFDQSxhQUFLQyxXQUFMLEdBQW1CLEVBQW5CO0FBQ0g7OzBCQUNEQyxTLHNCQUFVQyxTLEVBQVdDLE8sRUFBUztBQUMxQixhQUFLUCxpQkFBTCxDQUF1QlEsSUFBdkIsQ0FBNEJGLFNBQTVCO0FBQ0EsYUFBS0wsZUFBTCxDQUFxQk8sSUFBckIsQ0FBMEJELE9BQTFCO0FBQ0gsSzs7MEJBQ0RFLFMsc0JBQVVILFMsRUFBV0MsTyxFQUFTO0FBQzFCLGFBQUtMLGlCQUFMLENBQXVCTSxJQUF2QixDQUE0QkYsU0FBNUI7QUFDQSxhQUFLSCxlQUFMLENBQXFCSyxJQUFyQixDQUEwQkQsT0FBMUI7QUFDSCxLOzswQkFDREcsdUIsb0NBQXdCQyxRLEVBQVVKLE8sRUFBUztBQUN2QyxhQUFLWCx3QkFBTCxDQUE4QlksSUFBOUIsQ0FBbUNELE9BQW5DO0FBQ0EsYUFBS1YseUJBQUwsQ0FBK0JXLElBQS9CLENBQW9DRyxRQUFwQztBQUNILEs7OzBCQUNEQyxzQixtQ0FBdUJELFEsRUFBVUosTyxFQUFTO0FBQ3RDLGFBQUtULCtCQUFMLENBQXFDVSxJQUFyQyxDQUEwQ0QsT0FBMUM7QUFDQSxhQUFLUix3QkFBTCxDQUE4QlMsSUFBOUIsQ0FBbUNHLFFBQW5DO0FBQ0gsSzs7MEJBQ0RFLFUsdUJBQVdDLEMsRUFBRztBQUNWLGFBQUtWLFdBQUwsQ0FBaUJJLElBQWpCLENBQXNCTSxDQUF0QjtBQUNILEs7OzBCQUNEQyxNLHFCQUFTO0FBQUEsWUFDQ2YsaUJBREQsR0FDd0MsSUFEeEMsQ0FDQ0EsaUJBREQ7QUFBQSxZQUNvQkMsZUFEcEIsR0FDd0MsSUFEeEMsQ0FDb0JBLGVBRHBCOztBQUVMLGFBQUssSUFBSWpDLElBQUksQ0FBYixFQUFnQkEsSUFBSWdDLGtCQUFrQlAsTUFBdEMsRUFBOEN6QixHQUE5QyxFQUFtRDtBQUMvQyxnQkFBSXNDLFlBQVlOLGtCQUFrQmhDLENBQWxCLENBQWhCO0FBQ0EsZ0JBQUl1QyxVQUFVTixnQkFBZ0JqQyxDQUFoQixDQUFkO0FBQ0F1QyxvQkFBUUYsU0FBUixDQUFrQkMsU0FBbEI7QUFDSDtBQU5JLFlBT0NKLGlCQVBELEdBT3dDLElBUHhDLENBT0NBLGlCQVBEO0FBQUEsWUFPb0JDLGVBUHBCLEdBT3dDLElBUHhDLENBT29CQSxlQVBwQjs7QUFRTCxhQUFLLElBQUluQyxLQUFJLENBQWIsRUFBZ0JBLEtBQUlrQyxrQkFBa0JULE1BQXRDLEVBQThDekIsSUFBOUMsRUFBbUQ7QUFDL0MsZ0JBQUlzQyxhQUFZSixrQkFBa0JsQyxFQUFsQixDQUFoQjtBQUNBLGdCQUFJdUMsV0FBVUosZ0JBQWdCbkMsRUFBaEIsQ0FBZDtBQUNBdUMscUJBQVFFLFNBQVIsQ0FBa0JILFVBQWxCO0FBQ0g7QUFaSSxZQWFDRixXQWJELEdBYWlCLElBYmpCLENBYUNBLFdBYkQ7O0FBY0wsYUFBSyxJQUFJcEMsTUFBSSxDQUFiLEVBQWdCQSxNQUFJb0MsWUFBWVgsTUFBaEMsRUFBd0N6QixLQUF4QyxFQUE2QztBQUN6Q29DLHdCQUFZcEMsR0FBWixFQUFlZ0QsT0FBZjtBQUNIO0FBaEJJLFlBaUJDcEIsd0JBakJELEdBaUJ5RCxJQWpCekQsQ0FpQkNBLHdCQWpCRDtBQUFBLFlBaUIyQkMseUJBakIzQixHQWlCeUQsSUFqQnpELENBaUIyQkEseUJBakIzQjs7QUFrQkwsYUFBSyxJQUFJN0IsTUFBSSxDQUFiLEVBQWdCQSxNQUFJNEIseUJBQXlCSCxNQUE3QyxFQUFxRHpCLEtBQXJELEVBQTBEO0FBQ3RELGdCQUFJdUMsWUFBVVgseUJBQXlCNUIsR0FBekIsQ0FBZDtBQUNBLGdCQUFJMkMsV0FBV2QsMEJBQTBCN0IsR0FBMUIsQ0FBZjtBQUNBdUMsc0JBQVFVLE9BQVIsQ0FBZ0JOLFFBQWhCO0FBQ0g7QUF0QkksWUF1QkNiLCtCQXZCRCxHQXVCK0QsSUF2Qi9ELENBdUJDQSwrQkF2QkQ7QUFBQSxZQXVCa0NDLHdCQXZCbEMsR0F1QitELElBdkIvRCxDQXVCa0NBLHdCQXZCbEM7O0FBd0JMLGFBQUssSUFBSS9CLE1BQUksQ0FBYixFQUFnQkEsTUFBSThCLGdDQUFnQ0wsTUFBcEQsRUFBNER6QixLQUE1RCxFQUFpRTtBQUM3RCxnQkFBSXVDLFlBQVVULGdDQUFnQzlCLEdBQWhDLENBQWQ7QUFDQSxnQkFBSTJDLFlBQVdaLHlCQUF5Qi9CLEdBQXpCLENBQWY7QUFDQXVDLHNCQUFRVyxNQUFSLENBQWVQLFNBQWY7QUFDSDtBQUNKLEs7Ozs7O0FBRUwsV0FBYVEsTUFBYjtBQUNJLG9CQUFZQyxJQUFaLEVBQWtCO0FBQUE7O0FBQ2QsYUFBS0EsSUFBTCxHQUFZQSxJQUFaO0FBQ0EsYUFBS0MsTUFBTCxHQUFjLENBQWQ7QUFDSDs7QUFKTDtBQUFBO0FBQUEseUJBS2U7QUFDUCxtQkFBTyxLQUFLRCxJQUFMLENBQVVFLFNBQVYsQ0FBb0IsS0FBS0QsTUFBekIsQ0FBUDtBQUNIO0FBUEw7QUFBQTtBQUFBLHlCQVFjO0FBQ04sbUJBQU8sS0FBS0QsSUFBTCxDQUFVRSxTQUFWLENBQW9CLEtBQUtELE1BQUwsR0FBYyxDQUFsQyxDQUFQO0FBQ0g7QUFWTDtBQUFBO0FBQUEseUJBV2M7QUFDTixtQkFBTyxLQUFLRCxJQUFMLENBQVVFLFNBQVYsQ0FBb0IsS0FBS0QsTUFBTCxHQUFjLENBQWxDLENBQVA7QUFDSDtBQWJMO0FBQUE7QUFBQSx5QkFjYztBQUNOLG1CQUFPLEtBQUtELElBQUwsQ0FBVUUsU0FBVixDQUFvQixLQUFLRCxNQUFMLEdBQWMsQ0FBbEMsQ0FBUDtBQUNIO0FBaEJMOztBQUFBO0FBQUE7QUFrQkEsSUFBSUUsY0FBSjtBQUNBLENBQUMsVUFBVUEsY0FBVixFQUEwQjtBQUN2QkEsbUJBQWVBLGVBQWUsV0FBZixJQUE4QixDQUE3QyxJQUFrRCxXQUFsRDtBQUNBQSxtQkFBZUEsZUFBZSxPQUFmLElBQTBCLENBQXpDLElBQThDLE9BQTlDO0FBQ0FBLG1CQUFlQSxlQUFlLFFBQWYsSUFBMkIsQ0FBMUMsSUFBK0MsUUFBL0M7QUFDQUEsbUJBQWVBLGVBQWUsU0FBZixJQUE0QixDQUEzQyxJQUFnRCxTQUFoRDtBQUNILENBTEQsRUFLR0EsbUJBQW1CQSxpQkFBaUIsRUFBcEMsQ0FMSDtBQU1BLFdBQWFDLElBQWI7QUFDSSxvQkFBYztBQUFBOztBQUNWLGFBQUtKLElBQUwsR0FBWSxFQUFaO0FBQ0EsYUFBS0MsTUFBTCxHQUFjLENBQWQ7QUFDQSxhQUFLSSxNQUFMLEdBQWMsQ0FBZDtBQUNBOzs7Ozs7O0FBT0EsYUFBS0MsS0FBTCxHQUFhLEVBQWI7QUFDSDs7QUFiTCxtQkFjSWxCLElBZEosaUJBY1NtQixJQWRULEVBY2U7QUFDUCxhQUFLUCxJQUFMLENBQVUsS0FBS0MsTUFBTCxFQUFWLElBQTJCTSxJQUEzQjtBQUNILEtBaEJMOztBQUFBLG1CQWlCSUwsU0FqQkosc0JBaUJjTSxPQWpCZCxFQWlCdUI7QUFDZixlQUFPLEtBQUtSLElBQUwsQ0FBVVEsT0FBVixDQUFQO0FBQ0gsS0FuQkw7O0FBQUEsbUJBb0JJQyxTQXBCSixzQkFvQmNELE9BcEJkLEVBb0J1QmpELEtBcEJ2QixFQW9COEI7QUFDdEIsYUFBS3lDLElBQUwsQ0FBVVEsT0FBVixJQUFxQmpELEtBQXJCO0FBQ0gsS0F0Qkw7O0FBQUEsbUJBdUJJbUQsTUF2QkoscUJBdUJhO0FBQ0wsYUFBS0osS0FBTCxDQUFXbEIsSUFBWCxDQUFnQixLQUFLYSxNQUFyQixFQUE2QixDQUE3QixFQUFnQyxDQUFoQztBQUNBLFlBQUlJLFNBQVMsS0FBS0EsTUFBbEI7QUFDQSxhQUFLQSxNQUFMLElBQWUsQ0FBZjtBQUNBLGVBQU9BLE1BQVA7QUFDSCxLQTVCTDs7QUFBQSxtQkE2QklNLFlBN0JKLHlCQTZCaUJOLE1BN0JqQixFQTZCeUI7QUFDakIsWUFBSU8sUUFBUSxLQUFLTixLQUFMLENBQVdELE1BQVgsQ0FBWjtBQUNBLFlBQUlRLFNBQVMsS0FBS1osTUFBbEI7QUFDQSxhQUFLSyxLQUFMLENBQVdELFNBQVMsQ0FBcEIsSUFBeUJRLFNBQVNELEtBQWxDO0FBQ0gsS0FqQ0w7O0FBQUEsbUJBa0NJbkUsSUFsQ0osbUJBa0NXO0FBQ0gsZUFBTyxLQUFLd0QsTUFBWjtBQUNILEtBcENMO0FBcUNJO0FBQ0E7QUFDQTs7O0FBdkNKLG1CQXdDSWEsT0F4Q0osb0JBd0NZVCxNQXhDWixFQXdDb0I7QUFDWixlQUFPLEtBQUtDLEtBQUwsQ0FBV0QsTUFBWCxDQUFQO0FBQ0gsS0ExQ0w7O0FBQUEsbUJBMkNJVSxTQTNDSixzQkEyQ2NQLE9BM0NkLEVBMkN1QjtBQUNmLGFBQUtGLEtBQUwsQ0FBV2xCLElBQVgsQ0FBZ0JvQixPQUFoQixFQUF5QixDQUF6QixFQUE0QkwsZUFBZWEsT0FBM0M7QUFDQSxZQUFJWCxTQUFTLEtBQUtBLE1BQWxCO0FBQ0EsYUFBS0EsTUFBTCxJQUFlLENBQWY7QUFDQSxlQUFPQSxNQUFQO0FBQ0gsS0FoREw7O0FBQUEsbUJBaURJWSxNQWpESixtQkFpRFdaLE1BakRYLEVBaURtQjtBQUNYLFlBQUksS0FBSixFQUFXO0FBQ1AsbUJBQU8sS0FBS0MsS0FBTCxDQUFXRCxTQUFTLENBQXBCLENBQVA7QUFDSDtBQUNELGVBQU8sQ0FBQyxDQUFSO0FBQ0gsS0F0REw7O0FBQUEsbUJBdURJYSxJQXZESixpQkF1RFNiLE1BdkRULEVBdURpQjtBQUNULGFBQUtDLEtBQUwsQ0FBV0QsU0FBUyxDQUFwQixJQUF5QixDQUF6QjtBQUNILEtBekRMOztBQUFBLG1CQTBESWMsT0ExREosc0JBMERjO0FBQ04sWUFBSUMsZ0JBQWdCLENBQXBCO0FBRE0sWUFFQWQsS0FGQSxHQUVtQyxJQUZuQyxDQUVBQSxLQUZBO0FBQUEsWUFFZ0JqQyxNQUZoQixHQUVtQyxJQUZuQyxDQUVPaUMsS0FGUCxDQUVnQmpDLE1BRmhCO0FBQUEsWUFFMEIyQixJQUYxQixHQUVtQyxJQUZuQyxDQUUwQkEsSUFGMUI7O0FBR04sYUFBSyxJQUFJcEQsSUFBSSxDQUFiLEVBQWdCQSxJQUFJeUIsTUFBcEIsRUFBNEJ6QixLQUFLLENBQWpDLEVBQW9DO0FBQ2hDLGdCQUFJcUQsU0FBU0ssTUFBTTFELENBQU4sQ0FBYjtBQUNBLGdCQUFJSCxPQUFPNkQsTUFBTTFELElBQUksQ0FBVixDQUFYO0FBQ0EsZ0JBQUl5RSxRQUFRZixNQUFNMUQsSUFBSSxDQUFWLENBQVo7QUFDQSxnQkFBSXlFLFVBQVVsQixlQUFlbUIsTUFBN0IsRUFBcUM7QUFDakM7QUFDSCxhQUZELE1BRU8sSUFBSUQsVUFBVWxCLGVBQWVvQixLQUE3QixFQUFvQztBQUN2QztBQUNBO0FBQ0E7QUFDQWpCLHNCQUFNMUQsSUFBSSxDQUFWLElBQWUsQ0FBZjtBQUNBd0UsaUNBQWlCM0UsSUFBakI7QUFDSCxhQU5NLE1BTUEsSUFBSTRFLFVBQVVsQixlQUFlcUIsU0FBN0IsRUFBd0M7QUFDM0MscUJBQUssSUFBSUMsSUFBSXhCLE1BQWIsRUFBcUJ3QixLQUFLN0UsSUFBSUgsSUFBOUIsRUFBb0NnRixHQUFwQyxFQUF5QztBQUNyQ3pCLHlCQUFLeUIsSUFBSUwsYUFBVCxJQUEwQnBCLEtBQUt5QixDQUFMLENBQTFCO0FBQ0g7QUFDRG5CLHNCQUFNMUQsQ0FBTixJQUFXcUQsU0FBU21CLGFBQXBCO0FBQ0gsYUFMTSxNQUtBLElBQUlDLFVBQVVsQixlQUFlYSxPQUE3QixFQUFzQztBQUN6Q1Ysc0JBQU0xRCxDQUFOLElBQVdxRCxTQUFTbUIsYUFBcEI7QUFDSDtBQUNKO0FBQ0QsYUFBS25CLE1BQUwsR0FBYyxLQUFLQSxNQUFMLEdBQWNtQixhQUE1QjtBQUNILEtBbkZMOztBQUFBO0FBQUE7QUFxRkEsV0FBYU0sT0FBYjtBQUNJLHVCQUFjO0FBQUE7O0FBQ1YsYUFBSzFCLElBQUwsR0FBWSxJQUFJSSxJQUFKLEVBQVo7QUFDQSxhQUFLdUIsT0FBTCxHQUFlLElBQUk1QixNQUFKLENBQVcsS0FBS0MsSUFBaEIsQ0FBZjtBQUNBLGFBQUs0QixTQUFMLEdBQWlCLElBQUloRyxTQUFKLEVBQWpCO0FBQ0g7O0FBTEwsc0JBTUlpRyxNQU5KLG1CQU1XNUIsTUFOWCxFQU1tQjtBQUNYLGFBQUswQixPQUFMLENBQWExQixNQUFiLEdBQXNCQSxNQUF0QjtBQUNBLGVBQU8sS0FBSzBCLE9BQVo7QUFDSCxLQVRMOztBQUFBO0FBQUE7QUFXQSxXQUFhRyxXQUFiO0FBQ0ksZ0NBQW9EO0FBQUEsWUFBdENDLGdCQUFzQyxTQUF0Q0EsZ0JBQXNDO0FBQUEsWUFBcEJDLGdCQUFvQixTQUFwQkEsZ0JBQW9COztBQUFBOztBQUNoRCxhQUFLQyxPQUFMLEdBQWUsSUFBZjtBQUNBLGFBQUtDLFlBQUwsR0FBb0IsSUFBcEI7QUFDQSxhQUFLQyxPQUFMLEdBQWUsSUFBSVQsT0FBSixFQUFmO0FBQ0EsYUFBS0ssZ0JBQUwsR0FBd0JBLGdCQUF4QjtBQUNBLGFBQUtDLGdCQUFMLEdBQXdCQSxnQkFBeEI7QUFDSDs7QUFQTCwwQkFRSUksc0JBUkosbUNBUTJCQyxTQVIzQixFQVFzQztBQUM5QixlQUFPLElBQUl2RyxvQkFBSixDQUF5QnVHLFNBQXpCLENBQVA7QUFDSCxLQVZMOztBQUFBLDBCQVdJQyxtQkFYSixrQ0FXMEI7QUFDbEIsZUFBTyxLQUFLUCxnQkFBWjtBQUNILEtBYkw7O0FBQUEsMEJBY0lRLE1BZEoscUJBY2E7QUFDTCxlQUFPLEtBQUtQLGdCQUFaO0FBQ0gsS0FoQkw7O0FBQUEsMEJBaUJJUSxXQWpCSix3QkFpQmdCQyxNQWpCaEIsRUFpQndCO0FBQ2hCLGVBQU94RyxXQUFXd0csTUFBWCxJQUFxQixFQUE1QjtBQUNILEtBbkJMOztBQUFBLDBCQW9CSUMsS0FwQkosb0JBb0JZO0FBQ0oxRyxlQUFPLENBQUMsS0FBS2tHLFlBQWIsRUFBMkIsNEZBQTNCO0FBQ0EsYUFBS0EsWUFBTCxHQUFvQixJQUFJM0QsV0FBSixFQUFwQjtBQUNILEtBdkJMOztBQUFBLDBCQTJCSVUsU0EzQkosc0JBMkJjQyxTQTNCZCxFQTJCeUJDLE9BM0J6QixFQTJCa0M7QUFDMUIsYUFBS3dELFdBQUwsQ0FBaUIxRCxTQUFqQixDQUEyQkMsU0FBM0IsRUFBc0NDLE9BQXRDO0FBQ0gsS0E3Qkw7O0FBQUEsMEJBOEJJRSxTQTlCSixzQkE4QmNILFNBOUJkLEVBOEJ5QkMsT0E5QnpCLEVBOEJrQztBQUMxQixhQUFLd0QsV0FBTCxDQUFpQnRELFNBQWpCLENBQTJCSCxTQUEzQixFQUFzQ0MsT0FBdEM7QUFDSCxLQWhDTDs7QUFBQSwwQkFpQ0lHLHVCQWpDSixvQ0FpQzRCQyxRQWpDNUIsRUFpQ3NDSixPQWpDdEMsRUFpQytDO0FBQ3ZDLGFBQUt3RCxXQUFMLENBQWlCckQsdUJBQWpCLENBQXlDQyxRQUF6QyxFQUFtREosT0FBbkQ7QUFDSCxLQW5DTDs7QUFBQSwwQkFvQ0lLLHNCQXBDSixtQ0FvQzJCRCxRQXBDM0IsRUFvQ3FDSixPQXBDckMsRUFvQzhDO0FBQ3RDLGFBQUt3RCxXQUFMLENBQWlCbkQsc0JBQWpCLENBQXdDRCxRQUF4QyxFQUFrREosT0FBbEQ7QUFDSCxLQXRDTDs7QUFBQSwwQkF1Q0lNLFVBdkNKLHVCQXVDZUMsQ0F2Q2YsRUF1Q2tCO0FBQ1YsYUFBS2lELFdBQUwsQ0FBaUJsRCxVQUFqQixDQUE0QkMsQ0FBNUI7QUFDSCxLQXpDTDs7QUFBQSwwQkEwQ0lDLE1BMUNKLHFCQTBDYTtBQUNMLFlBQUlnRCxjQUFjLEtBQUtBLFdBQXZCO0FBQ0EsYUFBS1QsWUFBTCxHQUFvQixJQUFwQjtBQUNBUyxvQkFBWWhELE1BQVo7QUFDSCxLQTlDTDs7QUFBQSwwQkErQ0lpRCxZQS9DSix5QkErQ2lCQyxPQS9DakIsRUErQzBCQyxJQS9DMUIsRUErQ2dDQyxVQS9DaEMsRUErQzRDQyxTQS9DNUMsRUErQ3VEO0FBQy9DLGVBQU9qSCxnQkFBZ0I4RyxPQUFoQixFQUF5QkMsSUFBekIsRUFBK0JDLFVBQS9CLEVBQTJDQyxjQUFjQyxTQUFkLEdBQTBCLElBQTFCLEdBQWlDRCxTQUE1RSxDQUFQO0FBQ0gsS0FqREw7O0FBQUEsMEJBa0RJRSxNQWxESixxQkFrRGE7QUFDTCxZQUFJQSxTQUFTLEtBQUtqQixPQUFsQjtBQUNBLFlBQUksQ0FBQ2lCLE1BQUwsRUFBYTtBQUNULGlCQUFLakIsT0FBTCxHQUFlaUIsU0FBUyxLQUFLdkgsZ0JBQUwsRUFBeEI7QUFDSDtBQUNELGVBQU91SCxNQUFQO0FBQ0gsS0F4REw7O0FBQUEsMEJBeURJdkgsZ0JBekRKLCtCQXlEdUI7QUFDZixlQUFPQSxtQkFBUDtBQUNILEtBM0RMOztBQUFBO0FBQUE7QUFBQSx5QkF3QnNCO0FBQ2QsbUJBQWMsS0FBS3VHLFlBQW5CO0FBQ0g7QUExQkw7O0FBQUE7QUFBQTtBQTZEQSxlQUFlSixXQUFmIiwiZmlsZSI6ImxpYi9lbnZpcm9ubWVudC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHBvcHVsYXRlQnVpbHRpbnMgfSBmcm9tICcuL3N5bnRheC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnLi9lbnZpcm9ubWVudC9jb25zdGFudHMnO1xuaW1wb3J0IHsgVU5ERUZJTkVEX1JFRkVSRU5DRSwgQ29uZGl0aW9uYWxSZWZlcmVuY2UgfSBmcm9tICcuL3JlZmVyZW5jZXMnO1xuaW1wb3J0IHsgZGVmYXVsdE1hbmFnZXJzIH0gZnJvbSAnLi9kb20vYXR0cmlidXRlLW1hbmFnZXJzJztcbmltcG9ydCB7IGFzc2VydCwgZW5zdXJlR3VpZCwgZXhwZWN0IH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBTY29wZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLy8gdGhlIDB0aCBzbG90IGlzIGBzZWxmYFxuICAgIHNsb3RzLCBjYWxsZXJTY29wZSxcbiAgICAvLyBuYW1lZCBhcmd1bWVudHMgYW5kIGJsb2NrcyBwYXNzZWQgdG8gYSBsYXlvdXQgdGhhdCB1c2VzIGV2YWxcbiAgICBldmFsU2NvcGUsXG4gICAgLy8gbG9jYWxzIGluIHNjb3BlIHdoZW4gdGhlIHBhcnRpYWwgd2FzIGludm9rZWRcbiAgICBwYXJ0aWFsTWFwKSB7XG4gICAgICAgIHRoaXMuc2xvdHMgPSBzbG90cztcbiAgICAgICAgdGhpcy5jYWxsZXJTY29wZSA9IGNhbGxlclNjb3BlO1xuICAgICAgICB0aGlzLmV2YWxTY29wZSA9IGV2YWxTY29wZTtcbiAgICAgICAgdGhpcy5wYXJ0aWFsTWFwID0gcGFydGlhbE1hcDtcbiAgICB9XG4gICAgc3RhdGljIHJvb3Qoc2VsZiwgc2l6ZSA9IDApIHtcbiAgICAgICAgbGV0IHJlZnMgPSBuZXcgQXJyYXkoc2l6ZSArIDEpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBzaXplOyBpKyspIHtcbiAgICAgICAgICAgIHJlZnNbaV0gPSBVTkRFRklORURfUkVGRVJFTkNFO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgU2NvcGUocmVmcywgbnVsbCwgbnVsbCwgbnVsbCkuaW5pdCh7IHNlbGYgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBzaXplZChzaXplID0gMCkge1xuICAgICAgICBsZXQgcmVmcyA9IG5ldyBBcnJheShzaXplICsgMSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHNpemU7IGkrKykge1xuICAgICAgICAgICAgcmVmc1tpXSA9IFVOREVGSU5FRF9SRUZFUkVOQ0U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTY29wZShyZWZzLCBudWxsLCBudWxsLCBudWxsKTtcbiAgICB9XG4gICAgaW5pdCh7IHNlbGYgfSkge1xuICAgICAgICB0aGlzLnNsb3RzWzBdID0gc2VsZjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGdldFNlbGYoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldCgwKTtcbiAgICB9XG4gICAgZ2V0U3ltYm9sKHN5bWJvbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXQoc3ltYm9sKTtcbiAgICB9XG4gICAgZ2V0QmxvY2soc3ltYm9sKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldChzeW1ib2wpO1xuICAgIH1cbiAgICBnZXRFdmFsU2NvcGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV2YWxTY29wZTtcbiAgICB9XG4gICAgZ2V0UGFydGlhbE1hcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGlhbE1hcDtcbiAgICB9XG4gICAgYmluZChzeW1ib2wsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0KHN5bWJvbCwgdmFsdWUpO1xuICAgIH1cbiAgICBiaW5kU2VsZihzZWxmKSB7XG4gICAgICAgIHRoaXMuc2V0KDAsIHNlbGYpO1xuICAgIH1cbiAgICBiaW5kU3ltYm9sKHN5bWJvbCwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5zZXQoc3ltYm9sLCB2YWx1ZSk7XG4gICAgfVxuICAgIGJpbmRCbG9jayhzeW1ib2wsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0KHN5bWJvbCwgdmFsdWUpO1xuICAgIH1cbiAgICBiaW5kRXZhbFNjb3BlKG1hcCkge1xuICAgICAgICB0aGlzLmV2YWxTY29wZSA9IG1hcDtcbiAgICB9XG4gICAgYmluZFBhcnRpYWxNYXAobWFwKSB7XG4gICAgICAgIHRoaXMucGFydGlhbE1hcCA9IG1hcDtcbiAgICB9XG4gICAgYmluZENhbGxlclNjb3BlKHNjb3BlKSB7XG4gICAgICAgIHRoaXMuY2FsbGVyU2NvcGUgPSBzY29wZTtcbiAgICB9XG4gICAgZ2V0Q2FsbGVyU2NvcGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxlclNjb3BlO1xuICAgIH1cbiAgICBjaGlsZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTY29wZSh0aGlzLnNsb3RzLnNsaWNlKCksIHRoaXMuY2FsbGVyU2NvcGUsIHRoaXMuZXZhbFNjb3BlLCB0aGlzLnBhcnRpYWxNYXApO1xuICAgIH1cbiAgICBnZXQoaW5kZXgpIHtcbiAgICAgICAgaWYgKGluZGV4ID49IHRoaXMuc2xvdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQlVHOiBjYW5ub3QgZ2V0ICQke2luZGV4fSBmcm9tIHNjb3BlOyBsZW5ndGg9JHt0aGlzLnNsb3RzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zbG90c1tpbmRleF07XG4gICAgfVxuICAgIHNldChpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGluZGV4ID49IHRoaXMuc2xvdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQlVHOiBjYW5ub3QgZ2V0ICQke2luZGV4fSBmcm9tIHNjb3BlOyBsZW5ndGg9JHt0aGlzLnNsb3RzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNsb3RzW2luZGV4XSA9IHZhbHVlO1xuICAgIH1cbn1cbmNsYXNzIFRyYW5zYWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZWRJbnN0YWxsTWFuYWdlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZWRJbnN0YWxsTW9kaWZpZXJzID0gW107XG4gICAgICAgIHRoaXMuc2NoZWR1bGVkVXBkYXRlTW9kaWZpZXJNYW5hZ2VycyA9IFtdO1xuICAgICAgICB0aGlzLnNjaGVkdWxlZFVwZGF0ZU1vZGlmaWVycyA9IFtdO1xuICAgICAgICB0aGlzLmNyZWF0ZWRDb21wb25lbnRzID0gW107XG4gICAgICAgIHRoaXMuY3JlYXRlZE1hbmFnZXJzID0gW107XG4gICAgICAgIHRoaXMudXBkYXRlZENvbXBvbmVudHMgPSBbXTtcbiAgICAgICAgdGhpcy51cGRhdGVkTWFuYWdlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5kZXN0cnVjdG9ycyA9IFtdO1xuICAgIH1cbiAgICBkaWRDcmVhdGUoY29tcG9uZW50LCBtYW5hZ2VyKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlZENvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICAgICAgICB0aGlzLmNyZWF0ZWRNYW5hZ2Vycy5wdXNoKG1hbmFnZXIpO1xuICAgIH1cbiAgICBkaWRVcGRhdGUoY29tcG9uZW50LCBtYW5hZ2VyKSB7XG4gICAgICAgIHRoaXMudXBkYXRlZENvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICAgICAgICB0aGlzLnVwZGF0ZWRNYW5hZ2Vycy5wdXNoKG1hbmFnZXIpO1xuICAgIH1cbiAgICBzY2hlZHVsZUluc3RhbGxNb2RpZmllcihtb2RpZmllciwgbWFuYWdlcikge1xuICAgICAgICB0aGlzLnNjaGVkdWxlZEluc3RhbGxNYW5hZ2Vycy5wdXNoKG1hbmFnZXIpO1xuICAgICAgICB0aGlzLnNjaGVkdWxlZEluc3RhbGxNb2RpZmllcnMucHVzaChtb2RpZmllcik7XG4gICAgfVxuICAgIHNjaGVkdWxlVXBkYXRlTW9kaWZpZXIobW9kaWZpZXIsIG1hbmFnZXIpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZWRVcGRhdGVNb2RpZmllck1hbmFnZXJzLnB1c2gobWFuYWdlcik7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVkVXBkYXRlTW9kaWZpZXJzLnB1c2gobW9kaWZpZXIpO1xuICAgIH1cbiAgICBkaWREZXN0cm95KGQpIHtcbiAgICAgICAgdGhpcy5kZXN0cnVjdG9ycy5wdXNoKGQpO1xuICAgIH1cbiAgICBjb21taXQoKSB7XG4gICAgICAgIGxldCB7IGNyZWF0ZWRDb21wb25lbnRzLCBjcmVhdGVkTWFuYWdlcnMgfSA9IHRoaXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3JlYXRlZENvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjb21wb25lbnQgPSBjcmVhdGVkQ29tcG9uZW50c1tpXTtcbiAgICAgICAgICAgIGxldCBtYW5hZ2VyID0gY3JlYXRlZE1hbmFnZXJzW2ldO1xuICAgICAgICAgICAgbWFuYWdlci5kaWRDcmVhdGUoY29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyB1cGRhdGVkQ29tcG9uZW50cywgdXBkYXRlZE1hbmFnZXJzIH0gPSB0aGlzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVwZGF0ZWRDb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY29tcG9uZW50ID0gdXBkYXRlZENvbXBvbmVudHNbaV07XG4gICAgICAgICAgICBsZXQgbWFuYWdlciA9IHVwZGF0ZWRNYW5hZ2Vyc1tpXTtcbiAgICAgICAgICAgIG1hbmFnZXIuZGlkVXBkYXRlKGNvbXBvbmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHsgZGVzdHJ1Y3RvcnMgfSA9IHRoaXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVzdHJ1Y3RvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGRlc3RydWN0b3JzW2ldLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyBzY2hlZHVsZWRJbnN0YWxsTWFuYWdlcnMsIHNjaGVkdWxlZEluc3RhbGxNb2RpZmllcnMgfSA9IHRoaXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZWR1bGVkSW5zdGFsbE1hbmFnZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbWFuYWdlciA9IHNjaGVkdWxlZEluc3RhbGxNYW5hZ2Vyc1tpXTtcbiAgICAgICAgICAgIGxldCBtb2RpZmllciA9IHNjaGVkdWxlZEluc3RhbGxNb2RpZmllcnNbaV07XG4gICAgICAgICAgICBtYW5hZ2VyLmluc3RhbGwobW9kaWZpZXIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCB7IHNjaGVkdWxlZFVwZGF0ZU1vZGlmaWVyTWFuYWdlcnMsIHNjaGVkdWxlZFVwZGF0ZU1vZGlmaWVycyB9ID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlZHVsZWRVcGRhdGVNb2RpZmllck1hbmFnZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbWFuYWdlciA9IHNjaGVkdWxlZFVwZGF0ZU1vZGlmaWVyTWFuYWdlcnNbaV07XG4gICAgICAgICAgICBsZXQgbW9kaWZpZXIgPSBzY2hlZHVsZWRVcGRhdGVNb2RpZmllcnNbaV07XG4gICAgICAgICAgICBtYW5hZ2VyLnVwZGF0ZShtb2RpZmllcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgY2xhc3MgT3Bjb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihoZWFwKSB7XG4gICAgICAgIHRoaXMuaGVhcCA9IGhlYXA7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgZ2V0IHR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlYXAuZ2V0YnlhZGRyKHRoaXMub2Zmc2V0KTtcbiAgICB9XG4gICAgZ2V0IG9wMSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhcC5nZXRieWFkZHIodGhpcy5vZmZzZXQgKyAxKTtcbiAgICB9XG4gICAgZ2V0IG9wMigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhcC5nZXRieWFkZHIodGhpcy5vZmZzZXQgKyAyKTtcbiAgICB9XG4gICAgZ2V0IG9wMygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhcC5nZXRieWFkZHIodGhpcy5vZmZzZXQgKyAzKTtcbiAgICB9XG59XG52YXIgVGFibGVTbG90U3RhdGU7XG4oZnVuY3Rpb24gKFRhYmxlU2xvdFN0YXRlKSB7XG4gICAgVGFibGVTbG90U3RhdGVbVGFibGVTbG90U3RhdGVbXCJBbGxvY2F0ZWRcIl0gPSAwXSA9IFwiQWxsb2NhdGVkXCI7XG4gICAgVGFibGVTbG90U3RhdGVbVGFibGVTbG90U3RhdGVbXCJGcmVlZFwiXSA9IDFdID0gXCJGcmVlZFwiO1xuICAgIFRhYmxlU2xvdFN0YXRlW1RhYmxlU2xvdFN0YXRlW1wiUHVyZ2VkXCJdID0gMl0gPSBcIlB1cmdlZFwiO1xuICAgIFRhYmxlU2xvdFN0YXRlW1RhYmxlU2xvdFN0YXRlW1wiUG9pbnRlclwiXSA9IDNdID0gXCJQb2ludGVyXCI7XG59KShUYWJsZVNsb3RTdGF0ZSB8fCAoVGFibGVTbG90U3RhdGUgPSB7fSkpO1xuZXhwb3J0IGNsYXNzIEhlYXAge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmhlYXAgPSBbXTtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSAwO1xuICAgICAgICB0aGlzLmhhbmRsZSA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBsYXlvdXQ6XG4gICAgICAgICAqXG4gICAgICAgICAqIC0gcG9pbnRlciBpbnRvIGhlYXBcbiAgICAgICAgICogLSBzaXplXG4gICAgICAgICAqIC0gZnJlZWQgKDAgb3IgMSlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGFibGUgPSBbXTtcbiAgICB9XG4gICAgcHVzaChpdGVtKSB7XG4gICAgICAgIHRoaXMuaGVhcFt0aGlzLm9mZnNldCsrXSA9IGl0ZW07XG4gICAgfVxuICAgIGdldGJ5YWRkcihhZGRyZXNzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlYXBbYWRkcmVzc107XG4gICAgfVxuICAgIHNldGJ5YWRkcihhZGRyZXNzLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmhlYXBbYWRkcmVzc10gPSB2YWx1ZTtcbiAgICB9XG4gICAgbWFsbG9jKCkge1xuICAgICAgICB0aGlzLnRhYmxlLnB1c2godGhpcy5vZmZzZXQsIDAsIDApO1xuICAgICAgICBsZXQgaGFuZGxlID0gdGhpcy5oYW5kbGU7XG4gICAgICAgIHRoaXMuaGFuZGxlICs9IDM7XG4gICAgICAgIHJldHVybiBoYW5kbGU7XG4gICAgfVxuICAgIGZpbmlzaE1hbGxvYyhoYW5kbGUpIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy50YWJsZVtoYW5kbGVdO1xuICAgICAgICBsZXQgZmluaXNoID0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIHRoaXMudGFibGVbaGFuZGxlICsgMV0gPSBmaW5pc2ggLSBzdGFydDtcbiAgICB9XG4gICAgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0O1xuICAgIH1cbiAgICAvLyBJdCBpcyBpbGxlZ2FsIHRvIGNsb3NlIG92ZXIgdGhpcyBhZGRyZXNzLCBhcyBjb21wYWN0aW9uXG4gICAgLy8gbWF5IG1vdmUgaXQuIEhvd2V2ZXIsIGl0IGlzIGxlZ2FsIHRvIHVzZSB0aGlzIGFkZHJlc3NcbiAgICAvLyBtdWx0aXBsZSB0aW1lcyBiZXR3ZWVuIGNvbXBhY3Rpb25zLlxuICAgIGdldGFkZHIoaGFuZGxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlW2hhbmRsZV07XG4gICAgfVxuICAgIGdldGhhbmRsZShhZGRyZXNzKSB7XG4gICAgICAgIHRoaXMudGFibGUucHVzaChhZGRyZXNzLCAwLCBUYWJsZVNsb3RTdGF0ZS5Qb2ludGVyKTtcbiAgICAgICAgbGV0IGhhbmRsZSA9IHRoaXMuaGFuZGxlO1xuICAgICAgICB0aGlzLmhhbmRsZSArPSAzO1xuICAgICAgICByZXR1cm4gaGFuZGxlO1xuICAgIH1cbiAgICBzaXplb2YoaGFuZGxlKSB7XG4gICAgICAgIGlmIChmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGFibGVbaGFuZGxlICsgMV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBmcmVlKGhhbmRsZSkge1xuICAgICAgICB0aGlzLnRhYmxlW2hhbmRsZSArIDJdID0gMTtcbiAgICB9XG4gICAgY29tcGFjdCgpIHtcbiAgICAgICAgbGV0IGNvbXBhY3RlZFNpemUgPSAwO1xuICAgICAgICBsZXQgeyB0YWJsZSwgdGFibGU6IHsgbGVuZ3RoIH0sIGhlYXAgfSA9IHRoaXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgIGxldCBvZmZzZXQgPSB0YWJsZVtpXTtcbiAgICAgICAgICAgIGxldCBzaXplID0gdGFibGVbaSArIDFdO1xuICAgICAgICAgICAgbGV0IHN0YXRlID0gdGFibGVbaSArIDJdO1xuICAgICAgICAgICAgaWYgKHN0YXRlID09PSBUYWJsZVNsb3RTdGF0ZS5QdXJnZWQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IFRhYmxlU2xvdFN0YXRlLkZyZWVkKSB7XG4gICAgICAgICAgICAgICAgLy8gdHJhbnNpdGlvbiB0byBcImFscmVhZHkgZnJlZWRcIlxuICAgICAgICAgICAgICAgIC8vIGEgZ29vZCBpbXByb3ZlbWVudCB3b3VsZCBiZSB0byByZXVzZVxuICAgICAgICAgICAgICAgIC8vIHRoZXNlIHNsb3RzXG4gICAgICAgICAgICAgICAgdGFibGVbaSArIDJdID0gMjtcbiAgICAgICAgICAgICAgICBjb21wYWN0ZWRTaXplICs9IHNpemU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBUYWJsZVNsb3RTdGF0ZS5BbGxvY2F0ZWQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gb2Zmc2V0OyBqIDw9IGkgKyBzaXplOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhcFtqIC0gY29tcGFjdGVkU2l6ZV0gPSBoZWFwW2pdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0YWJsZVtpXSA9IG9mZnNldCAtIGNvbXBhY3RlZFNpemU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBUYWJsZVNsb3RTdGF0ZS5Qb2ludGVyKSB7XG4gICAgICAgICAgICAgICAgdGFibGVbaV0gPSBvZmZzZXQgLSBjb21wYWN0ZWRTaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gdGhpcy5vZmZzZXQgLSBjb21wYWN0ZWRTaXplO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5oZWFwID0gbmV3IEhlYXAoKTtcbiAgICAgICAgdGhpcy5fb3Bjb2RlID0gbmV3IE9wY29kZSh0aGlzLmhlYXApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cyA9IG5ldyBDb25zdGFudHMoKTtcbiAgICB9XG4gICAgb3Bjb2RlKG9mZnNldCkge1xuICAgICAgICB0aGlzLl9vcGNvZGUub2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICByZXR1cm4gdGhpcy5fb3Bjb2RlO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBFbnZpcm9ubWVudCB7XG4gICAgY29uc3RydWN0b3IoeyBhcHBlbmRPcGVyYXRpb25zLCB1cGRhdGVPcGVyYXRpb25zIH0pIHtcbiAgICAgICAgdGhpcy5fbWFjcm9zID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb24gPSBudWxsO1xuICAgICAgICB0aGlzLnByb2dyYW0gPSBuZXcgUHJvZ3JhbSgpO1xuICAgICAgICB0aGlzLmFwcGVuZE9wZXJhdGlvbnMgPSBhcHBlbmRPcGVyYXRpb25zO1xuICAgICAgICB0aGlzLnVwZGF0ZU9wZXJhdGlvbnMgPSB1cGRhdGVPcGVyYXRpb25zO1xuICAgIH1cbiAgICB0b0NvbmRpdGlvbmFsUmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgICAgICByZXR1cm4gbmV3IENvbmRpdGlvbmFsUmVmZXJlbmNlKHJlZmVyZW5jZSk7XG4gICAgfVxuICAgIGdldEFwcGVuZE9wZXJhdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcGVuZE9wZXJhdGlvbnM7XG4gICAgfVxuICAgIGdldERPTSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlT3BlcmF0aW9ucztcbiAgICB9XG4gICAgZ2V0SWRlbnRpdHkob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBlbnN1cmVHdWlkKG9iamVjdCkgKyAnJztcbiAgICB9XG4gICAgYmVnaW4oKSB7XG4gICAgICAgIGFzc2VydCghdGhpcy5fdHJhbnNhY3Rpb24sICdhIGdsaW1tZXIgdHJhbnNhY3Rpb24gd2FzIGJlZ3VuLCBidXQgb25lIGFscmVhZHkgZXhpc3RzLiBZb3UgbWF5IGhhdmUgYSBuZXN0ZWQgdHJhbnNhY3Rpb24nKTtcbiAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oKTtcbiAgICB9XG4gICAgZ2V0IHRyYW5zYWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gZXhwZWN0KHRoaXMuX3RyYW5zYWN0aW9uLCAnbXVzdCBiZSBpbiBhIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIGRpZENyZWF0ZShjb21wb25lbnQsIG1hbmFnZXIpIHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbi5kaWRDcmVhdGUoY29tcG9uZW50LCBtYW5hZ2VyKTtcbiAgICB9XG4gICAgZGlkVXBkYXRlKGNvbXBvbmVudCwgbWFuYWdlcikge1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uLmRpZFVwZGF0ZShjb21wb25lbnQsIG1hbmFnZXIpO1xuICAgIH1cbiAgICBzY2hlZHVsZUluc3RhbGxNb2RpZmllcihtb2RpZmllciwgbWFuYWdlcikge1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uLnNjaGVkdWxlSW5zdGFsbE1vZGlmaWVyKG1vZGlmaWVyLCBtYW5hZ2VyKTtcbiAgICB9XG4gICAgc2NoZWR1bGVVcGRhdGVNb2RpZmllcihtb2RpZmllciwgbWFuYWdlcikge1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uLnNjaGVkdWxlVXBkYXRlTW9kaWZpZXIobW9kaWZpZXIsIG1hbmFnZXIpO1xuICAgIH1cbiAgICBkaWREZXN0cm95KGQpIHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbi5kaWREZXN0cm95KGQpO1xuICAgIH1cbiAgICBjb21taXQoKSB7XG4gICAgICAgIGxldCB0cmFuc2FjdGlvbiA9IHRoaXMudHJhbnNhY3Rpb247XG4gICAgICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gbnVsbDtcbiAgICAgICAgdHJhbnNhY3Rpb24uY29tbWl0KCk7XG4gICAgfVxuICAgIGF0dHJpYnV0ZUZvcihlbGVtZW50LCBhdHRyLCBpc1RydXN0aW5nLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRNYW5hZ2VycyhlbGVtZW50LCBhdHRyLCBpc1RydXN0aW5nLCBuYW1lc3BhY2UgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBuYW1lc3BhY2UpO1xuICAgIH1cbiAgICBtYWNyb3MoKSB7XG4gICAgICAgIGxldCBtYWNyb3MgPSB0aGlzLl9tYWNyb3M7XG4gICAgICAgIGlmICghbWFjcm9zKSB7XG4gICAgICAgICAgICB0aGlzLl9tYWNyb3MgPSBtYWNyb3MgPSB0aGlzLnBvcHVsYXRlQnVpbHRpbnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWFjcm9zO1xuICAgIH1cbiAgICBwb3B1bGF0ZUJ1aWx0aW5zKCkge1xuICAgICAgICByZXR1cm4gcG9wdWxhdGVCdWlsdGlucygpO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IEVudmlyb25tZW50OyJdfQ==