jsforce
Version:
Salesforce API Library for JavaScript
287 lines (283 loc) • 39 kB
JavaScript
import "core-js/modules/es.error.cause.js";
import "core-js/modules/es.array.push.js";
import "core-js/modules/es.object.to-string.js";
import "core-js/modules/es.regexp.to-string.js";
import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols";
import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor";
import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors";
import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties";
import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
import _sliceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/slice";
import _Array$from from "@babel/runtime-corejs3/core-js-stable/array/from";
import _Symbol from "@babel/runtime-corejs3/core-js-stable/symbol";
import _getIteratorMethod from "@babel/runtime-corejs3/core-js/get-iterator-method";
import _Array$isArray from "@babel/runtime-corejs3/core-js-stable/array/is-array";
import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/objectWithoutProperties";
import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty";
import _asyncToGenerator from "@babel/runtime-corejs3/helpers/asyncToGenerator";
var _excluded = ["url", "body"];
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof _Symbol && _getIteratorMethod(r) || 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 _unsupportedIterableToArray(r, a) { if (r) { var _context8; if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = _sliceInstanceProperty(_context8 = {}.toString.call(r)).call(_context8, 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 _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; }
import _regeneratorRuntime from "@babel/runtime-corejs3/regenerator";
import "core-js/modules/es.function.name.js";
import "core-js/modules/es.regexp.exec.js";
import "core-js/modules/es.regexp.test.js";
import _Promise from "@babel/runtime-corejs3/core-js-stable/promise";
import _setTimeout from "@babel/runtime-corejs3/core-js-stable/set-timeout";
import _includesInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/includes";
import _keysInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/keys";
function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty(o).call(o, 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 _context6, _context7; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context6 = ownKeys(Object(t), !0)).call(_context6, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context7 = ownKeys(Object(t))).call(_context7, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
import { Readable } from 'stream';
import fetch, { Response } from 'node-fetch';
import createHttpsProxyAgent from 'https-proxy-agent';
import { createHttpRequestHandlerStreams, executeWithTimeout, isRedirect, performRedirectRequest } from './request-helper';
import { getLogger } from './util/logger';
import is from '@sindresorhus/is';
/**
*
*/
var defaults = {};
/**
*
*/
export function setDefaults(defaults_) {
defaults = defaults_;
}
/**
*
*/
function startFetchRequest(_x, _x2, _x3, _x4, _x5) {
return _startFetchRequest.apply(this, arguments);
}
/**
*
*/
function _startFetchRequest() {
_startFetchRequest = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(request, options, input, output, emitter) {
var _options$retry$status, _options$retry, _options$retry$maxRet, _options$retry2, _options$retry$minTim, _options$retry3, _options$retry$timeou, _options$retry4, _options$retry$errorC, _options$retry5, _options$retry$method, _options$retry6, _context4;
var counter,
logger,
httpProxy,
followRedirect,
agent,
url,
body,
rrequest,
controller,
retryCount,
retryOpts,
shouldRetryRequest,
_fetchWithRetries,
res,
headers,
_iterator,
_step,
headerName,
response,
_args2 = arguments;
return _regeneratorRuntime.wrap(function _callee2$(_context5) {
while (1) switch (_context5.prev = _context5.next) {
case 0:
counter = _args2.length > 5 && _args2[5] !== undefined ? _args2[5] : 0;
logger = getLogger('fetch');
httpProxy = options.httpProxy, followRedirect = options.followRedirect;
agent = httpProxy ? createHttpsProxyAgent(httpProxy) : undefined;
url = request.url, body = request.body, rrequest = _objectWithoutProperties(request, _excluded);
controller = new AbortController();
retryCount = 0;
retryOpts = {
statusCodes: (_options$retry$status = (_options$retry = options.retry) === null || _options$retry === void 0 ? void 0 : _options$retry.statusCodes) !== null && _options$retry$status !== void 0 ? _options$retry$status : [420, 429, 500, 502, 503, 504],
maxRetries: (_options$retry$maxRet = (_options$retry2 = options.retry) === null || _options$retry2 === void 0 ? void 0 : _options$retry2.maxRetries) !== null && _options$retry$maxRet !== void 0 ? _options$retry$maxRet : 5,
minTimeout: (_options$retry$minTim = (_options$retry3 = options.retry) === null || _options$retry3 === void 0 ? void 0 : _options$retry3.minTimeout) !== null && _options$retry$minTim !== void 0 ? _options$retry$minTim : 500,
timeoutFactor: (_options$retry$timeou = (_options$retry4 = options.retry) === null || _options$retry4 === void 0 ? void 0 : _options$retry4.timeoutFactor) !== null && _options$retry$timeou !== void 0 ? _options$retry$timeou : 2,
errorCodes: (_options$retry$errorC = (_options$retry5 = options.retry) === null || _options$retry5 === void 0 ? void 0 : _options$retry5.errorCodes) !== null && _options$retry$errorC !== void 0 ? _options$retry$errorC : ['ECONNRESET', 'ECONNREFUSED', 'ENOTFOUND', 'ENETDOWN', 'ENETUNREACH', 'EHOSTDOWN', 'UND_ERR_SOCKET', 'ETIMEDOUT', 'EPIPE'],
methods: (_options$retry$method = (_options$retry6 = options.retry) === null || _options$retry6 === void 0 ? void 0 : _options$retry6.methods) !== null && _options$retry$method !== void 0 ? _options$retry$method : ['GET', 'PUT', 'HEAD', 'OPTIONS', 'DELETE']
};
shouldRetryRequest = function shouldRetryRequest(maxRetry, resOrErr) {
var _context;
if (!_includesInstanceProperty(_context = retryOpts.methods).call(_context, request.method)) return false;
if (resOrErr instanceof Response) {
var _context2;
if (_includesInstanceProperty(_context2 = retryOpts.statusCodes).call(_context2, resOrErr.status)) {
if (maxRetry === retryCount) {
return false;
} else {
return true;
}
}
return false;
} else {
var _retryOpts$errorCodes;
if (maxRetry === retryCount) return false;
// only retry on operational errors
// https://github.com/node-fetch/node-fetch/blob/2.x/ERROR-HANDLING.md#error-handling-with-node-fetch
if (resOrErr.name != 'FetchError') return false;
if (is.nodeStream(body) && Readable.isDisturbed(body)) {
logger.debug('Body of type stream was read, unable to retry request.');
return false;
}
if ('code' in resOrErr && resOrErr.code && retryOpts !== null && retryOpts !== void 0 && (_retryOpts$errorCodes = retryOpts.errorCodes) !== null && _retryOpts$errorCodes !== void 0 && _includesInstanceProperty(_retryOpts$errorCodes).call(_retryOpts$errorCodes, resOrErr.code)) return true;
return false;
}
};
_fetchWithRetries = /*#__PURE__*/function () {
var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
var maxRetry,
fetchOpts,
_res,
error,
_args = arguments;
return _regeneratorRuntime.wrap(function _callee$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
maxRetry = _args.length > 0 && _args[0] !== undefined ? _args[0] : retryOpts === null || retryOpts === void 0 ? void 0 : retryOpts.maxRetries;
fetchOpts = _objectSpread(_objectSpread(_objectSpread({}, rrequest), input && /^(post|put|patch)$/i.test(request.method) ? {
body: input
} : {}), {}, {
redirect: 'manual',
signal: controller.signal,
agent: agent
});
_context3.prev = 2;
_context3.next = 5;
return fetch(url, fetchOpts);
case 5:
_res = _context3.sent;
if (!shouldRetryRequest(retryOpts.maxRetries, _res)) {
_context3.next = 16;
break;
}
logger.debug("retrying for the ".concat(retryCount + 1, " time"));
logger.debug('reason: statusCode match');
_context3.next = 11;
return sleep(retryCount === 0 ? retryOpts.minTimeout : retryOpts.minTimeout * Math.pow(retryOpts.timeoutFactor, retryCount));
case 11:
// NOTE: this event is only used by tests and will be removed at any time.
// jsforce may switch to node's fetch which doesn't emit this event on retries.
emitter.emit('retry', retryCount);
retryCount++;
_context3.next = 15;
return _fetchWithRetries(maxRetry);
case 15:
return _context3.abrupt("return", _context3.sent);
case 16:
return _context3.abrupt("return", _res);
case 19:
_context3.prev = 19;
_context3.t0 = _context3["catch"](2);
logger.debug('Request failed');
error = _context3.t0; // request was canceled by consumer (AbortController), skip retry and rethrow.
if (!(error.name === 'AbortError')) {
_context3.next = 25;
break;
}
throw error;
case 25:
if (!shouldRetryRequest(retryOpts.maxRetries, error)) {
_context3.next = 33;
break;
}
logger.debug("retrying for the ".concat(retryCount + 1, " time"));
logger.debug("Error: ".concat(_context3.t0.message));
_context3.next = 30;
return sleep(retryCount === 0 ? retryOpts.minTimeout : retryOpts.minTimeout * Math.pow(retryOpts.timeoutFactor, retryCount));
case 30:
// NOTE: this event is only used by tests and will be removed at any time.
// jsforce may switch to node's fetch which doesn't emit this event on retries.
emitter.emit('retry', retryCount);
retryCount++;
return _context3.abrupt("return", _fetchWithRetries(maxRetry));
case 33:
logger.debug('Skipping retry...');
if (!(maxRetry === retryCount)) {
_context3.next = 38;
break;
}
throw _context3.t0;
case 38:
throw _context3.t0;
case 39:
case "end":
return _context3.stop();
}
}, _callee, null, [[2, 19]]);
}));
return function fetchWithRetries() {
return _ref.apply(this, arguments);
};
}();
_context5.prev = 10;
_context5.next = 13;
return executeWithTimeout(_fetchWithRetries, options.timeout, function () {
return controller.abort();
});
case 13:
res = _context5.sent;
_context5.next = 20;
break;
case 16:
_context5.prev = 16;
_context5.t0 = _context5["catch"](10);
emitter.emit('error', _context5.t0);
return _context5.abrupt("return");
case 20:
headers = {};
_iterator = _createForOfIteratorHelper(_keysInstanceProperty(_context4 = res.headers).call(_context4));
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
headerName = _step.value;
headers[headerName.toLowerCase()] = res.headers.get(headerName);
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
response = {
statusCode: res.status,
headers: headers
};
if (!(followRedirect && isRedirect(response.statusCode))) {
_context5.next = 27;
break;
}
try {
performRedirectRequest(request, response, followRedirect, counter, function (req) {
return startFetchRequest(req, options, undefined, output, emitter, counter + 1);
});
} catch (err) {
emitter.emit('error', err);
}
return _context5.abrupt("return");
case 27:
emitter.emit('response', response);
res.body.pipe(output);
case 29:
case "end":
return _context5.stop();
}
}, _callee2, null, [[10, 16]]);
}));
return _startFetchRequest.apply(this, arguments);
}
export default function request(req) {
var options_ = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var options = _objectSpread(_objectSpread({}, defaults), options_);
var _createHttpRequestHan = createHttpRequestHandlerStreams(req, options),
input = _createHttpRequestHan.input,
output = _createHttpRequestHan.output,
stream = _createHttpRequestHan.stream;
startFetchRequest(req, options, input, output, stream);
return stream;
}
var sleep = function sleep(ms) {
return new _Promise(function (r) {
return _setTimeout(r, ms);
});
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFkYWJsZSIsImZldGNoIiwiUmVzcG9uc2UiLCJjcmVhdGVIdHRwc1Byb3h5QWdlbnQiLCJjcmVhdGVIdHRwUmVxdWVzdEhhbmRsZXJTdHJlYW1zIiwiZXhlY3V0ZVdpdGhUaW1lb3V0IiwiaXNSZWRpcmVjdCIsInBlcmZvcm1SZWRpcmVjdFJlcXVlc3QiLCJnZXRMb2dnZXIiLCJpcyIsImRlZmF1bHRzIiwic2V0RGVmYXVsdHMiLCJkZWZhdWx0c18iLCJzdGFydEZldGNoUmVxdWVzdCIsIl94IiwiX3gyIiwiX3gzIiwiX3g0IiwiX3g1IiwiX3N0YXJ0RmV0Y2hSZXF1ZXN0IiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZTIiLCJyZXF1ZXN0Iiwib3B0aW9ucyIsImlucHV0Iiwib3V0cHV0IiwiZW1pdHRlciIsIl9vcHRpb25zJHJldHJ5JHN0YXR1cyIsIl9vcHRpb25zJHJldHJ5IiwiX29wdGlvbnMkcmV0cnkkbWF4UmV0IiwiX29wdGlvbnMkcmV0cnkyIiwiX29wdGlvbnMkcmV0cnkkbWluVGltIiwiX29wdGlvbnMkcmV0cnkzIiwiX29wdGlvbnMkcmV0cnkkdGltZW91IiwiX29wdGlvbnMkcmV0cnk0IiwiX29wdGlvbnMkcmV0cnkkZXJyb3JDIiwiX29wdGlvbnMkcmV0cnk1IiwiX29wdGlvbnMkcmV0cnkkbWV0aG9kIiwiX29wdGlvbnMkcmV0cnk2IiwiX2NvbnRleHQ0IiwiY291bnRlciIsImxvZ2dlciIsImh0dHBQcm94eSIsImZvbGxvd1JlZGlyZWN0IiwiYWdlbnQiLCJ1cmwiLCJib2R5IiwicnJlcXVlc3QiLCJjb250cm9sbGVyIiwicmV0cnlDb3VudCIsInJldHJ5T3B0cyIsInNob3VsZFJldHJ5UmVxdWVzdCIsIl9mZXRjaFdpdGhSZXRyaWVzIiwicmVzIiwiaGVhZGVycyIsIl9pdGVyYXRvciIsIl9zdGVwIiwiaGVhZGVyTmFtZSIsInJlc3BvbnNlIiwiX2FyZ3MyIiwid3JhcCIsIl9jYWxsZWUyJCIsIl9jb250ZXh0NSIsInByZXYiLCJuZXh0IiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiX2V4Y2x1ZGVkIiwiQWJvcnRDb250cm9sbGVyIiwic3RhdHVzQ29kZXMiLCJyZXRyeSIsIm1heFJldHJpZXMiLCJtaW5UaW1lb3V0IiwidGltZW91dEZhY3RvciIsImVycm9yQ29kZXMiLCJtZXRob2RzIiwibWF4UmV0cnkiLCJyZXNPckVyciIsIl9jb250ZXh0IiwiX2luY2x1ZGVzSW5zdGFuY2VQcm9wZXJ0eSIsImNhbGwiLCJtZXRob2QiLCJfY29udGV4dDIiLCJzdGF0dXMiLCJfcmV0cnlPcHRzJGVycm9yQ29kZXMiLCJuYW1lIiwibm9kZVN0cmVhbSIsImlzRGlzdHVyYmVkIiwiZGVidWciLCJjb2RlIiwiZmV0Y2hXaXRoUmV0cmllcyIsIl9yZWYiLCJfY2FsbGVlIiwiZmV0Y2hPcHRzIiwiX3JlcyIsImVycm9yIiwiX2FyZ3MiLCJfY2FsbGVlJCIsIl9jb250ZXh0MyIsIl9vYmplY3RTcHJlYWQiLCJ0ZXN0IiwicmVkaXJlY3QiLCJzaWduYWwiLCJzZW50IiwiY29uY2F0Iiwic2xlZXAiLCJNYXRoIiwicG93IiwiZW1pdCIsImFicnVwdCIsInQwIiwibWVzc2FnZSIsInN0b3AiLCJ0aW1lb3V0IiwiYWJvcnQiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9rZXlzSW5zdGFuY2VQcm9wZXJ0eSIsInMiLCJuIiwiZG9uZSIsInZhbHVlIiwidG9Mb3dlckNhc2UiLCJnZXQiLCJlcnIiLCJlIiwiZiIsInN0YXR1c0NvZGUiLCJyZXEiLCJwaXBlIiwib3B0aW9uc18iLCJfY3JlYXRlSHR0cFJlcXVlc3RIYW4iLCJzdHJlYW0iLCJtcyIsIl9Qcm9taXNlIiwiciIsIl9zZXRUaW1lb3V0Il0sInNvdXJjZXMiOlsiLi4vc3JjL3JlcXVlc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCB7IER1cGxleCwgUmVhZGFibGUsIFdyaXRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCBmZXRjaCwgeyBSZXNwb25zZSwgUmVxdWVzdEluaXQsIEZldGNoRXJyb3IgfSBmcm9tICdub2RlLWZldGNoJztcbmltcG9ydCBjcmVhdGVIdHRwc1Byb3h5QWdlbnQgZnJvbSAnaHR0cHMtcHJveHktYWdlbnQnO1xuaW1wb3J0IHtcbiAgY3JlYXRlSHR0cFJlcXVlc3RIYW5kbGVyU3RyZWFtcyxcbiAgZXhlY3V0ZVdpdGhUaW1lb3V0LFxuICBpc1JlZGlyZWN0LFxuICBwZXJmb3JtUmVkaXJlY3RSZXF1ZXN0LFxufSBmcm9tICcuL3JlcXVlc3QtaGVscGVyJztcbmltcG9ydCB7IEh0dHBSZXF1ZXN0LCBIdHRwUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vdXRpbC9sb2dnZXInO1xuaW1wb3J0IGlzIGZyb20gJ0BzaW5kcmVzb3JodXMvaXMnO1xuXG4vKipcbiAqXG4gKi9cbmxldCBkZWZhdWx0czogSHR0cFJlcXVlc3RPcHRpb25zID0ge307XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRzKGRlZmF1bHRzXzogSHR0cFJlcXVlc3RPcHRpb25zKSB7XG4gIGRlZmF1bHRzID0gZGVmYXVsdHNfO1xufVxuXG4vKipcbiAqXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0RmV0Y2hSZXF1ZXN0KFxuICByZXF1ZXN0OiBIdHRwUmVxdWVzdCxcbiAgb3B0aW9uczogSHR0cFJlcXVlc3RPcHRpb25zLFxuICBpbnB1dDogUmVhZGFibGUgfCB1bmRlZmluZWQsXG4gIG91dHB1dDogV3JpdGFibGUsXG4gIGVtaXR0ZXI6IEV2ZW50RW1pdHRlcixcbiAgY291bnRlcjogbnVtYmVyID0gMCxcbikge1xuICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoJ2ZldGNoJyk7XG4gIGNvbnN0IHsgaHR0cFByb3h5LCBmb2xsb3dSZWRpcmVjdCB9ID0gb3B0aW9ucztcbiAgY29uc3QgYWdlbnQgPSBodHRwUHJveHkgPyBjcmVhdGVIdHRwc1Byb3h5QWdlbnQoaHR0cFByb3h5KSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgeyB1cmwsIGJvZHksIC4uLnJyZXF1ZXN0IH0gPSByZXF1ZXN0O1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGxldCByZXRyeUNvdW50ID0gMDtcblxuICBjb25zdCByZXRyeU9wdHM6IFJlcXVpcmVkPEh0dHBSZXF1ZXN0T3B0aW9uc1sncmV0cnknXT4gPSB7XG4gICAgc3RhdHVzQ29kZXM6IG9wdGlvbnMucmV0cnk/LnN0YXR1c0NvZGVzID8/IFs0MjAsIDQyOSwgNTAwLCA1MDIsIDUwMywgNTA0XSxcbiAgICBtYXhSZXRyaWVzOiBvcHRpb25zLnJldHJ5Py5tYXhSZXRyaWVzID8/IDUsXG4gICAgbWluVGltZW91dDogb3B0aW9ucy5yZXRyeT8ubWluVGltZW91dCA/PyA1MDAsXG4gICAgdGltZW91dEZhY3Rvcjogb3B0aW9ucy5yZXRyeT8udGltZW91dEZhY3RvciA/PyAyLFxuICAgIGVycm9yQ29kZXM6IG9wdGlvbnMucmV0cnk/LmVycm9yQ29kZXMgPz8gW1xuICAgICAgJ0VDT05OUkVTRVQnLFxuICAgICAgJ0VDT05OUkVGVVNFRCcsXG4gICAgICAnRU5PVEZPVU5EJyxcbiAgICAgICdFTkVURE9XTicsXG4gICAgICAnRU5FVFVOUkVBQ0gnLFxuICAgICAgJ0VIT1NURE9XTicsXG4gICAgICAnVU5EX0VSUl9TT0NLRVQnLFxuICAgICAgJ0VUSU1FRE9VVCcsXG4gICAgICAnRVBJUEUnLFxuICAgIF0sXG4gICAgbWV0aG9kczogb3B0aW9ucy5yZXRyeT8ubWV0aG9kcyA/PyBbXG4gICAgICAnR0VUJyxcbiAgICAgICdQVVQnLFxuICAgICAgJ0hFQUQnLFxuICAgICAgJ09QVElPTlMnLFxuICAgICAgJ0RFTEVURScsXG4gICAgXSxcbiAgfTtcblxuICBjb25zdCBzaG91bGRSZXRyeVJlcXVlc3QgPSAoXG4gICAgbWF4UmV0cnk6IG51bWJlcixcbiAgICByZXNPckVycjogUmVzcG9uc2UgfCBFcnJvciB8IEZldGNoRXJyb3IsXG4gICk6IGJvb2xlYW4gPT4ge1xuICAgIGlmICghcmV0cnlPcHRzLm1ldGhvZHMuaW5jbHVkZXMocmVxdWVzdC5tZXRob2QpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAocmVzT3JFcnIgaW5zdGFuY2VvZiBSZXNwb25zZSkge1xuICAgICAgaWYgKHJldHJ5T3B0cy5zdGF0dXNDb2Rlcy5pbmNsdWRlcyhyZXNPckVyci5zdGF0dXMpKSB7XG4gICAgICAgIGlmIChtYXhSZXRyeSA9PT0gcmV0cnlDb3VudCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChtYXhSZXRyeSA9PT0gcmV0cnlDb3VudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBvbmx5IHJldHJ5IG9uIG9wZXJhdGlvbmFsIGVycm9yc1xuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGUtZmV0Y2gvbm9kZS1mZXRjaC9ibG9iLzIueC9FUlJPUi1IQU5ETElORy5tZCNlcnJvci1oYW5kbGluZy13aXRoLW5vZGUtZmV0Y2hcbiAgICAgIGlmIChyZXNPckVyci5uYW1lICE9ICdGZXRjaEVycm9yJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBpZiAoaXMubm9kZVN0cmVhbShib2R5KSAmJiBSZWFkYWJsZS5pc0Rpc3R1cmJlZChib2R5KSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ0JvZHkgb2YgdHlwZSBzdHJlYW0gd2FzIHJlYWQsIHVuYWJsZSB0byByZXRyeSByZXF1ZXN0LicpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgJ2NvZGUnIGluIHJlc09yRXJyICYmXG4gICAgICAgIHJlc09yRXJyLmNvZGUgJiZcbiAgICAgICAgcmV0cnlPcHRzPy5lcnJvckNvZGVzPy5pbmNsdWRlcyhyZXNPckVyci5jb2RlKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBmZXRjaFdpdGhSZXRyaWVzID0gYXN5bmMgKFxuICAgIG1heFJldHJ5ID0gcmV0cnlPcHRzPy5tYXhSZXRyaWVzLFxuICApOiBQcm9taXNlPFJlc3BvbnNlPiA9PiB7XG4gICAgY29uc3QgZmV0Y2hPcHRzOiBSZXF1ZXN0SW5pdCA9IHtcbiAgICAgIC4uLnJyZXF1ZXN0LFxuICAgICAgLi4uKGlucHV0ICYmIC9eKHBvc3R8cHV0fHBhdGNoKSQvaS50ZXN0KHJlcXVlc3QubWV0aG9kKVxuICAgICAgICA/IHsgYm9keTogaW5wdXQgfVxuICAgICAgICA6IHt9KSxcbiAgICAgIHJlZGlyZWN0OiAnbWFudWFsJyxcbiAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgICBhZ2VudCxcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgZmV0Y2hPcHRzKTtcbiAgICAgIGlmIChzaG91bGRSZXRyeVJlcXVlc3QocmV0cnlPcHRzLm1heFJldHJpZXMsIHJlcykpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGByZXRyeWluZyBmb3IgdGhlICR7cmV0cnlDb3VudCArIDF9IHRpbWVgKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdyZWFzb246IHN0YXR1c0NvZGUgbWF0Y2gnKTtcblxuICAgICAgICBhd2FpdCBzbGVlcChcbiAgICAgICAgICByZXRyeUNvdW50ID09PSAwXG4gICAgICAgICAgICA/IHJldHJ5T3B0cy5taW5UaW1lb3V0XG4gICAgICAgICAgICA6IHJldHJ5T3B0cy5taW5UaW1lb3V0ICogcmV0cnlPcHRzLnRpbWVvdXRGYWN0b3IgKiogcmV0cnlDb3VudCxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBOT1RFOiB0aGlzIGV2ZW50IGlzIG9ubHkgdXNlZCBieSB0ZXN0cyBhbmQgd2lsbCBiZSByZW1vdmVkIGF0IGFueSB0aW1lLlxuICAgICAgICAvLyBqc2ZvcmNlIG1heSBzd2l0Y2ggdG8gbm9kZSdzIGZldGNoIHdoaWNoIGRvZXNuJ3QgZW1pdCB0aGlzIGV2ZW50IG9uIHJldHJpZXMuXG4gICAgICAgIGVtaXR0ZXIuZW1pdCgncmV0cnknLCByZXRyeUNvdW50KTtcbiAgICAgICAgcmV0cnlDb3VudCsrO1xuXG4gICAgICAgIHJldHVybiBhd2FpdCBmZXRjaFdpdGhSZXRyaWVzKG1heFJldHJ5KTtcbiAgICAgIH1cbiAgICAgIC8vIHNob3VsZCB3ZSB0aHJvdyBoZXJlIGlmIHRoZSBtYXhSZXRyeSBhbHJlYWR5IGhhcHBlbmVkIGFuZCBzdGlsbCBnb3QgdGhlIHNhbWUgc3RhdHVzQ29kZT9cbiAgICAgIHJldHVybiByZXM7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ1JlcXVlc3QgZmFpbGVkJyk7XG4gICAgICBjb25zdCBlcnJvciA9IGVyciBhcyBFcnJvciB8IEZldGNoRXJyb3I7XG5cbiAgICAgIC8vIHJlcXVlc3Qgd2FzIGNhbmNlbGVkIGJ5IGNvbnN1bWVyIChBYm9ydENvbnRyb2xsZXIpLCBza2lwIHJldHJ5IGFuZCByZXRocm93LlxuICAgICAgaWYgKGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFJldHJ5UmVxdWVzdChyZXRyeU9wdHMubWF4UmV0cmllcywgZXJyb3IpKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgcmV0cnlpbmcgZm9yIHRoZSAke3JldHJ5Q291bnQgKyAxfSB0aW1lYCk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRXJyb3I6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gKTtcblxuICAgICAgICBhd2FpdCBzbGVlcChcbiAgICAgICAgICByZXRyeUNvdW50ID09PSAwXG4gICAgICAgICAgICA/IHJldHJ5T3B0cy5taW5UaW1lb3V0XG4gICAgICAgICAgICA6IHJldHJ5T3B0cy5taW5UaW1lb3V0ICogcmV0cnlPcHRzLnRpbWVvdXRGYWN0b3IgKiogcmV0cnlDb3VudCxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBOT1RFOiB0aGlzIGV2ZW50IGlzIG9ubHkgdXNlZCBieSB0ZXN0cyBhbmQgd2lsbCBiZSByZW1vdmVkIGF0IGFueSB0aW1lLlxuICAgICAgICAvLyBqc2ZvcmNlIG1heSBzd2l0Y2ggdG8gbm9kZSdzIGZldGNoIHdoaWNoIGRvZXNuJ3QgZW1pdCB0aGlzIGV2ZW50IG9uIHJldHJpZXMuXG4gICAgICAgIGVtaXR0ZXIuZW1pdCgncmV0cnknLCByZXRyeUNvdW50KTtcbiAgICAgICAgcmV0cnlDb3VudCsrO1xuXG4gICAgICAgIHJldHVybiBmZXRjaFdpdGhSZXRyaWVzKG1heFJldHJ5KTtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmRlYnVnKCdTa2lwcGluZyByZXRyeS4uLicpO1xuXG4gICAgICBpZiAobWF4UmV0cnkgPT09IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBsZXQgcmVzOiBSZXNwb25zZTtcblxuICB0cnkge1xuICAgIHJlcyA9IGF3YWl0IGV4ZWN1dGVXaXRoVGltZW91dChmZXRjaFdpdGhSZXRyaWVzLCBvcHRpb25zLnRpbWVvdXQsICgpID0+XG4gICAgICBjb250cm9sbGVyLmFib3J0KCksXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZW1pdHRlci5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgZm9yIChjb25zdCBoZWFkZXJOYW1lIG9mIHJlcy5oZWFkZXJzLmtleXMoKSkge1xuICAgIGhlYWRlcnNbaGVhZGVyTmFtZS50b0xvd2VyQ2FzZSgpXSA9IHJlcy5oZWFkZXJzLmdldChoZWFkZXJOYW1lKTtcbiAgfVxuICBjb25zdCByZXNwb25zZSA9IHtcbiAgICBzdGF0dXNDb2RlOiByZXMuc3RhdHVzLFxuICAgIGhlYWRlcnMsXG4gIH07XG4gIGlmIChmb2xsb3dSZWRpcmVjdCAmJiBpc1JlZGlyZWN0KHJlc3BvbnNlLnN0YXR1c0NvZGUpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHBlcmZvcm1SZWRpcmVjdFJlcXVlc3QoXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHJlc3BvbnNlLFxuICAgICAgICBmb2xsb3dSZWRpcmVjdCxcbiAgICAgICAgY291bnRlcixcbiAgICAgICAgKHJlcSkgPT5cbiAgICAgICAgICBzdGFydEZldGNoUmVxdWVzdChcbiAgICAgICAgICAgIHJlcSxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICBvdXRwdXQsXG4gICAgICAgICAgICBlbWl0dGVyLFxuICAgICAgICAgICAgY291bnRlciArIDEsXG4gICAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBlbWl0dGVyLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIGVtaXR0ZXIuZW1pdCgncmVzcG9uc2UnLCByZXNwb25zZSk7XG4gIHJlcy5ib2R5LnBpcGUob3V0cHV0KTtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXF1ZXN0KFxuICByZXE6IEh0dHBSZXF1ZXN0LFxuICBvcHRpb25zXzogSHR0cFJlcXVlc3RPcHRpb25zID0ge30sXG4pOiBEdXBsZXgge1xuICBjb25zdCBvcHRpb25zID0geyAuLi5kZWZhdWx0cywgLi4ub3B0aW9uc18gfTtcbiAgY29uc3QgeyBpbnB1dCwgb3V0cHV0LCBzdHJlYW0gfSA9IGNyZWF0ZUh0dHBSZXF1ZXN0SGFuZGxlclN0cmVhbXMoXG4gICAgcmVxLFxuICAgIG9wdGlvbnMsXG4gICk7XG4gIHN0YXJ0RmV0Y2hSZXF1ZXN0KHJlcSwgb3B0aW9ucywgaW5wdXQsIG91dHB1dCwgc3RyZWFtKTtcbiAgcmV0dXJuIHN0cmVhbTtcbn1cblxuY29uc3Qgc2xlZXAgPSAobXM6IG51bWJlcikgPT4gbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgbXMpKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLFNBQWlCQSxRQUFRLFFBQWtCLFFBQVE7QUFDbkQsT0FBT0MsS0FBSyxJQUFJQyxRQUFRLFFBQWlDLFlBQVk7QUFDckUsT0FBT0MscUJBQXFCLE1BQU0sbUJBQW1CO0FBQ3JELFNBQ0VDLCtCQUErQixFQUMvQkMsa0JBQWtCLEVBQ2xCQyxVQUFVLEVBQ1ZDLHNCQUFzQixRQUNqQixrQkFBa0I7QUFFekIsU0FBU0MsU0FBUyxRQUFRLGVBQWU7QUFDekMsT0FBT0MsRUFBRSxNQUFNLGtCQUFrQjs7QUFFakM7QUFDQTtBQUNBO0FBQ0EsSUFBSUMsUUFBNEIsR0FBRyxDQUFDLENBQUM7O0FBRXJDO0FBQ0E7QUFDQTtBQUNBLE9BQU8sU0FBU0MsV0FBV0EsQ0FBQ0MsU0FBNkIsRUFBRTtFQUN6REYsUUFBUSxHQUFHRSxTQUFTO0FBQ3RCOztBQUVBO0FBQ0E7QUFDQTtBQUZBLFNBR2VDLGlCQUFpQkEsQ0FBQUMsRUFBQSxFQUFBQyxHQUFBLEVBQUFDLEdBQUEsRUFBQUMsR0FBQSxFQUFBQyxHQUFBO0VBQUEsT0FBQUMsa0JBQUEsQ0FBQUMsS0FBQSxPQUFBQyxTQUFBO0FBQUE7QUFrTWhDO0FBQ0E7QUFDQTtBQUZBLFNBQUFGLG1CQUFBO0VBQUFBLGtCQUFB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