parse-server 5.2.1 → 5.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -20,6 +20,14 @@ const crypto = require('crypto');
|
|
|
20
20
|
|
|
21
21
|
const https = require('https');
|
|
22
22
|
|
|
23
|
+
const {
|
|
24
|
+
pki
|
|
25
|
+
} = require('node-forge');
|
|
26
|
+
|
|
27
|
+
const ca = {
|
|
28
|
+
cert: null,
|
|
29
|
+
url: null
|
|
30
|
+
};
|
|
23
31
|
const cache = {}; // (publicKey -> cert) cache
|
|
24
32
|
|
|
25
33
|
function verifyPublicKeyUrl(publicKeyUrl) {
|
|
@@ -54,34 +62,60 @@ async function getAppleCertificate(publicKeyUrl) {
|
|
|
54
62
|
path: url.pathname,
|
|
55
63
|
method: 'HEAD'
|
|
56
64
|
};
|
|
57
|
-
const
|
|
65
|
+
const cert_headers = await new Promise((resolve, reject) => https.get(headOptions, res => resolve(res.headers)).on('error', reject));
|
|
66
|
+
const validContentTypes = ['application/x-x509-ca-cert', 'application/pkix-cert'];
|
|
58
67
|
|
|
59
|
-
if (
|
|
68
|
+
if (!validContentTypes.includes(cert_headers['content-type']) || cert_headers['content-length'] == null || cert_headers['content-length'] > 10000) {
|
|
60
69
|
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `Apple Game Center - invalid publicKeyUrl: ${publicKeyUrl}`);
|
|
61
70
|
}
|
|
62
71
|
|
|
72
|
+
const {
|
|
73
|
+
certificate,
|
|
74
|
+
headers
|
|
75
|
+
} = await getCertificate(publicKeyUrl);
|
|
76
|
+
|
|
77
|
+
if (headers['cache-control']) {
|
|
78
|
+
const expire = headers['cache-control'].match(/max-age=([0-9]+)/);
|
|
79
|
+
|
|
80
|
+
if (expire) {
|
|
81
|
+
cache[publicKeyUrl] = certificate; // we'll expire the cache entry later, as per max-age
|
|
82
|
+
|
|
83
|
+
setTimeout(() => {
|
|
84
|
+
delete cache[publicKeyUrl];
|
|
85
|
+
}, parseInt(expire[1], 10) * 1000);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return verifyPublicKeyIssuer(certificate, publicKeyUrl);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function getCertificate(url, buffer) {
|
|
63
93
|
return new Promise((resolve, reject) => {
|
|
64
|
-
https.get(
|
|
65
|
-
|
|
94
|
+
https.get(url, res => {
|
|
95
|
+
const data = [];
|
|
66
96
|
res.on('data', chunk => {
|
|
67
|
-
data
|
|
97
|
+
data.push(chunk);
|
|
68
98
|
});
|
|
69
99
|
res.on('end', () => {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
100
|
+
if (buffer) {
|
|
101
|
+
resolve({
|
|
102
|
+
certificate: Buffer.concat(data),
|
|
103
|
+
headers: res.headers
|
|
104
|
+
});
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
74
107
|
|
|
75
|
-
|
|
76
|
-
cache[publicKeyUrl] = cert; // we'll expire the cache entry later, as per max-age
|
|
108
|
+
let cert = '';
|
|
77
109
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}, parseInt(expire[1], 10) * 1000);
|
|
81
|
-
}
|
|
110
|
+
for (const chunk of data) {
|
|
111
|
+
cert += chunk.toString('base64');
|
|
82
112
|
}
|
|
83
113
|
|
|
84
|
-
|
|
114
|
+
const certificate = convertX509CertToPEM(cert);
|
|
115
|
+
resolve({
|
|
116
|
+
certificate,
|
|
117
|
+
headers: res.headers
|
|
118
|
+
});
|
|
85
119
|
});
|
|
86
120
|
}).on('error', reject);
|
|
87
121
|
});
|
|
@@ -106,6 +140,24 @@ function verifySignature(publicKey, authData) {
|
|
|
106
140
|
if (!verifier.verify(publicKey, authData.signature, 'base64')) {
|
|
107
141
|
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Apple Game Center - invalid signature');
|
|
108
142
|
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function verifyPublicKeyIssuer(cert, publicKeyUrl) {
|
|
146
|
+
const publicKeyCert = pki.certificateFromPem(cert);
|
|
147
|
+
|
|
148
|
+
if (!ca.cert) {
|
|
149
|
+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Apple Game Center auth adapter parameter `rootCertificateURL` is invalid.');
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
try {
|
|
153
|
+
if (!ca.cert.verify(publicKeyCert)) {
|
|
154
|
+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `Apple Game Center - invalid publicKeyUrl: ${publicKeyUrl}`);
|
|
155
|
+
}
|
|
156
|
+
} catch (e) {
|
|
157
|
+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `Apple Game Center - invalid publicKeyUrl: ${publicKeyUrl}`);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return cert;
|
|
109
161
|
} // Returns a promise that fulfills if this user id is valid.
|
|
110
162
|
|
|
111
163
|
|
|
@@ -120,12 +172,31 @@ async function validateAuthData(authData) {
|
|
|
120
172
|
} // Returns a promise that fulfills if this app id is valid.
|
|
121
173
|
|
|
122
174
|
|
|
123
|
-
function validateAppId() {
|
|
124
|
-
|
|
175
|
+
async function validateAppId(appIds, authData, options = {}) {
|
|
176
|
+
if (!options.rootCertificateUrl) {
|
|
177
|
+
options.rootCertificateUrl = 'https://cacerts.digicert.com/DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crt.pem';
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
if (ca.url === options.rootCertificateUrl) {
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const {
|
|
185
|
+
certificate,
|
|
186
|
+
headers
|
|
187
|
+
} = await getCertificate(options.rootCertificateUrl, true);
|
|
188
|
+
|
|
189
|
+
if (headers['content-type'] !== 'application/x-pem-file' || headers['content-length'] == null || headers['content-length'] > 10000) {
|
|
190
|
+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Apple Game Center auth adapter parameter `rootCertificateURL` is invalid.');
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
ca.cert = pki.certificateFromPem(certificate);
|
|
194
|
+
ca.url = options.rootCertificateUrl;
|
|
125
195
|
}
|
|
126
196
|
|
|
127
197
|
module.exports = {
|
|
128
198
|
validateAppId,
|
|
129
|
-
validateAuthData
|
|
199
|
+
validateAuthData,
|
|
200
|
+
cache
|
|
130
201
|
};
|
|
131
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2djZW50ZXIuanMiXSwibmFtZXMiOlsiUGFyc2UiLCJyZXF1aXJlIiwiY3J5cHRvIiwiaHR0cHMiLCJjYWNoZSIsInZlcmlmeVB1YmxpY0tleVVybCIsInB1YmxpY0tleVVybCIsInJlZ2V4IiwidGVzdCIsImVycm9yIiwiY29udmVydFg1MDlDZXJ0VG9QRU0iLCJYNTA5Q2VydCIsInBlbVByZUZpeCIsInBlbVBvc3RGaXgiLCJiYXNlNjQiLCJjZXJ0Qm9keSIsIm1hdGNoIiwiUmVnRXhwIiwiam9pbiIsImdldEFwcGxlQ2VydGlmaWNhdGUiLCJFcnJvciIsIk9CSkVDVF9OT1RfRk9VTkQiLCJ1cmwiLCJVUkwiLCJoZWFkT3B0aW9ucyIsImhvc3RuYW1lIiwicGF0aCIsInBhdGhuYW1lIiwibWV0aG9kIiwiaGVhZGVycyIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZ2V0IiwicmVzIiwib24iLCJkYXRhIiwiY2h1bmsiLCJ0b1N0cmluZyIsImNlcnQiLCJleHBpcmUiLCJzZXRUaW1lb3V0IiwicGFyc2VJbnQiLCJjb252ZXJ0VGltZXN0YW1wVG9CaWdFbmRpYW4iLCJ0aW1lc3RhbXAiLCJidWZmZXIiLCJCdWZmZXIiLCJhbGxvYyIsImhpZ2giLCJsb3ciLCJ3cml0ZVVJbnQzMkJFIiwidmVyaWZ5U2lnbmF0dXJlIiwicHVibGljS2V5IiwiYXV0aERhdGEiLCJ2ZXJpZmllciIsImNyZWF0ZVZlcmlmeSIsInVwZGF0ZSIsInBsYXllcklkIiwiYnVuZGxlSWQiLCJzYWx0IiwidmVyaWZ5Iiwic2lnbmF0dXJlIiwidmFsaWRhdGVBdXRoRGF0YSIsImlkIiwidmFsaWRhdGVBcHBJZCIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsTUFBTTtBQUFFQSxFQUFBQTtBQUFGLElB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QXRCO0FBQ0QsQyxDQUVEOzs7QUFDQSxTQUFTVyxhQUFULEdBQXlCO0FBQ3ZCLFNBQU9sQyxPQUFPLENBQUNDLE9BQVIsRUFBUDtBQUNEOztBQUVEa0MsTUFBTSxDQUFDQyxPQUFQLEdBQWlCO0FBQ2ZGLEVBQUFBLGFBRGU7QUFFZkYsRUFBQUE7QUFGZSxDQUFqQiIsInNvdXJjZXNDb250ZW50IjpbIi8qIEFwcGxlIEdhbWUgQ2VudGVyIEF1dGhcbmh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL2dhbWVraXQvZ2tsb2NhbHBsYXllci8xNTE1NDA3LWdlbmVyYXRlaWRlbnRpdHl2ZXJpZmljYXRpb25zaWduI2Rpc2N1c3Npb25cblxuY29uc3QgYXV0aERhdGEgPSB7XG4gIHB1YmxpY0tleVVybDogJ2h0dHBzOi8vdmFsaWQuYXBwbGUuY29tL3B1YmxpYy90aW1lb3V0LmNlcicsXG4gIHRpbWVzdGFtcDogMTQ2MDk4MTQyMTMwMyxcbiAgc2lnbmF0dXJlOiAnUG9Ed2YzOURDTjQ2NEI0OWpKQ1UwZDlZMEonLFxuICBzYWx0OiAnc2FsdFNUPT0nLFxuICBidW5kbGVJZDogJ2NvbS52YWxpZC5hcHAnXG4gIGlkOiAncGxheWVySWQnLFxufTtcbiovXG5cbmNvbnN0IHsgUGFyc2UgfSA9IHJlcXVpcmUoJ3BhcnNlL25vZGUnKTtcbmNvbnN0IGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuY29uc3QgaHR0cHMgPSByZXF1aXJlKCdodHRwcycpO1xuXG5jb25zdCBjYWNoZSA9IHt9OyAvLyAocHVibGljS2V5IC0+IGNlcnQpIGNhY2hlXG5cbmZ1bmN0aW9uIHZlcmlmeVB1YmxpY0tleVVybChwdWJsaWNLZXlVcmwpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZWdleCA9IC9eaHR0cHM6XFwvXFwvKD86Wy1fQS1aYS16MC05XStcXC4pezAsfWFwcGxlXFwuY29tXFwvLipcXC5jZXIkLztcbiAgICByZXR1cm4gcmVnZXgudGVzdChwdWJsaWNLZXlVcmwpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb252ZXJ0WDUwOUNlcnRUb1BFTShYNTA5Q2VydCkge1xuICBjb25zdCBwZW1QcmVGaXggPSAnLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXFxuJztcbiAgY29uc3QgcGVtUG9zdEZpeCA9ICctLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tJztcblxuICBjb25zdCBiYXNlNjQgPSBYNTA5Q2VydDtcbiAgY29uc3QgY2VydEJvZHkgPSBiYXNlNjQubWF0Y2gobmV3IFJlZ0V4cCgnLnswLDY0fScsICdnJykpLmpvaW4oJ1xcbicpO1xuXG4gIHJldHVybiBwZW1QcmVGaXggKyBjZXJ0Qm9keSArIHBlbVBvc3RGaXg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFwcGxlQ2VydGlmaWNhdGUocHVibGljS2V5VXJsKSB7XG4gIGlmICghdmVyaWZ5UHVibGljS2V5VXJsKHB1YmxpY0tleVVybCkpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgYEFwcGxlIEdhbWUgQ2VudGVyIC0gaW52YWxpZCBwdWJsaWNLZXlVcmw6ICR7cHVibGljS2V5VXJsfWBcbiAgICApO1xuICB9XG4gIGlmIChjYWNoZVtwdWJsaWNLZXlVcmxdKSB7XG4gICAgcmV0dXJuIGNhY2hlW3B1YmxpY0tleVVybF07XG4gIH1cbiAgY29uc3QgdXJsID0gbmV3IFVSTChwdWJsaWNLZXlVcmwpO1xuICBjb25zdCBoZWFkT3B0aW9ucyA9IHtcbiAgICBob3N0bmFtZTogdXJsLmhvc3RuYW1lLFxuICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICBtZXRob2Q6ICdIRUFEJyxcbiAgfTtcbiAgY29uc3QgaGVhZGVycyA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAgaHR0cHMuZ2V0KGhlYWRPcHRpb25zLCByZXMgPT4gcmVzb2x2ZShyZXMuaGVhZGVycykpLm9uKCdlcnJvcicsIHJlamVjdClcbiAgKTtcbiAgaWYgKFxuICAgIGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddICE9PSAnYXBwbGljYXRpb24vcGtpeC1jZXJ0JyB8fFxuICAgIGhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10gPT0gbnVsbCB8fFxuICAgIGhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10gPiAxMDAwMFxuICApIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgYEFwcGxlIEdhbWUgQ2VudGVyIC0gaW52YWxpZCBwdWJsaWNLZXlVcmw6ICR7cHVibGljS2V5VXJsfWBcbiAgICApO1xuICB9XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgaHR0cHNcbiAgICAgIC5nZXQocHVibGljS2V5VXJsLCByZXMgPT4ge1xuICAgICAgICBsZXQgZGF0YSA9ICcnO1xuICAgICAgICByZXMub24oJ2RhdGEnLCBjaHVuayA9PiB7XG4gICAgICAgICAgZGF0YSArPSBjaHVuay50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXMub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBjZXJ0ID0gY29udmVydFg1MDlDZXJ0VG9QRU0oZGF0YSk7XG4gICAgICAgICAgaWYgKHJlcy5oZWFkZXJzWydjYWNoZS1jb250cm9sJ10pIHtcbiAgICAgICAgICAgIHZhciBleHBpcmUgPSByZXMuaGVhZGVyc1snY2FjaGUtY29udHJvbCddLm1hdGNoKC9tYXgtYWdlPShbMC05XSspLyk7XG4gICAgICAgICAgICBpZiAoZXhwaXJlKSB7XG4gICAgICAgICAgICAgIGNhY2hlW3B1YmxpY0tleVVybF0gPSBjZXJ0O1xuICAgICAgICAgICAgICAvLyB3ZSdsbCBleHBpcmUgdGhlIGNhY2hlIGVudHJ5IGxhdGVyLCBhcyBwZXIgbWF4LWFnZVxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVbcHVibGljS2V5VXJsXTtcbiAgICAgICAgICAgICAgfSwgcGFyc2VJbnQoZXhwaXJlWzFdLCAxMCkgKiAxMDAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZShjZXJ0KTtcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VGltZXN0YW1wVG9CaWdFbmRpYW4odGltZXN0YW1wKSB7XG4gIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg4KTtcblxuICBjb25zdCBoaWdoID0gfn4odGltZXN0YW1wIC8gMHhmZmZmZmZmZik7XG4gIGNvbnN0IGxvdyA9IHRpbWVzdGFtcCAlICgweGZmZmZmZmZmICsgMHgxKTtcblxuICBidWZmZXIud3JpdGVVSW50MzJCRShwYXJzZUludChoaWdoLCAxMCksIDApO1xuICBidWZmZXIud3JpdGVVSW50MzJCRShwYXJzZUludChsb3csIDEwKSwgNCk7XG5cbiAgcmV0dXJuIGJ1ZmZlcjtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5U2lnbmF0dXJlKHB1YmxpY0tleSwgYXV0aERhdGEpIHtcbiAgY29uc3QgdmVyaWZpZXIgPSBjcnlwdG8uY3JlYXRlVmVyaWZ5KCdzaGEyNTYnKTtcbiAgdmVyaWZpZXIudXBkYXRlKGF1dGhEYXRhLnBsYXllcklkLCAndXRmOCcpO1xuICB2ZXJpZmllci51cGRhdGUoYXV0aERhdGEuYnVuZGxlSWQsICd1dGY4Jyk7XG4gIHZlcmlmaWVyLnVwZGF0ZShjb252ZXJ0VGltZXN0YW1wVG9CaWdFbmRpYW4oYXV0aERhdGEudGltZXN0YW1wKSk7XG4gIHZlcmlmaWVyLnVwZGF0ZShhdXRoRGF0YS5zYWx0LCAnYmFzZTY0Jyk7XG5cbiAgaWYgKCF2ZXJpZmllci52ZXJpZnkocHVibGljS2V5LCBhdXRoRGF0YS5zaWduYXR1cmUsICdiYXNlNjQnKSkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnQXBwbGUgR2FtZSBDZW50ZXIgLSBpbnZhbGlkIHNpZ25hdHVyZScpO1xuICB9XG59XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgaWYgdGhpcyB1c2VyIGlkIGlzIHZhbGlkLlxuYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVBdXRoRGF0YShhdXRoRGF0YSkge1xuICBpZiAoIWF1dGhEYXRhLmlkKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdBcHBsZSBHYW1lIENlbnRlciAtIGF1dGhEYXRhIGlkIG1pc3NpbmcnKTtcbiAgfVxuICBhdXRoRGF0YS5wbGF5ZXJJZCA9IGF1dGhEYXRhLmlkO1xuICBjb25zdCBwdWJsaWNLZXkgPSBhd2FpdCBnZXRBcHBsZUNlcnRpZmljYXRlKGF1dGhEYXRhLnB1YmxpY0tleVVybCk7XG4gIHJldHVybiB2ZXJpZnlTaWduYXR1cmUocHVibGljS2V5LCBhdXRoRGF0YSk7XG59XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgaWYgdGhpcyBhcHAgaWQgaXMgdmFsaWQuXG5mdW5jdGlvbiB2YWxpZGF0ZUFwcElkKCkge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB2YWxpZGF0ZUFwcElkLFxuICB2YWxpZGF0ZUF1dGhEYXRhLFxufTtcbiJdfQ==
|
|
202
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2djZW50ZXIuanMiXSwibmFtZXMiOlsiUGFyc2UiLCJyZXF1aXJlIiwiY3J5cHRvIiwiaHR0cHMiLCJwa2kiLCJjYSIsImNlcnQiLCJ1cmwiLCJjYWNoZSIsInZlcmlmeVB1YmxpY0tleVVybCIsInB1YmxpY0tleVVybCIsInJlZ2V4IiwidGVzdCIsImVycm9yIiwiY29udmVydFg1MDlDZXJ0VG9QRU0iLCJYNTA5Q2VydCIsInBlbVByZUZpeCIsInBlbVBvc3RGaXgiLCJiYXNlNjQiLCJjZXJ0Qm9keSIsIm1hdGNoIiwiUmVnRXhwIiwiam9pbiIsImdldEFwcGxlQ2VydGlmaWNhdGUiLCJFcnJvciIsIk9CSkVDVF9OT1RfRk9VTkQiLCJVUkwiLCJoZWFkT3B0aW9ucyIsImhvc3RuYW1lIiwicGF0aCIsInBhdGhuYW1lIiwibWV0aG9kIiwiY2VydF9oZWFkZXJzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJnZXQiLCJyZXMiLCJoZWFkZXJzIiwib24iLCJ2YWxpZENvbnRlbnRUeXBlcyIsImluY2x1ZGVzIiwiY2VydGlmaWNhdGUiLCJnZXRDZXJ0aWZpY2F0ZSIsImV4cGlyZSIsInNldFRpbWVvdXQiLCJwYXJzZUludCIsInZlcmlmeVB1YmxpY0tleUlzc3VlciIsImJ1ZmZlciIsImRhdGEiLCJjaHVuayIsInB1c2giLCJCdWZmZXIiLCJjb25jYXQiLCJ0b1N0cmluZyIsImNvbnZlcnRUaW1lc3RhbXBUb0JpZ0VuZGlhbiIsInRpbWVzdGFtcCIsImFsbG9jIiwiaGlnaCIsImxvdyIsIndyaXRlVUludDMyQkUiLCJ2ZXJpZnlTaWduYXR1cmUiLCJwdWJsaWNLZXkiLCJhdXRoRGF0YSIsInZlcmlmaWVyIiwiY3JlYXRlVmVyaWZ5IiwidXBkYXRlIiwicGxheWVySWQiLCJidW5kbGVJZCIsInNhbHQiLCJ2ZXJpZnkiLCJzaWduYXR1cmUiLCJwdWJsaWNLZXlDZXJ0IiwiY2VydGlmaWNhdGVGcm9tUGVtIiwiZSIsInZhbGlkYXRlQXV0aERhdGEiLCJpZCIsInZhbGlkYXRlQXBwSWQiLCJhcHBJZHMiLCJvcHRpb25zIiwicm9vdENlcnRpZmljYXRlVXJsIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxNQUFNO0FBQUVBLEVBQUFBO0FBQUYsSUFBWUMsT0FBTyxDQUFDLFlBQUQsQ0FBekI7O0FBQ0EsTUFBTUMsTUFBTSxHQUFHRCxPQUFPLENBQUMsUUFBRCxDQUF0Qjs7QUFDQSxNQUFNRSxLQUFLLEdBQUdGLE9BQU8sQ0FBQyxPQUFELENBQXJCOztBQUNBLE1BQU07QUFBRUcsRUFBQUE7QUFBRixJQUFVSCxPQUFPLENBQUMsWUFBRCxDQUF2Qjs7QUFDQSxNQUFNSSxFQUFFLEdBQUc7QUFBRUMsRUFBQUEsSUFBSSxFQUFFLElBQVI7QUFBY0MsRUFBQUEsR0FBRyxFQUFFO0FBQW5CLENBQVg7QUFDQSxNQUFNQyxLQUFLLEdBQUcsRUFBZCxDLENBQWtCOztBQUVsQixTQUFTQyxrQkFBVCxDQUE0QkMsWUFBNUIsRUFBMEM7QUFDeEMsTUFBSTtBQUNGLFVBQU1DLEtBQUssR0FBRyx5REFBZDtBQUNBLFdBQU9BLEtBQUssQ0FBQ0MsSUFBTixDQUFXRixZQUFYLENBQVA7QUFDRCxHQUhELENBR0UsT0FBT0csS0FBUCxFQUFjO0FBQ2QsV0FBTyxLQUFQO0FBQ0Q7QUFDRjs7QUFFRCxTQUFTQyxvQkFBVCxDQUE4QkMsUUFBOUIsRUFBd0M7QUFDdEMsUUFBTUMsU0FBUyxHQUFHLCtCQUFsQjtBQUNBLFFBQU1DLFVBQVUsR0FBRywyQkFBbkI7QUFFQSxRQUFNQyxNQUFNLEdBQUdILFFBQWY7QUFDQSxRQUFNSSxRQUFRLEdBQUdELE1BQU0sQ0FBQ0UsS0FBUCxDQUFhLElBQUlDLE1BQUosQ0FBVyxTQUFYLEVBQXNCLEdBQXRCLENBQWIsRUFBeUNDLElBQXpDLENBQThDLElBQTlDLENBQWpC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QWYsTUFBMkIsTUFBTUssY0FBYyxDQUFDb0MsT0FBTyxDQUFDQyxrQkFBVCxFQUE2QixJQUE3QixDQUFyRDs7QUFDQSxNQUNFMUMsT0FBTyxDQUFDLGNBQUQsQ0FBUCxLQUE0Qix3QkFBNUIsSUFDQUEsT0FBTyxDQUFDLGdCQUFELENBQVAsSUFBNkIsSUFEN0IsSUFFQUEsT0FBTyxDQUFDLGdCQUFELENBQVAsR0FBNEIsS0FIOUIsRUFJRTtBQUNBLFVBQU0sSUFBSXRDLEtBQUssQ0FBQ3dCLEtBQVYsQ0FDSnhCLEtBQUssQ0FBQ3dCLEtBQU4sQ0FBWUMsZ0JBRFIsRUFFSiwyRUFGSSxDQUFOO0FBSUQ7O0FBQ0RwQixFQUFBQSxFQUFFLENBQUNDLElBQUgsR0FBVUYsR0FBRyxDQUFDcUUsa0JBQUosQ0FBdUIvQixXQUF2QixDQUFWO0FBQ0FyQyxFQUFBQSxFQUFFLENBQUNFLEdBQUgsR0FBU3dFLE9BQU8sQ0FBQ0Msa0JBQWpCO0FBQ0Q7O0FBRURDLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjtBQUNmTCxFQUFBQSxhQURlO0FBRWZGLEVBQUFBLGdCQUZlO0FBR2ZuRSxFQUFBQTtBQUhlLENBQWpCIiwic291cmNlc0NvbnRlbnQiOlsiLyogQXBwbGUgR2FtZSBDZW50ZXIgQXV0aFxuaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24vZ2FtZWtpdC9na2xvY2FscGxheWVyLzE1MTU0MDctZ2VuZXJhdGVpZGVudGl0eXZlcmlmaWNhdGlvbnNpZ24jZGlzY3Vzc2lvblxuXG5jb25zdCBhdXRoRGF0YSA9IHtcbiAgcHVibGljS2V5VXJsOiAnaHR0cHM6Ly92YWxpZC5hcHBsZS5jb20vcHVibGljL3RpbWVvdXQuY2VyJyxcbiAgdGltZXN0YW1wOiAxNDYwOTgxNDIxMzAzLFxuICBzaWduYXR1cmU6ICdQb0R3ZjM5RENONDY0QjQ5akpDVTBkOVkwSicsXG4gIHNhbHQ6ICdzYWx0U1Q9PScsXG4gIGJ1bmRsZUlkOiAnY29tLnZhbGlkLmFwcCdcbiAgaWQ6ICdwbGF5ZXJJZCcsXG59O1xuKi9cblxuY29uc3QgeyBQYXJzZSB9ID0gcmVxdWlyZSgncGFyc2Uvbm9kZScpO1xuY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5jb25zdCBodHRwcyA9IHJlcXVpcmUoJ2h0dHBzJyk7XG5jb25zdCB7IHBraSB9ID0gcmVxdWlyZSgnbm9kZS1mb3JnZScpO1xuY29uc3QgY2EgPSB7IGNlcnQ6IG51bGwsIHVybDogbnVsbCB9O1xuY29uc3QgY2FjaGUgPSB7fTsgLy8gKHB1YmxpY0tleSAtPiBjZXJ0KSBjYWNoZVxuXG5mdW5jdGlvbiB2ZXJpZnlQdWJsaWNLZXlVcmwocHVibGljS2V5VXJsKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVnZXggPSAvXmh0dHBzOlxcL1xcLyg/OlstX0EtWmEtejAtOV0rXFwuKXswLH1hcHBsZVxcLmNvbVxcLy4qXFwuY2VyJC87XG4gICAgcmV0dXJuIHJlZ2V4LnRlc3QocHVibGljS2V5VXJsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29udmVydFg1MDlDZXJ0VG9QRU0oWDUwOUNlcnQpIHtcbiAgY29uc3QgcGVtUHJlRml4ID0gJy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxcbic7XG4gIGNvbnN0IHBlbVBvc3RGaXggPSAnLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLSc7XG5cbiAgY29uc3QgYmFzZTY0ID0gWDUwOUNlcnQ7XG4gIGNvbnN0IGNlcnRCb2R5ID0gYmFzZTY0Lm1hdGNoKG5ldyBSZWdFeHAoJy57MCw2NH0nLCAnZycpKS5qb2luKCdcXG4nKTtcblxuICByZXR1cm4gcGVtUHJlRml4ICsgY2VydEJvZHkgKyBwZW1Qb3N0Rml4O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBcHBsZUNlcnRpZmljYXRlKHB1YmxpY0tleVVybCkge1xuICBpZiAoIXZlcmlmeVB1YmxpY0tleVVybChwdWJsaWNLZXlVcmwpKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgIGBBcHBsZSBHYW1lIENlbnRlciAtIGludmFsaWQgcHVibGljS2V5VXJsOiAke3B1YmxpY0tleVVybH1gXG4gICAgKTtcbiAgfVxuICBpZiAoY2FjaGVbcHVibGljS2V5VXJsXSkge1xuICAgIHJldHVybiBjYWNoZVtwdWJsaWNLZXlVcmxdO1xuICB9XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwocHVibGljS2V5VXJsKTtcbiAgY29uc3QgaGVhZE9wdGlvbnMgPSB7XG4gICAgaG9zdG5hbWU6IHVybC5ob3N0bmFtZSxcbiAgICBwYXRoOiB1cmwucGF0aG5hbWUsXG4gICAgbWV0aG9kOiAnSEVBRCcsXG4gIH07XG4gIGNvbnN0IGNlcnRfaGVhZGVycyA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAgaHR0cHMuZ2V0KGhlYWRPcHRpb25zLCByZXMgPT4gcmVzb2x2ZShyZXMuaGVhZGVycykpLm9uKCdlcnJvcicsIHJlamVjdClcbiAgKTtcbiAgY29uc3QgdmFsaWRDb250ZW50VHlwZXMgPSBbJ2FwcGxpY2F0aW9uL3gteDUwOS1jYS1jZXJ0JywgJ2FwcGxpY2F0aW9uL3BraXgtY2VydCddO1xuICBpZiAoXG4gICAgIXZhbGlkQ29udGVudFR5cGVzLmluY2x1ZGVzKGNlcnRfaGVhZGVyc1snY29udGVudC10eXBlJ10pIHx8XG4gICAgY2VydF9oZWFkZXJzWydjb250ZW50LWxlbmd0aCddID09IG51bGwgfHxcbiAgICBjZXJ0X2hlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10gPiAxMDAwMFxuICApIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgYEFwcGxlIEdhbWUgQ2VudGVyIC0gaW52YWxpZCBwdWJsaWNLZXlVcmw6ICR7cHVibGljS2V5VXJsfWBcbiAgICApO1xuICB9XG4gIGNvbnN0IHsgY2VydGlmaWNhdGUsIGhlYWRlcnMgfSA9IGF3YWl0IGdldENlcnRpZmljYXRlKHB1YmxpY0tleVVybCk7XG4gIGlmIChoZWFkZXJzWydjYWNoZS1jb250cm9sJ10pIHtcbiAgICBjb25zdCBleHBpcmUgPSBoZWFkZXJzWydjYWNoZS1jb250cm9sJ10ubWF0Y2goL21heC1hZ2U9KFswLTldKykvKTtcbiAgICBpZiAoZXhwaXJlKSB7XG4gICAgICBjYWNoZVtwdWJsaWNLZXlVcmxdID0gY2VydGlmaWNhdGU7XG4gICAgICAvLyB3ZSdsbCBleHBpcmUgdGhlIGNhY2hlIGVudHJ5IGxhdGVyLCBhcyBwZXIgbWF4LWFnZVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGRlbGV0ZSBjYWNoZVtwdWJsaWNLZXlVcmxdO1xuICAgICAgfSwgcGFyc2VJbnQoZXhwaXJlWzFdLCAxMCkgKiAxMDAwKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZlcmlmeVB1YmxpY0tleUlzc3VlcihjZXJ0aWZpY2F0ZSwgcHVibGljS2V5VXJsKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2VydGlmaWNhdGUodXJsLCBidWZmZXIpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBodHRwc1xuICAgICAgLmdldCh1cmwsIHJlcyA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBbXTtcbiAgICAgICAgcmVzLm9uKCdkYXRhJywgY2h1bmsgPT4ge1xuICAgICAgICAgIGRhdGEucHVzaChjaHVuayk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXMub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICBpZiAoYnVmZmVyKSB7XG4gICAgICAgICAgICByZXNvbHZlKHsgY2VydGlmaWNhdGU6IEJ1ZmZlci5jb25jYXQoZGF0YSksIGhlYWRlcnM6IHJlcy5oZWFkZXJzIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgY2VydCA9ICcnO1xuICAgICAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgZGF0YSkge1xuICAgICAgICAgICAgY2VydCArPSBjaHVuay50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGNlcnRpZmljYXRlID0gY29udmVydFg1MDlDZXJ0VG9QRU0oY2VydCk7XG4gICAgICAgICAgcmVzb2x2ZSh7IGNlcnRpZmljYXRlLCBoZWFkZXJzOiByZXMuaGVhZGVycyB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VGltZXN0YW1wVG9CaWdFbmRpYW4odGltZXN0YW1wKSB7XG4gIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg4KTtcblxuICBjb25zdCBoaWdoID0gfn4odGltZXN0YW1wIC8gMHhmZmZmZmZmZik7XG4gIGNvbnN0IGxvdyA9IHRpbWVzdGFtcCAlICgweGZmZmZmZmZmICsgMHgxKTtcblxuICBidWZmZXIud3JpdGVVSW50MzJCRShwYXJzZUludChoaWdoLCAxMCksIDApO1xuICBidWZmZXIud3JpdGVVSW50MzJCRShwYXJzZUludChsb3csIDEwKSwgNCk7XG5cbiAgcmV0dXJuIGJ1ZmZlcjtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5U2lnbmF0dXJlKHB1YmxpY0tleSwgYXV0aERhdGEpIHtcbiAgY29uc3QgdmVyaWZpZXIgPSBjcnlwdG8uY3JlYXRlVmVyaWZ5KCdzaGEyNTYnKTtcbiAgdmVyaWZpZXIudXBkYXRlKGF1dGhEYXRhLnBsYXllcklkLCAndXRmOCcpO1xuICB2ZXJpZmllci51cGRhdGUoYXV0aERhdGEuYnVuZGxlSWQsICd1dGY4Jyk7XG4gIHZlcmlmaWVyLnVwZGF0ZShjb252ZXJ0VGltZXN0YW1wVG9CaWdFbmRpYW4oYXV0aERhdGEudGltZXN0YW1wKSk7XG4gIHZlcmlmaWVyLnVwZGF0ZShhdXRoRGF0YS5zYWx0LCAnYmFzZTY0Jyk7XG5cbiAgaWYgKCF2ZXJpZmllci52ZXJpZnkocHVibGljS2V5LCBhdXRoRGF0YS5zaWduYXR1cmUsICdiYXNlNjQnKSkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnQXBwbGUgR2FtZSBDZW50ZXIgLSBpbnZhbGlkIHNpZ25hdHVyZScpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZlcmlmeVB1YmxpY0tleUlzc3VlcihjZXJ0LCBwdWJsaWNLZXlVcmwpIHtcbiAgY29uc3QgcHVibGljS2V5Q2VydCA9IHBraS5jZXJ0aWZpY2F0ZUZyb21QZW0oY2VydCk7XG4gIGlmICghY2EuY2VydCkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsXG4gICAgICAnQXBwbGUgR2FtZSBDZW50ZXIgYXV0aCBhZGFwdGVyIHBhcmFtZXRlciBgcm9vdENlcnRpZmljYXRlVVJMYCBpcyBpbnZhbGlkLidcbiAgICApO1xuICB9XG4gIHRyeSB7XG4gICAgaWYgKCFjYS5jZXJ0LnZlcmlmeShwdWJsaWNLZXlDZXJ0KSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgICBgQXBwbGUgR2FtZSBDZW50ZXIgLSBpbnZhbGlkIHB1YmxpY0tleVVybDogJHtwdWJsaWNLZXlVcmx9YFxuICAgICAgKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgYEFwcGxlIEdhbWUgQ2VudGVyIC0gaW52YWxpZCBwdWJsaWNLZXlVcmw6ICR7cHVibGljS2V5VXJsfWBcbiAgICApO1xuICB9XG4gIHJldHVybiBjZXJ0O1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmIHRoaXMgdXNlciBpZCBpcyB2YWxpZC5cbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlQXV0aERhdGEoYXV0aERhdGEpIHtcbiAgaWYgKCFhdXRoRGF0YS5pZCkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnQXBwbGUgR2FtZSBDZW50ZXIgLSBhdXRoRGF0YSBpZCBtaXNzaW5nJyk7XG4gIH1cbiAgYXV0aERhdGEucGxheWVySWQgPSBhdXRoRGF0YS5pZDtcbiAgY29uc3QgcHVibGljS2V5ID0gYXdhaXQgZ2V0QXBwbGVDZXJ0aWZpY2F0ZShhdXRoRGF0YS5wdWJsaWNLZXlVcmwpO1xuICByZXR1cm4gdmVyaWZ5U2lnbmF0dXJlKHB1YmxpY0tleSwgYXV0aERhdGEpO1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmIHRoaXMgYXBwIGlkIGlzIHZhbGlkLlxuYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVBcHBJZChhcHBJZHMsIGF1dGhEYXRhLCBvcHRpb25zID0ge30pIHtcbiAgaWYgKCFvcHRpb25zLnJvb3RDZXJ0aWZpY2F0ZVVybCkge1xuICAgIG9wdGlvbnMucm9vdENlcnRpZmljYXRlVXJsID1cbiAgICAgICdodHRwczovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcnQucGVtJztcbiAgfVxuICBpZiAoY2EudXJsID09PSBvcHRpb25zLnJvb3RDZXJ0aWZpY2F0ZVVybCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB7IGNlcnRpZmljYXRlLCBoZWFkZXJzIH0gPSBhd2FpdCBnZXRDZXJ0aWZpY2F0ZShvcHRpb25zLnJvb3RDZXJ0aWZpY2F0ZVVybCwgdHJ1ZSk7XG4gIGlmIChcbiAgICBoZWFkZXJzWydjb250ZW50LXR5cGUnXSAhPT0gJ2FwcGxpY2F0aW9uL3gtcGVtLWZpbGUnIHx8XG4gICAgaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA9PSBudWxsIHx8XG4gICAgaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA+IDEwMDAwXG4gICkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsXG4gICAgICAnQXBwbGUgR2FtZSBDZW50ZXIgYXV0aCBhZGFwdGVyIHBhcmFtZXRlciBgcm9vdENlcnRpZmljYXRlVVJMYCBpcyBpbnZhbGlkLidcbiAgICApO1xuICB9XG4gIGNhLmNlcnQgPSBwa2kuY2VydGlmaWNhdGVGcm9tUGVtKGNlcnRpZmljYXRlKTtcbiAgY2EudXJsID0gb3B0aW9ucy5yb290Q2VydGlmaWNhdGVVcmw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB2YWxpZGF0ZUFwcElkLFxuICB2YWxpZGF0ZUF1dGhEYXRhLFxuICBjYWNoZSxcbn07XG4iXX0=
|