UNPKG

jsforce

Version:

Salesforce API Library for JavaScript

381 lines (371 loc) 39.7 kB
import _asyncToGenerator from "@babel/runtime-corejs3/helpers/asyncToGenerator"; import _classCallCheck from "@babel/runtime-corejs3/helpers/classCallCheck"; import _createClass from "@babel/runtime-corejs3/helpers/createClass"; import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty"; import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/objectWithoutProperties"; var _excluded = ["type", "attributes"]; import _regeneratorRuntime from "@babel/runtime-corejs3/regenerator"; 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 _context12, _context13; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context12 = ownKeys(Object(t), !0)).call(_context12, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context13 = ownKeys(Object(t))).call(_context13, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; } 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 _context11; if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = _sliceInstanceProperty(_context11 = {}.toString.call(r)).call(_context11, 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 "core-js/modules/es.error.cause.js"; import "core-js/modules/es.array.push.js"; import "core-js/modules/es.function.name.js"; import "core-js/modules/es.object.to-string.js"; import "core-js/modules/es.regexp.exec.js"; import "core-js/modules/es.regexp.test.js"; import "core-js/modules/es.regexp.to-string.js"; import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map"; import _Array$isArray from "@babel/runtime-corejs3/core-js-stable/array/is-array"; import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter"; import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys"; import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat"; 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 _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols"; 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"; /** * @file Salesforce SOAP API * @author Shinichi Tomita <shinichi.tomita@gmail.com> */ import { registerModule } from '../jsforce'; import SOAP from '../soap'; import { ApiSchemas } from './soap/schema'; /** * */ function toSoapRecord(records) { var _context; return _mapInstanceProperty(_context = _Array$isArray(records) ? records : [records]).call(_context, function (record) { var _context2; var type = record.type, attributes = record.attributes, rec = _objectWithoutProperties(record, _excluded); var t = type || (attributes === null || attributes === void 0 ? void 0 : attributes.type); if (!t) { throw new Error('Given record is not including sObject type information'); } var fieldsToNull = _filterInstanceProperty(_context2 = _Object$keys(rec)).call(_context2, function (field) { return record[field] === null; }); var _iterator = _createForOfIteratorHelper(fieldsToNull), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var field = _step.value; delete rec[field]; } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return fieldsToNull.length > 0 ? _objectSpread({ type: t, fieldsToNull: fieldsToNull }, rec) : _objectSpread({ type: t }, rec); }); } /** * API class for Partner SOAP call */ export var SoapApi = /*#__PURE__*/function () { function SoapApi(conn) { _classCallCheck(this, SoapApi); this._conn = conn; } /** * Call SOAP Api (Partner) endpoint * @private */ return _createClass(SoapApi, [{ key: "_invoke", value: (function () { var _invoke2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(method, message, schema) { var _context3; var soapEndpoint, res; return _regeneratorRuntime.wrap(function _callee$(_context4) { while (1) switch (_context4.prev = _context4.next) { case 0: soapEndpoint = new SOAP(this._conn, { xmlns: 'urn:partner.soap.sforce.com', endpointUrl: _concatInstanceProperty(_context3 = "".concat(this._conn.instanceUrl, "/services/Soap/u/")).call(_context3, this._conn.version) }); _context4.next = 3; return soapEndpoint.invoke(method, message, schema ? { result: schema } : undefined, ApiSchemas); case 3: res = _context4.sent; return _context4.abrupt("return", res.result); case 5: case "end": return _context4.stop(); } }, _callee, this); })); function _invoke(_x, _x2, _x3) { return _invoke2.apply(this, arguments); } return _invoke; }() /** * Converts a Lead into an Account, Contact, or (optionally) an Opportunity. */ ) }, { key: "convertLead", value: function () { var _convertLead = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(leadConverts) { var schema; return _regeneratorRuntime.wrap(function _callee2$(_context5) { while (1) switch (_context5.prev = _context5.next) { case 0: schema = _Array$isArray(leadConverts) ? [ApiSchemas.LeadConvertResult] : ApiSchemas.LeadConvertResult; return _context5.abrupt("return", this._invoke('convertLead', { leadConverts: leadConverts }, schema)); case 2: case "end": return _context5.stop(); } }, _callee2, this); })); function convertLead(_x4) { return _convertLead.apply(this, arguments); } return convertLead; }() /** * Merge up to three records into one */ }, { key: "merge", value: function () { var _merge = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(mergeRequests) { var schema; return _regeneratorRuntime.wrap(function _callee3$(_context6) { while (1) switch (_context6.prev = _context6.next) { case 0: schema = _Array$isArray(mergeRequests) ? [ApiSchemas.MergeResult] : ApiSchemas.MergeResult; return _context6.abrupt("return", this._invoke('merge', { mergeRequests: mergeRequests }, schema)); case 2: case "end": return _context6.stop(); } }, _callee3, this); })); function merge(_x5) { return _merge.apply(this, arguments); } return merge; }() /** * Delete records from the recycle bin immediately */ }, { key: "emptyRecycleBin", value: (function () { var _emptyRecycleBin = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(ids) { return _regeneratorRuntime.wrap(function _callee4$(_context7) { while (1) switch (_context7.prev = _context7.next) { case 0: return _context7.abrupt("return", this._invoke('emptyRecycleBin', { ids: ids }, [ApiSchemas.EmptyRecycleBinResult])); case 1: case "end": return _context7.stop(); } }, _callee4, this); })); function emptyRecycleBin(_x6) { return _emptyRecycleBin.apply(this, arguments); } return emptyRecycleBin; }() /** * Returns information about the standard and custom apps available to the logged-in user */ ) }, { key: "describeTabs", value: (function () { var _describeTabs = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5() { return _regeneratorRuntime.wrap(function _callee5$(_context8) { while (1) switch (_context8.prev = _context8.next) { case 0: return _context8.abrupt("return", this._invoke('describeTabs', {}, [ApiSchemas.DescribeTabSetResult])); case 1: case "end": return _context8.stop(); } }, _callee5, this); })); function describeTabs() { return _describeTabs.apply(this, arguments); } return describeTabs; }() /** * Retrieves the current system timestamp (Coordinated Universal Time (UTC) time zone) from the API */ ) }, { key: "getServerTimestamp", value: (function () { var _getServerTimestamp = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee6() { return _regeneratorRuntime.wrap(function _callee6$(_context9) { while (1) switch (_context9.prev = _context9.next) { case 0: return _context9.abrupt("return", this._invoke('getServerTimestamp', {}, ApiSchemas.GetServerTimestampResult)); case 1: case "end": return _context9.stop(); } }, _callee6, this); })); function getServerTimestamp() { return _getServerTimestamp.apply(this, arguments); } return getServerTimestamp; }() /** * Retrieves personal information for the user associated with the current session */ ) }, { key: "getUserInfo", value: (function () { var _getUserInfo = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee7() { return _regeneratorRuntime.wrap(function _callee7$(_context10) { while (1) switch (_context10.prev = _context10.next) { case 0: return _context10.abrupt("return", this._invoke('getUserInfo', {}, ApiSchemas.GetUserInfoResult)); case 1: case "end": return _context10.stop(); } }, _callee7, this); })); function getUserInfo() { return _getUserInfo.apply(this, arguments); } return getUserInfo; }() /** * Sets the specified user’s password to the specified value */ ) }, { key: "setPassword", value: function setPassword(userId, password) { return this._invoke('setPassword', { userId: userId, password: password }, 'string'); } /** * Resets the specified user’s password */ }, { key: "resetPassword", value: function resetPassword(userId) { return this._invoke('resetPassword', { userId: userId }, ApiSchemas.ResetPasswordResult); } /** * Adds one or more new records to your organization’s data */ }, { key: "create", value: function create(sObjects) { var schema = _Array$isArray(sObjects) ? [ApiSchemas.SaveResult] : ApiSchemas.SaveResult; var args = { '@xmlns': 'urn:partner.soap.sforce.com', '@xmlns:ns1': 'sobject.partner.soap.sforce.com', 'ns1:sObjects': toSoapRecord(sObjects) }; return this._invoke('create', args, schema); } /** * Updates one or more existing records in your organization’s data. */ }, { key: "update", value: function update(sObjects) { var schema = _Array$isArray(sObjects) ? [ApiSchemas.SaveResult] : ApiSchemas.SaveResult; var args = { '@xmlns': 'urn:partner.soap.sforce.com', '@xmlns:ns1': 'sobject.partner.soap.sforce.com', 'ns1:sObjects': toSoapRecord(sObjects) }; return this._invoke('update', args, schema); } /** * Creates new records and updates existing records in your organization’s data. */ }, { key: "upsert", value: function upsert(externalIdFieldName, sObjects) { var schema = _Array$isArray(sObjects) ? [ApiSchemas.UpsertResult] : ApiSchemas.UpsertResult; var args = { '@xmlns': 'urn:partner.soap.sforce.com', '@xmlns:ns1': 'sobject.partner.soap.sforce.com', 'ns1:externalIDFieldName': externalIdFieldName, 'ns1:sObjects': toSoapRecord(sObjects) }; return this._invoke('upsert', args, schema); } /** * Deletes one or more records from your organization’s data */ }, { key: "delete", value: function _delete(ids) { var schema = _Array$isArray(ids) ? [ApiSchemas.DeleteResult] : ApiSchemas.DeleteResult; var args = { '@xmlns': 'urn:partner.soap.sforce.com', '@xmlns:ns1': 'sobject.partner.soap.sforce.com', 'ns1:ids': ids }; return this._invoke('delete', args, schema); } /** * Undelete records from the recycle bin immediately */ }, { key: "undelete", value: function undelete(ids) { var schema = [ApiSchemas.UndeleteResult]; var args = { '@xmlns': 'urn:partner.soap.sforce.com', '@xmlns:ns1': 'sobject.partner.soap.sforce.com', 'ns1:ids': ids }; return this._invoke('undelete', args, schema); } }]); }(); /*--------------------------------------------*/ /* * Register hook in connection instantiation for dynamically adding this API module features */ registerModule('soap', function (conn) { return new SoapApi(conn); }); export default SoapApi; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZWdpc3Rlck1vZHVsZSIsIlNPQVAiLCJBcGlTY2hlbWFzIiwidG9Tb2FwUmVjb3JkIiwicmVjb3JkcyIsIl9jb250ZXh0IiwiX21hcEluc3RhbmNlUHJvcGVydHkiLCJfQXJyYXkkaXNBcnJheSIsImNhbGwiLCJyZWNvcmQiLCJfY29udGV4dDIiLCJ0eXBlIiwiYXR0cmlidXRlcyIsInJlYyIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllcyIsIl9leGNsdWRlZCIsInQiLCJFcnJvciIsImZpZWxkc1RvTnVsbCIsIl9maWx0ZXJJbnN0YW5jZVByb3BlcnR5IiwiX09iamVjdCRrZXlzIiwiZmllbGQiLCJfaXRlcmF0b3IiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9zdGVwIiwicyIsIm4iLCJkb25lIiwidmFsdWUiLCJlcnIiLCJlIiwiZiIsImxlbmd0aCIsIl9vYmplY3RTcHJlYWQiLCJTb2FwQXBpIiwiY29ubiIsIl9jbGFzc0NhbGxDaGVjayIsIl9jb25uIiwiX2NyZWF0ZUNsYXNzIiwia2V5IiwiX2ludm9rZTIiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZSIsIm1ldGhvZCIsIm1lc3NhZ2UiLCJzY2hlbWEiLCJfY29udGV4dDMiLCJzb2FwRW5kcG9pbnQiLCJyZXMiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dDQiLCJwcmV2IiwibmV4dCIsInhtbG5zIiwiZW5kcG9pbnRVcmwiLCJfY29uY2F0SW5zdGFuY2VQcm9wZXJ0eSIsImNvbmNhdCIsImluc3RhbmNlVXJsIiwidmVyc2lvbiIsImludm9rZSIsInJlc3VsdCIsInVuZGVmaW5lZCIsInNlbnQiLCJhYnJ1cHQiLCJzdG9wIiwiX2ludm9rZSIsIl94IiwiX3gyIiwiX3gzIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfY29udmVydExlYWQiLCJfY2FsbGVlMiIsImxlYWRDb252ZXJ0cyIsIl9jYWxsZWUyJCIsIl9jb250ZXh0NSIsIkxlYWRDb252ZXJ0UmVzdWx0IiwiY29udmVydExlYWQiLCJfeDQiLCJfbWVyZ2UiLCJfY2FsbGVlMyIsIm1lcmdlUmVxdWVzdHMiLCJfY2FsbGVlMyQiLCJfY29udGV4dDYiLCJNZXJnZVJlc3VsdCIsIm1lcmdlIiwiX3g1IiwiX2VtcHR5UmVjeWNsZUJpbiIsIl9jYWxsZWU0IiwiaWRzIiwiX2NhbGxlZTQkIiwiX2NvbnRleHQ3IiwiRW1wdHlSZWN5Y2xlQmluUmVzdWx0IiwiZW1wdHlSZWN5Y2xlQmluIiwiX3g2IiwiX2Rlc2NyaWJlVGFicyIsIl9jYWxsZWU1IiwiX2NhbGxlZTUkIiwiX2NvbnRleHQ4IiwiRGVzY3JpYmVUYWJTZXRSZXN1bHQiLCJkZXNjcmliZVRhYnMiLCJfZ2V0U2VydmVyVGltZXN0YW1wIiwiX2NhbGxlZTYiLCJfY2FsbGVlNiQiLCJfY29udGV4dDkiLCJHZXRTZXJ2ZXJUaW1lc3RhbXBSZXN1bHQiLCJnZXRTZXJ2ZXJUaW1lc3RhbXAiLCJfZ2V0VXNlckluZm8iLCJfY2FsbGVlNyIsIl9jYWxsZWU3JCIsIl9jb250ZXh0MTAiLCJHZXRVc2VySW5mb1Jlc3VsdCIsImdldFVzZXJJbmZvIiwic2V0UGFzc3dvcmQiLCJ1c2VySWQiLCJwYXNzd29yZCIsInJlc2V0UGFzc3dvcmQiLCJSZXNldFBhc3N3b3JkUmVzdWx0IiwiY3JlYXRlIiwic09iamVjdHMiLCJTYXZlUmVzdWx0IiwiYXJncyIsInVwZGF0ZSIsInVwc2VydCIsImV4dGVybmFsSWRGaWVsZE5hbWUiLCJVcHNlcnRSZXN1bHQiLCJkZWxldGUiLCJEZWxldGVSZXN1bHQiLCJ1bmRlbGV0ZSIsIlVuZGVsZXRlUmVzdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zb2FwLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgU2FsZXNmb3JjZSBTT0FQIEFQSVxuICogQGF1dGhvciBTaGluaWNoaSBUb21pdGEgPHNoaW5pY2hpLnRvbWl0YUBnbWFpbC5jb20+XG4gKi9cbmltcG9ydCB7IHJlZ2lzdGVyTW9kdWxlIH0gZnJvbSAnLi4vanNmb3JjZSc7XG5pbXBvcnQgQ29ubmVjdGlvbiBmcm9tICcuLi9jb25uZWN0aW9uJztcbmltcG9ydCBTT0FQIGZyb20gJy4uL3NvYXAnO1xuaW1wb3J0IHsgU2NoZW1hLCBSZWNvcmQsIFNvYXBTY2hlbWFEZWYsIFNvYXBTY2hlbWEgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge1xuICBBcGlTY2hlbWFzLFxuICBMZWFkQ29udmVydCxcbiAgTGVhZENvbnZlcnRSZXN1bHQsXG4gIE1lcmdlUmVxdWVzdCxcbiAgTWVyZ2VSZXN1bHQsXG4gIEVtcHR5UmVjeWNsZUJpblJlc3VsdCxcbiAgVW5kZWxldGVSZXN1bHQsXG4gIERlc2NyaWJlVGFiU2V0UmVzdWx0LFxuICBHZXRTZXJ2ZXJUaW1lc3RhbXBSZXN1bHQsXG4gIEdldFVzZXJJbmZvUmVzdWx0LFxuICBSZXNldFBhc3N3b3JkUmVzdWx0LFxuICBTYXZlUmVzdWx0LFxuICBVcHNlcnRSZXN1bHQsXG4gIERlbGV0ZVJlc3VsdCxcbn0gZnJvbSAnLi9zb2FwL3NjaGVtYSc7XG5cbi8qKlxuICpcbiAqL1xuZnVuY3Rpb24gdG9Tb2FwUmVjb3JkKHJlY29yZHM6IFJlY29yZCB8IFJlY29yZFtdKTogUmVjb3JkIHwgUmVjb3JkW10ge1xuICByZXR1cm4gKEFycmF5LmlzQXJyYXkocmVjb3JkcykgPyByZWNvcmRzIDogW3JlY29yZHNdKS5tYXAoKHJlY29yZCkgPT4ge1xuICAgIGNvbnN0IHsgdHlwZSwgYXR0cmlidXRlcywgLi4ucmVjIH0gPSByZWNvcmQ7XG4gICAgY29uc3QgdCA9IHR5cGUgfHwgYXR0cmlidXRlcz8udHlwZTtcbiAgICBpZiAoIXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2l2ZW4gcmVjb3JkIGlzIG5vdCBpbmNsdWRpbmcgc09iamVjdCB0eXBlIGluZm9ybWF0aW9uJyk7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkc1RvTnVsbCA9IE9iamVjdC5rZXlzKHJlYykuZmlsdGVyKFxuICAgICAgKGZpZWxkKSA9PiByZWNvcmRbZmllbGRdID09PSBudWxsLFxuICAgICk7XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHNUb051bGwpIHtcbiAgICAgIGRlbGV0ZSByZWNbZmllbGRdO1xuICAgIH1cbiAgICByZXR1cm4gZmllbGRzVG9OdWxsLmxlbmd0aCA+IDBcbiAgICAgID8geyB0eXBlOiB0LCBmaWVsZHNUb051bGwsIC4uLnJlYyB9XG4gICAgICA6IHsgdHlwZTogdCwgLi4ucmVjIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIEFQSSBjbGFzcyBmb3IgUGFydG5lciBTT0FQIGNhbGxcbiAqL1xuZXhwb3J0IGNsYXNzIFNvYXBBcGk8UyBleHRlbmRzIFNjaGVtYT4ge1xuICBfY29ubjogQ29ubmVjdGlvbjxTPjtcblxuICBjb25zdHJ1Y3Rvcihjb25uOiBDb25uZWN0aW9uPFM+KSB7XG4gICAgdGhpcy5fY29ubiA9IGNvbm47XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCBTT0FQIEFwaSAoUGFydG5lcikgZW5kcG9pbnRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGFzeW5jIF9pbnZva2UoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgbWVzc2FnZTogb2JqZWN0LFxuICAgIHNjaGVtYTogU29hcFNjaGVtYSB8IFNvYXBTY2hlbWFEZWYsXG4gICkge1xuICAgIGNvbnN0IHNvYXBFbmRwb2ludCA9IG5ldyBTT0FQKHRoaXMuX2Nvbm4sIHtcbiAgICAgIHhtbG5zOiAndXJuOnBhcnRuZXIuc29hcC5zZm9yY2UuY29tJyxcbiAgICAgIGVuZHBvaW50VXJsOiBgJHt0aGlzLl9jb25uLmluc3RhbmNlVXJsfS9zZXJ2aWNlcy9Tb2FwL3UvJHt0aGlzLl9jb25uLnZlcnNpb259YCxcbiAgICB9KTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBzb2FwRW5kcG9pbnQuaW52b2tlKFxuICAgICAgbWV0aG9kLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHNjaGVtYSA/ICh7IHJlc3VsdDogc2NoZW1hIH0gYXMgU29hcFNjaGVtYSkgOiB1bmRlZmluZWQsXG4gICAgICBBcGlTY2hlbWFzLFxuICAgICk7XG4gICAgcmV0dXJuIHJlcy5yZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBMZWFkIGludG8gYW4gQWNjb3VudCwgQ29udGFjdCwgb3IgKG9wdGlvbmFsbHkpIGFuIE9wcG9ydHVuaXR5LlxuICAgKi9cbiAgY29udmVydExlYWQoXG4gICAgbGVhZENvbnZlcnRzOiBBcnJheTxQYXJ0aWFsPExlYWRDb252ZXJ0Pj4sXG4gICk6IFByb21pc2U8TGVhZENvbnZlcnRSZXN1bHRbXT47XG4gIGNvbnZlcnRMZWFkKGxlYWRDb252ZXJ0OiBQYXJ0aWFsPExlYWRDb252ZXJ0Pik6IFByb21pc2U8TGVhZENvbnZlcnRSZXN1bHQ+O1xuICBjb252ZXJ0TGVhZChcbiAgICBsZWFkQ29udmVydDogUGFydGlhbDxMZWFkQ29udmVydD4gfCBBcnJheTxQYXJ0aWFsPExlYWRDb252ZXJ0Pj4sXG4gICk6IFByb21pc2U8TGVhZENvbnZlcnRSZXN1bHQgfCBMZWFkQ29udmVydFJlc3VsdFtdPjtcbiAgYXN5bmMgY29udmVydExlYWQoXG4gICAgbGVhZENvbnZlcnRzOiBQYXJ0aWFsPExlYWRDb252ZXJ0PiB8IEFycmF5PFBhcnRpYWw8TGVhZENvbnZlcnQ+PixcbiAgKSB7XG4gICAgY29uc3Qgc2NoZW1hID0gQXJyYXkuaXNBcnJheShsZWFkQ29udmVydHMpXG4gICAgICA/IFtBcGlTY2hlbWFzLkxlYWRDb252ZXJ0UmVzdWx0XVxuICAgICAgOiBBcGlTY2hlbWFzLkxlYWRDb252ZXJ0UmVzdWx0O1xuICAgIHJldHVybiB0aGlzLl9pbnZva2UoJ2NvbnZlcnRMZWFkJywgeyBsZWFkQ29udmVydHMgfSwgc2NoZW1hKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZSB1cCB0byB0aHJlZSByZWNvcmRzIGludG8gb25lXG4gICAqL1xuICBtZXJnZShtZXJnZVJlcXVlc3RzOiBBcnJheTxQYXJ0aWFsPE1lcmdlUmVxdWVzdD4+KTogUHJvbWlzZTxNZXJnZVJlc3VsdFtdPjtcbiAgbWVyZ2UobWVyZ2VSZXF1ZXN0OiBQYXJ0aWFsPE1lcmdlUmVxdWVzdD4pOiBQcm9taXNlPE1lcmdlUmVzdWx0PjtcbiAgbWVyZ2UoXG4gICAgbWVyZ2VSZXF1ZXN0OiBQYXJ0aWFsPE1lcmdlUmVxdWVzdD4gfCBBcnJheTxQYXJ0aWFsPE1lcmdlUmVxdWVzdD4+LFxuICApOiBQcm9taXNlPE1lcmdlUmVzdWx0IHwgTWVyZ2VSZXN1bHRbXT47XG4gIGFzeW5jIG1lcmdlKFxuICAgIG1lcmdlUmVxdWVzdHM6IFBhcnRpYWw8TWVyZ2VSZXF1ZXN0PiB8IEFycmF5PFBhcnRpYWw8TWVyZ2VSZXF1ZXN0Pj4sXG4gICkge1xuICAgIGNvbnN0IHNjaGVtYSA9IEFycmF5LmlzQXJyYXkobWVyZ2VSZXF1ZXN0cylcbiAgICAgID8gW0FwaVNjaGVtYXMuTWVyZ2VSZXN1bHRdXG4gICAgICA6IEFwaVNjaGVtYXMuTWVyZ2VSZXN1bHQ7XG4gICAgcmV0dXJuIHRoaXMuX2ludm9rZSgnbWVyZ2UnLCB7IG1lcmdlUmVxdWVzdHMgfSwgc2NoZW1hKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgcmVjb3JkcyBmcm9tIHRoZSByZWN5Y2xlIGJpbiBpbW1lZGlhdGVseVxuICAgKi9cbiAgYXN5bmMgZW1wdHlSZWN5Y2xlQmluKGlkczogc3RyaW5nW10pOiBQcm9taXNlPEVtcHR5UmVjeWNsZUJpblJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLl9pbnZva2UoJ2VtcHR5UmVjeWNsZUJpbicsIHsgaWRzIH0sIFtcbiAgICAgIEFwaVNjaGVtYXMuRW1wdHlSZWN5Y2xlQmluUmVzdWx0LFxuICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YW5kYXJkIGFuZCBjdXN0b20gYXBwcyBhdmFpbGFibGUgdG8gdGhlIGxvZ2dlZC1pbiB1c2VyXG4gICAqL1xuICBhc3luYyBkZXNjcmliZVRhYnMoKTogUHJvbWlzZTxEZXNjcmliZVRhYlNldFJlc3VsdFtdPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ludm9rZSgnZGVzY3JpYmVUYWJzJywge30sIFtBcGlTY2hlbWFzLkRlc2NyaWJlVGFiU2V0UmVzdWx0XSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjdXJyZW50IHN5c3RlbSB0aW1lc3RhbXAgKENvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lIChVVEMpIHRpbWUgem9uZSkgZnJvbSB0aGUgQVBJXG4gICAqL1xuICBhc3luYyBnZXRTZXJ2ZXJUaW1lc3RhbXAoKTogUHJvbWlzZTxHZXRTZXJ2ZXJUaW1lc3RhbXBSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5faW52b2tlKFxuICAgICAgJ2dldFNlcnZlclRpbWVzdGFtcCcsXG4gICAgICB7fSxcbiAgICAgIEFwaVNjaGVtYXMuR2V0U2VydmVyVGltZXN0YW1wUmVzdWx0LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHBlcnNvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgdXNlciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgc2Vzc2lvblxuICAgKi9cbiAgYXN5bmMgZ2V0VXNlckluZm8oKTogUHJvbWlzZTxHZXRVc2VySW5mb1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLl9pbnZva2UoJ2dldFVzZXJJbmZvJywge30sIEFwaVNjaGVtYXMuR2V0VXNlckluZm9SZXN1bHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHNwZWNpZmllZCB1c2Vy4oCZcyBwYXNzd29yZCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlXG4gICAqL1xuICBzZXRQYXNzd29yZCh1c2VySWQ6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ludm9rZSgnc2V0UGFzc3dvcmQnLCB7IHVzZXJJZCwgcGFzc3dvcmQgfSwgJ3N0cmluZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgc3BlY2lmaWVkIHVzZXLigJlzIHBhc3N3b3JkXG4gICAqL1xuICByZXNldFBhc3N3b3JkKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxSZXNldFBhc3N3b3JkUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuX2ludm9rZShcbiAgICAgICdyZXNldFBhc3N3b3JkJyxcbiAgICAgIHsgdXNlcklkIH0sXG4gICAgICBBcGlTY2hlbWFzLlJlc2V0UGFzc3dvcmRSZXN1bHQsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIG9uZSBvciBtb3JlIG5ldyByZWNvcmRzIHRvIHlvdXIgb3JnYW5pemF0aW9u4oCZcyBkYXRhXG4gICAqL1xuICBjcmVhdGUoc09iamVjdDogUmVjb3JkW10pOiBQcm9taXNlPFNhdmVSZXN1bHRbXT47XG4gIGNyZWF0ZShzT2JqZWN0OiBSZWNvcmQpOiBQcm9taXNlPFNhdmVSZXN1bHQ+O1xuICBjcmVhdGUoc09iamVjdHM6IFJlY29yZCB8IFJlY29yZFtdKTogUHJvbWlzZTxTYXZlUmVzdWx0IHwgU2F2ZVJlc3VsdFtdPjtcbiAgY3JlYXRlKHNPYmplY3RzOiBSZWNvcmQgfCBSZWNvcmRbXSkge1xuICAgIGNvbnN0IHNjaGVtYSA9IEFycmF5LmlzQXJyYXkoc09iamVjdHMpXG4gICAgICA/IFtBcGlTY2hlbWFzLlNhdmVSZXN1bHRdXG4gICAgICA6IEFwaVNjaGVtYXMuU2F2ZVJlc3VsdDtcbiAgICBjb25zdCBhcmdzID0ge1xuICAgICAgJ0B4bWxucyc6ICd1cm46cGFydG5lci5zb2FwLnNmb3JjZS5jb20nLFxuICAgICAgJ0B4bWxuczpuczEnOiAnc29iamVjdC5wYXJ0bmVyLnNvYXAuc2ZvcmNlLmNvbScsXG4gICAgICAnbnMxOnNPYmplY3RzJzogdG9Tb2FwUmVjb3JkKHNPYmplY3RzKSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9pbnZva2UoJ2NyZWF0ZScsIGFyZ3MsIHNjaGVtYSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBvbmUgb3IgbW9yZSBleGlzdGluZyByZWNvcmRzIGluIHlvdXIgb3JnYW5pemF0aW9u4oCZcyBkYXRhLlxuICAgKi9cbiAgdXBkYXRlKHNPYmplY3Q6IFJlY29yZFtdKTogUHJvbWlzZTxTYXZlUmVzdWx0W10+O1xuICB1cGRhdGUoc09iamVjdDogUmVjb3JkKTogUHJvbWlzZTxTYXZlUmVzdWx0PjtcbiAgdXBkYXRlKHNPYmplY3RzOiBSZWNvcmQgfCBSZWNvcmRbXSk6IFByb21pc2U8U2F2ZVJlc3VsdCB8IFNhdmVSZXN1bHRbXT47XG4gIHVwZGF0ZShzT2JqZWN0czogUmVjb3JkIHwgUmVjb3JkW10pIHtcbiAgICBjb25zdCBzY2hlbWEgPSBBcnJheS5pc0FycmF5KHNPYmplY3RzKVxuICAgICAgPyBbQXBpU2NoZW1hcy5TYXZlUmVzdWx0XVxuICAgICAgOiBBcGlTY2hlbWFzLlNhdmVSZXN1bHQ7XG4gICAgY29uc3QgYXJncyA9IHtcbiAgICAgICdAeG1sbnMnOiAndXJuOnBhcnRuZXIuc29hcC5zZm9yY2UuY29tJyxcbiAgICAgICdAeG1sbnM6bnMxJzogJ3NvYmplY3QucGFydG5lci5zb2FwLnNmb3JjZS5jb20nLFxuICAgICAgJ25zMTpzT2JqZWN0cyc6IHRvU29hcFJlY29yZChzT2JqZWN0cyksXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5faW52b2tlKCd1cGRhdGUnLCBhcmdzLCBzY2hlbWEpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbmV3IHJlY29yZHMgYW5kIHVwZGF0ZXMgZXhpc3RpbmcgcmVjb3JkcyBpbiB5b3VyIG9yZ2FuaXphdGlvbuKAmXMgZGF0YS5cbiAgICovXG4gIHVwc2VydChcbiAgICBleHRlcm5hbElkRmllbGROYW1lOiBzdHJpbmcsXG4gICAgc09iamVjdHM6IFJlY29yZFtdLFxuICApOiBQcm9taXNlPFVwc2VydFJlc3VsdFtdPjtcbiAgdXBzZXJ0KGV4dGVybmFsSWRGaWVsZE5hbWU6IHN0cmluZywgc09iamVjdDogUmVjb3JkKTogUHJvbWlzZTxVcHNlcnRSZXN1bHQ+O1xuICB1cHNlcnQoXG4gICAgZXh0ZXJuYWxJZEZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHNPYmplY3RzOiBSZWNvcmQgfCBSZWNvcmRbXSxcbiAgKTogUHJvbWlzZTxVcHNlcnRSZXN1bHQgfCBVcHNlcnRSZXN1bHRbXT47XG4gIHVwc2VydChleHRlcm5hbElkRmllbGROYW1lOiBzdHJpbmcsIHNPYmplY3RzOiBSZWNvcmQgfCBSZWNvcmRbXSkge1xuICAgIGNvbnN0IHNjaGVtYSA9IEFycmF5LmlzQXJyYXkoc09iamVjdHMpXG4gICAgICA/IFtBcGlTY2hlbWFzLlVwc2VydFJlc3VsdF1cbiAgICAgIDogQXBpU2NoZW1hcy5VcHNlcnRSZXN1bHQ7XG4gICAgY29uc3QgYXJncyA9IHtcbiAgICAgICdAeG1sbnMnOiAndXJuOnBhcnRuZXIuc29hcC5zZm9yY2UuY29tJyxcbiAgICAgICdAeG1sbnM6bnMxJzogJ3NvYmplY3QucGFydG5lci5zb2FwLnNmb3JjZS5jb20nLFxuICAgICAgJ25zMTpleHRlcm5hbElERmllbGROYW1lJzogZXh0ZXJuYWxJZEZpZWxkTmFtZSxcbiAgICAgICduczE6c09iamVjdHMnOiB0b1NvYXBSZWNvcmQoc09iamVjdHMpLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuX2ludm9rZSgndXBzZXJ0JywgYXJncywgc2NoZW1hKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIG9uZSBvciBtb3JlIHJlY29yZHMgZnJvbSB5b3VyIG9yZ2FuaXphdGlvbuKAmXMgZGF0YVxuICAgKi9cbiAgZGVsZXRlKGlkczogc3RyaW5nIHwgc3RyaW5nW10pOiBQcm9taXNlPERlbGV0ZVJlc3VsdFtdPjtcbiAgZGVsZXRlKGlkOiBzdHJpbmcpOiBQcm9taXNlPERlbGV0ZVJlc3VsdD47XG4gIGRlbGV0ZShpZHM6IHN0cmluZyB8IHN0cmluZ1tdKTogUHJvbWlzZTxEZWxldGVSZXN1bHQgfCBEZWxldGVSZXN1bHRbXT47XG4gIGRlbGV0ZShpZHM6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3Qgc2NoZW1hID0gQXJyYXkuaXNBcnJheShpZHMpXG4gICAgICA/IFtBcGlTY2hlbWFzLkRlbGV0ZVJlc3VsdF1cbiAgICAgIDogQXBpU2NoZW1hcy5EZWxldGVSZXN1bHQ7XG4gICAgY29uc3QgYXJncyA9IHtcbiAgICAgICdAeG1sbnMnOiAndXJuOnBhcnRuZXIuc29hcC5zZm9yY2UuY29tJyxcbiAgICAgICdAeG1sbnM6bnMxJzogJ3NvYmplY3QucGFydG5lci5zb2FwLnNmb3JjZS5jb20nLFxuICAgICAgJ25zMTppZHMnOiBpZHMsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5faW52b2tlKCdkZWxldGUnLCBhcmdzLCBzY2hlbWEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuZGVsZXRlIHJlY29yZHMgZnJvbSB0aGUgcmVjeWNsZSBiaW4gaW1tZWRpYXRlbHlcbiAgICovXG4gIHVuZGVsZXRlKGlkczogc3RyaW5nW10pOiBQcm9taXNlPFVuZGVsZXRlUmVzdWx0W10+IHtcbiAgICBjb25zdCBzY2hlbWEgPSBbQXBpU2NoZW1hcy5VbmRlbGV0ZVJlc3VsdF07XG4gICAgY29uc3QgYXJncyA9IHtcbiAgICAgICdAeG1sbnMnOiAndXJuOnBhcnRuZXIuc29hcC5zZm9yY2UuY29tJyxcbiAgICAgICdAeG1sbnM6bnMxJzogJ3NvYmplY3QucGFydG5lci5zb2FwLnNmb3JjZS5jb20nLFxuICAgICAgJ25zMTppZHMnOiBpZHMsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5faW52b2tlKCd1bmRlbGV0ZScsIGFyZ3MsIHNjaGVtYSk7XG4gIH1cbn1cblxuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4vKlxuICogUmVnaXN0ZXIgaG9vayBpbiBjb25uZWN0aW9uIGluc3RhbnRpYXRpb24gZm9yIGR5bmFtaWNhbGx5IGFkZGluZyB0aGlzIEFQSSBtb2R1bGUgZmVhdHVyZXNcbiAqL1xucmVnaXN0ZXJNb2R1bGUoJ3NvYXAnLCAoY29ubikgPT4gbmV3IFNvYXBBcGkoY29ubikpO1xuXG5leHBvcnQgZGVmYXVsdCBTb2FwQXBpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSxjQUFjLFFBQVEsWUFBWTtBQUUzQyxPQUFPQyxJQUFJLE1BQU0sU0FBUztBQUUxQixTQUNFQyxVQUFVLFFBY0wsZUFBZTs7QUFFdEI7QUFDQTtBQUNBO0FBQ0EsU0FBU0MsWUFBWUEsQ0FBQ0MsT0FBMEIsRUFBcUI7RUFBQSxJQUFBQyxRQUFBO0VBQ25FLE9BQU9DLG9CQUFBLENBQUFELFFBQUEsR0FBQ0UsY0FBQSxDQUFjSCxPQUFPLENBQUMsR0FBR0EsT0FBTyxHQUFHLENBQUNBLE9BQU8sQ0FBQyxFQUFBSSxJQUFBLENBQUFILFFBQUEsRUFBTSxVQUFDSSxNQUFNLEVBQUs7SUFBQSxJQUFBQyxTQUFBO0lBQ3BFLElBQVFDLElBQUksR0FBeUJGLE1BQU0sQ0FBbkNFLElBQUk7TUFBRUMsVUFBVSxHQUFhSCxNQUFNLENBQTdCRyxVQUFVO01BQUtDLEdBQUcsR0FBQUMsd0JBQUEsQ0FBS0wsTUFBTSxFQUFBTSxTQUFBO0lBQzNDLElBQU1DLENBQUMsR0FBR0wsSUFBSSxLQUFJQyxVQUFVLGFBQVZBLFVBQVUsdUJBQVZBLFVBQVUsQ0FBRUQsSUFBSTtJQUNsQyxJQUFJLENBQUNLLENBQUMsRUFBRTtNQUNOLE1BQU0sSUFBSUMsS0FBSyxDQUFDLHdEQUF3RCxDQUFDO0lBQzNFO0lBQ0EsSUFBTUMsWUFBWSxHQUFHQyx1QkFBQSxDQUFBVCxTQUFBLEdBQUFVLFlBQUEsQ0FBWVAsR0FBRyxDQUFDLEVBQUFMLElBQUEsQ0FBQUUsU0FBQSxFQUNuQyxVQUFDVyxLQUFLO01BQUEsT0FBS1osTUFBTSxDQUFDWSxLQUFLLENBQUMsS0FBSyxJQUFJO0lBQUEsQ0FDbkMsQ0FBQztJQUFDLElBQUFDLFNBQUEsR0FBQUMsMEJBQUEsQ0FDa0JMLFlBQVk7TUFBQU0s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