tedious
Version:
A TDS driver, for connecting to MS SQLServer databases.
133 lines (132 loc) • 23.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _writableTrackingBuffer = _interopRequireDefault(require("./tracking-buffer/writable-tracking-buffer"));
var crypto = _interopRequireWildcard(require("crypto"));
var _jsMd = _interopRequireDefault(require("js-md4"));
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
class NTLMResponsePayload {
constructor(loginData) {
this.data = this.createResponse(loginData);
}
toString(indent = '') {
return indent + 'NTLM Auth';
}
createResponse(challenge) {
const client_nonce = this.createClientNonce();
const lmv2len = 24;
const ntlmv2len = 16;
const domain = challenge.domain;
const username = challenge.userName;
const password = challenge.password;
const ntlmData = challenge.ntlmpacket;
const server_data = ntlmData.target;
const server_nonce = ntlmData.nonce;
const data = new _writableTrackingBuffer.default();
data.writeString('NTLMSSP\u0000', 'utf8');
data.writeUInt32LE(0x03);
const baseIdx = 64;
const dnIdx = baseIdx;
const unIdx = dnIdx + domain.length * 2;
const l2Idx = unIdx + username.length * 2;
const ntIdx = l2Idx + lmv2len;
data.writeUInt16LE(lmv2len);
data.writeUInt16LE(lmv2len);
data.writeUInt32LE(l2Idx);
data.writeUInt16LE(ntlmv2len);
data.writeUInt16LE(ntlmv2len);
data.writeUInt32LE(ntIdx);
data.writeUInt16LE(domain.length * 2);
data.writeUInt16LE(domain.length * 2);
data.writeUInt32LE(dnIdx);
data.writeUInt16LE(username.length * 2);
data.writeUInt16LE(username.length * 2);
data.writeUInt32LE(unIdx);
data.writeUInt16LE(0);
data.writeUInt16LE(0);
data.writeUInt32LE(baseIdx);
data.writeUInt16LE(0);
data.writeUInt16LE(0);
data.writeUInt32LE(baseIdx);
data.writeUInt16LE(0x8201);
data.writeUInt16LE(0x08);
data.writeString(domain, 'ucs2');
data.writeString(username, 'ucs2');
const lmv2Data = this.lmv2Response(domain, username, password, server_nonce, client_nonce);
data.writeBuffer(lmv2Data);
const genTime = new Date().getTime();
const ntlmDataBuffer = this.ntlmv2Response(domain, username, password, server_nonce, server_data, client_nonce, genTime);
data.writeBuffer(ntlmDataBuffer);
data.writeUInt32LE(0x0101);
data.writeUInt32LE(0x0000);
const timestamp = this.createTimestamp(genTime);
data.writeBuffer(timestamp);
data.writeBuffer(client_nonce);
data.writeUInt32LE(0x0000);
data.writeBuffer(server_data);
data.writeUInt32LE(0x0000);
return data.data;
}
createClientNonce() {
const client_nonce = Buffer.alloc(8, 0);
let nidx = 0;
while (nidx < 8) {
client_nonce.writeUInt8(Math.ceil(Math.random() * 255), nidx);
nidx++;
}
return client_nonce;
}
ntlmv2Response(domain, user, password, serverNonce, targetInfo, clientNonce, mytime) {
const timestamp = this.createTimestamp(mytime);
const hash = this.ntv2Hash(domain, user, password);
const dataLength = 40 + targetInfo.length;
const data = Buffer.alloc(dataLength, 0);
serverNonce.copy(data, 0, 0, 8);
data.writeUInt32LE(0x101, 8);
data.writeUInt32LE(0x0, 12);
timestamp.copy(data, 16, 0, 8);
clientNonce.copy(data, 24, 0, 8);
data.writeUInt32LE(0x0, 32);
targetInfo.copy(data, 36, 0, targetInfo.length);
data.writeUInt32LE(0x0, 36 + targetInfo.length);
return this.hmacMD5(data, hash);
}
createTimestamp(time) {
const tenthsOfAMicrosecond = (BigInt(time) + BigInt(11644473600)) * BigInt(10000000);
const lo = Number(tenthsOfAMicrosecond & BigInt(0xffffffff));
const hi = Number(tenthsOfAMicrosecond >> BigInt(32) & BigInt(0xffffffff));
const result = Buffer.alloc(8);
result.writeUInt32LE(lo, 0);
result.writeUInt32LE(hi, 4);
return result;
}
lmv2Response(domain, user, password, serverNonce, clientNonce) {
const hash = this.ntv2Hash(domain, user, password);
const data = Buffer.alloc(serverNonce.length + clientNonce.length, 0);
serverNonce.copy(data);
clientNonce.copy(data, serverNonce.length, 0, clientNonce.length);
const newhash = this.hmacMD5(data, hash);
const response = Buffer.alloc(newhash.length + clientNonce.length, 0);
newhash.copy(response);
clientNonce.copy(response, newhash.length, 0, clientNonce.length);
return response;
}
ntv2Hash(domain, user, password) {
const hash = this.ntHash(password);
const identity = Buffer.from(user.toUpperCase() + domain.toUpperCase(), 'ucs2');
return this.hmacMD5(identity, hash);
}
ntHash(text) {
const unicodeString = Buffer.from(text, 'ucs2');
return Buffer.from(_jsMd.default.arrayBuffer(unicodeString));
}
hmacMD5(data, key) {
return crypto.createHmac('MD5', key).update(data).digest();
}
}
var _default = exports.default = NTLMResponsePayload;
module.exports = NTLMResponsePayload;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd3JpdGFibGVUcmFja2luZ0J1ZmZlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiY3J5cHRvIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfanNNZCIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJzZXQiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIk5UTE1SZXNwb25zZVBheWxvYWQiLCJjb25zdHJ1Y3RvciIsImxvZ2luRGF0YSIsImRhdGEiLCJjcmVhdGVSZXNwb25zZSIsInRvU3RyaW5nIiwiaW5kZW50IiwiY2hhbGxlbmdlIiwiY2xpZW50X25vbmNlIiwiY3JlYXRlQ2xpZW50Tm9uY2UiLCJsbXYybGVuIiwibnRsbXYybGVuIiwiZG9tYWluIiwidXNlcm5hbWUiLCJ1c2VyTmFtZSIsInBhc3N3b3JkIiwibnRsbURhdGEiLCJudGxtcGFja2V0Iiwic2VydmVyX2RhdGEiLCJ0YXJnZXQiLCJzZXJ2ZXJfbm9uY2UiLCJub25jZSIsIldyaXRhYmxlVHJhY2tpbmdCdWZmZXIiLCJ3cml0ZVN0cmluZyIsIndyaXRlVUludDMyTEUiLCJiYXNlSWR4IiwiZG5JZHgiLCJ1bklkeCIsImxlbmd0aCIsImwySWR4IiwibnRJZHgiLCJ3cml0ZVVJbnQxNkxFIiwibG12MkRhdGEiLCJsbXYyUmVzcG9uc2UiLCJ3cml0ZUJ1ZmZlciIsImdlblRpbWUiLCJEYXRlIiwiZ2V0VGltZSIsIm50bG1EYXRhQnVmZmVyIiwibnRsbXYyUmVzcG9uc2UiLCJ0aW1lc3RhbXAiLCJjcmVhdGVUaW1lc3RhbXAiLCJCdWZmZXIiLCJhbGxvYyIsIm5pZHgiLCJ3cml0ZVVJbnQ4IiwiTWF0aCIsImNlaWwiLCJyYW5kb20iLCJ1c2VyIiwic2VydmVyTm9uY2UiLCJ0YXJnZXRJbmZvIiwiY2xpZW50Tm9uY2UiLCJteXRpbWUiLCJoYXNoIiwibnR2Mkhhc2giLCJkYXRhTGVuZ3RoIiwiY29weSIsImhtYWNNRDUiLCJ0aW1lIiwidGVudGhzT2ZBTWljcm9zZWNvbmQiLCJCaWdJbnQiLCJsbyIsIk51bWJlciIsImhpIiwicmVzdWx0IiwibmV3aGFzaCIsInJlc3BvbnNlIiwibnRIYXNoIiwiaWRlbnRpdHkiLCJmcm9tIiwidG9VcHBlckNhc2UiLCJ0ZXh0IiwidW5pY29kZVN0cmluZyIsIm1kNCIsImFycmF5QnVmZmVyIiwia2V5IiwiY3JlYXRlSG1hYyIsInVwZGF0ZSIsImRpZ2VzdCIsIl9kZWZhdWx0IiwiZXhwb3J0cyIsIm1vZHVsZSJdLCJzb3VyY2VzIjpbIi4uL3NyYy9udGxtLXBheWxvYWQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIgZnJvbSAnLi90cmFja2luZy1idWZmZXIvd3JpdGFibGUtdHJhY2tpbmctYnVmZmVyJztcbmltcG9ydCAqIGFzIGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IG1kNCBmcm9tICdqcy1tZDQnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGRvbWFpbjogc3RyaW5nO1xuICB1c2VyTmFtZTogc3RyaW5nO1xuICBwYXNzd29yZDogc3RyaW5nO1xuICBudGxtcGFja2V0OiB7XG4gICAgdGFyZ2V0OiBCdWZmZXI7XG4gICAgbm9uY2U6IEJ1ZmZlcjtcbiAgfTtcbn1cblxuY2xhc3MgTlRMTVJlc3BvbnNlUGF5bG9hZCB7XG4gIGRlY2xhcmUgZGF0YTogQnVmZmVyO1xuXG4gIGNvbnN0cnVjdG9yKGxvZ2luRGF0YTogT3B0aW9ucykge1xuICAgIHRoaXMuZGF0YSA9IHRoaXMuY3JlYXRlUmVzcG9uc2UobG9naW5EYXRhKTtcbiAgfVxuXG4gIHRvU3RyaW5nKGluZGVudCA9ICcnKSB7XG4gICAgcmV0dXJuIGluZGVudCArICdOVExNIEF1dGgnO1xuICB9XG5cbiAgY3JlYXRlUmVzcG9uc2UoY2hhbGxlbmdlOiBPcHRpb25zKSB7XG4gICAgY29uc3QgY2xpZW50X25vbmNlID0gdGhpcy5jcmVhdGVDbGllbnROb25jZSgpO1xuICAgIGNvbnN0IGxtdjJsZW4gPSAyNDtcbiAgICBjb25zdCBudGxtdjJsZW4gPSAxNjtcbiAgICBjb25zdCBkb21haW4gPSBjaGFsbGVuZ2UuZG9tYWluO1xuICAgIGNvbnN0IHVzZXJuYW1lID0gY2hhbGxlbmdlLnVzZXJOYW1lO1xuICAgIGNvbnN0IHBhc3N3b3JkID0gY2hhbGxlbmdlLnBhc3N3b3JkO1xuICAgIGNvbnN0IG50bG1EYXRhID0gY2hhbGxlbmdlLm50bG1wYWNrZXQ7XG4gICAgY29uc3Qgc2VydmVyX2RhdGEgPSBudGxtRGF0YS50YXJnZXQ7XG4gICAgY29uc3Qgc2VydmVyX25vbmNlID0gbnRsbURhdGEubm9uY2U7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBXcml0YWJsZVRyYWNraW5nQnVmZmVyKCk7XG4gICAgZGF0YS53cml0ZVN0cmluZygnTlRMTVNTUFxcdTAwMDAnLCAndXRmOCcpO1xuICAgIGRhdGEud3JpdGVVSW50MzJMRSgweDAzKTtcbiAgICBjb25zdCBiYXNlSWR4ID0gNjQ7XG4gICAgY29uc3QgZG5JZHggPSBiYXNlSWR4O1xuICAgIGNvbnN0IHVuSWR4ID0gZG5JZHggKyBkb21haW4ubGVuZ3RoICogMjtcbiAgICBjb25zdCBsMklkeCA9IHVuSWR4ICsgdXNlcm5hbWUubGVuZ3RoICogMjtcbiAgICBjb25zdCBudElkeCA9IGwySWR4ICsgbG12MmxlbjtcbiAgICBkYXRhLndyaXRlVUludDE2TEUobG12Mmxlbik7XG4gICAgZGF0YS53cml0ZVVJbnQxNkxFKGxtdjJsZW4pO1xuICAgIGRhdGEud3JpdGVVSW50MzJMRShsMklkeCk7XG4gICAgZGF0YS53cml0ZVVJbnQxNkxFKG50bG12Mmxlbik7XG4gICAgZGF0YS53cml0ZVVJbnQxNkxFKG50bG12Mmxlbik7XG4gICAgZGF0YS53cml0ZVVJbnQzMkxFKG50SWR4KTtcbiAgICBkYXRhLndyaXRlVUludDE2TEUoZG9tYWluLmxlbmd0aCAqIDIpO1xuICAgIGRhdGEud3JpdGVVSW50MTZMRShkb21haW4ubGVuZ3RoICogMik7XG4gICAgZGF0YS53cml0ZVVJbnQzMkxFKGRuSWR4KTtcbiAgICBkYXRhLndyaXRlVUludDE2TEUodXNlcm5hbWUubGVuZ3RoICogMik7XG4gICAgZGF0YS53cml0ZVVJbnQxNkxFKHVzZXJuYW1lLmxlbmd0aCAqIDIpO1xuICAgIGRhdGEud3JpdGVVSW50MzJMRSh1bklkeCk7XG4gICAgZGF0YS53cml0ZVVJbnQxNkxFKDApO1xuICAgIGRhdGEud3JpdGVVSW50MTZMRSgwKTtcbiAgICBkYXRhLndyaXRlVUludDMyTEUoYmFzZUlkeCk7XG4gICAgZGF0YS53cml0ZVVJbnQxNkxFKDApO1xuICAgIGRhdGEud3JpdGVVSW50MTZMRSgwKTtcbiAgICBkYXRhLndyaXRlVUludDMyTEUoYmFzZUlkeCk7XG4gICAgZGF0YS53cml0ZVVJbnQxNkxFKDB4ODIwMSk7XG4gICAgZGF0YS53cml0ZVVJbnQxNkxFKDB4MDgpO1xuICAgIGRhdGEud3JpdGVTdHJpbmcoZG9tYWluLCAndWNzMicpO1xuICAgIGRhdGEud3JpdGVTdHJpbmcodXNlcm5hbWUsICd1Y3MyJyk7XG4gICAgY29uc3QgbG12MkRhdGEgPSB0aGlzLmxtdjJSZXNwb25zZShkb21haW4sIHVzZXJuYW1lLCBwYXNzd29yZCwgc2VydmVyX25vbmNlLCBjbGllbnRfbm9uY2UpO1xuICAgIGRhdGEud3JpdGVCdWZmZXIobG12MkRhdGEpO1xuICAgIGNvbnN0IGdlblRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICBjb25zdCBudGxtRGF0YUJ1ZmZlciA9IHRoaXMubnRsbXYyUmVzcG9uc2UoZG9tYWluLCB1c2VybmFtZSwgcGFzc3dvcmQsIHNlcnZlcl9ub25jZSwgc2VydmVyX2RhdGEsIGNsaWVudF9ub25jZSwgZ2VuVGltZSk7XG4gICAgZGF0YS53cml0ZUJ1ZmZlcihudGxtRGF0YUJ1ZmZlcik7XG4gICAgZGF0YS53cml0ZVVJbnQzMkxFKDB4MDEwMSk7XG4gICAgZGF0YS53cml0ZVVJbnQzMkxFKDB4MDAwMCk7XG4gICAgY29uc3QgdGltZXN0YW1wID0gdGhpcy5jcmVhdGVUaW1lc3RhbXAoZ2VuVGltZSk7XG4gICAgZGF0YS53cml0ZUJ1ZmZlcih0aW1lc3RhbXApO1xuICAgIGRhdGEud3JpdGVCdWZmZXIoY2xpZW50X25vbmNlKTtcbiAgICBkYXRhLndyaXRlVUludDMyTEUoMHgwMDAwKTtcbiAgICBkYXRhLndyaXRlQnVmZmVyKHNlcnZlcl9kYXRhKTtcbiAgICBkYXRhLndyaXRlVUludDMyTEUoMHgwMDAwKTtcbiAgICByZXR1cm4gZGF0YS5kYXRhO1xuICB9XG5cbiAgY3JlYXRlQ2xpZW50Tm9uY2UoKSB7XG4gICAgY29uc3QgY2xpZW50X25vbmNlID0gQnVmZmVyLmFsbG9jKDgsIDApO1xuICAgIGxldCBuaWR4ID0gMDtcbiAgICB3aGlsZSAobmlkeCA8IDgpIHtcbiAgICAgIGNsaWVudF9ub25jZS53cml0ZVVJbnQ4KE1hdGguY2VpbChNYXRoLnJhbmRvbSgpICogMjU1KSwgbmlkeCk7XG4gICAgICBuaWR4Kys7XG4gICAgfVxuICAgIHJldHVybiBjbGllbnRfbm9uY2U7XG4gIH1cblxuICBudGxtdjJSZXNwb25zZShkb21haW46IHN0cmluZywgdXNlcjogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nLCBzZXJ2ZXJOb25jZTogQnVmZmVyLCB0YXJnZXRJbmZvOiBCdWZmZXIsIGNsaWVudE5vbmNlOiBCdWZmZXIsIG15dGltZTogbnVtYmVyKSB7XG4gICAgY29uc3QgdGltZXN0YW1wID0gdGhpcy5jcmVhdGVUaW1lc3RhbXAobXl0aW1lKTtcbiAgICBjb25zdCBoYXNoID0gdGhpcy5udHYySGFzaChkb21haW4sIHVzZXIsIHBhc3N3b3JkKTtcbiAgICBjb25zdCBkYXRhTGVuZ3RoID0gNDAgKyB0YXJnZXRJbmZvLmxlbmd0aDtcbiAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKGRhdGFMZW5ndGgsIDApO1xuICAgIHNlcnZlck5vbmNlLmNvcHkoZGF0YSwgMCwgMCwgOCk7XG4gICAgZGF0YS53cml0ZVVJbnQzMkxFKDB4MTAxLCA4KTtcbiAgICBkYXRhLndyaXRlVUludDMyTEUoMHgwLCAxMik7XG4gICAgdGltZXN0YW1wLmNvcHkoZGF0YSwgMTYsIDAsIDgpO1xuICAgIGNsaWVudE5vbmNlLmNvcHkoZGF0YSwgMjQsIDAsIDgpO1xuICAgIGRhdGEud3JpdGVVSW50MzJMRSgweDAsIDMyKTtcbiAgICB0YXJnZXRJbmZvLmNvcHkoZGF0YSwgMzYsIDAsIHRhcmdldEluZm8ubGVuZ3RoKTtcbiAgICBkYXRhLndyaXRlVUludDMyTEUoMHgwLCAzNiArIHRhcmdldEluZm8ubGVuZ3RoKTtcbiAgICByZXR1cm4gdGhpcy5obWFjTUQ1KGRhdGEsIGhhc2gpO1xuICB9XG5cbiAgY3JlYXRlVGltZXN0YW1wKHRpbWU6IG51bWJlcikge1xuICAgIGNvbnN0IHRlbnRoc09mQU1pY3Jvc2Vjb25kID0gKEJpZ0ludCh0aW1lKSArIEJpZ0ludCgxMTY0NDQ3MzYwMCkpICogQmlnSW50KDEwMDAwMDAwKTtcblxuICAgIGNvbnN0IGxvID0gTnVtYmVyKHRlbnRoc09mQU1pY3Jvc2Vjb25kICYgQmlnSW50KDB4ZmZmZmZmZmYpKTtcbiAgICBjb25zdCBoaSA9IE51bWJlcigodGVudGhzT2ZBTWljcm9zZWNvbmQgPj4gQmlnSW50KDMyKSkgJiBCaWdJbnQoMHhmZmZmZmZmZikpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gQnVmZmVyLmFsbG9jKDgpO1xuICAgIHJlc3VsdC53cml0ZVVJbnQzMkxFKGxvLCAwKTtcbiAgICByZXN1bHQud3JpdGVVSW50MzJMRShoaSwgNCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGxtdjJSZXNwb25zZShkb21haW46IHN0cmluZywgdXNlcjogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nLCBzZXJ2ZXJOb25jZTogQnVmZmVyLCBjbGllbnROb25jZTogQnVmZmVyKSB7XG4gICAgY29uc3QgaGFzaCA9IHRoaXMubnR2Mkhhc2goZG9tYWluLCB1c2VyLCBwYXNzd29yZCk7XG4gICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyhzZXJ2ZXJOb25jZS5sZW5ndGggKyBjbGllbnROb25jZS5sZW5ndGgsIDApO1xuXG4gICAgc2VydmVyTm9uY2UuY29weShkYXRhKTtcbiAgICBjbGllbnROb25jZS5jb3B5KGRhdGEsIHNlcnZlck5vbmNlLmxlbmd0aCwgMCwgY2xpZW50Tm9uY2UubGVuZ3RoKTtcblxuICAgIGNvbnN0IG5ld2hhc2ggPSB0aGlzLmhtYWNNRDUoZGF0YSwgaGFzaCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBCdWZmZXIuYWxsb2MobmV3aGFzaC5sZW5ndGggKyBjbGllbnROb25jZS5sZW5ndGgsIDApO1xuXG4gICAgbmV3aGFzaC5jb3B5KHJlc3BvbnNlKTtcbiAgICBjbGllbnROb25jZS5jb3B5KHJlc3BvbnNlLCBuZXdoYXNoLmxlbmd0aCwgMCwgY2xpZW50Tm9uY2UubGVuZ3RoKTtcblxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIG50djJIYXNoKGRvbWFpbjogc3RyaW5nLCB1c2VyOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBoYXNoID0gdGhpcy5udEhhc2gocGFzc3dvcmQpO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gQnVmZmVyLmZyb20odXNlci50b1VwcGVyQ2FzZSgpICsgZG9tYWluLnRvVXBwZXJDYXNlKCksICd1Y3MyJyk7XG4gICAgcmV0dXJuIHRoaXMuaG1hY01ENShpZGVudGl0eSwgaGFzaCk7XG4gIH1cblxuICBudEhhc2godGV4dDogc3RyaW5nKSB7XG4gICAgY29uc3QgdW5pY29kZVN0cmluZyA9IEJ1ZmZlci5mcm9tKHRleHQsICd1Y3MyJyk7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKG1kNC5hcnJheUJ1ZmZlcih1bmljb2RlU3RyaW5nKSk7XG4gIH1cblxuICBobWFjTUQ1KGRhdGE6IEJ1ZmZlciwga2V5OiBCdWZmZXIpIHtcbiAgICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhtYWMoJ01ENScsIGtleSkudXBkYXRlKGRhdGEpLmRpZ2VzdCgpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE5UTE1SZXNwb25zZVBheWxvYWQ7XG5tb2R1bGUuZXhwb3J0cyA9IE5UTE1SZXNwb25zZVBheWxvYWQ7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLHVCQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFDLHVCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxLQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFBeUIsU0FBQUUsd0JBQUFFLENBQUEsRUFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxNQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFKLHVCQUFBLFlBQUFBLENBQUFFLENBQUEsRUFBQUMsQ0FBQSxTQUFBQSxDQUFBLElBQUFELENBQUEsSUFBQUEsQ0FBQSxDQUFBSyxVQUFBLFNBQUFMLENBQUEsTUFBQU0sQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsS0FBQUMsU0FBQSxRQUFBQyxPQUFBLEVBQUFWLENBQUEsaUJBQUFBLENBQUEsdUJBQUFBLENBQUEseUJBQUFBLENBQUEsU0FBQVEsQ0FBQSxNQUFBRixDQUFBLEdBQUFMLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLFFBQUFHLENBQUEsQ0FBQUssR0FBQSxDQUFBWCxDQUFBLFVBQUFNLENBQUEsQ0FBQU0sR0FBQSxDQUFBWixDQUFBLEdBQUFNLENBQUEsQ0FBQU8sR0FBQSxDQUFBYixDQUFBLEVBQUFRLENBQUEsZ0JBQUFQLENBQUEsSUFBQUQsQ0FBQSxnQkFBQUMsQ0FBQSxPQUFBYSxjQUFBLENBQUFDLElBQUEsQ0FBQWYsQ0FBQSxFQUFBQyxDQUFBLE9BQUFNLENBQUEsSUFBQUQsQ0FBQSxHQUFBVSxNQUFBLENBQUFDLGNBQUEsS0FB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