UNPKG

jsforce

Version:

Salesforce API Library for JavaScript

300 lines (296 loc) 41.7 kB
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, AbortError } 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, _options$timeout, _context4; var counter, logger, httpProxy, followRedirect, agent, url, body, rrequest, controller, retryCount, retry420Count, retryOpts, shouldRetryRequest, _fetchWithRetries, res, fetchTimeout, 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; retry420Count = 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; // REST API status codes: https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/errorcodes.htm // // Deleted/expired scratch orgs return 420 and causes a long delay on all requests due to the retry with exponential backoff. // We still want to retry on 420 (Metadata API requests sometimes return it) so here we'll limit to a maximum of 2 retries. if (resOrErr.status === 420) { return retry420Count < 2; } else 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 = 17; 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++; if (_res.status === 420) { retry420Count++; } _context3.next = 16; return _fetchWithRetries(maxRetry); case 16: return _context3.abrupt("return", _context3.sent); case 17: return _context3.abrupt("return", _res); case 20: _context3.prev = 20; _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 = 26; break; } throw error; case 26: if (!shouldRetryRequest(retryOpts.maxRetries, error)) { _context3.next = 34; break; } logger.debug("retrying for the ".concat(retryCount + 1, " time")); logger.debug("Error: ".concat(_context3.t0.message)); _context3.next = 31; return sleep(retryCount === 0 ? retryOpts.minTimeout : retryOpts.minTimeout * Math.pow(retryOpts.timeoutFactor, retryCount)); case 31: // 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 34: logger.debug('Skipping retry...'); throw _context3.t0; case 36: case "end": return _context3.stop(); } }, _callee, null, [[2, 20]]); })); return function fetchWithRetries() { return _ref.apply(this, arguments); }; }(); // Timeout after 30 minutes without a response // // node-fetch's default timeout is 0 and jsforce consumers can't set this when calling `Connection` methods so we set a long default at the fetch wrapper level. fetchTimeout = (_options$timeout = options.timeout) !== null && _options$timeout !== void 0 ? _options$timeout : 1800000; _context5.prev = 12; _context5.next = 15; return executeWithTimeout(_fetchWithRetries, fetchTimeout, function () { return controller.abort(); }); case 15: res = _context5.sent; _context5.next = 23; break; case 18: _context5.prev = 18; _context5.t0 = _context5["catch"](12); if (_context5.t0 instanceof AbortError) { _context5.t0.message += ' Request was aborted due to timeout of 10 minutes.'; } emitter.emit('error', _context5.t0); return _context5.abrupt("return"); case 23: 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 = 30; 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 30: emitter.emit('response', response); res.body.pipe(output); case 32: case "end": return _context5.stop(); } }, _callee2, null, [[12, 18]]); })); 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFkYWJsZSIsImZldGNoIiwiUmVzcG9uc2UiLCJBYm9ydEVycm9yIiwiY3JlYXRlSHR0cHNQcm94eUFnZW50IiwiY3JlYXRlSHR0cFJlcXVlc3RIYW5kbGVyU3RyZWFtcyIsImV4ZWN1dGVXaXRoVGltZW91dCIsImlzUmVkaXJlY3QiLCJwZXJmb3JtUmVkaXJlY3RSZXF1ZXN0IiwiZ2V0TG9nZ2VyIiwiaXMiLCJkZWZhdWx0cyIsInNldERlZmF1bHRzIiwiZGVmYXVsdHNfIiwic3RhcnRGZXRjaFJlcXVlc3QiLCJfeCIsIl94MiIsIl94MyIsIl94NCIsIl94NSIsIl9zdGFydEZldGNoUmVxdWVzdCIsImFwcGx5IiwiYXJndW1lbnRzIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUyIiwicmVxdWVzdCIsIm9wdGlvbnMiLCJpbnB1dCIsIm91dHB1dCIsImVtaXR0ZXIiLCJfb3B0aW9ucyRyZXRyeSRzdGF0dXMiLCJfb3B0aW9ucyRyZXRyeSIsIl9vcHRpb25zJHJldHJ5JG1heFJldCIsIl9vcHRpb25zJHJldHJ5MiIsIl9vcHRpb25zJHJldHJ5JG1pblRpbSIsIl9vcHRpb25zJHJldHJ5MyIsIl9vcHRpb25zJHJldHJ5JHRpbWVvdSIsIl9vcHRpb25zJHJldHJ5NCIsIl9vcHRpb25zJHJldHJ5JGVycm9yQyIsIl9vcHRpb25zJHJldHJ5NSIsIl9vcHRpb25zJHJldHJ5JG1ldGhvZCIsIl9vcHRpb25zJHJldHJ5NiIsIl9vcHRpb25zJHRpbWVvdXQiLCJfY29udGV4dDQiLCJjb3VudGVyIiwibG9nZ2VyIiwiaHR0cFByb3h5IiwiZm9sbG93UmVkaXJlY3QiLCJhZ2VudCIsInVybCIsImJvZHkiLCJycmVxdWVzdCIsImNvbnRyb2xsZXIiLCJyZXRyeUNvdW50IiwicmV0cnk0MjBDb3VudCIsInJldHJ5T3B0cyIsInNob3VsZFJldHJ5UmVxdWVzdCIsIl9mZXRjaFdpdGhSZXRyaWVzIiwicmVzIiwiZmV0Y2hUaW1lb3V0IiwiaGVhZGVycyIsIl9pdGVyYXRvciIsIl9zdGVwIiwiaGVhZGVyTmFtZSIsInJlc3BvbnNlIiwiX2FyZ3MyIiwid3JhcCIsIl9jYWxsZWUyJCIsIl9jb250ZXh0NSIsInByZXYiLCJuZXh0IiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiX2V4Y2x1ZGVkIiwiQWJvcnRDb250cm9sbGVyIiwic3RhdHVzQ29kZXMiLCJyZXRyeSIsIm1heFJldHJpZXMiLCJtaW5UaW1lb3V0IiwidGltZW91dEZhY3RvciIsImVycm9yQ29kZXMiLCJtZXRob2RzIiwibWF4UmV0cnkiLCJyZXNPckVyciIsIl9jb250ZXh0IiwiX2luY2x1ZGVzSW5zdGFuY2VQcm9wZXJ0eSIsImNhbGwiLCJtZXRob2QiLCJfY29udGV4dDIiLCJzdGF0dXMiLCJfcmV0cnlPcHRzJGVycm9yQ29kZXMiLCJuYW1lIiwibm9kZVN0cmVhbSIsImlzRGlzdHVyYmVkIiwiZGVidWciLCJjb2RlIiwiZmV0Y2hXaXRoUmV0cmllcyIsIl9yZWYiLCJfY2FsbGVlIiwiZmV0Y2hPcHRzIiwiX3JlcyIsImVycm9yIiwiX2FyZ3MiLCJfY2FsbGVlJCIsIl9jb250ZXh0MyIsIl9vYmplY3RTcHJlYWQiLCJ0ZXN0IiwicmVkaXJlY3QiLCJzaWduYWwiLCJzZW50IiwiY29uY2F0Iiwic2xlZXAiLCJNYXRoIiwicG93IiwiZW1pdCIsImFicnVwdCIsInQwIiwibWVzc2FnZSIsInN0b3AiLCJ0aW1lb3V0IiwiYWJvcnQiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9rZXlzSW5zdGFuY2VQcm9wZXJ0eSIsInMiLCJuIiwiZG9uZSIsInZhbHVlIiwidG9Mb3dlckNhc2UiLCJnZXQiLCJlcnIiLCJlIiwiZiIsInN0YXR1c0NvZGUiLCJyZXEiLCJwaXBlIiwib3B0aW9uc18iLCJfY3JlYXRlSHR0cFJlcXVlc3RIYW4iLCJzdHJlYW0iLCJtcyIsIl9Qcm9taXNlIiwiciIsIl9zZXRUaW1lb3V0Il0sInNvdXJjZXMiOlsiLi4vc3JjL3JlcXVlc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCB7IER1cGxleCwgUmVhZGFibGUsIFdyaXRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCBmZXRjaCwgeyBSZXNwb25zZSwgUmVxdWVzdEluaXQsIEZldGNoRXJyb3IsIEFib3J0RXJyb3IgfSBmcm9tICdub2RlLWZldGNoJztcbmltcG9ydCBjcmVhdGVIdHRwc1Byb3h5QWdlbnQgZnJvbSAnaHR0cHMtcHJveHktYWdlbnQnO1xuaW1wb3J0IHtcbiAgY3JlYXRlSHR0cFJlcXVlc3RIYW5kbGVyU3RyZWFtcyxcbiAgZXhlY3V0ZVdpdGhUaW1lb3V0LFxuICBpc1JlZGlyZWN0LFxuICBwZXJmb3JtUmVkaXJlY3RSZXF1ZXN0LFxufSBmcm9tICcuL3JlcXVlc3QtaGVscGVyJztcbmltcG9ydCB7IEh0dHBSZXF1ZXN0LCBIdHRwUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vdXRpbC9sb2dnZXInO1xuaW1wb3J0IGlzIGZyb20gJ0BzaW5kcmVzb3JodXMvaXMnO1xuXG4vKipcbiAqXG4gKi9cbmxldCBkZWZhdWx0czogSHR0cFJlcXVlc3RPcHRpb25zID0ge307XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRzKGRlZmF1bHRzXzogSHR0cFJlcXVlc3RPcHRpb25zKSB7XG4gIGRlZmF1bHRzID0gZGVmYXVsdHNfO1xufVxuXG4vKipcbiAqXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0RmV0Y2hSZXF1ZXN0KFxuICByZXF1ZXN0OiBIdHRwUmVxdWVzdCxcbiAgb3B0aW9uczogSHR0cFJlcXVlc3RPcHRpb25zLFxuICBpbnB1dDogUmVhZGFibGUgfCB1bmRlZmluZWQsXG4gIG91dHB1dDogV3JpdGFibGUsXG4gIGVtaXR0ZXI6IEV2ZW50RW1pdHRlcixcbiAgY291bnRlcjogbnVtYmVyID0gMCxcbikge1xuICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoJ2ZldGNoJyk7XG4gIGNvbnN0IHsgaHR0cFByb3h5LCBmb2xsb3dSZWRpcmVjdCB9ID0gb3B0aW9ucztcbiAgY29uc3QgYWdlbnQgPSBodHRwUHJveHkgPyBjcmVhdGVIdHRwc1Byb3h5QWdlbnQoaHR0cFByb3h5KSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgeyB1cmwsIGJvZHksIC4uLnJyZXF1ZXN0IH0gPSByZXF1ZXN0O1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGxldCByZXRyeUNvdW50ID0gMDtcbiAgbGV0IHJldHJ5NDIwQ291bnQgPSAwO1xuXG4gIGNvbnN0IHJldHJ5T3B0czogUmVxdWlyZWQ8SHR0cFJlcXVlc3RPcHRpb25zWydyZXRyeSddPiA9IHtcbiAgICBzdGF0dXNDb2Rlczogb3B0aW9ucy5yZXRyeT8uc3RhdHVzQ29kZXMgPz8gWzQyMCwgNDI5LCA1MDAsIDUwMiwgNTAzLCA1MDRdLFxuICAgIG1heFJldHJpZXM6IG9wdGlvbnMucmV0cnk/Lm1heFJldHJpZXMgPz8gNSxcbiAgICBtaW5UaW1lb3V0OiBvcHRpb25zLnJldHJ5Py5taW5UaW1lb3V0ID8/IDUwMCxcbiAgICB0aW1lb3V0RmFjdG9yOiBvcHRpb25zLnJldHJ5Py50aW1lb3V0RmFjdG9yID8/IDIsXG4gICAgZXJyb3JDb2Rlczogb3B0aW9ucy5yZXRyeT8uZXJyb3JDb2RlcyA/PyBbXG4gICAgICAnRUNPTk5SRVNFVCcsXG4gICAgICAnRUNPTk5SRUZVU0VEJyxcbiAgICAgICdFTk9URk9VTkQnLFxuICAgICAgJ0VORVRET1dOJyxcbiAgICAgICdFTkVUVU5SRUFDSCcsXG4gICAgICAnRUhPU1RET1dOJyxcbiAgICAgICdVTkRfRVJSX1NPQ0tFVCcsXG4gICAgICAnRVRJTUVET1VUJyxcbiAgICAgICdFUElQRScsXG4gICAgXSxcbiAgICBtZXRob2RzOiBvcHRpb25zLnJldHJ5Py5tZXRob2RzID8/IFtcbiAgICAgICdHRVQnLFxuICAgICAgJ1BVVCcsXG4gICAgICAnSEVBRCcsXG4gICAgICAnT1BUSU9OUycsXG4gICAgICAnREVMRVRFJyxcbiAgICBdLFxuICB9O1xuXG4gIGNvbnN0IHNob3VsZFJldHJ5UmVxdWVzdCA9IChcbiAgICBtYXhSZXRyeTogbnVtYmVyLFxuICAgIHJlc09yRXJyOiBSZXNwb25zZSB8IEVycm9yIHwgRmV0Y2hFcnJvcixcbiAgKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCFyZXRyeU9wdHMubWV0aG9kcy5pbmNsdWRlcyhyZXF1ZXN0Lm1ldGhvZCkpIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChyZXNPckVyciBpbnN0YW5jZW9mIFJlc3BvbnNlKSB7XG4gICAgICAvLyBSRVNUIEFQSSBzdGF0dXMgY29kZXM6IGh0dHBzOi8vZGV2ZWxvcGVyLnNhbGVzZm9yY2UuY29tL2RvY3MvYXRsYXMuZW4tdXMuYXBpX3Jlc3QubWV0YS9hcGlfcmVzdC9lcnJvcmNvZGVzLmh0bVxuICAgICAgLy9cbiAgICAgIC8vIERlbGV0ZWQvZXhwaXJlZCBzY3JhdGNoIG9yZ3MgcmV0dXJuIDQyMCBhbmQgY2F1c2VzIGEgbG9uZyBkZWxheSBvbiBhbGwgcmVxdWVzdHMgZHVlIHRvIHRoZSByZXRyeSB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYuXG4gICAgICAvLyBXZSBzdGlsbCB3YW50IHRvIHJldHJ5IG9uIDQyMCAoTWV0YWRhdGEgQVBJIHJlcXVlc3RzIHNvbWV0aW1lcyByZXR1cm4gaXQpIHNvIGhlcmUgd2UnbGwgbGltaXQgdG8gYSBtYXhpbXVtIG9mIDIgcmV0cmllcy5cbiAgICAgIGlmIChyZXNPckVyci5zdGF0dXMgPT09IDQyMCkge1xuICAgICAgICByZXR1cm4gcmV0cnk0MjBDb3VudCA8IDI7XG4gICAgICB9IGVsc2UgaWYgKHJldHJ5T3B0cy5zdGF0dXNDb2Rlcy5pbmNsdWRlcyhyZXNPckVyci5zdGF0dXMpKSB7XG4gICAgICAgIGlmIChtYXhSZXRyeSA9PT0gcmV0cnlDb3VudCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChtYXhSZXRyeSA9PT0gcmV0cnlDb3VudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBvbmx5IHJldHJ5IG9uIG9wZXJhdGlvbmFsIGVycm9yc1xuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGUtZmV0Y2gvbm9kZS1mZXRjaC9ibG9iLzIueC9FUlJPUi1IQU5ETElORy5tZCNlcnJvci1oYW5kbGluZy13aXRoLW5vZGUtZmV0Y2hcbiAgICAgIGlmIChyZXNPckVyci5uYW1lICE9ICdGZXRjaEVycm9yJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBpZiAoaXMubm9kZVN0cmVhbShib2R5KSAmJiBSZWFkYWJsZS5pc0Rpc3R1cmJlZChib2R5KSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ0JvZHkgb2YgdHlwZSBzdHJlYW0gd2FzIHJlYWQsIHVuYWJsZSB0byByZXRyeSByZXF1ZXN0LicpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgJ2NvZGUnIGluIHJlc09yRXJyICYmXG4gICAgICAgIHJlc09yRXJyLmNvZGUgJiZcbiAgICAgICAgcmV0cnlPcHRzPy5lcnJvckNvZGVzPy5pbmNsdWRlcyhyZXNPckVyci5jb2RlKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBmZXRjaFdpdGhSZXRyaWVzID0gYXN5bmMgKFxuICAgIG1heFJldHJ5ID0gcmV0cnlPcHRzPy5tYXhSZXRyaWVzLFxuICApOiBQcm9taXNlPFJlc3BvbnNlPiA9PiB7XG4gICAgY29uc3QgZmV0Y2hPcHRzOiBSZXF1ZXN0SW5pdCA9IHtcbiAgICAgIC4uLnJyZXF1ZXN0LFxuICAgICAgLi4uKGlucHV0ICYmIC9eKHBvc3R8cHV0fHBhdGNoKSQvaS50ZXN0KHJlcXVlc3QubWV0aG9kKVxuICAgICAgICA/IHsgYm9keTogaW5wdXQgfVxuICAgICAgICA6IHt9KSxcbiAgICAgIHJlZGlyZWN0OiAnbWFudWFsJyxcbiAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgICBhZ2VudCxcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgZmV0Y2hPcHRzKTtcbiAgICAgIGlmIChzaG91bGRSZXRyeVJlcXVlc3QocmV0cnlPcHRzLm1heFJldHJpZXMsIHJlcykpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGByZXRyeWluZyBmb3IgdGhlICR7cmV0cnlDb3VudCArIDF9IHRpbWVgKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdyZWFzb246IHN0YXR1c0NvZGUgbWF0Y2gnKTtcblxuICAgICAgICBhd2FpdCBzbGVlcChcbiAgICAgICAgICByZXRyeUNvdW50ID09PSAwXG4gICAgICAgICAgICA/IHJldHJ5T3B0cy5taW5UaW1lb3V0XG4gICAgICAgICAgICA6IHJldHJ5T3B0cy5taW5UaW1lb3V0ICogcmV0cnlPcHRzLnRpbWVvdXRGYWN0b3IgKiogcmV0cnlDb3VudCxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBOT1RFOiB0aGlzIGV2ZW50IGlzIG9ubHkgdXNlZCBieSB0ZXN0cyBhbmQgd2lsbCBiZSByZW1vdmVkIGF0IGFueSB0aW1lLlxuICAgICAgICAvLyBqc2ZvcmNlIG1heSBzd2l0Y2ggdG8gbm9kZSdzIGZldGNoIHdoaWNoIGRvZXNuJ3QgZW1pdCB0aGlzIGV2ZW50IG9uIHJldHJpZXMuXG4gICAgICAgIGVtaXR0ZXIuZW1pdCgncmV0cnknLCByZXRyeUNvdW50KTtcbiAgICAgICAgcmV0cnlDb3VudCsrO1xuICAgICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDIwKSB7XG4gICAgICAgICAgcmV0cnk0MjBDb3VudCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IGZldGNoV2l0aFJldHJpZXMobWF4UmV0cnkpO1xuICAgICAgfVxuICAgICAgLy8gc2hvdWxkIHdlIHRocm93IGhlcmUgaWYgdGhlIG1heFJldHJ5IGFscmVhZHkgaGFwcGVuZWQgYW5kIHN0aWxsIGdvdCB0aGUgc2FtZSBzdGF0dXNDb2RlP1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnUmVxdWVzdCBmYWlsZWQnKTtcbiAgICAgIGNvbnN0IGVycm9yID0gZXJyIGFzIEVycm9yIHwgRmV0Y2hFcnJvcjtcblxuICAgICAgLy8gcmVxdWVzdCB3YXMgY2FuY2VsZWQgYnkgY29uc3VtZXIgKEFib3J0Q29udHJvbGxlciksIHNraXAgcmV0cnkgYW5kIHJldGhyb3cuXG4gICAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkUmV0cnlSZXF1ZXN0KHJldHJ5T3B0cy5tYXhSZXRyaWVzLCBlcnJvcikpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGByZXRyeWluZyBmb3IgdGhlICR7cmV0cnlDb3VudCArIDF9IHRpbWVgKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBFcnJvcjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXG4gICAgICAgIGF3YWl0IHNsZWVwKFxuICAgICAgICAgIHJldHJ5Q291bnQgPT09IDBcbiAgICAgICAgICAgID8gcmV0cnlPcHRzLm1pblRpbWVvdXRcbiAgICAgICAgICAgIDogcmV0cnlPcHRzLm1pblRpbWVvdXQgKiByZXRyeU9wdHMudGltZW91dEZhY3RvciAqKiByZXRyeUNvdW50LFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIE5PVEU6IHRoaXMgZXZlbnQgaXMgb25seSB1c2VkIGJ5IHRlc3RzIGFuZCB3aWxsIGJlIHJlbW92ZWQgYXQgYW55IHRpbWUuXG4gICAgICAgIC8vIGpzZm9yY2UgbWF5IHN3aXRjaCB0byBub2RlJ3MgZmV0Y2ggd2hpY2ggZG9lc24ndCBlbWl0IHRoaXMgZXZlbnQgb24gcmV0cmllcy5cbiAgICAgICAgZW1pdHRlci5lbWl0KCdyZXRyeScsIHJldHJ5Q291bnQpO1xuICAgICAgICByZXRyeUNvdW50Kys7XG5cbiAgICAgICAgcmV0dXJuIGZldGNoV2l0aFJldHJpZXMobWF4UmV0cnkpO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuZGVidWcoJ1NraXBwaW5nIHJldHJ5Li4uJyk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9O1xuXG4gIGxldCByZXM6IFJlc3BvbnNlO1xuXG4gIC8vIFRpbWVvdXQgYWZ0ZXIgMzAgbWludXRlcyB3aXRob3V0IGEgcmVzcG9uc2VcbiAgLy9cbiAgLy8gbm9kZS1mZXRjaCdzIGRlZmF1bHQgdGltZW91dCBpcyAwIGFuZCBqc2ZvcmNlIGNvbnN1bWVycyBjYW4ndCBzZXQgdGhpcyB3aGVuIGNhbGxpbmcgYENvbm5lY3Rpb25gIG1ldGhvZHMgc28gd2Ugc2V0IGEgbG9uZyBkZWZhdWx0IGF0IHRoZSBmZXRjaCB3cmFwcGVyIGxldmVsLlxuICBjb25zdCBmZXRjaFRpbWVvdXQgPSBvcHRpb25zLnRpbWVvdXQgPz8gMV84MDBfMDAwO1xuXG4gIHRyeSB7XG4gICAgcmVzID0gYXdhaXQgZXhlY3V0ZVdpdGhUaW1lb3V0KGZldGNoV2l0aFJldHJpZXMsIGZldGNoVGltZW91dCwgKCkgPT5cbiAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKSxcbiAgICApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgQWJvcnRFcnJvcikge1xuICAgICAgKGVyciBhcyBFcnJvcikubWVzc2FnZSArPSAnIFJlcXVlc3Qgd2FzIGFib3J0ZWQgZHVlIHRvIHRpbWVvdXQgb2YgMTAgbWludXRlcy4nO1xuICAgIH1cbiAgICBlbWl0dGVyLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgaGVhZGVyczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBmb3IgKGNvbnN0IGhlYWRlck5hbWUgb2YgcmVzLmhlYWRlcnMua2V5cygpKSB7XG4gICAgaGVhZGVyc1toZWFkZXJOYW1lLnRvTG93ZXJDYXNlKCldID0gcmVzLmhlYWRlcnMuZ2V0KGhlYWRlck5hbWUpO1xuICB9XG4gIGNvbnN0IHJlc3BvbnNlID0ge1xuICAgIHN0YXR1c0NvZGU6IHJlcy5zdGF0dXMsXG4gICAgaGVhZGVycyxcbiAgfTtcbiAgaWYgKGZvbGxvd1JlZGlyZWN0ICYmIGlzUmVkaXJlY3QocmVzcG9uc2Uuc3RhdHVzQ29kZSkpIHtcbiAgICB0cnkge1xuICAgICAgcGVyZm9ybVJlZGlyZWN0UmVxdWVzdChcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgIGZvbGxvd1JlZGlyZWN0LFxuICAgICAgICBjb3VudGVyLFxuICAgICAgICAocmVxKSA9PlxuICAgICAgICAgIHN0YXJ0RmV0Y2hSZXF1ZXN0KFxuICAgICAgICAgICAgcmVxLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG91dHB1dCxcbiAgICAgICAgICAgIGVtaXR0ZXIsXG4gICAgICAgICAgICBjb3VudGVyICsgMSxcbiAgICAgICAgICApLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGVtaXR0ZXIuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgZW1pdHRlci5lbWl0KCdyZXNwb25zZScsIHJlc3BvbnNlKTtcbiAgcmVzLmJvZHkucGlwZShvdXRwdXQpO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlcXVlc3QoXG4gIHJlcTogSHR0cFJlcXVlc3QsXG4gIG9wdGlvbnNfOiBIdHRwUmVxdWVzdE9wdGlvbnMgPSB7fSxcbik6IER1cGxleCB7XG4gIGNvbnN0IG9wdGlvbnMgPSB7IC4uLmRlZmF1bHRzLCAuLi5vcHRpb25zXyB9O1xuICBjb25zdCB7IGlucHV0LCBvdXRwdXQsIHN0cmVhbSB9ID0gY3JlYXRlSHR0cFJlcXVlc3RIYW5kbGVyU3RyZWFtcyhcbiAgICByZXEsXG4gICAgb3B0aW9ucyxcbiAgKTtcbiAgc3RhcnRGZXRjaFJlcXVlc3QocmVxLCBvcHRpb25zLCBpbnB1dCwgb3V0cHV0LCBzdHJlYW0pO1xuICByZXR1cm4gc3RyZWFtO1xufVxuXG5jb25zdCBzbGVlcCA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBtcykpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsU0FBaUJBLFFBQVEsUUFBa0IsUUFBUTtBQUNuRCxPQUFPQyxLQUFLLElBQUlDLFFBQVEsRUFBMkJDLFVBQVUsUUFBUSxZQUFZO0FBQ2pGLE9BQU9DLHFCQUFxQixNQUFNLG1CQUFtQjtBQUNyRCxTQUNFQywrQkFBK0IsRUFDL0JDLGtCQUFrQixFQUNsQkMsVUFBVSxFQUNWQyxzQkFBc0IsUUFDakIsa0JBQWtCO0FBRXpCLFNBQVNDLFNBQVMsUUFBUSxlQUFlO0FBQ3pDLE9BQU9DLEVBQUUsTUFBTSxrQkFBa0I7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBLElBQUlDLFFBQTRCLEdBQUcsQ0FBQyxDQUFDOztBQUVyQztBQUNBO0FBQ0E7QUFDQSxPQUFPLFNBQVNDLFdBQVdBLENBQUNDLFNBQTZCLEVBQUU7RUFDekRGLFFBQVEsR0FBR0UsU0FBUztBQUN0Qjs7QUFFQTtBQUNBO0FBQ0E7QUFGQSxTQUdlQyxpQkFBaUJBLENBQUFDLEVBQUEsRUFBQUMsR0FBQSxFQUFBQyxHQUFBLEVBQUFDLEdBQUEsRUFBQUMsR0FBQTtFQUFBLE9BQUFD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