@bitgo-beta/sdk-coin-icp 1.0.1-beta.827 → 1.0.1-beta.829
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.
- package/dist/src/icp.d.ts +11 -3
- package/dist/src/icp.d.ts.map +1 -1
- package/dist/src/icp.js +35 -4
- package/dist/src/lib/iface.d.ts +5 -1
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/utils.d.ts +2 -2
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +14 -7
- package/dist/test/unit/icp.js +183 -11
- package/dist/test/unit/utils.js +10 -10
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
package/dist/src/lib/utils.js
CHANGED
|
@@ -98,8 +98,15 @@ class Utils {
|
|
|
98
98
|
return undefined;
|
|
99
99
|
}
|
|
100
100
|
const [rootAddress, memoId] = address.split('?memoId=');
|
|
101
|
-
if (memoId
|
|
102
|
-
|
|
101
|
+
if (memoId) {
|
|
102
|
+
try {
|
|
103
|
+
if (this.validateMemo(BigInt(memoId))) {
|
|
104
|
+
return rootAddress;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
103
110
|
}
|
|
104
111
|
return address;
|
|
105
112
|
}
|
|
@@ -223,8 +230,8 @@ class Utils {
|
|
|
223
230
|
const publicKeyBuffer = Buffer.from(publicKeyHex, 'hex');
|
|
224
231
|
const ellipticKey = secp256k1_1.secp256k1.ProjectivePoint.fromHex(publicKeyBuffer.toString('hex'));
|
|
225
232
|
const uncompressedPublicKeyHex = ellipticKey.toHex(false);
|
|
226
|
-
const
|
|
227
|
-
return
|
|
233
|
+
const uncompressedKeyBuffer = Buffer.from(uncompressedPublicKeyHex, 'hex');
|
|
234
|
+
return agent.wrapDER(uncompressedKeyBuffer.buffer.slice(uncompressedKeyBuffer.byteOffset, uncompressedKeyBuffer.byteOffset + uncompressedKeyBuffer.byteLength), agent.SECP256K1_OID);
|
|
228
235
|
}
|
|
229
236
|
/**
|
|
230
237
|
* Converts a public key in hexadecimal format to a Dfinity Principal ID.
|
|
@@ -278,10 +285,10 @@ class Utils {
|
|
|
278
285
|
* Retrieves the address associated with a given hex-encoded public key.
|
|
279
286
|
*
|
|
280
287
|
* @param {string} hexEncodedPublicKey - The public key in hex-encoded format.
|
|
281
|
-
* @returns {
|
|
288
|
+
* @returns {string} The address derived from the provided public key.
|
|
282
289
|
* @throws {Error} Throws an error if the provided public key is not in a valid hex-encoded format.
|
|
283
290
|
*/
|
|
284
|
-
|
|
291
|
+
getAddressFromPublicKey(hexEncodedPublicKey) {
|
|
285
292
|
if (!this.isValidPublicKey(hexEncodedPublicKey)) {
|
|
286
293
|
throw new Error('Invalid hex-encoded public key format.');
|
|
287
294
|
}
|
|
@@ -722,4 +729,4 @@ class Utils {
|
|
|
722
729
|
exports.Utils = Utils;
|
|
723
730
|
const utils = new Utils();
|
|
724
731
|
exports.default = utils;
|
|
725
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQU84QjtBQUM5QixrREFBbUU7QUFDbkUsc0RBQXdDO0FBQ3hDLG9EQUE0QjtBQUM1QixvREFBMkI7QUFDM0IsbUNBWWlCO0FBQ2pCLHVDQUFrRDtBQUNsRCxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUNuRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLGdNQUFnTTtBQUNyUSwwREFBa0M7QUFDbEMsZ0VBQXFDO0FBQ3JDLHVEQUFvRDtBQUVwRCxvQ0FBb0M7QUFDcEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUM7SUFDMUIsZUFBZSxFQUFFLEtBQUs7SUFDdEIsU0FBUyxFQUFFLEtBQUs7SUFDaEIsYUFBYSxFQUFFLEtBQUs7SUFDcEIsa0JBQWtCLEVBQUUsS0FBSztDQUMxQixDQUFDLENBQUM7QUFFSCxNQUFhLEtBQUs7SUFBbEI7UUE0bkJFLGdCQUFXLEdBQUcsQ0FBQyxVQUFrQixFQUFFLFVBQWtCLEVBQVUsRUFBRTtZQUMvRCxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2RCxNQUFNLFdBQVcsR0FBRyxnQkFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckcsTUFBTSxTQUFTLEdBQUcscUJBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLGVB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Q0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RSxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsMEJBQTBCLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEUsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELDBCQUEwQixDQUFDLFdBQWtDO1FBQzNELElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNwQyxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQ3BDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxnQkFBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkQsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdFLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDaEQsQ0FBQztDQUNGO0FBcHRCRCxzQkFvdEJDO0FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztBQUMxQixrQkFBZSxLQUFLLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCYXNlVXRpbHMsXG4gIEtleVBhaXIsXG4gIFBhcnNlVHJhbnNhY3Rpb25FcnJvcixcbiAgUmVjaXBpZW50LFxuICBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsXG4gIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IFByaW5jaXBhbCBhcyBEZmluaXR5UHJpbmNpcGFsIH0gZnJvbSAnQGRmaW5pdHkvcHJpbmNpcGFsJztcbmltcG9ydCAqIGFzIGFnZW50IGZyb20gJ0BkZmluaXR5L2FnZW50JztcbmltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCBjcmMzMiBmcm9tICdjcmMtMzInO1xuaW1wb3J0IHtcbiAgSHR0cENhbmlzdGVyVXBkYXRlLFxuICBJY3BUcmFuc2FjdGlvbkRhdGEsXG4gIFJlcXVlc3RUeXBlLFxuICBTaWduYXR1cmVzLFxuICBNZXRhRGF0YSxcbiAgU2VuZEFyZ3MsXG4gIFBheWxvYWRzRGF0YSxcbiAgQ3VydmVUeXBlLFxuICBBY2NvdW50SWRlbnRpZmllckhhc2gsXG4gIENib3JVbnNpZ25lZFRyYW5zYWN0aW9uLFxuICBNQVhfSU5HUkVTU19UVEwsXG59IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgS2V5UGFpciBhcyBJY3BLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcbmNvbnN0IG1lc3NhZ2VDb21waWxlZCA9IHJlcXVpcmUoJy4uLy4uL3Jlc291cmNlcy9tZXNzYWdlQ29tcGlsZWQnKTtcbmNvbnN0IHsgZW5jb2RlLCBkZWNvZGUsIEVuY29kZXIgfSA9IHJlcXVpcmUoJ2Nib3IteC9pbmRleC1uby1ldmFsJyk7IC8vIFRoZSBcImNib3IteFwiIGxpYnJhcnkgaXMgdXNlZCBoZXJlIGJlY2F1c2UgaXQgc3VwcG9ydHMgbW9kZXJuIGZlYXR1cmVzIGxpa2UgQmlnSW50LiBkbyBub3QgcmVwbGFjZSBpdCB3aXRoIFwiY2JvciBhcyBcImNib3JcIiBpcyBub3QgY29tcGF0aWJsZSB3aXRoIFJ1c3QncyBzZXJkZV9jYm9yIHdoZW4gaGFuZGxpbmcgYmlnIG51bWJlcnMuXG5pbXBvcnQganNfc2hhMjU2IGZyb20gJ2pzLXNoYTI1Nic7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgeyBzZWNwMjU2azEgfSBmcm9tICdAbm9ibGUvY3VydmVzL3NlY3AyNTZrMSc7XG5cbi8vY3VzdG9tIGVuY29kZXIgdGhhdCBhdm9pZHMgdGFnZ2luZ1xuY29uc3QgZW5jb2RlciA9IG5ldyBFbmNvZGVyKHtcbiAgc3RydWN0dXJlZENsb25lOiBmYWxzZSxcbiAgdXNlVG9KU09OOiBmYWxzZSxcbiAgbWFwc0FzT2JqZWN0czogZmFsc2UsXG4gIGxhcmdlQmlnSW50VG9GbG9hdDogZmFsc2UsXG59KTtcblxuZXhwb3J0IGNsYXNzIFV0aWxzIGltcGxlbWVudHMgQmFzZVV0aWxzIHtcbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldHMgdGhlIGZlZSBkYXRhIG9mIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAqL1xuICBmZWVEYXRhKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICctMTAwMDAnOyAvLyBmZWUgaXMgc3RhdGljIGZvciBJQ1AgdHJhbnNhY3Rpb25zIGFzIHBlciBJQ1AgZG9jdW1lbnRhdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgcHJvdmlkZWQgYWRkcmVzcyBpcyBhIHZhbGlkIElDUCBhZGRyZXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyAtIFRoZSBhZGRyZXNzIHRvIHZhbGlkYXRlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYWRkcmVzcyBpcyB2YWxpZCwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gICAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCByb290QWRkcmVzcyA9IHRoaXMudmFsaWRhdGVNZW1vQW5kUmV0dXJuUm9vdEFkZHJlc3MoYWRkcmVzcyk7XG4gICAgcmV0dXJuIHJvb3RBZGRyZXNzICE9PSB1bmRlZmluZWQgJiYgdGhpcy5pc1ZhbGlkSGFzaChyb290QWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBtZW1vIElEIGluIHRoZSBhZGRyZXNzIGFuZCByZXR1cm5zIHRoZSByb290IGFkZHJlc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIC0gVGhlIGFkZHJlc3MgdG8gdmFsaWRhdGUgYW5kIGV4dHJhY3QgdGhlIHJvb3QgYWRkcmVzcyBmcm9tLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIFRoZSByb290IGFkZHJlc3MgaWYgdmFsaWQsIG90aGVyd2lzZSBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHZhbGlkYXRlTWVtb0FuZFJldHVyblJvb3RBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFhZGRyZXNzKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBbcm9vdEFkZHJlc3MsIG1lbW9JZF0gPSBhZGRyZXNzLnNwbGl0KCc/bWVtb0lkPScpO1xuICAgIGlmIChtZW1vSWQgJiYgdGhpcy52YWxpZGF0ZU1lbW8oQmlnSW50KG1lbW9JZCkpKSB7XG4gICAgICByZXR1cm4gcm9vdEFkZHJlc3M7XG4gICAgfVxuICAgIHJldHVybiBhZGRyZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgcHJvdmlkZWQgaGV4IHN0cmluZyBpcyBhIHZhbGlkIHB1YmxpYyBrZXkuXG4gICAqXG4gICAqIEEgdmFsaWQgcHVibGljIGtleSBjYW4gYmUgZWl0aGVyIGNvbXByZXNzZWQgb3IgdW5jb21wcmVzc2VkOlxuICAgKiAtIENvbXByZXNzZWQgcHVibGljIGtleXMgYXJlIDMzIGJ5dGVzIGxvbmcgYW5kIHN0YXJ0IHdpdGggZWl0aGVyIDB4MDIgb3IgMHgwMy5cbiAgICogLSBVbmNvbXByZXNzZWQgcHVibGljIGtleXMgYXJlIDY1IGJ5dGVzIGxvbmcgYW5kIHN0YXJ0IHdpdGggMHgwNC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhleFN0ciAtIFRoZSBoZXggc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwdWJsaWMga2V5IHRvIHZhbGlkYXRlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgaGV4IHN0cmluZyBpcyBhIHZhbGlkIHB1YmxpYyBrZXksIG90aGVyd2lzZSBgZmFsc2VgLlxuICAgKi9cbiAgaXNWYWxpZFB1YmxpY0tleShoZXhTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkSGV4KGhleFN0cikgfHwgIXRoaXMuaXNWYWxpZExlbmd0aChoZXhTdHIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcHViS2V5Qnl0ZXMgPSB0aGlzLmhleFRvQnl0ZXMoaGV4U3RyKTtcbiAgICBjb25zdCBmaXJzdEJ5dGUgPSBwdWJLZXlCeXRlc1swXTtcbiAgICBjb25zdCB2YWxpZENvbXByZXNzZWQgPSBwdWJLZXlCeXRlcy5sZW5ndGggPT09IDMzICYmIChmaXJzdEJ5dGUgPT09IDIgfHwgZmlyc3RCeXRlID09PSAzKTtcbiAgICBjb25zdCB2YWxpZFVuY29tcHJlc3NlZCA9IHB1YktleUJ5dGVzLmxlbmd0aCA9PT0gNjUgJiYgZmlyc3RCeXRlID09PSA0O1xuXG4gICAgcmV0dXJuIHZhbGlkQ29tcHJlc3NlZCB8fCB2YWxpZFVuY29tcHJlc3NlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmNvZGVzIGEgdmFsdWUgaW50byBDQk9SIGZvcm1hdCBhbmQgcmV0dXJucyBpdCBhcyBhIGhleCBzdHJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gZW5jb2RlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBDQk9SIGVuY29kZWQgdmFsdWUgYXMgYSBoZXggc3RyaW5nLlxuICAgKi9cbiAgY2JvckVuY29kZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgdG8gZW5jb2RlIGNhbm5vdCBiZSB1bmRlZmluZWQuJyk7XG4gICAgfVxuICAgIGNvbnN0IGNib3JEYXRhID0gZW5jb2RlKHZhbHVlKTtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oY2JvckRhdGEpLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gaGV4YWRlY2ltYWwgc3RyaW5nIGlzIHZhbGlkLlxuICAgKiBBIHZhbGlkIGxlbmd0aCBpcyBlaXRoZXIgNjYgY2hhcmFjdGVycyAoMzMgYnl0ZXMpIG9yIDEzMCBjaGFyYWN0ZXJzICg2NSBieXRlcykuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZXhTdHIgLSBUaGUgaGV4YWRlY2ltYWwgc3RyaW5nIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgbGVuZ3RoIGlzIHZhbGlkLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICovXG4gIGlzVmFsaWRMZW5ndGgoaGV4U3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaGV4U3RyLmxlbmd0aCAvIDIgPT09IDMzIHx8IGhleFN0ci5sZW5ndGggLyAyID09PSA2NTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHByb3ZpZGVkIHN0cmluZyBpcyBhIHZhbGlkIGhleGFkZWNpbWFsIHN0cmluZy5cbiAgICpcbiAgICogQSB2YWxpZCBoZXhhZGVjaW1hbCBzdHJpbmcgY29uc2lzdHMgb2YgcGFpcnMgb2YgaGV4YWRlY2ltYWwgZGlnaXRzICgwLTksIGEtZiwgQS1GKS5cbiAgICpcbiAgICogQHBhcmFtIGhleFN0ciAtIFRoZSBzdHJpbmcgdG8gYmUgdmFsaWRhdGVkIGFzIGEgaGV4YWRlY2ltYWwgc3RyaW5nLlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBoZXhhZGVjaW1hbCBzdHJpbmcsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIGlzVmFsaWRIZXgoaGV4U3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL14oWzAtOWEtZkEtRl17Mn0pKyQvLnRlc3QoaGV4U3RyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGhleGFkZWNpbWFsIHN0cmluZyB0byBhIFVpbnQ4QXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZXggLSBUaGUgaGV4YWRlY2ltYWwgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtVaW50OEFycmF5fSBUaGUgcmVzdWx0aW5nIGJ5dGUgYXJyYXkuXG4gICAqL1xuICBoZXhUb0J5dGVzKGhleDogc3RyaW5nKTogVWludDhBcnJheSB7XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShoZXgubGVuZ3RoIC8gMik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZXgubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIGJ5dGVzW2kgLyAyXSA9IHBhcnNlSW50KGhleC5zdWJzdHIoaSwgMiksIDE2KTtcbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVzO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRQcml2YXRlS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZEtleShrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB3aGV0aGVyIHRoZSBwcm92aWRlZCBrZXkgaXMgYSB2YWxpZCBJQ1AgcHJpdmF0ZSBrZXkuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGBJY3BLZXlQYWlyYCB1c2luZyB0aGUgcHJvdmlkZWQga2V5LlxuICAgKiBJZiB0aGUga2V5IGlzIHZhbGlkLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAuIElmIHRoZSBrZXkgaXMgaW52YWxpZCwgYW4gZXJyb3IgaXMgdGhyb3duLFxuICAgKiBhbmQgdGhlIGZ1bmN0aW9uIHJldHVybnMgYGZhbHNlYC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBwcml2YXRlIGtleSB0byB2YWxpZGF0ZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gYHRydWVgIGlmIHRoZSBrZXkgaXMgdmFsaWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgaXNWYWxpZEtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBuZXcgSWNwS2V5UGFpcih7IHBydjoga2V5IH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXByZXNzZXMgYW4gdW5jb21wcmVzc2VkIHB1YmxpYyBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bmNvbXByZXNzZWRLZXkgLSBUaGUgdW5jb21wcmVzc2VkIHB1YmxpYyBrZXkgaW4gaGV4YWRlY2ltYWwgZm9ybWF0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBjb21wcmVzc2VkIHB1YmxpYyBrZXkgaW4gaGV4YWRlY2ltYWwgZm9ybWF0LlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBJZiB0aGUgaW5wdXQga2V5IGlzIG5vdCBhIHZhbGlkIHVuY29tcHJlc3NlZCBwdWJsaWMga2V5LlxuICAgKi9cbiAgY29tcHJlc3NQdWJsaWNLZXkodW5jb21wcmVzc2VkS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh1bmNvbXByZXNzZWRLZXkuc3RhcnRzV2l0aCgnMDInKSB8fCB1bmNvbXByZXNzZWRLZXkuc3RhcnRzV2l0aCgnMDMnKSkge1xuICAgICAgcmV0dXJuIHVuY29tcHJlc3NlZEtleTtcbiAgICB9XG4gICAgaWYgKCF1bmNvbXByZXNzZWRLZXkuc3RhcnRzV2l0aCgnMDQnKSB8fCB1bmNvbXByZXNzZWRLZXkubGVuZ3RoICE9PSAxMzApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1bmNvbXByZXNzZWQgcHVibGljIGtleSBmb3JtYXQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgeEhleCA9IHVuY29tcHJlc3NlZEtleS5zbGljZSgyLCA2Nik7XG4gICAgY29uc3QgeUhleCA9IHVuY29tcHJlc3NlZEtleS5zbGljZSg2Nik7XG4gICAgY29uc3QgeSA9IEJpZ0ludChgMHgke3lIZXh9YCk7XG4gICAgY29uc3QgcHJlZml4ID0geSAlIDJuID09PSAwbiA/ICcwMicgOiAnMDMnO1xuXG4gICAgcmV0dXJuIGAke3ByZWZpeH0ke3hIZXh9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHB1YmxpYyBrZXkgZnJvbSBpdHMgaGV4YWRlY2ltYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHRvIERFUiBmb3JtYXQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwdWJsaWNLZXlIZXggLSBUaGUgcHVibGljIGtleSBpbiBoZXhhZGVjaW1hbCBzdHJpbmcgZm9ybWF0LlxuICAgKiBAcmV0dXJucyBUaGUgcHVibGljIGtleSBpbiBERVIgZm9ybWF0IGFzIGEgVWludDhBcnJheS5cbiAgICovXG4gIGdldFB1YmxpY0tleUluREVSRm9ybWF0KHB1YmxpY0tleUhleDogc3RyaW5nKTogVWludDhBcnJheSB7XG4gICAgY29uc3QgcHVibGljS2V5QnVmZmVyID0gQnVmZmVyLmZyb20ocHVibGljS2V5SGV4LCAnaGV4Jyk7XG4gICAgY29uc3QgZWxsaXB0aWNLZXkgPSBzZWNwMjU2azEuUHJvamVjdGl2ZVBvaW50LmZyb21IZXgocHVibGljS2V5QnVmZmVyLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgY29uc3QgdW5jb21wcmVzc2VkUHVibGljS2V5SGV4ID0gZWxsaXB0aWNLZXkudG9IZXgoZmFsc2UpO1xuICAgIGNvbnN0IGRlckVuY29kZWRLZXkgPSBhZ2VudC53cmFwREVSKEJ1ZmZlci5mcm9tKHVuY29tcHJlc3NlZFB1YmxpY0tleUhleCwgJ2hleCcpLCBhZ2VudC5TRUNQMjU2SzFfT0lEKTtcbiAgICByZXR1cm4gZGVyRW5jb2RlZEtleTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHB1YmxpYyBrZXkgaW4gaGV4YWRlY2ltYWwgZm9ybWF0IHRvIGEgRGZpbml0eSBQcmluY2lwYWwgSUQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwdWJsaWNLZXlIZXggLSBUaGUgcHVibGljIGtleSBpbiBoZXhhZGVjaW1hbCBmb3JtYXQuXG4gICAqIEByZXR1cm5zIFRoZSBjb3JyZXNwb25kaW5nIERmaW5pdHkgUHJpbmNpcGFsIElELlxuICAgKi9cbiAgZ2V0UHJpbmNpcGFsSWRGcm9tUHVibGljS2V5KHB1YmxpY0tleUhleDogc3RyaW5nKTogRGZpbml0eVByaW5jaXBhbCB7XG4gICAgY29uc3QgZGVyRW5jb2RlZEtleSA9IHRoaXMuZ2V0UHVibGljS2V5SW5ERVJGb3JtYXQocHVibGljS2V5SGV4KTtcbiAgICBjb25zdCBwcmluY2lwYWxJZCA9IERmaW5pdHlQcmluY2lwYWwuc2VsZkF1dGhlbnRpY2F0aW5nKEJ1ZmZlci5mcm9tKGRlckVuY29kZWRLZXkpKTtcbiAgICByZXR1cm4gcHJpbmNpcGFsSWQ7XG4gIH1cblxuICAvKipcbiAgICogRGVyaXZlcyBhIERmaW5pdHlQcmluY2lwYWwgZnJvbSBhIGdpdmVuIHB1YmxpYyBrZXkgaW4gaGV4YWRlY2ltYWwgZm9ybWF0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHVibGljS2V5SGV4IC0gVGhlIHB1YmxpYyBrZXkgaW4gaGV4YWRlY2ltYWwgZm9ybWF0LlxuICAgKiBAcmV0dXJucyBUaGUgZGVyaXZlZCBEZmluaXR5UHJpbmNpcGFsLlxuICAgKiBAdGhyb3dzIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHByaW5jaXBhbCBjYW5ub3QgYmUgZGVyaXZlZCBmcm9tIHRoZSBwdWJsaWMga2V5LlxuICAgKi9cbiAgZGVyaXZlUHJpbmNpcGFsRnJvbVB1YmxpY0tleShwdWJsaWNLZXlIZXg6IHN0cmluZyk6IERmaW5pdHlQcmluY2lwYWwge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZXJFbmNvZGVkS2V5ID0gdGhpcy5nZXRQdWJsaWNLZXlJbkRFUkZvcm1hdChwdWJsaWNLZXlIZXgpO1xuICAgICAgY29uc3QgcHJpbmNpcGFsSWQgPSBEZmluaXR5UHJpbmNpcGFsLnNlbGZBdXRoZW50aWNhdGluZyhCdWZmZXIuZnJvbShkZXJFbmNvZGVkS2V5KSk7XG4gICAgICBjb25zdCBwcmluY2lwYWwgPSBEZmluaXR5UHJpbmNpcGFsLmZyb21VaW50OEFycmF5KHByaW5jaXBhbElkLnRvVWludDhBcnJheSgpKTtcbiAgICAgIHJldHVybiBwcmluY2lwYWw7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlcml2ZSBwcmluY2lwYWwgZnJvbSBwdWJsaWMga2V5OiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgRGZpbml0eVByaW5jaXBhbCBhbmQgYW4gb3B0aW9uYWwgc3ViQWNjb3VudCB0byBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBhY2NvdW50IElELlxuICAgKlxuICAgKiBAcGFyYW0ge0RmaW5pdHlQcmluY2lwYWx9IHByaW5jaXBhbCAtIFRoZSBwcmluY2lwYWwgdG8gY29udmVydC5cbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBbc3ViQWNjb3VudD1uZXcgVWludDhBcnJheSgzMildIC0gQW4gb3B0aW9uYWwgc3ViLWFjY291bnQsIGRlZmF1bHRzIHRvIGEgMzItYnl0ZSBhcnJheSBvZiB6ZXJvcy5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGhleGFkZWNpbWFsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWNjb3VudCBJRC5cbiAgICovXG4gIGZyb21QcmluY2lwYWwocHJpbmNpcGFsOiBEZmluaXR5UHJpbmNpcGFsLCBzdWJBY2NvdW50OiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoMzIpKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcmluY2lwYWxCeXRlcyA9IEJ1ZmZlci5mcm9tKHByaW5jaXBhbC50b1VpbnQ4QXJyYXkoKS5idWZmZXIpO1xuICAgIHJldHVybiB0aGlzLmdldEFjY291bnRJZEZyb21QcmluY2lwYWxCeXRlcyh0aGlzLmdldEFjY291bnRJZFByZWZpeCgpLCBwcmluY2lwYWxCeXRlcywgc3ViQWNjb3VudCk7XG4gIH1cblxuICBnZXRBY2NvdW50SWRGcm9tUHJpbmNpcGFsQnl0ZXMoXG4gICAgQUNDT1VOVF9JRF9QUkVGSVg6IEJ1ZmZlcjxBcnJheUJ1ZmZlcj4sXG4gICAgcHJpbmNpcGFsQnl0ZXM6IEJ1ZmZlcjxBcnJheUJ1ZmZlckxpa2U+LFxuICAgIHN1YkFjY291bnQ6IFVpbnQ4QXJyYXk8QXJyYXlCdWZmZXJMaWtlPlxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbWJpbmVkQnl0ZXMgPSBCdWZmZXIuY29uY2F0KFtBQ0NPVU5UX0lEX1BSRUZJWCwgcHJpbmNpcGFsQnl0ZXMsIHN1YkFjY291bnRdKTtcbiAgICBjb25zdCBzaGEyMjRIYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTIyNCcpLnVwZGF0ZShjb21iaW5lZEJ5dGVzKS5kaWdlc3QoKTtcbiAgICBjb25zdCBjaGVja3N1bSA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICBjaGVja3N1bS53cml0ZVVJbnQzMkJFKGNyYzMyLmJ1ZihzaGEyMjRIYXNoKSA+Pj4gMCwgMCk7XG4gICAgY29uc3QgYWNjb3VudElkQnl0ZXMgPSBCdWZmZXIuY29uY2F0KFtjaGVja3N1bSwgc2hhMjI0SGFzaF0pO1xuICAgIHJldHVybiBhY2NvdW50SWRCeXRlcy50b1N0cmluZygnaGV4Jyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGhleC1lbmNvZGVkIHB1YmxpYyBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZXhFbmNvZGVkUHVibGljS2V5IC0gVGhlIHB1YmxpYyBrZXkgaW4gaGV4LWVuY29kZWQgZm9ybWF0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgYWRkcmVzcyBkZXJpdmVkIGZyb20gdGhlIHByb3ZpZGVkIHB1YmxpYyBrZXkuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHByb3ZpZGVkIHB1YmxpYyBrZXkgaXMgbm90IGluIGEgdmFsaWQgaGV4LWVuY29kZWQgZm9ybWF0LlxuICAgKi9cbiAgYXN5bmMgZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkoaGV4RW5jb2RlZFB1YmxpY0tleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZFB1YmxpY0tleShoZXhFbmNvZGVkUHVibGljS2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhleC1lbmNvZGVkIHB1YmxpYyBrZXkgZm9ybWF0LicpO1xuICAgIH1cbiAgICBjb25zdCBjb21wcmVzc2VkS2V5ID0gdGhpcy5jb21wcmVzc1B1YmxpY0tleShoZXhFbmNvZGVkUHVibGljS2V5KTtcbiAgICBjb25zdCBrZXlQYWlyID0gbmV3IEljcEtleVBhaXIoeyBwdWI6IGNvbXByZXNzZWRLZXkgfSk7XG4gICAgcmV0dXJuIGtleVBhaXIuZ2V0QWRkcmVzcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIG5ldyBrZXkgcGFpci4gSWYgYSBzZWVkIGlzIHByb3ZpZGVkLCBpdCB3aWxsIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGtleSBwYWlyLlxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gW3NlZWRdIC0gT3B0aW9uYWwgc2VlZCBmb3Iga2V5IGdlbmVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtLZXlQYWlyfSAtIFRoZSBnZW5lcmF0ZWQga2V5IHBhaXIgY29udGFpbmluZyBib3RoIHB1YmxpYyBhbmQgcHJpdmF0ZSBrZXlzLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBJZiB0aGUgcHJpdmF0ZSBrZXkgaXMgbWlzc2luZyBpbiB0aGUgZ2VuZXJhdGVkIGtleSBwYWlyLlxuICAgKi9cbiAgcHVibGljIGdlbmVyYXRlS2V5UGFpcihzZWVkPzogQnVmZmVyKTogS2V5UGFpciB7XG4gICAgY29uc3Qga2V5UGFpciA9IHNlZWQgPyBuZXcgSWNwS2V5UGFpcih7IHNlZWQgfSkgOiBuZXcgSWNwS2V5UGFpcigpO1xuICAgIGNvbnN0IHsgcHViLCBwcnYgfSA9IGtleVBhaXIuZ2V0S2V5cygpO1xuICAgIGlmICghcHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ByaXZhdGUga2V5IGlzIG1pc3NpbmcgaW4gdGhlIGdlbmVyYXRlZCBrZXkgcGFpci4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcHViLCBwcnYgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIHByb3ZpZGVkIGZlZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZlZSAtIFRoZSBmZWUgdG8gdmFsaWRhdGUuXG4gICAqIEB0aHJvd3Mge0J1aWxkVHJhbnNhY3Rpb25FcnJvcn0gLSBJZiB0aGUgZmVlIGlzIHplcm8gb3IgaW52YWxpZC5cbiAgICovXG4gIHZhbGlkYXRlRmVlKGZlZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZmVlVmFsdWUgPSBuZXcgQmlnTnVtYmVyKGZlZSk7XG4gICAgaWYgKGZlZVZhbHVlLmlzWmVybygpKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdGZWUgY2Fubm90IGJlIHplcm8nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVWYWx1ZSh2YWx1ZTogQmlnTnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbHVlLmlzTGVzc1RoYW5PckVxdWFsVG8oMCkpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ2Ftb3VudCBjYW5ub3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBwcm92aWRlZCBtZW1vLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlciB8IEJpZ0ludH0gbWVtbyAtIFRoZSBtZW1vIHRvIHZhbGlkYXRlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgbWVtbyBpcyB2YWxpZC5cbiAgICogQHRocm93cyB7QnVpbGRUcmFuc2FjdGlvbkVycm9yfSAtIElmIHRoZSBtZW1vIGlzIGludmFsaWQuXG4gICAqL1xuICB2YWxpZGF0ZU1lbW8obWVtbzogbnVtYmVyIHwgQmlnSW50KTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWVtb051bWJlciA9IE51bWJlcihtZW1vKTtcbiAgICBpZiAobWVtb051bWJlciA8IDAgfHwgTnVtYmVyLmlzTmFOKG1lbW9OdW1iZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIG1lbW8nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YWxpZGF0ZUV4cGlyZVRpbWUoZXhwaXJlVGltZTogbnVtYmVyIHwgQmlnSW50KTogYm9vbGVhbiB7XG4gICAgaWYgKE51bWJlcihleHBpcmVUaW1lKSA8IERhdGUubm93KCkgKiAxMDAwXzAwMCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBleHBpcnkgdGltZScpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIHJhdyB0cmFuc2FjdGlvbiBkYXRhIHRvIGVuc3VyZSBpdCBoYXMgYSB2YWxpZCBmb3JtYXQgaW4gdGhlIGJsb2NrY2hhaW4gY29udGV4dC5cbiAgICpcbiAgICogQHBhcmFtIHtJY3BUcmFuc2FjdGlvbkRhdGF9IHRyYW5zYWN0aW9uRGF0YSAtIFRoZSB0cmFuc2FjdGlvbiBkYXRhIHRvIHZhbGlkYXRlLlxuICAgKiBAdGhyb3dzIHtQYXJzZVRyYW5zYWN0aW9uRXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBkYXRhIGlzIGludmFsaWQuXG4gICAqL1xuICB2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHRyYW5zYWN0aW9uRGF0YTogSWNwVHJhbnNhY3Rpb25EYXRhKTogdm9pZCB7XG4gICAgaWYgKCF0cmFuc2FjdGlvbkRhdGEpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ1RyYW5zYWN0aW9uIGRhdGEgaXMgbWlzc2luZy4nKTtcbiAgICB9XG4gICAgY29uc3QgeyBzZW5kZXJQdWJsaWNLZXlIZXgsIHNlbmRlckFkZHJlc3MsIHJlY2VpdmVyQWRkcmVzcyB9ID0gdHJhbnNhY3Rpb25EYXRhO1xuICAgIGlmIChzZW5kZXJQdWJsaWNLZXlIZXggJiYgIXRoaXMuaXNWYWxpZFB1YmxpY0tleShzZW5kZXJQdWJsaWNLZXlIZXgpKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdTZW5kZXIgcHVibGljIGtleSBpcyBpbnZhbGlkLicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNWYWxpZEFkZHJlc3Moc2VuZGVyQWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ1NlbmRlciBhZGRyZXNzIGlzIGludmFsaWQuJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1ZhbGlkQWRkcmVzcyhyZWNlaXZlckFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdSZWNlaXZlciBhZGRyZXNzIGlzIGludmFsaWQuJyk7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGVGZWUodHJhbnNhY3Rpb25EYXRhLmZlZSk7XG4gICAgdGhpcy52YWxpZGF0ZVZhbHVlKG5ldyBCaWdOdW1iZXIodHJhbnNhY3Rpb25EYXRhLmFtb3VudCkpO1xuICAgIHRoaXMudmFsaWRhdGVNZW1vKHRyYW5zYWN0aW9uRGF0YS5tZW1vKTtcbiAgICB0aGlzLnZhbGlkYXRlRXhwaXJlVGltZSh0cmFuc2FjdGlvbkRhdGEuZXhwaXJ5VGltZSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHVwZGF0ZVxuICAgKiBAcmV0dXJucyB7QnVmZmVyfVxuICAgKi9cbiAgZ2VuZXJhdGVIdHRwQ2FuaXN0ZXJVcGRhdGVJZCh1cGRhdGU6IEh0dHBDYW5pc3RlclVwZGF0ZSk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIHRoaXMuSHR0cENhbmlzdGVyVXBkYXRlUmVwcmVzZW50YXRpb25JbmRlcGVuZGVudEhhc2godXBkYXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSByZXByZXNlbnRhdGlvbi1pbmRlcGVuZGVudCBoYXNoIGZvciBhbiBIVFRQIGNhbmlzdGVyIHVwZGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtIdHRwQ2FuaXN0ZXJVcGRhdGV9IHVwZGF0ZSAtIFRoZSBIVFRQIGNhbmlzdGVyIHVwZGF0ZSBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9IC0gVGhlIGhhc2ggb2YgdGhlIHVwZGF0ZSBvYmplY3QuXG4gICAqL1xuICBIdHRwQ2FuaXN0ZXJVcGRhdGVSZXByZXNlbnRhdGlvbkluZGVwZW5kZW50SGFzaCh1cGRhdGU6IEh0dHBDYW5pc3RlclVwZGF0ZSk6IEJ1ZmZlciB7XG4gICAgY29uc3QgdXBkYXRlTWFwID0ge1xuICAgICAgcmVxdWVzdF90eXBlOiBSZXF1ZXN0VHlwZS5DQUxMLFxuICAgICAgY2FuaXN0ZXJfaWQ6IHVwZGF0ZS5jYW5pc3Rlcl9pZCxcbiAgICAgIG1ldGhvZF9uYW1lOiB1cGRhdGUubWV0aG9kX25hbWUsXG4gICAgICBhcmc6IHVwZGF0ZS5hcmcsXG4gICAgICBpbmdyZXNzX2V4cGlyeTogdXBkYXRlLmluZ3Jlc3NfZXhwaXJ5LFxuICAgICAgc2VuZGVyOiB1cGRhdGUuc2VuZGVyLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuaGFzaE9mTWFwKHVwZGF0ZU1hcCk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgU0hBLTI1NiBoYXNoIGZvciBhIGdpdmVuIG1hcCBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IG1hcCAtIFRoZSBtYXAgb2JqZWN0IHRvIGhhc2guXG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9IC0gVGhlIHJlc3VsdGluZyBoYXNoIGFzIGEgQnVmZmVyLlxuICAgKi9cbiAgaGFzaE9mTWFwKG1hcDogUmVjb3JkPHN0cmluZywgYW55Pik6IEJ1ZmZlciB7XG4gICAgY29uc3QgaGFzaGVzOiBCdWZmZXJbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qga2V5IGluIG1hcCkge1xuICAgICAgaGFzaGVzLnB1c2godGhpcy5oYXNoS2V5VmFsKGtleSwgbWFwW2tleV0pKTtcbiAgICB9XG4gICAgaGFzaGVzLnNvcnQoKGJ1ZjAsIGJ1ZjEpID0+IGJ1ZjAuY29tcGFyZShidWYxKSk7XG4gICAgcmV0dXJuIHRoaXMuc2hhMjU2KGhhc2hlcyk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgaGFzaCBmb3IgYSBrZXktdmFsdWUgcGFpci5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgdG8gaGFzaC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBCdWZmZXIgfCBCaWdJbnR9IHZhbCAtIFRoZSB2YWx1ZSB0byBoYXNoLlxuICAgKiBAcmV0dXJucyB7QnVmZmVyfSAtIFRoZSByZXN1bHRpbmcgaGFzaCBhcyBhIEJ1ZmZlci5cbiAgICovXG4gIGhhc2hLZXlWYWwoa2V5OiBzdHJpbmcsIHZhbDogYW55KTogQnVmZmVyIHtcbiAgICBjb25zdCBrZXlIYXNoID0gdGhpcy5oYXNoU3RyaW5nKGtleSk7XG4gICAgY29uc3QgdmFsSGFzaCA9IHRoaXMuaGFzaFZhbCh2YWwpO1xuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFtrZXlIYXNoLCB2YWxIYXNoXSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgU0hBLTI1NiBoYXNoIGZvciBhIGdpdmVuIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVGhlIHN0cmluZyB0byBoYXNoLlxuICAgKiBAcmV0dXJucyB7QnVmZmVyfSAtIFRoZSByZXN1bHRpbmcgaGFzaCBhcyBhIEJ1ZmZlci5cbiAgICovXG4gIGhhc2hTdHJpbmcodmFsdWU6IHN0cmluZyk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hhMjU2KFtCdWZmZXIuZnJvbSh2YWx1ZSldKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBoYXNoIGZvciBhIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLlxuICAgKlxuICAgKiBAcGFyYW0ge2JpZ2ludH0gbiAtIFRoZSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciB0byBoYXNoLlxuICAgKiBAcmV0dXJucyB7QnVmZmVyfSAtIFRoZSByZXN1bHRpbmcgaGFzaCBhcyBhIEJ1ZmZlci5cbiAgICovXG4gIGhhc2hVNjQobjogYmlnaW50KTogQnVmZmVyIHtcbiAgICBjb25zdCBidWYgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMTApO1xuICAgIGxldCBpID0gMDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgYnl0ZSA9IE51bWJlcihuICYgQmlnSW50KDB4N2YpKTtcbiAgICAgIG4gPj49IEJpZ0ludCg3KTtcbiAgICAgIGlmIChuID09PSBCaWdJbnQoMCkpIHtcbiAgICAgICAgYnVmW2ldID0gYnl0ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBidWZbaV0gPSBieXRlIHwgMHg4MDtcbiAgICAgICAgKytpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5oYXNoQnl0ZXMoYnVmLnN1YmFycmF5KDAsIGkgKyAxKSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgU0hBLTI1NiBoYXNoIGZvciBhbiBhcnJheSBvZiBlbGVtZW50cy5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheTxhbnk+fSBlbGVtZW50cyAtIFRoZSBhcnJheSBvZiBlbGVtZW50cyB0byBoYXNoLlxuICAgKiBAcmV0dXJucyB7QnVmZmVyfSAtIFRoZSByZXN1bHRpbmcgaGFzaCBhcyBhIEJ1ZmZlci5cbiAgICovXG4gIGhhc2hBcnJheShlbGVtZW50czogQXJyYXk8YW55Pik6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hhMjU2KGVsZW1lbnRzLm1hcCh0aGlzLmhhc2hWYWwpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBoYXNoIGZvciBhIGdpdmVuIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEJ1ZmZlciB8IEJpZ0ludCB8IG51bWJlciB8IEFycmF5PHVua25vd24+fSB2YWwgLSBUaGUgdmFsdWUgdG8gaGFzaC5cbiAgICogQHJldHVybnMge0J1ZmZlcn0gLSBUaGUgcmVzdWx0aW5nIGhhc2ggYXMgYSBCdWZmZXIuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIElmIHRoZSB2YWx1ZSB0eXBlIGlzIHVuc3VwcG9ydGVkLlxuICAgKi9cbiAgaGFzaFZhbCh2YWw6IHN0cmluZyB8IEJ1ZmZlciB8IEJpZ0ludCB8IG51bWJlciB8IEFycmF5PHVua25vd24+KTogQnVmZmVyIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB1dGlscy5oYXNoU3RyaW5nKHZhbCk7XG4gICAgfSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSB8fCB2YWwgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICByZXR1cm4gdXRpbHMuaGFzaEJ5dGVzKHZhbCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnYmlnaW50JyB8fCB0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHV0aWxzLmhhc2hVNjQoQmlnSW50KHZhbCkpO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICByZXR1cm4gdXRpbHMuaGFzaEFycmF5KHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdmFsdWUgdHlwZSBmb3IgaGFzaGluZzogJHt0eXBlb2YgdmFsfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgU0hBLTI1NiBoYXNoIG9mIHRoZSBnaXZlbiBidWZmZXIuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBidWZmZXIgdG8gaGFzaC5cbiAgICogQHJldHVybnMgVGhlIFNIQS0yNTYgaGFzaCBvZiB0aGUgaW5wdXQgYnVmZmVyLlxuICAgKi9cbiAgaGFzaEJ5dGVzKHZhbHVlOiBCdWZmZXIgfCBVaW50OEFycmF5KTogQnVmZmVyIHtcbiAgICByZXR1cm4gdGhpcy5zaGEyNTYoW3ZhbHVlXSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgdGhlIFNIQS0yNTYgaGFzaCBvZiB0aGUgcHJvdmlkZWQgYXJyYXkgb2YgQnVmZmVyIGNodW5rcy5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheTxCdWZmZXI+fSBjaHVua3MgLSBBbiBhcnJheSBvZiBCdWZmZXIgb2JqZWN0cyB0byBiZSBoYXNoZWQuXG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9IC0gVGhlIHJlc3VsdGluZyBTSEEtMjU2IGhhc2ggYXMgYSBCdWZmZXIuXG4gICAqL1xuICBzaGEyNTYoY2h1bmtzOiBBcnJheTxCdWZmZXI+IHwgQXJyYXk8VWludDhBcnJheT4pOiBCdWZmZXIge1xuICAgIGNvbnN0IGhhc2hlciA9IGpzX3NoYTI1Ni5zaGEyNTYuY3JlYXRlKCk7XG4gICAgY2h1bmtzLmZvckVhY2goKGNodW5rKSA9PiBoYXNoZXIudXBkYXRlKGNodW5rKSk7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGhhc2hlci5hcnJheUJ1ZmZlcigpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGhleGFkZWNpbWFsIHN0cmluZyB0byBhIEJ1ZmZlci5cbiAgICpcbiAgICogQHBhcmFtIGhleCAtIFRoZSBoZXhhZGVjaW1hbCBzdHJpbmcgdG8gY29udmVydC5cbiAgICogQHJldHVybnMgQSBCdWZmZXIgY29udGFpbmluZyB0aGUgYmluYXJ5IGRhdGEgcmVwcmVzZW50ZWQgYnkgdGhlIGhleGFkZWNpbWFsIHN0cmluZy5cbiAgICovXG4gIGJsb2JGcm9tSGV4KGhleDogc3RyaW5nKTogQnVmZmVyIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oaGV4LCAnaGV4Jyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBiaW5hcnkgYmxvYiAoQnVmZmVyKSB0byBhIGhleGFkZWNpbWFsIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtCdWZmZXJ9IGJsb2IgLSBUaGUgYmluYXJ5IGRhdGEgdG8gYmUgY29udmVydGVkLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGJpbmFyeSBkYXRhLlxuICAgKi9cbiAgYmxvYlRvSGV4KGJsb2I6IEJ1ZmZlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGJsb2IudG9TdHJpbmcoJ2hleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZXMgYSBnaXZlbiBDQk9SLWVuY29kZWQgYnVmZmVyLlxuICAgKlxuICAgKiBAcGFyYW0gYnVmZmVyIC0gVGhlIENCT1ItZW5jb2RlZCBidWZmZXIgdG8gZGVjb2RlLlxuICAgKiBAcmV0dXJucyBUaGUgZGVjb2RlZCBkYXRhLlxuICAgKi9cbiAgY2JvckRlY29kZShidWZmZXI6IEJ1ZmZlcik6IHVua25vd24ge1xuICAgIGNvbnN0IHJlcyA9IGRlY29kZShidWZmZXIpO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRvbWFpbiBJQyByZXF1ZXN0IHN0cmluZy5cbiAgICpcbiAgICogQHJldHVybnMge0J1ZmZlcn0gQSBCdWZmZXIgb2JqZWN0IGluaXRpYWxpemVkIHdpdGggdGhlIHN0cmluZyAnXFx4MEFpYy1yZXF1ZXN0Jy5cbiAgICovXG4gIGdldERvbWFpbklDUmVxdWVzdCgpOiBCdWZmZXIge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSgnXFx4MEFpYy1yZXF1ZXN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogQ29tYmluZXMgdGhlIGRvbWFpbiBJQyByZXF1ZXN0IGJ1ZmZlciB3aXRoIHRoZSBwcm92aWRlZCBtZXNzYWdlIElEIGJ1ZmZlciB0byBjcmVhdGUgc2lnbmF0dXJlIGRhdGEuXG4gICAqXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBtZXNzYWdlSWQgLSBUaGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UgSUQuXG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9IC0gVGhlIGNvbmNhdGVuYXRlZCBidWZmZXIgY29udGFpbmluZyB0aGUgZG9tYWluIElDIHJlcXVlc3QgYW5kIHRoZSBtZXNzYWdlIElELlxuICAgKi9cbiAgbWFrZVNpZ25hdHVyZURhdGEobWVzc2FnZUlkOiBCdWZmZXIpOiBCdWZmZXIge1xuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFt0aGlzLmdldERvbWFpbklDUmVxdWVzdCgpLCBtZXNzYWdlSWRdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyB0aGUgcmVjaXBpZW50IGluZm9ybWF0aW9uIGZyb20gdGhlIHByb3ZpZGVkIElDUCB0cmFuc2FjdGlvbiBkYXRhLlxuICAgKlxuICAgKiBAcGFyYW0ge0ljcFRyYW5zYWN0aW9uRGF0YX0gaWNwVHJhbnNhY3Rpb25EYXRhIC0gVGhlIElDUCB0cmFuc2FjdGlvbiBkYXRhIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVyJ3MgYWRkcmVzcyBhbmQgYW1vdW50LlxuICAgKiBAcmV0dXJucyB7UmVjaXBpZW50W119IEFuIGFycmF5IGNvbnRhaW5pbmcgYSBzaW5nbGUgcmVjaXBpZW50IG9iamVjdCB3aXRoIHRoZSByZWNlaXZlcidzIGFkZHJlc3MgYW5kIGFtb3VudC5cbiAgICovXG4gIGdldFJlY2lwaWVudHMoaWNwVHJhbnNhY3Rpb25EYXRhOiBJY3BUcmFuc2FjdGlvbkRhdGEpOiBSZWNpcGllbnQge1xuICAgIHJldHVybiB7XG4gICAgICBhZGRyZXNzOiBpY3BUcmFuc2FjdGlvbkRhdGEucmVjZWl2ZXJBZGRyZXNzLFxuICAgICAgYW1vdW50OiBpY3BUcmFuc2FjdGlvbkRhdGEuYW1vdW50LFxuICAgIH07XG4gIH1cblxuICBnZXRUcmFuc2FjdGlvblNpZ25hdHVyZShzaWduYXR1cmVNYXA6IE1hcDxzdHJpbmcsIFNpZ25hdHVyZXM+LCB1cGRhdGU6IEh0dHBDYW5pc3RlclVwZGF0ZSk6IFNpZ25hdHVyZXMgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBzaWduYXR1cmVNYXAuZ2V0KHRoaXMuYmxvYlRvSGV4KHRoaXMubWFrZVNpZ25hdHVyZURhdGEodGhpcy5nZW5lcmF0ZUh0dHBDYW5pc3RlclVwZGF0ZUlkKHVwZGF0ZSkpKSk7XG4gIH1cblxuICBnZXRNZXRhRGF0YShcbiAgICBtZW1vOiBudW1iZXIgfCBCaWdJbnQsXG4gICAgdGltZXN0YW1wOiBudW1iZXIgfCBiaWdpbnQgfCB1bmRlZmluZWQsXG4gICAgaW5ncmVzc0VuZDogbnVtYmVyIHwgQmlnSW50IHwgdW5kZWZpbmVkXG4gICk6IHsgbWV0YURhdGE6IE1ldGFEYXRhOyBpbmdyZXNzRW5kVGltZTogbnVtYmVyIHwgQmlnSW50IH0ge1xuICAgIGxldCBjdXJyZW50VGltZSA9IERhdGUubm93KCkgKiAxMDAwMDAwO1xuICAgIGlmICh0aW1lc3RhbXApIHtcbiAgICAgIGN1cnJlbnRUaW1lID0gTnVtYmVyKHRpbWVzdGFtcCk7XG4gICAgfVxuICAgIGxldCBpbmdyZXNzU3RhcnRUaW1lOiBudW1iZXIsIGluZ3Jlc3NFbmRUaW1lOiBudW1iZXI7XG4gICAgaWYgKGluZ3Jlc3NFbmQpIHtcbiAgICAgIGluZ3Jlc3NFbmRUaW1lID0gTnVtYmVyKGluZ3Jlc3NFbmQpO1xuICAgICAgaW5ncmVzc1N0YXJ0VGltZSA9IGluZ3Jlc3NFbmRUaW1lIC0gTUFYX0lOR1JFU1NfVFRMOyAvLyA1IG1pbnMgaW4gbmFub3NlY29uZHNcbiAgICB9IGVsc2Uge1xuICAgICAgaW5ncmVzc1N0YXJ0VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgICAgaW5ncmVzc0VuZFRpbWUgPSBpbmdyZXNzU3RhcnRUaW1lICsgTUFYX0lOR1JFU1NfVFRMOyAvLyA1IG1pbnMgaW4gbmFub3NlY29uZHNcbiAgICB9XG4gICAgY29uc3QgbWV0YURhdGE6IE1ldGFEYXRhID0ge1xuICAgICAgY3JlYXRlZF9hdF90aW1lOiBjdXJyZW50VGltZSxcbiAgICAgIGluZ3Jlc3Nfc3RhcnQ6IGluZ3Jlc3NTdGFydFRpbWUsXG4gICAgICBpbmdyZXNzX2VuZDogaW5ncmVzc0VuZFRpbWUsXG4gICAgICBtZW1vOiBtZW1vLFxuICAgIH07XG5cbiAgICByZXR1cm4geyBtZXRhRGF0YSwgaW5ncmVzc0VuZFRpbWUgfTtcbiAgfVxuXG4gIGNvbnZlcnRTZW5kZXJCbG9iVG9QcmluY2lwYWwoc2VuZGVyQmxvYjogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xuICAgIGNvbnN0IE1BWF9MRU5HVEhfSU5fQllURVMgPSAyOTtcbiAgICBpZiAoc2VuZGVyQmxvYi5sZW5ndGggPiBNQVhfTEVOR1RIX0lOX0JZVEVTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J5dGVzIHRvbyBsb25nIGZvciBhIHZhbGlkIFByaW5jaXBhbCcpO1xuICAgIH1cbiAgICBjb25zdCBwcmluY2lwYWxCeXRlcyA9IG5ldyBVaW50OEFycmF5KE1BWF9MRU5HVEhfSU5fQllURVMpO1xuICAgIHByaW5jaXBhbEJ5dGVzLnNldChzZW5kZXJCbG9iLnNsaWNlKDAsIHNlbmRlckJsb2IubGVuZ3RoKSk7XG4gICAgcmV0dXJuIHByaW5jaXBhbEJ5dGVzO1xuICB9XG5cbiAgZnJvbUFyZ3MoYXJnOiBVaW50OEFycmF5KTogU2VuZEFyZ3Mge1xuICAgIGNvbnN0IFNlbmRSZXF1ZXN0TWVzc2FnZSA9IG1lc3NhZ2VDb21waWxlZC5TZW5kUmVxdWVzdDtcbiAgICBjb25zdCBhcmdzID0gU2VuZFJlcXVlc3RNZXNzYWdlLmRlY29kZShhcmcpIGFzIHVua25vd24gYXMgU2VuZEFyZ3M7XG4gICAgY29uc3QgdHJhbnNmb3JtZWRBcmdzOiBTZW5kQXJncyA9IHtcbiAgICAgIHBheW1lbnQ6IHsgcmVjZWl2ZXJHZXRzOiB7IGU4czogTnVtYmVyKGFyZ3MucGF5bWVudC5yZWNlaXZlckdldHMuZThzKSB9IH0sXG4gICAgICBtYXhGZWU6IHsgZThzOiBOdW1iZXIoYXJncy5tYXhGZWUuZThzKSB9LFxuICAgICAgdG86IHsgaGFzaDogQnVmZmVyLmZyb20oYXJncy50by5oYXNoKSB9LFxuICAgICAgY3JlYXRlZEF0VGltZTogeyB0aW1lc3RhbXBOYW5vczogQmlnTnVtYmVyKGFyZ3MuY3JlYXRlZEF0VGltZS50aW1lc3RhbXBOYW5vcy50b1N0cmluZygpKS50b051bWJlcigpIH0sXG4gICAgICBtZW1vOiB7IG1lbW86IE51bWJlcihhcmdzLm1lbW8ubWVtby50b1N0cmluZygpKSB9LFxuICAgIH07XG4gICAgcmV0dXJuIHRyYW5zZm9ybWVkQXJncztcbiAgfVxuXG4gIGFzeW5jIHRvQXJnKGFyZ3M6IFNlbmRBcmdzKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3QgU2VuZFJlcXVlc3RNZXNzYWdlID0gbWVzc2FnZUNvbXBpbGVkLlNlbmRSZXF1ZXN0O1xuICAgIGNvbnN0IGVyck1zZyA9IFNlbmRSZXF1ZXN0TWVzc2FnZS52ZXJpZnkoYXJncyk7XG4gICAgaWYgKGVyck1zZykgdGhyb3cgbmV3IEVycm9yKGVyck1zZyk7XG4gICAgY29uc3QgbWVzc2FnZSA9IFNlbmRSZXF1ZXN0TWVzc2FnZS5jcmVhdGUoYXJncyBhcyBhbnkpO1xuICAgIHJldHVybiBTZW5kUmVxdWVzdE1lc3NhZ2UuZW5jb2RlKG1lc3NhZ2UpLmZpbmlzaCgpO1xuICB9XG5cbiAgZ2V0QWNjb3VudElkUHJlZml4KCk6IEJ1ZmZlcjxBcnJheUJ1ZmZlcj4ge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShbMHgwYSwgLi4uQnVmZmVyLmZyb20oJ2FjY291bnQtaWQnKV0pO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRCbG9ja0lkKGhhc2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIElDUCBibG9jayBoYXNoZXMgYXJlIDY0LWNoYXJhY3RlciBoZXhhZGVjaW1hbCBzdHJpbmdzXG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZEhhc2goaGFzaCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgSUNQIGhhc2hcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhhc2ggLSBzdHJpbmcgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc1ZhbGlkSGFzaChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIGhhc2ggPT09ICdzdHJpbmcnICYmIC9eWzAtOWEtZkEtRl17NjR9JC8udGVzdChoYXNoKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkVHJhbnNhY3Rpb25JZCh0eElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkSGFzaCh0eElkKTtcbiAgfVxuXG4gIGdldFNpZ25hdHVyZXMocGF5bG9hZHNEYXRhOiBQYXlsb2Fkc0RhdGEsIHNlbmRlclB1YmxpY0tleTogc3RyaW5nLCBzZW5kZXJQcml2YXRlS2V5OiBzdHJpbmcpOiBTaWduYXR1cmVzW10ge1xuICAgIHJldHVybiBwYXlsb2Fkc0RhdGEucGF5bG9hZHMubWFwKChwYXlsb2FkKSA9PiAoe1xuICAgICAgc2lnbmluZ19wYXlsb2FkOiBwYXlsb2FkLFxuICAgICAgc2lnbmF0dXJlX3R5cGU6IHBheWxvYWQuc2lnbmF0dXJlX3R5cGUsXG4gICAgICBwdWJsaWNfa2V5OiB7XG4gICAgICAgIGhleF9ieXRlczogc2VuZGVyUHVibGljS2V5LFxuICAgICAgICBjdXJ2ZV90eXBlOiBDdXJ2ZVR5cGUuU0VDUDI1NksxLFxuICAgICAgfSxcbiAgICAgIGhleF9ieXRlczogdGhpcy5zaWduUGF5bG9hZChzZW5kZXJQcml2YXRlS2V5LCBwYXlsb2FkLmhleF9ieXRlcyksXG4gICAgfSkpO1xuICB9XG5cbiAgc2lnblBheWxvYWQgPSAocHJpdmF0ZUtleTogc3RyaW5nLCBwYXlsb2FkSGV4OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IHByaXZhdGVLZXlCeXRlcyA9IEJ1ZmZlci5mcm9tKHByaXZhdGVLZXksICdoZXgnKTtcbiAgICBjb25zdCBwYXlsb2FkSGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoQnVmZmVyLmZyb20ocGF5bG9hZEhleCwgJ2hleCcpKS5kaWdlc3QoJ2hleCcpO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IHNlY3AyNTZrMS5zaWduKHBheWxvYWRIYXNoLCBwcml2YXRlS2V5Qnl0ZXMpO1xuICAgIGNvbnN0IHIgPSBCdWZmZXIuZnJvbShzaWduYXR1cmUuci50b1N0cmluZygxNikucGFkU3RhcnQoNjQsICcwJyksICdoZXgnKTtcbiAgICBjb25zdCBzID0gQnVmZmVyLmZyb20oc2lnbmF0dXJlLnMudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDY0LCAnMCcpLCAnaGV4Jyk7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW3IsIHNdKS50b1N0cmluZygnaGV4Jyk7XG4gIH07XG5cbiAgZ2V0VHJhbnNhY3Rpb25JZCh1bnNpZ25lZFRyYW5zYWN0aW9uOiBzdHJpbmcsIHNlbmRlckFkZHJlc3M6IHN0cmluZywgcmVjZWl2ZXJBZGRyZXNzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZWNvZGVkVHhuID0gdXRpbHMuY2JvckRlY29kZSh1dGlscy5ibG9iRnJvbUhleCh1bnNpZ25lZFRyYW5zYWN0aW9uKSkgYXMgQ2JvclVuc2lnbmVkVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCB1cGRhdGVzID0gZGVjb2RlZFR4bi51cGRhdGVzIGFzIHVua25vd24gYXMgW3N0cmluZywgSHR0cENhbmlzdGVyVXBkYXRlXVtdO1xuICAgICAgZm9yIChjb25zdCBbLCB1cGRhdGVdIG9mIHVwZGF0ZXMpIHtcbiAgICAgICAgY29uc3QgdXBkYXRlQXJncyA9IHVwZGF0ZS5hcmc7XG4gICAgICAgIGNvbnN0IHNlbmRBcmdzID0gdXRpbHMuZnJvbUFyZ3ModXBkYXRlQXJncyk7XG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uSGFzaCA9IHRoaXMuZ2VuZXJhdGVUcmFuc2FjdGlvbkhhc2goc2VuZEFyZ3MsIHNlbmRlckFkZHJlc3MsIHJlY2VpdmVyQWRkcmVzcyk7XG4gICAgICAgIHJldHVybiB0cmFuc2FjdGlvbkhhc2g7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHVwZGF0ZXMgZm91bmQgaW4gdGhlIHVuc2lnbmVkIHRyYW5zYWN0aW9uLicpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBjb21wdXRlIHRyYW5zYWN0aW9uIElEOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgc2FmZUJpZ0ludCh2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IGJpZ2ludCB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgY29uc3QgTUFYXzMyQklUID0gNDI5NDk2NzI5NTsgLy8gMl4zMiAtIDFcbiAgICAgIGNvbnN0IE1JTl8zMkJJVCA9IC00Mjk0OTY3Mjk2OyAvLyAtKDJeMzIpXG4gICAgICBjb25zdCBpc091dHNpZGUzMkJpdFJhbmdlID0gdmFsdWUgPiBNQVhfMzJCSVQgfHwgdmFsdWUgPCBNSU5fMzJCSVQ7XG4gICAgICByZXR1cm4gaXNPdXRzaWRlMzJCaXRSYW5nZSA/IEJpZ0ludCh2YWx1ZSkgOiB2YWx1ZTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdHlwZTogZXhwZWN0ZWQgYSBudW1iZXIgb3IgYmlnaW50LCBidXQgcmVjZWl2ZWQgJHt0eXBlb2YgdmFsdWV9YCk7XG4gIH1cblxuICBnZW5lcmF0ZVRyYW5zYWN0aW9uSGFzaChzZW5kQXJnczogU2VuZEFyZ3MsIHNlbmRlckFkZHJlc3M6IHN0cmluZywgcmVjZWl2ZXJBZGRyZXNzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNlbmRlckFjY291bnQgPSB0aGlzLmFjY291bnRJZGVudGlmaWVyKHNlbmRlckFkZHJlc3MpO1xuICAgIGNvbnN0IHJlY2VpdmVyQWNjb3VudCA9IHRoaXMuYWNjb3VudElkZW50aWZpZXIocmVjZWl2ZXJBZGRyZXNzKTtcblxuICAgIGNvbnN0IHRyYW5zZmVyRmllbGRzID0gbmV3IE1hcDxhbnksIGFueT4oW1xuICAgICAgWzAsIHNlbmRlckFjY291bnRdLFxuICAgICAgWzEsIHJlY2VpdmVyQWNjb3VudF0sXG4gICAgICBbMiwgbmV3IE1hcChbWzAsIHRoaXMuc2FmZUJpZ0ludChzZW5kQXJncy5wYXltZW50LnJlY2VpdmVyR2V0cy5lOHMpXV0pXSxcbiAgICAgIFszLCBuZXcgTWFwKFtbMCwgc2VuZEFyZ3MubWF4RmVlLmU4c11dKV0sXG4gICAgXSk7XG5cbiAgICBjb25zdCBvcGVyYXRpb25NYXAgPSBuZXcgTWFwKFtbMiwgdHJhbnNmZXJGaWVsZHNdXSk7XG4gICAgY29uc3QgdHhuRmllbGRzID0gbmV3IE1hcDxhbnksIGFueT4oW1xuICAgICAgWzAsIG9wZXJhdGlvbk1hcF0sXG4gICAgICBbMSwgdGhpcy5zYWZlQmlnSW50KHNlbmRBcmdzLm1lbW8ubWVtbyldLFxuICAgICAgWzIsIG5ldyBNYXAoW1swLCBCaWdJbnQoc2VuZEFyZ3MuY3JlYXRlZEF0VGltZS50aW1lc3RhbXBOYW5vcyldXSldLFxuICAgIF0pO1xuXG4gICAgY29uc3QgcHJvY2Vzc2VkVHhuID0gdGhpcy5nZXRQcm9jZXNzZWRUcmFuc2FjdGlvbk1hcCh0eG5GaWVsZHMpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRUeG4gPSBlbmNvZGVyLmVuY29kZShwcm9jZXNzZWRUeG4pO1xuICAgIHJldHVybiBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHNlcmlhbGl6ZWRUeG4pLmRpZ2VzdCgnaGV4Jyk7XG4gIH1cblxuICBhY2NvdW50SWRlbnRpZmllcihhY2NvdW50QWRkcmVzczogc3RyaW5nKTogQWNjb3VudElkZW50aWZpZXJIYXNoIHtcbiAgICBjb25zdCBieXRlcyA9IEJ1ZmZlci5mcm9tKGFjY291bnRBZGRyZXNzLCAnaGV4Jyk7XG4gICAgaWYgKGJ5dGVzLmxlbmd0aCA9PT0gMzIpIHtcbiAgICAgIHJldHVybiB7IGhhc2g6IGJ5dGVzLnNsaWNlKDQpIH07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBBY2NvdW50SWRlbnRpZmllcjogNjQgaGV4IGNoYXJzLCBnb3QgJHthY2NvdW50QWRkcmVzcy5sZW5ndGh9YCk7XG4gIH1cblxuICBnZXRQcm9jZXNzZWRUcmFuc2FjdGlvbk1hcCh0eG5NYXA6IE1hcDxhbnksIGFueT4pOiBNYXA8YW55LCBhbnk+IHtcbiAgICBjb25zdCBvcGVyYXRpb25NYXAgPSB0eG5NYXAuZ2V0KDApO1xuICAgIGNvbnN0IHRyYW5zZmVyTWFwID0gb3BlcmF0aW9uTWFwLmdldCgyKTtcbiAgICB0cmFuc2Zlck1hcC5zZXQoMCwgdGhpcy5zZXJpYWxpemVBY2NvdW50SWRlbnRpZmllcih0cmFuc2Zlck1hcC5nZXQoMCkpKTtcbiAgICB0cmFuc2Zlck1hcC5zZXQoMSwgdGhpcy5zZXJpYWxpemVBY2NvdW50SWRlbnRpZmllcih0cmFuc2Zlck1hcC5nZXQoMSkpKTtcbiAgICByZXR1cm4gdHhuTWFwO1xuICB9XG5cbiAgc2VyaWFsaXplQWNjb3VudElkZW50aWZpZXIoYWNjb3VudEhhc2g6IEFjY291bnRJZGVudGlmaWVySGFzaCk6IHN0cmluZyB7XG4gICAgaWYgKGFjY291bnRIYXNoICYmIGFjY291bnRIYXNoLmhhc2gpIHtcbiAgICAgIGNvbnN0IGhhc2hCdWZmZXIgPSBhY2NvdW50SGFzaC5oYXNoO1xuICAgICAgY29uc3QgY2hlY2tzdW0gPSBCdWZmZXIuYWxsb2MoNCk7XG4gICAgICBjaGVja3N1bS53cml0ZVVJbnQzMkJFKGNyYzMyLmJ1ZihoYXNoQnVmZmVyKSA+Pj4gMCwgMCk7XG4gICAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbY2hlY2tzdW0sIGhhc2hCdWZmZXJdKS50b1N0cmluZygnaGV4JykudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFjY291bnRIYXNoIGZvcm1hdCcpO1xuICB9XG59XG5cbmNvbnN0IHV0aWxzID0gbmV3IFV0aWxzKCk7XG5leHBvcnQgZGVmYXVsdCB1dGlscztcbiJdfQ==
|
|
732
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQU84QjtBQUM5QixrREFBbUU7QUFDbkUsc0RBQXdDO0FBQ3hDLG9EQUE0QjtBQUM1QixvREFBMkI7QUFDM0IsbUNBWWlCO0FBQ2pCLHVDQUFrRDtBQUNsRCxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUNuRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLGdNQUFnTTtBQUNyUSwwREFBa0M7QUFDbEMsZ0VBQXFDO0FBQ3JDLHVEQUFvRDtBQUVwRCxvQ0FBb0M7QUFDcEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUM7SUFDMUIsZUFBZSxFQUFFLEtBQUs7SUFDdEIsU0FBUyxFQUFFLEtBQUs7SUFDaEIsYUFBYSxFQUFFLEtBQUs7SUFDcEIsa0JBQWtCLEVBQUUsS0FBSztDQUMxQixDQUFDLENBQUM7QUFFSCxNQUFhLEtBQUs7SUFBbEI7UUF3b0JFLGdCQUFXLEdBQUcsQ0FBQyxVQUFrQixFQUFFLFVBQWtCLEVBQVUsRUFBRTtZQUMvRCxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2RCxNQUFNLFdBQVcsR0FBRyxnQkFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckcsTUFBTSxTQUFTLEdBQUcscUJBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLGVB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bXBvcnQge1xuICBCYXNlVXRpbHMsXG4gIEtleVBhaXIsXG4gIFBhcnNlVHJhbnNhY3Rpb25FcnJvcixcbiAgUmVjaXBpZW50LFxuICBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsXG4gIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IFByaW5jaXBhbCBhcyBEZmluaXR5UHJpbmNpcGFsIH0gZnJvbSAnQGRmaW5pdHkvcHJpbmNpcGFsJztcbmltcG9ydCAqIGFzIGFnZW50IGZyb20gJ0BkZmluaXR5L2FnZW50JztcbmltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCBjcmMzMiBmcm9tICdjcmMtMzInO1xuaW1wb3J0IHtcbiAgSHR0cENhbmlzdGVyVXBkYXRlLFxuICBJY3BUcmFuc2FjdGlvbkRhdGEsXG4gIFJlcXVlc3RUeXBlLFxuICBTaWduYXR1cmVzLFxuICBNZXRhRGF0YSxcbiAgU2VuZEFyZ3MsXG4gIFBheWxvYWRzRGF0YSxcbiAgQ3VydmVUeXBlLFxuICBBY2NvdW50SWRlbnRpZmllckhhc2gsXG4gIENib3JVbnNpZ25lZFRyYW5zYWN0aW9uLFxuICBNQVhfSU5HUkVTU19UVEwsXG59IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgS2V5UGFpciBhcyBJY3BLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcbmNvbnN0IG1lc3NhZ2VDb21waWxlZCA9IHJlcXVpcmUoJy4uLy4uL3Jlc291cmNlcy9tZXNzYWdlQ29tcGlsZWQnKTtcbmNvbnN0IHsgZW5jb2RlLCBkZWNvZGUsIEVuY29kZXIgfSA9IHJlcXVpcmUoJ2Nib3IteC9pbmRleC1uby1ldmFsJyk7IC8vIFRoZSBcImNib3IteFwiIGxpYnJhcnkgaXMgdXNlZCBoZXJlIGJlY2F1c2UgaXQgc3VwcG9ydHMgbW9kZXJuIGZlYXR1cmVzIGxpa2UgQmlnSW50LiBkbyBub3QgcmVwbGFjZSBpdCB3aXRoIFwiY2JvciBhcyBcImNib3JcIiBpcyBub3QgY29tcGF0aWJsZSB3aXRoIFJ1c3QncyBzZXJkZV9jYm9yIHdoZW4gaGFuZGxpbmcgYmlnIG51bWJlcnMuXG5pbXBvcnQganNfc2hhMjU2IGZyb20gJ2pzLXNoYTI1Nic7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgeyBzZWNwMjU2azEgfSBmcm9tICdAbm9ibGUvY3VydmVzL3NlY3AyNTZrMSc7XG5cbi8vY3VzdG9tIGVuY29kZXIgdGhhdCBhdm9pZHMgdGFnZ2luZ1xuY29uc3QgZW5jb2RlciA9IG5ldyBFbmNvZGVyKHtcbiAgc3RydWN0dXJlZENsb25lOiBmYWxzZSxcbiAgdXNlVG9KU09OOiBmYWxzZSxcbiAgbWFwc0FzT2JqZWN0czogZmFsc2UsXG4gIGxhcmdlQmlnSW50VG9GbG9hdDogZmFsc2UsXG59KTtcblxuZXhwb3J0IGNsYXNzIFV0aWxzIGltcGxlbWVudHMgQmFzZVV0aWxzIHtcbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldHMgdGhlIGZlZSBkYXRhIG9mIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAqL1xuICBmZWVEYXRhKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICctMTAwMDAnOyAvLyBmZWUgaXMgc3RhdGljIGZvciBJQ1AgdHJhbnNhY3Rpb25zIGFzIHBlciBJQ1AgZG9jdW1lbnRhdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgcHJvdmlkZWQgYWRkcmVzcyBpcyBhIHZhbGlkIElDUCBhZGRyZXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyAtIFRoZSBhZGRyZXNzIHRvIHZhbGlkYXRlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYWRkcmVzcyBpcyB2YWxpZCwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gICAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCByb290QWRkcmVzcyA9IHRoaXMudmFsaWRhdGVNZW1vQW5kUmV0dXJuUm9vdEFkZHJlc3MoYWRkcmVzcyk7XG4gICAgcmV0dXJuIHJvb3RBZGRyZXNzICE9PSB1bmRlZmluZWQgJiYgdGhpcy5pc1ZhbGlkSGFzaChyb290QWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBtZW1vIElEIGluIHRoZSBhZGRyZXNzIGFuZCByZXR1cm5zIHRoZSByb290IGFkZHJlc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIC0gVGhlIGFkZHJlc3MgdG8gdmFsaWRhdGUgYW5kIGV4dHJhY3QgdGhlIHJvb3QgYWRkcmVzcyBmcm9tLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIFRoZSByb290IGFkZHJlc3MgaWYgdmFsaWQsIG90aGVyd2lzZSBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHZhbGlkYXRlTWVtb0FuZFJldHVyblJvb3RBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFhZGRyZXNzKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBbcm9vdEFkZHJlc3MsIG1lbW9JZF0gPSBhZGRyZXNzLnNwbGl0KCc/bWVtb0lkPScpO1xuICAgIGlmIChtZW1vSWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aGlzLnZhbGlkYXRlTWVtbyhCaWdJbnQobWVtb0lkKSkpIHtcbiAgICAgICAgICByZXR1cm4gcm9vdEFkZHJlc3M7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYWRkcmVzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHByb3ZpZGVkIGhleCBzdHJpbmcgaXMgYSB2YWxpZCBwdWJsaWMga2V5LlxuICAgKlxuICAgKiBBIHZhbGlkIHB1YmxpYyBrZXkgY2FuIGJlIGVpdGhlciBjb21wcmVzc2VkIG9yIHVuY29tcHJlc3NlZDpcbiAgICogLSBDb21wcmVzc2VkIHB1YmxpYyBrZXlzIGFyZSAzMyBieXRlcyBsb25nIGFuZCBzdGFydCB3aXRoIGVpdGhlciAweDAyIG9yIDB4MDMuXG4gICAqIC0gVW5jb21wcmVzc2VkIHB1YmxpYyBrZXlzIGFyZSA2NSBieXRlcyBsb25nIGFuZCBzdGFydCB3aXRoIDB4MDQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZXhTdHIgLSBUaGUgaGV4IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHVibGljIGtleSB0byB2YWxpZGF0ZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGhleCBzdHJpbmcgaXMgYSB2YWxpZCBwdWJsaWMga2V5LCBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICovXG4gIGlzVmFsaWRQdWJsaWNLZXkoaGV4U3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZEhleChoZXhTdHIpIHx8ICF0aGlzLmlzVmFsaWRMZW5ndGgoaGV4U3RyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHB1YktleUJ5dGVzID0gdGhpcy5oZXhUb0J5dGVzKGhleFN0cik7XG4gICAgY29uc3QgZmlyc3RCeXRlID0gcHViS2V5Qnl0ZXNbMF07XG4gICAgY29uc3QgdmFsaWRDb21wcmVzc2VkID0gcHViS2V5Qnl0ZXMubGVuZ3RoID09PSAzMyAmJiAoZmlyc3RCeXRlID09PSAyIHx8IGZpcnN0Qnl0ZSA9PT0gMyk7XG4gICAgY29uc3QgdmFsaWRVbmNvbXByZXNzZWQgPSBwdWJLZXlCeXRlcy5sZW5ndGggPT09IDY1ICYmIGZpcnN0Qnl0ZSA9PT0gNDtcblxuICAgIHJldHVybiB2YWxpZENvbXByZXNzZWQgfHwgdmFsaWRVbmNvbXByZXNzZWQ7XG4gIH1cblxuICAvKipcbiAgICogRW5jb2RlcyBhIHZhbHVlIGludG8gQ0JPUiBmb3JtYXQgYW5kIHJldHVybnMgaXQgYXMgYSBoZXggc3RyaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGVuY29kZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgQ0JPUiBlbmNvZGVkIHZhbHVlIGFzIGEgaGV4IHN0cmluZy5cbiAgICovXG4gIGNib3JFbmNvZGUodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIHRvIGVuY29kZSBjYW5ub3QgYmUgdW5kZWZpbmVkLicpO1xuICAgIH1cbiAgICBjb25zdCBjYm9yRGF0YSA9IGVuY29kZSh2YWx1ZSk7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNib3JEYXRhKS50b1N0cmluZygnaGV4Jyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuIGhleGFkZWNpbWFsIHN0cmluZyBpcyB2YWxpZC5cbiAgICogQSB2YWxpZCBsZW5ndGggaXMgZWl0aGVyIDY2IGNoYXJhY3RlcnMgKDMzIGJ5dGVzKSBvciAxMzAgY2hhcmFjdGVycyAoNjUgYnl0ZXMpLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGV4U3RyIC0gVGhlIGhleGFkZWNpbWFsIHN0cmluZyB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGxlbmd0aCBpcyB2YWxpZCwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gICAqL1xuICBpc1ZhbGlkTGVuZ3RoKGhleFN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGhleFN0ci5sZW5ndGggLyAyID09PSAzMyB8fCBoZXhTdHIubGVuZ3RoIC8gMiA9PT0gNjU7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCBzdHJpbmcgaXMgYSB2YWxpZCBoZXhhZGVjaW1hbCBzdHJpbmcuXG4gICAqXG4gICAqIEEgdmFsaWQgaGV4YWRlY2ltYWwgc3RyaW5nIGNvbnNpc3RzIG9mIHBhaXJzIG9mIGhleGFkZWNpbWFsIGRpZ2l0cyAoMC05LCBhLWYsIEEtRikuXG4gICAqXG4gICAqIEBwYXJhbSBoZXhTdHIgLSBUaGUgc3RyaW5nIHRvIGJlIHZhbGlkYXRlZCBhcyBhIGhleGFkZWNpbWFsIHN0cmluZy5cbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgaGV4YWRlY2ltYWwgc3RyaW5nLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBpc1ZhbGlkSGV4KGhleFN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIC9eKFswLTlhLWZBLUZdezJ9KSskLy50ZXN0KGhleFN0cik7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBoZXhhZGVjaW1hbCBzdHJpbmcgdG8gYSBVaW50OEFycmF5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGV4IC0gVGhlIGhleGFkZWNpbWFsIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7VWludDhBcnJheX0gVGhlIHJlc3VsdGluZyBieXRlIGFycmF5LlxuICAgKi9cbiAgaGV4VG9CeXRlcyhoZXg6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoaGV4Lmxlbmd0aCAvIDIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGV4Lmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICBieXRlc1tpIC8gMl0gPSBwYXJzZUludChoZXguc3Vic3RyKGksIDIpLCAxNik7XG4gICAgfVxuICAgIHJldHVybiBieXRlcztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkUHJpdmF0ZUtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRLZXkoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgd2hldGhlciB0aGUgcHJvdmlkZWQga2V5IGlzIGEgdmFsaWQgSUNQIHByaXZhdGUga2V5LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBgSWNwS2V5UGFpcmAgdXNpbmcgdGhlIHByb3ZpZGVkIGtleS5cbiAgICogSWYgdGhlIGtleSBpcyB2YWxpZCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgYHRydWVgLiBJZiB0aGUga2V5IGlzIGludmFsaWQsIGFuIGVycm9yIGlzIHRocm93bixcbiAgICogYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5zIGBmYWxzZWAuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgcHJpdmF0ZSBrZXkgdG8gdmFsaWRhdGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIGB0cnVlYCBpZiB0aGUga2V5IGlzIHZhbGlkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIGlzVmFsaWRLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgbmV3IEljcEtleVBhaXIoeyBwcnY6IGtleSB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wcmVzc2VzIGFuIHVuY29tcHJlc3NlZCBwdWJsaWMga2V5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5jb21wcmVzc2VkS2V5IC0gVGhlIHVuY29tcHJlc3NlZCBwdWJsaWMga2V5IGluIGhleGFkZWNpbWFsIGZvcm1hdC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgY29tcHJlc3NlZCBwdWJsaWMga2V5IGluIGhleGFkZWNpbWFsIGZvcm1hdC5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gSWYgdGhlIGlucHV0IGtleSBpcyBub3QgYSB2YWxpZCB1bmNvbXByZXNzZWQgcHVibGljIGtleS5cbiAgICovXG4gIGNvbXByZXNzUHVibGljS2V5KHVuY29tcHJlc3NlZEtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodW5jb21wcmVzc2VkS2V5LnN0YXJ0c1dpdGgoJzAyJykgfHwgdW5jb21wcmVzc2VkS2V5LnN0YXJ0c1dpdGgoJzAzJykpIHtcbiAgICAgIHJldHVybiB1bmNvbXByZXNzZWRLZXk7XG4gICAgfVxuICAgIGlmICghdW5jb21wcmVzc2VkS2V5LnN0YXJ0c1dpdGgoJzA0JykgfHwgdW5jb21wcmVzc2VkS2V5Lmxlbmd0aCAhPT0gMTMwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdW5jb21wcmVzc2VkIHB1YmxpYyBrZXkgZm9ybWF0LicpO1xuICAgIH1cblxuICAgIGNvbnN0IHhIZXggPSB1bmNvbXByZXNzZWRLZXkuc2xpY2UoMiwgNjYpO1xuICAgIGNvbnN0IHlIZXggPSB1bmNvbXByZXNzZWRLZXkuc2xpY2UoNjYpO1xuICAgIGNvbnN0IHkgPSBCaWdJbnQoYDB4JHt5SGV4fWApO1xuICAgIGNvbnN0IHByZWZpeCA9IHkgJSAybiA9PT0gMG4gPyAnMDInIDogJzAzJztcblxuICAgIHJldHVybiBgJHtwcmVmaXh9JHt4SGV4fWA7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBwdWJsaWMga2V5IGZyb20gaXRzIGhleGFkZWNpbWFsIHN0cmluZyByZXByZXNlbnRhdGlvbiB0byBERVIgZm9ybWF0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHVibGljS2V5SGV4IC0gVGhlIHB1YmxpYyBrZXkgaW4gaGV4YWRlY2ltYWwgc3RyaW5nIGZvcm1hdC5cbiAgICogQHJldHVybnMgVGhlIHB1YmxpYyBrZXkgaW4gREVSIGZvcm1hdCBhcyBhIFVpbnQ4QXJyYXkuXG4gICAqL1xuICBnZXRQdWJsaWNLZXlJbkRFUkZvcm1hdChwdWJsaWNLZXlIZXg6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICAgIGNvbnN0IHB1YmxpY0tleUJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHB1YmxpY0tleUhleCwgJ2hleCcpO1xuICAgIGNvbnN0IGVsbGlwdGljS2V5ID0gc2VjcDI1NmsxLlByb2plY3RpdmVQb2ludC5mcm9tSGV4KHB1YmxpY0tleUJ1ZmZlci50b1N0cmluZygnaGV4JykpO1xuICAgIGNvbnN0IHVuY29tcHJlc3NlZFB1YmxpY0tleUhleCA9IGVsbGlwdGljS2V5LnRvSGV4KGZhbHNlKTtcbiAgICBjb25zdCB1bmNvbXByZXNzZWRLZXlCdWZmZXIgPSBCdWZmZXIuZnJvbSh1bmNvbXByZXNzZWRQdWJsaWNLZXlIZXgsICdoZXgnKTtcbiAgICByZXR1cm4gYWdlbnQud3JhcERFUihcbiAgICAgIHVuY29tcHJlc3NlZEtleUJ1ZmZlci5idWZmZXIuc2xpY2UoXG4gICAgICAgIHVuY29tcHJlc3NlZEtleUJ1ZmZlci5ieXRlT2Zmc2V0LFxuICAgICAgICB1bmNvbXByZXNzZWRLZXlCdWZmZXIuYnl0ZU9mZnNldCArIHVuY29tcHJlc3NlZEtleUJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgICApLFxuICAgICAgYWdlbnQuU0VDUDI1NksxX09JRFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBwdWJsaWMga2V5IGluIGhleGFkZWNpbWFsIGZvcm1hdCB0byBhIERmaW5pdHkgUHJpbmNpcGFsIElELlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHVibGljS2V5SGV4IC0gVGhlIHB1YmxpYyBrZXkgaW4gaGV4YWRlY2ltYWwgZm9ybWF0LlxuICAgKiBAcmV0dXJucyBUaGUgY29ycmVzcG9uZGluZyBEZmluaXR5IFByaW5jaXBhbCBJRC5cbiAgICovXG4gIGdldFByaW5jaXBhbElkRnJvbVB1YmxpY0tleShwdWJsaWNLZXlIZXg6IHN0cmluZyk6IERmaW5pdHlQcmluY2lwYWwge1xuICAgIGNvbnN0IGRlckVuY29kZWRLZXkgPSB0aGlzLmdldFB1YmxpY0tleUluREVSRm9ybWF0KHB1YmxpY0tleUhleCk7XG4gICAgY29uc3QgcHJpbmNpcGFsSWQgPSBEZmluaXR5UHJpbmNpcGFsLnNlbGZBdXRoZW50aWNhdGluZyhCdWZmZXIuZnJvbShkZXJFbmNvZGVkS2V5KSk7XG4gICAgcmV0dXJuIHByaW5jaXBhbElkO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcml2ZXMgYSBEZmluaXR5UHJpbmNpcGFsIGZyb20gYSBnaXZlbiBwdWJsaWMga2V5IGluIGhleGFkZWNpbWFsIGZvcm1hdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHB1YmxpY0tleUhleCAtIFRoZSBwdWJsaWMga2V5IGluIGhleGFkZWNpbWFsIGZvcm1hdC5cbiAgICogQHJldHVybnMgVGhlIGRlcml2ZWQgRGZpbml0eVByaW5jaXBhbC5cbiAgICogQHRocm93cyBXaWxsIHRocm93IGFuIGVycm9yIGlmIHRoZSBwcmluY2lwYWwgY2Fubm90IGJlIGRlcml2ZWQgZnJvbSB0aGUgcHVibGljIGtleS5cbiAgICovXG4gIGRlcml2ZVByaW5jaXBhbEZyb21QdWJsaWNLZXkocHVibGljS2V5SGV4OiBzdHJpbmcpOiBEZmluaXR5UHJpbmNpcGFsIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVyRW5jb2RlZEtleSA9IHRoaXMuZ2V0UHVibGljS2V5SW5ERVJGb3JtYXQocHVibGljS2V5SGV4KTtcbiAgICAgIGNvbnN0IHByaW5jaXBhbElkID0gRGZpbml0eVByaW5jaXBhbC5zZWxmQXV0aGVudGljYXRpbmcoQnVmZmVyLmZyb20oZGVyRW5jb2RlZEtleSkpO1xuICAgICAgY29uc3QgcHJpbmNpcGFsID0gRGZpbml0eVByaW5jaXBhbC5mcm9tVWludDhBcnJheShwcmluY2lwYWxJZC50b1VpbnQ4QXJyYXkoKSk7XG4gICAgICByZXR1cm4gcHJpbmNpcGFsO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkZXJpdmUgcHJpbmNpcGFsIGZyb20gcHVibGljIGtleTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIERmaW5pdHlQcmluY2lwYWwgYW5kIGFuIG9wdGlvbmFsIHN1YkFjY291bnQgdG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gYWNjb3VudCBJRC5cbiAgICpcbiAgICogQHBhcmFtIHtEZmluaXR5UHJpbmNpcGFsfSBwcmluY2lwYWwgLSBUaGUgcHJpbmNpcGFsIHRvIGNvbnZlcnQuXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gW3N1YkFjY291bnQ9bmV3IFVpbnQ4QXJyYXkoMzIpXSAtIEFuIG9wdGlvbmFsIHN1Yi1hY2NvdW50LCBkZWZhdWx0cyB0byBhIDMyLWJ5dGUgYXJyYXkgb2YgemVyb3MuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBoZXhhZGVjaW1hbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFjY291bnQgSUQuXG4gICAqL1xuICBmcm9tUHJpbmNpcGFsKHByaW5jaXBhbDogRGZpbml0eVByaW5jaXBhbCwgc3ViQWNjb3VudDogVWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KDMyKSk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJpbmNpcGFsQnl0ZXMgPSBCdWZmZXIuZnJvbShwcmluY2lwYWwudG9VaW50OEFycmF5KCkuYnVmZmVyKTtcbiAgICByZXR1cm4gdGhpcy5nZXRBY2NvdW50SWRGcm9tUHJpbmNpcGFsQnl0ZXModGhpcy5nZXRBY2NvdW50SWRQcmVmaXgoKSwgcHJpbmNpcGFsQnl0ZXMsIHN1YkFjY291bnQpO1xuICB9XG5cbiAgZ2V0QWNjb3VudElkRnJvbVByaW5jaXBhbEJ5dGVzKFxuICAgIEFDQ09VTlRfSURfUFJFRklYOiBCdWZmZXI8QXJyYXlCdWZmZXI+LFxuICAgIHByaW5jaXBhbEJ5dGVzOiBCdWZmZXI8QXJyYXlCdWZmZXJMaWtlPixcbiAgICBzdWJBY2NvdW50OiBVaW50OEFycmF5PEFycmF5QnVmZmVyTGlrZT5cbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb21iaW5lZEJ5dGVzID0gQnVmZmVyLmNvbmNhdChbQUNDT1VOVF9JRF9QUkVGSVgsIHByaW5jaXBhbEJ5dGVzLCBzdWJBY2NvdW50XSk7XG4gICAgY29uc3Qgc2hhMjI0SGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyMjQnKS51cGRhdGUoY29tYmluZWRCeXRlcykuZGlnZXN0KCk7XG4gICAgY29uc3QgY2hlY2tzdW0gPSBCdWZmZXIuYWxsb2MoNCk7XG4gICAgY2hlY2tzdW0ud3JpdGVVSW50MzJCRShjcmMzMi5idWYoc2hhMjI0SGFzaCkgPj4+IDAsIDApO1xuICAgIGNvbnN0IGFjY291bnRJZEJ5dGVzID0gQnVmZmVyLmNvbmNhdChbY2hlY2tzdW0sIHNoYTIyNEhhc2hdKTtcbiAgICByZXR1cm4gYWNjb3VudElkQnl0ZXMudG9TdHJpbmcoJ2hleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBoZXgtZW5jb2RlZCBwdWJsaWMga2V5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGV4RW5jb2RlZFB1YmxpY0tleSAtIFRoZSBwdWJsaWMga2V5IGluIGhleC1lbmNvZGVkIGZvcm1hdC5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGFkZHJlc3MgZGVyaXZlZCBmcm9tIHRoZSBwcm92aWRlZCBwdWJsaWMga2V5LlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBwcm92aWRlZCBwdWJsaWMga2V5IGlzIG5vdCBpbiBhIHZhbGlkIGhleC1lbmNvZGVkIGZvcm1hdC5cbiAgICovXG4gIGdldEFkZHJlc3NGcm9tUHVibGljS2V5KGhleEVuY29kZWRQdWJsaWNLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRQdWJsaWNLZXkoaGV4RW5jb2RlZFB1YmxpY0tleSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBoZXgtZW5jb2RlZCBwdWJsaWMga2V5IGZvcm1hdC4nKTtcbiAgICB9XG4gICAgY29uc3QgY29tcHJlc3NlZEtleSA9IHRoaXMuY29tcHJlc3NQdWJsaWNLZXkoaGV4RW5jb2RlZFB1YmxpY0tleSk7XG4gICAgY29uc3Qga2V5UGFpciA9IG5ldyBJY3BLZXlQYWlyKHsgcHViOiBjb21wcmVzc2VkS2V5IH0pO1xuICAgIHJldHVybiBrZXlQYWlyLmdldEFkZHJlc3MoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBuZXcga2V5IHBhaXIuIElmIGEgc2VlZCBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBrZXkgcGFpci5cbiAgICpcbiAgICogQHBhcmFtIHtCdWZmZXJ9IFtzZWVkXSAtIE9wdGlvbmFsIHNlZWQgZm9yIGtleSBnZW5lcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7S2V5UGFpcn0gLSBUaGUgZ2VuZXJhdGVkIGtleSBwYWlyIGNvbnRhaW5pbmcgYm90aCBwdWJsaWMgYW5kIHByaXZhdGUga2V5cy5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gSWYgdGhlIHByaXZhdGUga2V5IGlzIG1pc3NpbmcgaW4gdGhlIGdlbmVyYXRlZCBrZXkgcGFpci5cbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZUtleVBhaXIoc2VlZD86IEJ1ZmZlcik6IEtleVBhaXIge1xuICAgIGNvbnN0IGtleVBhaXIgPSBzZWVkID8gbmV3IEljcEtleVBhaXIoeyBzZWVkIH0pIDogbmV3IEljcEtleVBhaXIoKTtcbiAgICBjb25zdCB7IHB1YiwgcHJ2IH0gPSBrZXlQYWlyLmdldEtleXMoKTtcbiAgICBpZiAoIXBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcml2YXRlIGtleSBpcyBtaXNzaW5nIGluIHRoZSBnZW5lcmF0ZWQga2V5IHBhaXIuJyk7XG4gICAgfVxuICAgIHJldHVybiB7IHB1YiwgcHJ2IH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBwcm92aWRlZCBmZWUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmZWUgLSBUaGUgZmVlIHRvIHZhbGlkYXRlLlxuICAgKiBAdGhyb3dzIHtCdWlsZFRyYW5zYWN0aW9uRXJyb3J9IC0gSWYgdGhlIGZlZSBpcyB6ZXJvIG9yIGludmFsaWQuXG4gICAqL1xuICB2YWxpZGF0ZUZlZShmZWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZlZVZhbHVlID0gbmV3IEJpZ051bWJlcihmZWUpO1xuICAgIGlmIChmZWVWYWx1ZS5pc1plcm8oKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignRmVlIGNhbm5vdCBiZSB6ZXJvJyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlVmFsdWUodmFsdWU6IEJpZ051bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICh2YWx1ZS5pc0xlc3NUaGFuT3JFcXVhbFRvKDApKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdhbW91bnQgY2Fubm90IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB6ZXJvJyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgcHJvdmlkZWQgbWVtby5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXIgfCBCaWdJbnR9IG1lbW8gLSBUaGUgbWVtbyB0byB2YWxpZGF0ZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1lbW8gaXMgdmFsaWQuXG4gICAqIEB0aHJvd3Mge0J1aWxkVHJhbnNhY3Rpb25FcnJvcn0gLSBJZiB0aGUgbWVtbyBpcyBpbnZhbGlkLlxuICAgKi9cbiAgdmFsaWRhdGVNZW1vKG1lbW86IG51bWJlciB8IEJpZ0ludCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG1lbW9OdW1iZXIgPSBOdW1iZXIobWVtbyk7XG4gICAgaWYgKG1lbW9OdW1iZXIgPCAwIHx8IE51bWJlci5pc05hTihtZW1vTnVtYmVyKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBtZW1vJyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFsaWRhdGVFeHBpcmVUaW1lKGV4cGlyZVRpbWU6IG51bWJlciB8IEJpZ0ludCk6IGJvb2xlYW4ge1xuICAgIGlmIChOdW1iZXIoZXhwaXJlVGltZSkgPCBEYXRlLm5vdygpICogMTAwMF8wMDApIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgZXhwaXJ5IHRpbWUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSByYXcgdHJhbnNhY3Rpb24gZGF0YSB0byBlbnN1cmUgaXQgaGFzIGEgdmFsaWQgZm9ybWF0IGluIHRoZSBibG9ja2NoYWluIGNvbnRleHQuXG4gICAqXG4gICAqIEBwYXJhbSB7SWNwVHJhbnNhY3Rpb25EYXRhfSB0cmFuc2FjdGlvbkRhdGEgLSBUaGUgdHJhbnNhY3Rpb24gZGF0YSB0byB2YWxpZGF0ZS5cbiAgICogQHRocm93cyB7UGFyc2VUcmFuc2FjdGlvbkVycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZGF0YSBpcyBpbnZhbGlkLlxuICAgKi9cbiAgdmFsaWRhdGVSYXdUcmFuc2FjdGlvbih0cmFuc2FjdGlvbkRhdGE6IEljcFRyYW5zYWN0aW9uRGF0YSk6IHZvaWQge1xuICAgIGlmICghdHJhbnNhY3Rpb25EYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdUcmFuc2FjdGlvbiBkYXRhIGlzIG1pc3NpbmcuJyk7XG4gICAgfVxuICAgIGNvbnN0IHsgc2VuZGVyUHVibGljS2V5SGV4LCBzZW5kZXJBZGRyZXNzLCByZWNlaXZlckFkZHJlc3MgfSA9IHRyYW5zYWN0aW9uRGF0YTtcbiAgICBpZiAoc2VuZGVyUHVibGljS2V5SGV4ICYmICF0aGlzLmlzVmFsaWRQdWJsaWNLZXkoc2VuZGVyUHVibGljS2V5SGV4KSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignU2VuZGVyIHB1YmxpYyBrZXkgaXMgaW52YWxpZC4nKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRBZGRyZXNzKHNlbmRlckFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdTZW5kZXIgYWRkcmVzcyBpcyBpbnZhbGlkLicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNWYWxpZEFkZHJlc3MocmVjZWl2ZXJBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignUmVjZWl2ZXIgYWRkcmVzcyBpcyBpbnZhbGlkLicpO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkYXRlRmVlKHRyYW5zYWN0aW9uRGF0YS5mZWUpO1xuICAgIHRoaXMudmFsaWRhdGVWYWx1ZShuZXcgQmlnTnVtYmVyKHRyYW5zYWN0aW9uRGF0YS5hbW91bnQpKTtcbiAgICB0aGlzLnZhbGlkYXRlTWVtbyh0cmFuc2FjdGlvbkRhdGEubWVtbyk7XG4gICAgdGhpcy52YWxpZGF0ZUV4cGlyZVRpbWUodHJhbnNhY3Rpb25EYXRhLmV4cGlyeVRpbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSB1cGRhdGVcbiAgICogQHJldHVybnMge0J1ZmZlcn1cbiAgICovXG4gIGdlbmVyYXRlSHR0cENhbmlzdGVyVXBkYXRlSWQodXBkYXRlOiBIdHRwQ2FuaXN0ZXJVcGRhdGUpOiBCdWZmZXIge1xuICAgIHJldHVybiB0aGlzLkh0dHBDYW5pc3RlclVwZGF0ZVJlcHJlc2VudGF0aW9uSW5kZXBlbmRlbnRIYXNoKHVwZGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgcmVwcmVzZW50YXRpb24taW5kZXBlbmRlbnQgaGFzaCBmb3IgYW4gSFRUUCBjYW5pc3RlciB1cGRhdGUuXG4gICAqXG4gICAqIEBwYXJhbSB7SHR0cENhbmlzdGVyVXBkYXRlfSB1cGRhdGUgLSBUaGUgSFRUUCBjYW5pc3RlciB1cGRhdGUgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7QnVmZmVyfSAtIFRoZSBoYXNoIG9mIHRoZSB1cGRhdGUgb2JqZWN0LlxuICAgKi9cbiAgSHR0cENhbmlzdGVyVXBkYXRlUmVwcmVzZW50YXRpb25JbmRlcGVuZGVudEhhc2godXBkYXRlOiBIdHRwQ2FuaXN0ZXJVcGRhdGUpOiBCdWZmZXIge1xuICAgIGNvbnN0IHVwZGF0ZU1hcCA9IHtcbiAgICAgIHJlcXVlc3RfdHlwZTogUmVxdWVzdFR5cGUuQ0FMTCxcbiAgICAgIGNhbmlzdGVyX2lkOiB1cGRhdGUuY2FuaXN0ZXJfaWQsXG4gICAgICBtZXRob2RfbmFtZTogdXBkYXRlLm1ldGhvZF9uYW1lLFxuICAgICAgYXJnOiB1cGRhdGUuYXJnLFxuICAgICAgaW5ncmVzc19leHBpcnk6IHVwZGF0ZS5pbmdyZXNzX2V4cGlyeSxcbiAgICAgIHNlbmRlcjogdXBkYXRlLnNlbmRlcixcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmhhc2hPZk1hcCh1cGRhdGVNYXApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIFNIQS0yNTYgaGFzaCBmb3IgYSBnaXZlbiBtYXAgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBtYXAgLSBUaGUgbWFwIG9iamVjdCB0byBoYXNoLlxuICAgKiBAcmV0dXJucyB7QnVmZmVyfSAtIFRoZSByZXN1bHRpbmcgaGFzaCBhcyBhIEJ1ZmZlci5cbiAgICovXG4gIGhhc2hPZk1hcChtYXA6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBCdWZmZXIge1xuICAgIGNvbnN0IGhhc2hlczogQnVmZmVyW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBtYXApIHtcbiAgICAgIGhhc2hlcy5wdXNoKHRoaXMuaGFzaEtleVZhbChrZXksIG1hcFtrZXldKSk7XG4gICAgfVxuICAgIGhhc2hlcy5zb3J0KChidWYwLCBidWYxKSA9PiBidWYwLmNvbXBhcmUoYnVmMSkpO1xuICAgIHJldHVybiB0aGlzLnNoYTI1NihoYXNoZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIGhhc2ggZm9yIGEga2V5LXZhbHVlIHBhaXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IHRvIGhhc2guXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgQnVmZmVyIHwgQmlnSW50fSB2YWwgLSBUaGUgdmFsdWUgdG8gaGFzaC5cbiAgICogQHJldHVybnMge0J1ZmZlcn0gLSBUaGUgcmVzdWx0aW5nIGhhc2ggYXMgYSBCdWZmZXIuXG4gICAqL1xuICBoYXNoS2V5VmFsKGtleTogc3RyaW5nLCB2YWw6IGFueSk6IEJ1ZmZlciB7XG4gICAgY29uc3Qga2V5SGFzaCA9IHRoaXMuaGFzaFN0cmluZyhrZXkpO1xuICAgIGNvbnN0IHZhbEhhc2ggPSB0aGlzLmhhc2hWYWwodmFsKTtcbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChba2V5SGFzaCwgdmFsSGFzaF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIFNIQS0yNTYgaGFzaCBmb3IgYSBnaXZlbiBzdHJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSBzdHJpbmcgdG8gaGFzaC5cbiAgICogQHJldHVybnMge0J1ZmZlcn0gLSBUaGUgcmVzdWx0aW5nIGhhc2ggYXMgYSBCdWZmZXIuXG4gICAqL1xuICBoYXNoU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBCdWZmZXIge1xuICAgIHJldHVybiB0aGlzLnNoYTI1NihbQnVmZmVyLmZyb20odmFsdWUpXSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgaGFzaCBmb3IgYSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlci5cbiAgICpcbiAgICogQHBhcmFtIHtiaWdpbnR9IG4gLSBUaGUgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgdG8gaGFzaC5cbiAgICogQHJldHVybnMge0J1ZmZlcn0gLSBUaGUgcmVzdWx0aW5nIGhhc2ggYXMgYSBCdWZmZXIuXG4gICAqL1xuICBoYXNoVTY0KG46IGJpZ2ludCk6IEJ1ZmZlciB7XG4gICAgY29uc3QgYnVmID0gQnVmZmVyLmFsbG9jVW5zYWZlKDEwKTtcbiAgICBsZXQgaSA9IDA7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IGJ5dGUgPSBOdW1iZXIobiAmIEJpZ0ludCgweDdmKSk7XG4gICAgICBuID4+PSBCaWdJbnQoNyk7XG4gICAgICBpZiAobiA9PT0gQmlnSW50KDApKSB7XG4gICAgICAgIGJ1ZltpXSA9IGJ5dGU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnVmW2ldID0gYnl0ZSB8IDB4ODA7XG4gICAgICAgICsraTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaGFzaEJ5dGVzKGJ1Zi5zdWJhcnJheSgwLCBpICsgMSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIFNIQS0yNTYgaGFzaCBmb3IgYW4gYXJyYXkgb2YgZWxlbWVudHMuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gZWxlbWVudHMgLSBUaGUgYXJyYXkgb2YgZWxlbWVudHMgdG8gaGFzaC5cbiAgICogQHJldHVybnMge0J1ZmZlcn0gLSBUaGUgcmVzdWx0aW5nIGhhc2ggYXMgYSBCdWZmZXIuXG4gICAqL1xuICBoYXNoQXJyYXkoZWxlbWVudHM6IEFycmF5PGFueT4pOiBCdWZmZXIge1xuICAgIHJldHVybiB0aGlzLnNoYTI1NihlbGVtZW50cy5tYXAodGhpcy5oYXNoVmFsKSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgaGFzaCBmb3IgYSBnaXZlbiB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBCdWZmZXIgfCBCaWdJbnQgfCBudW1iZXIgfCBBcnJheTx1bmtub3duPn0gdmFsIC0gVGhlIHZhbHVlIHRvIGhhc2guXG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9IC0gVGhlIHJlc3VsdGluZyBoYXNoIGFzIGEgQnVmZmVyLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBJZiB0aGUgdmFsdWUgdHlwZSBpcyB1bnN1cHBvcnRlZC5cbiAgICovXG4gIGhhc2hWYWwodmFsOiBzdHJpbmcgfCBCdWZmZXIgfCBCaWdJbnQgfCBudW1iZXIgfCBBcnJheTx1bmtub3duPik6IEJ1ZmZlciB7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdXRpbHMuaGFzaFN0cmluZyh2YWwpO1xuICAgIH0gZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbCkgfHwgdmFsIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgcmV0dXJuIHV0aWxzLmhhc2hCeXRlcyh2YWwpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ2JpZ2ludCcgfHwgdHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB1dGlscy5oYXNoVTY0KEJpZ0ludCh2YWwpKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgcmV0dXJuIHV0aWxzLmhhc2hBcnJheSh2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHZhbHVlIHR5cGUgZm9yIGhhc2hpbmc6ICR7dHlwZW9mIHZhbH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgdGhlIFNIQS0yNTYgaGFzaCBvZiB0aGUgZ2l2ZW4gYnVmZmVyLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgYnVmZmVyIHRvIGhhc2guXG4gICAqIEByZXR1cm5zIFRoZSBTSEEtMjU2IGhhc2ggb2YgdGhlIGlucHV0IGJ1ZmZlci5cbiAgICovXG4gIGhhc2hCeXRlcyh2YWx1ZTogQnVmZmVyIHwgVWludDhBcnJheSk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hhMjU2KFt2YWx1ZV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHRoZSBTSEEtMjU2IGhhc2ggb2YgdGhlIHByb3ZpZGVkIGFycmF5IG9mIEJ1ZmZlciBjaHVua3MuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk8QnVmZmVyPn0gY2h1bmtzIC0gQW4gYXJyYXkgb2YgQnVmZmVyIG9iamVjdHMgdG8gYmUgaGFzaGVkLlxuICAgKiBAcmV0dXJucyB7QnVmZmVyfSAtIFRoZSByZXN1bHRpbmcgU0hBLTI1NiBoYXNoIGFzIGEgQnVmZmVyLlxuICAgKi9cbiAgc2hhMjU2KGNodW5rczogQXJyYXk8QnVmZmVyPiB8IEFycmF5PFVpbnQ4QXJyYXk+KTogQnVmZmVyIHtcbiAgICBjb25zdCBoYXNoZXIgPSBqc19zaGEyNTYuc2hhMjU2LmNyZWF0ZSgpO1xuICAgIGNodW5rcy5mb3JFYWNoKChjaHVuaykgPT4gaGFzaGVyLnVwZGF0ZShjaHVuaykpO1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShoYXNoZXIuYXJyYXlCdWZmZXIoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBoZXhhZGVjaW1hbCBzdHJpbmcgdG8gYSBCdWZmZXIuXG4gICAqXG4gICAqIEBwYXJhbSBoZXggLSBUaGUgaGV4YWRlY2ltYWwgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIEEgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIGJpbmFyeSBkYXRhIHJlcHJlc2VudGVkIGJ5IHRoZSBoZXhhZGVjaW1hbCBzdHJpbmcuXG4gICAqL1xuICBibG9iRnJvbUhleChoZXg6IHN0cmluZyk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGhleCwgJ2hleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgYmluYXJ5IGJsb2IgKEJ1ZmZlcikgdG8gYSBoZXhhZGVjaW1hbCBzdHJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBibG9iIC0gVGhlIGJpbmFyeSBkYXRhIHRvIGJlIGNvbnZlcnRlZC5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiaW5hcnkgZGF0YS5cbiAgICovXG4gIGJsb2JUb0hleChibG9iOiBCdWZmZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBibG9iLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIGEgZ2l2ZW4gQ0JPUi1lbmNvZGVkIGJ1ZmZlci5cbiAgICpcbiAgICogQHBhcmFtIGJ1ZmZlciAtIFRoZSBDQk9SLWVuY29kZWQgYnVmZmVyIHRvIGRlY29kZS5cbiAgICogQHJldHVybnMgVGhlIGRlY29kZWQgZGF0YS5cbiAgICovXG4gIGNib3JEZWNvZGUoYnVmZmVyOiBCdWZmZXIpOiB1bmtub3duIHtcbiAgICBjb25zdCByZXMgPSBkZWNvZGUoYnVmZmVyKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIEJ1ZmZlciBjb250YWluaW5nIHRoZSBkb21haW4gSUMgcmVxdWVzdCBzdHJpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9IEEgQnVmZmVyIG9iamVjdCBpbml0aWFsaXplZCB3aXRoIHRoZSBzdHJpbmcgJ1xceDBBaWMtcmVxdWVzdCcuXG4gICAqL1xuICBnZXREb21haW5JQ1JlcXVlc3QoKTogQnVmZmVyIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oJ1xceDBBaWMtcmVxdWVzdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbWJpbmVzIHRoZSBkb21haW4gSUMgcmVxdWVzdCBidWZmZXIgd2l0aCB0aGUgcHJvdmlkZWQgbWVzc2FnZSBJRCBidWZmZXIgdG8gY3JlYXRlIHNpZ25hdHVyZSBkYXRhLlxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gbWVzc2FnZUlkIC0gVGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBtZXNzYWdlIElELlxuICAgKiBAcmV0dXJucyB7QnVmZmVyfSAtIFRoZSBjb25jYXRlbmF0ZWQgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRvbWFpbiBJQyByZXF1ZXN0IGFuZCB0aGUgbWVzc2FnZSBJRC5cbiAgICovXG4gIG1ha2VTaWduYXR1cmVEYXRhKG1lc3NhZ2VJZDogQnVmZmVyKTogQnVmZmVyIHtcbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbdGhpcy5nZXREb21haW5JQ1JlcXVlc3QoKSwgbWVzc2FnZUlkXSk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgdGhlIHJlY2lwaWVudCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwcm92aWRlZCBJQ1AgdHJhbnNhY3Rpb24gZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtJY3BUcmFuc2FjdGlvbkRhdGF9IGljcFRyYW5zYWN0aW9uRGF0YSAtIFRoZSBJQ1AgdHJhbnNhY3Rpb24gZGF0YSBjb250YWluaW5nIHRoZSByZWNlaXZlcidzIGFkZHJlc3MgYW5kIGFtb3VudC5cbiAgICogQHJldHVybnMge1JlY2lwaWVudFtdfSBBbiBhcnJheSBjb250YWluaW5nIGEgc2luZ2xlIHJlY2lwaWVudCBvYmplY3Qgd2l0aCB0aGUgcmVjZWl2ZXIncyBhZGRyZXNzIGFuZCBhbW91bnQuXG4gICAqL1xuICBnZXRSZWNpcGllbnRzKGljcFRyYW5zYWN0aW9uRGF0YTogSWNwVHJhbnNhY3Rpb25EYXRhKTogUmVjaXBpZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgYWRkcmVzczogaWNwVHJhbnNhY3Rpb25EYXRhLnJlY2VpdmVyQWRkcmVzcyxcbiAgICAgIGFtb3VudDogaWNwVHJhbnNhY3Rpb25EYXRhLmFtb3VudCxcbiAgICB9O1xuICB9XG5cbiAgZ2V0VHJhbnNhY3Rpb25TaWduYXR1cmUoc2lnbmF0dXJlTWFwOiBNYXA8c3RyaW5nLCBTaWduYXR1cmVzPiwgdXBkYXRlOiBIdHRwQ2FuaXN0ZXJVcGRhdGUpOiBTaWduYXR1cmVzIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gc2lnbmF0dXJlTWFwLmdldCh0aGlzLmJsb2JUb0hleCh0aGlzLm1ha2VTaWduYXR1cmVEYXRhKHRoaXMuZ2VuZXJhdGVIdHRwQ2FuaXN0ZXJVcGRhdGVJZCh1cGRhdGUpKSkpO1xuICB9XG5cbiAgZ2V0TWV0YURhdGEoXG4gICAgbWVtbzogbnVtYmVyIHwgQmlnSW50LFxuICAgIHRpbWVzdGFtcDogbnVtYmVyIHwgYmlnaW50IHwgdW5kZWZpbmVkLFxuICAgIGluZ3Jlc3NFbmQ6IG51bWJlciB8IEJpZ0ludCB8IHVuZGVmaW5lZFxuICApOiB7IG1ldGFEYXRhOiBNZXRhRGF0YTsgaW5ncmVzc0VuZFRpbWU6IG51bWJlciB8IEJpZ0ludCB9IHtcbiAgICBsZXQgY3VycmVudFRpbWUgPSBEYXRlLm5vdygpICogMTAwMDAwMDtcbiAgICBpZiAodGltZXN0YW1wKSB7XG4gICAgICBjdXJyZW50VGltZSA9IE51bWJlcih0aW1lc3RhbXApO1xuICAgIH1cbiAgICBsZXQgaW5ncmVzc1N0YXJ0VGltZTogbnVtYmVyLCBpbmdyZXNzRW5kVGltZTogbnVtYmVyO1xuICAgIGlmIChpbmdyZXNzRW5kKSB7XG4gICAgICBpbmdyZXNzRW5kVGltZSA9IE51bWJlcihpbmdyZXNzRW5kKTtcbiAgICAgIGluZ3Jlc3NTdGFydFRpbWUgPSBpbmdyZXNzRW5kVGltZSAtIE1BWF9JTkdSRVNTX1RUTDsgLy8gNSBtaW5zIGluIG5hbm9zZWNvbmRzXG4gICAgfSBlbHNlIHtcbiAgICAgIGluZ3Jlc3NTdGFydFRpbWUgPSBjdXJyZW50VGltZTtcbiAgICAgIGluZ3Jlc3NFbmRUaW1lID0gaW5ncmVzc1N0YXJ0VGltZSArIE1BWF9JTkdSRVNTX1RUTDsgLy8gNSBtaW5zIGluIG5hbm9zZWNvbmRzXG4gICAgfVxuICAgIGNvbnN0IG1ldGFEYXRhOiBNZXRhRGF0YSA9IHtcbiAgICAgIGNyZWF0ZWRfYXRfdGltZTogY3VycmVudFRpbWUsXG4gICAgICBpbmdyZXNzX3N0YXJ0OiBpbmdyZXNzU3RhcnRUaW1lLFxuICAgICAgaW5ncmVzc19lbmQ6IGluZ3Jlc3NFbmRUaW1lLFxuICAgICAgbWVtbzogbWVtbyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHsgbWV0YURhdGEsIGluZ3Jlc3NFbmRUaW1lIH07XG4gIH1cblxuICBjb252ZXJ0U2VuZGVyQmxvYlRvUHJpbmNpcGFsKHNlbmRlckJsb2I6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgICBjb25zdCBNQVhfTEVOR1RIX0lOX0JZVEVTID0gMjk7XG4gICAgaWYgKHNlbmRlckJsb2IubGVuZ3RoID4gTUFYX0xFTkdUSF9JTl9CWVRFUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCeXRlcyB0b28gbG9uZyBmb3IgYSB2YWxpZCBQcmluY2lwYWwnKTtcbiAgICB9XG4gICAgY29uc3QgcHJpbmNpcGFsQnl0ZXMgPSBuZXcgVWludDhBcnJheShNQVhfTEVOR1RIX0lOX0JZVEVTKTtcbiAgICBwcmluY2lwYWxCeXRlcy5zZXQoc2VuZGVyQmxvYi5zbGljZSgwLCBzZW5kZXJCbG9iLmxlbmd0aCkpO1xuICAgIHJldHVybiBwcmluY2lwYWxCeXRlcztcbiAgfVxuXG4gIGZyb21BcmdzKGFyZzogVWludDhBcnJheSk6IFNlbmRBcmdzIHtcbiAgICBjb25zdCBTZW5kUmVxdWVzdE1lc3NhZ2UgPSBtZXNzYWdlQ29tcGlsZWQuU2VuZFJlcXVlc3Q7XG4gICAgY29uc3QgYXJncyA9IFNlbmRSZXF1ZXN0TWVzc2FnZS5kZWNvZGUoYXJnKSBhcyB1bmtub3duIGFzIFNlbmRBcmdzO1xuICAgIGNvbnN0IHRyYW5zZm9ybWVkQXJnczogU2VuZEFyZ3MgPSB7XG4gICAgICBwYXltZW50OiB7IHJlY2VpdmVyR2V0czogeyBlOHM6IE51bWJlcihhcmdzLnBheW1lbnQucmVjZWl2ZXJHZXRzLmU4cykgfSB9LFxuICAgICAgbWF4RmVlOiB7IGU4czogTnVtYmVyKGFyZ3MubWF4RmVlLmU4cykgfSxcbiAgICAgIHRvOiB7IGhhc2g6IEJ1ZmZlci5mcm9tKGFyZ3MudG8uaGFzaCkgfSxcbiAgICAgIGNyZWF0ZWRBdFRpbWU6IHsgdGltZXN0YW1wTmFub3M6IEJpZ051bWJlcihhcmdzLmNyZWF0ZWRBdFRpbWUudGltZXN0YW1wTmFub3MudG9TdHJpbmcoKSkudG9OdW1iZXIoKSB9LFxuICAgICAgbWVtbzogeyBtZW1vOiBOdW1iZXIoYXJncy5tZW1vLm1lbW8udG9TdHJpbmcoKSkgfSxcbiAgICB9O1xuICAgIHJldHVybiB0cmFuc2Zvcm1lZEFyZ3M7XG4gIH1cblxuICBhc3luYyB0b0FyZyhhcmdzOiBTZW5kQXJncyk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IFNlbmRSZXF1ZXN0TWVzc2FnZSA9IG1lc3NhZ2VDb21waWxlZC5TZW5kUmVxdWVzdDtcbiAgICBjb25zdCBlcnJNc2cgPSBTZW5kUmVxdWVzdE1lc3NhZ2UudmVyaWZ5KGFyZ3MpO1xuICAgIGlmIChlcnJNc2cpIHRocm93IG5ldyBFcnJvcihlcnJNc2cpO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBTZW5kUmVxdWVzdE1lc3NhZ2UuY3JlYXRlKGFyZ3MgYXMgYW55KTtcbiAgICByZXR1cm4gU2VuZFJlcXVlc3RNZXNzYWdlLmVuY29kZShtZXNzYWdlKS5maW5pc2goKTtcbiAgfVxuXG4gIGdldEFjY291bnRJZFByZWZpeCgpOiBCdWZmZXI8QXJyYXlCdWZmZXI+IHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oWzB4MGEsIC4uLkJ1ZmZlci5mcm9tKCdhY2NvdW50LWlkJyldKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQmxvY2tJZChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBJQ1AgYmxvY2sgaGFzaGVzIGFyZSA2NC1jaGFyYWN0ZXIgaGV4YWRlY2ltYWwgc3RyaW5nc1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRIYXNoKGhhc2gpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIHZhbGlkIElDUCBoYXNoXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoYXNoIC0gc3RyaW5nIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNWYWxpZEhhc2goaGFzaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBoYXNoID09PSAnc3RyaW5nJyAmJiAvXlswLTlhLWZBLUZdezY0fSQvLnRlc3QoaGFzaCk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZEhhc2godHhJZCk7XG4gIH1cblxuICBnZXRTaWduYXR1cmVzKHBheWxvYWRzRGF0YTogUGF5bG9hZHNEYXRhLCBzZW5kZXJQdWJsaWNLZXk6IHN0cmluZywgc2VuZGVyUHJpdmF0ZUtleTogc3RyaW5nKTogU2lnbmF0dXJlc1tdIHtcbiAgICByZXR1cm4gcGF5bG9hZHNEYXRhLnBheWxvYWRzLm1hcCgocGF5bG9hZCkgPT4gKHtcbiAgICAgIHNpZ25pbmdfcGF5bG9hZDogcGF5bG9hZCxcbiAgICAgIHNpZ25hdHVyZV90eXBlOiBwYXlsb2FkLnNpZ25hdHVyZV90eXBlLFxuICAgICAgcHVibGljX2tleToge1xuICAgICAgICBoZXhfYnl0ZXM6IHNlbmRlclB1YmxpY0tleSxcbiAgICAgICAgY3VydmVfdHlwZTogQ3VydmVUeXBlLlNFQ1AyNTZLMSxcbiAgICAgIH0sXG4gICAgICBoZXhfYnl0ZXM6IHRoaXMuc2lnblBheWxvYWQoc2VuZGVyUHJpdmF0ZUtleSwgcGF5bG9hZC5oZXhfYnl0ZXMpLFxuICAgIH0pKTtcbiAgfVxuXG4gIHNpZ25QYXlsb2FkID0gKHByaXZhdGVLZXk6IHN0cmluZywgcGF5bG9hZEhleDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBwcml2YXRlS2V5Qnl0ZXMgPSBCdWZmZXIuZnJvbShwcml2YXRlS2V5LCAnaGV4Jyk7XG4gICAgY29uc3QgcGF5bG9hZEhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKEJ1ZmZlci5mcm9tKHBheWxvYWRIZXgsICdoZXgnKSkuZGlnZXN0KCdoZXgnKTtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBzZWNwMjU2azEuc2lnbihwYXlsb2FkSGFzaCwgcHJpdmF0ZUtleUJ5dGVzKTtcbiAgICBjb25zdCByID0gQnVmZmVyLmZyb20oc2lnbmF0dXJlLnIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDY0LCAnMCcpLCAnaGV4Jyk7XG4gICAgY29uc3QgcyA9IEJ1ZmZlci5mcm9tKHNpZ25hdHVyZS5zLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg2NCwgJzAnKSwgJ2hleCcpO1xuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFtyLCBzXSkudG9TdHJpbmcoJ2hleCcpO1xuICB9O1xuXG4gIGdldFRyYW5zYWN0aW9uSWQodW5zaWduZWRUcmFuc2FjdGlvbjogc3RyaW5nLCBzZW5kZXJBZGRyZXNzOiBzdHJpbmcsIHJlY2VpdmVyQWRkcmVzczogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVjb2RlZFR4biA9IHV0aWxzLmNib3JEZWNvZGUodXRpbHMuYmxvYkZyb21IZXgodW5zaWduZWRUcmFuc2FjdGlvbikpIGFzIENib3JVbnNpZ25lZFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdXBkYXRlcyA9IGRlY29kZWRUeG4udXBkYXRlcyBhcyB1bmtub3duIGFzIFtzdHJpbmcsIEh0dHBDYW5pc3RlclVwZGF0ZV1bXTtcbiAgICAgIGZvciAoY29uc3QgWywgdXBkYXRlXSBvZiB1cGRhdGVzKSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZUFyZ3MgPSB1cGRhdGUuYXJnO1xuICAgICAgICBjb25zdCBzZW5kQXJncyA9IHV0aWxzLmZyb21BcmdzKHVwZGF0ZUFyZ3MpO1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbkhhc2ggPSB0aGlzLmdlbmVyYXRlVHJhbnNhY3Rpb25IYXNoKHNlbmRBcmdzLCBzZW5kZXJBZGRyZXNzLCByZWNlaXZlckFkZHJlc3MpO1xuICAgICAgICByZXR1cm4gdHJhbnNhY3Rpb25IYXNoO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB1cGRhdGVzIGZvdW5kIGluIHRoZSB1bnNpZ25lZCB0cmFuc2FjdGlvbi4nKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gY29tcHV0ZSB0cmFuc2FjdGlvbiBJRDogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIHNhZmVCaWdJbnQodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCBiaWdpbnQge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbnN0IE1BWF8zMkJJVCA9IDQyOTQ5NjcyOTU7IC8vIDJeMzIgLSAxXG4gICAgICBjb25zdCBNSU5fMzJCSVQgPSAtNDI5NDk2NzI5NjsgLy8gLSgyXjMyKVxuICAgICAgY29uc3QgaXNPdXRzaWRlMzJCaXRSYW5nZSA9IHZhbHVlID4gTUFYXzMyQklUIHx8IHZhbHVlIDwgTUlOXzMyQklUO1xuICAgICAgcmV0dXJuIGlzT3V0c2lkZTMyQml0UmFuZ2UgPyBCaWdJbnQodmFsdWUpIDogdmFsdWU7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHR5cGU6IGV4cGVjdGVkIGEgbnVtYmVyIG9yIGJpZ2ludCwgYnV0IHJlY2VpdmVkICR7dHlwZW9mIHZhbHVlfWApO1xuICB9XG5cbiAgZ2VuZXJhdGVUcmFuc2FjdGlvbkhhc2goc2VuZEFyZ3M6IFNlbmRBcmdzLCBzZW5kZXJBZGRyZXNzOiBzdHJpbmcsIHJlY2VpdmVyQWRkcmVzczogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZW5kZXJBY2NvdW50ID0gdGhpcy5hY2NvdW50SWRlbnRpZmllcihzZW5kZXJBZGRyZXNzKTtcbiAgICBjb25zdCByZWNlaXZlckFjY291bnQgPSB0aGlzLmFjY291bnRJZGVudGlmaWVyKHJlY2VpdmVyQWRkcmVzcyk7XG5cbiAgICBjb25zdCB0cmFuc2ZlckZpZWxkcyA9IG5ldyBNYXA8YW55LCBhbnk+KFtcbiAgICAgIFswLCBzZW5kZXJBY2NvdW50XSxcbiAgICAgIFsxLCByZWNlaXZlckFjY291bnRdLFxuICAgICAgWzIsIG5ldyBNYXAoW1swLCB0aGlzLnNhZmVCaWdJbnQoc2VuZEFyZ3MucGF5bWVudC5yZWNlaXZlckdldHMuZThzKV1dKV0sXG4gICAgICBbMywgbmV3IE1hcChbWzAsIHNlbmRBcmdzLm1heEZlZS5lOHNdXSldLFxuICAgIF0pO1xuXG4gICAgY29uc3Qgb3BlcmF0aW9uTWFwID0gbmV3IE1hcChbWzIsIHRyYW5zZmVyRmllbGRzXV0pO1xuICAgIGNvbnN0IHR4bkZpZWxkcyA9IG5ldyBNYXA8YW55LCBhbnk+KFtcbiAgICAgIFswLCBvcGVyYXRpb25NYXBdLFxuICAgICAgWzEsIHRoaXMuc2FmZUJpZ0ludChzZW5kQXJncy5tZW1vLm1lbW8pXSxcbiAgICAgIFsyLCBuZXcgTWFwKFtbMCwgQmlnSW50KHNlbmRBcmdzLmNyZWF0ZWRBdFRpbWUudGltZXN0YW1wTmFub3MpXV0pXSxcbiAgICBdKTtcblxuICAgIGNvbnN0IHByb2Nlc3NlZFR4biA9IHRoaXMuZ2V0UHJvY2Vzc2VkVHJhbnNhY3Rpb25NYXAodHhuRmllbGRzKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVHhuID0gZW5jb2Rlci5lbmNvZGUocHJvY2Vzc2VkVHhuKTtcbiAgICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShzZXJpYWxpemVkVHhuKS5kaWdlc3QoJ2hleCcpO1xuICB9XG5cbiAgYWNjb3VudElkZW50aWZpZXIoYWNjb3VudEFkZHJlc3M6IHN0cmluZyk6IEFjY291bnRJZGVudGlmaWVySGFzaCB7XG4gICAgY29uc3QgYnl0ZXMgPSBCdWZmZXIuZnJvbShhY2NvdW50QWRkcmVzcywgJ2hleCcpO1xuICAgIGlmIChieXRlcy5sZW5ndGggPT09IDMyKSB7XG4gICAgICByZXR1cm4geyBoYXNoOiBieXRlcy5zbGljZSg0KSB9O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgQWNjb3VudElkZW50aWZpZXI6IDY0IGhleCBjaGFycywgZ290ICR7YWNjb3VudEFkZHJlc3MubGVuZ3RofWApO1xuICB9XG5cbiAgZ2V0UHJvY2Vzc2VkVHJhbnNhY3Rpb25NYXAodHhuTWFwOiBNYXA8YW55LCBhbnk+KTogTWFwPGFueSwgYW55PiB7XG4gICAgY29uc3Qgb3BlcmF0aW9uTWFwID0gdHhuTWFwLmdldCgwKTtcbiAgICBjb25zdCB0cmFuc2Zlck1hcCA9IG9wZXJhdGlvbk1hcC5nZXQoMik7XG4gICAgdHJhbnNmZXJNYXAuc2V0KDAsIHRoaXMuc2VyaWFsaXplQWNjb3VudElkZW50aWZpZXIodHJhbnNmZXJNYXAuZ2V0KDApKSk7XG4gICAgdHJhbnNmZXJNYXAuc2V0KDEsIHRoaXMuc2VyaWFsaXplQWNjb3VudElkZW50aWZpZXIodHJhbnNmZXJNYXAuZ2V0KDEpKSk7XG4gICAgcmV0dXJuIHR4bk1hcDtcbiAgfVxuXG4gIHNlcmlhbGl6ZUFjY291bnRJZGVudGlmaWVyKGFjY291bnRIYXNoOiBBY2NvdW50SWRlbnRpZmllckhhc2gpOiBzdHJpbmcge1xuICAgIGlmIChhY2NvdW50SGFzaCAmJiBhY2NvdW50SGFzaC5oYXNoKSB7XG4gICAgICBjb25zdCBoYXNoQnVmZmVyID0gYWNjb3VudEhhc2guaGFzaDtcbiAgICAgIGNvbnN0IGNoZWNrc3VtID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgICAgY2hlY2tzdW0ud3JpdGVVSW50MzJCRShjcmMzMi5idWYoaGFzaEJ1ZmZlcikgPj4+IDAsIDApO1xuICAgICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW2NoZWNrc3VtLCBoYXNoQnVmZmVyXSkudG9TdHJpbmcoJ2hleCcpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhY2NvdW50SGFzaCBmb3JtYXQnKTtcbiAgfVxufVxuXG5jb25zdCB1dGlscyA9IG5ldyBVdGlscygpO1xuZXhwb3J0IGRlZmF1bHQgdXRpbHM7XG4iXX0=
|