UNPKG

knex-firebird-dialect

Version:
531 lines (529 loc) 59.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _construct2 = _interopRequireDefault(require("@babel/runtime/helpers/construct")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); 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 _lodash = require("lodash"); var _assert = _interopRequireDefault(require("assert")); var _client = _interopRequireDefault(require("knex/lib/client")); var _columnbuilder = _interopRequireDefault(require("./schema/columnbuilder")); var _columncompiler = _interopRequireDefault(require("./schema/columncompiler")); var _compiler = _interopRequireDefault(require("./query/compiler")); var _tablecompiler = _interopRequireDefault(require("./schema/tablecompiler")); var _transaction = _interopRequireDefault(require("./transaction")); var _compiler2 = _interopRequireDefault(require("./schema/compiler")); var _formatter = _interopRequireDefault(require("./formatter")); var _ddl = _interopRequireDefault(require("./schema/ddl")); var _utils = require("./utils"); var driver = _interopRequireWildcard(require("node-firebird-driver-native")); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } 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; } var Client_Firebird = /*#__PURE__*/function (_Client) { function Client_Firebird() { var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; (0, _classCallCheck2["default"])(this, Client_Firebird); if (!config.connection) { throw new Error('Missing "connection" property in configuration!'); } var customConfig = _objectSpread(_objectSpread({}, config), {}, { connection: _objectSpread({}, config.connection) }); if (customConfig.connection.user) { customConfig.connection.username = customConfig.connection.user; delete customConfig.connection.user; } if (!customConfig.connection.database) { throw new Error("Database path/alias is missing!"); } for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } return _callSuper(this, Client_Firebird, [customConfig].concat(args)); } (0, _inherits2["default"])(Client_Firebird, _Client); return (0, _createClass2["default"])(Client_Firebird, [{ key: "_driver", value: function _driver() { return driver; } }, { key: "schemaCompiler", value: function schemaCompiler() { return (0, _construct2["default"])(_compiler2["default"], [this].concat(Array.prototype.slice.call(arguments))); } }, { key: "queryCompiler", value: function queryCompiler(builder, formatter) { return new _compiler["default"](this, builder, formatter); } }, { key: "columnCompiler", value: function columnCompiler() { return (0, _construct2["default"])(_columncompiler["default"], [this].concat(Array.prototype.slice.call(arguments))); } }, { key: "columnBuilder", value: function columnBuilder() { return (0, _construct2["default"])(_columnbuilder["default"], [this].concat(Array.prototype.slice.call(arguments))); } }, { key: "tableCompiler", value: function tableCompiler() { return (0, _construct2["default"])(_tablecompiler["default"], [this].concat(Array.prototype.slice.call(arguments))); } }, { key: "transaction", value: function transaction() { return (0, _construct2["default"])(_transaction["default"], [this].concat(Array.prototype.slice.call(arguments))); } }, { key: "wrapIdentifierImpl", value: function wrapIdentifierImpl(value) { if (value === "*") { return value; } return value; } }, { key: "acquireRawConnection", value: function () { var _acquireRawConnection = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() { var _this = this; var driver, client, databasePath, getConnectionString, uri, connect, connectWithCreate, errMsg; return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: (0, _assert["default"])(!this._connectionForTransactions); driver = this._driver(); client = driver.createNativeClient(this.config.libraryPath || driver.getDefaultLibraryFilename()); databasePath = this.config.connection.database; getConnectionString = function getConnectionString() { var _this$config$connecti = _this.config.connection, host = _this$config$connecti.host, port = _this$config$connecti.port; var target = [host, port].filter(Boolean).join("/"); return [target, databasePath].filter(Boolean).join(":"); }; uri = getConnectionString(); connect = function connect() { return client.connect(uri, _this.config.connection); }; connectWithCreate = function connectWithCreate() { return client.createDatabase(uri, _this.config.connection); }; if (!this.config.createDatabaseIfNotExists) { _context.next = 23; break; } _context.prev = 9; _context.next = 12; return connectWithCreate(); case 12: return _context.abrupt("return", _context.sent); case 15: _context.prev = 15; _context.t0 = _context["catch"](9); errMsg = String(_context.t0); if (!['I/O error during "open O_CREAT"', "DATABASE is in use"].some(function (msg) { return errMsg.includes(msg); })) { _context.next = 22; break; } _context.next = 21; return connect(); case 21: return _context.abrupt("return", _context.sent); case 22: throw _context.t0; case 23: _context.next = 25; return connect(); case 25: return _context.abrupt("return", _context.sent); case 26: case "end": return _context.stop(); } }, _callee, this, [[9, 15]]); })); function acquireRawConnection() { return _acquireRawConnection.apply(this, arguments); } return acquireRawConnection; }() /** * @param {import('node-firebird-driver-native').Attachment} connection * @returns {Promise<unknown>} */ }, { key: "destroyRawConnection", value: (function () { var _destroyRawConnection = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2(connection) { return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return connection.disconnect(); case 2: case "end": return _context2.stop(); } }, _callee2); })); function destroyRawConnection(_x) { return _destroyRawConnection.apply(this, arguments); } return destroyRawConnection; }() /** * @param {import('node-firebird-driver-native').Attachment} connection * @param obj * @returns {Promise<unknown>} * @private */ ) }, { key: "_query", value: (function () { var _query2 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3(connection, obj) { var _obj, sql, transaction, statement, fResponse, response, _response, _yield$Promise$all, _yield$Promise$all2, rows, fields; return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: if (!obj || typeof obj === "string") { obj = { sql: obj }; } if (connection) { _context3.next = 3; break; } throw new Error("Error calling ".concat(obj.method, " on connection.")); case 3: _obj = obj, sql = _obj.sql; if (sql) { _context3.next = 6; break; } return _context3.abrupt("return"); case 6: if (!connection._transaction) { _context3.next = 8; break; } throw new Error("this should never happen!"); case 8: _context3.prev = 8; _context3.next = 11; return connection.startTransaction(); case 11: transaction = _context3.sent; _context3.next = 14; return connection.prepare(transaction, sql); case 14: statement = _context3.sent; fResponse = { rows: [], fields: [] }; if (!(obj.returning && !statement.hasResultSet)) { _context3.next = 24; break; } _context3.next = 19; return statement.executeSingletonAsObject(transaction, obj.bindings); case 19: response = _context3.sent; fResponse.rows = [Object.values(response)]; fResponse.fields = Object.keys(response); _context3.next = 45; break; case 24: if (!statement.hasResultSet) { _context3.next = 43; break; } _context3.next = 27; return statement.executeQuery(transaction, obj.bindings); case 27: _response = _context3.sent; _context3.prev = 28; _context3.next = 31; return Promise.all([_response.fetch(), statement.columnLabels || []]); case 31: _yield$Promise$all = _context3.sent; _yield$Promise$all2 = (0, _slicedToArray2["default"])(_yield$Promise$all, 2); rows = _yield$Promise$all2[0]; fields = _yield$Promise$all2[1]; fResponse.rows = rows; fResponse.fields = fields; case 37: _context3.prev = 37; _context3.next = 40; return _response.close(); case 40: return _context3.finish(37); case 41: _context3.next = 45; break; case 43: _context3.next = 45; return statement.execute(transaction, obj.bindings); case 45: _context3.next = 47; return this._fixResponse(fResponse, transaction); case 47: _context3.next = 49; return transaction.commit(); case 49: return _context3.abrupt("return", _objectSpread(_objectSpread({}, obj), {}, { response: fResponse })); case 52: _context3.prev = 52; _context3.t0 = _context3["catch"](8); if (!transaction) { _context3.next = 58; break; } _context3.next = 57; return transaction.rollback()["catch"](_lodash.noop); case 57: transaction = null; case 58: if (!(0, _utils.isFirebirdConnectionError)(_context3.t0)) { _context3.next = 61; break; } _context3.next = 61; return this.destroyRawConnection(connection); case 61: throw _context3.t0; case 62: _context3.prev = 62; if (!statement) { _context3.next = 67; break; } _context3.next = 66; return statement.dispose()["catch"](_lodash.noop); case 66: statement = null; case 67: return _context3.finish(62); case 68: case "end": return _context3.stop(); } }, _callee3, this, [[8, 52, 62, 68], [28,, 37, 41]]); })); function _query(_x2, _x3) { return _query2.apply(this, arguments); } return _query; }()) }, { key: "_stream", value: function _stream() { throw new Error("_stream not implemented"); } // Ensures the response is returned in the same format as other clients. }, { key: "processResponse", value: function () { var _processResponse = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4(obj, runner) { var response, method, rows, fields; return _regenerator["default"].wrap(function _callee4$(_context4) { while (1) switch (_context4.prev = _context4.next) { case 0: if (obj) { _context4.next = 2; break; } return _context4.abrupt("return"); case 2: response = obj.response, method = obj.method; if (!obj.output) { _context4.next = 5; break; } return _context4.abrupt("return", obj.output.call(runner, response)); case 5: rows = response.rows, fields = response.fields; _context4.t0 = method; _context4.next = _context4.t0 === "select" ? 9 : _context4.t0 === "first" ? 10 : _context4.t0 === "pluck" ? 11 : _context4.t0 === "insert" ? 12 : 13; break; case 9: return _context4.abrupt("return", rows); case 10: return _context4.abrupt("return", rows[0]); case 11: return _context4.abrupt("return", (0, _lodash.map)(rows, obj.pluck)); case 12: return _context4.abrupt("return", Object.defineProperties(rows.slice(), { rows: { value: rows, enumerable: false }, fields: { value: fields, enumerable: false } })); case 13: return _context4.abrupt("return", response); case 14: case "end": return _context4.stop(); } }, _callee4); })); function processResponse(_x4, _x5) { return _processResponse.apply(this, arguments); } return processResponse; }() }, { key: "_fixResponse", value: function () { var _fixResponse2 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6(obj, transaction) { var _this2 = this; var rows, fields, newFields, blobs, _loop, i; return _regenerator["default"].wrap(function _callee6$(_context7) { while (1) switch (_context7.prev = _context7.next) { case 0: rows = obj.rows, fields = obj.fields; if (this.config.connection.lowercase_keys) { newFields = fields.map(function (field) { return field.toLowerCase(); }); fields.length = 0; fields.push.apply(fields, (0, _toConsumableArray2["default"])(newFields)); } blobs = []; _loop = /*#__PURE__*/_regenerator["default"].mark(function _loop(i) { var row; return _regenerator["default"].wrap(function _loop$(_context6) { while (1) switch (_context6.prev = _context6.next) { case 0: row = {}; fields.forEach(function (key, index) { var value = rows[i][index]; if (value instanceof _this2._driver().Blob) { blobs.push(value.attachment.openBlob(transaction, value).then(/*#__PURE__*/function () { var _ref = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5(stream) { var buffer; return _regenerator["default"].wrap(function _callee5$(_context5) { while (1) switch (_context5.prev = _context5.next) { case 0: _context5.t0 = Buffer; _context5.next = 3; return stream.length; case 3: _context5.t1 = _context5.sent; buffer = _context5.t0.alloc.call(_context5.t0, _context5.t1); _context5.next = 7; return stream.read(buffer); case 7: row[key] = buffer; case 8: case "end": return _context5.stop(); } }, _callee5); })); return function (_x8) { return _ref.apply(this, arguments); }; }())); } else { row[key] = value; } }); rows[i] = row; case 3: case "end": return _context6.stop(); } }, _loop); }); i = 0; case 5: if (!(i < rows.length)) { _context7.next = 10; break; } return _context7.delegateYield(_loop(i), "t0", 7); case 7: i++; _context7.next = 5; break; case 10: _context7.next = 12; return Promise.all(blobs); case 12: return _context7.abrupt("return", obj); case 13: case "end": return _context7.stop(); } }, _callee6, this); })); function _fixResponse(_x6, _x7) { return _fixResponse2.apply(this, arguments); } return _fixResponse; }() /** * @param {import('node-firebird-driver-native').Attachment} db * @returns {boolean} */ }, { key: "validateConnection", value: function validateConnection(db) { return db.isValid; } }, { key: "poolDefaults", value: function poolDefaults() { var options = { min: 2, max: 4 }; return (0, _lodash.defaults)(options, _superPropGet(Client_Firebird, "poolDefaults", this, 3)([this])); } }, { key: "ddl", value: function ddl(compiler, pragma, connection) { return new _ddl["default"](this, compiler, pragma, connection); } }]); }(_client["default"]); Object.assign(Client_Firebird.prototype, { dialect: "firebird", driverName: "node-firebird-driver-native", Firebird_Formatter: _formatter["default"] }); var _default = exports["default"] = Client_Firebird; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwicmVxdWlyZSIsIl9hc3NlcnQiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2NsaWVudCIsIl9jb2x1bW5idWlsZGVyIiwiX2NvbHVtbmNvbXBpbGVyIiwiX2NvbXBpbGVyIiwiX3RhYmxlY29tcGlsZXIiLCJfdHJhbnNhY3Rpb24iLCJfY29tcGlsZXIyIiwiX2Zvcm1hdHRlciIsIl9kZGwiLCJfdXRpbHMiLCJkcml2ZXIiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIl9jYWxsU3VwZXIiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwiX3N1cGVyUHJvcEdldCIsInAiLCJfZ2V0MiIsIkNsaWVudF9GaXJlYmlyZCIsIl9DbGllbnQiLCJjb25maWciLCJ1bmRlZmluZWQiLCJfY2xhc3NDYWxsQ2hlY2syIiwiY29ubmVjdGlvbiIsIkVycm9yIiwiY3VzdG9tQ29uZmlnIiwidXNlciIsInVzZXJuYW1lIiwiZGF0YWJhc2UiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImNvbmNhdCIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwia2V5IiwidmFsdWUiLCJfZHJpdmVyIiwic2NoZW1hQ29tcGlsZXIiLCJfY29uc3RydWN0MiIsIlNjaGVtYUNvbXBpbGVyIiwic2xpY2UiLCJxdWVyeUNvbXBpbGVyIiwiYnVpbGRlciIsImZvcm1hdHRlciIsIlF1ZXJ5Q29tcGlsZXIiLCJjb2x1bW5Db21waWxlciIsIkNvbHVtbkNvbXBpbGVyIiwiY29sdW1uQnVpbGRlciIsIkNvbHVtbkJ1aWxkZXIiLCJ0YWJsZUNvbXBpbGVyIiwiVGFibGVDb21waWxlciIsInRyYW5zYWN0aW9uIiwiVHJhbnNhY3Rpb24iLCJ3cmFwSWRlbnRpZmllckltcGwiLCJfYWNxdWlyZVJhd0Nvbm5lY3Rpb24iLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsIl90aGlzIiwiY2xpZW50IiwiZGF0YWJhc2VQYXRoIiwiZ2V0Q29ubmVjdGlvblN0cmluZyIsInVyaSIsImNvbm5lY3QiLCJjb25uZWN0V2l0aENyZWF0ZSIsImVyck1zZyIsIndyYXAiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJhc3NlcnQiLCJfY29ubmVjdGlvbkZvclRyYW5zYWN0aW9ucyIsImNyZWF0ZU5hdGl2ZUNsaWVudCIsImxpYnJhcnlQYXRoIiwiZ2V0RGVmYXVsdExpYnJhcnlGaWxlbmFtZSIsIl90aGlzJGNvbmZpZyRjb25uZWN0aSIsImhvc3QiLCJwb3J0IiwidGFyZ2V0Iiwiam9pbiIsImNyZWF0ZURhdGFiYXNlIiwiY3JlYXRlRGF0YWJhc2VJZk5vdEV4aXN0cyIsImFicnVwdCIsInNlbnQiLCJ0MCIsIlN0cmluZyIsInNvbWUiLCJtc2ciLCJpbmNsdWRlcyIsInN0b3AiLCJhY3F1aXJlUmF3Q29ubmVjdGlvbiIsIl9kZXN0cm95UmF3Q29ubmVjdGlvbiIsIl9jYWxsZWUyIiwiX2NhbGxlZTIkIiwiX2NvbnRleHQyIiwiZGlzY29ubmVjdCIsImRlc3Ryb3lSYXdDb25uZWN0aW9uIiwiX3giLCJfcXVlcnkyIiwiX2NhbGxlZTMiLCJvYmoiLCJfb2JqIiwic3FsIiwic3RhdGVtZW50IiwiZlJlc3BvbnNlIiwicmVzcG9uc2UiLCJfcmVzcG9uc2UiLCJfeWllbGQkUHJvbWlzZSRhbGwiLCJfeWllbGQkUHJvbWlzZSRhbGwyIiwicm93cyIsImZpZWxkcyIsIl9jYWxsZWUzJCIsIl9jb250ZXh0MyIsIm1ldGhvZCIsInN0YXJ0VHJhbnNhY3Rpb24iLCJwcmVwYXJlIiwicmV0dXJuaW5nIiwiaGFzUmVzdWx0U2V0IiwiZXhlY3V0ZVNpbmdsZXRvbkFzT2JqZWN0IiwiYmluZGluZ3MiLCJ2YWx1ZXMiLCJleGVjdXRlUXVlcnkiLCJQcm9taXNlIiwiYWxsIiwiZmV0Y2giLCJjb2x1bW5MYWJlbHMiLCJfc2xpY2VkVG9BcnJheTIiLCJjbG9zZSIsImZpbmlzaCIsImV4ZWN1dGUiLCJfZml4UmVzcG9uc2UiLCJjb21taXQiLCJyb2xsYmFjayIsIm5vb3AiLCJpc0ZpcmViaXJkQ29ubmVjdGlvbkVycm9yIiwiZGlzcG9zZSIsIl9xdWVyeSIsIl94MiIsIl94MyIsIl9zdHJlYW0iLCJfcHJvY2Vzc1Jlc3BvbnNlIiwiX2NhbGxlZTQiLCJydW5uZXIiLCJfY2FsbGVlNCQiLCJfY29udGV4dDQiLCJvdXRwdXQiLCJtYXAiLCJwbHVjayIsInByb2Nlc3NSZXNwb25zZSIsIl94NCIsIl94NSIsIl9maXhSZXNwb25zZTIiLCJfY2FsbGVlNiIsIl90aGlzMiIsIm5ld0ZpZWxkcyIsImJsb2JzIiwiX2xvb3AiLCJfY2FsbGVlNiQiLCJfY29udGV4dDciLCJsb3dlcmNhc2Vfa2V5cyIsImZpZWxkIiwidG9Mb3dlckNhc2UiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwicm93IiwiX2xvb3AkIiwiX2NvbnRleHQ2IiwiaW5kZXgiLCJCbG9iIiwiYXR0YWNobWVudCIsIm9wZW5CbG9iIiwidGhlbiIsIl9yZWYiLCJfY2FsbGVlNSIsInN0cmVhbSIsImJ1ZmZlciIsIl9jYWxsZWU1JCIsIl9jb250ZXh0NSIsIkJ1ZmZlciIsInQxIiwiYWxsb2MiLCJyZWFkIiwiX3g4IiwiZGVsZWdhdGVZaWVsZCIsIl94NiIsIl94NyIsInZhbGlkYXRlQ29ubmVjdGlvbiIsImRiIiwiaXNWYWxpZCIsInBvb2xEZWZhdWx0cyIsIm9wdGlvbnMiLCJtaW4iLCJtYXgiLCJkZWZhdWx0cyIsImRkbCIsImNvbXBpbGVyIiwicHJhZ21hIiwiRmlyZWJpcmRfRERMIiwiQ2xpZW50IiwiYXNzaWduIiwiZGlhbGVjdCIsImRyaXZlck5hbWUiLCJGaXJlYmlyZF9Gb3JtYXR0ZXIiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi9zcmMvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVmYXVsdHMsIG1hcCwgbm9vcCB9IGZyb20gXCJsb2Rhc2hcIjtcbmltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IENsaWVudCBmcm9tIFwia25leC9saWIvY2xpZW50XCI7XG5cbmltcG9ydCBDb2x1bW5CdWlsZGVyIGZyb20gXCIuL3NjaGVtYS9jb2x1bW5idWlsZGVyXCI7XG5pbXBvcnQgQ29sdW1uQ29tcGlsZXIgZnJvbSBcIi4vc2NoZW1hL2NvbHVtbmNvbXBpbGVyXCI7XG5pbXBvcnQgUXVlcnlDb21waWxlciBmcm9tIFwiLi9xdWVyeS9jb21waWxlclwiO1xuaW1wb3J0IFRhYmxlQ29tcGlsZXIgZnJvbSBcIi4vc2NoZW1hL3RhYmxlY29tcGlsZXJcIjtcbmltcG9ydCBUcmFuc2FjdGlvbiBmcm9tIFwiLi90cmFuc2FjdGlvblwiO1xuaW1wb3J0IFNjaGVtYUNvbXBpbGVyIGZyb20gXCIuL3NjaGVtYS9jb21waWxlclwiO1xuaW1wb3J0IEZpcmViaXJkX0Zvcm1hdHRlciBmcm9tIFwiLi9mb3JtYXR0ZXJcIjtcbmltcG9ydCBGaXJlYmlyZF9EREwgZnJvbSBcIi4vc2NoZW1hL2RkbFwiO1xuaW1wb3J0IHsgaXNGaXJlYmlyZENvbm5lY3Rpb25FcnJvciB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgKiBhcyBkcml2ZXIgZnJvbSBcIm5vZGUtZmlyZWJpcmQtZHJpdmVyLW5hdGl2ZVwiO1xuXG5jbGFzcyBDbGllbnRfRmlyZWJpcmQgZXh0ZW5kcyBDbGllbnQge1xuICBjb25zdHJ1Y3Rvcihjb25maWcgPSB7fSwgLi4uYXJncykge1xuICAgIGlmICghY29uZmlnLmNvbm5lY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBcImNvbm5lY3Rpb25cIiBwcm9wZXJ0eSBpbiBjb25maWd1cmF0aW9uIScpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1c3RvbUNvbmZpZyA9IHsgLi4uY29uZmlnLCBjb25uZWN0aW9uOiB7IC4uLmNvbmZpZy5jb25uZWN0aW9uIH0gfTtcbiAgICBpZiAoY3VzdG9tQ29uZmlnLmNvbm5lY3Rpb24udXNlcikge1xuICAgICAgY3VzdG9tQ29uZmlnLmNvbm5lY3Rpb24udXNlcm5hbWUgPSBjdXN0b21Db25maWcuY29ubmVjdGlvbi51c2VyO1xuICAgICAgZGVsZXRlIGN1c3RvbUNvbmZpZy5jb25uZWN0aW9uLnVzZXI7XG4gICAgfVxuXG4gICAgaWYgKCFjdXN0b21Db25maWcuY29ubmVjdGlvbi5kYXRhYmFzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGF0YWJhc2UgcGF0aC9hbGlhcyBpcyBtaXNzaW5nIVwiKTtcbiAgICB9XG5cbiAgICBzdXBlcihjdXN0b21Db25maWcsIC4uLmFyZ3MpO1xuICB9XG5cbiAgX2RyaXZlcigpIHtcbiAgICByZXR1cm4gZHJpdmVyO1xuICB9XG5cbiAgc2NoZW1hQ29tcGlsZXIoKSB7XG4gICAgcmV0dXJuIG5ldyBTY2hlbWFDb21waWxlcih0aGlzLCAuLi5hcmd1bWVudHMpO1xuICB9XG5cbiAgcXVlcnlDb21waWxlcihidWlsZGVyLCBmb3JtYXR0ZXIpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXJ5Q29tcGlsZXIodGhpcywgYnVpbGRlciwgZm9ybWF0dGVyKTtcbiAgfVxuXG4gIGNvbHVtbkNvbXBpbGVyKCkge1xuICAgIHJldHVybiBuZXcgQ29sdW1uQ29tcGlsZXIodGhpcywgLi4uYXJndW1lbnRzKTtcbiAgfVxuXG4gIGNvbHVtbkJ1aWxkZXIoKSB7XG4gICAgcmV0dXJuIG5ldyBDb2x1bW5CdWlsZGVyKHRoaXMsIC4uLmFyZ3VtZW50cyk7XG4gIH1cblxuICB0YWJsZUNvbXBpbGVyKCkge1xuICAgIHJldHVybiBuZXcgVGFibGVDb21waWxlcih0aGlzLCAuLi5hcmd1bWVudHMpO1xuICB9XG5cbiAgdHJhbnNhY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbih0aGlzLCAuLi5hcmd1bWVudHMpO1xuICB9XG5cbiAgd3JhcElkZW50aWZpZXJJbXBsKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSBcIipcIikge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGFzeW5jIGFjcXVpcmVSYXdDb25uZWN0aW9uKCkge1xuICAgIGFzc2VydCghdGhpcy5fY29ubmVjdGlvbkZvclRyYW5zYWN0aW9ucyk7XG5cbiAgICBjb25zdCBkcml2ZXIgPSB0aGlzLl9kcml2ZXIoKTtcbiAgICBjb25zdCBjbGllbnQgPSBkcml2ZXIuY3JlYXRlTmF0aXZlQ2xpZW50KFxuICAgICAgdGhpcy5jb25maWcubGlicmFyeVBhdGggfHwgZHJpdmVyLmdldERlZmF1bHRMaWJyYXJ5RmlsZW5hbWUoKVxuICAgICk7XG5cbiAgICBjb25zdCBkYXRhYmFzZVBhdGggPSB0aGlzLmNvbmZpZy5jb25uZWN0aW9uLmRhdGFiYXNlO1xuICAgIGNvbnN0IGdldENvbm5lY3Rpb25TdHJpbmcgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7IGhvc3QsIHBvcnQgfSA9IHRoaXMuY29uZmlnLmNvbm5lY3Rpb247XG5cbiAgICAgIGNvbnN0IHRhcmdldCA9IFtob3N0LCBwb3J0XS5maWx0ZXIoQm9vbGVhbikuam9pbihcIi9cIik7XG4gICAgICByZXR1cm4gW3RhcmdldCwgZGF0YWJhc2VQYXRoXS5maWx0ZXIoQm9vbGVhbikuam9pbihcIjpcIik7XG4gICAgfTtcblxuICAgIGNvbnN0IHVyaSA9IGdldENvbm5lY3Rpb25TdHJpbmcoKTtcbiAgICBjb25zdCBjb25uZWN0ID0gKCkgPT4gY2xpZW50LmNvbm5lY3QodXJpLCB0aGlzLmNvbmZpZy5jb25uZWN0aW9uKTtcbiAgICBjb25zdCBjb25uZWN0V2l0aENyZWF0ZSA9ICgpID0+XG4gICAgICBjbGllbnQuY3JlYXRlRGF0YWJhc2UodXJpLCB0aGlzLmNvbmZpZy5jb25uZWN0aW9uKTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5jcmVhdGVEYXRhYmFzZUlmTm90RXhpc3RzKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgY29ubmVjdFdpdGhDcmVhdGUoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc3QgZXJyTXNnID0gU3RyaW5nKGUpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgWydJL08gZXJyb3IgZHVyaW5nIFwib3BlbiBPX0NSRUFUXCInLCBcIkRBVEFCQVNFIGlzIGluIHVzZVwiXS5zb21lKFxuICAgICAgICAgICAgKG1zZykgPT4gZXJyTXNnLmluY2x1ZGVzKG1zZylcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGNvbm5lY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydCgnbm9kZS1maXJlYmlyZC1kcml2ZXItbmF0aXZlJykuQXR0YWNobWVudH0gY29ubmVjdGlvblxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn1cbiAgICovXG4gIGFzeW5jIGRlc3Ryb3lSYXdDb25uZWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICBhd2FpdCBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydCgnbm9kZS1maXJlYmlyZC1kcml2ZXItbmF0aXZlJykuQXR0YWNobWVudH0gY29ubmVjdGlvblxuICAgKiBAcGFyYW0gb2JqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHVua25vd24+fVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYXN5bmMgX3F1ZXJ5KGNvbm5lY3Rpb24sIG9iaikge1xuICAgIGlmICghb2JqIHx8IHR5cGVvZiBvYmogPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG9iaiA9IHsgc3FsOiBvYmogfTtcbiAgICB9XG4gICAgaWYgKCFjb25uZWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGNhbGxpbmcgJHtvYmoubWV0aG9kfSBvbiBjb25uZWN0aW9uLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHsgc3FsIH0gPSBvYmo7XG4gICAgaWYgKCFzcWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY29ubmVjdGlvbi5fdHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiFcIik7XG4gICAgfVxuXG4gICAgbGV0IHRyYW5zYWN0aW9uLCBzdGF0ZW1lbnQ7XG5cbiAgICB0cnkge1xuICAgICAgdHJhbnNhY3Rpb24gPSBhd2FpdCBjb25uZWN0aW9uLnN0YXJ0VHJhbnNhY3Rpb24oKTtcbiAgICAgIHN0YXRlbWVudCA9IGF3YWl0IGNvbm5lY3Rpb24ucHJlcGFyZSh0cmFuc2FjdGlvbiwgc3FsKTtcbiAgICAgIGxldCBmUmVzcG9uc2UgPSB7XG4gICAgICAgIHJvd3M6IFtdLFxuICAgICAgICBmaWVsZHM6IFtdLFxuICAgICAgfTtcbiAgICAgIGlmIChvYmoucmV0dXJuaW5nICYmICFzdGF0ZW1lbnQuaGFzUmVzdWx0U2V0KSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc3RhdGVtZW50LmV4ZWN1dGVTaW5nbGV0b25Bc09iamVjdChcbiAgICAgICAgICB0cmFuc2FjdGlvbixcbiAgICAgICAgICBvYmouYmluZGluZ3NcbiAgICAgICAgKTtcbiAgICAgICAgZlJlc3BvbnNlLnJvd3MgPSBbT2JqZWN0LnZhbHVlcyhyZXNwb25zZSldO1xuICAgICAgICBmUmVzcG9uc2UuZmllbGRzID0gT2JqZWN0LmtleXMocmVzcG9uc2UpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQuaGFzUmVzdWx0U2V0KSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShcbiAgICAgICAgICB0cmFuc2FjdGlvbixcbiAgICAgICAgICBvYmouYmluZGluZ3NcbiAgICAgICAgKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBbcm93cywgZmllbGRzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIHJlc3BvbnNlLmZldGNoKCksXG4gICAgICAgICAgICBzdGF0ZW1lbnQuY29sdW1uTGFiZWxzIHx8IFtdLFxuICAgICAgICAgIF0pO1xuICAgICAgICAgIGZSZXNwb25zZS5yb3dzID0gcm93cztcbiAgICAgICAgICBmUmVzcG9uc2UuZmllbGRzID0gZmllbGRzO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGF3YWl0IHJlc3BvbnNlLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHN0YXRlbWVudC5leGVjdXRlKHRyYW5zYWN0aW9uLCBvYmouYmluZGluZ3MpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLl9maXhSZXNwb25zZShmUmVzcG9uc2UsIHRyYW5zYWN0aW9uKTtcbiAgICAgIGF3YWl0IHRyYW5zYWN0aW9uLmNvbW1pdCgpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5vYmosXG4gICAgICAgIHJlc3BvbnNlOiBmUmVzcG9uc2UsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICh0cmFuc2FjdGlvbikge1xuICAgICAgICBhd2FpdCB0cmFuc2FjdGlvbi5yb2xsYmFjaygpLmNhdGNoKG5vb3ApO1xuICAgICAgICB0cmFuc2FjdGlvbiA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoaXNGaXJlYmlyZENvbm5lY3Rpb25FcnJvcihlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmRlc3Ryb3lSYXdDb25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHN0YXRlbWVudCkge1xuICAgICAgICBhd2FpdCBzdGF0ZW1lbnQuZGlzcG9zZSgpLmNhdGNoKG5vb3ApO1xuICAgICAgICBzdGF0ZW1lbnQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9zdHJlYW0oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiX3N0cmVhbSBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cblxuICAvLyBFbnN1cmVzIHRoZSByZXNwb25zZSBpcyByZXR1cm5lZCBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgb3RoZXIgY2xpZW50cy5cbiAgYXN5bmMgcHJvY2Vzc1Jlc3BvbnNlKG9iaiwgcnVubmVyKSB7XG4gICAgaWYgKCFvYmopIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyByZXNwb25zZSwgbWV0aG9kIH0gPSBvYmo7XG4gICAgaWYgKG9iai5vdXRwdXQpIHtcbiAgICAgIHJldHVybiBvYmoub3V0cHV0LmNhbGwocnVubmVyLCByZXNwb25zZSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyByb3dzLCBmaWVsZHMgfSA9IHJlc3BvbnNlO1xuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlIFwic2VsZWN0XCI6XG4gICAgICAgIHJldHVybiByb3dzO1xuICAgICAgY2FzZSBcImZpcnN0XCI6XG4gICAgICAgIHJldHVybiByb3dzWzBdO1xuICAgICAgY2FzZSBcInBsdWNrXCI6XG4gICAgICAgIHJldHVybiBtYXAocm93cywgb2JqLnBsdWNrKTtcbiAgICAgIGNhc2UgXCJpbnNlcnRcIjpcbiAgICAgICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHJvd3Muc2xpY2UoKSwge1xuICAgICAgICAgIHJvd3M6IHsgdmFsdWU6IHJvd3MsIGVudW1lcmFibGU6IGZhbHNlIH0sXG4gICAgICAgICAgZmllbGRzOiB7IHZhbHVlOiBmaWVsZHMsIGVudW1lcmFibGU6IGZhbHNlIH0sXG4gICAgICAgIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIF9maXhSZXNwb25zZShvYmosIHRyYW5zYWN0aW9uKSB7XG4gICAgY29uc3QgeyByb3dzLCBmaWVsZHMgfSA9IG9iajtcbiAgICBpZiAodGhpcy5jb25maWcuY29ubmVjdGlvbi5sb3dlcmNhc2Vfa2V5cykge1xuICAgICAgY29uc3QgbmV3RmllbGRzID0gZmllbGRzLm1hcCgoZmllbGQpID0+IGZpZWxkLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgZmllbGRzLmxlbmd0aCA9IDA7XG4gICAgICBmaWVsZHMucHVzaCguLi5uZXdGaWVsZHMpO1xuICAgIH1cblxuICAgIGNvbnN0IGJsb2JzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByb3cgPSB7fTtcbiAgICAgIGZpZWxkcy5mb3JFYWNoKChrZXksIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcm93c1tpXVtpbmRleF07XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIHRoaXMuX2RyaXZlcigpLkJsb2IpIHtcbiAgICAgICAgICBibG9icy5wdXNoKFxuICAgICAgICAgICAgdmFsdWUuYXR0YWNobWVudFxuICAgICAgICAgICAgICAub3BlbkJsb2IodHJhbnNhY3Rpb24sIHZhbHVlKVxuICAgICAgICAgICAgICAudGhlbihhc3luYyAoc3RyZWFtKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jKGF3YWl0IHN0cmVhbS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHN0cmVhbS5yZWFkKGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgcm93W2tleV0gPSBidWZmZXI7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByb3dba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJvd3NbaV0gPSByb3c7XG4gICAgfVxuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoYmxvYnMpO1xuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydCgnbm9kZS1maXJlYmlyZC1kcml2ZXItbmF0aXZlJykuQXR0YWNobWVudH0gZGJcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICB2YWxpZGF0ZUNvbm5lY3Rpb24oZGIpIHtcbiAgICByZXR1cm4gZGIuaXNWYWxpZDtcbiAgfVxuXG4gIHBvb2xEZWZhdWx0cygpIHtcbiAgICBjb25zdCBvcHRpb25zID0geyBtaW46IDIsIG1heDogNCB9O1xuICAgIHJldHVybiBkZWZhdWx0cyhvcHRpb25zLCBzdXBlci5wb29sRGVmYXVsdHModGhpcykpO1xuICB9XG5cbiAgZGRsKGNvbXBpbGVyLCBwcmFnbWEsIGNvbm5lY3Rpb24pIHtcbiAgICByZXR1cm4gbmV3IEZpcmViaXJkX0RETCh0aGlzLCBjb21waWxlciwgcHJhZ21hLCBjb25uZWN0aW9uKTtcbiAgfVxufVxuXG5PYmplY3QuYXNzaWduKENsaWVudF9GaXJlYmlyZC5wcm90b3R5cGUsIHtcbiAgZGlhbGVjdDogXCJmaXJlYmlyZFwiLFxuICBkcml2ZXJOYW1lOiBcIm5vZGUtZmlyZWJpcmQtZHJpdmVyLW5hdGl2ZVwiLFxuXG4gIEZpcmViaXJkX0Zvcm1hdHRlcixcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBDbGllbnRfRmlyZWJpcmQ7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsT0FBQSxHQUFBRCxzQkFBQSxDQUFBRixPQUFBO0FBRUEsSUFBQUksY0FBQSxHQUFBRixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUssZUFBQSxHQUFBSCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQU0sU0FBQSxHQUFBSixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQU8sY0FBQSxHQUFBTCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVEsWUFBQSxHQUFBTixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVMsVUFBQSxHQUFBUCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVUsVUFBQSxHQUFBUixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVcsSUFBQSxHQUFBVCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVksTUFBQSxHQUFBWixPQUFBO0FBQ0EsSUFBQWEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBZCxPQUFBO0FBQXNELFNBQUFlLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLHlCQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLEtBQUFGLENBQUE7QUFBQSxTQUFBRix3QkFBQUUsQ0FBQSxFQUFBRSxDQUFBLFNBQUFBLENBQUEsSUFBQUYsQ0FBQSxJQUFBQSxD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