objection
Version:
An SQL-friendly ORM for Node.js
777 lines (602 loc) • 68.3 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = undefined;
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _create = require('babel-runtime/core-js/object/create');
var _create2 = _interopRequireDefault(_create);
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _bluebird = require('bluebird');
var _bluebird2 = _interopRequireDefault(_bluebird);
var _EagerOperation2 = require('./EagerOperation');
var _EagerOperation3 = _interopRequireDefault(_EagerOperation2);
var _ValidationError = require('../../model/ValidationError');
var _ValidationError2 = _interopRequireDefault(_ValidationError);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var columnInfo = (0, _create2.default)(null);
var idLengthLimit = 63;
var relationRecursionLimit = 64;
var JoinEagerOperation = function (_EagerOperation) {
(0, _inherits3.default)(JoinEagerOperation, _EagerOperation);
function JoinEagerOperation(name, opt) {
(0, _classCallCheck3.default)(this, JoinEagerOperation);
var _this = (0, _possibleConstructorReturn3.default)(this, _EagerOperation.call(this, name, opt));
_this.allRelations = null;
_this.rootModelClass = null;
_this.pathInfo = (0, _create2.default)(null);
_this.encodings = (0, _create2.default)(null);
_this.decodings = (0, _create2.default)(null);
_this.encIdx = 0;
_this.opt = _lodash2.default.defaults(opt, {
minimize: false,
separator: ':',
aliases: {}
});
return _this;
}
JoinEagerOperation.prototype.clone = function clone() {
var copy = _EagerOperation.prototype.clone.call(this);
copy.allRelations = this.allRelations;
copy.allModelClasses = this.allModelClasses;
copy.rootModelClass = this.rootModelClass;
copy.pathInfo = this.pathInfo;
copy.encodings = this.encodings;
copy.decodings = this.decodings;
copy.encIdx = this.encIdx;
return this;
};
JoinEagerOperation.prototype.call = function call(builder, args) {
var ret = _EagerOperation.prototype.call.call(this, builder, args);
var ModelClass = builder.modelClass();
if (ret) {
this.rootModelClass = ModelClass;
this.allModelClasses = findAllModels(this.expression, ModelClass);
this.allRelations = findAllRelations(this.expression, ModelClass);
}
return ret;
};
JoinEagerOperation.prototype.onBeforeInternal = function onBeforeInternal(builder) {
return fetchColumnInfo(builder, this.allModelClasses);
};
JoinEagerOperation.prototype.onBeforeBuild = function onBeforeBuild(builder) {
var builderClone = builder.clone();
builder.table(this.rootModelClass.tableName + ' as ' + this.rootModelClass.tableName);
builder.findOptions({ callAfterGetDeeply: true });
this.build({
expr: this.expression,
builder: builder,
modelClass: builder.modelClass(),
parentInfo: null,
relation: null,
path: '',
selectFilter: function selectFilter(col) {
return builderClone.hasSelection(col);
}
});
};
JoinEagerOperation.prototype.onRawResult = function onRawResult(builder, rows) {
if (_lodash2.default.isEmpty(rows)) {
return rows;
}
var keyInfoByPath = this.createKeyInfo(rows);
var pathInfo = _lodash2.default.values(this.pathInfo);
var tree = (0, _create2.default)(null);
var stack = (0, _create2.default)(null);
for (var i = 0, lr = rows.length; i < lr; ++i) {
var row = rows[i];
var curBranch = tree;
for (var j = 0, lp = pathInfo.length; j < lp; ++j) {
var pInfo = pathInfo[j];
var id = pInfo.idGetter(row);
if (!id) {
continue;
}
if (pInfo.relation) {
var parentModel = stack[pInfo.encParentPath];
curBranch = pInfo.getBranch(parentModel);
if (!curBranch) {
curBranch = pInfo.createBranch(parentModel);
}
}
var model = pInfo.getModelFromBranch(curBranch, id);
if (!model) {
model = createModel(row, pInfo, keyInfoByPath);
pInfo.setModelToBranch(curBranch, id, model);
}
stack[pInfo.encPath] = model;
}
}
return this.finalize(pathInfo[0], _lodash2.default.values(tree));
};
JoinEagerOperation.prototype.createKeyInfo = function createKeyInfo(rows) {
var keys = (0, _keys2.default)(rows[0]);
var keyInfo = [];
for (var i = 0, l = keys.length; i < l; ++i) {
var key = keys[i];
var sepIdx = key.lastIndexOf(this.sep);
if (sepIdx === -1) {
var pInfo = this.pathInfo[''];
var col = key;
if (!pInfo.omitProps[col]) {
keyInfo.push({
pInfo: pInfo,
key: key,
col: col
});
}
} else {
var encPath = key.substr(0, sepIdx);
var path = this.decode(encPath);
var _col = key.substr(sepIdx + 1);
var _pInfo = this.pathInfo[path];
if (!_pInfo.omitProps[_col]) {
keyInfo.push({
pInfo: _pInfo,
key: key,
col: _col
});
}
}
}
return _lodash2.default.groupBy(keyInfo, function (kInfo) {
return kInfo.pInfo.encPath;
});
};
JoinEagerOperation.prototype.finalize = function finalize(pInfo, models) {
var relNames = (0, _keys2.default)(pInfo.children);
if (Array.isArray(models)) {
for (var m = 0, lm = models.length; m < lm; ++m) {
this.finalizeOne(pInfo, relNames, models[m]);
}
} else if (models) {
this.finalizeOne(pInfo, relNames, models);
}
return models;
};
JoinEagerOperation.prototype.finalizeOne = function finalizeOne(pInfo, relNames, model) {
for (var r = 0, lr = relNames.length; r < lr; ++r) {
var relName = relNames[r];
var branch = model[relName];
var childPathInfo = pInfo.children[relName];
var finalized = childPathInfo.finalizeBranch(branch, model);
this.finalize(childPathInfo, finalized);
}
};
JoinEagerOperation.prototype.build = function build(_ref) {
var _this2 = this;
var expr = _ref.expr,
builder = _ref.builder,
selectFilter = _ref.selectFilter,
modelClass = _ref.modelClass,
relation = _ref.relation,
path = _ref.path,
parentInfo = _ref.parentInfo;
var info = this.createPathInfo({
modelClass: modelClass,
path: path,
relation: relation,
parentInfo: parentInfo
});
this.pathInfo[path] = info;
this.buildSelects({
builder: builder,
selectFilter: selectFilter,
modelClass: modelClass,
relation: relation,
info: info
});
forEachExpr(expr, modelClass, function (childExpr, relation) {
var nextPath = _this2.joinPath(path, relation.name);
var encNextPath = _this2.encode(nextPath);
var encJoinTablePath = relation.joinTable ? _this2.encode(joinTableForPath(nextPath)) : null;
var filterQuery = createFilterQuery({
builder: builder,
relation: relation,
expr: childExpr
});
var relatedJoinSelectQuery = createRelatedJoinFromQuery({
filterQuery: filterQuery,
relation: relation,
allRelations: _this2.allRelations
});
relation.join(builder, {
joinOperation: 'leftJoin',
ownerTable: info.encPath,
relatedTableAlias: encNextPath,
joinTableAlias: encJoinTablePath,
relatedJoinSelectQuery: relatedJoinSelectQuery
});
// Apply relation.modify since it may also contains selections. Don't move this
// to the createFilterQuery function because relatedJoinSelectQuery is cloned
// From the return value of that function and we don't want relation.modify
// to be called twice for it.
filterQuery.modify(relation.modify);
_this2.build({
expr: childExpr,
builder: builder,
modelClass: relation.relatedModelClass,
relation: relation,
parentInfo: info,
path: nextPath,
selectFilter: function selectFilter(col) {
return filterQuery.hasSelection(col);
}
});
});
};
JoinEagerOperation.prototype.createPathInfo = function createPathInfo(_ref2) {
var modelClass = _ref2.modelClass,
path = _ref2.path,
relation = _ref2.relation,
parentInfo = _ref2.parentInfo;
var encPath = this.encode(path);
var info = void 0;
if (relation && relation.isOneToOne()) {
info = new OneToOnePathInfo();
} else {
info = new PathInfo();
}
info.path = path;
info.encPath = encPath;
info.parentPath = parentInfo && parentInfo.path;
info.encParentPath = parentInfo && parentInfo.encPath;
info.modelClass = modelClass;
info.relation = relation;
info.idGetter = this.createIdGetter(modelClass, encPath);
if (parentInfo) {
parentInfo.children[relation.name] = info;
}
return info;
};
JoinEagerOperation.prototype.buildSelects = function buildSelects(_ref3) {
var _this3 = this;
var builder = _ref3.builder,
selectFilter = _ref3.selectFilter,
modelClass = _ref3.modelClass,
relation = _ref3.relation,
info = _ref3.info;
var selects = [];
var idCols = modelClass.getIdColumnArray();
var rootTable = this.rootModelClass.tableName;
columnInfo[modelClass.tableName].columns.forEach(function (col) {
var filterPassed = selectFilter(col);
var isIdColumn = idCols.indexOf(col) !== -1;
if (filterPassed || isIdColumn) {
selects.push({
col: (info.encPath || rootTable) + '.' + col,
alias: _this3.joinPath(info.encPath, col)
});
if (!filterPassed) {
info.omitProps[col] = true;
}
}
});
if (relation && relation.joinTableExtras) {
var joinTable = this.encode(joinTableForPath(info.path));
relation.joinTableExtras.forEach(function (extra) {
if (selectFilter(extra.joinTableCol)) {
selects.push({
col: joinTable + '.' + extra.joinTableCol,
alias: _this3.joinPath(info.encPath, extra.aliasCol)
});
}
});
}
var tooLongAliases = selects.filter(function (select) {
return select.alias.length > idLengthLimit;
});
if (tooLongAliases.length) {
throw new _ValidationError2.default({
eager: 'identifier ' + tooLongAliases[0].alias + ' is over ' + idLengthLimit + ' characters long ' + 'and would be truncated by the database engine.'
});
}
builder.select(selects.map(function (select) {
return select.col + ' as ' + select.alias;
}));
};
JoinEagerOperation.prototype.encode = function encode(path) {
var _this4 = this;
if (!this.opt.minimize) {
var encPath = this.encodings[path];
if (!encPath) {
var parts = path.split(this.sep);
// Don't encode the root.
if (!path) {
encPath = path;
} else {
encPath = parts.map(function (part) {
return _this4.opt.aliases[part] || part;
}).join(this.sep);
}
this.encodings[path] = encPath;
this.decodings[encPath] = path;
}
return encPath;
} else {
var _encPath = this.encodings[path];
if (!_encPath) {
// Don't encode the root.
if (!path) {
_encPath = path;
} else {
_encPath = this.nextEncodedPath();
}
this.encodings[path] = _encPath;
this.decodings[_encPath] = path;
}
return _encPath;
}
};
JoinEagerOperation.prototype.decode = function decode(path) {
return this.decodings[path];
};
JoinEagerOperation.prototype.nextEncodedPath = function nextEncodedPath() {
return '_t' + ++this.encIdx;
};
JoinEagerOperation.prototype.createIdGetter = function createIdGetter(modelClass, path) {
var _this5 = this;
var idCols = modelClass.getIdColumnArray().map(function (col) {
return _this5.joinPath(path, col);
});
if (idCols.length === 1) {
return createSingleIdGetter(idCols);
} else if (idCols.length === 2) {
return createTwoIdGetter(idCols);
} else if (idCols.length === 3) {
return createThreeIdGetter(idCols);
} else {
return createNIdGetter(idCols);
}
};
JoinEagerOperation.prototype.joinPath = function joinPath(path, nextPart) {
if (path) {
return '' + path + this.sep + nextPart;
} else {
return nextPart;
}
};
(0, _createClass3.default)(JoinEagerOperation, [{
key: 'sep',
get: function get() {
return this.opt.separator;
}
}]);
return JoinEagerOperation;
}(_EagerOperation3.default);
exports.default = JoinEagerOperation;
function findAllModels(expr, modelClass) {
var models = [];
findAllModelsImpl(expr, modelClass, models);
return _lodash2.default.uniqBy(models, 'tableName');
}
function findAllModelsImpl(expr, modelClass, models) {
models.push(modelClass);
forEachExpr(expr, modelClass, function (childExpr, relation) {
findAllModelsImpl(childExpr, relation.relatedModelClass, models);
});
}
function findAllRelations(expr, modelClass) {
var relations = [];
findAllRelationsImpl(expr, modelClass, relations);
return _lodash2.default.uniqWith(relations, function (lhs, rhs) {
return lhs === rhs;
});
}
function findAllRelationsImpl(expr, modelClass, relations) {
forEachExpr(expr, modelClass, function (childExpr, relation) {
relations.push(relation);
findAllRelationsImpl(childExpr, relation.relatedModelClass, relations);
});
}
function fetchColumnInfo(builder, models) {
var knex = builder.knex();
return _bluebird2.default.all(models.map(function (ModelClass) {
var table = ModelClass.tableName;
if (columnInfo[table]) {
return columnInfo[table];
} else {
columnInfo[table] = knex(table).columnInfo().then(function (info) {
var result = {
columns: (0, _keys2.default)(info)
};
columnInfo[table] = result;
return result;
});
return columnInfo[table];
}
}));
}
function forEachExpr(expr, modelClass, callback) {
var relations = modelClass.getRelationArray();
if (expr.isAllRecursive() || expr.maxRecursionDepth() > relationRecursionLimit) {
throw new _ValidationError2.default({
eager: 'recursion depth of eager expression ' + expr.toString() + ' too big for JoinEagerAlgorithm'
});
}
for (var i = 0, l = relations.length; i < l; ++i) {
var relation = relations[i];
var childExpr = expr.childExpression(relation.name);
if (childExpr) {
callback(childExpr, relation, relation.name);
}
}
}
function createSingleIdGetter(idCols) {
var idCol = idCols[0];
return function (row) {
var val = row[idCol];
if (!val) {
return null;
} else {
return val;
}
};
}
function createTwoIdGetter(idCols) {
var idCol1 = idCols[0];
var idCol2 = idCols[1];
return function (row) {
var val1 = row[idCol1];
var val2 = row[idCol2];
if (!val1 || !val2) {
return null;
} else {
return val1 + ',' + val2;
}
};
}
function createThreeIdGetter(idCols) {
var idCol1 = idCols[0];
var idCol2 = idCols[1];
var idCol3 = idCols[2];
return function (row) {
var val1 = row[idCol1];
var val2 = row[idCol2];
var val3 = row[idCol3];
if (!val1 || !val2 || !val3) {
return null;
} else {
return val1 + ',' + val2 + ',' + val3;
}
};
}
function createNIdGetter(idCols) {
return function (row) {
var id = '';
for (var i = 0, l = idCols.length; i < l; ++i) {
var val = row[idCols[i]];
if (!val) {
return null;
}
id += (i > 0 ? ',' : '') + val;
}
return id;
};
}
function createFilterQuery(_ref4) {
var builder = _ref4.builder,
expr = _ref4.expr,
relation = _ref4.relation;
var filterQuery = relation.relatedModelClass.query().childQueryOf(builder);
for (var i = 0, l = expr.args.length; i < l; ++i) {
var filterName = expr.args[i];
var filter = expr.filters[filterName];
if (typeof filter !== 'function') {
throw new _ValidationError2.default({ eager: 'could not find filter "' + filterName + '" for relation "' + relation.name + '"' });
}
filter(filterQuery);
}
return filterQuery;
}
function createRelatedJoinFromQuery(_ref5) {
var filterQuery = _ref5.filterQuery,
relation = _ref5.relation,
allRelations = _ref5.allRelations;
var relatedJoinFromQuery = filterQuery.clone();
var allForeignKeys = findAllForeignKeysForModel({
modelClass: relation.relatedModelClass,
allRelations: allRelations
});
return relatedJoinFromQuery.select(allForeignKeys.filter(function (col) {
return !relatedJoinFromQuery.hasSelection(col);
}));
}
function findAllForeignKeysForModel(_ref6) {
var modelClass = _ref6.modelClass,
allRelations = _ref6.allRelations;
var foreignKeys = modelClass.getIdColumnArray().slice();
allRelations.forEach(function (rel) {
if (rel.relatedModelClass.tableName === modelClass.tableName) {
rel.relatedCol.forEach(function (col) {
return foreignKeys.push(col);
});
}
if (rel.ownerModelClass.tableName === modelClass.tableName) {
rel.ownerCol.forEach(function (col) {
return foreignKeys.push(col);
});
}
});
return _lodash2.default.uniq(foreignKeys);
}
function createModel(row, pInfo, keyInfoByPath) {
var keyInfo = keyInfoByPath[pInfo.encPath];
var json = {};
for (var k = 0, lk = keyInfo.length; k < lk; ++k) {
var kInfo = keyInfo[k];
json[kInfo.col] = row[kInfo.key];
}
return pInfo.modelClass.fromDatabaseJson(json);
}
function joinTableForPath(path) {
return path + '_join';
}
var PathInfo = function () {
function PathInfo() {
(0, _classCallCheck3.default)(this, PathInfo);
this.path = null;
this.encPath = null;
this.encParentPath = null;
this.modelClass = null;
this.relation = null;
this.omitProps = (0, _create2.default)(null);
this.children = (0, _create2.default)(null);
this.idGetter = null;
}
PathInfo.prototype.createBranch = function createBranch(parentModel) {
var branch = (0, _create2.default)(null);
parentModel[this.relation.name] = branch;
return branch;
};
PathInfo.prototype.getBranch = function getBranch(parentModel) {
return parentModel[this.relation.name];
};
PathInfo.prototype.getModelFromBranch = function getModelFromBranch(branch, id) {
return branch[id];
};
PathInfo.prototype.setModelToBranch = function setModelToBranch(branch, id, model) {
branch[id] = model;
};
PathInfo.prototype.finalizeBranch = function finalizeBranch(branch, parentModel) {
var relModels = _lodash2.default.values(branch);
parentModel[this.relation.name] = relModels;
return relModels;
};
return PathInfo;
}();
var OneToOnePathInfo = function (_PathInfo) {
(0, _inherits3.default)(OneToOnePathInfo, _PathInfo);
function OneToOnePathInfo() {
(0, _classCallCheck3.default)(this, OneToOnePathInfo);
return (0, _possibleConstructorReturn3.default)(this, _PathInfo.apply(this, arguments));
}
OneToOnePathInfo.prototype.createBranch = function createBranch(parentModel) {
return parentModel;
};
OneToOnePathInfo.prototype.getBranch = function getBranch(parentModel) {
return parentModel;
};
OneToOnePathInfo.prototype.getModelFromBranch = function getModelFromBranch(branch, id) {
return branch[this.relation.name];
};
OneToOnePathInfo.prototype.setModelToBranch = function setModelToBranch(branch, id, model) {
branch[this.relation.name] = model;
};
OneToOnePathInfo.prototype.finalizeBranch = function finalizeBranch(branch, parentModel) {
parentModel[this.relation.name] = branch || null;
return branch || null;
};
return OneToOnePathInfo;
}(PathInfo);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkpvaW5FYWdlck9wZXJhdGlvbi5qcyJdLCJuYW1lcyI6WyJjb2x1bW5JbmZvIiwiaWRMZW5ndGhMaW1pdCIsInJlbGF0aW9uUmVjdXJzaW9uTGltaXQiLCJKb2luRWFnZXJPcGVyYXRpb24iLCJuYW1lIiwib3B0IiwiYWxsUmVsYXRpb25zIiwicm9vdE1vZGVsQ2xhc3MiLCJwYXRoSW5mbyIsImVuY29kaW5ncyIsImRlY29kaW5ncyIsImVuY0lkeCIsImRlZmF1bHRzIiwibWluaW1pemUiLCJzZXBhcmF0b3IiLCJhbGlhc2VzIiwiY2xvbmUiLCJjb3B5IiwiYWxsTW9kZWxDbGFzc2VzIiwiY2FsbCIsImJ1aWxkZXIiLCJhcmdzIiwicmV0IiwiTW9kZWxDbGFzcyIsIm1vZGVsQ2xhc3MiLCJmaW5kQWxsTW9kZWxzIiwiZXhwcmVzc2lvbiIsImZpbmRBbGxSZWxhdGlvbnMiLCJvbkJlZm9yZUludGVybmFsIiwiZmV0Y2hDb2x1bW5JbmZvIiwib25CZWZvcmVCdWlsZCIsImJ1aWxkZXJDbG9uZSIsInRhYmxlIiwidGFibGVOYW1lIiwiZmluZE9wdGlvbnMiLCJjYWxsQWZ0ZXJHZXREZWVwbHkiLCJidWlsZCIsImV4cHIiLCJwYXJlbnRJbmZvIiwicmVsYXRpb24iLCJwYXRoIiwic2VsZWN0RmlsdGVyIiwiY29sIiwiaGFzU2VsZWN0aW9uIiwib25SYXdSZXN1bHQiLCJyb3dzIiwiaXNFbXB0eSIsImtleUluZm9CeVBhdGgiLCJjcmVhdGVLZXlJbmZvIiwidmFsdWVzIiwidHJlZSIsInN0YWNrIiwiaSIsImxyIiwibGVuZ3RoIiwicm93IiwiY3VyQnJhbmNoIiwiaiIsImxwIiwicEluZm8iLCJpZCIsImlkR2V0dGVyIiwicGFyZW50TW9kZWwiLCJlbmNQYXJlbnRQYXRoIiwiZ2V0QnJhbmNoIiwiY3JlYXRlQnJhbmNoIiwibW9kZWwiLCJnZXRNb2RlbEZyb21CcmFuY2giLCJjcmVhdGVNb2RlbCIsInNldE1vZGVsVG9CcmFuY2giLCJlbmNQYXRoIiwiZmluYWxpemUiLCJrZXlzIiwia2V5SW5mbyIsImwiLCJrZXkiLCJzZXBJZHgiLCJsYXN0SW5kZXhPZiIsInNlcCIsIm9taXRQcm9wcyIsInB1c2giLCJzdWJzdHIiLCJkZWNvZGUiLCJncm91cEJ5Iiwia0luZm8iLCJtb2RlbHMiLCJyZWxOYW1lcyIsImNoaWxkcmVuIiwiQXJyYXkiLCJpc0FycmF5IiwibSIsImxtIiwiZmluYWxpemVPbmUiLCJyIiwicmVsTmFtZSIsImJyYW5jaCIsImNoaWxkUGF0aEluZm8iLCJmaW5hbGl6ZWQiLCJmaW5hbGl6ZUJyYW5jaCIsImluZm8iLCJjcmVhdGVQYXRoSW5mbyIsImJ1aWxkU2VsZWN0cyIsImZvckVhY2hFeHByIiwiY2hpbGRFeHByIiwibmV4dFBhdGgiLCJqb2luUGF0aCIsImVuY05leHRQYXRoIiwiZW5jb2RlIiwiZW5jSm9pblRhYmxlUGF0aCIsImpvaW5UYWJsZSIsImpvaW5UYWJsZUZvclBhdGgiLCJmaWx0ZXJRdWVyeSIsImNyZWF0ZUZpbHRlclF1ZXJ5IiwicmVsYXRlZEpvaW5TZWxlY3RRdWVyeSIsImNyZWF0ZVJlbGF0ZWRKb2luRnJvbVF1ZXJ5Iiwiam9pbiIsImpvaW5PcGVyYXRpb24iLCJvd25lclRhYmxlIiwicmVsYXRlZFRhYmxlQWxpYXMiLCJqb2luVGFibGVBbGlhcyIsIm1vZGlmeSIsInJlbGF0ZWRNb2RlbENsYXNzIiwiaXNPbmVUb09uZSIsIk9uZVRvT25lUGF0aEluZm8iLCJQYXRoSW5mbyIsInBhcmVudFBhdGgiLCJjcmVhdGVJZEdldHRlciIsInNlbGVjdHMiLCJpZENvbHMiLCJnZXRJZENvbHVtbkFycmF5Iiwicm9vdFRhYmxlIiwiY29sdW1ucyIsImZvckVhY2giLCJmaWx0ZXJQYXNzZWQiLCJpc0lkQ29sdW1uIiwiaW5kZXhPZiIsImFsaWFzIiwiam9pblRhYmxlRXh0cmFzIiwiZXh0cmEiLCJqb2luVGFibGVDb2wiLCJhbGlhc0NvbCIsInRvb0xvbmdBbGlhc2VzIiwiZmlsdGVyIiwic2VsZWN0IiwiZWFnZXIiLCJtYXAiLCJwYXJ0cyIsInNwbGl0IiwicGFydCIsIm5leHRFbmNvZGVkUGF0aCIsImNyZWF0ZVNpbmdsZUlkR2V0dGVyIiwiY3JlYXRlVHdvSWRHZXR0ZXIiLCJjcmVhdGVUaHJlZUlkR2V0dGVyIiwiY3JlYXRlTklkR2V0dGVyIiwibmV4dFBhcnQiLCJmaW5kQWxsTW9kZWxzSW1wbCIsInVuaXFCeSIsInJlbGF0aW9ucyIsImZpbmRBbGxSZWxhdGlvbnNJbXBsIiwidW5pcVdpdGgiLCJsaHMiLCJyaHMiLCJrbmV4IiwiYWxsIiwidGhlbiIsInJlc3VsdCIsImNhbGxiYWNrIiwiZ2V0UmVsYXRpb25BcnJheSIsImlzQWxsUmVjdXJzaXZlIiwibWF4UmVjdXJzaW9uRGVwdGgiLCJ0b1N0cmluZyIsImNoaWxkRXhwcmVzc2lvbiIsImlkQ29sIiwidmFsIiwiaWRDb2wxIiwiaWRDb2wyIiwidmFsMSIsInZhbDIiLCJpZENvbDMiLCJ2YWwzIiwicXVlcnkiLCJjaGlsZFF1ZXJ5T2YiLCJmaWx0ZXJOYW1lIiwiZmlsdGVycyIsInJlbGF0ZWRKb2luRnJvbVF1ZXJ5IiwiYWxsRm9yZWlnbktleXMiLCJmaW5kQWxsRm9yZWlnbktleXNGb3JNb2RlbCIsImZvcmVpZ25LZXlzIiwic2xpY2UiLCJyZWwiLCJyZWxhdGVkQ29sIiwib3duZXJNb2RlbENsYXNzIiwib3duZXJDb2wiLCJ1bmlxIiwianNvbiIsImsiLCJsayIsImZyb21EYXRhYmFzZUpzb24iLCJyZWxNb2RlbHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUEsSUFBTUEsYUFBYSxzQkFBYyxJQUFkLENBQW5CO0FBQ0EsSUFBTUMsZ0JBQWdCLEVBQXRCO0FBQ0EsSUFBTUMseUJBQXlCLEVBQS9COztJQUVxQkMsa0I7OztBQUVuQiw4QkFBWUMsSUFBWixFQUFrQkMsR0FBbEIsRUFBdUI7QUFBQTs7QUFBQSwrREFDckIsMkJBQU1ELElBQU4sRUFBWUMsR0FBWixDQURxQjs7QUFHckIsVUFBS0MsWUFBTCxHQUFvQixJQUFwQjtBQUNBLFVBQUtDLGNBQUwsR0FBc0IsSUFBdEI7QUFDQSxVQUFLQyxRQUFMLEdBQWdCLHNCQUFjLElBQWQsQ0FBaEI7QUFDQSxVQUFLQyxTQUFMLEdBQWlCLHNCQUFjLElBQWQsQ0FBakI7QUFDQSxVQUFLQyxTQUFMLEdBQWlCLHNCQUFjLElBQWQsQ0FBakI7QUFDQSxVQUFLQyxNQUFMLEdBQWMsQ0FBZDtBQUNBLFVBQUtOLEdBQUwsR0FBVyxpQkFBRU8sUUFBRixDQUFXUCxHQUFYLEVBQWdCO0FBQ3pCUSxnQkFBVSxLQURlO0FBRXpCQyxpQkFBVyxHQUZjO0FBR3pCQyxlQUFTO0FBSGdCLEtBQWhCLENBQVg7QUFUcUI7QUFjdEI7OytCQUVEQyxLLG9CQUFRO0FBQ04sUUFBTUMsT0FBTywwQkFBTUQsS0FBTixXQUFiOztBQUVBQyxTQUFLWCxZQUFMLEdBQW9CLEtBQUtBLFlBQXpCO0FBQ0FXLFNBQUtDLGVBQUwsR0FBdUIsS0FBS0EsZUFBNUI7QUFDQUQsU0FBS1YsY0FBTCxHQUFzQixLQUFLQSxjQUEzQjtBQUNBVSxTQUFLVCxRQUFMLEdBQWdCLEtBQUtBLFFBQXJCO0FBQ0FTLFNBQUtSLFNBQUwsR0FBaUIsS0FBS0EsU0FBdEI7QUFDQVEsU0FBS1AsU0FBTCxHQUFpQixLQUFLQSxTQUF0QjtBQUNBTyxTQUFLTixNQUFMLEdBQWMsS0FBS0EsTUFBbkI7O0FBRUEsV0FBTyxJQUFQO0FBQ0QsRzs7K0JBRURRLEksaUJBQUtDLE8sRUFBU0MsSSxFQUFNO0FBQ2xCLFFBQU1DLE1BQU0sMEJBQU1ILElBQU4sWUFBV0MsT0FBWCxFQUFvQkMsSUFBcEIsQ0FBWjtBQUNBLFFBQU1FLGFBQWFILFFBQVFJLFVBQVIsRUFBbkI7O0FBRUEsUUFBSUYsR0FBSixFQUFTO0FBQ1AsV0FBS2YsY0FBTCxHQUFzQmdCLFVBQXRCO0FBQ0EsV0FBS0wsZUFBTCxHQUF1Qk8sY0FBYyxLQUFLQyxVQUFuQixFQUErQkgsVUFBL0IsQ0FBdkI7QUFDQSxXQUFLakIsWUFBTCxHQUFvQnFCLGlCQUFpQixLQUFLRCxVQUF0QixFQUFrQ0gsVUFBbEMsQ0FBcEI7QUFDRDs7QUFFRCxXQUFPRCxHQUFQO0FBQ0QsRzs7K0JBRURNLGdCLDZCQUFpQlIsTyxFQUFTO0FBQ3hCLFdBQU9TLGdCQUFnQlQsT0FBaEIsRUFBeUIsS0FBS0YsZUFBOUIsQ0FBUDtBQUNELEc7OytCQUVEWSxhLDBCQUFjVixPLEVBQVM7QUFDckIsUUFBTVcsZUFBZVgsUUFBUUosS0FBUixFQUFyQjs7QUFFQUksWUFBUVksS0FBUixDQUFpQixLQUFLekIsY0FBTCxDQUFvQjBCLFNBQXJDLFlBQXFELEtBQUsxQixjQUFMLENBQW9CMEIsU0FBekU7QUFDQWIsWUFBUWMsV0FBUixDQUFvQixFQUFDQyxvQkFBb0IsSUFBckIsRUFBcEI7O0FBRUEsU0FBS0MsS0FBTCxDQUFXO0FBQ1RDLFlBQU0sS0FBS1gsVUFERjtBQUVUTixlQUFTQSxPQUZBO0FBR1RJLGtCQUFZSixRQUFRSSxVQUFSLEVBSEg7QUFJVGMsa0JBQVksSUFKSDtBQUtUQyxnQkFBVSxJQUxEO0FBTVRDLFlBQU0sRUFORztBQU9UQyxvQkFBYyxzQkFBQ0MsR0FBRCxFQUFTO0FBQ3JCLGVBQU9YLGFBQWFZLFlBQWIsQ0FBMEJELEdBQTFCLENBQVA7QUFDRDtBQVRRLEtBQVg7QUFXRCxHOzsrQkFFREUsVyx3QkFBWXhCLE8sRUFBU3lCLEksRUFBTTtBQUN6QixRQUFJLGlCQUFFQyxPQUFGLENBQVVELElBQVYsQ0FBSixFQUFxQjtBQUNuQixhQUFPQSxJQUFQO0FBQ0Q7O0FBRUQsUUFBTUUsZ0JBQWdCLEtBQUtDLGFBQUwsQ0FBbUJILElBQW5CLENBQXRCO0FBQ0EsUUFBTXJDLFdBQVcsaUJBQUV5QyxNQUFGLENBQVMsS0FBS3pDLFFBQWQsQ0FBakI7O0FBRUEsUUFBTTBDLE9BQU8sc0JBQWMsSUFBZCxDQUFiO0FBQ0EsUUFBTUMsUUFBUSxzQkFBYyxJQUFkLENBQWQ7O0FBRUEsU0FBSyxJQUFJQyxJQUFJLENBQVIsRUFBV0MsS0FBS1IsS0FBS1MsTUFBMUIsRUFBa0NGLElBQUlDLEVBQXRDLEVBQTBDLEVBQUVELENBQTVDLEVBQStDO0FBQzdDLFVBQU1HLE1BQU1WLEtBQUtPLENBQUwsQ0FBWjtBQUNBLFVBQUlJLFlBQVlOLElBQWhCOztBQUVBLFdBQUssSUFBSU8sSUFBSSxDQUFSLEVBQVdDLEtBQUtsRCxTQUFTOEMsTUFBOUIsRUFBc0NHLElBQUlDLEVBQTFDLEVBQThDLEVBQUVELENBQWhELEVBQW1EO0FBQ2pELFlBQU1FLFFBQVFuRCxTQUFTaUQsQ0FBVCxDQUFkO0FBQ0EsWUFBTUcsS0FBS0QsTUFBTUUsUUFBTixDQUFlTixHQUFmLENBQVg7O0FBRUEsWUFBSSxDQUFDSyxFQUFMLEVBQVM7QUFDUDtBQUNEOztBQUVELFlBQUlELE1BQU1wQixRQUFWLEVBQW9CO0FBQ2xCLGNBQU11QixjQUFjWCxNQUFNUSxNQUFNSSxhQUFaLENBQXBCOztBQUVBUCxzQkFBWUcsTUFBTUssU0FBTixDQUFnQkYsV0FBaEIsQ0FBWjs7QUFFQSxjQUFJLENBQUNOLFNBQUwsRUFBZ0I7QUFDZEEsd0JBQVlHLE1BQU1NLFlBQU4sQ0FBbUJILFdBQW5CLENBQVo7QUFDRDtBQUNGOztBQUVELFlBQUlJLFFBQVFQLE1BQU1RLGtCQUFOLENBQXlCWCxTQUF6QixFQUFvQ0ksRUFBcEMsQ0FBWjs7QUFFQSxZQUFJLENBQUNNLEtBQUwsRUFBWTtBQUNWQSxrQkFBUUUsWUFBWWIsR0FBWixFQUFpQkksS0FBakIsRUFBd0JaLGFBQXhCLENBQVI7QUFDQVksZ0JBQU1VLGdCQUFOLENBQXVCYixTQUF2QixFQUFrQ0ksRUFBbEMsRUFBc0NNLEtBQXRDO0FBQ0Q7O0FBRURmLGNBQU1RLE1BQU1XLE9BQVosSUFBdUJKLEtBQXZCO0FBQ0Q7QUFDRjs7QUFFRCxXQUFPLEtBQUtLLFFBQUwsQ0FBYy9ELFNBQVMsQ0FBVCxDQUFkLEVBQTJCLGlCQUFFeUMsTUFBRixDQUFTQyxJQUFULENBQTNCLENBQVA7QUFDRCxHOzsrQkFFREYsYSwwQkFBY0gsSSxFQUFNO0FBQ2xCLFFBQU0yQixPQUFPLG9CQUFZM0IsS0FBSyxDQUFMLENBQVosQ0FBYjtBQUNBLFFBQU00QixVQUFVLEVBQWhCOztBQUVBLFNBQUssSUFBSXJCLElBQUksQ0FBUixFQUFXc0IsSUFBSUYsS0FBS2xCLE1BQXpCLEVBQWlDRixJQUFJc0IsQ0FBckMsRUFBd0MsRUFBRXRCLENBQTFDLEVBQTZDO0FBQzNDLFVBQU11QixNQUFNSCxLQUFLcEIsQ0FBTCxDQUFaO0FBQ0EsVUFBTXdCLFNBQVNELElBQUlFLFdBQUosQ0FBZ0IsS0FBS0MsR0FBckIsQ0FBZjs7QUFFQSxVQUFJRixXQUFXLENBQUMsQ0FBaEIsRUFBbUI7QUFDakIsWUFBTWpCLFFBQVEsS0FBS25ELFFBQUwsQ0FBYyxFQUFkLENBQWQ7QUFDQSxZQUFNa0MsTUFBTWlDLEdBQVo7O0FBRUEsWUFBSSxDQUFDaEIsTUFBTW9CLFNBQU4sQ0FBZ0JyQyxHQUFoQixDQUFMLEVBQTJCO0FBQ3pCK0Isa0JBQVFPLElBQVIsQ0FBYTtBQUNYckIsbUJBQU9BLEtBREk7QUFFWGdCLGlCQUFLQSxHQUZNO0FBR1hqQyxpQkFBS0E7QUFITSxXQUFiO0FBS0Q7QUFDRixPQVhELE1BV087QUFDTCxZQUFNNEIsVUFBVUssSUFBSU0sTUFBSixDQUFXLENBQVgsRUFBY0wsTUFBZCxDQUFoQjtBQUNBLFlBQU1wQyxPQUFPLEtBQUswQyxNQUFMLENBQVlaLE9BQVosQ0FBYjtBQUNBLFlBQU01QixPQUFNaUMsSUFBSU0sTUFBSixDQUFXTCxTQUFTLENBQXBCLENBQVo7QUFDQSxZQUFNakIsU0FBUSxLQUFLbkQsUUFBTCxDQUFjZ0MsSUFBZCxDQUFkOztBQUVBLFlBQUksQ0FBQ21CLE9BQU1vQixTQUFOLENBQWdCckMsSUFBaEIsQ0FBTCxFQUEyQjtBQUN6QitCLGtCQUFRTyxJQUFSLENBQWE7QUFDWHJCLG1CQUFPQSxNQURJO0FBRVhnQixpQkFBS0EsR0FGTTtBQUdYakMsaUJBQUtBO0FBSE0sV0FBYjtBQUtEO0FBQ0Y7QUFDRjs7QUFFRCxXQUFPLGlCQUFFeUMsT0FBRixDQUFVVixPQUFWLEVBQW1CO0FBQUEsYUFBU1csTUFBTXpCLEtBQU4sQ0FBWVcsT0FBckI7QUFBQSxLQUFuQixDQUFQO0FBQ0QsRzs7K0JBRURDLFEscUJBQVNaLEssRUFBTzBCLE0sRUFBUTtBQUN0QixRQUFNQyxXQUFXLG9CQUFZM0IsTUFBTTRCLFFBQWxCLENBQWpCOztBQUVBLFFBQUlDLE1BQU1DLE9BQU4sQ0FBY0osTUFBZCxDQUFKLEVBQTJCO0FBQ3pCLFdBQUssSUFBSUssSUFBSSxDQUFSLEVBQVdDLEtBQUtOLE9BQU8vQixNQUE1QixFQUFvQ29DLElBQUlDLEVBQXhDLEVBQTRDLEVBQUVELENBQTlDLEVBQWlEO0FBQy9DLGFBQUtFLFdBQUwsQ0FBaUJqQyxLQUFqQixFQUF3QjJCLFFBQXhCLEVBQWtDRCxPQUFPSyxDQUFQLENBQWxDO0FBQ0Q7QUFDRixLQUpELE1BSU8sSUFBSUwsTUFBSixFQUFZO0FBQ2pCLFdBQUtPLFdBQUwsQ0FBaUJqQyxLQUFqQixFQUF3QjJCLFFBQXhCLEVBQWtDRCxNQUFsQztBQUNEOztBQUVELFdBQU9BLE1BQVA7QUFDRCxHOzsrQkFFRE8sVyx3QkFBWWpDLEssRUFBTzJCLFEsRUFBVXBCLEssRUFBTztBQUNsQyxTQUFLLElBQUkyQixJQUFJLENBQVIsRUFBV3hDLEtBQUtpQyxTQUFTaEMsTUFBOUIsRUFBc0N1QyxJQUFJeEMsRUFBMUMsRUFBOEMsRUFBRXdDLENBQWhELEVBQW1EO0FBQ2pELFVBQU1DLFVBQVVSLFNBQVNPLENBQVQsQ0FBaEI7QUFDQSxVQUFNRSxTQUFTN0IsTUFBTTRCLE9BQU4sQ0FBZjtBQUNBLFVBQU1FLGdCQUFnQnJDLE1BQU00QixRQUFOLENBQWVPLE9BQWYsQ0FBdEI7O0FBRUEsVUFBTUcsWUFBWUQsY0FBY0UsY0FBZCxDQUE2QkgsTUFBN0IsRUFBcUM3QixLQUFyQyxDQUFsQjtBQUNBLFdBQUtLLFFBQUwsQ0FBY3lCLGFBQWQsRUFBNkJDLFNBQTdCO0FBQ0Q7QUFDRixHOzsrQkFFRDdELEssd0JBQTZFO0FBQUE7O0FBQUEsUUFBdEVDLElBQXNFLFFBQXRFQSxJQUFzRTtBQUFBLFFBQWhFakIsT0FBZ0UsUUFBaEVBLE9BQWdFO0FBQUEsUUFBdkRxQixZQUF1RCxRQUF2REEsWUFBdUQ7QUFBQSxRQUF6Q2pCLFVBQXlDLFFBQXpDQSxVQUF5QztBQUFBLFFBQTdCZSxRQUE2QixRQUE3QkEsUUFBNkI7QUFBQSxRQUFuQkMsSUFBbUIsUUFBbkJBLElBQW1CO0FBQUEsUUFBYkYsVUFBYSxRQUFiQSxVQUFhOztBQUMzRSxRQUFNNkQsT0FBTyxLQUFLQyxjQUFMLENBQW9CO0FBQy9CNUUsNEJBRCtCO0FBRS9CZ0IsZ0JBRitCO0FBRy9CRCx3QkFIK0I7QUFJL0JEO0FBSitCLEtBQXBCLENBQWI7O0FBT0EsU0FBSzlCLFFBQUwsQ0FBY2dDLElBQWQsSUFBc0IyRCxJQUF0Qjs7QUFFQSxTQUFLRSxZQUFMLENBQWtCO0FBQ2hCakYsc0JBRGdCO0FBRWhCcUIsZ0NBRmdCO0FBR2hCakIsNEJBSGdCO0FBSWhCZSx3QkFKZ0I7QUFLaEI0RDtBQUxnQixLQUFsQjs7QUFRQUcsZ0JBQVlqRSxJQUFaLEVBQWtCYixVQUFsQixFQUE4QixVQUFDK0UsU0FBRCxFQUFZaEUsUUFBWixFQUF5QjtBQUNyRCxVQUFNaUUsV0FBVyxPQUFLQyxRQUFMLENBQWNqRSxJQUFkLEVBQW9CRCxTQUFTbkMsSUFBN0IsQ0FBakI7QUFDQSxVQUFNc0csY0FBYyxPQUFLQyxNQUFMLENBQVlILFFBQVosQ0FBcEI7QUFDQSxVQUFNSSxtQkFBbUJyRSxTQUFTc0UsU0FBVCxHQUNyQixPQUFLRixNQUFMLENBQVlHLGlCQUFpQk4sUUFBakIsQ0FBWixDQURxQixHQUVyQixJQUZKOztBQUlBLFVBQU1PLGNBQWNDLGtCQUFrQjtBQUNwQzVGLHdCQURvQztBQUVwQ21CLDBCQUZvQztBQUdwQ0YsY0FBTWtFO0FBSDhCLE9BQWxCLENBQXBCOztBQU1BLFVBQU1VLHlCQUF5QkMsMkJBQTJCO0FBQ3hESCxnQ0FEd0Q7QUFFeER4RSwwQkFGd0Q7QUFHeERqQyxzQkFBYyxPQUFLQTtBQUhxQyxPQUEzQixDQUEvQjs7QUFNQWlDLGVBQVM0RSxJQUFULENBQWMvRixPQUFkLEVBQXVCO0FBQ3JCZ0csdUJBQWUsVUFETTtBQUVyQkMsb0JBQVlsQixLQUFLN0IsT0FGSTtBQUdyQmdELDJCQUFtQlosV0FIRTtBQUlyQmEsd0JBQWdCWCxnQkFKSztBQUtyQkssZ0NBQXdCQTtBQUxILE9BQXZCOztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0FGLGtCQUFZUyxNQUFaLENBQW1CakYsU0FBU2lGLE1BQTVCOztBQUVBLGFBQUtwRixLQUFMLENBQVc7QUFDVEMsY0FBTWtFLFNBREc7QUFFVG5GLGlCQUFTQSxPQUZBO0FBR1RJLG9CQUFZZSxTQUFTa0YsaUJBSFo7QUFJVGxGLGtCQUFVQSxRQUpEO0FBS1RELG9CQUFZNkQsSUFMSDtBQU1UM0QsY0FBTWdFLFFBTkc7QUFPVC9ELHNCQUFjLHNCQUFDQyxHQUFELEVBQVM7QUFDckIsaUJBQU9xRSxZQUFZcEUsWUFBWixDQUF5QkQsR0FBekIsQ0FBUDtBQUNEO0FBVFEsT0FBWDtBQVdELEtBNUNEO0FBNkNELEc7OytCQUVEMEQsYyxrQ0FBeUQ7QUFBQSxRQUF6QzVFLFVBQXlDLFNBQXpDQSxVQUF5QztBQUFBLFFBQTdCZ0IsSUFBNkIsU0FBN0JBLElBQTZCO0FBQUEsUUFBdkJELFFBQXVCLFNBQXZCQSxRQUF1QjtBQUFBLFFBQWJELFVBQWEsU0FBYkEsVUFBYTs7QUFDdkQsUUFBTWdDLFVBQVUsS0FBS3FDLE1BQUwsQ0FBWW5FLElBQVosQ0FBaEI7QUFDQSxRQUFJMkQsYUFBSjs7QUFFQSxRQUFJNUQsWUFBWUEsU0FBU21GLFVBQVQsRUFBaEIsRUFBdUM7QUFDckN2QixhQUFPLElBQUl3QixnQkFBSixFQUFQO0FBQ0QsS0FGRCxNQUVPO0FBQ0x4QixhQUFPLElBQUl5QixRQUFKLEVBQVA7QUFDRDs7QUFFRHpCLFNBQUszRCxJQUFMLEdBQVlBLElBQVo7QUFDQTJELFNBQUs3QixPQUFMLEdBQWVBLE9BQWY7QUFDQTZCLFNBQUswQixVQUFMLEdBQWtCdkYsY0FBY0EsV0FBV0UsSUFBM0M7QUFDQTJELFNBQUtwQyxhQUFMLEdBQXFCekIsY0FBY0EsV0FBV2dDLE9BQTlDO0FBQ0E2QixTQUFLM0UsVUFBTCxHQUFrQkEsVUFBbEI7QUFDQTJFLFNBQUs1RCxRQUFMLEdBQWdCQSxRQUFoQjtBQUNBNEQsU0FBS3RDLFFBQUwsR0FBZ0IsS0FBS2lFLGNBQUwsQ0FBb0J0RyxVQUFwQixFQUFnQzhDLE9BQWhDLENBQWhCOztBQUVBLFFBQUloQyxVQUFKLEVBQWdCO0FBQ2RBLGlCQUFXaUQsUUFBWCxDQUFvQmhELFNBQVNuQyxJQUE3QixJQUFxQytGLElBQXJDO0FBQ0Q7O0FBRUQsV0FBT0EsSUFBUDtBQUNELEc7OytCQUVERSxZLGdDQUFrRTtBQUFBOztBQUFBLFFBQXBEakYsT0FBb0QsU0FBcERBLE9BQW9EO0FBQUEsUUFBM0NxQixZQUEyQyxTQUEzQ0EsWUFBMkM7QUFBQSxRQUE3QmpCLFVBQTZCLFNBQTdCQSxVQUE2QjtBQUFBLFFBQWpCZSxRQUFpQixTQUFqQkEsUUFBaUI7QUFBQSxRQUFQNEQsSUFBTyxTQUFQQSxJQUFPOztBQUNoRSxRQUFNNEIsVUFBVSxFQUFoQjtBQUNBLFFBQU1DLFNBQVN4RyxXQUFXeUcsZ0JBQVgsRUFBZjtBQUNBLFFBQU1DLFlBQVksS0FBSzNILGNBQUwsQ0FBb0IwQixTQUF0Qzs7QUFFQWpDLGVBQVd3QixXQUFXUyxTQUF0QixFQUFpQ2tHLE9BQWpDLENBQXlDQyxPQUF6QyxDQUFpRCxlQUFPO0FBQ3RELFVBQU1DLGVBQWU1RixhQUFhQyxHQUFiLENBQXJCO0FBQ0EsVUFBTTRGLGFBQWFOLE9BQU9PLE9BQVAsQ0FBZTdGLEdBQWYsTUFBd0IsQ0FBQyxDQUE1Qzs7QUFFQSxVQUFJMkYsZ0JBQWdCQyxVQUFwQixFQUFnQztBQUM5QlAsZ0JBQVEvQyxJQUFSLENBQWE7QUFDWHRDLGdCQUFReUQsS0FBSzdCLE9BQUwsSUFBZ0I0RCxTQUF4QixVQUFxQ3hGLEdBRDFCO0FBRVg4RixpQkFBTyxPQUFLL0IsUUFBTCxDQUFjTixLQUFLN0IsT0FBbkIsRUFBNEI1QixHQUE1QjtBQUZJLFNBQWI7O0FBS0EsWUFBSSxDQUFDMkYsWUFBTCxFQUFtQjtBQUNqQmxDLGVBQUtwQixTQUFMLENBQWVyQyxHQUFmLElBQXNCLElBQXRCO0FBQ0Q7QUFDRjtBQUNGLEtBZEQ7O0FBZ0JBLFFBQUlILFlBQVlBLFNBQVNrRyxlQUF6QixFQUEwQztBQUN4QyxVQUFNNUIsWUFBWSxLQUFLRixNQUFMLENBQVlHLGlCQUFpQlgsS0FBSzNELElBQXRCLENBQVosQ0FBbEI7O0FBRUFELGVBQVNrRyxlQUFULENBQXlCTCxPQUF6QixDQUFpQyxpQkFBUztBQUN4QyxZQUFJM0YsYUFBYWlHLE1BQU1DLFlBQW5CLENBQUosRUFBc0M7QUFDcENaLGtCQUFRL0MsSUFBUixDQUFhO0FBQ1h0QyxpQkFBUW1FLFNBQVIsU0FBcUI2QixNQUFNQyxZQURoQjtBQUVYSCxtQkFBTyxPQUFLL0IsUUFBTCxDQUFjTixLQUFLN0IsT0FBbkIsRUFBNEJvRSxNQUFNRSxRQUFsQztBQUZJLFdBQWI7QUFJRDtBQUNGLE9BUEQ7QUFRRDs7QUFFRCxRQUFNQyxpQkFBaUJkLFFBQVFlLE1BQVIsQ0FBZTtBQUFBLGFBQVVDLE9BQU9QLEtBQVAsQ0FBYWxGLE1BQWIsR0FBc0JyRCxhQUFoQztBQUFBLEtBQWYsQ0FBdkI7O0FBRUEsUUFBSTRJLGVBQWV2RixNQUFuQixFQUEyQjtBQUN6QixZQUFNLDhCQUFvQjtBQUN4QjBGLGVBQU8sZ0JBQWNILGVBQWUsQ0FBZixFQUFrQkwsS0FBaEMsaUJBQWlEdkksYUFBakQ7QUFEaUIsT0FBcEIsQ0FBTjtBQUlEOztBQUVEbUIsWUFBUTJILE1BQVIsQ0FBZWhCLFFBQVFrQixHQUFSLENBQVk7QUFBQSxhQUFhRixPQUFPckcsR0FBcEIsWUFBOEJxRyxPQUFPUCxLQUFyQztBQUFBLEtBQVosQ0FBZjtBQUNELEc7OytCQUVEN0IsTSxtQkFBT25FLEksRUFBTTtBQUFBOztBQUNYLFFBQUksQ0FBQyxLQUFLbkMsR0FBTCxDQUFTUSxRQUFkLEVBQXdCO0FBQ3RCLFVBQUl5RCxVQUFVLEtBQUs3RCxTQUFMLENBQWUrQixJQUFmLENBQWQ7O0FBRUEsVUFBSSxDQUFDOEIsT0FBTCxFQUFjO0FBQ1osWUFBTTRFLFFBQVExRyxLQUFLMkcsS0FBTCxDQUFXLEtBQUtyRSxHQUFoQixDQUFkOztBQUVBO0FBQ0EsWUFBSSxDQUFDdEMsSUFBTCxFQUFXO0FBQ1Q4QixvQkFBVTlCLElBQVY7QUFDRCxTQUZELE1BRU87QUFDTDhCLG9CQUFVNEUsTUFBTUQsR0FBTixDQUFVO0FBQUEsbUJBQVEsT0FBSzVJLEdBQUwsQ0FBU1UsT0FBVCxDQUFpQnFJLElBQWpCLEtBQTBCQSxJQUFsQztBQUFBLFdBQVYsRUFBa0RqQyxJQUFsRCxDQUF1RCxLQUFLckMsR0FBNUQsQ0FBVjtBQUNEOztBQUVELGFBQUtyRSxTQUFMLENBQWUrQixJQUFmLElBQXVCOEIsT0FBdkI7QUFDQSxhQUFLNUQsU0FBTCxDQUFlNEQsT0FBZixJQUEwQjlCLElBQTFCO0FBQ0Q7O0FBRUQsYUFBTzhCLE9BQVA7QUFDRCxLQWxCRCxNQWtCTztBQUNMLFVBQUlBLFdBQVUsS0FBSzdELFNBQUwsQ0FBZStCLElBQWYsQ0FBZDs7QUFFQSxVQUFJLENBQUM4QixRQUFMLEVBQWM7QUFDWjtBQUNBLFlBQUksQ0FBQzlCLElBQUwsRUFBVztBQUNUOEIscUJBQVU5QixJQUFWO0FBQ0QsU0FGRCxNQUVPO0FBQ0w4QixxQkFBVSxLQUFLK0UsZUFBTCxFQUFWO0FBQ0Q7O0FBRUQsYUFBSzVJLFNBQUwsQ0FBZStCLElBQWYsSUFBdUI4QixRQUF2QjtBQUNBLGFBQUs1RCxTQUFMLENBQWU0RCxRQUFmLElBQTBCOUIsSUFBMUI7QUFDRDs7QUFFRCxhQUFPOEIsUUFBUDtBQUNEO0FBQ0YsRzs7K0JBRURZLE0sbUJBQU8xQyxJLEVBQU07QUFDWCxXQUFPLEtBQUs5QixTQUFMLENBQWU4QixJQUFmLENBQVA7QUFDRCxHOzsrQkFFRDZHLGUsOEJBQWtCO0FBQ2hCLGtCQUFZLEVBQUUsS0FBSzFJLE1BQW5CO0FBQ0QsRzs7K0JBRURtSCxjLDJCQUFldEcsVSxFQUFZZ0IsSSxFQUFNO0FBQUE7O0FBQy9CLFFBQU13RixTQUFTeEcsV0FBV3lHLGdCQUFYLEdBQThCZ0IsR0FBOUIsQ0FBa0M7QUFBQSxhQUFPLE9BQUt4QyxRQUFMLENBQWNqRSxJQUFkLEVBQW9CRSxHQUFwQixDQUFQO0FBQUEsS0FBbEMsQ0FBZjs7QUFFQSxRQUFJc0YsT0FBTzFFLE1BQVAsS0FBa0IsQ0FBdEIsRUFBeUI7QUFDdkIsYUFBT2dHLHFCQUFxQnRCLE1BQXJCLENBQVA7QUFDRCxLQUZELE1BRU8sSUFBSUEsT0FBTzFFLE1BQVAsS0FBa0IsQ0FBdEIsRUFBeUI7QUFDOUIsYUFBT2lHLGtCQUFrQnZCLE1BQWxCLENBQVA7QUFDRCxLQUZNLE1BRUEsSUFBSUEsT0FBTzFFLE1BQVAsS0FBa0IsQ0FBdEIsRUFBeUI7QUFDOUIsYUFBT2tHLG9CQUFvQnhCLE1BQXBCLENBQVA7QUFDRCxLQUZNLE1BRUE7QUFDTCxhQUFPeUIsZ0JBQWdCekIsTUFBaEIsQ0FBUDtBQUNEO0FBQ0YsRzs7K0JBTUR2QixRLHFCQUFTakUsSSxFQUFNa0gsUSxFQUFVO0FBQ3ZCLFFBQUlsSCxJQUFKLEVBQVU7QUFDUixrQkFBVUEsSUFBVixHQUFpQixLQUFLc0MsR0FBdEIsR0FBNEI0RSxRQUE1QjtBQUNELEtBRkQsTUFFTztBQUNMLGFBQU9BLFFBQVA7QUFDRDtBQUNGLEc7Ozs7d0JBVlM7QUFDUixhQUFPLEtBQUtySixHQUFMLENBQVNTLFNBQWhCO0FBQ0Q7Ozs7O2tCQXhYa0JYLGtCOzs7QUFtWXJCLFNBQVNzQixhQUFULENBQXVCWSxJQUF2QixFQUE2QmIsVUFBN0IsRUFBeUM7QUFDdkMsTUFBTTZELFNBQVMsRUFBZjs7QUFFQXNFLG9CQUFrQnRILElBQWxCLEVBQXdCYixVQUF4QixFQUFvQzZELE1BQXBDOztBQUVBLFNBQU8saUJBQUV1RSxNQUFGLENBQVN2RSxNQUFULEVBQWlCLFdBQWpCLENBQVA7QUFDRDs7QUFFRCxTQUFTc0UsaUJBQVQsQ0FBMkJ0SCxJQUEzQixFQUFpQ2IsVUFBakMsRUFBNkM2RCxNQUE3QyxFQUFxRDtBQUNuREEsU0FBT0wsSUFBUCxDQUFZeEQsVUFBWjs7QUFFQThFLGNBQVlqRSxJQUFaLEVBQWtCYixVQUFsQixFQUE4QixVQUFDK0UsU0FBRCxFQUFZaEUsUUFBWixFQUF5QjtBQUNyRG9ILHNCQUFrQnBELFNBQWxCLEVBQTZCaEUsU0FBU2tGLGlCQUF0QyxFQUF5RHBDLE1BQXpEO0FBQ0QsR0FGRDtBQUdEOztBQUVELFNBQVMxRCxnQkFBVCxDQUEwQlUsSUFBMUIsRUFBZ0NiLFVBQWhDLEVBQTRDO0FBQzFDLE1BQU1xSSxZQUFZLEVBQWxCOztBQUVBQyx1QkFBcUJ6SCxJQUFyQixFQUEyQmIsVUFBM0IsRUFBdUNxSSxTQUF2Qzs7QUFFQSxTQUFPLGlCQUFFRSxRQUFGLENBQVdGLFNBQVgsRUFBc0IsVUFBQ0csR0FBRCxFQUFNQyxHQUFOO0FBQUEsV0FBY0QsUUFBUUMsR0FBdEI7QUFBQSxHQUF0QixDQUFQO0FBQ0Q7O0FBRUQsU0FBU0gsb0JBQVQsQ0FBOEJ6SCxJQUE5QixFQUFvQ2IsVUFBcEMsRUFBZ0RxSSxTQUFoRCxFQUEyRDtBQUN6RHZELGNBQVlqRSxJQUFaLEVBQWtCYixVQUFsQixFQUE4QixVQUFDK0UsU0FBRCxFQUFZaEUsUUFBWixFQUF5QjtBQUNyRHNILGNBQVU3RSxJQUFWLENBQWV6QyxRQUFmOztBQUVBdUgseUJBQXFCdkQsU0FBckIsRUFBZ0NoRSxTQUFTa0YsaUJBQXpDLEVBQTREb0MsU0FBNUQ7QUFDRCxHQUpEO0FBS0Q7O0FBRUQsU0FBU2hJLGVBQVQsQ0FBeUJULE9BQXpCLEVBQWtDaUUsTUFBbEMsRUFBMEM7QUFDeEMsTUFBTTZFLE9BQU85SSxRQUFROEksSUFBUixFQUFiOztBQUVBLFNBQU8sbUJBQVFDLEdBQVIsQ0FBWTlFLE9BQU80RCxHQUFQLENBQVcsc0JBQWM7QUFDMUMsUUFBTWpILFFBQVFULFdBQVdVLFNBQXpCOztBQUVBLFFBQUlqQyxXQUFXZ0MsS0FBWCxDQUFKLEVBQXVCO0FBQ3JCLGFBQU9oQyxXQUFXZ0MsS0FBWCxDQUFQO0FBQ0QsS0FGRCxNQUVPO0FBQ0xoQyxpQkFBV2dDLEtBQVgsSUFBb0JrSSxLQUFLbEksS0FBTCxFQUFZaEMsVUFBWixHQUF5Qm9LLElBQXpCLENBQThCLGdCQUFRO0FBQ3hELFlBQU1DLFNBQVM7QUFDYmxDLG1CQUFTLG9CQUFZaEMsSUFBWjtBQURJLFNBQWY7O0FBSUFuRyxtQkFBV2dDLEtBQVgsSUFBb0JxSSxNQUFwQjtBQUNBLGVBQU9BLE1BQVA7QUFDRCxPQVBtQixDQUFwQjs7QUFTQSxhQUFPckssV0FBV2dDLEtBQVgsQ0FBUDtBQUNEO0FBQ0YsR0FqQmtCLENBQVosQ0FBUDtBQWtCRDs7QUFFRCxTQUFTc0UsV0FBVCxDQUFxQmpFLElBQXJCLEVBQTJCYixVQUEzQixFQUF1QzhJLFFBQXZDLEVBQWlEO0FBQy9DLE1BQU1ULFlBQVlySSxXQUFXK0ksZ0JBQVgsRUFBbEI7O0FBRUEsTUFBSWxJLEtBQUttSSxjQUFMLE1BQXlCbkksS0FBS29JLGlCQUFMLEtBQTJCdkssc0JBQXhELEVBQWdGO0FBQzlFLFVBQU0sOEJBQW9CO0FBQ3hCOEksc0RBQThDM0csS0FBS3FJLFFBQUwsRUFBOUM7QUFEd0IsS0FBcEIsQ0FBTjtBQUdEOztBQUVELE9BQUssSUFBSXRILElBQUksQ0FBUixFQUFXc0IsSUFBSW1GLFVBQVV2RyxNQUE5QixFQUFzQ0YsSUFBSXNCLENBQTFDLEVBQTZDLEVBQUV0QixDQUEvQyxFQUFrRDtBQUNoRCxRQUFNYixXQUFXc0gsVUFBVXpHLENBQVYsQ0FBakI7QUFDQSxRQUFNbUQsWUFBWWxFLEtBQUtzSSxlQUFMLENBQXFCcEksU0FBU25DLElBQTlCLENBQWxCOztBQUVBLFFBQUltRyxTQUFKLEVBQWU7QUFDYitELGVBQVMvRCxTQUFULEVBQW9CaEUsUUFBcEIsRUFBOEJBLFNBQVNuQyxJQUF2QztBQUNEO0FBQ0Y7QUFDRjs7QUFFRCxTQUFTa0osb0JBQVQsQ0FBOEJ0QixNQUE5QixFQUFzQztBQUNwQyxNQUFNNEMsUUFBUTVDLE9BQU8sQ0FBUCxDQUFkOztBQUVBLFNBQU8sVUFBQ3pFLEdBQUQsRUFBUztBQUNkLFFBQU1zSCxNQUFNdEgsSUFBSXFILEtBQUosQ0FBWjs7QUFFQSxRQUFJLENBQUNDLEdBQUwsRUFBVTtBQUNSLGFBQU8sSUFBUDtBQUNELEtBRkQsTUFFTztBQUNMLGFBQU9BLEdBQVA7QUFDRDtBQUNGLEdBUkQ7QUFTRDs7QUFFRCxTQUFTdEIsaUJBQVQsQ0FBMkJ2QixNQUEzQixFQUFtQztBQUNqQyxNQUFNOEMsU0FBUzlDLE9BQU8sQ0FBUCxDQUFmO0FBQ0EsTUFBTStDLFNBQVMvQyxPQUFPLENBQVAsQ0FBZjs7QUFFQSxTQUFPLFVBQUN6RSxHQUFELEVBQVM7QUFDZCxRQUFNeUgsT0FBT3pILElBQUl1SCxNQUFKLENBQWI7QUFDQSxRQUFNRyxPQUFPMUgsSUFBSXdILE1BQUosQ0FBYjs7QUFFQSxRQUFJLENBQUNDLElBQUQsSUFBUyxDQUFDQyxJQUFkLEVBQW9CO0FBQ2xCLGFBQU8sSUFBUDtBQUNELEtBRkQsTUFFTztBQUNMLGFBQVVELElBQVYsU0FBa0JDLElBQWxCO0FBQ0Q7QUFDRixHQVREO0FBVUQ7O0FBRUQsU0FBU3pCLG1CQUFULENBQTZCeEIsTUFBN0IsRUFBcUM7QUFDbkMsTUFBTThDLFNBQVM5QyxPQUFPLENBQVAsQ0FBZjtBQUNBLE1BQU0rQyxTQUFTL0MsT0FBTyxDQUFQLENBQWY7QUFDQSxNQUFNa0QsU0FBU2xELE9BQU8sQ0FBUCxDQUFmOztBQUVBLFNBQU8sVUFBQ3pFLEdBQUQsRUFBUztBQUNkLFFBQU15SCxPQUFPekgsSUFBSXVILE1BQUosQ0FBYjtBQUNBLFFBQU1HLE9BQU8xSCxJQUFJd0gsTUFBSixDQUFiO0FBQ0EsUUFBTUksT0FBTzVILElBQUkySCxNQUFKLENBQWI7O0FBRUEsUUFBSSxDQUFDRixJQUFELElBQVMsQ0FBQ0MsSUFBVixJQUFrQixDQUFDRSxJQUF2QixFQUE2QjtBQUMzQixhQUFPLElBQVA7QUFDRCxLQUZELE1BRU87QUFDTCxhQUFVSCxJQUFWLFNBQWtCQyxJQUFsQixTQUEwQkUsSUFBMUI7QUFDRDtBQUNGLEdBVkQ7QUFXRDs7QUFFRCxTQUFTMUIsZUFBVCxDQUF5QnpCLE1BQXpCLEVBQWlDO0FBQy9CLFNBQU8sVUFBQ3pFLEdBQUQsRUFBUztBQUNkLFFBQUlLLEtBQUssRUFBVDs7QUFFQSxTQUFLLElBQUlSLElBQUksQ0FBUixFQUFXc0IsSUFBSXNELE9BQU8xRSxNQUEzQixFQUFtQ0YsSUFBSXNCLENBQXZDLEVBQTBDLEVBQUV0QixDQUE1QyxFQUErQztBQUM3QyxVQUFNeUgsTUFBTXRILElBQUl5RSxPQUFPNUUsQ0FBUCxDQUFKLENBQVo7O0FBRUEsVUFBSSxDQUFDeUgsR0FBTCxFQUFVO0FBQ1IsZUFBTyxJQUFQO0FBQ0Q7O0FBRURqSCxZQUFNLENBQUNSLElBQUksQ0FBSixHQUFRLEdBQVIsR0FBYyxFQUFmLElBQXFCeUgsR0FBM0I7QUFDRDs7QUFFRCxXQUFPakgsRUFBUDtBQUNELEdBZEQ7QUFlRDs7QUFFRCxTQUFTb0QsaUJBQVQsUUFBc0Q7QUFBQSxNQUExQjVGLE9BQTBCLFNBQTFCQSxPQUEwQjtBQUFBLE1BQWpCaUIsSUFBaUIsU0FBakJBLElBQWlCO0FBQUEsTUFBWEUsUUFBVyxTQUFYQSxRQUFXOztBQUNwRCxNQUFNd0UsY0FBY3hFLFNBQVNrRixpQkFBVCxDQUNqQjJELEtBRGlCLEdBRWpCQyxZQUZpQixDQUVKakssT0FGSSxDQUFwQjs7QUFJQSxPQUFLLElBQUlnQyxJQUFJLENBQVIsRUFBV3NCLElBQUlyQyxLQUFLaEIsSUFBTCxDQUFVaUMsTUFBOUIsRUFBc0NGLElBQUlzQixDQUExQyxFQUE2QyxFQUFFdEIsQ0FBL0MsRUFBa0Q7QUFDaEQsUUFBTWtJLGFBQWFqSixLQUFLaEIsSUFBTCxDQUFVK0IsQ0FBVixDQUFuQjtBQUNBLFFBQU0wRixTQUFTekcsS0FBS2tKLE9BQUwsQ0FBYUQsVUFBYixDQUFmOztBQUVBLFFBQUksT0FBT3hDLE1BQVAsS0FBa0IsVUFBdEIsRUFBa0M7QUFDaEMsWUFBTSw4QkFBb0IsRUFBQ0UsbUNBQWlDc0MsVUFBakMsd0JBQThEL0ksU0FBU25DLElBQXZFLE1BQUQsRUFBcEIsQ0FBTjtBQUNEOztBQUVEMEksV0FBTy9CLFdBQVA7QUFDRDs7QUFFRCxTQUFPQSxXQUFQO0FBQ0Q7O0FBRUQsU0FBU0csMEJBQVQsUUFBMkU7QUFBQSxNQUF0Q0gsV0FBc0MsU0FBdENBLFdBQXNDO0FBQUEsTUFBekJ4RSxRQUF5QixTQUF6QkEsUUFBeUI7QUFBQSxNQUFmakMsWUFBZSxTQUFmQSxZQUFlOztBQUN6RSxNQUFNa0wsdUJBQXVCekUsWUFBWS9GLEtBQVosRUFBN0I7O0FBRUEsTUFBTXlLLGlCQUFpQkMsMkJBQTJCO0FBQ2hEbEssZ0JBQVllLFNBQVNrRixpQkFEMkI7QUFFaERuSDtBQUZnRCxHQUEzQixDQUF2Qjs7QUFLQSxTQUFPa0wscUJBQXFCekMsTUFBckIsQ0FBNEIwQyxlQUFlM0MsTUFBZixDQUFzQixlQUFPO0FBQzlELFdBQU8sQ0FBQzBDLHFCQUFxQjdJLFlBQXJCLENBQWtDRCxHQUFsQyxDQUFSO0FBQ0QsR0FGa0MsQ0FBNUIsQ0FBUDtBQUdEOztBQUVELFNBQVNnSiwwQkFBVCxRQUFnRTtBQUFBLE1BQTNCbEssVUFBMkIsU0FBM0JBLFVBQTJCO0FBQUEsTUFBZmxCLFlBQWUsU0FBZkEsWUFBZTs7QUFDOUQsTUFBSXFMLGNBQWNuSyxXQUFXeUcsZ0JBQVgsR0FBOEIyRCxLQUE5QixFQUFsQjs7QUFFQXRMLGVBQWE4SCxPQUFiLENBQXFCLGVBQU87QUFDMUIsUUFBSXlELElBQUlwRSxpQkFBSixDQUFzQnhGLFNBQXRCLEtBQW9DVCxXQUFXUyxTQUFuRCxFQUE4RDtBQUM1RDRKLFVBQUlDLFVBQUosQ0FBZTFELE9BQWYsQ0FBdUI7QUFBQSxlQUFPdUQsWUFBWTNHLElBQVosQ0FBaUJ0QyxHQUFqQixDQUFQO0FBQUEsT0FBdkI7QUFDRDs7QUFFRCxRQUFJbUosSUFBSUUsZUFBSixDQUFvQjlKLFNBQXBCLEtBQWtDVCxXQUFXUyxTQUFqRCxFQUE0RDtBQUMxRDRKLFVBQUlHLFFBQUosQ0FBYTVELE9BQWIsQ0FBcUI7QUFBQSxlQUFPdUQsWUFBWTNHLElBQVosQ0FBaUJ0QyxHQUFqQixDQUFQO0FBQUEsT0FBckI7QUFDRDtBQUNGLEdBUkQ7O0FBVUEsU0FBTyxpQkFBRXVKLElBQUYsQ0FBT04sV0FBUCxDQUFQO0FBQ0Q7O0FBRUQsU0FBU3ZILFdBQVQsQ0FBcUJiLEdBQXJCLEVBQTBCSSxLQUExQixFQUFpQ1osYUFBakMsRUFBZ0Q7QUFDOUMsTUFBTTBCLFVBQVUxQixjQUFjWSxNQUFNVyxPQUFwQixDQUFoQjtBQUNBLE1BQU00SCxPQUFPLEVBQWI7O0FBRUEsT0FBSyxJQUFJQyxJQUFJLENBQVIsRUFBV0MsS0FBSzNILFFBQVFuQixNQUE3QixFQUFxQzZJLElBQUlDLEVBQXpDLEVBQTZDLEVBQUVELENBQS9DLEVBQWtEO0FBQ2hELFFBQU0vRyxRQUFRWCxRQUFRMEgsQ0FBUixDQUFkO0FBQ0FELFNBQUs5RyxNQUFNMUMsR0FBWCxJQUFrQmEsSUFBSTZCLE1BQU1ULEdBQVYsQ0FBbEI7QUFDRDs7QUFFRCxTQUFPaEIsTUFBTW5DLFVBQU4sQ0FBaUI2SyxnQkFBakIsQ0FBa0NILElBQWxDLENBQVA7QUFDRDs7QUFFRCxTQUFTcEYsZ0JBQVQsQ0FBMEJ0RSxJQUExQixFQUFnQztBQUM5QixTQUFPQSxPQUFPLE9BQWQ7QUFDRDs7SUFFS29GLFE7QUFFSixzQkFBYztBQUFBOztBQUNaLFNBQUtwRixJQUFMLEdBQVksSUFBWjtBQUNBLFNBQUs4QixPQUFMLEdBQWUsSUFBZjtBQUNBLFNBQUtQLGFBQUwsR0FBcUIsSUFBckI7QUFDQSxTQUFLdkMsVUFBTCxHQUFrQixJQUFsQjtBQUNBLFNBQUtlLFFBQUwsR0FBZ0IsSUFBaEI7QUFDQSxTQUFLd0MsU0FBTCxHQUFpQixzQkFBYyxJQUFkLENBQWpCO0FBQ0EsU0FBS1EsUUFBTCxHQUFnQixzQkFBYyxJQUFkLENBQWhCO0FBQ0EsU0FBSzFCLFFBQUwsR0FBZ0IsSUFBaEI7QUFDRDs7cUJBRURJLFkseUJBQWFILFcsRUFBYTtBQUN4QixRQUFNaUMsU0FBUyxzQkFBYyxJQUFkLENBQWY7QUFDQWpDLGdCQUFZLEtBQUt2QixRQUFMLENBQWNuQyxJQUExQixJQUFrQzJGLE1BQWxDO0FBQ0EsV0FBT0EsTUFBUDtBQUNELEc7O3FCQUVEL0IsUyxzQkFBVUYsVyxFQUFhO0FBQ3JCLFdBQU9BLFlBQVksS0FBS3ZCLFFBQUwsQ0FBY25DLElBQTFCLENBQVA7QUFDRCxHOztxQkFFRCtELGtCLCtCQUFtQjRCLE0sRUFBUW5DLEUsRUFBSTtBQUM3QixXQUFPbUMsT0FBT25DLEVBQVAsQ0FBUDtBQUNELEc7O3FCQUVEUyxnQiw2QkFBaUIwQixNLEVBQVFuQyxFLEVBQUlNLEssRUFBTztBQUNsQzZCLFdBQU9uQyxFQUFQLElBQWFNLEtBQWI7QUFDRCxHOztxQkFFRGdDLGMsMkJBQWVILE0sRUFBUWpDLFcsRUFBYTtBQUNsQyxRQUFNd0ksWUFBWSxpQkFBRXJKLE1BQUYsQ0FBUzhDLE1BQVQsQ0FBbEI7QUFDQWpDLGdCQUFZLEtBQUt2QixRQUFMLENBQWNuQyxJQUExQixJQUFrQ2tNLFNBQWxDO0FBQ0EsV0FBT0EsU0FBUDtBQUNELEc7Ozs7O0lBR0czRSxnQjs7Ozs7Ozs7NkJBRUoxRCxZLHlCQUFhSCxXLEVBQWE7QUFDeEIsV0FBT0EsV0FBUDtBQUNELEc7OzZCQUVERSxTLHNCQUFVRixXLEVBQWE7QUFDckIsV0FBT0EsV0FBUDtBQUNELEc7OzZCQUVESyxrQiwrQkFBbUI0QixNLEVBQVFuQyxFLEVBQUk7QUFDN0IsV0FBT21DLE9BQU8sS0FBS3hELFFBQUwsQ0FBY25DLElBQXJCLENBQVA7QUFDRCxHOzs2QkFFRGlFLGdCLDZCQUFpQjBCLE0sRUFBUW5DLEUsRUFBSU0sSyxFQUFPO0FBQ2xDNkIsV0FBTyxLQUFLeEQsUUFBTCxDQUFjbkMsSUFBckIsSUFBNkI4RCxLQUE3QjtBQUNELEc7OzZCQUdEZ0MsYywyQkFBZUgsTSxFQUFRakMsVyxFQUFhO0FBQ2xDQSxnQkFBWSxLQUFLdkIsUUFBTCxDQUFjbkMsSUFBMUIsSUFBa0MyRixVQUFVLElBQTVDO0FBQ0EsV0FBT0EsVUFBVSxJQUFqQjtBQUNELEc7OztFQXRCNEI2QixRIiwiZmlsZSI6IkpvaW5FYWdlck9wZXJhdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgUHJvbWlzZSBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgRWFnZXJPcGVyYXRpb24gZnJvbSAnLi9FYWdlck9wZXJhdGlvbic7XG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uLy4uL21vZGVsL1ZhbGlkYXRpb25FcnJvcic7XG5cbmNvbnN0IGNvbHVtbkluZm8gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuY29uc3QgaWRMZW5ndGhMaW1pdCA9IDYzO1xuY29uc3QgcmVsYXRpb25SZWN1cnNpb25MaW1pdCA9IDY0O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBKb2luRWFnZXJPcGVyYXRpb24gZXh0ZW5kcyBFYWdlck9wZXJhdGlvbiB7XG5cbiAgY29uc3RydWN0b3IobmFtZSwgb3B0KSB7XG4gICAgc3VwZXIobmFtZSwgb3B0KTtcblxuICAgIHRoaXMuYWxsUmVsYXRpb25zID0gbnVsbDtcbiAgICB0aGlzLnJvb3RNb2RlbENsYXNzID0gbnVsbDtcbiAgICB0aGlzLnBhdGhJbmZvID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLmVuY29kaW5ncyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5kZWNvZGluZ3MgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuZW5jSWR4ID0gMDtcbiAgICB0aGlzLm9wdCA9IF8uZGVmYXVsdHMob3B0LCB7XG4gICAgICBtaW5pbWl6ZTogZmFsc2UsXG4gICAgICBzZXBhcmF0b3I6ICc6JyxcbiAgICAgIGFsaWFzZXM6IHt9XG4gICAgfSk7XG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICBjb25zdCBjb3B5ID0gc3VwZXIuY2xvbmUoKTtcblxuICAgIGNvcHkuYWxsUmVsYXRpb25zID0gdGhpcy5hbGxSZWxhdGlvbnM7XG4gICAgY29weS5hbGxNb2RlbENsYXNzZXMgPSB0aGlzLmFsbE1vZGVsQ2xhc3NlcztcbiAgICBjb3B5LnJvb3RNb2RlbENsYXNzID0gdGhpcy5yb290TW9kZWxDbGFzcztcbiAgICBjb3B5LnBhdGhJbmZvID0gdGhpcy5wYXRoSW5mbztcbiAgICBjb3B5LmVuY29kaW5ncyA9IHRoaXMuZW5jb2RpbmdzO1xuICAgIGNvcHkuZGVjb2RpbmdzID0gdGhpcy5kZWNvZGluZ3M7XG4gICAgY29weS5lbmNJZHggPSB0aGlzLmVuY0lkeDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgY2FsbChidWlsZGVyLCBhcmdzKSB7XG4gICAgY29uc3QgcmV0ID0gc3VwZXIuY2FsbChidWlsZGVyLCBhcmdzKTtcbiAgICBjb25zdCBNb2RlbENsYXNzID0gYnVpbGRlci5tb2RlbENsYXNzKCk7XG5cbiAgICBpZiAocmV0KSB7XG4gICAgICB0aGlzLnJvb3RNb2RlbENsYXNzID0gTW9kZWxDbGFzcztcbiAgICAgIHRoaXMuYWxsTW9kZWxDbGFzc2VzID0gZmluZEFsbE1vZGVscyh0aGlzLmV4cHJlc3Npb24sIE1vZGVsQ2xhc3MpO1xuICAgICAgdGhpcy5hbGxSZWxhdGlvbnMgPSBmaW5kQWxsUmVsYXRpb25zKHRoaXMuZXhwcmVzc2lvbiwgTW9kZWxDbGFzcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIG9uQmVmb3JlSW50ZXJuYWwoYnVpbGRlcikge1xuICAgIHJldHVybiBmZXRjaENvbHVtbkluZm8oYnVpbGRlciwgdGhpcy5hbGxNb2RlbENsYXNzZXMpO1xuICB9XG5cbiAgb25CZWZvcmVCdWlsZChidWlsZGVyKSB7XG4gICAgY29uc3QgYnVpbGRlckNsb25lID0gYnVpbGRlci5jbG9uZSgpO1xuXG4gICAgYnVpbGRlci50YWJsZShgJHt0aGlzLnJvb3RNb2RlbENsYXNzLnRhYmxlTmFtZX0gYXMgJHt0aGlzLnJvb3RNb2RlbENsYXNzLnRhYmxlTmFtZX1gKTtcbiAgICBidWlsZGVyLmZpbmRPcHRpb25zKHtjYWxsQWZ0ZXJHZXREZWVwbHk6IHRydWV9KTtcblxuICAgIHRoaXMuYnVpbGQoe1xuICAgICAgZXhwcjogdGhpcy5leHByZXNzaW9uLFxuICAgICAgYnVpbGRlcjogYnVpbGRlcixcbiAgICAgIG1vZGVsQ2xhc3M6IGJ1aWxkZXIubW9kZWxDbGFzcygpLFxuICAgICAgcGFyZW50SW5mbzogbnVsbCxcbiAgICAgIHJlbGF0aW9uOiBudWxsLFxuICAgICAgcGF0aDogJycsXG4gICAgICBzZWxlY3RGaWx0ZXI6IChjb2wpID0+IHtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXJDbG9uZS5oYXNTZWxlY3Rpb24oY29sKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uUmF3UmVzdWx0KGJ1aWxkZXIsIHJvd3MpIHtcbiAgICBpZiAoXy5pc0VtcHR5KHJvd3MpKSB7XG4gICAgICByZXR1cm4gcm93cztcbiAgICB9XG5cbiAgICBjb25zdCBrZXlJbmZvQnlQYXRoID0gdGhpcy5jcmVhdGVLZXlJbmZvKHJvd3MpO1xuICAgIGNvbnN0IHBhdGhJbmZvID0gXy52YWx1ZXModGhpcy5wYXRoSW5mbyk7XG5cbiAgICBjb25zdCB0cmVlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBjb25zdCBzdGFjayA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgbHIgPSByb3dzLmxlbmd0aDsgaSA8IGxyOyArK2kpIHtcbiAgICAgIGNvbnN0IHJvdyA9IHJvd3NbaV07XG4gICAgICBsZXQgY3VyQnJhbmNoID0gdHJlZTtcblxuICAgICAgZm9yIChsZXQgaiA9IDAsIGxwID0gcGF0aEluZm8ubGVuZ3RoOyBqIDwgbHA7ICsraikge1xuICAgICAgICBjb25zdCBwSW5mbyA9IHBhdGhJbmZvW2pdO1xuICAgICAgICBjb25zdCBpZCA9IHBJbmZvLmlkR2V0dGVyKHJvdyk7XG5cbiAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBJbmZvLnJlbGF0aW9uKSB7XG4gICAgICAgICAgY29uc3QgcGFyZW50TW9kZWwgPSBzdGFja1twSW5mby5lbmNQYXJlbnRQYXRoXTtcblxuICAgICAgICAgIGN1ckJyYW5jaCA9IHBJbmZvLmdldEJyYW5jaChwYXJlbnRNb2RlbCk7XG5cbiAgICAgICAgICBpZiAoIWN1ckJyYW5jaCkge1xuICAgICAgICAgICAgY3VyQnJhbmNoID0gcEluZm8uY3JlYXRlQnJhbmNoKHBhcmVudE1vZGVsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbW9kZWwgPSBwSW5mby5nZXRNb2RlbEZyb21CcmFuY2goY3VyQnJhbmNoLCBpZ