UNPKG

typesuite2

Version:

TypeScript client for NetSuite SuiteTalk SOAP API

131 lines 18.4 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.sendSoapRequest = exports.deserializeSoapResponse = exports.serializeSoapRequest = void 0; const crypto_1 = require("crypto"); const axios_1 = __importDefault(require("axios")); const jsonix_1 = require("jsonix"); const platform_core_1 = require("./netsuite_webservices/2019_2/platform_core"); const mappings_1 = __importDefault(require("./netsuite_webservices/2019_2/mappings")); const mappings_2 = __importDefault(require("./xmlsoap/mappings")); const envelope_1 = require("./xmlsoap/envelope"); const com_netsuite_webservices_platform_messages_2019_2_1 = require("./netsuite_webservices/2019_2/__mappings/com_netsuite_webservices_platform_messages_2019_2"); const platform_messages_1 = require("./netsuite_webservices/2019_2/platform_messages"); const ALL_MAPPINGS = [...mappings_2.default, ...mappings_1.default]; const JSONIX_CONTEXT_OPTIONS = { namespacePrefixes: { "http://www.w3.org/2001/XMLSchema-instance": "xsi", "http://schemas.xmlsoap.org/soap/envelope/": "soap", "urn:common_2019_2.platform.webservices.netsuite.com": "platform_common", "urn:core_2019_2.platform.webservices.netsuite.com": "platform_core", "urn:messages_2019_2.platform.webservices.netsuite.com": "platform_messages", }, }; function elementKeyFor(object) { var _a; const elementName = (_a = com_netsuite_webservices_platform_messages_2019_2_1.com_netsuite_webservices_platform_messages_2019_2.elementInfos.find((elementInfo) => { const typeInfo = elementInfo.typeInfo.split(".").slice(-1)[0]; return typeInfo === object.constructor.name; })) === null || _a === void 0 ? void 0 : _a.elementName; return `platform_messages:${ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions elementName !== null && elementName !== void 0 ? elementName : "<<" + object.constructor.name + ">>"}`; } function serializeSoapRequest(passport, body, preferences) { const passportElement = { name: elementKeyFor(passport), value: passport }; const headerElements = [passportElement]; if (preferences) { const prefs = new platform_messages_1.Preferences(preferences); headerElements.push({ name: elementKeyFor(prefs), value: prefs, }); } const bodyElement = { name: elementKeyFor(body), value: body }; const envelope = new envelope_1.Envelope({ header: new envelope_1.Header({ any: headerElements }), body: new envelope_1.Body({ any: [bodyElement] }), }); const data = { "soap:Envelope": envelope }; const context = new jsonix_1.Jsonix.Context(ALL_MAPPINGS, JSONIX_CONTEXT_OPTIONS); const xmlString = context.createMarshaller().marshalString(data); return '<?xml version="1.0" encoding="utf-8"?>' + xmlString; } exports.serializeSoapRequest = serializeSoapRequest; function deserializeSoapResponse(xmlContent) { const context = new jsonix_1.Jsonix.Context(ALL_MAPPINGS); return context.createUnmarshaller().unmarshalString(xmlContent); } exports.deserializeSoapResponse = deserializeSoapResponse; function endpoint(config) { const account = config.account.replace("_", "-"); return `https://${account}.suitetalk.api.netsuite.com/services/NetSuitePort_${config.apiVersion}`; } /** * Serializes the provided request into XML and sends a SOAP request to the configured * endpoint. For successful responses, returns the data extracted the envelope and cast * into the type specified by the generic type parameter R. * * If the SOAP request results in a failed response, returns the SOAP Fault within * the envelope as a rejected promise. * * @param config * @param request * @param soapAction */ async function sendSoapRequest(config, request, soapAction) { const authToken = authenticateRequestWithTokenPassport(config); const soapXML = serializeSoapRequest(authToken, request, config.preferences); const axiosInstance = config.axiosInstance || axios_1.default; try { const response = await axiosInstance.post(endpoint(config), soapXML, { headers: { SOAPAction: soapAction, contentType: "text/xml; charset=UTF-8", }, }); const soapEnvelope = deserializeSoapResponse(response.data); return soapEnvelope.value.body.any[0].value; } catch (error) { if (error.response) { // Non 20x response const soapEnvelope = deserializeSoapResponse(error.response.data); const fault = soapEnvelope.value.body.any[0].value; return Promise.reject(fault); } else { // Network error. throw error; } } } exports.sendSoapRequest = sendSoapRequest; function authenticateRequestWithTokenPassport(config) { const nonce = crypto_1.randomBytes(18).toString("hex"); const timeStamp = Math.round(new Date().getTime() / 1000); const baseString = [ config.account, config.token.consumerKey, config.token.tokenKey, nonce, timeStamp, ].join("&"); const base64hash = crypto_1.createHmac("sha256", `${config.token.consumerSecret}&${config.token.tokenSecret}`) .update(baseString) .digest("base64"); return new platform_core_1.TokenPassport({ account: config.account, consumerKey: config.token.consumerKey, nonce: nonce, timestamp: timeStamp, token: config.token.tokenKey, signature: { algorithm: "HMAC_SHA256", value: base64hash, }, }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zb2FwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1DQUFpRDtBQUNqRCxrREFBMEI7QUFDMUIsbUNBQWdDO0FBQ2hDLCtFQUE0RTtBQUM1RSxzRkFBc0U7QUFDdEUsa0VBQWlEO0FBQ2pELGlEQUFtRTtBQUNuRSxrS0FBMks7QUFFM0ssdUZBR3lEO0FBRXpELE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBRyxrQkFBZSxFQUFFLEdBQUcsa0JBQWdCLENBQUMsQ0FBQztBQUUvRCxNQUFNLHNCQUFzQixHQUFHO0lBQzdCLGlCQUFpQixFQUFFO1FBQ2pCLDJDQUEyQyxFQUFFLEtBQUs7UUFDbEQsMkNBQTJDLEVBQUUsTUFBTTtRQUNuRCxxREFBcUQsRUFBRSxpQkFBaUI7UUFDeEUsbURBQW1ELEVBQUUsZUFBZTtRQUNwRSx1REFBdUQsRUFDckQsbUJBQW1CO0tBQ3RCO0NBQ0YsQ0FBQztBQVVGLFNBQVMsYUFBYSxDQUFDLE1BQXlDOztJQUM5RCxNQUFNLFdBQVcsU0FBRyxxR0FBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUF3QixFQUFFLEVBQUU7UUFDMUUsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUQsT0FBTyxRQUFRLEtBQUssTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7SUFDOUMsQ0FBQyxDQUFDLDBDQUFFLFdBQVcsQ0FBQztJQUNoQixPQUFPLHFCQUFxQjtJQUMxQiw0RUFBNEU7SUFDNUUsV0FBVyxhQUFYLFdBQVcsY0FBWCxXQUFXLEdBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLElBQ2xELEVBQUUsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFnQixv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LEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXO1FBQ3JDLEtBQUssRUFBRSxLQUFLO1FBQ1osU0FBUyxFQUFFLFNBQVM7UUFDcEIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUTtRQUM1QixTQUFTLEVBQUU7WUFDVCxTQUFTLEVBQUUsYUFBYTtZQUN4QixLQUFLLEVBQUUsVUFBVTtTQUNsQjtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVIbWFjLCByYW5kb21CeXRlcyB9IGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCBheGlvcyBmcm9tIFwiYXhpb3NcIjtcbmltcG9ydCB7IEpzb25peCB9IGZyb20gXCJqc29uaXhcIjtcbmltcG9ydCB7IFRva2VuUGFzc3BvcnQgfSBmcm9tIFwiLi9uZXRzdWl0ZV93ZWJzZXJ2aWNlcy8yMDE5XzIvcGxhdGZvcm1fY29yZVwiO1xuaW1wb3J0IE5ldFN1aXRlTWFwcGluZ3MgZnJvbSBcIi4vbmV0c3VpdGVfd2Vic2VydmljZXMvMjAxOV8yL21hcHBpbmdzXCI7XG5pbXBvcnQgWG1sU29hcE1hcHBpbmdzIGZyb20gXCIuL3htbHNvYXAvbWFwcGluZ3NcIjtcbmltcG9ydCB7IEJvZHksIEVudmVsb3BlLCBGYXVsdCwgSGVhZGVyIH0gZnJvbSBcIi4veG1sc29hcC9lbnZlbG9wZVwiO1xuaW1wb3J0IHsgY29tX25ldHN1aXRlX3dlYnNlcnZpY2VzX3BsYXRmb3JtX21lc3NhZ2VzXzIwMTlfMiBhcyBwbGF0Zm9ybSB9IGZyb20gXCIuL25ldHN1aXRlX3dlYnNlcnZpY2VzLzIwMTlfMi9fX21hcHBpbmdzL2NvbV9uZXRzdWl0ZV93ZWJzZXJ2aWNlc19wbGF0Zm9ybV9tZXNzYWdlc18yMDE5XzJcIjtcbmltcG9ydCB7IENvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgUHJlZmVyZW5jZXMsXG4gIFByZWZlcmVuY2VzUHJvcHMsXG59IGZyb20gXCIuL25ldHN1aXRlX3dlYnNlcnZpY2VzLzIwMTlfMi9wbGF0Zm9ybV9tZXNzYWdlc1wiO1xuXG5jb25zdCBBTExfTUFQUElOR1MgPSBbLi4uWG1sU29hcE1hcHBpbmdzLCAuLi5OZXRTdWl0ZU1hcHBpbmdzXTtcblxuY29uc3QgSlNPTklYX0NPTlRFWFRfT1BUSU9OUyA9IHtcbiAgbmFtZXNwYWNlUHJlZml4ZXM6IHtcbiAgICBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCI6IFwieHNpXCIsXG4gICAgXCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiOiBcInNvYXBcIixcbiAgICBcInVybjpjb21tb25fMjAxOV8yLnBsYXRmb3JtLndlYnNlcnZpY2VzLm5ldHN1aXRlLmNvbVwiOiBcInBsYXRmb3JtX2NvbW1vblwiLFxuICAgIFwidXJuOmNvcmVfMjAxOV8yLnBsYXRmb3JtLndlYnNlcnZpY2VzLm5ldHN1aXRlLmNvbVwiOiBcInBsYXRmb3JtX2NvcmVcIixcbiAgICBcInVybjptZXNzYWdlc18yMDE5XzIucGxhdGZvcm0ud2Vic2VydmljZXMubmV0c3VpdGUuY29tXCI6XG4gICAgICBcInBsYXRmb3JtX21lc3NhZ2VzXCIsXG4gIH0sXG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWludGVyZmFjZVxuaW50ZXJmYWNlIHNvYXBPYmplY3Qge31cblxuaW50ZXJmYWNlIEVsZW1lbnRJbmZvIHtcbiAgdHlwZUluZm86IHN0cmluZztcbiAgZWxlbWVudE5hbWU6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gZWxlbWVudEtleUZvcihvYmplY3Q6IHsgY29uc3RydWN0b3I6IHsgbmFtZTogc3RyaW5nIH0gfSkge1xuICBjb25zdCBlbGVtZW50TmFtZSA9IHBsYXRmb3JtLmVsZW1lbnRJbmZvcy5maW5kKChlbGVtZW50SW5mbzogRWxlbWVudEluZm8pID0+IHtcbiAgICBjb25zdCB0eXBlSW5mbyA9IGVsZW1lbnRJbmZvLnR5cGVJbmZvLnNwbGl0KFwiLlwiKS5zbGljZSgtMSlbMF07XG4gICAgcmV0dXJuIHR5cGVJbmZvID09PSBvYmplY3QuY29uc3RydWN0b3IubmFtZTtcbiAgfSk/LmVsZW1lbnROYW1lO1xuICByZXR1cm4gYHBsYXRmb3JtX21lc3NhZ2VzOiR7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgIGVsZW1lbnROYW1lID8/IFwiPDxcIiArIG9iamVjdC5jb25zdHJ1Y3Rvci5uYW1lICsgXCI+PlwiXG4gIH1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplU29hcFJlcXVlc3QoXG4gIHBhc3Nwb3J0OiBUb2tlblBhc3Nwb3J0LFxuICBib2R5OiBzb2FwT2JqZWN0LFxuICBwcmVmZXJlbmNlcz86IFByZWZlcmVuY2VzUHJvcHNcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhc3Nwb3J0RWxlbWVudCA9IHsgbmFtZTogZWxlbWVudEtleUZvcihwYXNzcG9ydCksIHZhbHVlOiBwYXNzcG9ydCB9O1xuICBjb25zdCBoZWFkZXJFbGVtZW50czogYW55W10gPSBbcGFzc3BvcnRFbGVtZW50XTtcbiAgaWYgKHByZWZlcmVuY2VzKSB7XG4gICAgY29uc3QgcHJlZnMgPSBuZXcgUHJlZmVyZW5jZXMocHJlZmVyZW5jZXMpO1xuICAgIGhlYWRlckVsZW1lbnRzLnB1c2goe1xuICAgICAgbmFtZTogZWxlbWVudEtleUZvcihwcmVmcyksXG4gICAgICB2YWx1ZTogcHJlZnMsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgYm9keUVsZW1lbnQgPSB7IG5hbWU6IGVsZW1lbnRLZXlGb3IoYm9keSksIHZhbHVlOiBib2R5IH07XG4gIGNvbnN0IGVudmVsb3BlID0gbmV3IEVudmVsb3BlKHtcbiAgICBoZWFkZXI6IG5ldyBIZWFkZXIoeyBhbnk6IGhlYWRlckVsZW1lbnRzIH0pLFxuICAgIGJvZHk6IG5ldyBCb2R5KHsgYW55OiBbYm9keUVsZW1lbnRdIH0pLFxuICB9KTtcbiAgY29uc3QgZGF0YSA9IHsgXCJzb2FwOkVudmVsb3BlXCI6IGVudmVsb3BlIH07XG4gIGNvbnN0IGNvbnRleHQgPSBuZXcgSnNvbml4LkNvbnRleHQoQUxMX01BUFBJTkdTLCBKU09OSVhfQ09OVEVYVF9PUFRJT05TKTtcbiAgY29uc3QgeG1sU3RyaW5nID0gY29udGV4dC5jcmVhdGVNYXJzaGFsbGVyKCkubWFyc2hhbFN0cmluZyhkYXRhKTtcblxuICByZXR1cm4gJzw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cInV0Zi04XCI/PicgKyB4bWxTdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZVNvYXBSZXNwb25zZSh4bWxDb250ZW50OiBzdHJpbmcpOiBYbWxPYmplY3Qge1xuICBjb25zdCBjb250ZXh0ID0gbmV3IEpzb25peC5Db250ZXh0KEFMTF9NQVBQSU5HUyk7XG4gIHJldHVybiBjb250ZXh0LmNyZWF0ZVVubWFyc2hhbGxlcjxYbWxPYmplY3Q+KCkudW5tYXJzaGFsU3RyaW5nKHhtbENvbnRlbnQpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFhtbE9iamVjdCB7XG4gIHZhbHVlOiB7XG4gICAgYm9keToge1xuICAgICAgYW55OiBbeyB2YWx1ZTogdW5rbm93biB9XTtcbiAgICB9O1xuICB9O1xufVxuXG5mdW5jdGlvbiBlbmRwb2ludChjb25maWc6IENvbmZpZ3VyYXRpb24pOiBzdHJpbmcge1xuICBjb25zdCBhY2NvdW50ID0gY29uZmlnLmFjY291bnQucmVwbGFjZShcIl9cIiwgXCItXCIpO1xuICByZXR1cm4gYGh0dHBzOi8vJHthY2NvdW50fS5zdWl0ZXRhbGsuYXBpLm5ldHN1aXRlLmNvbS9zZXJ2aWNlcy9OZXRTdWl0ZVBvcnRfJHtjb25maWcuYXBpVmVyc2lvbn1gO1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdGhlIHByb3ZpZGVkIHJlcXVlc3QgaW50byBYTUwgYW5kIHNlbmRzIGEgU09BUCByZXF1ZXN0IHRvIHRoZSBjb25maWd1cmVkXG4gKiBlbmRwb2ludC4gRm9yIHN1Y2Nlc3NmdWwgcmVzcG9uc2VzLCByZXR1cm5zIHRoZSBkYXRhIGV4dHJhY3RlZCB0aGUgZW52ZWxvcGUgYW5kIGNhc3RcbiAqIGludG8gdGhlIHR5cGUgc3BlY2lmaWVkIGJ5IHRoZSBnZW5lcmljIHR5cGUgcGFyYW1ldGVyIFIuXG4gKlxuICogSWYgdGhlIFNPQVAgcmVxdWVzdCByZXN1bHRzIGluIGEgZmFpbGVkIHJlc3BvbnNlLCByZXR1cm5zIHRoZSBTT0FQIEZhdWx0IHdpdGhpblxuICogdGhlIGVudmVsb3BlIGFzIGEgcmVqZWN0ZWQgcHJvbWlzZS5cbiAqXG4gKiBAcGFyYW0gY29uZmlnXG4gKiBAcGFyYW0gcmVxdWVzdFxuICogQHBhcmFtIHNvYXBBY3Rpb25cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRTb2FwUmVxdWVzdDxULCBSPihcbiAgY29uZmlnOiBDb25maWd1cmF0aW9uLFxuICByZXF1ZXN0OiBULFxuICBzb2FwQWN0aW9uOiBzdHJpbmdcbik6IFByb21pc2U8Uj4ge1xuICBjb25zdCBhdXRoVG9rZW4gPSBhdXRoZW50aWNhdGVSZXF1ZXN0V2l0aFRva2VuUGFzc3BvcnQoY29uZmlnKTtcbiAgY29uc3Qgc29hcFhNTCA9IHNlcmlhbGl6ZVNvYXBSZXF1ZXN0KGF1dGhUb2tlbiwgcmVxdWVzdCwgY29uZmlnLnByZWZlcmVuY2VzKTtcbiAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGNvbmZpZy5heGlvc0luc3RhbmNlIHx8IGF4aW9zO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZS5wb3N0KGVuZHBvaW50KGNvbmZpZyksIHNvYXBYTUwsIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgU09BUEFjdGlvbjogc29hcEFjdGlvbixcbiAgICAgICAgY29udGVudFR5cGU6IFwidGV4dC94bWw7IGNoYXJzZXQ9VVRGLThcIixcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgY29uc3Qgc29hcEVudmVsb3BlID0gZGVzZXJpYWxpemVTb2FwUmVzcG9uc2UocmVzcG9uc2UuZGF0YSk7XG4gICAgcmV0dXJuIHNvYXBFbnZlbG9wZS52YWx1ZS5ib2R5LmFueVswXS52YWx1ZSBhcyBSO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvci5yZXNwb25zZSkge1xuICAgICAgLy8gTm9uIDIweCByZXNwb25zZVxuICAgICAgY29uc3Qgc29hcEVudmVsb3BlID0gZGVzZXJpYWxpemVTb2FwUmVzcG9uc2UoZXJyb3IucmVzcG9uc2UuZGF0YSk7XG4gICAgICBjb25zdCBmYXVsdCA9IHNvYXBFbnZlbG9wZS52YWx1ZS5ib2R5LmFueVswXS52YWx1ZSBhcyBGYXVsdDtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChmYXVsdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5ldHdvcmsgZXJyb3IuXG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYXV0aGVudGljYXRlUmVxdWVzdFdpdGhUb2tlblBhc3Nwb3J0KFxuICBjb25maWc6IENvbmZpZ3VyYXRpb25cbik6IFRva2VuUGFzc3BvcnQge1xuICBjb25zdCBub25jZSA9IHJhbmRvbUJ5dGVzKDE4KS50b1N0cmluZyhcImhleFwiKTtcbiAgY29uc3QgdGltZVN0YW1wID0gTWF0aC5yb3VuZChuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDApO1xuICBjb25zdCBiYXNlU3RyaW5nID0gW1xuICAgIGNvbmZpZy5hY2NvdW50LFxuICAgIGNvbmZpZy50b2tlbi5jb25zdW1lcktleSxcbiAgICBjb25maWcudG9rZW4udG9rZW5LZXksXG4gICAgbm9uY2UsXG4gICAgdGltZVN0YW1wLFxuICBdLmpvaW4oXCImXCIpO1xuICBjb25zdCBiYXNlNjRoYXNoID0gY3JlYXRlSG1hYyhcbiAgICBcInNoYTI1NlwiLFxuICAgIGAke2NvbmZpZy50b2tlbi5jb25zdW1lclNlY3JldH0mJHtjb25maWcudG9rZW4udG9rZW5TZWNyZXR9YFxuICApXG4gICAgLnVwZGF0ZShiYXNlU3RyaW5nKVxuICAgIC5kaWdlc3QoXCJiYXNlNjRcIik7XG5cbiAgcmV0dXJuIG5ldyBUb2tlblBhc3Nwb3J0KHtcbiAgICBhY2NvdW50OiBjb25maWcuYWNjb3VudCxcbiAgICBjb25zdW1lcktleTogY29uZmlnLnRva2VuLmNvbnN1bWVyS2V5LFxuICAgIG5vbmNlOiBub25jZSxcbiAgICB0aW1lc3RhbXA6IHRpbWVTdGFtcCxcbiAgICB0b2tlbjogY29uZmlnLnRva2VuLnRva2VuS2V5LFxuICAgIHNpZ25hdHVyZToge1xuICAgICAgYWxnb3JpdGhtOiBcIkhNQUNfU0hBMjU2XCIsXG4gICAgICB2YWx1ZTogYmFzZTY0aGFzaCxcbiAgICB9LFxuICB9KTtcbn1cbiJdfQ==