UNPKG

@coolwallet/kas

Version:
291 lines (290 loc) 64.7 kB
"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); } var _transaction = require("../../transaction"); var _validate = require("../validate"); var _testData = require("./testData"); 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) { _defineProperty(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 _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { 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 && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } describe('Test KAS SDK', function () { var decimals = 8; describe('Test validateInputs', function () { it('Test normal input', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { return _regeneratorRuntime().wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: expect(function () { return (0, _validate.validateInputs)([_testData.testNormalInput]); }).not.toThrowError(); case 1: case "end": return _context.stop(); } }, _callee); }))); it('Test without inputs', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() { return _regeneratorRuntime().wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: expect(function () { return (0, _validate.validateInputs)([]); }).toThrowErrorMatchingInlineSnapshot("\"error function: validateInputs, message: validate: inputs length is zero\""); case 1: case "end": return _context2.stop(); } }, _callee2); }))); it('Test input with invalid public key', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() { return _regeneratorRuntime().wrap(function _callee3$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: expect(function () { return (0, _validate.validateInputs)([_testData.testInputWithInvalidInputPublicKey]); }).toThrowErrorMatchingInlineSnapshot("\"error function: validateInputs, message: validate: invalid input public key with index: 0, pubkey: \""); case 1: case "end": return _context3.stop(); } }, _callee3); }))); it('Test input without tx id', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() { return _regeneratorRuntime().wrap(function _callee4$(_context4) { while (1) switch (_context4.prev = _context4.next) { case 0: expect(function () { return (0, _validate.validateInputs)([_testData.testInputWithoutTxId]); }).toThrowErrorMatchingInlineSnapshot("\"error function: validateInputs, message: validate: invalid txId with index: 0\""); case 1: case "end": return _context4.stop(); } }, _callee4); }))); it('Test input without 0 value', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() { return _regeneratorRuntime().wrap(function _callee5$(_context5) { while (1) switch (_context5.prev = _context5.next) { case 0: expect(function () { return (0, _validate.validateInputs)([_testData.testInputWithZeroAmount]); }).toThrowErrorMatchingInlineSnapshot("\"error function: validateInputs, message: validate: invalid input value: 0 with index: 0, should be positive value\""); case 1: case "end": return _context5.stop(); } }, _callee5); }))); }); describe('Test validateOutputs', function () { it('Test normal output', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6() { return _regeneratorRuntime().wrap(function _callee6$(_context6) { while (1) switch (_context6.prev = _context6.next) { case 0: expect(function () { return (0, _validate.validateOutputs)([_testData.testNormalOutput]); }).not.toThrowError(); case 1: case "end": return _context6.stop(); } }, _callee6); }))); it('Test without outputs', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7() { return _regeneratorRuntime().wrap(function _callee7$(_context7) { while (1) switch (_context7.prev = _context7.next) { case 0: expect(function () { return (0, _validate.validateOutputs)([]); }).toThrowErrorMatchingInlineSnapshot("\"error function: validateOutputs, message: validate: outputs length is zero\""); case 1: case "end": return _context7.stop(); } }, _callee7); }))); it('Test output with invalid address', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8() { return _regeneratorRuntime().wrap(function _callee8$(_context8) { while (1) switch (_context8.prev = _context8.next) { case 0: expect(function () { return (0, _validate.validateOutputs)([_testData.testOutputWithInvalidAddress]); }).toThrowErrorMatchingInlineSnapshot("\"error function: validateOutputs, message: validate: invalid output address with index: 0, address: kaspa:qq9rmfhgc758j4zyvcngd0qhekt90qqf2czvshvdzdlq7jq8jphmvr028\""); case 1: case "end": return _context8.stop(); } }, _callee8); }))); it('Test output without 0 value', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9() { return _regeneratorRuntime().wrap(function _callee9$(_context9) { while (1) switch (_context9.prev = _context9.next) { case 0: expect(function () { return (0, _validate.validateOutputs)([_testData.testOutputWithZeroAmount]); }).toThrowErrorMatchingInlineSnapshot("\"error function: validateOutputs, message: validate: invalid output value: 0 with index: 0, should be positive value\""); case 1: case "end": return _context9.stop(); } }, _callee9); }))); }); describe('Test validateAmountCanDisplayOnProCard', function () { it('Test normal transfer amount', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10() { return _regeneratorRuntime().wrap(function _callee10$(_context10) { while (1) switch (_context10.prev = _context10.next) { case 0: expect(function () { return (0, _validate.validateAmountCanDisplayOnProCard)(_testData.testNormalOutput.value, decimals); }).not.toThrowError(); case 1: case "end": return _context10.stop(); } }, _callee10); }))); it('Test more than 8 bits transfer amount', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee11() { return _regeneratorRuntime().wrap(function _callee11$(_context11) { while (1) switch (_context11.prev = _context11.next) { case 0: expect(function () { return (0, _validate.validateAmountCanDisplayOnProCard)(_testData.testOutputValueWithTooManyDecimals.value, decimals); }).toThrowErrorMatchingInlineSnapshot("\"error function: validateAmountCanDisplayOnProCard, message: validate: pro card cannot display more than 8 digits\""); case 1: case "end": return _context11.stop(); } }, _callee11); }))); }); describe('Test validateDustThreshold with 600 dust', function () { it('Test normal transfer amount', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee12() { return _regeneratorRuntime().wrap(function _callee12$(_context12) { while (1) switch (_context12.prev = _context12.next) { case 0: expect(function () { return (0, _validate.validateDustThreshold)(_testData.testNormalOutput.value, _testData.testTxData.dustSize); }).not.toThrowError(); case 1: case "end": return _context12.stop(); } }, _callee12); }))); it('Test transfer 546 sompi', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee13() { return _regeneratorRuntime().wrap(function _callee13$(_context13) { while (1) switch (_context13.prev = _context13.next) { case 0: expect(function () { return (0, _validate.validateDustThreshold)(_testData.testOutputValueLessThanDust.value, _testData.testTxData.dustSize); }).toThrowErrorMatchingInlineSnapshot("\"error function: validateDustThreshold, message: validate: transfer amount is below the dust threshold(600)\""); case 1: case "end": return _context13.stop(); } }, _callee13); }))); }); describe('Test validateChange', function () { it('Test normal change', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee14() { return _regeneratorRuntime().wrap(function _callee14$(_context14) { while (1) switch (_context14.prev = _context14.next) { case 0: expect(function () { return (0, _validate.validateChange)(_testData.testNormalChange); }).not.toThrowError(); case 1: case "end": return _context14.stop(); } }, _callee14); }))); it('Test transaction with invalid change', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee15() { return _regeneratorRuntime().wrap(function _callee15$(_context15) { while (1) switch (_context15.prev = _context15.next) { case 0: expect(function () { return (0, _validate.validateChange)(_testData.testInvalidChange); }).toThrowErrorMatchingInlineSnapshot("\"error function: validateChange, message: validate: invalid change value: -32854 should be positive value\""); case 1: case "end": return _context15.stop(); } }, _callee15); }))); }); describe('Test validateTransaction', function () { it('Test normal transaction', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee16() { var transaction; return _regeneratorRuntime().wrap(function _callee16$(_context16) { while (1) switch (_context16.prev = _context16.next) { case 0: transaction = _transaction.Transaction.fromTxData(_testData.testTxData); expect(function () { return (0, _validate.validateTransaction)(transaction); }).not.toThrowError(); case 2: case "end": return _context16.stop(); } }, _callee16); }))); it('Test transaction with insufficient fee', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee17() { var transaction; return _regeneratorRuntime().wrap(function _callee17$(_context17) { while (1) switch (_context17.prev = _context17.next) { case 0: transaction = _transaction.Transaction.fromTxData(_objectSpread(_objectSpread({}, _testData.testTxData), {}, { change: _testData.testInsufficientFeeChange })); expect(transaction.feeValue).toBe('1000'); expect(function () { return (0, _validate.validateTransaction)(transaction); }).toThrowErrorMatchingInlineSnapshot("\"error function: validateFee, message: validate: transaction fee did not exceed 2036 sompi\""); case 3: case "end": return _context17.stop(); } }, _callee17); }))); it('Test transaction with max value', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee18() { var transaction; return _regeneratorRuntime().wrap(function _callee18$(_context18) { while (1) switch (_context18.prev = _context18.next) { case 0: transaction = _transaction.Transaction.fromTxData(_objectSpread(_objectSpread({}, _testData.testTxData), {}, { output: _testData.testOutputValueMax, change: undefined })); expect(function () { return (0, _validate.validateTransaction)(transaction); }).not.toThrowError(); case 2: case "end": return _context18.stop(); } }, _callee18); }))); it('Test transaction with too large mass', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee19() { var transaction; return _regeneratorRuntime().wrap(function _callee19$(_context19) { while (1) switch (_context19.prev = _context19.next) { case 0: transaction = _transaction.Transaction.fromTxData(_testData.testTxDataWithLargeInputs); expect(function () { return (0, _validate.validateTransaction)(transaction); }).toThrowErrorMatchingInlineSnapshot("\"error function: validateMass, message: validate: current mass: 940038, exceeds the maximum allowed mass(100000)\""); case 2: case "end": return _context19.stop(); } }, _callee19); }))); }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdHJhbnNhY3Rpb24iLCJyZXF1aXJlIiwiX3ZhbGlkYXRlIiwiX3Rlc3REYXRhIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIm9iaiIsImtleSIsInZhbHVlIiwiX3RvUHJvcGVydHlLZXkiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImkiLCJfdG9QcmltaXRpdmUiLCJfdHlwZW9mIiwiU3RyaW5nIiwiU3ltYm9sIiwidG9QcmltaXRpdmUiLCJjYWxsIiwiVHlwZUVycm9yIiwiTnVtYmVyIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsInByb3RvdHlwZSIsIm4iLCJoYXNPd25Qcm9wZXJ0eSIsImEiLCJpdGVyYXRvciIsImMiLCJhc3luY0l0ZXJhdG9yIiwidSIsInRvU3RyaW5nVGFnIiwiZGVmaW5lIiwid3JhcCIsIkdlbmVyYXRvciIsImNyZWF0ZSIsIkNvbnRleHQiLCJtYWtlSW52b2tlTWV0aG9kIiwidHJ5Q2F0Y2giLCJ0eXBlIiwiYXJnIiwiaCIsImwiLCJmIiwicyIsInkiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwicCIsImQiLCJnZXRQcm90b3R5cGVPZiIsInYiLCJ2YWx1ZXMiLCJnIiwiZGVmaW5lSXRlcmF0b3JNZXRob2RzIiwiX2ludm9rZSIsIkFzeW5jSXRlcmF0b3IiLCJpbnZva2UiLCJyZXNvbHZlIiwiX19hd2FpdCIsInRoZW4iLCJjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyIsIkVycm9yIiwiZG9uZSIsIm1ldGhvZCIsImRlbGVnYXRlIiwibWF5YmVJbnZva2VEZWxlZ2F0ZSIsInNlbnQiLCJfc2VudCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiYWJydXB0IiwicmVzdWx0TmFtZSIsIm5leHQiLCJuZXh0TG9jIiwicHVzaFRyeUVudHJ5IiwidHJ5TG9jIiwiY2F0Y2hMb2MiLCJmaW5hbGx5TG9jIiwiYWZ0ZXJMb2MiLCJ0cnlFbnRyaWVzIiwicmVzZXRUcnlFbnRyeSIsImNvbXBsZXRpb24iLCJyZXNldCIsImlzTmFOIiwiZGlzcGxheU5hbWUiLCJpc0dlbmVyYXRvckZ1bmN0aW9uIiwiY29uc3RydWN0b3IiLCJuYW1lIiwibWFyayIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiYXdyYXAiLCJhc3luYyIsIlByb21pc2UiLCJyZXZlcnNlIiwicG9wIiwicHJldiIsImNoYXJBdCIsInNsaWNlIiwic3RvcCIsInJ2YWwiLCJoYW5kbGUiLCJjb21wbGV0ZSIsImZpbmlzaCIsIl9jYXRjaCIsImRlbGVnYXRlWWllbGQiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJnZW4iLCJyZWplY3QiLCJfbmV4dCIsIl90aHJvdyIsImluZm8iLCJlcnJvciIsIl9hc3luY1RvR2VuZXJhdG9yIiwiZm4iLCJzZWxmIiwiYXJncyIsImVyciIsInVuZGVmaW5lZCIsImRlc2NyaWJlIiwiZGVjaW1hbHMiLCJpdCIsIl9jYWxsZWUiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwiZXhwZWN0IiwidmFsaWRhdGVJbnB1dHMiLCJ0ZXN0Tm9ybWFsSW5wdXQiLCJub3QiLCJ0b1Rocm93RXJyb3IiLCJfY2FsbGVlMiIsIl9jYWxsZWUyJCIsIl9jb250ZXh0MiIsInRvVGhyb3dFcnJvck1hdGNoaW5nSW5saW5lU25hcHNob3QiLCJfY2FsbGVlMyIsIl9jYWxsZWUzJCIsIl9jb250ZXh0MyIsInRlc3RJbnB1dFdpdGhJbnZhbGlkSW5wdXRQdWJsaWNLZXkiLCJfY2FsbGVlNCIsIl9jYWxsZWU0JCIsIl9jb250ZXh0NCIsInRlc3RJbnB1dFdpdGhvdXRUeElkIiwiX2NhbGxlZTUiLCJfY2FsbGVlNSQiLCJfY29udGV4dDUiLCJ0ZXN0SW5wdXRXaXRoWmVyb0Ftb3VudCIsIl9jYWxsZWU2IiwiX2NhbGxlZTYkIiwiX2NvbnRleHQ2IiwidmFsaWRhdGVPdXRwdXRzIiwidGVzdE5vcm1hbE91dHB1dCIsIl9jYWxsZWU3IiwiX2NhbGxlZTckIiwiX2NvbnRleHQ3IiwiX2NhbGxlZTgiLCJfY2FsbGVlOCQiLCJfY29udGV4dDgiLCJ0ZXN0T3V0cHV0V2l0aEludmFsaWRBZGRyZXNzIiwiX2NhbGxlZTkiLCJfY2FsbGVlOSQiLCJfY29udGV4dDkiLCJ0ZXN0T3V0cHV0V2l0aFplcm9BbW91bnQiLCJfY2FsbGVlMTAiLCJfY2FsbGVlMTAkIiwiX2NvbnRleHQxMCIsInZhbGlkYXRlQW1vdW50Q2FuRGlzcGxheU9uUHJvQ2FyZCIsIl9jYWxsZWUxMSIsIl9jYWxsZWUxMSQiLCJfY29udGV4dDExIiwidGVzdE91dHB1dFZhbHVlV2l0aFRvb01hbnlEZWNpbWFscyIsIl9jYWxsZWUxMiIsIl9jYWxsZWUxMiQiLCJfY29udGV4dDEyIiwidmFsaWRhdGVEdXN0VGhyZXNob2xkIiwidGVzdFR4RGF0YSIsImR1c3RTaXplIiwiX2NhbGxlZTEzIiwiX2NhbGxlZTEzJCIsIl9jb250ZXh0MTMiLCJ0ZXN0T3V0cHV0VmFsdWVMZXNzVGhhbkR1c3QiLCJfY2FsbGVlMTQiLCJfY2FsbGVlMTQkIiwiX2NvbnRleHQxNCIsInZhbGlkYXRlQ2hhbmdlIiwidGVzdE5vcm1hbENoYW5nZSIsIl9jYWxsZWUxNSIsIl9jYWxsZWUxNSQiLCJfY29udGV4dDE1IiwidGVzdEludmFsaWRDaGFuZ2UiLCJfY2FsbGVlMTYiLCJ0cmFuc2FjdGlvbiIsIl9jYWxsZWUxNiQiLCJfY29udGV4dDE2IiwiVHJhbnNhY3Rpb24iLCJmcm9tVHhEYXRhIiwidmFsaWRhdGVUcmFuc2FjdGlvbiIsIl9jYWxsZWUxNyIsIl9jYWxsZWUxNyQiLCJfY29udGV4dDE3IiwiY2hhbmdlIiwidGVzdEluc3VmZmljaWVudEZlZUNoYW5nZSIsImZlZVZhbHVlIiwidG9CZSIsIl9jYWxsZWUxOCIsIl9jYWxsZWUxOCQiLCJfY29udGV4dDE4Iiwib3V0cHV0IiwidGVzdE91dHB1dFZhbHVlTWF4IiwiX2NhbGxlZTE5IiwiX2NhbGxlZTE5JCIsIl9jb250ZXh0MTkiLCJ0ZXN0VHhEYXRhV2l0aExhcmdlSW5wdXRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL19fdGVzdF9fL3ZhbGlkYXRlLnRlc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi90cmFuc2FjdGlvbic7XG5pbXBvcnQge1xuICB2YWxpZGF0ZUFtb3VudENhbkRpc3BsYXlPblByb0NhcmQsXG4gIHZhbGlkYXRlQ2hhbmdlLFxuICB2YWxpZGF0ZUR1c3RUaHJlc2hvbGQsXG4gIHZhbGlkYXRlSW5wdXRzLFxuICB2YWxpZGF0ZU91dHB1dHMsXG4gIHZhbGlkYXRlVHJhbnNhY3Rpb24sXG59IGZyb20gJy4uL3ZhbGlkYXRlJztcbmltcG9ydCB7XG4gIHRlc3RJbnB1dFdpdGhJbnZhbGlkSW5wdXRQdWJsaWNLZXksXG4gIHRlc3RJbnB1dFdpdGhvdXRUeElkLFxuICB0ZXN0SW5wdXRXaXRoWmVyb0Ftb3VudCxcbiAgdGVzdE5vcm1hbElucHV0LFxuICB0ZXN0Tm9ybWFsT3V0cHV0LFxuICB0ZXN0T3V0cHV0V2l0aEludmFsaWRBZGRyZXNzLFxuICB0ZXN0T3V0cHV0VmFsdWVXaXRoVG9vTWFueURlY2ltYWxzLFxuICB0ZXN0T3V0cHV0V2l0aFplcm9BbW91bnQsXG4gIHRlc3RUeERhdGEsXG4gIHRlc3RPdXRwdXRWYWx1ZUxlc3NUaGFuRHVzdCxcbiAgdGVzdE91dHB1dFZhbHVlTWF4LFxuICB0ZXN0VHhEYXRhV2l0aExhcmdlSW5wdXRzLFxuICB0ZXN0SW5zdWZmaWNpZW50RmVlQ2hhbmdlLFxuICB0ZXN0SW52YWxpZENoYW5nZSxcbiAgdGVzdE5vcm1hbENoYW5nZSxcbn0gZnJvbSAnLi90ZXN0RGF0YSc7XG5cbmRlc2NyaWJlKCdUZXN0IEtBUyBTREsnLCAoKSA9PiB7XG4gIGNvbnN0IGRlY2ltYWxzID0gODtcbiAgZGVzY3JpYmUoJ1Rlc3QgdmFsaWRhdGVJbnB1dHMnLCAoKSA9PiB7XG4gICAgaXQoJ1Rlc3Qgbm9ybWFsIGlucHV0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgZXhwZWN0KCgpID0+IHZhbGlkYXRlSW5wdXRzKFt0ZXN0Tm9ybWFsSW5wdXRdKSkubm90LnRvVGhyb3dFcnJvcigpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Rlc3Qgd2l0aG91dCBpbnB1dHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4gdmFsaWRhdGVJbnB1dHMoW10pKS50b1Rocm93RXJyb3JNYXRjaGluZ0lubGluZVNuYXBzaG90KFxuICAgICAgICBgXCJlcnJvciBmdW5jdGlvbjogdmFsaWRhdGVJbnB1dHMsIG1lc3NhZ2U6IHZhbGlkYXRlOiBpbnB1dHMgbGVuZ3RoIGlzIHplcm9cImBcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnVGVzdCBpbnB1dCB3aXRoIGludmFsaWQgcHVibGljIGtleScsIGFzeW5jICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PiB2YWxpZGF0ZUlucHV0cyhbdGVzdElucHV0V2l0aEludmFsaWRJbnB1dFB1YmxpY0tleV0pKS50b1Rocm93RXJyb3JNYXRjaGluZ0lubGluZVNuYXBzaG90KFxuICAgICAgICBgXCJlcnJvciBmdW5jdGlvbjogdmFsaWRhdGVJbnB1dHMsIG1lc3NhZ2U6IHZhbGlkYXRlOiBpbnZhbGlkIGlucHV0IHB1YmxpYyBrZXkgd2l0aCBpbmRleDogMCwgcHVia2V5OiBcImBcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnVGVzdCBpbnB1dCB3aXRob3V0IHR4IGlkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgZXhwZWN0KCgpID0+IHZhbGlkYXRlSW5wdXRzKFt0ZXN0SW5wdXRXaXRob3V0VHhJZF0pKS50b1Rocm93RXJyb3JNYXRjaGluZ0lubGluZVNuYXBzaG90KFxuICAgICAgICBgXCJlcnJvciBmdW5jdGlvbjogdmFsaWRhdGVJbnB1dHMsIG1lc3NhZ2U6IHZhbGlkYXRlOiBpbnZhbGlkIHR4SWQgd2l0aCBpbmRleDogMFwiYFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdUZXN0IGlucHV0IHdpdGhvdXQgMCB2YWx1ZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PiB2YWxpZGF0ZUlucHV0cyhbdGVzdElucHV0V2l0aFplcm9BbW91bnRdKSkudG9UaHJvd0Vycm9yTWF0Y2hpbmdJbmxpbmVTbmFwc2hvdChcbiAgICAgICAgYFwiZXJyb3IgZnVuY3Rpb246IHZhbGlkYXRlSW5wdXRzLCBtZXNzYWdlOiB2YWxpZGF0ZTogaW52YWxpZCBpbnB1dCB2YWx1ZTogMCB3aXRoIGluZGV4OiAwLCBzaG91bGQgYmUgcG9zaXRpdmUgdmFsdWVcImBcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUZXN0IHZhbGlkYXRlT3V0cHV0cycsICgpID0+IHtcbiAgICBpdCgnVGVzdCBub3JtYWwgb3V0cHV0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgZXhwZWN0KCgpID0+IHZhbGlkYXRlT3V0cHV0cyhbdGVzdE5vcm1hbE91dHB1dF0pKS5ub3QudG9UaHJvd0Vycm9yKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnVGVzdCB3aXRob3V0IG91dHB1dHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4gdmFsaWRhdGVPdXRwdXRzKFtdKSkudG9UaHJvd0Vycm9yTWF0Y2hpbmdJbmxpbmVTbmFwc2hvdChcbiAgICAgICAgYFwiZXJyb3IgZnVuY3Rpb246IHZhbGlkYXRlT3V0cHV0cywgbWVzc2FnZTogdmFsaWRhdGU6IG91dHB1dHMgbGVuZ3RoIGlzIHplcm9cImBcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnVGVzdCBvdXRwdXQgd2l0aCBpbnZhbGlkIGFkZHJlc3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4gdmFsaWRhdGVPdXRwdXRzKFt0ZXN0T3V0cHV0V2l0aEludmFsaWRBZGRyZXNzXSkpLnRvVGhyb3dFcnJvck1hdGNoaW5nSW5saW5lU25hcHNob3QoXG4gICAgICAgIGBcImVycm9yIGZ1bmN0aW9uOiB2YWxpZGF0ZU91dHB1dHMsIG1lc3NhZ2U6IHZhbGlkYXRlOiBpbnZhbGlkIG91dHB1dCBhZGRyZXNzIHdpdGggaW5kZXg6IDAsIGFkZHJlc3M6IGthc3BhOnFxOXJtZmhnYzc1OGo0enl2Y25nZDBxaGVrdDkwcXFmMmN6dnNodmR6ZGxxN2pxOGpwaG12cjAyOFwiYFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdUZXN0IG91dHB1dCB3aXRob3V0IDAgdmFsdWUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4gdmFsaWRhdGVPdXRwdXRzKFt0ZXN0T3V0cHV0V2l0aFplcm9BbW91bnRdKSkudG9UaHJvd0Vycm9yTWF0Y2hpbmdJbmxpbmVTbmFwc2hvdChcbiAgICAgICAgYFwiZXJyb3IgZnVuY3Rpb246IHZhbGlkYXRlT3V0cHV0cywgbWVzc2FnZTogdmFsaWRhdGU6IGludmFsaWQgb3V0cHV0IHZhbHVlOiAwIHdpdGggaW5kZXg6IDAsIHNob3VsZCBiZSBwb3NpdGl2ZSB2YWx1ZVwiYFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1Rlc3QgdmFsaWRhdGVBbW91bnRDYW5EaXNwbGF5T25Qcm9DYXJkJywgKCkgPT4ge1xuICAgIGl0KCdUZXN0IG5vcm1hbCB0cmFuc2ZlciBhbW91bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4gdmFsaWRhdGVBbW91bnRDYW5EaXNwbGF5T25Qcm9DYXJkKHRlc3ROb3JtYWxPdXRwdXQudmFsdWUsIGRlY2ltYWxzKSkubm90LnRvVGhyb3dFcnJvcigpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Rlc3QgbW9yZSB0aGFuIDggYml0cyB0cmFuc2ZlciBhbW91bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT5cbiAgICAgICAgdmFsaWRhdGVBbW91bnRDYW5EaXNwbGF5T25Qcm9DYXJkKHRlc3RPdXRwdXRWYWx1ZVdpdGhUb29NYW55RGVjaW1hbHMudmFsdWUsIGRlY2ltYWxzKVxuICAgICAgKS50b1Rocm93RXJyb3JNYXRjaGluZ0lubGluZVNuYXBzaG90KFxuICAgICAgICBgXCJlcnJvciBmdW5jdGlvbjogdmFsaWRhdGVBbW91bnRDYW5EaXNwbGF5T25Qcm9DYXJkLCBtZXNzYWdlOiB2YWxpZGF0ZTogcHJvIGNhcmQgY2Fubm90IGRpc3BsYXkgbW9yZSB0aGFuIDggZGlnaXRzXCJgXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVGVzdCB2YWxpZGF0ZUR1c3RUaHJlc2hvbGQgd2l0aCA2MDAgZHVzdCcsICgpID0+IHtcbiAgICBpdCgnVGVzdCBub3JtYWwgdHJhbnNmZXIgYW1vdW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgZXhwZWN0KCgpID0+IHZhbGlkYXRlRHVzdFRocmVzaG9sZCh0ZXN0Tm9ybWFsT3V0cHV0LnZhbHVlLCB0ZXN0VHhEYXRhLmR1c3RTaXplKSkubm90LnRvVGhyb3dFcnJvcigpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Rlc3QgdHJhbnNmZXIgNTQ2IHNvbXBpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgZXhwZWN0KCgpID0+XG4gICAgICAgIHZhbGlkYXRlRHVzdFRocmVzaG9sZCh0ZXN0T3V0cHV0VmFsdWVMZXNzVGhhbkR1c3QudmFsdWUsIHRlc3RUeERhdGEuZHVzdFNpemUpXG4gICAgICApLnRvVGhyb3dFcnJvck1hdGNoaW5nSW5saW5lU25hcHNob3QoXG4gICAgICAgIGBcImVycm9yIGZ1bmN0aW9uOiB2YWxpZGF0ZUR1c3RUaHJlc2hvbGQsIG1lc3NhZ2U6IHZhbGlkYXRlOiB0cmFuc2ZlciBhbW91bnQgaXMgYmVsb3cgdGhlIGR1c3QgdGhyZXNob2xkKDYwMClcImBcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUZXN0IHZhbGlkYXRlQ2hhbmdlJywgKCkgPT4ge1xuICAgIGl0KCdUZXN0IG5vcm1hbCBjaGFuZ2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4gdmFsaWRhdGVDaGFuZ2UodGVzdE5vcm1hbENoYW5nZSkpLm5vdC50b1Rocm93RXJyb3IoKTtcbiAgICB9KTtcblxuICAgIGl0KCdUZXN0IHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCBjaGFuZ2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4gdmFsaWRhdGVDaGFuZ2UodGVzdEludmFsaWRDaGFuZ2UpKS50b1Rocm93RXJyb3JNYXRjaGluZ0lubGluZVNuYXBzaG90KFxuICAgICAgICBgXCJlcnJvciBmdW5jdGlvbjogdmFsaWRhdGVDaGFuZ2UsIG1lc3NhZ2U6IHZhbGlkYXRlOiBpbnZhbGlkIGNoYW5nZSB2YWx1ZTogLTMyODU0IHNob3VsZCBiZSBwb3NpdGl2ZSB2YWx1ZVwiYFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1Rlc3QgdmFsaWRhdGVUcmFuc2FjdGlvbicsICgpID0+IHtcbiAgICBpdCgnVGVzdCBub3JtYWwgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IFRyYW5zYWN0aW9uLmZyb21UeERhdGEodGVzdFR4RGF0YSk7XG4gICAgICBleHBlY3QoKCkgPT4gdmFsaWRhdGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbikpLm5vdC50b1Rocm93RXJyb3IoKTtcbiAgICB9KTtcblxuICAgIGl0KCdUZXN0IHRyYW5zYWN0aW9uIHdpdGggaW5zdWZmaWNpZW50IGZlZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gVHJhbnNhY3Rpb24uZnJvbVR4RGF0YSh7IC4uLnRlc3RUeERhdGEsIGNoYW5nZTogdGVzdEluc3VmZmljaWVudEZlZUNoYW5nZSB9KTtcbiAgICAgIGV4cGVjdCh0cmFuc2FjdGlvbi5mZWVWYWx1ZSkudG9CZSgnMTAwMCcpO1xuICAgICAgZXhwZWN0KCgpID0+IHZhbGlkYXRlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pKS50b1Rocm93RXJyb3JNYXRjaGluZ0lubGluZVNuYXBzaG90KFxuICAgICAgICBgXCJlcnJvciBmdW5jdGlvbjogdmFsaWRhdGVGZWUsIG1lc3NhZ2U6IHZhbGlkYXRlOiB0cmFuc2FjdGlvbiBmZWUgZGlkIG5vdCBleGNlZWQgMjAzNiBzb21waVwiYFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdUZXN0IHRyYW5zYWN0aW9uIHdpdGggbWF4IHZhbHVlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBUcmFuc2FjdGlvbi5mcm9tVHhEYXRhKHsgLi4udGVzdFR4RGF0YSwgb3V0cHV0OiB0ZXN0T3V0cHV0VmFsdWVNYXgsIGNoYW5nZTogdW5kZWZpbmVkIH0pO1xuICAgICAgZXhwZWN0KCgpID0+IHZhbGlkYXRlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pKS5ub3QudG9UaHJvd0Vycm9yKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnVGVzdCB0cmFuc2FjdGlvbiB3aXRoIHRvbyBsYXJnZSBtYXNzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBUcmFuc2FjdGlvbi5mcm9tVHhEYXRhKHRlc3RUeERhdGFXaXRoTGFyZ2VJbnB1dHMpO1xuICAgICAgZXhwZWN0KCgpID0+IHZhbGlkYXRlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pKS50b1Rocm93RXJyb3JNYXRjaGluZ0lubGluZVNuYXBzaG90KFxuICAgICAgICBgXCJlcnJvciBmdW5jdGlvbjogdmFsaWRhdGVNYXNzLCBtZXNzYWdlOiB2YWxpZGF0ZTogY3VycmVudCBtYXNzOiA5NDAwMzgsIGV4Y2VlZHMgdGhlIG1heGlt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