knex-firebird-dialect
Version:
Firebird dialect for Knex.js
167 lines (165 loc) • 22.7 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _readOnlyError2 = _interopRequireDefault(require("@babel/runtime/helpers/readOnlyError"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _querycompiler = _interopRequireDefault(require("knex/lib/query/querycompiler"));
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
function _superPropGet(t, o, e, r) { var p = (0, _get2["default"])((0, _getPrototypeOf2["default"])(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; } // Firebird Query Builder & Compiler
var identity = require("lodash/identity");
var reduce = require("lodash/reduce");
var QueryCompiler_Firebird = /*#__PURE__*/function (_QueryCompiler) {
function QueryCompiler_Firebird() {
(0, _classCallCheck2["default"])(this, QueryCompiler_Firebird);
return _callSuper(this, QueryCompiler_Firebird, arguments);
}
(0, _inherits2["default"])(QueryCompiler_Firebird, _QueryCompiler);
return (0, _createClass2["default"])(QueryCompiler_Firebird, [{
key: "columns",
value: function columns() {
var distinctClause = "";
if (this.onlyUnions()) {
return "";
}
var hints = this._hintComments();
var columns = this.grouped.columns || [];
var i = -1,
sql = [];
if (columns) {
while (++i < columns.length) {
var stmt = columns[i];
if (stmt.distinct) distinctClause = "distinct ";
if (stmt.distinctOn) {
distinctClause = this.distinctOn(stmt.value);
continue;
}
if (stmt.type === "aggregate") {
var _sql;
(_sql = sql).push.apply(_sql, (0, _toConsumableArray2["default"])(this.aggregate(stmt)));
} else if (stmt.type === "aggregateRaw") {
sql.push(this.aggregateRaw(stmt));
} else if (stmt.type === "analytic") {
sql.push(this.analytic(stmt));
} else if (stmt.value && stmt.value.length > 0) {
sql.push(this.formatter.columnize(stmt.value));
}
}
}
if (sql.length === 0) sql = ["*"];
return "select ".concat(this._limit(), " ").concat(this._offset(), " ").concat(hints).concat(distinctClause) + sql.join(", ") + (this.tableName ? " from ".concat(this.single.only ? "only " : "").concat(this.tableName) : "");
}
}, {
key: "_limit",
value: function _limit() {
return _superPropGet(QueryCompiler_Firebird, "limit", this, 3)([]).replace("limit", "first");
}
}, {
key: "_offset",
value: function _offset() {
return _superPropGet(QueryCompiler_Firebird, "offset", this, 3)([]).replace("offset", "skip");
}
}, {
key: "offset",
value: function offset() {
return "";
}
}, {
key: "limit",
value: function limit() {
return "";
}
}, {
key: "truncate",
value: function truncate() {
throw new Error("Truncate SQL command does not exists in Firebird.");
}
}, {
key: "insert",
value: function insert() {
var sql = _superPropGet(QueryCompiler_Firebird, "insert", this, 3)([]);
if (sql === "") return sql;
var returning = this.single.returning;
if (returning) sql += this._returning(returning);
return {
sql: sql,
returning: returning
};
}
}, {
key: "_returning",
value: function _returning(value) {
return value ? " returning ".concat(this.formatter.columnize(value)) : "";
}
}, {
key: "_prepInsert",
value: function _prepInsert(insertValues) {
if (Array.isArray(insertValues)) {
if (insertValues.length !== 1) {
throw new Error("Firebird does not support multiple insertions.");
}
insertValues = insertValues[0];
}
var newValue = {};
for (var key in insertValues) {
if (Object.prototype.hasOwnProperty.call(insertValues, key)) {
var value = insertValues[key];
if (typeof value !== "undefined") {
newValue[key] = value;
}
}
}
return _superPropGet(QueryCompiler_Firebird, "_prepInsert", this, 3)([newValue]);
}
}, {
key: "columnInfo",
value: function columnInfo() {
var column = this.getColumnName(this.single.columnInfo);
// The user may have specified a custom wrapIdentifier function in the config. We
// need to run the identifiers through that function, but not format them as
// identifiers otherwise.
var table = this.client.customWrapIdentifier(this.single.table, identity);
var self = this;
return {
sql: "\n select \n rlf.rdb$field_name as name,\n fld.rdb$character_length as max_length,\n typ.rdb$type_name as type,\n rlf.rdb$null_flag as not_null\n from rdb$relation_fields rlf\n inner join rdb$fields fld on fld.rdb$field_name = rlf.rdb$field_source\n inner join rdb$types typ on typ.rdb$type = fld.rdb$field_type\n where rdb$relation_name = '".concat(table.toUpperCase(), "'\n "),
output: function output(_ref) {
var rows = _ref.rows;
var result = reduce(rows, function (columns, value) {
var name = self.getColumnName(value[self.getColumnName("name")].trim());
columns[name] = {
type: value[self.getColumnName("type")].trim().toLowerCase(),
nullable: !value[self.getColumnName("not_null")]
};
if (value.MAX_LENGTH) {
columns[name] = value.MAX_LENGTH;
}
return columns;
}, {});
if (column && !result[column]) {
throw new Error("Specified column \"".concat(column, "\" was not found!"));
}
return column ? result[column] : result;
}
};
}
}, {
key: "getColumnName",
value: function getColumnName(name) {
if (!name) {
return name;
}
return this.client.config.connection.lowercase_keys ? name.toLowerCase() : name;
}
}]);
}(_querycompiler["default"]);
var _default = exports["default"] = QueryCompiler_Firebird;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcXVlcnljb21waWxlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2NhbGxTdXBlciIsInQiLCJvIiwiZSIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiYXBwbHkiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsImNhbGwiLCJfc3VwZXJQcm9wR2V0IiwiciIsInAiLCJfZ2V0MiIsImlkZW50aXR5IiwicmVkdWNlIiwiUXVlcnlDb21waWxlcl9GaXJlYmlyZCIsIl9RdWVyeUNvbXBpbGVyIiwiX2NsYXNzQ2FsbENoZWNrMiIsImFyZ3VtZW50cyIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwia2V5IiwidmFsdWUiLCJjb2x1bW5zIiwiZGlzdGluY3RDbGF1c2UiLCJvbmx5VW5pb25zIiwiaGludHMiLCJfaGludENvbW1lbnRzIiwiZ3JvdXBlZCIsImkiLCJzcWwiLCJsZW5ndGgiLCJzdG10IiwiZGlzdGluY3QiLCJkaXN0aW5jdE9uIiwidHlwZSIsIl9zcWwiLCJwdXNoIiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsImFnZ3JlZ2F0ZSIsImFnZ3JlZ2F0ZVJhdyIsImFuYWx5dGljIiwiZm9ybWF0dGVyIiwiY29sdW1uaXplIiwiY29uY2F0IiwiX2xpbWl0IiwiX29mZnNldCIsImpvaW4iLCJ0YWJsZU5hbWUiLCJzaW5nbGUiLCJvbmx5IiwicmVwbGFjZSIsIm9mZnNldCIsImxpbWl0IiwidHJ1bmNhdGUiLCJFcnJvciIsImluc2VydCIsInJldHVybmluZyIsIl9yZXR1cm5pbmciLCJfcHJlcEluc2VydCIsImluc2VydFZhbHVlcyIsIkFycmF5IiwiaXNBcnJheSIsIm5ld1ZhbHVlIiwiT2JqZWN0IiwiaGFzT3duUHJvcGVydHkiLCJjb2x1bW5JbmZvIiwiY29sdW1uIiwiZ2V0Q29sdW1uTmFtZSIsInRhYmxlIiwiY2xpZW50IiwiY3VzdG9tV3JhcElkZW50aWZpZXIiLCJzZWxmIiwidG9VcHBlckNhc2UiLCJvdXRwdXQiLCJfcmVmIiwicm93cyIsInJlc3VsdCIsIm5hbWUiLCJ0cmltIiwidG9Mb3dlckNhc2UiLCJudWxsYWJsZSIsIk1BWF9MRU5HVEgiLCJjb25maWciLCJjb25uZWN0aW9uIiwibG93ZXJjYXNlX2tleXMiLCJRdWVyeUNvbXBpbGVyIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3F1ZXJ5L2NvbXBpbGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpcmViaXJkIFF1ZXJ5IEJ1aWxkZXIgJiBDb21waWxlclxuaW1wb3J0IFF1ZXJ5Q29tcGlsZXIgZnJvbSBcImtuZXgvbGliL3F1ZXJ5L3F1ZXJ5Y29tcGlsZXJcIjtcbmNvbnN0IGlkZW50aXR5ID0gcmVxdWlyZShcImxvZGFzaC9pZGVudGl0eVwiKTtcbmNvbnN0IHJlZHVjZSA9IHJlcXVpcmUoXCJsb2Rhc2gvcmVkdWNlXCIpO1xuXG5jbGFzcyBRdWVyeUNvbXBpbGVyX0ZpcmViaXJkIGV4dGVuZHMgUXVlcnlDb21waWxlciB7XG4gIGNvbHVtbnMoKSB7XG4gICAgbGV0IGRpc3RpbmN0Q2xhdXNlID0gXCJcIjtcbiAgICBpZiAodGhpcy5vbmx5VW5pb25zKCkpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIGNvbnN0IGhpbnRzID0gdGhpcy5faGludENvbW1lbnRzKCk7XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuZ3JvdXBlZC5jb2x1bW5zIHx8IFtdO1xuICAgIGxldCBpID0gLTEsXG4gICAgICBzcWwgPSBbXTtcblxuICAgIGlmIChjb2x1bW5zKSB7XG4gICAgICB3aGlsZSAoKytpIDwgY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3Qgc3RtdCA9IGNvbHVtbnNbaV07XG4gICAgICAgIGlmIChzdG10LmRpc3RpbmN0KSBkaXN0aW5jdENsYXVzZSA9IFwiZGlzdGluY3QgXCI7XG4gICAgICAgIGlmIChzdG10LmRpc3RpbmN0T24pIHtcbiAgICAgICAgICBkaXN0aW5jdENsYXVzZSA9IHRoaXMuZGlzdGluY3RPbihzdG10LnZhbHVlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RtdC50eXBlID09PSBcImFnZ3JlZ2F0ZVwiKSB7XG4gICAgICAgICAgc3FsLnB1c2goLi4udGhpcy5hZ2dyZWdhdGUoc3RtdCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0bXQudHlwZSA9PT0gXCJhZ2dyZWdhdGVSYXdcIikge1xuICAgICAgICAgIHNxbC5wdXNoKHRoaXMuYWdncmVnYXRlUmF3KHN0bXQpKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdG10LnR5cGUgPT09IFwiYW5hbHl0aWNcIikge1xuICAgICAgICAgIHNxbC5wdXNoKHRoaXMuYW5hbHl0aWMoc3RtdCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0bXQudmFsdWUgJiYgc3RtdC52YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc3FsLnB1c2godGhpcy5mb3JtYXR0ZXIuY29sdW1uaXplKHN0bXQudmFsdWUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3FsLmxlbmd0aCA9PT0gMCkgc3FsID0gW1wiKlwiXTtcbiAgICByZXR1cm4gKFxuICAgICAgYHNlbGVjdCAke3RoaXMuX2xpbWl0KCl9ICR7dGhpcy5fb2Zmc2V0KCl9ICR7aGludHN9JHtkaXN0aW5jdENsYXVzZX1gICtcbiAgICAgIHNxbC5qb2luKFwiLCBcIikgK1xuICAgICAgKHRoaXMudGFibGVOYW1lXG4gICAgICAgID8gYCBmcm9tICR7dGhpcy5zaW5nbGUub25seSA/IFwib25seSBcIiA6IFwiXCJ9JHt0aGlzLnRhYmxlTmFtZX1gXG4gICAgICAgIDogXCJcIilcbiAgICApO1xuICB9XG5cbiAgX2xpbWl0KCkge1xuICAgIHJldHVybiBzdXBlci5saW1pdCgpLnJlcGxhY2UoXCJsaW1pdFwiLCBcImZpcnN0XCIpO1xuICB9XG5cbiAgX29mZnNldCgpIHtcbiAgICByZXR1cm4gc3VwZXIub2Zmc2V0KCkucmVwbGFjZShcIm9mZnNldFwiLCBcInNraXBcIik7XG4gIH1cblxuICBvZmZzZXQoKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICBsaW1pdCgpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIHRydW5jYXRlKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRydW5jYXRlIFNRTCBjb21tYW5kIGRvZXMgbm90IGV4aXN0cyBpbiBGaXJlYmlyZC5cIik7XG4gIH1cblxuICBpbnNlcnQoKSB7XG4gICAgbGV0IHNxbCA9IHN1cGVyLmluc2VydCgpO1xuICAgIGlmIChzcWwgPT09IFwiXCIpIHJldHVybiBzcWw7XG5cbiAgICBjb25zdCB7IHJldHVybmluZyB9ID0gdGhpcy5zaW5nbGU7XG4gICAgaWYgKHJldHVybmluZykgc3FsICs9IHRoaXMuX3JldHVybmluZyhyZXR1cm5pbmcpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNxbDogc3FsLFxuICAgICAgcmV0dXJuaW5nLFxuICAgIH07XG4gIH1cblxuICBfcmV0dXJuaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID8gYCByZXR1cm5pbmcgJHt0aGlzLmZvcm1hdHRlci5jb2x1bW5pemUodmFsdWUpfWAgOiBcIlwiO1xuICB9XG5cbiAgX3ByZXBJbnNlcnQoaW5zZXJ0VmFsdWVzKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5zZXJ0VmFsdWVzKSkge1xuICAgICAgaWYgKGluc2VydFZhbHVlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmlyZWJpcmQgZG9lcyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBpbnNlcnRpb25zLlwiKTtcbiAgICAgIH1cbiAgICAgIGluc2VydFZhbHVlcyA9IGluc2VydFZhbHVlc1swXTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdWYWx1ZSA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIGluc2VydFZhbHVlcykge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpbnNlcnRWYWx1ZXMsIGtleSkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBpbnNlcnRWYWx1ZXNba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIG5ld1ZhbHVlW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3VwZXIuX3ByZXBJbnNlcnQobmV3VmFsdWUpO1xuICB9XG5cbiAgY29sdW1uSW5mbygpIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdldENvbHVtbk5hbWUodGhpcy5zaW5nbGUuY29sdW1uSW5mbyk7XG5cbiAgICAvLyBUaGUgdXNlciBtYXkgaGF2ZSBzcGVjaWZpZWQgYSBjdXN0b20gd3JhcElkZW50aWZpZXIgZnVuY3Rpb24gaW4gdGhlIGNvbmZpZy4gV2VcbiAgICAvLyBuZWVkIHRvIHJ1biB0aGUgaWRlbnRpZmllcnMgdGhyb3VnaCB0aGF0IGZ1bmN0aW9uLCBidXQgbm90IGZvcm1hdCB0aGVtIGFzXG4gICAgLy8gaWRlbnRpZmllcnMgb3RoZXJ3aXNlLlxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5jbGllbnQuY3VzdG9tV3JhcElkZW50aWZpZXIodGhpcy5zaW5nbGUudGFibGUsIGlkZW50aXR5KTtcblxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiB7XG4gICAgICBzcWw6IGBcbiAgICAgIHNlbGVjdCBcbiAgICAgICAgcmxmLnJkYiRmaWVsZF9uYW1lIGFzIG5hbWUsXG4gICAgICAgIGZsZC5yZGIkY2hhcmFjdGVyX2xlbmd0aCBhcyBtYXhfbGVuZ3RoLFxuICAgICAgICB0eXAucmRiJHR5cGVfbmFtZSBhcyB0eXBlLFxuICAgICAgICBybGYucmRiJG51bGxfZmxhZyBhcyBub3RfbnVsbFxuICAgICAgZnJvbSByZGIkcmVsYXRpb25fZmllbGRzIHJsZlxuICAgICAgaW5uZXIgam9pbiByZGIkZmllbGRzIGZsZCBvbiBmbGQucmRiJGZpZWxkX25hbWUgPSBybGYucmRiJGZpZWxkX3NvdXJjZVxuICAgICAgaW5uZXIgam9pbiByZGIkdHlwZXMgdHlwIG9uIHR5cC5yZGIkdHlwZSA9IGZsZC5yZGIkZmllbGRfdHlwZVxuICAgICAgd2hlcmUgcmRiJHJlbGF0aW9uX25hbWUgPSAnJHt0YWJsZS50b1VwcGVyQ2FzZSgpfSdcbiAgICAgIGAsXG4gICAgICBvdXRwdXQoeyByb3dzIH0pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVkdWNlKFxuICAgICAgICAgIHJvd3MsXG4gICAgICAgICAgZnVuY3Rpb24gKGNvbHVtbnMsIHZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gc2VsZi5nZXRDb2x1bW5OYW1lKFxuICAgICAgICAgICAgICB2YWx1ZVtzZWxmLmdldENvbHVtbk5hbWUoXCJuYW1lXCIpXS50cmltKClcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbHVtbnNbbmFtZV0gPSB7XG4gICAgICAgICAgICAgIHR5cGU6IHZhbHVlW3NlbGYuZ2V0Q29sdW1uTmFtZShcInR5cGVcIildLnRyaW0oKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICBudWxsYWJsZTogIXZhbHVlW3NlbGYuZ2V0Q29sdW1uTmFtZShcIm5vdF9udWxsXCIpXSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZS5NQVhfTEVOR1RIKSB7XG4gICAgICAgICAgICAgIGNvbHVtbnNbbmFtZV0gPSB2YWx1ZS5NQVhfTEVOR1RIO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY29sdW1ucztcbiAgICAgICAgICB9LFxuICAgICAgICAgIHt9XG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGNvbHVtbiAmJiAhcmVzdWx0W2NvbHVtbl0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNwZWNpZmllZCBjb2x1bW4gXCIke2NvbHVtbn1cIiB3YXMgbm90IGZvdW5kIWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2x1bW4gPyByZXN1bHRbY29sdW1uXSA6IHJlc3VsdDtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGdldENvbHVtbk5hbWUobmFtZSkge1xuICAgIGlmICghbmFtZSkge1xuICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNsaWVudC5jb25maWcuY29ubmVjdGlvbi5sb3dlcmNhc2Vfa2V5c1xuICAgICAgPyBuYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgIDogbmFtZTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBRdWVyeUNvbXBpbGVyX0ZpcmViaXJkO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFDQSxJQUFBQSxjQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFBeUQsU0FBQUMsV0FBQUMsQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsV0FBQUQsQ0FBQSxPQUFBRSxnQkFBQSxhQUFBRixDQUFBLE9BQUFHLDJCQUFBLGFBQUFKLENBQUEsRUFBQUsseUJBQUEsS0FBQUMsT0FBQSxDQUFBQyxTQUFBLENBQUFOLENBQUEsRUFBQUMsQ0FBQSxZQUFBQyxnQkFBQSxhQUFBSCxDQUFBLEVBQUFRLFdBQUEsSUFBQVAsQ0FBQSxDQUFBUSxLQUFBLENBQUFULENBQUEsRUFBQUUsQ0FBQTtBQUFBLFNBQUFHLDBCQUFBLGNBQUFMLENBQUEsSUFBQVUsT0FBQSxDQUFBQyxTQUFBLENBQUFDLE9BQUEsQ0FBQUMsSUFBQSxDQUFBUCxPQUFBLENBQUFDLFNBQUEsQ0FBQUcsT0FBQSxpQ0FBQVYsQ0FBQSxhQUFBSyx5QkFBQSxZQUFBQSwwQkFBQSxhQUFBTCxDQUFBO0FBQUEsU0FBQWMsY0FBQWQsQ0FBQSxFQUFBQyxD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