db-sql-toolkit
Version:
Helps with SQL statements, database migration, and bulk execution.
237 lines (236 loc) • 56.7 kB
JavaScript
"use strict";
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.bulkExecuteCommand = bulkExecuteCommand;
exports.bulkGetCount = bulkGetCount;
exports.bulkGetRows = bulkGetRows;
exports.bulkInsertEntities = bulkInsertEntities;
var _Database = require("./Database");
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return r; }; var t, r = {}, e = Object.prototype, n = e.hasOwnProperty, o = "function" == typeof Symbol ? Symbol : {}, i = o.iterator || "@@iterator", a = o.asyncIterator || "@@asyncIterator", u = o.toStringTag || "@@toStringTag"; function c(t, r, e, n) { return Object.defineProperty(t, r, { value: e, enumerable: !n, configurable: !n, writable: !n }); } try { c({}, ""); } catch (t) { c = function c(t, r, e) { return t[r] = e; }; } function h(r, e, n, o) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype); return c(a, "_invoke", function (r, e, n) { var o = 1; return function (i, a) { if (3 === o) throw Error("Generator is already running"); if (4 === o) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var u = n.delegate; if (u) { var c = d(u, n); if (c) { if (c === f) continue; return c; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (1 === o) throw o = 4, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = 3; var h = s(r, e, n); if ("normal" === h.type) { if (o = n.done ? 4 : 2, h.arg === f) continue; return { value: h.arg, done: n.done }; } "throw" === h.type && (o = 4, n.method = "throw", n.arg = h.arg); } }; }(r, n, new Context(o || [])), !0), a; } function s(t, r, e) { try { return { type: "normal", arg: t.call(r, e) }; } catch (t) { return { type: "throw", arg: t }; } } r.wrap = h; var f = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var l = {}; c(l, i, function () { return this; }); var p = Object.getPrototypeOf, y = p && p(p(x([]))); y && y !== e && n.call(y, i) && (l = y); var v = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(l); function g(t) { ["next", "throw", "return"].forEach(function (r) { c(t, r, function (t) { return this._invoke(r, t); }); }); } function AsyncIterator(t, r) { function e(o, i, a, u) { var c = s(t[o], t, i); if ("throw" !== c.type) { var h = c.arg, f = h.value; return f && "object" == _typeof(f) && n.call(f, "__await") ? r.resolve(f.__await).then(function (t) { e("next", t, a, u); }, function (t) { e("throw", t, a, u); }) : r.resolve(f).then(function (t) { h.value = t, a(h); }, function (t) { return e("throw", t, a, u); }); } u(c.arg); } var o; c(this, "_invoke", function (t, n) { function i() { return new r(function (r, o) { e(t, n, r, o); }); } return o = o ? o.then(i, i) : i(); }, !0); } function d(r, e) { var n = e.method, o = r.i[n]; if (o === t) return e.delegate = null, "throw" === n && r.i["return"] && (e.method = "return", e.arg = t, d(r, e), "throw" === e.method) || "return" !== n && (e.method = "throw", e.arg = new TypeError("The iterator does not provide a '" + n + "' method")), f; var i = s(o, r.i, e.arg); if ("throw" === i.type) return e.method = "throw", e.arg = i.arg, e.delegate = null, f; var a = i.arg; return a ? a.done ? (e[r.r] = a.value, e.next = r.n, "return" !== e.method && (e.method = "next", e.arg = t), e.delegate = null, f) : a : (e.method = "throw", e.arg = new TypeError("iterator result is not an object"), e.delegate = null, f); } function w(t) { this.tryEntries.push(t); } function m(r) { var e = r[4] || {}; e.type = "normal", e.arg = t, r[4] = e; } function Context(t) { this.tryEntries = [[-1]], t.forEach(w, this), this.reset(!0); } function x(r) { if (null != r) { var e = r[i]; if (e) return e.call(r); if ("function" == typeof r.next) return r; if (!isNaN(r.length)) { var o = -1, a = function e() { for (; ++o < r.length;) if (n.call(r, o)) return e.value = r[o], e.done = !1, e; return e.value = t, e.done = !0, e; }; return a.next = a; } } throw new TypeError(_typeof(r) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, c(v, "constructor", GeneratorFunctionPrototype), c(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = c(GeneratorFunctionPrototype, u, "GeneratorFunction"), r.isGeneratorFunction = function (t) { var r = "function" == typeof t && t.constructor; return !!r && (r === GeneratorFunction || "GeneratorFunction" === (r.displayName || r.name)); }, r.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, c(t, u, "GeneratorFunction")), t.prototype = Object.create(v), t; }, r.awrap = function (t) { return { __await: t }; }, g(AsyncIterator.prototype), c(AsyncIterator.prototype, a, function () { return this; }), r.AsyncIterator = AsyncIterator, r.async = function (t, e, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(h(t, e, n, o), i); return r.isGeneratorFunction(e) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, g(v), c(v, u, "Generator"), c(v, i, function () { return this; }), c(v, "toString", function () { return "[object Generator]"; }), r.keys = function (t) { var r = Object(t), e = []; for (var n in r) e.unshift(n); return function t() { for (; e.length;) if ((n = e.pop()) in r) return t.value = n, t.done = !1, t; return t.done = !0, t; }; }, r.values = x, Context.prototype = { constructor: Context, reset: function reset(r) { if (this.prev = this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(m), !r) for (var e in this) "t" === e.charAt(0) && n.call(this, e) && !isNaN(+e.slice(1)) && (this[e] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0][4]; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(r) { if (this.done) throw r; var e = this; function n(t) { a.type = "throw", a.arg = r, e.next = t; } for (var o = e.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i[4], u = this.prev, c = i[1], h = i[2]; if (-1 === i[0]) return n("end"), !1; if (!c && !h) throw Error("try statement without catch or finally"); if (null != i[0] && i[0] <= u) { if (u < c) return this.method = "next", this.arg = t, n(c), !0; if (u < h) return n(h), !1; } } }, abrupt: function abrupt(t, r) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var n = this.tryEntries[e]; if (n[0] > -1 && n[0] <= this.prev && this.prev < n[2]) { var o = n; break; } } o && ("break" === t || "continue" === t) && o[0] <= r && r <= o[2] && (o = null); var i = o ? o[4] : {}; return i.type = t, i.arg = r, o ? (this.method = "next", this.next = o[2], f) : this.complete(i); }, complete: function complete(t, r) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && r && (this.next = r), f; }, finish: function finish(t) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var e = this.tryEntries[r]; if (e[2] === t) return this.complete(e[4], e[3]), m(e), f; } }, "catch": function _catch(t) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var e = this.tryEntries[r]; if (e[0] === t) { var n = e[4]; if ("throw" === n.type) { var o = n.arg; m(e); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(r, e, n) { return this.delegate = { i: x(r), r: e, n: n }, "next" === this.method && (this.arg = t), f; } }, r; }
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
/**
* Inserts data into a database in as few operations as possible.
* @param database The database.
* @param entities The collection of data to insert.
* @param param2 A tuple consisting of the "INSERT INTO" SQL statement a function to get the parameters for one entity. The number of parameters must be equal for all entities.
*/
function bulkInsertEntities(_x, _x2, _x3) {
return _bulkInsertEntities.apply(this, arguments);
}
/**
* Executes a statement in as few operations as possible.
* @param database The database.
* @param executeParams A tuple consisting of the SQL statement, the parameters of the "WHERE" clause, and the parameters of the "IN" clause.
*/
function _bulkInsertEntities() {
_bulkInsertEntities = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(database, entities, _ref) {
var statement, getParameters, paramsPerEntity, chunkSize, parametersStatement, chunkEntities, chunk, promises, values, valueStatement, fullStatement;
return _regeneratorRuntime().wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
statement = _ref.statement, getParameters = _ref.getParameters;
if (entities[0]) {
_context.next = 3;
break;
}
return _context.abrupt("return");
case 3:
ensurePlaceholderCount(statement, 1);
paramsPerEntity = getParameters(entities[0]).length;
chunkSize = Math.floor(database.MaxVariableNumber / paramsPerEntity);
parametersStatement = Array.from({
length: paramsPerEntity
}).fill("?").join(",");
chunkEntities = _toConsumableArray(entities);
promises = [];
while (chunkEntities.length > 0) {
chunk = chunkEntities.splice(0, chunkSize);
values = chunk.flatMap(getParameters);
valueStatement = Array.from({
length: chunk.length
}).fill(parametersStatement).join("),(");
fullStatement = statement.replace("?", valueStatement);
promises.push(database.executeSqlCommand(fullStatement, values));
}
_context.next = 12;
return Promise.all(promises);
case 12:
case "end":
return _context.stop();
}
}, _callee);
}));
return _bulkInsertEntities.apply(this, arguments);
}
function bulkExecuteCommand(_x4, _x5) {
return _bulkExecuteCommand.apply(this, arguments);
}
/**
* Loads data from a database in as few operations as possible.
* @param database The database.
* @param executeParams The tuple consisting of the SQL statement, the parameters of the "WHERE" clause, and the parameters of the "IN" clause.
*/
function _bulkExecuteCommand() {
_bulkExecuteCommand = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(database, executeParams) {
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
_context2.next = 2;
return bulkDo(database, executeParams, database.executeSqlCommand);
case 2:
case "end":
return _context2.stop();
}
}, _callee2);
}));
return _bulkExecuteCommand.apply(this, arguments);
}
function bulkGetRows(_x6, _x7) {
return _bulkGetRows.apply(this, arguments);
}
/**
* Gets the total count of rows from a database in as few operations as possible.
* @param database The database.
* @param executeParams The tuple consisting of the SQL statement, the parameters of the "WHERE" clause, and the parameters of the "IN" clause.
* @returns The total count of rows.
* @example
* ```ts
* const priorities = ["1", "2", "3"];
* const statement = sql`
* SELECT COUNT(*)
* FROM process
* WHERE
* priority IN (${priorities})
* `;
* const count = await bulkGetCount(database, statement)
* ```
*/
function _bulkGetRows() {
_bulkGetRows = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(database, executeParams) {
var results;
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
_context3.next = 2;
return bulkDo(database, executeParams, database.getRows);
case 2:
results = _context3.sent;
return _context3.abrupt("return", results.flat());
case 4:
case "end":
return _context3.stop();
}
}, _callee3);
}));
return _bulkGetRows.apply(this, arguments);
}
function bulkGetCount(_x8, _x9) {
return _bulkGetCount.apply(this, arguments);
}
function _bulkGetCount() {
_bulkGetCount = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee4(database, executeParams) {
var results, totalCount, _iterator, _step, _rows$0$countProperty, _rows$, rows;
return _regeneratorRuntime().wrap(function _callee4$(_context4) {
while (1) switch (_context4.prev = _context4.next) {
case 0:
_context4.next = 2;
return bulkDo(database, executeParams, database.getRows);
case 2:
results = _context4.sent;
totalCount = 0;
_iterator = _createForOfIteratorHelper(results);
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
rows = _step.value;
totalCount += (_rows$0$countProperty = (_rows$ = rows[0]) === null || _rows$ === void 0 ? void 0 : _rows$[_Database.countPropertyName]) !== null && _rows$0$countProperty !== void 0 ? _rows$0$countProperty : 0;
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
return _context4.abrupt("return", totalCount);
case 7:
case "end":
return _context4.stop();
}
}, _callee4);
}));
return _bulkGetCount.apply(this, arguments);
}
function bulkDo(_x0, _x1, _x10) {
return _bulkDo.apply(this, arguments);
}
function _bulkDo() {
_bulkDo = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee5(database, _ref2, op) {
var statement, parameters, bulkParameters, bulkParametersIndex, parameterPlaceholderIndex, statementToLastPlaceholder, statementFromLastPlaceholder, keysBeforeBulkKeys, keysAfterBulkKeys, chunkSize, allBulkKeys, promises, chunkBulkKeys, parametersStatement, fullStatement, results;
return _regeneratorRuntime().wrap(function _callee5$(_context5) {
while (1) switch (_context5.prev = _context5.next) {
case 0:
statement = _ref2.statement, parameters = _ref2.parameters, bulkParameters = _ref2.bulkParameters, bulkParametersIndex = _ref2.bulkParametersIndex;
if (!(bulkParameters.length === 0)) {
_context5.next = 3;
break;
}
return _context5.abrupt("return", []);
case 3:
ensurePlaceholderCount(statement, parameters.length + 1);
parameterPlaceholderIndex = findNthPlaceholder(statement, bulkParametersIndex);
statementToLastPlaceholder = statement.slice(0, parameterPlaceholderIndex);
statementFromLastPlaceholder = statement.slice(parameterPlaceholderIndex + 1);
keysBeforeBulkKeys = parameters.slice(0, bulkParametersIndex);
keysAfterBulkKeys = parameters.slice(bulkParametersIndex);
chunkSize = database.MaxVariableNumber - parameters.length;
allBulkKeys = _toConsumableArray(bulkParameters);
promises = [];
while (allBulkKeys.length > 0) {
chunkBulkKeys = allBulkKeys.splice(0, chunkSize);
parametersStatement = Array.from({
length: chunkBulkKeys.length
}).fill("?").join(",");
fullStatement = "".concat(statementToLastPlaceholder).concat(parametersStatement).concat(statementFromLastPlaceholder);
promises.push(op(fullStatement, [].concat(_toConsumableArray(keysBeforeBulkKeys), _toConsumableArray(chunkBulkKeys), _toConsumableArray(keysAfterBulkKeys))));
}
_context5.next = 15;
return Promise.all(promises);
case 15:
results = _context5.sent;
return _context5.abrupt("return", results);
case 17:
case "end":
return _context5.stop();
}
}, _callee5);
}));
return _bulkDo.apply(this, arguments);
}
function ensurePlaceholderCount(statement, expectedCount) {
var _statement$match$leng, _statement$match;
var placeholderCount = (_statement$match$leng = (_statement$match = statement.match(/\?/g)) === null || _statement$match === void 0 ? void 0 : _statement$match.length) !== null && _statement$match$leng !== void 0 ? _statement$match$leng : 0;
if (placeholderCount !== expectedCount) {
throw new Error("The number of placeholders does not match the parameters.");
}
}
function findNthPlaceholder(statement, placeholderIndex) {
var position = 0;
var currentIndex = -1;
for (var i = 0; i <= placeholderIndex; i++) {
currentIndex = statement.indexOf("?", position);
if (currentIndex === -1) {
return -1;
}
position = currentIndex + 1;
}
return currentIndex;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfRGF0YWJhc2UiLCJyZXF1aXJlIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJyIiwiZSIsInQiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiaXNBcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsImxlbmd0aCIsIl9uIiwiRiIsInMiLCJuIiwiZG9uZSIsInZhbHVlIiwiZiIsIlR5cGVFcnJvciIsIm8iLCJhIiwidSIsImNhbGwiLCJuZXh0IiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiaSIsImFzeW5jSXRlcmF0b3IiLCJ0b1N0cmluZ1RhZyIsImMiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImgiLCJHZW5lcmF0b3IiLCJjcmVhdGUiLCJFcnJvciIsIm1ldGhvZCIsImFyZyIsImRlbGVnYXRlIiwiZCIsInNlbnQiLCJfc2VudCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiYWJydXB0IiwidHlwZSIsIkNvbnRleHQiLCJ3cmFwIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsImwiLCJwIiwiZ2V0UHJvdG90eXBlT2YiLCJ5IiwieCIsInYiLCJnIiwiZm9yRWFjaCIsIl9pbnZva2UiLCJBc3luY0l0ZXJhdG9yIiwiX3R5cGVvZiIsInJlc29sdmUiLCJfX2F3YWl0IiwidGhlbiIsInciLCJ0cnlFbnRyaWVzIiwicHVzaCIsIm0iLCJyZXNldCIsImlzTmFOIiwiZGlzcGxheU5hbWUiLCJpc0dlbmVyYXRvckZ1bmN0aW9uIiwiY29uc3RydWN0b3IiLCJuYW1lIiwibWFyayIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiYXdyYXAiLCJhc3luYyIsIlByb21pc2UiLCJrZXlzIiwidW5zaGlmdCIsInBvcCIsInZhbHVlcyIsInByZXYiLCJjaGFyQXQiLCJzbGljZSIsInN0b3AiLCJydmFsIiwiY29tcGxldGUiLCJmaW5pc2giLCJfY2F0Y2giLCJkZWxlZ2F0ZVlpZWxkIiwiX3RvQ29uc3VtYWJsZUFycmF5IiwiX2FycmF5V2l0aG91dEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheSIsIl9ub25JdGVyYWJsZVNwcmVhZCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJmcm9tIiwidGVzdCIsImFzeW5jR2VuZXJhdG9yU3RlcCIsIl9hc3luY1RvR2VuZXJhdG9yIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJfbmV4dCIsIl90aHJvdyIsImJ1bGtJbnNlcnRFbnRpdGllcyIsIl94IiwiX3gyIiwiX3gzIiwiX2J1bGtJbnNlcnRFbnRpdGllcyIsIl9jYWxsZWUiLCJkYXRhYmFzZSIsImVudGl0aWVzIiwiX3JlZiIsInN0YXRlbWVudCIsImdldFBhcmFtZXRlcnMiLCJwYXJhbXNQZXJFbnRpdHkiLCJjaHVua1NpemUiLCJwYXJhbWV0ZXJzU3RhdGVtZW50IiwiY2h1bmtFbnRpdGllcyIsImNodW5rIiwicHJvbWlzZXMiLCJ2YWx1ZVN0YXRlbWVudCIsImZ1bGxTdGF0ZW1lbnQiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwiZW5zdXJlUGxhY2Vob2xkZXJDb3VudCIsIk1hdGgiLCJmbG9vciIsIk1heFZhcmlhYmxlTnVtYmVyIiwiZmlsbCIsImpvaW4iLCJzcGxpY2UiLCJmbGF0TWFwIiwicmVwbGFjZSIsImV4ZWN1dGVTcWxDb21tYW5kIiwiYWxsIiwiYnVsa0V4ZWN1dGVDb21tYW5kIiwiX3g0IiwiX3g1IiwiX2J1bGtFeGVjdXRlQ29tbWFuZCIsIl9jYWxsZWUyIiwiZXhlY3V0ZVBhcmFtcyIsIl9jYWxsZWUyJCIsIl9jb250ZXh0MiIsImJ1bGtEbyIsImJ1bGtHZXRSb3dzIiwiX3g2IiwiX3g3IiwiX2J1bGtHZXRSb3dzIiwiX2NhbGxlZTMiLCJyZXN1bHRzIiwiX2NhbGxlZTMkIiwiX2NvbnRleHQzIiwiZ2V0Um93cyIsImZsYXQiLCJidWxrR2V0Q291bnQiLCJfeDgiLCJfeDkiLCJfYnVsa0dldENvdW50IiwiX2NhbGxlZTQiLCJ0b3RhbENvdW50IiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJfcm93cyQwJGNvdW50UHJvcGVydHkiLCJfcm93cyQiLCJyb3dzIiwiX2NhbGxlZTQkIiwiX2NvbnRleHQ0IiwiY291bnRQcm9wZXJ0eU5hbWUiLCJlcnIiLCJfeDAiLCJfeDEiLCJfeDEwIiwiX2J1bGtEbyIsIl9jYWxsZWU1IiwiX3JlZjIiLCJvcCIsInBhcmFtZXRlcnMiLCJidWxrUGFyYW1ldGVycyIsImJ1bGtQYXJhbWV0ZXJzSW5kZXgiLCJwYXJhbWV0ZXJQbGFjZWhvbGRlckluZGV4Iiwic3RhdGVtZW50VG9MYXN0UGxhY2Vob2xkZXIiLCJzdGF0ZW1lbnRGcm9tTGFzdFBsYWNlaG9sZGVyIiwia2V5c0JlZm9yZUJ1bGtLZXlzIiwia2V5c0FmdGVyQnVsa0tleXMiLCJhbGxCdWxrS2V5cyIsImNodW5rQnVsa0tleXMiLCJfY2FsbGVlNSQiLCJfY29udGV4dDUiLCJmaW5kTnRoUGxhY2Vob2xkZXIiLCJjb25jYXQiLCJleHBlY3RlZENvdW50IiwiX3N0YXRlbWVudCRtYXRjaCRsZW5nIiwiX3N0YXRlbWVudCRtYXRjaCIsInBsYWNlaG9sZGVyQ291bnQiLCJtYXRjaCIsInBsYWNlaG9sZGVySW5kZXgiLCJwb3NpdGlvbiIsImN1cnJlbnRJbmRleCIsImluZGV4T2YiXSwic291cmNlcyI6WyIuLi9zcmMvYnVsay50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIENvdW50Um93LCB0eXBlIERhdGFiYXNlLCBjb3VudFByb3BlcnR5TmFtZSB9IGZyb20gXCIuL0RhdGFiYXNlXCI7XG5pbXBvcnQgdHlwZSB7IERlZmF1bHRQYXJhbVR5cGUgfSBmcm9tIFwiLi9zcWxcIjtcblxuaW50ZXJmYWNlIEJ1bGtTdGF0ZW1lbnRQYXJhbXM8VERhdGEsIFRQYXJhbSA9IERlZmF1bHRQYXJhbVR5cGU+IHtcblx0c3RhdGVtZW50OiBzdHJpbmc7XG5cdGdldFBhcmFtZXRlcnM6IChkYXRhOiBURGF0YSkgPT4gVFBhcmFtW107XG59XG5cbmludGVyZmFjZSBCdWxrRXhlY3V0ZVN0YXRlbWVudFBhcmFtczxUUGFyYW0gPSBEZWZhdWx0UGFyYW1UeXBlPiB7XG5cdHN0YXRlbWVudDogc3RyaW5nO1xuXHRwYXJhbWV0ZXJzOiBUUGFyYW1bXTtcblx0YnVsa1BhcmFtZXRlcnM6IFRQYXJhbVtdO1xuXHRidWxrUGFyYW1ldGVyc0luZGV4OiBudW1iZXI7XG59XG5cbi8qKlxuICogSW5zZXJ0cyBkYXRhIGludG8gYSBkYXRhYmFzZSBpbiBhcyBmZXcgb3BlcmF0aW9ucyBhcyBwb3NzaWJsZS5cbiAqIEBwYXJhbSBkYXRhYmFzZSBUaGUgZGF0YWJhc2UuXG4gKiBAcGFyYW0gZW50aXRpZXMgVGhlIGNvbGxlY3Rpb24gb2YgZGF0YSB0byBpbnNlcnQuXG4gKiBAcGFyYW0gcGFyYW0yIEEgdHVwbGUgY29uc2lzdGluZyBvZiB0aGUgXCJJTlNFUlQgSU5UT1wiIFNRTCBzdGF0ZW1lbnQgYSBmdW5jdGlvbiB0byBnZXQgdGhlIHBhcmFtZXRlcnMgZm9yIG9uZSBlbnRpdHkuIFRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBtdXN0IGJlIGVxdWFsIGZvciBhbGwgZW50aXRpZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1bGtJbnNlcnRFbnRpdGllczxURGF0YSwgVFBhcmFtID0gRGVmYXVsdFBhcmFtVHlwZT4oXG5cdGRhdGFiYXNlOiBEYXRhYmFzZTxUUGFyYW0+LFxuXHRlbnRpdGllczogVERhdGFbXSxcblx0eyBzdGF0ZW1lbnQsIGdldFBhcmFtZXRlcnMgfTogQnVsa1N0YXRlbWVudFBhcmFtczxURGF0YSwgVFBhcmFtPixcbik6IFByb21pc2U8dm9pZD4ge1xuXHRpZiAoIWVudGl0aWVzWzBdKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0ZW5zdXJlUGxhY2Vob2xkZXJDb3VudChzdGF0ZW1lbnQsIDEpO1xuXG5cdGNvbnN0IHBhcmFtc1BlckVudGl0eSA9IGdldFBhcmFtZXRlcnMoZW50aXRpZXNbMF0pLmxlbmd0aDtcblx0Y29uc3QgY2h1bmtTaXplID0gTWF0aC5mbG9vcihkYXRhYmFzZS5NYXhWYXJpYWJsZU51bWJlciAvIHBhcmFtc1BlckVudGl0eSk7XG5cdGNvbnN0IHBhcmFtZXRlcnNTdGF0ZW1lbnQgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBwYXJhbXNQZXJFbnRpdHkgfSkuZmlsbChcIj9cIikuam9pbihcIixcIik7XG5cblx0Y29uc3QgY2h1bmtFbnRpdGllcyA9IFsuLi5lbnRpdGllc107XG5cblx0bGV0IGNodW5rOiBURGF0YVtdO1xuXHRjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG5cblx0d2hpbGUgKGNodW5rRW50aXRpZXMubGVuZ3RoID4gMCkge1xuXHRcdGNodW5rID0gY2h1bmtFbnRpdGllcy5zcGxpY2UoMCwgY2h1bmtTaXplKTtcblxuXHRcdGNvbnN0IHZhbHVlcyA9IGNodW5rLmZsYXRNYXAoZ2V0UGFyYW1ldGVycyk7XG5cdFx0Y29uc3QgdmFsdWVTdGF0ZW1lbnQgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjaHVuay5sZW5ndGggfSkuZmlsbChwYXJhbWV0ZXJzU3RhdGVtZW50KS5qb2luKFwiKSwoXCIpO1xuXG5cdFx0Y29uc3QgZnVsbFN0YXRlbWVudCA9IHN0YXRlbWVudC5yZXBsYWNlKFwiP1wiLCB2YWx1ZVN0YXRlbWVudCk7XG5cblx0XHRwcm9taXNlcy5wdXNoKGRhdGFiYXNlLmV4ZWN1dGVTcWxDb21tYW5kKGZ1bGxTdGF0ZW1lbnQsIHZhbHVlcykpO1xuXHR9XG5cblx0YXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGEgc3RhdGVtZW50IGluIGFzIGZldyBvcGVyYXRpb25zIGFzIHBvc3NpYmxlLlxuICogQHBhcmFtIGRhdGFiYXNlIFRoZSBkYXRhYmFzZS5cbiAqIEBwYXJhbSBleGVjdXRlUGFyYW1zIEEgdHVwbGUgY29uc2lzdGluZyBvZiB0aGUgU1FMIHN0YXRlbWVudCwgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIFwiV0hFUkVcIiBjbGF1c2UsIGFuZCB0aGUgcGFyYW1ldGVycyBvZiB0aGUgXCJJTlwiIGNsYXVzZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVsa0V4ZWN1dGVDb21tYW5kPFRQYXJhbSA9IERlZmF1bHRQYXJhbVR5cGU+KFxuXHRkYXRhYmFzZTogRGF0YWJhc2U8VFBhcmFtPixcblx0ZXhlY3V0ZVBhcmFtczogQnVsa0V4ZWN1dGVTdGF0ZW1lbnRQYXJhbXM8VFBhcmFtPixcbik6IFByb21pc2U8dm9pZD4ge1xuXHRhd2FpdCBidWxrRG8oZGF0YWJhc2UsIGV4ZWN1dGVQYXJhbXMsIGRhdGFiYXNlLmV4ZWN1dGVTcWxDb21tYW5kKTtcbn1cblxuLyoqXG4gKiBMb2FkcyBkYXRhIGZyb20gYSBkYXRhYmFzZSBpbiBhcyBmZXcgb3BlcmF0aW9ucyBhcyBwb3NzaWJsZS5cbiAqIEBwYXJhbSBkYXRhYmFzZSBUaGUgZGF0YWJhc2UuXG4gKiBAcGFyYW0gZXhlY3V0ZVBhcmFtcyBUaGUgdHVwbGUgY29uc2lzdGluZyBvZiB0aGUgU1FMIHN0YXRlbWVudCwgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIFwiV0hFUkVcIiBjbGF1c2UsIGFuZCB0aGUgcGFyYW1ldGVycyBvZiB0aGUgXCJJTlwiIGNsYXVzZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVsa0dldFJvd3M8VERhdGEsIFRQYXJhbSA9IERlZmF1bHRQYXJhbVR5cGU+KFxuXHRkYXRhYmFzZTogRGF0YWJhc2U8VFBhcmFtPixcblx0ZXhlY3V0ZVBhcmFtczogQnVsa0V4ZWN1dGVTdGF0ZW1lbnRQYXJhbXM8VFBhcmFtPixcbik6IFByb21pc2U8VERhdGFbXT4ge1xuXHRjb25zdCByZXN1bHRzID0gYXdhaXQgYnVsa0RvPFREYXRhW10sIFRQYXJhbT4oZGF0YWJhc2UsIGV4ZWN1dGVQYXJhbXMsIGRhdGFiYXNlLmdldFJvd3MpO1xuXG5cdHJldHVybiByZXN1bHRzLmZsYXQoKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB0b3RhbCBjb3VudCBvZiByb3dzIGZyb20gYSBkYXRhYmFzZSBpbiBhcyBmZXcgb3BlcmF0aW9ucyBhcyBwb3NzaWJsZS5cbiAqIEBwYXJhbSBkYXRhYmFzZSBUaGUgZGF0YWJhc2UuXG4gKiBAcGFyYW0gZXhlY3V0ZVBhcmFtcyBUaGUgdHVwbGUgY29uc2lzdGluZyBvZiB0aGUgU1FMIHN0YXRlbWVudCwgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIFwiV0hFUkVcIiBjbGF1c2UsIGFuZCB0aGUgcGFyYW1ldGVycyBvZiB0aGUgXCJJTlwiIGNsYXVzZS5cbiAqIEByZXR1cm5zIFRoZSB0b3RhbCBjb3VudCBvZiByb3dzLlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBwcmlvcml0aWVzID0gW1wiMVwiLCBcIjJcIiwgXCIzXCJdO1xuICogY29uc3Qgc3RhdGVtZW50ID0gc3FsYFxuICogICBTRUxFQ1QgQ09VTlQoKilcbiAqICAgRlJPTSBwcm9jZXNzXG4gKiAgIFdIRVJFXG4gKiAgICAgcHJpb3JpdHkgSU4gKCR7cHJpb3JpdGllc30pXG4gKiBgO1xuICogY29uc3QgY291bnQgPSBhd2FpdCBidWxrR2V0Q291bnQoZGF0YWJhc2UsIHN0YXRlbWVudClcbiAqIGBgYFxuICovXG5hc3luYyBmdW5jdGlvbiBidWxrR2V0Q291bnQ8VFBhcmFtID0gRGVmYXVsdFBhcmFtVHlwZT4oXG5cdGRhdGFiYXNlOiBEYXRhYmFzZTxUUGFyYW0+LFxuXHRleGVjdXRlUGFyYW1zOiBCdWxrRXhlY3V0ZVN0YXRlbWVudFBhcmFtczxUUGFyYW0+LFxuKTogUHJvbWlzZTxudW1iZXI+IHtcblx0Y29uc3QgcmVzdWx0cyA9IGF3YWl0IGJ1bGtEbzxDb3VudFJvd1tdLCBUUGFyYW0+KGRhdGFiYXNlLCBleGVjdXRlUGFyYW1zLCBkYXRhYmFzZS5nZXRSb3dzKTtcblxuXHRsZXQgdG90YWxDb3VudCA9IDA7XG5cblx0Zm9yIChjb25zdCByb3dzIG9mIHJlc3VsdHMpIHtcblx0XHR0b3RhbENvdW50ICs9IHJvd3NbMF0/Lltjb3VudFByb3BlcnR5TmFtZV0gPz8gMDtcblx0fVxuXG5cdHJldHVybiB0b3RhbENvdW50O1xufVxuXG5hc3luYyBmdW5jdGlvbiBidWxrRG88VERhdGEsIFRQYXJhbT4oXG5cdGRhdGFiYXNlOiBEYXRhYmFzZTxUUGFyYW0+LFxuXHR7IHN0YXRlbWVudCwgcGFyYW1ldGVycywgYnVsa1BhcmFtZXRlcnMsIGJ1bGtQYXJhbWV0ZXJzSW5kZXggfTogQnVsa0V4ZWN1dGVTdGF0ZW1lbnRQYXJhbXM8VFBhcmFtPixcblx0b3A6IChzdGF0ZW1lbnQ6IHN0cmluZywgcGFyYW1ldGVyczogVFBhcmFtW10pID0+IFByb21pc2U8VERhdGE+LFxuKTogUHJvbWlzZTxURGF0YVtdPiB7XG5cdGlmIChidWxrUGFyYW1ldGVycy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4gW107XG5cdH1cblxuXHRlbnN1cmVQbGFjZWhvbGRlckNvdW50KHN0YXRlbWVudCwgcGFyYW1ldGVycy5sZW5ndGggKyAxKTtcblxuXHRjb25zdCBwYXJhbWV0ZXJQbGFjZWhvbGRlckluZGV4ID0gZmluZE50aFBsYWNlaG9sZGVyKHN0YXRlbWVudCwgYnVsa1BhcmFtZXRlcnNJbmRleCk7XG5cdGNvbnN0IHN0YXRlbWVudFRvTGFzdFBsYWNlaG9sZGVyID0gc3RhdGVtZW50LnNsaWNlKDAsIHBhcmFtZXRlclBsYWNlaG9sZGVySW5kZXgpO1xuXHRjb25zdCBzdGF0ZW1lbnRGcm9tTGFzdFBsYWNlaG9sZGVyID0gc3RhdGVtZW50LnNsaWNlKHBhcmFtZXRlclBsYWNlaG9sZGVySW5kZXggKyAxKTtcblx0Y29uc3Qga2V5c0JlZm9yZUJ1bGtLZXlzID0gcGFyYW1ldGVycy5zbGljZSgwLCBidWxrUGFyYW1ldGVyc0luZGV4KTtcblx0Y29uc3Qga2V5c0FmdGVyQnVsa0tleXMgPSBwYXJhbWV0ZXJzLnNsaWNlKGJ1bGtQYXJhbWV0ZXJzSW5kZXgpO1xuXG5cdGNvbnN0IGNodW5rU2l6ZSA9IGRhdGFiYXNlLk1heFZhcmlhYmxlTnVtYmVyIC0gcGFyYW1ldGVycy5sZW5ndGg7XG5cdGNvbnN0IGFsbEJ1bGtLZXlzID0gWy4uLmJ1bGtQYXJhbWV0ZXJzXSBhcyBUUGFyYW1bXTtcblxuXHRjb25zdCBwcm9taXNlczogUHJvbWlzZTxURGF0YT5bXSA9IFtdO1xuXG5cdHdoaWxlIChhbGxCdWxrS2V5cy5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgY2h1bmtCdWxrS2V5cyA9IGFsbEJ1bGtLZXlzLnNwbGljZSgwLCBjaHVua1NpemUpO1xuXHRcdGNvbnN0IHBhcmFtZXRlcnNTdGF0ZW1lbnQgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjaHVua0J1bGtLZXlzLmxlbmd0aCB9KS5maWxsKFwiP1wiKS5qb2luKFwiLFwiKTtcblx0XHRjb25zdCBmdWxsU3RhdGVtZW50ID0gYCR7c3RhdGVtZW50VG9MYXN0UGxhY2Vob2xkZXJ9JHtwYXJhbWV0ZXJzU3RhdGVtZW50fSR7c3RhdGVtZW50RnJvbUxhc3RQbGFjZWhvbGRlcn1gO1xuXG5cdFx0cHJvbWlzZXMucHVzaChvcChmdWxsU3RhdGVtZW50LCBbLi4ua2V5c0JlZm9yZUJ1bGtLZXlzLCAuLi5jaHVua0J1bGtLZXlzLCAuLi5rZXlzQWZ0ZXJCdWxrS2V5c10pKTtcblx0fVxuXG5cdGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZVBsYWNlaG9sZGVyQ291bnQoc3RhdGVtZW50OiBzdHJpbmcsIGV4cGVjdGVkQ291bnQ6IG51bWJlcik6IHZvaWQge1xuXHRjb25zdCBwbGFjZWhvbGRlckNvdW50ID0gc3RhdGVtZW50Lm1hdGNoKC9cXD8vZ3UpPy5sZW5ndGggPz8gMDtcblxuXHRpZiAocGxhY2Vob2xkZXJDb3VudCAhPT0gZXhwZWN0ZWRDb3VudCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBudW1iZXIgb2YgcGxhY2Vob2xkZXJzIGRvZXMgbm90IG1hdGNoIHRoZSBwYXJhbWV0ZXJzLlwiKTtcblx0fVxufVxuXG5mdW5jdGlvbiBmaW5kTnRoUGxhY2Vob2xkZXIoc3RhdGVtZW50OiBzdHJpbmcsIHBsYWNlaG9sZGVySW5kZXg6IG51bWJlcik6IG51bWJlciB7XG5cdGxldCBwb3NpdGlvbiA9IDA7XG5cdGxldCBjdXJyZW50SW5kZXggPSAtMTtcblxuXHRmb3IgKGxldCBpID0gMDsgaSA8PSBwbGFjZWhvbGRlckluZGV4OyBpKyspIHtcblx0XHRjdXJyZW50SW5kZXggPSBzdGF0ZW1lbnQuaW5kZXhPZihcIj9cIiwgcG9zaXRpb24pO1xuXG5cdFx0aWYgKGN1cnJlbnRJbmRleCA9PT0gLTEpIHtcblx0XHRcdHJldHVybiAtMTtcblx0XHR9XG5cblx0XHRwb3NpdGlvbiA9IGN1cnJlbnRJbmRleCArIDE7XG5cdH1cblxuXHRyZXR1cm4gY3VycmVudEluZGV4O1xufVxuXG5leHBvcnQgdHlwZSB7IEJ1bGtFeGVjdXRlU3RhdGVtZW50UGFyYW1zLCBCdWxrU3RhdGVtZW50UGFyYW1zIH07XG5cbmV4cG9ydCB7IGJ1bGtFeGVjdXRlQ29tbWFuZCwgYnVsa0dldENvdW50LCBidWxrR2V0Um93cywgYnVsa0luc2VydEVudGl0aWVzIH07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSxJQUFBQSxTQUFBLEdBQUFDLE9BQUE7QUFBNkUsU0FBQUMsMkJBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLHlCQUFBQyxNQUFBLElBQUFILENBQUEsQ0FBQUcsTUFBQSxDQUFBQyxRQUFBLEtBQUFKLENBQUEscUJBQUFFLENBQUEsUUFBQUcsS0FBQSxDQUFBQyxPQUFBLENBQUFOLENBQUEsTUFBQUUsQ0FBQSxHQUFBSywyQkFBQSxDQUFBUCxDQUFBLE1BQUFDLENBQUEsSUFBQUQsQ0FBQSx1QkFBQUEsQ0FBQSxDQUFBUSxNQUFBLElBQUFOLENBQUEsS0FBQUYsQ0FBQSxHQUFBRSxDQUFBLE9BQUFPLEVBQUEsTUFBQUMsQ0FBQSxZQUFBQSxFQUFBLGVBQUFDLENBQUEsRUFB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