rentdynamics
Version:
Package to help facilitate communicating with the Rent Dynamics API
238 lines • 33 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var jssha_1 = __importDefault(require("jssha"));
var Client = /** @class */ (function () {
function Client(options) {
this.options = options;
this.helpers = new ClientHelpers(options);
if (typeof global !== "undefined" && global && global.fetch) {
this._fetch = global.fetch.bind(global);
}
else {
var crossFetch = require('cross-fetch');
this._fetch = crossFetch;
}
}
Client.prototype.get = function (endpoint, parameters) {
if (parameters === void 0) { parameters = {}; }
var queryParams = this.helpers.stringifyParameters(parameters);
var options = {};
options.method = 'GET';
options.headers = this.helpers.getHeaders(endpoint + queryParams);
var fullUrl = this.helpers.getBaseUrl() + endpoint + queryParams;
return this._fetch(fullUrl.replace(/\|/g, '%7C'), options).then(function (result) {
return result.ok ? result.clone().json().catch(function (err) {
return result.clone().text();
}) : result;
});
};
Client.prototype.put = function (endpoint, payload) {
var options = {};
options.method = 'PUT';
options.headers = this.helpers.getHeaders(endpoint, payload);
options.body = JSON.stringify(payload);
var fullUrl = this.helpers.getBaseUrl() + endpoint;
return this._fetch(fullUrl, options).then(function (result) {
return result.ok ? result.clone().json().catch(function (err) {
return result.clone().text();
}) : result;
});
};
Client.prototype.post = function (endpoint, payload) {
var options = {};
options.method = 'POST';
options.headers = this.helpers.getHeaders(endpoint, payload);
options.body = JSON.stringify(payload);
var fullUrl = this.helpers.getBaseUrl() + endpoint;
return this._fetch(fullUrl, options).then(function (result) {
return result.ok ? result.clone().json().catch(function (err) {
return result.clone().text();
}) : result;
});
};
Client.prototype.delete = function (endpoint) {
var options = {};
options.method = 'DELETE';
options.headers = this.helpers.getHeaders(endpoint);
var fullUrl = this.helpers.getBaseUrl() + endpoint;
return this._fetch(fullUrl, options).then(function (result) {
return result.ok ? result.clone().json().catch(function (err) {
return result.clone().text();
}) : result;
});
};
Client.prototype.login = function (username, password) {
var _this = this;
var shaObj = new jssha_1.default('SHA-1', 'TEXT');
shaObj.update(password);
password = shaObj.getHash('HEX');
var endpoint = '/auth/login';
return this.post(endpoint, { username: username, password: password }).then(function (result) {
_this.options.authToken = result.token;
return result;
});
};
Client.prototype.logout = function () {
var _this = this;
var endpoint = '/auth/logout';
return this.post(endpoint, { authToken: this.options.authToken }).then(function (res) {
_this.options.authToken = undefined;
return res;
});
};
return Client;
}());
exports.Client = Client;
var ClientOptions = /** @class */ (function () {
function ClientOptions() {
this.apiKey = undefined;
this.apiSecretKey = undefined;
this.authToken = undefined;
this.development = false;
this.service = undefined;
this.developmentUrl = undefined;
this.baseUrl = undefined;
}
return ClientOptions;
}());
exports.ClientOptions = ClientOptions;
var ClientHelpers = /** @class */ (function () {
function ClientHelpers(options) {
this.options = options;
}
ClientHelpers.prototype.formatPayload = function (payload) {
var _this = this;
var formattedPayload = {};
if (typeof payload === undefined || payload === null) {
formattedPayload = null;
}
else if (payload !== Object(payload)) {
formattedPayload = payload;
}
else if (Array.isArray(payload)) {
formattedPayload = [];
for (var i = 0; i < payload.length; i++) {
formattedPayload[i] = this.formatPayload(payload[i]);
}
}
else {
Object.keys(payload).sort().forEach(function (k, v) {
if (typeof (payload[k]) == 'object') {
formattedPayload[k] = _this.formatPayload(payload[k]);
}
else if (typeof (payload[k]) == 'string') {
formattedPayload[k] = payload[k].replace(/ /g, '');
}
else {
formattedPayload[k] = payload[k];
}
}, this);
}
return formattedPayload;
};
ClientHelpers.prototype.getBaseUrl = function () {
if (this.options.development && this.options.developmentUrl) {
return this.options.developmentUrl;
}
else if (this.options.development) {
return 'https://api-dev.rentdynamics.com';
}
if (this.options.baseUrl) {
return this.options.baseUrl;
}
else {
return 'https://api.rentdynamics.com';
}
};
ClientHelpers.prototype.getHeaders = function (endpoint, payload) {
var headers = {};
if (this.options.apiKey && this.options.apiSecretKey) {
if (typeof payload !== "undefined") {
payload = this.formatPayload(payload);
}
var timestamp = Date.now();
var nonce = this.getNonce(timestamp, endpoint, JSON.stringify(payload));
if (this.options.authToken) {
headers['Authorization'] = 'TOKEN ' + this.options.authToken;
}
headers['x-rd-api-key'] = this.options.apiKey;
headers['x-rd-api-nonce'] = nonce;
headers['x-rd-timestamp'] = timestamp.toString();
headers['Content-Type'] = 'application/json';
return headers;
}
return headers;
};
ClientHelpers.prototype.getNonce = function (timestamp, endpoint, payloadStr) {
if (this.options.apiSecretKey) {
var nonceStr = timestamp + endpoint;
if (typeof payloadStr !== 'undefined') {
nonceStr += payloadStr;
}
var shaObj = new jssha_1.default('SHA-1', 'TEXT');
shaObj.setHMACKey(this.options.apiSecretKey, 'TEXT');
shaObj.update(nonceStr);
return shaObj.getHMAC('HEX');
}
else {
return '';
}
};
ClientHelpers.prototype.stringifyParameters = function (object) {
var results = [];
if (object.filters && this.stringifyFilters(object.filters))
results.push("filters=" + this.stringifyFilters(object.filters));
if (object.include && object.include.length)
results.push("include=" + object.include.join(','));
if (object.exclude && object.exclude.length)
results.push("exclude=" + object.exclude.join(','));
if (object.fields && object.fields.length)
results.push("fields=" + object.fields.join(','));
if (object.orderBy)
results.push("orderBy=" + object.orderBy);
if (object.page)
results.push("page=" + object.page);
if (object.pageSize)
results.push("pageSize=" + object.pageSize);
if (object.distinct)
results.push("distinct=true");
return results.join('&') ? "?" + results.join('&') : '';
};
ClientHelpers.prototype.mapKeyValuePairs = function (key, value) {
var results = [];
if (Array.isArray(value)) {
if (value.length)
results.push(key + "__in=" + value.join(','));
return results;
}
if (value !== null && typeof value === 'object') {
for (var filterValKey in value) {
var result = void 0;
result = this.mapKeyValuePairs(key + "__" + filterValKey, value[filterValKey]);
if (result && result.length)
results.push(result.join('|'));
}
return results;
}
if (value !== null && value !== undefined && value !== '') {
results.push(key + "=" + value);
return results;
}
return results;
};
ClientHelpers.prototype.stringifyFilters = function (filter) {
var results = [];
for (var key in filter) {
var result = this.mapKeyValuePairs(key, filter[key]);
if (result && result.length)
results.push(result.join('|'));
}
return results.join('|');
};
return ClientHelpers;
}());
exports.ClientHelpers = ClientHelpers;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxnREFBMEI7QUFJMUI7SUFNSSxnQkFBWSxPQUFzQjtRQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFDLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFO1lBQzNELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDekM7YUFBTTtZQUNMLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQztTQUMxQjtJQUNMLENBQUM7SUFFTSxvQkFBRyxHQUFWLFVBQVcsUUFBZ0IsRUFBRSxVQUF1QjtRQUF2QiwyQkFBQSxFQUFBLGVBQXVCO1FBQ2hELElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0QsSUFBSSxPQUFPLEdBQWdCLEVBQUUsQ0FBQztRQUM5QixPQUFPLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUN2QixPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsQ0FBQztRQUNsRSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxHQUFHLFFBQVEsR0FBRyxXQUFXLENBQUM7UUFDakUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FB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LFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBRS9FLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNO29CQUN6QixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUNsQztZQUNELE9BQU8sT0FBTyxDQUFDO1NBQ2hCO1FBRUQsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLEVBQUUsRUFBRTtZQUN6RCxPQUFPLENBQUMsSUFBSSxDQUFJLEdBQUcsU0FBSSxLQUFPLENBQUMsQ0FBQztZQUNoQyxPQUFPLE9BQU8sQ0FBQztTQUNoQjtRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFTyx3Q0FBZ0IsR0FBeEIsVUFBeUIsTUFBNEI7UUFDbkQsSUFBSSxPQUFPLEdBQWEsRUFBRSxDQUFDO1FBRTNCLEtBQUssSUFBSSxHQUFHLElBQUksTUFBTSxFQUFFO1lBQ3RCLElBQUksTUFBTSxHQUFhLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFL0QsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU07Z0JBQ3pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO1FBRUQsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFTCxvQkFBQztBQUFELENBQUMsQUE1SkQsSUE0SkM7QUE1Slksc0NBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQganNTSEEgZnJvbSAnanNzaGEnO1xuXG5kZWNsYXJlIHZhciBnbG9iYWw6IGFueTtcblxuZXhwb3J0IGNsYXNzIENsaWVudCB7XG5cbiAgICBwcml2YXRlIGhlbHBlcnM6IENsaWVudEhlbHBlcnM7XG4gICAgcHJpdmF0ZSBvcHRpb25zOiBDbGllbnRPcHRpb25zO1xuICAgIHB1YmxpYyBfZmV0Y2g6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IENsaWVudE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5oZWxwZXJzID0gbmV3IENsaWVudEhlbHBlcnMob3B0aW9ucyk7XG4gICAgICAgIGlmICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbCAmJiBnbG9iYWwuZmV0Y2gpIHtcbiAgICAgICAgICB0aGlzLl9mZXRjaCA9IGdsb2JhbC5mZXRjaC5iaW5kKGdsb2JhbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IGNyb3NzRmV0Y2ggPSByZXF1aXJlKCdjcm9zcy1mZXRjaCcpO1xuICAgICAgICAgIHRoaXMuX2ZldGNoID0gY3Jvc3NGZXRjaDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQoZW5kcG9pbnQ6IHN0cmluZywgcGFyYW1ldGVyczogb2JqZWN0ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBsZXQgcXVlcnlQYXJhbXMgPSB0aGlzLmhlbHBlcnMuc3RyaW5naWZ5UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTtcbiAgICAgICAgbGV0IG9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge307XG4gICAgICAgIG9wdGlvbnMubWV0aG9kID0gJ0dFVCc7XG4gICAgICAgIG9wdGlvbnMuaGVhZGVycyA9IHRoaXMuaGVscGVycy5nZXRIZWFkZXJzKGVuZHBvaW50ICsgcXVlcnlQYXJhbXMpO1xuICAgICAgICBsZXQgZnVsbFVybCA9IHRoaXMuaGVscGVycy5nZXRCYXNlVXJsKCkgKyBlbmRwb2ludCArIHF1ZXJ5UGFyYW1zO1xuICAgICAgICByZXR1cm4gdGhpcy5fZmV0Y2goZnVsbFVybC5yZXBsYWNlKC9cXHwvZywgJyU3QycpLCBvcHRpb25zKS50aGVuKChyZXN1bHQ6IFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5vayA/IHJlc3VsdC5jbG9uZSgpLmpzb24oKS5jYXRjaCgoZXJyKSA9PlxuICAgICAgICAgICAgICByZXN1bHQuY2xvbmUoKS50ZXh0KClcbiAgICAgICAgICApIDogcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHV0KGVuZHBvaW50OiBzdHJpbmcsIHBheWxvYWQ6IG9iamVjdCk6IFByb21pc2U8YW55PiB7XG4gICAgICBsZXQgb3B0aW9uczogUmVxdWVzdEluaXQgPSB7fTtcbiAgICAgIG9wdGlvbnMubWV0aG9kID0gJ1BVVCc7XG4gICAgICBvcHRpb25zLmhlYWRlcnMgPSB0aGlzLmhlbHBlcnMuZ2V0SGVhZGVycyhlbmRwb2ludCwgcGF5bG9hZCk7XG4gICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkKTtcbiAgICAgIGxldCBmdWxsVXJsID0gdGhpcy5oZWxwZXJzLmdldEJhc2VVcmwoKSArIGVuZHBvaW50O1xuICAgICAgcmV0dXJuIHRoaXMuX2ZldGNoKGZ1bGxVcmwsIG9wdGlvbnMpLnRoZW4oKHJlc3VsdDogUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0Lm9rID8gcmVzdWx0LmNsb25lKCkuanNvbigpLmNhdGNoKChlcnIpID0+XG4gICAgICAgICAgICAgIHJlc3VsdC5jbG9uZSgpLnRleHQoKVxuICAgICAgICAgICkgOiByZXN1bHQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcG9zdChlbmRwb2ludDogc3RyaW5nLCBwYXlsb2FkOiBvYmplY3QpOiBQcm9taXNlPGFueT4ge1xuICAgICAgbGV0IG9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge307XG4gICAgICBvcHRpb25zLm1ldGhvZCA9ICdQT1NUJztcbiAgICAgIG9wdGlvbnMuaGVhZGVycyA9IHRoaXMuaGVscGVycy5nZXRIZWFkZXJzKGVuZHBvaW50LCBwYXlsb2FkKTtcbiAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuICAgICAgbGV0IGZ1bGxVcmwgPSB0aGlzLmhlbHBlcnMuZ2V0QmFzZVVybCgpICsgZW5kcG9pbnQ7XG4gICAgICByZXR1cm4gdGhpcy5fZmV0Y2goZnVsbFVybCwgb3B0aW9ucykudGhlbigocmVzdWx0OiBSZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHJldHVybiByZXN1bHQub2sgPyByZXN1bHQuY2xvbmUoKS5qc29uKCkuY2F0Y2goKGVycikgPT5cbiAgICAgICAgICAgICAgcmVzdWx0LmNsb25lKCkudGV4dCgpXG4gICAgICAgICAgKSA6IHJlc3VsdDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGUoZW5kcG9pbnQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICBsZXQgb3B0aW9uczogUmVxdWVzdEluaXQgPSB7fTtcbiAgICAgIG9wdGlvbnMubWV0aG9kID0gJ0RFTEVURSc7XG4gICAgICBvcHRpb25zLmhlYWRlcnMgPSB0aGlzLmhlbHBlcnMuZ2V0SGVhZGVycyhlbmRwb2ludCk7XG4gICAgICBsZXQgZnVsbFVybCA9IHRoaXMuaGVscGVycy5nZXRCYXNlVXJsKCkgKyBlbmRwb2ludDtcbiAgICAgIHJldHVybiB0aGlzLl9mZXRjaChmdWxsVXJsLCBvcHRpb25zKS50aGVuKChyZXN1bHQ6IFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5vayA/IHJlc3VsdC5jbG9uZSgpLmpzb24oKS5jYXRjaCgoZXJyKSA9PlxuICAgICAgICAgICAgICByZXN1bHQuY2xvbmUoKS50ZXh0KClcbiAgICAgICAgICApIDogcmVzdWx0O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvZ2luKHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgbGV0IHNoYU9iaiA9IG5ldyBqc1NIQSgnU0hBLTEnLCAnVEVYVCcpO1xuICAgICAgc2hhT2JqLnVwZGF0ZShwYXNzd29yZCk7XG4gICAgICBwYXNzd29yZCA9IHNoYU9iai5nZXRIYXNoKCdIRVgnKTtcbiAgICAgIGxldCBlbmRwb2ludCA9ICcvYXV0aC9sb2dpbic7XG4gICAgICByZXR1cm4gdGhpcy5wb3N0KGVuZHBvaW50LCB7IHVzZXJuYW1lOiB1c2VybmFtZSwgcGFzc3dvcmQ6IHBhc3N3b3JkIH0pLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICB0aGlzLm9wdGlvbnMuYXV0aFRva2VuID0gcmVzdWx0LnRva2VuO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvZ291dCgpOiBQcm9taXNlPGFueT4ge1xuICAgICAgbGV0IGVuZHBvaW50ID0gJy9hdXRoL2xvZ291dCc7XG4gICAgICByZXR1cm4gdGhpcy5wb3N0KGVuZHBvaW50LCB7YXV0aFRva2VuOiB0aGlzLm9wdGlvbnMuYXV0aFRva2VufSkudGhlbigocmVzKSA9PiB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5hdXRoVG9rZW4gPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGNsYXNzIENsaWVudE9wdGlvbnMge1xuICAgIHB1YmxpYyBhcGlLZXk/OiBzdHJpbmcgPSB1bmRlZmluZWQ7XG4gICAgcHVibGljIGFwaVNlY3JldEtleT86IHN0cmluZyA9IHVuZGVmaW5lZDtcbiAgICBwdWJsaWMgYXV0aFRva2VuPzogc3RyaW5nID0gdW5kZWZpbmVkO1xuICAgIHB1YmxpYyBkZXZlbG9wbWVudD86IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgc2VydmljZT86IHN0cmluZyA9IHVuZGVmaW5lZDtcbiAgICBwdWJsaWMgZGV2ZWxvcG1lbnRVcmw/OiBzdHJpbmcgPSB1bmRlZmluZWQ7XG4gICAgcHVibGljIGJhc2VVcmw/OiBzdHJpbmcgPSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBDbGllbnRIZWxwZXJzIHtcbiAgICBwcml2YXRlIG9wdGlvbnM6IENsaWVudE9wdGlvbnM7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDbGllbnRPcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGZvcm1hdFBheWxvYWQocGF5bG9hZDogYW55KTogYW55IHtcbiAgICAgICAgbGV0IGZvcm1hdHRlZFBheWxvYWQ6YW55ID0ge307XG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSB1bmRlZmluZWQgfHwgcGF5bG9hZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgZm9ybWF0dGVkUGF5bG9hZCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAocGF5bG9hZCAhPT0gT2JqZWN0KHBheWxvYWQpKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRQYXlsb2FkID0gcGF5bG9hZDtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHBheWxvYWQpKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRQYXlsb2FkID0gW107XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF5bG9hZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGZvcm1hdHRlZFBheWxvYWRbaV0gPSB0aGlzLmZvcm1hdFBheWxvYWQocGF5bG9hZFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhwYXlsb2FkKS5zb3J0KCkuZm9yRWFjaCggKGs6YW55LCB2OmFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YocGF5bG9hZFtrXSkgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkUGF5bG9hZFtrXSA9IHRoaXMuZm9ybWF0UGF5bG9hZChwYXlsb2FkW2tdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiAocGF5bG9hZFtrXSkgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkUGF5bG9hZFtrXSA9IHBheWxvYWRba10ucmVwbGFjZSgvIC9nLCAnJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkUGF5bG9hZFtrXSA9IHBheWxvYWRba11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9ybWF0dGVkUGF5bG9hZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QmFzZVVybCgpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kZXZlbG9wbWVudCAmJiB0aGlzLm9wdGlvbnMuZGV2ZWxvcG1lbnRVcmwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZGV2ZWxvcG1lbnRVcmw7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmRldmVsb3BtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gJ2h0dHBzOi8vYXBpLWRldi5yZW50ZHluYW1pY3MuY29tJztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJhc2VVcmwpIHtcbiAgICAgICAgICAgIHJldHVybiAgdGhpcy5vcHRpb25zLmJhc2VVcmw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gJ2h0dHBzOi8vYXBpLnJlbnRkeW5hbWljcy5jb20nO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldEhlYWRlcnMoZW5kcG9pbnQ6IHN0cmluZywgcGF5bG9hZD86IE9iamVjdCkge1xuICAgICAgICBsZXQgaGVhZGVyczogYW55ID0ge307XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXBpS2V5ICYmIHRoaXMub3B0aW9ucy5hcGlTZWNyZXRLZXkpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gdGhpcy5mb3JtYXRQYXlsb2FkKHBheWxvYWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBsZXQgbm9uY2UgPSB0aGlzLmdldE5vbmNlKHRpbWVzdGFtcCwgZW5kcG9pbnQsIEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0aFRva2VuKSB7XG4gICAgICAgICAgICAgICAgaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gJ1RPS0VOICcgKyB0aGlzLm9wdGlvbnMuYXV0aFRva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGVhZGVyc1sneC1yZC1hcGkta2V5J10gPSB0aGlzLm9wdGlvbnMuYXBpS2V5O1xuICAgICAgICAgICAgaGVhZGVyc1sneC1yZC1hcGktbm9uY2UnXSA9IG5vbmNlO1xuICAgICAgICAgICAgaGVhZGVyc1sneC1yZC10aW1lc3RhbXAnXSA9IHRpbWVzdGFtcC50b1N0cmluZygpO1xuICAgICAgICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG4gICAgICAgICAgICByZXR1cm4gaGVhZGVycztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVhZGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Tm9uY2UodGltZXN0YW1wOiBudW1iZXIsIGVuZHBvaW50OiBzdHJpbmcsIHBheWxvYWRTdHI/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hcGlTZWNyZXRLZXkpIHtcbiAgICAgICAgICAgIGxldCBub25jZVN0ciA9IHRpbWVzdGFtcCArIGVuZHBvaW50O1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHBheWxvYWRTdHIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgbm9uY2VTdHIgKz0gcGF5bG9hZFN0cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBzaGFPYmogPSBuZXcganNTSEEoJ1NIQS0xJywgJ1RFWFQnKTtcbiAgICAgICAgICAgIHNoYU9iai5zZXRITUFDS2V5KHRoaXMub3B0aW9ucy5hcGlTZWNyZXRLZXksICdURVhUJyk7XG4gICAgICAgICAgICBzaGFPYmoudXBkYXRlKG5vbmNlU3RyKTtcblxuICAgICAgICAgICAgcmV0dXJuIHNoYU9iai5nZXRITUFDKCdIRVgnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RyaW5naWZ5UGFyYW1ldGVycyhvYmplY3Q6IGFueSk6IHN0cmluZyB7XG4gICAgICBsZXQgcmVzdWx0cyA9IFtdO1xuXG4gICAgICBpZiAob2JqZWN0LmZpbHRlcnMgJiYgdGhpcy5zdHJpbmdpZnlGaWx0ZXJzKG9iamVjdC5maWx0ZXJzKSlcbiAgICAgICAgcmVzdWx0cy5wdXNoKGBmaWx0ZXJzPSR7dGhpcy5zdHJpbmdpZnlGaWx0ZXJzKG9iamVjdC5maWx0ZXJzKX1gKTtcblxuICAgICAgaWYgKG9iamVjdC5pbmNsdWRlICYmIG9iamVjdC5pbmNsdWRlLmxlbmd0aClcbiAgICAgICAgcmVzdWx0cy5wdXNoKGBpbmNsdWRlPSR7b2JqZWN0LmluY2x1ZGUuam9pbignLCcpfWApO1xuXG4gICAgICBpZiAob2JqZWN0LmV4Y2x1ZGUgJiYgb2JqZWN0LmV4Y2x1ZGUubGVuZ3RoKVxuICAgICAgICByZXN1bHRzLnB1c2goYGV4Y2x1ZGU9JHtvYmplY3QuZXhjbHVkZS5qb2luKCcsJyl9YCk7XG5cbiAgICAgIGlmIChvYmplY3QuZmllbGRzICYmIG9iamVjdC5maWVsZHMubGVuZ3RoKVxuICAgICAgICByZXN1bHRzLnB1c2goYGZpZWxkcz0ke29iamVjdC5maWVsZHMuam9pbignLCcpfWApO1xuXG4gICAgICBpZiAob2JqZWN0Lm9yZGVyQnkpXG4gICAgICAgIHJlc3VsdHMucHVzaChgb3JkZXJCeT0ke29iamVjdC5vcmRlckJ5fWApO1xuXG4gICAgICBpZiAob2JqZWN0LnBhZ2UpXG4gICAgICAgIHJlc3VsdHMucHVzaChgcGFnZT0ke29iamVjdC5wYWdlfWApO1xuXG4gICAgICBpZiAob2JqZWN0LnBhZ2VTaXplKVxuICAgICAgICByZXN1bHRzLnB1c2goYHBhZ2VTaXplPSR7b2JqZWN0LnBhZ2VTaXplfWApO1xuXG4gICAgICBpZiAob2JqZWN0LmRpc3RpbmN0KVxuICAgICAgICByZXN1bHRzLnB1c2goYGRpc3RpbmN0PXRydWVgKTtcblxuICAgICAgcmV0dXJuIHJlc3VsdHMuam9pbignJicpID8gYD8ke3Jlc3VsdHMuam9pbignJicpfWAgOiAnJztcbiAgICB9XG5cbiAgICBwcml2YXRlIG1hcEtleVZhbHVlUGFpcnMoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBzdHJpbmdbXSB7XG4gICAgICBsZXQgcmVzdWx0czogc3RyaW5nW10gPSBbXTtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGgpXG4gICAgICAgICAgcmVzdWx0cy5wdXNoKGAke2tleX1fX2luPSR7dmFsdWUuam9pbignLCcpfWApXG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3IgKHZhciBmaWx0ZXJWYWxLZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgICBsZXQgcmVzdWx0OiBzdHJpbmdbXTtcblxuICAgICAgICAgIHJlc3VsdCA9IHRoaXMubWFwS2V5VmFsdWVQYWlycyhgJHtrZXl9X18ke2ZpbHRlclZhbEtleX1gLCB2YWx1ZVtmaWx0ZXJWYWxLZXldKTtcblxuICAgICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0Lmxlbmd0aClcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQuam9pbignfCcpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09ICcnKSB7XG4gICAgICAgIHJlc3VsdHMucHVzaChgJHtrZXl9PSR7dmFsdWV9YCk7XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0cmluZ2lmeUZpbHRlcnMoZmlsdGVyOiB7W2tleTogc3RyaW5nXTogYW55fSk6IHN0cmluZyB7XG4gICAgICBsZXQgcmVzdWx0czogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIGZpbHRlcikge1xuICAgICAgICBsZXQgcmVzdWx0OiBzdHJpbmdbXSA9IHRoaXMubWFwS2V5VmFsdWVQYWlycyhrZXksIGZpbHRlcltrZXldKTtcblxuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5sZW5ndGgpXG4gICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdC5qb2luKCd8JykpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0cy5qb2luKCd8Jyk7XG4gICAgfVxuXG59XG4iXX0=