UNPKG

coralpay-node-sdk

Version:
198 lines 26.9 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; var _CoralPay_http; Object.defineProperty(exports, "__esModule", { value: true }); exports.CoralPay = exports.METHOD = void 0; const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const axios_1 = __importDefault(require("axios")); const encryption_1 = require("./encryption"); const bank_util_1 = require("./bank-util"); const SANDBOX_URL = "https://testdev.coralpay.com/cgateproxy/"; const PRODUCTION_URL = "https://cgateweb.coralpay.com:567/"; const INVOKE_REFERENCE_API = "api/invokereference"; const QUERY_TRANSACTION_API = "api/statusquery"; const REFUND_PAYMENT_API = "api/refund"; const CORAL_TEST_ENCRYPTION_KEY = fs_1.default.readFileSync(path_1.default.resolve(__dirname, "./../assets/coral.test.pub.key"), "utf8"); const CORAL_PROD_ENCRYPTION_KEY = fs_1.default.readFileSync(path_1.default.resolve(__dirname, "./../assets/coral.prod.pub.key"), "utf8"); var METHOD; (function (METHOD) { METHOD["POST"] = "POST"; METHOD["GET"] = "GET"; })(METHOD = exports.METHOD || (exports.METHOD = {})); const validateExistence = (obj, ...keys) => { const invalid = []; for (const key of keys) { if (!obj[key]) { invalid.push(key); } } if (invalid.length > 0) { throw new Error(`${invalid.join(", ")} not provided`); } return true; }; class CoralPay { constructor(config) { var _a, _b; this.config = config; _CoralPay_http.set(this, void 0); // tslint:disable-next-line: no-console this.logger = console.log.bind(console); validateExistence(config, "privateKey", "merchantId", "terminalId", "userName", "password", "env"); if (this.config.trace === true) { this.trace = true; } else if (typeof this.config.trace === "function") { this.trace = true; this.logger = this.config.trace; } else { this.trace = false; } this.encryption = new encryption_1.PGPEncryption({ privatekey: this.config.privateKey, publickey: ((_a = this.config.coralPublicKey) !== null && _a !== void 0 ? _a : this.config.env === "prod") ? CORAL_PROD_ENCRYPTION_KEY : CORAL_TEST_ENCRYPTION_KEY, passphrase: this.config.passphrase, logger: this.log.bind(this), isInsecureTwoByteHashPrivateKey: this.config.isInsecureTwoByteHashPrivateKey, }); this.bankUtil = new bank_util_1.BankUtil(); __classPrivateFieldSet(this, _CoralPay_http, axios_1.default.create({ baseURL: ((_b = this.config.baseUrl) !== null && _b !== void 0 ? _b : this.config.env === "prod") ? PRODUCTION_URL : SANDBOX_URL, validateStatus: () => { return true; }, }), "f"); } sendEncryptedRequest(method, uri, payload, params) { return __awaiter(this, void 0, void 0, function* () { let data = ""; const headers = { "Content-Type": "text/plain", }; this.log("URI: ", uri); this.log("Method: ", method); this.log("Headers: ", headers); if (payload && method === METHOD.POST) { this.log("Payload: ", JSON.stringify(payload, null, 2)); data = yield this.encryption.encrypt(JSON.stringify(payload)); } //this.log("Encrypted Form: ", data); const response = yield __classPrivateFieldGet(this, _CoralPay_http, "f") .request({ method, url: uri, data, headers, params, }) .then((response) => __awaiter(this, void 0, void 0, function* () { const { status, statusText, headers, data } = response; this.log("Raw Response:", { status, statusText, headers, data }); return { statusCode: status, statusMessage: statusText, headers, body: String(data).length ? (yield this.encryption.decrypt(data, true)) : null, }; })); this.log("Response from CGATE", response); return response; }); } invokeReference(payload) { return __awaiter(this, void 0, void 0, function* () { validateExistence(payload, "Channel", "Amount"); const { Channel, Amount, TraceID, TransactionType, SubMerchantName, TerminalId } = payload; const { userName: UserName, password: Password, terminalId: DefaultTerminalId, merchantId: MerchantId } = this.config; const body = { RequestHeader: { UserName, Password, }, RequestDetails: { TerminalId: TerminalId !== null && TerminalId !== void 0 ? TerminalId : DefaultTerminalId, Channel, Amount, MerchantId, TransactionType, SubMerchantName, TraceID, }, }; return yield this.sendEncryptedRequest(METHOD.POST, INVOKE_REFERENCE_API, body); }); } queryTransaction(payload) { return __awaiter(this, void 0, void 0, function* () { validateExistence(payload, "Amount", "TransactionID"); const { Amount, TransactionID, TerminalId } = payload; const { userName: UserName, password: Password, terminalId: DefaultTerminalId, merchantId: MerchantId } = this.config; const body = { RequestHeader: { UserName, Password, }, RequestDetails: { TerminalId: TerminalId !== null && TerminalId !== void 0 ? TerminalId : DefaultTerminalId, MerchantId, Amount, TransactionID, }, }; return yield this.sendEncryptedRequest(METHOD.POST, QUERY_TRANSACTION_API, body); }); } refundPayment(payload) { return __awaiter(this, void 0, void 0, function* () { validateExistence(payload, "Amount", "TransactionID", "Reference"); const { Amount, TransactionID, Reference, TerminalId } = payload; const { userName: UserName, password: Password, terminalId: DefaultTerminalId, merchantId: MerchantId } = this.config; const body = { RequestHeader: { UserName, Password, }, ReversalDetails: { MerchantId, TerminalId: TerminalId !== null && TerminalId !== void 0 ? TerminalId : DefaultTerminalId, Reference, Amount, TransactionID, }, }; return yield this.sendEncryptedRequest(METHOD.POST, REFUND_PAYMENT_API, body); }); } log(...args) { if (this.trace) { this.logger(...args); } } } exports.CoralPay = CoralPay; _CoralPay_http = new WeakMap(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yYWxwYXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29yYWxwYXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUV4QixrREFBNkM7QUFDN0MsNkNBQTZDO0FBQzdDLDJDQUF1QztBQUV2QyxNQUFNLFdBQVcsR0FBRywwQ0FBMEMsQ0FBQztBQUMvRCxNQUFNLGNBQWMsR0FBRyxvQ0FBb0MsQ0FBQztBQUU1RCxNQUFNLG9CQUFvQixHQUFHLHFCQUFxQixDQUFDO0FBQ25ELE1BQU0scUJBQXFCLEdBQUcsaUJBQWlCLENBQUM7QUFDaEQsTUFBTSxrQkFBa0IsR0FBRyxZQUFZLENBQUM7QUFFeEMsTUFBTSx5QkFBeUIsR0FBRyxZQUFFLENBQUMsWUFBWSxDQUFDLGNBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLGdDQUFnQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDckgsTUFBTSx5QkFBeUIsR0FBRyxZQUFFLENBQUMsWUFBWSxDQUFDLGNBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLGdDQUFnQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFzRnJILElBQVksTUFHWDtBQUhELFdBQVksTUFBTTtJQUNqQix1QkFBYSxDQUFBO0lBQ2IscUJBQVcsQ0FBQTtBQUNaLENBQUMsRUFIVyxNQUFNLEdBQU4sY0FBTSxLQUFOLGNBQU0sUUFHakI7QUFFRCxNQUFNLGlCQUFpQixHQUFHLENBQUMsR0FBVyxFQUFFLEdBQUcsSUFBYyxFQUFFLEVBQUU7SUFDNUQsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ25CLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO1FBQ3ZCLElBQUksQ0FBRSxHQUFXLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdkIsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNsQjtL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bSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgSW5jb21pbmdIdHRwSGVhZGVycyB9IGZyb20gXCJodHRwXCI7XG5pbXBvcnQgYXhpb3MsIHsgQXhpb3NJbnN0YW5jZSB9IGZyb20gXCJheGlvc1wiO1xuaW1wb3J0IHsgUEdQRW5jcnlwdGlvbiB9IGZyb20gXCIuL2VuY3J5cHRpb25cIjtcbmltcG9ydCB7IEJhbmtVdGlsIH0gZnJvbSBcIi4vYmFuay11dGlsXCI7XG5cbmNvbnN0IFNBTkRCT1hfVVJMID0gXCJodHRwczovL3Rlc3RkZXYuY29yYWxwYXkuY29tL2NnYXRlcHJveHkvXCI7XG5jb25zdCBQUk9EVUNUSU9OX1VSTCA9IFwiaHR0cHM6Ly9jZ2F0ZXdlYi5jb3JhbHBheS5jb206NTY3L1wiO1xuXG5jb25zdCBJTlZPS0VfUkVGRVJFTkNFX0FQSSA9IFwiYXBpL2ludm9rZXJlZmVyZW5jZVwiO1xuY29uc3QgUVVFUllfVFJBTlNBQ1RJT05fQVBJID0gXCJhcGkvc3RhdHVzcXVlcnlcIjtcbmNvbnN0IFJFRlVORF9QQVlNRU5UX0FQSSA9IFwiYXBpL3JlZnVuZFwiO1xuXG5jb25zdCBDT1JBTF9URVNUX0VOQ1JZUFRJT05fS0VZID0gZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsIFwiLi8uLi9hc3NldHMvY29yYWwudGVzdC5wdWIua2V5XCIpLCBcInV0ZjhcIik7XG5jb25zdCBDT1JBTF9QUk9EX0VOQ1JZUFRJT05fS0VZID0gZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsIFwiLi8uLi9hc3NldHMvY29yYWwucHJvZC5wdWIua2V5XCIpLCBcInV0ZjhcIik7XG5cbnR5cGUgTG9nZ2VyID0gKC4uLmFyZ3M6IGFueSkgPT4gYW55O1xuZXhwb3J0IGludGVyZmFjZSBDb3JhbENvbmZpZyB7XG5cdHByaXZhdGVLZXk6IHN0cmluZztcblx0Y29yYWxQdWJsaWNLZXk/OiBzdHJpbmc7XG5cdG1lcmNoYW50SWQ6IHN0cmluZztcblx0dGVybWluYWxJZDogc3RyaW5nO1xuXHR1c2VyTmFtZTogc3RyaW5nO1xuXHRwYXNzd29yZDogc3RyaW5nO1xuXHRwYXNzcGhyYXNlPzogc3RyaW5nO1xuXHRlbnY6IFwidGVzdFwiIHwgXCJwcm9kXCI7XG5cdGJhc2VVcmw/OiBzdHJpbmc7XG5cdHRyYWNlPzogYm9vbGVhbiB8IExvZ2dlcjtcblx0aXNJbnNlY3VyZVR3b0J5dGVIYXNoUHJpdmF0ZUtleT86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBBcGlSZXNwb25zZTxUID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuXHRzdGF0dXNDb2RlOiBudW1iZXI7XG5cdHN0YXR1c01lc3NhZ2U6IHN0cmluZztcblx0aGVhZGVyczogSW5jb21pbmdIdHRwSGVhZGVycztcblx0Ym9keTogVCB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29yYWxQYXlSZXNwb25zZTxUID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuXHRSZXNwb25zZUhlYWRlcjoge1xuXHRcdFJlc3BvbnNlQ29kZTogc3RyaW5nO1xuXHRcdFJlc3BvbnNlTWVzc2FnZTogc3RyaW5nO1xuXHR9O1xuXHRSZXNwb25zZURldGFpbHM6IFQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW52b2tlUmVmZXJlbmNlUmVxdWVzdCB7XG5cdENoYW5uZWw6IHN0cmluZztcblx0QW1vdW50OiBudW1iZXI7XG5cdFRyYWNlSUQ/OiBzdHJpbmc7XG5cdFRyYW5zYWN0aW9uVHlwZT86IHN0cmluZztcblx0U3ViTWVyY2hhbnROYW1lPzogc3RyaW5nO1xuXHRUZXJtaW5hbElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludm9rZVJlZmVyZW5jZVJlc3BvbnNlIHtcblx0UmVmZXJlbmNlOiBzdHJpbmc7XG5cdEFtb3VudDogc3RyaW5nO1xuXHRUcmFuc2FjdGlvbklEOiBzdHJpbmc7XG5cdFRyYWNlSUQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdHVzUXVlcnlSZXF1ZXN0IHtcblx0QW1vdW50OiBudW1iZXI7XG5cdFRyYW5zYWN0aW9uSUQ6IHN0cmluZztcblx0VGVybWluYWxJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGF0dXNRdWVyeVJlc3BvbnNlIHtcblx0cmVzcG9uc2VDb2RlOiBzdHJpbmc7XG5cdHJlc3BvbnNlbWVzc2FnZTogc3RyaW5nO1xuXHRyZWZlcmVuY2U6IHN0cmluZztcblx0YW1vdW50OiBudW1iZXI7XG5cdHRlcm1pbmFsSWQ6IHN0cmluZztcblx0bWVyY2hhbnRJZDogc3RyaW5nO1xuXHRyZXRyaWV2YWxSZWZlcmVuY2U6IHN0cmluZztcblx0aW5zdGl0dXRpb25Db2RlOiBzdHJpbmc7XG5cdHNob3J0TmFtZTogc3RyaW5nO1xuXHRjdXN0b21lcl9tb2JpbGU6IHN0cmluZztcblx0U3ViTWVyY2hhbnROYW1lOiBzdHJpbmc7XG5cdFRyYW5zYWN0aW9uSUQ6IHN0cmluZztcblx0VXNlcklEOiBzdHJpbmc7XG5cdFRyYWNlSUQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWZ1bmRQYXltZW50UmVxdWVzdCB7XG5cdFJlZmVyZW5jZTogc3RyaW5nO1xuXHRBbW91bnQ6IG51bWJlcjtcblx0VHJhbnNhY3Rpb25JRDogc3RyaW5nO1xuXHRUZXJtaW5hbElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZnVuZFBheW1lbnRSZXNwb25zZSB7XG5cdE1lcmNoYW50SWQ6IHN0cmluZztcblx0VGVybWluYWxJZDogc3RyaW5nO1xuXHRBbW91bnQ6IG51bWJlcjtcblx0UmVmZXJlbmNlOiBzdHJpbmc7XG5cdFRyYW5zYWN0aW9uSUQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gTUVUSE9EIHtcblx0UE9TVCA9IFwiUE9TVFwiLFxuXHRHRVQgPSBcIkdFVFwiLFxufVxuXG5jb25zdCB2YWxpZGF0ZUV4aXN0ZW5jZSA9IChvYmo6IG9iamVjdCwgLi4ua2V5czogc3RyaW5nW10pID0+IHtcblx0Y29uc3QgaW52YWxpZCA9IFtdO1xuXHRmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG5cdFx0aWYgKCEob2JqIGFzIGFueSlba2V5XSkge1xuXHRcdFx0aW52YWxpZC5wdXNoKGtleSk7XG5cdFx0fVxuXHR9XG5cdGlmIChpbnZhbGlkLmxlbmd0aCA+IDApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYCR7aW52YWxpZC5qb2luKFwiLCBcIil9IG5vdCBwcm92aWRlZGApO1xuXHR9XG5cdHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGNsYXNzIENvcmFsUGF5IHtcblx0I2h0dHA6IEF4aW9zSW5zdGFuY2U7XG5cblx0cHVibGljIGVuY3J5cHRpb246IFBHUEVuY3J5cHRpb247XG5cdHB1YmxpYyBiYW5rVXRpbDogQmFua1V0aWw7XG5cdHByaXZhdGUgdHJhY2U6IGJvb2xlYW47XG5cdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxuXHRwcml2YXRlIGxvZ2dlcjogTG9nZ2VyID0gY29uc29sZS5sb2cuYmluZChjb25zb2xlKTtcblx0Y29uc3RydWN0b3IocHJpdmF0ZSBjb25maWc6IENvcmFsQ29uZmlnKSB7XG5cdFx0dmFsaWRhdGVFeGlzdGVuY2UoY29uZmlnLCBcInByaXZhdGVLZXlcIiwgXCJtZXJjaGFudElkXCIsIFwidGVybWluYWxJZFwiLCBcInVzZXJOYW1lXCIsIFwicGFzc3dvcmRcIiwgXCJlbnZcIik7XG5cdFx0aWYgKHRoaXMuY29uZmlnLnRyYWNlID09PSB0cnVlKSB7XG5cdFx0XHR0aGlzLnRyYWNlID0gdHJ1ZTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZy50cmFjZSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHR0aGlzLnRyYWNlID0gdHJ1ZTtcblx0XHRcdHRoaXMubG9nZ2VyID0gdGhpcy5jb25maWcudHJhY2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMudHJhY2UgPSBmYWxzZTtcblx0XHR9XG5cdFx0dGhpcy5lbmNyeXB0aW9uID0gbmV3IFBHUEVuY3J5cHRpb24oe1xuXHRcdFx0cHJpdmF0ZWtleTogdGhpcy5jb25maWcucHJpdmF0ZUtleSxcblx0XHRcdHB1YmxpY2tleTogdGhpcy5jb25maWcuY29yYWxQdWJsaWNLZXkgPz8gdGhpcy5jb25maWcuZW52ID09PSBcInByb2RcIiA/IENPUkFMX1BST0RfRU5DUllQVElPTl9LRVkgOiBDT1JBTF9URVNUX0VOQ1JZUFRJT05fS0VZLFxuXHRcdFx0cGFzc3BocmFzZTogdGhpcy5jb25maWcucGFzc3BocmFzZSxcblx0XHRcdGxvZ2dlcjogdGhpcy5sb2cuYmluZCh0aGlzKSxcblx0XHRcdGlzSW5zZWN1cmVUd29CeXRlSGFzaFByaXZhdGVLZXk6IHRoaXMuY29uZmlnLmlzSW5zZWN1cmVUd29CeXRlSGFzaFByaXZhdGVLZXksXG5cdFx0fSk7XG5cdFx0dGhpcy5iYW5rVXRpbCA9IG5ldyBCYW5rVXRpbCgpO1xuXHRcdHRoaXMuI2h0dHAgPSBheGlvcy5jcmVhdGUoe1xuXHRcdFx0YmFzZVVSTDogdGhpcy5jb25maWcuYmFzZVVybCA/PyB0aGlzLmNvbmZpZy5lbnYgPT09IFwicHJvZFwiID8gUFJPRFVDVElPTl9VUkwgOiBTQU5EQk9YX1VSTCxcblx0XHRcdHZhbGlkYXRlU3RhdHVzOiAoKSA9PiB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBzZW5kRW5jcnlwdGVkUmVxdWVzdDxUID0gUmVjb3JkPHN0cmluZywgYW55Pj4oXG5cdFx0bWV0aG9kOiBNRVRIT0QsXG5cdFx0dXJpOiBzdHJpbmcsXG5cdFx0cGF5bG9hZD86IFJlY29yZDxzdHJpbmcsIGFueT4sXG5cdFx0cGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55Pixcblx0KSB7XG5cdFx0bGV0IGRhdGEgPSBcIlwiO1xuXHRcdGNvbnN0IGhlYWRlcnMgPSB7XG5cdFx0XHRcIkNvbnRlbnQtVHlwZVwiOiBcInRleHQvcGxhaW5cIixcblx0XHR9O1xuXHRcdHRoaXMubG9nKFwiVVJJOiBcIiwgdXJpKTtcblx0XHR0aGlzLmxvZyhcIk1ldGhvZDogXCIsIG1ldGhvZCk7XG5cdFx0dGhpcy5sb2coXCJIZWFkZXJzOiBcIiwgaGVhZGVycyk7XG5cdFx0aWYgKHBheWxvYWQgJiYgbWV0aG9kID09PSBNRVRIT0QuUE9TVCkge1xuXHRcdFx0dGhpcy5sb2coXCJQYXlsb2FkOiBcIiwgSlNPTi5zdHJpbmdpZnkocGF5bG9hZCwgbnVsbCwgMikpO1xuXHRcdFx0ZGF0YSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvbi5lbmNyeXB0KEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKTtcblx0XHR9XG5cdFx0Ly90aGlzLmxvZyhcIkVuY3J5cHRlZCBGb3JtOiBcIiwgZGF0YSk7XG5cdFx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLiNodHRwXG5cdFx0XHQucmVxdWVzdCh7XG5cdFx0XHRcdG1ldGhvZCxcblx0XHRcdFx0dXJsOiB1cmksXG5cdFx0XHRcdGRhdGEsXG5cdFx0XHRcdGhlYWRlcnMsXG5cdFx0XHRcdHBhcmFtcyxcblx0XHRcdH0pXG5cdFx0XHQudGhlbihhc3luYyAocmVzcG9uc2UpID0+IHtcblx0XHRcdFx0Y29uc3QgeyBzdGF0dXMsIHN0YXR1c1RleHQsIGhlYWRlcnMsIGRhdGEgfSA9IHJlc3BvbnNlO1xuXHRcdFx0XHR0aGlzLmxvZyhcIlJhdyBSZXNwb25zZTpcIiwgeyBzdGF0dXMsIHN0YXR1c1RleHQsIGhlYWRlcnMsIGRhdGEgfSk7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0c3RhdHVzQ29kZTogc3RhdHVzLFxuXHRcdFx0XHRcdHN0YXR1c01lc3NhZ2U6IHN0YXR1c1RleHQsXG5cdFx0XHRcdFx0aGVhZGVycyxcblx0XHRcdFx0XHRib2R5OiBTdHJpbmcoZGF0YSkubGVuZ3RoID8gKChhd2FpdCB0aGlzLmVuY3J5cHRpb24uZGVjcnlwdChkYXRhLCB0cnVlKSkgYXMgVCkgOiBudWxsLFxuXHRcdFx0XHR9IGFzIEFwaVJlc3BvbnNlPFQ+O1xuXHRcdFx0fSk7XG5cblx0XHR0aGlzLmxvZyhcIlJlc3BvbnNlIGZyb20gQ0dBVEVcIiwgcmVzcG9uc2UpO1xuXHRcdHJldHVybiByZXNwb25zZTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBpbnZva2VSZWZlcmVuY2UocGF5bG9hZDogSW52b2tlUmVmZXJlbmNlUmVxdWVzdCkge1xuXHRcdHZhbGlkYXRlRXhpc3RlbmNlKHBheWxvYWQsIFwiQ2hhbm5lbFwiLCBcIkFtb3VudFwiKTtcblx0XHRjb25zdCB7IENoYW5uZWwsIEFtb3VudCwgVHJhY2VJRCwgVHJhbnNhY3Rpb25UeXBlLCBTdWJNZXJjaGFudE5hbWUsIFRlcm1pbmFsSWQgfSA9IHBheWxvYWQ7XG5cdFx0Y29uc3QgeyB1c2VyTmFtZTogVXNlck5hbWUsIHBhc3N3b3JkOiBQYXNzd29yZCwgdGVybWluYWxJZDogRGVmYXVsdFRlcm1pbmFsSWQsIG1lcmNoYW50SWQ6IE1lcmNoYW50SWQgfSA9IHRoaXMuY29uZmlnO1xuXHRcdGNvbnN0IGJvZHkgPSB7XG5cdFx0XHRSZXF1ZXN0SGVhZGVyOiB7XG5cdFx0XHRcdFVzZXJOYW1lLFxuXHRcdFx0XHRQYXNzd29yZCxcblx0XHRcdH0sXG5cdFx0XHRSZXF1ZXN0RGV0YWlsczoge1xuXHRcdFx0XHRUZXJtaW5hbElkOiBUZXJtaW5hbElkID8/IERlZmF1bHRUZXJtaW5hbElkLFxuXHRcdFx0XHRDaGFubmVsLFxuXHRcdFx0XHRBbW91bnQsXG5cdFx0XHRcdE1lcmNoYW50SWQsXG5cdFx0XHRcdFRyYW5zYWN0aW9uVHlwZSxcblx0XHRcdFx0U3ViTWVyY2hhbnROYW1lLFxuXHRcdFx0XHRUcmFjZUlELFxuXHRcdFx0fSxcblx0XHR9O1xuXHRcdHJldHVybiBhd2FpdCB0aGlzLnNlbmRFbmNyeXB0ZWRSZXF1ZXN0PENvcmFsUGF5UmVzcG9uc2U8SW52b2tlUmVmZXJlbmNlUmVzcG9uc2U+PihNRVRIT0QuUE9TVCwgSU5WT0tFX1JFRkVSRU5DRV9BUEksIGJvZHkpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIHF1ZXJ5VHJhbnNhY3Rpb24ocGF5bG9hZDogU3RhdHVzUXVlcnlSZXF1ZXN0KSB7XG5cdFx0dmFsaWRhdGVFeGlzdGVuY2UocGF5bG9hZCwgXCJBbW91bnRcIiwgXCJUcmFuc2FjdGlvbklEXCIpO1xuXHRcdGNvbnN0IHsgQW1vdW50LCBUcmFuc2FjdGlvbklELCBUZXJtaW5hbElkIH0gPSBwYXlsb2FkO1xuXHRcdGNvbnN0IHsgdXNlck5hbWU6IFVzZXJOYW1lLCBwYXNzd29yZDogUGFzc3dvcmQsIHRlcm1pbmFsSWQ6IERlZmF1bHRUZXJtaW5hbElkLCBtZXJjaGFudElkOiBNZXJjaGFudElkIH0gPSB0aGlzLmNvbmZpZztcblx0XHRjb25zdCBib2R5ID0ge1xuXHRcdFx0UmVxdWVzdEhlYWRlcjoge1xuXHRcdFx0XHRVc2VyTmFtZSxcblx0XHRcdFx0UGFzc3dvcmQsXG5cdFx0XHR9LFxuXHRcdFx0UmVxdWVzdERldGFpbHM6IHtcblx0XHRcdFx0VGVybWluYWxJZDogVGVybWluYWxJZCA/PyBEZWZhdWx0VGVybWluYWxJZCxcblx0XHRcdFx0TWVyY2hhbnRJZCxcblx0XHRcdFx0QW1vdW50LFxuXHRcdFx0XHRUcmFuc2FjdGlvbklELFxuXHRcdFx0fSxcblx0XHR9O1xuXHRcdHJldHVybiBhd2FpdCB0aGlzLnNlbmRFbmNyeXB0ZWRSZXF1ZXN0PFN0YXR1c1F1ZXJ5UmVzcG9uc2U+KE1FVEhPRC5QT1NULCBRVUVSWV9UUkFOU0FDVElPTl9BUEksIGJvZHkpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIHJlZnVuZFBheW1lbnQocGF5bG9hZDogUmVmdW5kUGF5bWVudFJlcXVlc3QpIHtcblx0XHR2YWxpZGF0ZUV4aXN0ZW5jZShwYXlsb2FkLCBcIkFtb3VudFwiLCBcIlRyYW5zYWN0aW9uSURcIiwgXCJSZWZlcmVuY2VcIik7XG5cdFx0Y29uc3QgeyBBbW91bnQsIFRyYW5zYWN0aW9uSUQsIFJlZmVyZW5jZSwgVGVybWluYWxJZCB9ID0gcGF5bG9hZDtcblx0XHRjb25zdCB7IHVzZXJOYW1lOiBVc2VyTmFtZSwgcGFzc3dvcmQ6IFBhc3N3b3JkLCB0ZXJtaW5hbElkOiBEZWZhdWx0VGVybWluYWxJZCwgbWVyY2hhbnRJZDogTWVyY2hhbnRJZCB9ID0gdGhpcy5jb25maWc7XG5cdFx0Y29uc3QgYm9keSA9IHtcblx0XHRcdFJlcXVlc3RIZWFkZXI6IHtcblx0XHRcdFx0VXNlck5hbWUsXG5cdFx0XHRcdFBhc3N3b3JkLFxuXHRcdFx0fSxcblx0XHRcdFJldmVyc2FsRGV0YWlsczoge1xuXHRcdFx0XHRNZXJjaGFudElkLFxuXHRcdFx0XHRUZXJtaW5hbElkOiBUZXJtaW5hbElkID8/IERlZmF1bHRUZXJtaW5hbElkLFxuXHRcdFx0XHRSZWZlcmVuY2UsXG5cdFx0XHRcdEFtb3VudCxcblx0XHRcdFx0VHJhbnNhY3Rpb25JRCxcblx0XHRcdH0sXG5cdFx0fTtcblx0XHRyZXR1cm4gYXdhaXQgdGhpcy5zZW5kRW5jcnlwdGVkUmVxdWVzdDxSZWZ1bmRQYXltZW50UmVzcG9uc2U+KE1FVEhPRC5QT1NULCBSRUZVTkRfUEFZTUVOVF9BUEksIGJvZHkpO1xuXHR9XG5cblx0cHJpdmF0ZSBsb2coLi4uYXJnczogYW55KSB7XG5cdFx0aWYgKHRoaXMudHJhY2UpIHtcblx0XHRcdHRoaXMubG9nZ2VyKC4uLmFyZ3MpO1xuXHRcdH1cblx0fVxufVxuIl19