@bitgo/account-lib 2.20.0-rc.21 → 2.20.0-rc.22
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/CHANGELOG.md +8 -0
- package/dist/tsconfig.tsbuildinfo +1354 -3334
- package/package.json +7 -14
- package/dist/browser/bitgo-account-lib.js +0 -2
- package/dist/browser/bitgo-account-lib.js.LICENSE.txt +0 -337
- package/dist/src/coin/algo/assetTransferBuilder.d.ts +0 -42
- package/dist/src/coin/algo/assetTransferBuilder.d.ts.map +0 -1
- package/dist/src/coin/algo/assetTransferBuilder.js +0 -105
- package/dist/src/coin/algo/errors.d.ts +0 -11
- package/dist/src/coin/algo/errors.d.ts.map +0 -1
- package/dist/src/coin/algo/errors.js +0 -27
- package/dist/src/coin/algo/ifaces.d.ts +0 -46
- package/dist/src/coin/algo/ifaces.d.ts.map +0 -1
- package/dist/src/coin/algo/ifaces.js +0 -3
- package/dist/src/coin/algo/index.d.ts +0 -13
- package/dist/src/coin/algo/index.d.ts.map +0 -1
- package/dist/src/coin/algo/index.js +0 -47
- package/dist/src/coin/algo/keyPair.d.ts +0 -25
- package/dist/src/coin/algo/keyPair.d.ts.map +0 -1
- package/dist/src/coin/algo/keyPair.js +0 -77
- package/dist/src/coin/algo/keyRegistrationBuilder.d.ts +0 -104
- package/dist/src/coin/algo/keyRegistrationBuilder.d.ts.map +0 -1
- package/dist/src/coin/algo/keyRegistrationBuilder.js +0 -239
- package/dist/src/coin/algo/seedEncoding.d.ts +0 -25
- package/dist/src/coin/algo/seedEncoding.d.ts.map +0 -1
- package/dist/src/coin/algo/seedEncoding.js +0 -97
- package/dist/src/coin/algo/transaction.d.ts +0 -75
- package/dist/src/coin/algo/transaction.d.ts.map +0 -1
- package/dist/src/coin/algo/transaction.js +0 -251
- package/dist/src/coin/algo/transactionBuilder.d.ts +0 -204
- package/dist/src/coin/algo/transactionBuilder.d.ts.map +0 -1
- package/dist/src/coin/algo/transactionBuilder.js +0 -373
- package/dist/src/coin/algo/transactionBuilderFactory.d.ts +0 -16
- package/dist/src/coin/algo/transactionBuilderFactory.d.ts.map +0 -1
- package/dist/src/coin/algo/transactionBuilderFactory.js +0 -52
- package/dist/src/coin/algo/transferBuilder.d.ts +0 -40
- package/dist/src/coin/algo/transferBuilder.d.ts.map +0 -1
- package/dist/src/coin/algo/transferBuilder.js +0 -89
- package/dist/src/coin/algo/txnSchema.d.ts +0 -7
- package/dist/src/coin/algo/txnSchema.d.ts.map +0 -1
- package/dist/src/coin/algo/txnSchema.js +0 -68
- package/dist/src/coin/algo/utils.d.ts +0 -249
- package/dist/src/coin/algo/utils.d.ts.map +0 -1
- package/dist/src/coin/algo/utils.js +0 -539
- package/dist/src/coin/cspr/constants.d.ts +0 -19
- package/dist/src/coin/cspr/constants.d.ts.map +0 -1
- package/dist/src/coin/cspr/constants.js +0 -28
- package/dist/src/coin/cspr/delegateBuilder.d.ts +0 -49
- package/dist/src/coin/cspr/delegateBuilder.d.ts.map +0 -1
- package/dist/src/coin/cspr/delegateBuilder.js +0 -111
- package/dist/src/coin/cspr/ifaces.d.ts +0 -69
- package/dist/src/coin/cspr/ifaces.d.ts.map +0 -1
- package/dist/src/coin/cspr/ifaces.js +0 -3
- package/dist/src/coin/cspr/index.d.ts +0 -6
- package/dist/src/coin/cspr/index.d.ts.map +0 -1
- package/dist/src/coin/cspr/index.js +0 -31
- package/dist/src/coin/cspr/keyPair.d.ts +0 -18
- package/dist/src/coin/cspr/keyPair.d.ts.map +0 -1
- package/dist/src/coin/cspr/keyPair.js +0 -75
- package/dist/src/coin/cspr/transaction.d.ts +0 -55
- package/dist/src/coin/cspr/transaction.d.ts.map +0 -1
- package/dist/src/coin/cspr/transaction.js +0 -227
- package/dist/src/coin/cspr/transactionBuilder.d.ts +0 -124
- package/dist/src/coin/cspr/transactionBuilder.d.ts.map +0 -1
- package/dist/src/coin/cspr/transactionBuilder.js +0 -312
- package/dist/src/coin/cspr/transactionBuilderFactory.d.ts +0 -46
- package/dist/src/coin/cspr/transactionBuilderFactory.d.ts.map +0 -1
- package/dist/src/coin/cspr/transactionBuilderFactory.js +0 -98
- package/dist/src/coin/cspr/transferBuilder.d.ts +0 -39
- package/dist/src/coin/cspr/transferBuilder.d.ts.map +0 -1
- package/dist/src/coin/cspr/transferBuilder.js +0 -106
- package/dist/src/coin/cspr/undelegateBuilder.d.ts +0 -49
- package/dist/src/coin/cspr/undelegateBuilder.d.ts.map +0 -1
- package/dist/src/coin/cspr/undelegateBuilder.js +0 -111
- package/dist/src/coin/cspr/utils.d.ts +0 -188
- package/dist/src/coin/cspr/utils.d.ts.map +0 -1
- package/dist/src/coin/cspr/utils.js +0 -477
- package/dist/src/coin/cspr/walletInitializationBuilder.d.ts +0 -27
- package/dist/src/coin/cspr/walletInitializationBuilder.d.ts.map +0 -1
- package/dist/src/coin/cspr/walletInitializationBuilder.js +0 -95
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
-
}) : (function(o, m, k, k2) {
|
|
6
|
-
if (k2 === undefined) k2 = k;
|
|
7
|
-
o[k2] = m[k];
|
|
8
|
-
}));
|
|
9
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
-
}) : function(o, v) {
|
|
12
|
-
o["default"] = v;
|
|
13
|
-
});
|
|
14
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
-
if (mod && mod.__esModule) return mod;
|
|
16
|
-
var result = {};
|
|
17
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
-
__setModuleDefault(result, mod);
|
|
19
|
-
return result;
|
|
20
|
-
};
|
|
21
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
-
};
|
|
24
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
-
exports.SeedEncoding = void 0;
|
|
26
|
-
const base32 = __importStar(require("hi-base32"));
|
|
27
|
-
const js_sha512_1 = __importDefault(require("js-sha512"));
|
|
28
|
-
const SEED_BYTES_LENGTH = 32;
|
|
29
|
-
const ALGORAND_SEED_BYTE_LENGTH = 36;
|
|
30
|
-
const ALGORAND_CHECKSUM_BYTE_LENGTH = 4;
|
|
31
|
-
const ALGORAND_SEED_LENGTH = 58;
|
|
32
|
-
class SeedEncoding {
|
|
33
|
-
static genericHash(arr) {
|
|
34
|
-
return js_sha512_1.default.sha512_256.array(arr);
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Checks if a seed is valid
|
|
38
|
-
* @param {String} seed - encoded Algorand seed
|
|
39
|
-
* @returns {Boolean} true if valid, false otherwise
|
|
40
|
-
*/
|
|
41
|
-
static isValidSeed(seed) {
|
|
42
|
-
if (seed.length !== ALGORAND_SEED_LENGTH) {
|
|
43
|
-
return false;
|
|
44
|
-
}
|
|
45
|
-
// Try to decode
|
|
46
|
-
let decoded;
|
|
47
|
-
try {
|
|
48
|
-
decoded = SeedEncoding.decode(seed);
|
|
49
|
-
}
|
|
50
|
-
catch (e) {
|
|
51
|
-
return false;
|
|
52
|
-
}
|
|
53
|
-
// Compute checksum
|
|
54
|
-
const checksum = SeedEncoding.genericHash(decoded.seed).slice(SEED_BYTES_LENGTH - ALGORAND_CHECKSUM_BYTE_LENGTH, SEED_BYTES_LENGTH);
|
|
55
|
-
// Check if the checksum and the seed are equal
|
|
56
|
-
if (checksum.length !== decoded.checksum.length) {
|
|
57
|
-
return false;
|
|
58
|
-
}
|
|
59
|
-
return checksum.every((val, i) => val === decoded.checksum[i]);
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Decode a seed
|
|
63
|
-
*
|
|
64
|
-
* @param seed
|
|
65
|
-
* @return {{checksum: Uint8Array, seed: Uint8Array}}
|
|
66
|
-
*/
|
|
67
|
-
static decode(seed) {
|
|
68
|
-
// try to decode
|
|
69
|
-
const decoded = base32.decode.asBytes(seed);
|
|
70
|
-
// Sanity check
|
|
71
|
-
if (decoded.length !== ALGORAND_SEED_BYTE_LENGTH)
|
|
72
|
-
throw new Error('seed seems to be malformed');
|
|
73
|
-
return {
|
|
74
|
-
seed: new Uint8Array(decoded.slice(0, ALGORAND_SEED_BYTE_LENGTH - ALGORAND_CHECKSUM_BYTE_LENGTH)),
|
|
75
|
-
checksum: new Uint8Array(decoded.slice(SEED_BYTES_LENGTH, ALGORAND_SEED_BYTE_LENGTH)),
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Encode a secret key into a seed
|
|
80
|
-
*
|
|
81
|
-
* @param secretKey
|
|
82
|
-
* @return {String} encoded seed
|
|
83
|
-
*/
|
|
84
|
-
static encode(secretKey) {
|
|
85
|
-
// get seed
|
|
86
|
-
const seed = secretKey.slice(0, SEED_BYTES_LENGTH);
|
|
87
|
-
// compute checksum
|
|
88
|
-
const checksum = SeedEncoding.genericHash(seed).slice(SEED_BYTES_LENGTH - ALGORAND_CHECKSUM_BYTE_LENGTH, SEED_BYTES_LENGTH);
|
|
89
|
-
const arraySeed = new Uint8Array(seed.length + checksum.length);
|
|
90
|
-
arraySeed.set(seed);
|
|
91
|
-
arraySeed.set(checksum, seed.length);
|
|
92
|
-
const encodedSeed = base32.encode(arraySeed);
|
|
93
|
-
return encodedSeed.toString().slice(0, ALGORAND_SEED_LENGTH); // removing the extra '===='
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
exports.SeedEncoding = SeedEncoding;
|
|
97
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VlZEVuY29kaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvaW4vYWxnby9zZWVkRW5jb2RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGtEQUFvQztBQUNwQywwREFBK0I7QUFHL0IsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7QUFDN0IsTUFBTSx5QkFBeUIsR0FBRyxFQUFFLENBQUM7QUFDckMsTUFBTSw2QkFBNkIsR0FBRyxDQUFDLENBQUM7QUFDeEMsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLENBQUM7QUFFaEMsTUFBYSxZQUFZO0lBQ2YsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFlO1FBQ3hDLE9BQU8sbUJBQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFZO1FBQzdCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxvQkFBb0IsRUFBRTtZQUN4QyxPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsZ0JBQWdCO1FBQ2hCLElBQUksT0FBYSxDQUFDO1FBQ2xCLElBQUk7WUFDRixPQUFPLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNyQztRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELG1CQUFtQjtRQUNuQixNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQzNELGlCQUFpQixHQUFHLDZCQUE2QixFQUNqRCxpQkFBaUIsQ0FDbEIsQ0FBQztRQUVGLCtDQUErQztRQUMvQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDL0MsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFZO1FBQ3hCLGdCQUFnQjtRQUNoQixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU1QyxlQUFlO1FBQ2YsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLHlCQUF5QjtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUVoRyxPQUFPO1lBQ0wsSUFBSSxFQUFFLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLHlCQUF5QixHQUFHLDZCQUE2QixDQUFDLENBQUM7WUFDakcsUUFBUSxFQUFFLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUseUJBQXlCLENBQUMsQ0FBQztTQUN0RixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFxQjtRQUNqQyxXQUFXO1FBQ1gsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUNuRCxtQkFBbUI7UUFDbkIsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQ25ELGlCQUFpQixHQUFHLDZCQUE2QixFQUNqRCxpQkFBaUIsQ0FDbEIsQ0FBQztRQUNGLE1BQU0sU0FBUyxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hFLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFN0MsT0FBTyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsNEJBQTRCO0lBQzVGLENBQUM7Q0FDRjtBQTVFRCxvQ0E0RUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBiYXNlMzIgZnJvbSAnaGktYmFzZTMyJztcbmltcG9ydCBzaGE1MTIgZnJvbSAnanMtc2hhNTEyJztcbmltcG9ydCB7IFNlZWQgfSBmcm9tICcuL2lmYWNlcyc7XG5cbmNvbnN0IFNFRURfQllURVNfTEVOR1RIID0gMzI7XG5jb25zdCBBTEdPUkFORF9TRUVEX0JZVEVfTEVOR1RIID0gMzY7XG5jb25zdCBBTEdPUkFORF9DSEVDS1NVTV9CWVRFX0xFTkdUSCA9IDQ7XG5jb25zdCBBTEdPUkFORF9TRUVEX0xFTkdUSCA9IDU4O1xuXG5leHBvcnQgY2xhc3MgU2VlZEVuY29kaW5nIHtcbiAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJpY0hhc2goYXJyOiBVaW50OEFycmF5KTogbnVtYmVyW10ge1xuICAgIHJldHVybiBzaGE1MTIuc2hhNTEyXzI1Ni5hcnJheShhcnIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHNlZWQgaXMgdmFsaWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHNlZWQgLSBlbmNvZGVkIEFsZ29yYW5kIHNlZWRcbiAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdmFsaWQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgc3RhdGljIGlzVmFsaWRTZWVkKHNlZWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChzZWVkLmxlbmd0aCAhPT0gQUxHT1JBTkRfU0VFRF9MRU5HVEgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBUcnkgdG8gZGVjb2RlXG4gICAgbGV0IGRlY29kZWQ6IFNlZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGRlY29kZWQgPSBTZWVkRW5jb2RpbmcuZGVjb2RlKHNlZWQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDb21wdXRlIGNoZWNrc3VtXG4gICAgY29uc3QgY2hlY2tzdW0gPSBTZWVkRW5jb2RpbmcuZ2VuZXJpY0hhc2goZGVjb2RlZC5zZWVkKS5zbGljZShcbiAgICAgIFNFRURfQllURVNfTEVOR1RIIC0gQUxHT1JBTkRfQ0hFQ0tTVU1fQllURV9MRU5HVEgsXG4gICAgICBTRUVEX0JZVEVTX0xFTkdUSCxcbiAgICApO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNoZWNrc3VtIGFuZCB0aGUgc2VlZCBhcmUgZXF1YWxcbiAgICBpZiAoY2hlY2tzdW0ubGVuZ3RoICE9PSBkZWNvZGVkLmNoZWNrc3VtLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gY2hlY2tzdW0uZXZlcnkoKHZhbCwgaSkgPT4gdmFsID09PSBkZWNvZGVkLmNoZWNrc3VtW2ldKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGUgYSBzZWVkXG4gICAqXG4gICAqIEBwYXJhbSBzZWVkXG4gICAqIEByZXR1cm4ge3tjaGVja3N1bTogVWludDhBcnJheSwgc2VlZDogVWludDhBcnJheX19XG4gICAqL1xuICBzdGF0aWMgZGVjb2RlKHNlZWQ6IHN0cmluZyk6IFNlZWQge1xuICAgIC8vIHRyeSB0byBkZWNvZGVcbiAgICBjb25zdCBkZWNvZGVkID0gYmFzZTMyLmRlY29kZS5hc0J5dGVzKHNlZWQpO1xuXG4gICAgLy8gU2FuaXR5IGNoZWNrXG4gICAgaWYgKGRlY29kZWQubGVuZ3RoICE9PSBBTEdPUkFORF9TRUVEX0JZVEVfTEVOR1RIKSB0aHJvdyBuZXcgRXJyb3IoJ3NlZWQgc2VlbXMgdG8gYmUgbWFsZm9ybWVkJyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2VlZDogbmV3IFVpbnQ4QXJyYXkoZGVjb2RlZC5zbGljZSgwLCBBTEdPUkFORF9TRUVEX0JZVEVfTEVOR1RIIC0gQUxHT1JBTkRfQ0hFQ0tTVU1fQllURV9MRU5HVEgpKSxcbiAgICAgIGNoZWNrc3VtOiBuZXcgVWludDhBcnJheShkZWNvZGVkLnNsaWNlKFNFRURfQllURVNfTEVOR1RILCBBTEdPUkFORF9TRUVEX0JZVEVfTEVOR1RIKSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmNvZGUgYSBzZWNyZXQga2V5IGludG8gYSBzZWVkXG4gICAqXG4gICAqIEBwYXJhbSBzZWNyZXRLZXlcbiAgICogQHJldHVybiB7U3RyaW5nfSBlbmNvZGVkIHNlZWRcbiAgICovXG4gIHN0YXRpYyBlbmNvZGUoc2VjcmV0S2V5OiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICAvLyBnZXQgc2VlZFxuICAgIGNvbnN0IHNlZWQgPSBzZWNyZXRLZXkuc2xpY2UoMCwgU0VFRF9CWVRFU19MRU5HVEgpO1xuICAgIC8vIGNvbXB1dGUgY2hlY2tzdW1cbiAgICBjb25zdCBjaGVja3N1bSA9IFNlZWRFbmNvZGluZy5nZW5lcmljSGFzaChzZWVkKS5zbGljZShcbiAgICAgIFNFRURfQllURVNfTEVOR1RIIC0gQUxHT1JBTkRfQ0hFQ0tTVU1fQllURV9MRU5HVEgsXG4gICAgICBTRUVEX0JZVEVTX0xFTkdUSCxcbiAgICApO1xuICAgIGNvbnN0IGFycmF5U2VlZCA9IG5ldyBVaW50OEFycmF5KHNlZWQubGVuZ3RoICsgY2hlY2tzdW0ubGVuZ3RoKTtcbiAgICBhcnJheVNlZWQuc2V0KHNlZWQpO1xuICAgIGFycmF5U2VlZC5zZXQoY2hlY2tzdW0sIHNlZWQubGVuZ3RoKTtcbiAgICBjb25zdCBlbmNvZGVkU2VlZCA9IGJhc2UzMi5lbmNvZGUoYXJyYXlTZWVkKTtcblxuICAgIHJldHVybiBlbmNvZGVkU2VlZC50b1N0cmluZygpLnNsaWNlKDAsIEFMR09SQU5EX1NFRURfTEVOR1RIKTsgLy8gcmVtb3ZpbmcgdGhlIGV4dHJhICc9PT09J1xuICB9XG59XG4iXX0=
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import { BaseCoin as CoinConfig } from '@bitgo/statics';
|
|
2
|
-
import algosdk from 'algosdk';
|
|
3
|
-
import { BaseTransaction, TransactionType, BaseKey } from '@bitgo/sdk-core';
|
|
4
|
-
import { KeyPair } from './keyPair';
|
|
5
|
-
import { TxData } from './ifaces';
|
|
6
|
-
export declare class Transaction extends BaseTransaction {
|
|
7
|
-
private _algoTransaction?;
|
|
8
|
-
private _signedTransaction?;
|
|
9
|
-
private _numberOfRequiredSigners;
|
|
10
|
-
private _sender;
|
|
11
|
-
private _signers;
|
|
12
|
-
private _signedBy;
|
|
13
|
-
constructor(coinConfig: Readonly<CoinConfig>);
|
|
14
|
-
/** @inheritdoc */
|
|
15
|
-
canSign({ key }: BaseKey): boolean;
|
|
16
|
-
sender(address: string): void;
|
|
17
|
-
/**
|
|
18
|
-
* Signs transaction.
|
|
19
|
-
*
|
|
20
|
-
* @param {KeyPair} keyPair Signer keys.
|
|
21
|
-
*/
|
|
22
|
-
sign(keyPair: KeyPair[]): void;
|
|
23
|
-
/**
|
|
24
|
-
* Signs transaction.
|
|
25
|
-
*
|
|
26
|
-
* @param {KeyPair} keyPair Signer keys.
|
|
27
|
-
*/
|
|
28
|
-
private signSingle;
|
|
29
|
-
/**
|
|
30
|
-
* Signs multisig transaction.
|
|
31
|
-
*
|
|
32
|
-
* @param {KeyPair} keyPair Signers keys.
|
|
33
|
-
*/
|
|
34
|
-
private signMultiSig;
|
|
35
|
-
set signedTransaction(txn: Uint8Array);
|
|
36
|
-
get numberOfRequiredSigners(): number;
|
|
37
|
-
/**
|
|
38
|
-
* Sets the number of signers required for signing this transaction.
|
|
39
|
-
*
|
|
40
|
-
* @param {number} num Threshold number of signers.
|
|
41
|
-
*/
|
|
42
|
-
setNumberOfRequiredSigners(num: number): void;
|
|
43
|
-
set signers(addrs: string[]);
|
|
44
|
-
get signers(): string[];
|
|
45
|
-
set signedBy(signer: string[]);
|
|
46
|
-
get signedBy(): string[];
|
|
47
|
-
/**
|
|
48
|
-
* Sets algo transaction.
|
|
49
|
-
*
|
|
50
|
-
* @param {algosdk.Transaction} tx
|
|
51
|
-
*/
|
|
52
|
-
setAlgoTransaction(tx: algosdk.Transaction): void;
|
|
53
|
-
/**
|
|
54
|
-
* Get underlaying algo transaction.
|
|
55
|
-
*
|
|
56
|
-
* @returns {algosdk.Transaction}
|
|
57
|
-
*/
|
|
58
|
-
getAlgoTransaction(): algosdk.Transaction | undefined;
|
|
59
|
-
/**
|
|
60
|
-
* Set the transaction type.
|
|
61
|
-
*
|
|
62
|
-
* @param {TransactionType} transactionType The transaction type to be set.
|
|
63
|
-
*/
|
|
64
|
-
setTransactionType(transactionType: TransactionType): void;
|
|
65
|
-
estimateSize(): number;
|
|
66
|
-
/** @inheritdoc */
|
|
67
|
-
toBroadcastFormat(): Uint8Array;
|
|
68
|
-
/** @inheritdoc */
|
|
69
|
-
toJson(): TxData;
|
|
70
|
-
/**
|
|
71
|
-
* Load the input and output data on this transaction.
|
|
72
|
-
*/
|
|
73
|
-
loadInputsAndOutputs(): void;
|
|
74
|
-
}
|
|
75
|
-
//# sourceMappingURL=transaction.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../../src/coin/algo/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EACL,eAAe,EACf,eAAe,EACf,OAAO,EAIR,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,qBAAa,WAAY,SAAQ,eAAe;IAC9C,OAAO,CAAC,gBAAgB,CAAC,CAAsB;IAC/C,OAAO,CAAC,kBAAkB,CAAC,CAAa;IACxC,OAAO,CAAC,wBAAwB,CAAS;IACzC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,SAAS,CAAW;gBAEhB,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAM5C,kBAAkB;IAClB,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,GAAG,OAAO;IAiBlC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI7B;;;;OAIG;IACH,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI;IAW9B;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAYlB;;;;OAIG;IACH,OAAO,CAAC,YAAY;IA+BpB,IAAI,iBAAiB,CAAC,GAAG,EAAE,UAAU,EAEpC;IAED,IAAI,uBAAuB,IAAI,MAAM,CAEpC;IAED;;;;OAIG;IACH,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI7C,IAAI,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,EAE1B;IAED,IAAI,OAAO,IAAI,MAAM,EAAE,CAEtB;IAED,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,EAE5B;IAED,IAAI,QAAQ,IAAI,MAAM,EAAE,CAEvB;IAED;;;;OAIG;IAEH,kBAAkB,CAAC,EAAE,EAAE,OAAO,CAAC,WAAW,GAAG,IAAI;IAIjD;;;;OAIG;IAEH,kBAAkB,IAAI,OAAO,CAAC,WAAW,GAAG,SAAS;IAIrD;;;;OAIG;IACH,kBAAkB,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI;IAI1D,YAAY,IAAI,MAAM;IAQtB,kBAAkB;IAClB,iBAAiB,IAAI,UAAU;IAW/B,kBAAkB;IAClB,MAAM,IAAI,MAAM;IAoDhB;;OAEG;IACH,oBAAoB,IAAI,IAAI;CAsB7B"}
|
|
@@ -1,251 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.Transaction = void 0;
|
|
7
|
-
const algosdk_1 = __importDefault(require("algosdk"));
|
|
8
|
-
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
9
|
-
const utils_1 = __importDefault(require("./utils"));
|
|
10
|
-
const keyPair_1 = require("./keyPair");
|
|
11
|
-
class Transaction extends sdk_core_1.BaseTransaction {
|
|
12
|
-
constructor(coinConfig) {
|
|
13
|
-
super(coinConfig);
|
|
14
|
-
this._numberOfRequiredSigners = 0;
|
|
15
|
-
this._signers = [];
|
|
16
|
-
}
|
|
17
|
-
/** @inheritdoc */
|
|
18
|
-
canSign({ key }) {
|
|
19
|
-
if (this._numberOfRequiredSigners === 0) {
|
|
20
|
-
return false;
|
|
21
|
-
}
|
|
22
|
-
if (this._numberOfRequiredSigners === 1) {
|
|
23
|
-
const kp = new keyPair_1.KeyPair({ prv: key });
|
|
24
|
-
const addr = kp.getAddress();
|
|
25
|
-
if (addr === this._sender) {
|
|
26
|
-
return true;
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
return false;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
return true;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
sender(address) {
|
|
37
|
-
this._sender = address;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Signs transaction.
|
|
41
|
-
*
|
|
42
|
-
* @param {KeyPair} keyPair Signer keys.
|
|
43
|
-
*/
|
|
44
|
-
sign(keyPair) {
|
|
45
|
-
if (!this._algoTransaction) {
|
|
46
|
-
throw new sdk_core_1.InvalidTransactionError('Empty transaction');
|
|
47
|
-
}
|
|
48
|
-
if (this._numberOfRequiredSigners === 1) {
|
|
49
|
-
this.signSingle(keyPair[0]);
|
|
50
|
-
}
|
|
51
|
-
else if (this._numberOfRequiredSigners > 1) {
|
|
52
|
-
this.signMultiSig(keyPair);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Signs transaction.
|
|
57
|
-
*
|
|
58
|
-
* @param {KeyPair} keyPair Signer keys.
|
|
59
|
-
*/
|
|
60
|
-
signSingle(keyPair) {
|
|
61
|
-
if (!this._algoTransaction) {
|
|
62
|
-
throw new sdk_core_1.InvalidTransactionError('Empty transaction');
|
|
63
|
-
}
|
|
64
|
-
const signKey = Buffer.from(keyPair.getSigningKey()).toString('hex');
|
|
65
|
-
if (signKey) {
|
|
66
|
-
this._signedTransaction = algosdk_1.default.signTransaction(this._algoTransaction, utils_1.default.toUint8Array(signKey)).blob;
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
throw new sdk_core_1.InvalidKey('Private key undefined');
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Signs multisig transaction.
|
|
74
|
-
*
|
|
75
|
-
* @param {KeyPair} keyPair Signers keys.
|
|
76
|
-
*/
|
|
77
|
-
signMultiSig(keyPair) {
|
|
78
|
-
if (!this._algoTransaction) {
|
|
79
|
-
throw new sdk_core_1.InvalidTransactionError('Empty transaction');
|
|
80
|
-
}
|
|
81
|
-
if (this._signers.length === 0) {
|
|
82
|
-
throw new sdk_core_1.SigningError('Signers not specified for multisig');
|
|
83
|
-
}
|
|
84
|
-
if (keyPair.length === 0) {
|
|
85
|
-
throw new sdk_core_1.SigningError('Keypair not specified for multisig');
|
|
86
|
-
}
|
|
87
|
-
const multiSigOptions = {
|
|
88
|
-
version: 1,
|
|
89
|
-
threshold: this._numberOfRequiredSigners,
|
|
90
|
-
addrs: this._signers,
|
|
91
|
-
};
|
|
92
|
-
const msigAddress = algosdk_1.default.multisigAddress(multiSigOptions);
|
|
93
|
-
this._algoTransaction.from = algosdk_1.default.decodeAddress(msigAddress);
|
|
94
|
-
// Check if it is a signed or unsigned tx.
|
|
95
|
-
// If unsigned, sign it using first keypair and then append next signatures.
|
|
96
|
-
// If signed, appending next signatures.
|
|
97
|
-
let signedTx = this._signedTransaction
|
|
98
|
-
? this._signedTransaction
|
|
99
|
-
: algosdk_1.default.signMultisigTransaction(this._algoTransaction, multiSigOptions, keyPair.shift().getSigningKey()).blob;
|
|
100
|
-
keyPair.forEach((kp) => {
|
|
101
|
-
signedTx = algosdk_1.default.appendSignMultisigTransaction(signedTx, multiSigOptions, kp.getSigningKey()).blob;
|
|
102
|
-
});
|
|
103
|
-
this._signedTransaction = signedTx;
|
|
104
|
-
}
|
|
105
|
-
set signedTransaction(txn) {
|
|
106
|
-
this._signedTransaction = txn;
|
|
107
|
-
}
|
|
108
|
-
get numberOfRequiredSigners() {
|
|
109
|
-
return this._numberOfRequiredSigners;
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Sets the number of signers required for signing this transaction.
|
|
113
|
-
*
|
|
114
|
-
* @param {number} num Threshold number of signers.
|
|
115
|
-
*/
|
|
116
|
-
setNumberOfRequiredSigners(num) {
|
|
117
|
-
this._numberOfRequiredSigners = num;
|
|
118
|
-
}
|
|
119
|
-
set signers(addrs) {
|
|
120
|
-
this._signers = addrs;
|
|
121
|
-
}
|
|
122
|
-
get signers() {
|
|
123
|
-
return this._signers;
|
|
124
|
-
}
|
|
125
|
-
set signedBy(signer) {
|
|
126
|
-
this._signedBy = signer;
|
|
127
|
-
}
|
|
128
|
-
get signedBy() {
|
|
129
|
-
return this._signedBy;
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Sets algo transaction.
|
|
133
|
-
*
|
|
134
|
-
* @param {algosdk.Transaction} tx
|
|
135
|
-
*/
|
|
136
|
-
setAlgoTransaction(tx) {
|
|
137
|
-
this._algoTransaction = tx;
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Get underlaying algo transaction.
|
|
141
|
-
*
|
|
142
|
-
* @returns {algosdk.Transaction}
|
|
143
|
-
*/
|
|
144
|
-
getAlgoTransaction() {
|
|
145
|
-
return this._algoTransaction;
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* Set the transaction type.
|
|
149
|
-
*
|
|
150
|
-
* @param {TransactionType} transactionType The transaction type to be set.
|
|
151
|
-
*/
|
|
152
|
-
setTransactionType(transactionType) {
|
|
153
|
-
this._type = transactionType;
|
|
154
|
-
}
|
|
155
|
-
estimateSize() {
|
|
156
|
-
if (!this._algoTransaction) {
|
|
157
|
-
throw new sdk_core_1.InvalidTransactionError('Empty transaction');
|
|
158
|
-
}
|
|
159
|
-
return this._algoTransaction.estimateSize();
|
|
160
|
-
}
|
|
161
|
-
/** @inheritdoc */
|
|
162
|
-
toBroadcastFormat() {
|
|
163
|
-
if (!this._algoTransaction) {
|
|
164
|
-
throw new sdk_core_1.InvalidTransactionError('Empty transaction');
|
|
165
|
-
}
|
|
166
|
-
if (this._signedTransaction && this._signedTransaction.length > 0) {
|
|
167
|
-
return this._signedTransaction;
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
return algosdk_1.default.encodeUnsignedTransaction(this._algoTransaction);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
/** @inheritdoc */
|
|
174
|
-
toJson() {
|
|
175
|
-
var _a, _b;
|
|
176
|
-
if (!this._algoTransaction) {
|
|
177
|
-
throw new sdk_core_1.InvalidTransactionError('Empty transaction');
|
|
178
|
-
}
|
|
179
|
-
const result = {
|
|
180
|
-
id: this._algoTransaction.txID(),
|
|
181
|
-
type: (_a = this._algoTransaction.type) === null || _a === void 0 ? void 0 : _a.toString(),
|
|
182
|
-
from: algosdk_1.default.encodeAddress(this._algoTransaction.from.publicKey),
|
|
183
|
-
fee: this._algoTransaction.fee,
|
|
184
|
-
firstRound: this._algoTransaction.firstRound,
|
|
185
|
-
lastRound: this._algoTransaction.lastRound,
|
|
186
|
-
note: this._algoTransaction.note,
|
|
187
|
-
tokenId: (_b = this._algoTransaction) === null || _b === void 0 ? void 0 : _b.assetIndex,
|
|
188
|
-
genesisID: this._algoTransaction.genesisID,
|
|
189
|
-
genesisHash: this._algoTransaction.genesisHash.toString('base64'),
|
|
190
|
-
};
|
|
191
|
-
if (this._algoTransaction.closeRemainderTo) {
|
|
192
|
-
result.closeRemainderTo = algosdk_1.default.encodeAddress(this._algoTransaction.closeRemainderTo.publicKey);
|
|
193
|
-
}
|
|
194
|
-
if (this.type === sdk_core_1.TransactionType.Send) {
|
|
195
|
-
result.to = algosdk_1.default.encodeAddress(this._algoTransaction.to.publicKey);
|
|
196
|
-
result.amount = this._algoTransaction.amount.toString();
|
|
197
|
-
}
|
|
198
|
-
if (this.type === sdk_core_1.TransactionType.WalletInitialization) {
|
|
199
|
-
if (!this._algoTransaction.nonParticipation) {
|
|
200
|
-
if (this._algoTransaction.voteKey &&
|
|
201
|
-
this._algoTransaction.selectionKey &&
|
|
202
|
-
this._algoTransaction.voteFirst &&
|
|
203
|
-
this._algoTransaction.voteLast &&
|
|
204
|
-
this._algoTransaction.voteKeyDilution) {
|
|
205
|
-
result.voteKey = this._algoTransaction.voteKey.toString('base64');
|
|
206
|
-
result.selectionKey = this._algoTransaction.selectionKey.toString('base64');
|
|
207
|
-
result.voteFirst = this._algoTransaction.voteFirst;
|
|
208
|
-
result.voteLast = this._algoTransaction.voteLast;
|
|
209
|
-
result.voteKeyDilution = this._algoTransaction.voteKeyDilution;
|
|
210
|
-
if (this._algoTransaction.stateProofKey) {
|
|
211
|
-
result.stateProofKey = this._algoTransaction.stateProofKey.toString('base64');
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
else {
|
|
216
|
-
result.nonParticipation = this._algoTransaction.nonParticipation;
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
if (result.type === 'axfer' && result.to && result.amount) {
|
|
220
|
-
result.txType = utils_1.default.getTokenTxType(result.amount, result.from, result.to, result.closeRemainderTo);
|
|
221
|
-
result.tokenName = this._coinConfig.suffix;
|
|
222
|
-
}
|
|
223
|
-
return result;
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Load the input and output data on this transaction.
|
|
227
|
-
*/
|
|
228
|
-
loadInputsAndOutputs() {
|
|
229
|
-
if (!this._algoTransaction) {
|
|
230
|
-
return;
|
|
231
|
-
}
|
|
232
|
-
if (this.type === sdk_core_1.TransactionType.Send) {
|
|
233
|
-
this._outputs = [
|
|
234
|
-
{
|
|
235
|
-
address: algosdk_1.default.encodeAddress(this._algoTransaction.to.publicKey),
|
|
236
|
-
value: this._algoTransaction.amount.toString(),
|
|
237
|
-
coin: this._coinConfig.name,
|
|
238
|
-
},
|
|
239
|
-
];
|
|
240
|
-
this._inputs = [
|
|
241
|
-
{
|
|
242
|
-
address: algosdk_1.default.encodeAddress(this._algoTransaction.from.publicKey),
|
|
243
|
-
value: this._algoTransaction.amount.toString(),
|
|
244
|
-
coin: this._coinConfig.name,
|
|
245
|
-
},
|
|
246
|
-
];
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
exports.Transaction = Transaction;
|
|
251
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29pbi9hbGdvL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLHNEQUE4QjtBQUM5Qiw4Q0FPeUI7QUFDekIsb0RBQTRCO0FBQzVCLHVDQUFvQztBQUdwQyxNQUFhLFdBQVksU0FBUSwwQkFBZTtJQVE5QyxZQUFZLFVBQWdDO1FBQzFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsd0JBQXdCLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFXO1FBQ3RCLElBQUksSUFBSSxDQUFDLHdCQUF3QixLQUFLLENBQUMsRUFBRTtZQUN2QyxPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEtBQUssQ0FBQyxFQUFFO1lBQ3ZDLE1BQU0sRUFBRSxHQUFHLElBQUksaUJBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUM3QixJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUN6QixPQUFPLElBQUksQ0FBQzthQUNiO2lCQUFNO2dCQUNMLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7U0FDRjthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUM7U0FDYjtJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsT0FBZTtRQUNwQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksQ0FBQyxPQUFrQjtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixF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Q0FBQyxJQUFJO2lCQUM1QjthQUNGLENBQUM7WUFFRixJQUFJLENBQUMsT0FBTyxHQUFHO2dCQUNiO29CQUNFLE9BQU8sRUFBRSxpQkFBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDcEUsS0FBSyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO29CQUM5QyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJO2lCQUM1QjthQUNGLENBQUM7U0FDSDtJQUNILENBQUM7Q0FDRjtBQXpRRCxrQ0F5UUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IGFsZ29zZGsgZnJvbSAnYWxnb3Nkayc7XG5pbXBvcnQge1xuICBCYXNlVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uVHlwZSxcbiAgQmFzZUtleSxcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIEludmFsaWRLZXksXG4gIFNpZ25pbmdFcnJvcixcbn0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IHsgVHhEYXRhIH0gZnJvbSAnLi9pZmFjZXMnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb24gZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb24ge1xuICBwcml2YXRlIF9hbGdvVHJhbnNhY3Rpb24/OiBhbGdvc2RrLlRyYW5zYWN0aW9uO1xuICBwcml2YXRlIF9zaWduZWRUcmFuc2FjdGlvbj86IFVpbnQ4QXJyYXk7XG4gIHByaXZhdGUgX251bWJlck9mUmVxdWlyZWRTaWduZXJzOiBudW1iZXI7XG4gIHByaXZhdGUgX3NlbmRlcjogc3RyaW5nO1xuICBwcml2YXRlIF9zaWduZXJzOiBzdHJpbmdbXTtcbiAgcHJpdmF0ZSBfc2lnbmVkQnk6IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKGNvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoY29pbkNvbmZpZyk7XG4gICAgdGhpcy5fbnVtYmVyT2ZSZXF1aXJlZFNpZ25lcnMgPSAwO1xuICAgIHRoaXMuX3NpZ25lcnMgPSBbXTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBjYW5TaWduKHsga2V5IH06IEJhc2VLZXkpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fbnVtYmVyT2ZSZXF1aXJlZFNpZ25lcnMgPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX251bWJlck9mUmVxdWlyZWRTaWduZXJzID09PSAxKSB7XG4gICAgICBjb25zdCBrcCA9IG5ldyBLZXlQYWlyKHsgcHJ2OiBrZXkgfSk7XG4gICAgICBjb25zdCBhZGRyID0ga3AuZ2V0QWRkcmVzcygpO1xuICAgICAgaWYgKGFkZHIgPT09IHRoaXMuX3NlbmRlcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgc2VuZGVyKGFkZHJlc3M6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3NlbmRlciA9IGFkZHJlc3M7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7S2V5UGFpcn0ga2V5UGFpciBTaWduZXIga2V5cy5cbiAgICovXG4gIHNpZ24oa2V5UGFpcjogS2V5UGFpcltdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9hbGdvVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX251bWJlck9mUmVxdWlyZWRTaWduZXJzID09PSAxKSB7XG4gICAgICB0aGlzLnNpZ25TaW5nbGUoa2V5UGFpclswXSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9udW1iZXJPZlJlcXVpcmVkU2lnbmVycyA+IDEpIHtcbiAgICAgIHRoaXMuc2lnbk11bHRpU2lnKGtleVBhaXIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtLZXlQYWlyfSBrZXlQYWlyIFNpZ25lciBrZXlzLlxuICAgKi9cbiAgcHJpdmF0ZSBzaWduU2luZ2xlKGtleVBhaXI6IEtleVBhaXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2FsZ29UcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICBjb25zdCBzaWduS2V5ID0gQnVmZmVyLmZyb20oa2V5UGFpci5nZXRTaWduaW5nS2V5KCkpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBpZiAoc2lnbktleSkge1xuICAgICAgdGhpcy5fc2lnbmVkVHJhbnNhY3Rpb24gPSBhbGdvc2RrLnNpZ25UcmFuc2FjdGlvbih0aGlzLl9hbGdvVHJhbnNhY3Rpb24sIHV0aWxzLnRvVWludDhBcnJheShzaWduS2V5KSkuYmxvYjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXkoJ1ByaXZhdGUga2V5IHVuZGVmaW5lZCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBtdWx0aXNpZyB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtLZXlQYWlyfSBrZXlQYWlyIFNpZ25lcnMga2V5cy5cbiAgICovXG4gIHByaXZhdGUgc2lnbk11bHRpU2lnKGtleVBhaXI6IEtleVBhaXJbXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fYWxnb1RyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zaWduZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignU2lnbmVycyBub3Qgc3BlY2lmaWVkIGZvciBtdWx0aXNpZycpO1xuICAgIH1cbiAgICBpZiAoa2V5UGFpci5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ0tleXBhaXIgbm90IHNwZWNpZmllZCBmb3IgbXVsdGlzaWcnKTtcbiAgICB9XG4gICAgY29uc3QgbXVsdGlTaWdPcHRpb25zID0ge1xuICAgICAgdmVyc2lvbjogMSxcbiAgICAgIHRocmVzaG9sZDogdGhpcy5fbnVtYmVyT2ZSZXF1aXJlZFNpZ25lcnMsXG4gICAgICBhZGRyczogdGhpcy5fc2lnbmVycyxcbiAgICB9O1xuICAgIGNvbnN0IG1zaWdBZGRyZXNzID0gYWxnb3Nkay5tdWx0aXNpZ0FkZHJlc3MobXVsdGlTaWdPcHRpb25zKTtcbiAgICB0aGlzLl9hbGdvVHJhbnNhY3Rpb24uZnJvbSA9IGFsZ29zZGsuZGVjb2RlQWRkcmVzcyhtc2lnQWRkcmVzcyk7XG5cbiAgICAvLyBDaGVjayBpZiBpdCBpcyBhIHNpZ25lZCBvciB1bnNpZ25lZCB0eC5cbiAgICAvLyBJZiB1bnNpZ25lZCwgc2lnbiBpdCB1c2luZyBmaXJzdCBrZXlwYWlyIGFuZCB0aGVuIGFwcGVuZCBuZXh0IHNpZ25hdHVyZXMuXG4gICAgLy8gSWYgc2lnbmVkLCBhcHBlbmRpbmcgbmV4dCBzaWduYXR1cmVzLlxuICAgIGxldCBzaWduZWRUeCA9IHRoaXMuX3NpZ25lZFRyYW5zYWN0aW9uXG4gICAgICA/IHRoaXMuX3NpZ25lZFRyYW5zYWN0aW9uXG4gICAgICA6IGFsZ29zZGsuc2lnbk11bHRpc2lnVHJhbnNhY3Rpb24odGhpcy5fYWxnb1RyYW5zYWN0aW9uLCBtdWx0aVNpZ09wdGlvbnMsIGtleVBhaXIuc2hpZnQoKSEuZ2V0U2lnbmluZ0tleSgpKS5ibG9iO1xuXG4gICAga2V5UGFpci5mb3JFYWNoKChrcCkgPT4ge1xuICAgICAgc2lnbmVkVHggPSBhbGdvc2RrLmFwcGVuZFNpZ25NdWx0aXNpZ1RyYW5zYWN0aW9uKHNpZ25lZFR4LCBtdWx0aVNpZ09wdGlvbnMsIGtwLmdldFNpZ25pbmdLZXkoKSkuYmxvYjtcbiAgICB9KTtcbiAgICB0aGlzLl9zaWduZWRUcmFuc2FjdGlvbiA9IHNpZ25lZFR4O1xuICB9XG5cbiAgc2V0IHNpZ25lZFRyYW5zYWN0aW9uKHR4bjogVWludDhBcnJheSkge1xuICAgIHRoaXMuX3NpZ25lZFRyYW5zYWN0aW9uID0gdHhuO1xuICB9XG5cbiAgZ2V0IG51bWJlck9mUmVxdWlyZWRTaWduZXJzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX251bWJlck9mUmVxdWlyZWRTaWduZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG51bWJlciBvZiBzaWduZXJzIHJlcXVpcmVkIGZvciBzaWduaW5nIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBudW0gVGhyZXNob2xkIG51bWJlciBvZiBzaWduZXJzLlxuICAgKi9cbiAgc2V0TnVtYmVyT2ZSZXF1aXJlZFNpZ25lcnMobnVtOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9udW1iZXJPZlJlcXVpcmVkU2lnbmVycyA9IG51bTtcbiAgfVxuXG4gIHNldCBzaWduZXJzKGFkZHJzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX3NpZ25lcnMgPSBhZGRycztcbiAgfVxuXG4gIGdldCBzaWduZXJzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fc2lnbmVycztcbiAgfVxuXG4gIHNldCBzaWduZWRCeShzaWduZXI6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fc2lnbmVkQnkgPSBzaWduZXI7XG4gIH1cblxuICBnZXQgc2lnbmVkQnkoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9zaWduZWRCeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGFsZ28gdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7YWxnb3Nkay5UcmFuc2FjdGlvbn0gdHhcbiAgICovXG5cbiAgc2V0QWxnb1RyYW5zYWN0aW9uKHR4OiBhbGdvc2RrLlRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5fYWxnb1RyYW5zYWN0aW9uID0gdHg7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHVuZGVybGF5aW5nIGFsZ28gdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIHthbGdvc2RrLlRyYW5zYWN0aW9ufVxuICAgKi9cblxuICBnZXRBbGdvVHJhbnNhY3Rpb24oKTogYWxnb3Nkay5UcmFuc2FjdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2FsZ29UcmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRyYW5zYWN0aW9uIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25UeXBlfSB0cmFuc2FjdGlvblR5cGUgVGhlIHRyYW5zYWN0aW9uIHR5cGUgdG8gYmUgc2V0LlxuICAgKi9cbiAgc2V0VHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uVHlwZTogVHJhbnNhY3Rpb25UeXBlKTogdm9pZCB7XG4gICAgdGhpcy5fdHlwZSA9IHRyYW5zYWN0aW9uVHlwZTtcbiAgfVxuXG4gIGVzdGltYXRlU2l6ZSgpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5fYWxnb1RyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2FsZ29UcmFuc2FjdGlvbi5lc3RpbWF0ZVNpemUoKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0b0Jyb2FkY2FzdEZvcm1hdCgpOiBVaW50OEFycmF5IHtcbiAgICBpZiAoIXRoaXMuX2FsZ29UcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc2lnbmVkVHJhbnNhY3Rpb24gJiYgdGhpcy5fc2lnbmVkVHJhbnNhY3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NpZ25lZFRyYW5zYWN0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYWxnb3Nkay5lbmNvZGVVbnNpZ25lZFRyYW5zYWN0aW9uKHRoaXMuX2FsZ29UcmFuc2FjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHRvSnNvbigpOiBUeERhdGEge1xuICAgIGlmICghdGhpcy5fYWxnb1RyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdDogVHhEYXRhID0ge1xuICAgICAgaWQ6IHRoaXMuX2FsZ29UcmFuc2FjdGlvbi50eElEKCksXG4gICAgICB0eXBlOiB0aGlzLl9hbGdvVHJhbnNhY3Rpb24udHlwZT8udG9TdHJpbmcoKSxcbiAgICAgIGZyb206IGFsZ29zZGsuZW5jb2RlQWRkcmVzcyh0aGlzLl9hbGdvVHJhbnNhY3Rpb24uZnJvbS5wdWJsaWNLZXkpLFxuICAgICAgZmVlOiB0aGlzLl9hbGdvVHJhbnNhY3Rpb24uZmVlLFxuICAgICAgZmlyc3RSb3VuZDogdGhpcy5fYWxnb1RyYW5zYWN0aW9uLmZpcnN0Um91bmQsXG4gICAgICBsYXN0Um91bmQ6IHRoaXMuX2FsZ29UcmFuc2FjdGlvbi5sYXN0Um91bmQsXG4gICAgICBub3RlOiB0aGlzLl9hbGdvVHJhbnNhY3Rpb24ubm90ZSxcbiAgICAgIHRva2VuSWQ6IHRoaXMuX2FsZ29UcmFuc2FjdGlvbj8uYXNzZXRJbmRleCxcbiAgICAgIGdlbmVzaXNJRDogdGhpcy5fYWxnb1RyYW5zYWN0aW9uLmdlbmVzaXNJRCxcbiAgICAgIGdlbmVzaXNIYXNoOiB0aGlzLl9hbGdvVHJhbnNhY3Rpb24uZ2VuZXNpc0hhc2gudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIH07XG4gICAgaWYgKHRoaXMuX2FsZ29UcmFuc2FjdGlvbi5jbG9zZVJlbWFpbmRlclRvKSB7XG4gICAgICByZXN1bHQuY2xvc2VSZW1haW5kZXJUbyA9IGFsZ29zZGsuZW5jb2RlQWRkcmVzcyh0aGlzLl9hbGdvVHJhbnNhY3Rpb24uY2xvc2VSZW1haW5kZXJUby5wdWJsaWNLZXkpO1xuICAgIH1cbiAgICBpZiAodGhpcy50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuU2VuZCkge1xuICAgICAgcmVzdWx0LnRvID0gYWxnb3Nkay5lbmNvZGVBZGRyZXNzKHRoaXMuX2FsZ29UcmFuc2FjdGlvbi50by5wdWJsaWNLZXkpO1xuICAgICAgcmVzdWx0LmFtb3VudCA9IHRoaXMuX2FsZ29UcmFuc2FjdGlvbi5hbW91bnQudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKSB7XG4gICAgICBpZiAoIXRoaXMuX2FsZ29UcmFuc2FjdGlvbi5ub25QYXJ0aWNpcGF0aW9uKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLl9hbGdvVHJhbnNhY3Rpb24udm90ZUtleSAmJlxuICAgICAgICAgIHRoaXMuX2FsZ29UcmFuc2FjdGlvbi5zZWxlY3Rpb25LZXkgJiZcbiAgICAgICAgICB0aGlzLl9hbGdvVHJhbnNhY3Rpb24udm90ZUZpcnN0ICYmXG4gICAgICAgICAgdGhpcy5fYWxnb1RyYW5zYWN0aW9uLnZvdGVMYXN0ICYmXG4gICAgICAgICAgdGhpcy5fYWxnb1RyYW5zYWN0aW9uLnZvdGVLZXlEaWx1dGlvblxuICAgICAgICApIHtcbiAgICAgICAgICByZXN1bHQudm90ZUtleSA9IHRoaXMuX2FsZ29UcmFuc2FjdGlvbi52b3RlS2V5LnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgICAgICByZXN1bHQuc2VsZWN0aW9uS2V5ID0gdGhpcy5fYWxnb1RyYW5zYWN0aW9uLnNlbGVjdGlvbktleS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICAgICAgcmVzdWx0LnZvdGVGaXJzdCA9IHRoaXMuX2FsZ29UcmFuc2FjdGlvbi52b3RlRmlyc3Q7XG4gICAgICAgICAgcmVzdWx0LnZvdGVMYXN0ID0gdGhpcy5fYWxnb1RyYW5zYWN0aW9uLnZvdGVMYXN0O1xuICAgICAgICAgIHJlc3VsdC52b3RlS2V5RGlsdXRpb24gPSB0aGlzLl9hbGdvVHJhbnNhY3Rpb24udm90ZUtleURpbHV0aW9uO1xuICAgICAgICAgIGlmICh0aGlzLl9hbGdvVHJhbnNhY3Rpb24uc3RhdGVQcm9vZktleSkge1xuICAgICAgICAgICAgcmVzdWx0LnN0YXRlUHJvb2ZLZXkgPSB0aGlzLl9hbGdvVHJhbnNhY3Rpb24uc3RhdGVQcm9vZktleS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQubm9uUGFydGljaXBhdGlvbiA9IHRoaXMuX2FsZ29UcmFuc2FjdGlvbi5ub25QYXJ0aWNpcGF0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVzdWx0LnR5cGUgPT09ICdheGZlcicgJiYgcmVzdWx0LnRvICYmIHJlc3VsdC5hbW91bnQpIHtcbiAgICAgIHJlc3VsdC50eFR5cGUgPSB1dGlscy5nZXRUb2tlblR4VHlwZShyZXN1bHQuYW1vdW50LCByZXN1bHQuZnJvbSwgcmVzdWx0LnRvLCByZXN1bHQuY2xvc2VSZW1haW5kZXJUbyk7XG4gICAgICByZXN1bHQudG9rZW5OYW1lID0gdGhpcy5fY29pbkNvbmZpZy5zdWZmaXg7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhIG9uIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAqL1xuICBsb2FkSW5wdXRzQW5kT3V0cHV0cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2FsZ29UcmFuc2FjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuU2VuZCkge1xuICAgICAgdGhpcy5fb3V0cHV0cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IGFsZ29zZGsuZW5jb2RlQWRkcmVzcyh0aGlzLl9hbGdvVHJhbnNhY3Rpb24udG8ucHVibGljS2V5KSxcbiAgICAgICAgICB2YWx1ZTogdGhpcy5fYWxnb1RyYW5zYWN0aW9uLmFtb3VudC50b1N0cmluZygpLFxuICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIHRoaXMuX2lucHV0cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IGFsZ29zZGsuZW5jb2RlQWRkcmVzcyh0aGlzLl9hbGdvVHJhbnNhY3Rpb24uZnJvbS5wdWJsaWNLZXkpLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLl9hbGdvVHJhbnNhY3Rpb24uYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|