@bitgo-beta/sdk-core 8.2.1-beta.2049 → 8.2.1-beta.2050

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.
Files changed (30) hide show
  1. package/dist/src/account-lib/baseCoin/ed25519KeyPair.js +3 -3
  2. package/dist/src/account-lib/index.d.ts +0 -1
  3. package/dist/src/account-lib/index.d.ts.map +1 -1
  4. package/dist/src/account-lib/index.js +1 -2
  5. package/dist/src/bitgo/keychain/keychains.js +4 -4
  6. package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts +3 -21
  7. package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts.map +1 -1
  8. package/dist/src/bitgo/safe/derivableEd25519Pub.js +6 -145
  9. package/dist/src/bitgo/safe/index.d.ts +1 -1
  10. package/dist/src/bitgo/safe/index.d.ts.map +1 -1
  11. package/dist/src/bitgo/safe/index.js +2 -2
  12. package/dist/src/bitgo/safe/safe.d.ts.map +1 -1
  13. package/dist/src/bitgo/safe/safe.js +12 -33
  14. package/dist/src/bitgo/safe/safes.js +4 -4
  15. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +0 -4
  16. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
  17. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +3 -5
  18. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts.map +1 -1
  19. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.js +1 -6
  20. package/dist/src/bitgo/wallet/safeKeychain.js +3 -3
  21. package/dist/test/unit/bitgo/safe/safeDerivation.js +5 -1
  22. package/dist/tsconfig.tsbuildinfo +1 -1
  23. package/package.json +9 -9
  24. package/LICENSE +0 -191
  25. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts +0 -52
  26. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts.map +0 -1
  27. package/dist/src/account-lib/util/ed25519KeyDeriver.js +0 -91
  28. package/dist/src/bitgo/safe/safeDerivation.d.ts +0 -43
  29. package/dist/src/bitgo/safe/safeDerivation.d.ts.map +0 -1
  30. package/dist/src/bitgo/safe/safeDerivation.js +0 -151
@@ -5,153 +5,14 @@
5
5
  * Safe backup and BitGo roots store raw public key (32 bytes) || raw chain code (32 bytes),
6
6
  * encoded together as canonical unpadded RFC 4648 base32. Coin-specific public-key encodings are
7
7
  * applied only to derived wallet children.
8
+ *
9
+ * The pure codecs + composite-pub encoding moved to @bitgo-beta/sdk-lib-safes. Only the WASM
10
+ * soft-derivation remains here (it needs Ed25519BIP32/Eddsa, which live in sdk-core).
8
11
  */
9
12
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.DERIVABLE_ED25519_PUB_LENGTH = exports.DERIVABLE_ED25519_CHAIN_CODE_BYTES = exports.DERIVABLE_ED25519_PUBLIC_KEY_BYTES = void 0;
11
- exports.isDerivableEd25519Pub = isDerivableEd25519Pub;
12
- exports.assertDerivableEd25519Pub = assertDerivableEd25519Pub;
13
- exports.encodeDerivableEd25519Pub = encodeDerivableEd25519Pub;
14
- exports.decodeDerivableEd25519Pub = decodeDerivableEd25519Pub;
15
- exports.generateEd25519ChainCode = generateEd25519ChainCode;
16
- exports.decodeEd25519StrKeyPublicKey = decodeEd25519StrKeyPublicKey;
17
- exports.isValidEd25519StrKeyPublicKey = isValidEd25519StrKeyPublicKey;
18
- exports.decodeEd25519StrKeySecretSeed = decodeEd25519StrKeySecretSeed;
19
- exports.encodeEd25519StrKeyPublicKey = encodeEd25519StrKeyPublicKey;
20
- exports.isChecksumValidStrKeyEd25519Pub = isChecksumValidStrKeyEd25519Pub;
21
13
  exports.softDeriveChildPubEd25519 = softDeriveChildPubEd25519;
22
- const crypto_1 = require("crypto");
23
14
  const account_lib_1 = require("../../account-lib");
24
- exports.DERIVABLE_ED25519_PUBLIC_KEY_BYTES = 32;
25
- exports.DERIVABLE_ED25519_CHAIN_CODE_BYTES = 32;
26
- exports.DERIVABLE_ED25519_PUB_LENGTH = 103;
27
- const BASE32_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
28
- const BASE32_ROOT_REGEX = /^[A-Z2-7]{103}$/;
29
- const STRKEY_PUBLIC_KEY_REGEX = /^G[A-Z2-7]{55}$/;
30
- const STRKEY_SECRET_SEED_REGEX = /^S[A-Z2-7]{55}$/;
31
- const STRKEY_VERSION_PUBLIC_KEY = 6 << 3;
32
- const STRKEY_VERSION_SECRET_SEED = 18 << 3;
33
- const STRKEY_DECODED_BYTES = 35;
34
- function base32Decode(input) {
35
- const output = Buffer.alloc(Math.floor((input.length * 5) / 8));
36
- let bits = 0;
37
- let value = 0;
38
- let offset = 0;
39
- for (const char of input) {
40
- value = (value << 5) | BASE32_ALPHABET.indexOf(char);
41
- bits += 5;
42
- if (bits >= 8) {
43
- bits -= 8;
44
- output[offset++] = (value >>> bits) & 0xff;
45
- }
46
- }
47
- return output;
48
- }
49
- function base32Encode(data) {
50
- let bits = 0;
51
- let value = 0;
52
- let output = '';
53
- for (const byte of data) {
54
- value = (value << 8) | byte;
55
- bits += 8;
56
- while (bits >= 5) {
57
- bits -= 5;
58
- output += BASE32_ALPHABET[(value >>> bits) & 0x1f];
59
- }
60
- }
61
- if (bits > 0) {
62
- output += BASE32_ALPHABET[(value << (5 - bits)) & 0x1f];
63
- }
64
- return output;
65
- }
66
- function crc16Xmodem(data) {
67
- let crc = 0;
68
- for (const byte of data) {
69
- crc ^= byte << 8;
70
- for (let bit = 0; bit < 8; bit++) {
71
- crc = crc & 0x8000 ? ((crc << 1) ^ 0x1021) & 0xffff : (crc << 1) & 0xffff;
72
- }
73
- }
74
- return crc;
75
- }
76
- function decodeStrKey(value, version, label) {
77
- const decoded = base32Decode(value);
78
- if (decoded.length !== STRKEY_DECODED_BYTES ||
79
- decoded[0] !== version ||
80
- base32Encode(decoded) !== value ||
81
- crc16Xmodem(decoded.subarray(0, STRKEY_DECODED_BYTES - 2)) !== decoded.readUInt16LE(STRKEY_DECODED_BYTES - 2)) {
82
- throw new Error(`Invalid ed25519 StrKey ${label}`);
83
- }
84
- return decoded.subarray(1, 33);
85
- }
86
- /** Returns true for canonical base32-encoded 64-byte public derivation material. */
87
- function isDerivableEd25519Pub(pub) {
88
- return BASE32_ROOT_REGEX.test(pub) && base32Encode(base32Decode(pub)) === pub;
89
- }
90
- /** Throws unless the value is canonical base32-encoded 64-byte root material. */
91
- function assertDerivableEd25519Pub(pub) {
92
- if (!isDerivableEd25519Pub(pub)) {
93
- throw new Error('Invalid derivable ed25519 pub: expected 64 bytes of canonical base32');
94
- }
95
- }
96
- /** Compose raw public-key and chain-code bytes into one base32 root value. */
97
- function encodeDerivableEd25519Pub(pub, chainCode) {
98
- if (pub.length !== exports.DERIVABLE_ED25519_PUBLIC_KEY_BYTES || chainCode.length !== exports.DERIVABLE_ED25519_CHAIN_CODE_BYTES) {
99
- throw new Error('Invalid derivable ed25519 pub: expected 32-byte public key and chain code buffers');
100
- }
101
- return base32Encode(Buffer.concat([pub, chainCode]));
102
- }
103
- /** Decode a base32 root into raw public-key and chain-code buffers. */
104
- function decodeDerivableEd25519Pub(composite) {
105
- assertDerivableEd25519Pub(composite);
106
- const decoded = base32Decode(composite);
107
- return {
108
- pub: decoded.subarray(0, exports.DERIVABLE_ED25519_PUBLIC_KEY_BYTES),
109
- chainCode: decoded.subarray(exports.DERIVABLE_ED25519_PUBLIC_KEY_BYTES),
110
- };
111
- }
112
- /** Generate a fresh raw 32-byte chain code for root composition. */
113
- function generateEd25519ChainCode() {
114
- return (0, crypto_1.randomBytes)(exports.DERIVABLE_ED25519_CHAIN_CODE_BYTES);
115
- }
116
- function decodeEd25519StrKeyPublicKey(pub) {
117
- if (!STRKEY_PUBLIC_KEY_REGEX.test(pub)) {
118
- throw new Error('Invalid ed25519 StrKey public key');
119
- }
120
- return decodeStrKey(pub, STRKEY_VERSION_PUBLIC_KEY, 'public key');
121
- }
122
- function isValidEd25519StrKeyPublicKey(pub) {
123
- try {
124
- decodeEd25519StrKeyPublicKey(pub);
125
- return true;
126
- }
127
- catch {
128
- return false;
129
- }
130
- }
131
- function decodeEd25519StrKeySecretSeed(seed) {
132
- if (!STRKEY_SECRET_SEED_REGEX.test(seed)) {
133
- throw new Error('Invalid ed25519 StrKey secret seed');
134
- }
135
- return decodeStrKey(seed, STRKEY_VERSION_SECRET_SEED, 'secret seed');
136
- }
137
- function encodeEd25519StrKeyPublicKey(rawPub) {
138
- if (rawPub.length !== exports.DERIVABLE_ED25519_PUBLIC_KEY_BYTES) {
139
- throw new Error('ed25519 public key must be 32 bytes');
140
- }
141
- const payload = Buffer.concat([Buffer.from([STRKEY_VERSION_PUBLIC_KEY]), rawPub]);
142
- const checksum = Buffer.alloc(2);
143
- checksum.writeUInt16LE(crc16Xmodem(payload), 0);
144
- return base32Encode(Buffer.concat([payload, checksum]));
145
- }
146
- function isChecksumValidStrKeyEd25519Pub(pub) {
147
- try {
148
- decodeEd25519StrKeyPublicKey(pub);
149
- return true;
150
- }
151
- catch {
152
- return false;
153
- }
154
- }
15
+ const sdk_lib_safes_1 = require("@bitgo-beta/sdk-lib-safes");
155
16
  let eddsaPromise;
156
17
  function getEddsa() {
157
18
  if (!eddsaPromise) {
@@ -167,8 +28,8 @@ async function softDeriveChildPubEd25519(compositePub, index) {
167
28
  if (!Number.isInteger(index) || index < 0 || index > 0x7fffffff) {
168
29
  throw new Error(`ed25519 safe co-signer derivation index must be non-hardened, got ${index}`);
169
30
  }
170
- const { pub, chainCode } = decodeDerivableEd25519Pub(compositePub);
31
+ const { pub, chainCode } = (0, sdk_lib_safes_1.decodeDerivableEd25519Pub)(compositePub);
171
32
  const eddsa = await getEddsa();
172
33
  return Buffer.from(eddsa.deriveUnhardened(Buffer.concat([pub, chainCode]).toString('hex'), `m/${index}`).slice(0, 64), 'hex');
173
34
  }
174
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVyaXZhYmxlRWQyNTUxOVB1Yi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby9zYWZlL2Rlcml2YWJsZUVkMjU1MTlQdWIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7O0FBNEVILHNEQUVDO0FBR0QsOERBSUM7QUFHRCw4REFLQztBQUdELDhEQU9DO0FBR0QsNERBRUM7QUFFRCxvRUFLQztBQUVELHNFQU9DO0FBRUQsc0VBS0M7QUFFRCxvRUFRQztBQUVELDBFQU9DO0FBY0QsOERBVUM7QUE1S0QsbUNBQXFDO0FBQ3JDLG1EQUF3RDtBQUUzQyxRQUFBLGtDQUFrQyxHQUFHLEVBQUUsQ0FBQztBQUN4QyxRQUFBLGtDQUFrQyxHQUFHLEVBQUUsQ0FBQztBQUN4QyxRQUFBLDRCQUE0QixHQUFHLEdBQUcsQ0FBQztBQUVoRCxNQUFNLGVBQWUsR0FBRyxrQ0FBa0MsQ0FBQztBQUMzRCxNQUFNLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO0FBQzVDLE1BQU0sdUJBQXVCLEdBQUcsaUJBQWlCLENBQUM7QUFDbEQsTUFBTSx3QkFBd0IsR0FBRyxpQkFBaUIsQ0FBQztBQUNuRCxNQUFNLHlCQUF5QixHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzNDLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBRWhDLFNBQVMsWUFBWSxDQUFDLEtBQWE7SUFDakMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNiLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLElBQUksTUFBTSxHQUFHLENB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QUFNLFFBQVEsRUFBRSxDQUFDO0lBQy9CLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FDaEIsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQ2xHLEtBQUssQ0FDTixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRWQyNTUxOSBzYWZlLXJvb3QgcHVibGljIGRlcml2YXRpb24gbWF0ZXJpYWwgYW5kIFN0ZWxsYXIgdXNlci1rZXkgY29kZWNzLlxuICpcbiAqIFNhZmUgYmFja3VwIGFuZCBCaXRHbyByb290cyBzdG9yZSByYXcgcHVibGljIGtleSAoMzIgYnl0ZXMpIHx8IHJhdyBjaGFpbiBjb2RlICgzMiBieXRlcyksXG4gKiBlbmNvZGVkIHRvZ2V0aGVyIGFzIGNhbm9uaWNhbCB1bnBhZGRlZCBSRkMgNDY0OCBiYXNlMzIuIENvaW4tc3BlY2lmaWMgcHVibGljLWtleSBlbmNvZGluZ3MgYXJlXG4gKiBhcHBsaWVkIG9ubHkgdG8gZGVyaXZlZCB3YWxsZXQgY2hpbGRyZW4uXG4gKi9cblxuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgRWQyNTUxOUJJUDMyLCBFZGRzYSB9IGZyb20gJy4uLy4uL2FjY291bnQtbGliJztcblxuZXhwb3J0IGNvbnN0IERFUklWQUJMRV9FRDI1NTE5X1BVQkxJQ19LRVlfQllURVMgPSAzMjtcbmV4cG9ydCBjb25zdCBERVJJVkFCTEVfRUQyNTUxOV9DSEFJTl9DT0RFX0JZVEVTID0gMzI7XG5leHBvcnQgY29uc3QgREVSSVZBQkxFX0VEMjU1MTlfUFVCX0xFTkdUSCA9IDEwMztcblxuY29uc3QgQkFTRTMyX0FMUEhBQkVUID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMjM0NTY3JztcbmNvbnN0IEJBU0UzMl9ST09UX1JFR0VYID0gL15bQS1aMi03XXsxMDN9JC87XG5jb25zdCBTVFJLRVlfUFVCTElDX0tFWV9SRUdFWCA9IC9eR1tBLVoyLTddezU1fSQvO1xuY29uc3QgU1RSS0VZX1NFQ1JFVF9TRUVEX1JFR0VYID0gL15TW0EtWjItN117NTV9JC87XG5jb25zdCBTVFJLRVlfVkVSU0lPTl9QVUJMSUNfS0VZID0gNiA8PCAzO1xuY29uc3QgU1RSS0VZX1ZFUlNJT05fU0VDUkVUX1NFRUQgPSAxOCA8PCAzO1xuY29uc3QgU1RSS0VZX0RFQ09ERURfQllURVMgPSAzNTtcblxuZnVuY3Rpb24gYmFzZTMyRGVjb2RlKGlucHV0OiBzdHJpbmcpOiBCdWZmZXIge1xuICBjb25zdCBvdXRwdXQgPSBCdWZmZXIuYWxsb2MoTWF0aC5mbG9vcigoaW5wdXQubGVuZ3RoICogNSkgLyA4KSk7XG4gIGxldCBiaXRzID0gMDtcbiAgbGV0IHZhbHVlID0gMDtcbiAgbGV0IG9mZnNldCA9IDA7XG4gIGZvciAoY29uc3QgY2hhciBvZiBpbnB1dCkge1xuICAgIHZhbHVlID0gKHZhbHVlIDw8IDUpIHwgQkFTRTMyX0FMUEhBQkVULmluZGV4T2YoY2hhcik7XG4gICAgYml0cyArPSA1O1xuICAgIGlmIChiaXRzID49IDgpIHtcbiAgICAgIGJpdHMgLT0gODtcbiAgICAgIG91dHB1dFtvZmZzZXQrK10gPSAodmFsdWUgPj4+IGJpdHMpICYgMHhmZjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuZnVuY3Rpb24gYmFzZTMyRW5jb2RlKGRhdGE6IEJ1ZmZlcik6IHN0cmluZyB7XG4gIGxldCBiaXRzID0gMDtcbiAgbGV0IHZhbHVlID0gMDtcbiAgbGV0IG91dHB1dCA9ICcnO1xuICBmb3IgKGNvbnN0IGJ5dGUgb2YgZGF0YSkge1xuICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgYnl0ZTtcbiAgICBiaXRzICs9IDg7XG4gICAgd2hpbGUgKGJpdHMgPj0gNSkge1xuICAgICAgYml0cyAtPSA1O1xuICAgICAgb3V0cHV0ICs9IEJBU0UzMl9BTFBIQUJFVFsodmFsdWUgPj4+IGJpdHMpICYgMHgxZl07XG4gICAgfVxuICB9XG4gIGlmIChiaXRzID4gMCkge1xuICAgIG91dHB1dCArPSBCQVNFMzJfQUxQSEFCRVRbKHZhbHVlIDw8ICg1IC0gYml0cykpICYgMHgxZl07XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuZnVuY3Rpb24gY3JjMTZYbW9kZW0oZGF0YTogQnVmZmVyKTogbnVtYmVyIHtcbiAgbGV0IGNyYyA9IDA7XG4gIGZvciAoY29uc3QgYnl0ZSBvZiBkYXRhKSB7XG4gICAgY3JjIF49IGJ5dGUgPDwgODtcbiAgICBmb3IgKGxldCBiaXQgPSAwOyBiaXQgPCA4OyBiaXQrKykge1xuICAgICAgY3JjID0gY3JjICYgMHg4MDAwID8gKChjcmMgPDwgMSkgXiAweDEwMjEpICYgMHhmZmZmIDogKGNyYyA8PCAxKSAmIDB4ZmZmZjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNyYztcbn1cblxuZnVuY3Rpb24gZGVjb2RlU3RyS2V5KHZhbHVlOiBzdHJpbmcsIHZlcnNpb246IG51bWJlciwgbGFiZWw6IHN0cmluZyk6IEJ1ZmZlciB7XG4gIGNvbnN0IGRlY29kZWQgPSBiYXNlMzJEZWNvZGUodmFsdWUpO1xuICBpZiAoXG4gICAgZGVjb2RlZC5sZW5ndGggIT09IFNUUktFWV9ERUNPREVEX0JZVEVTIHx8XG4gICAgZGVjb2RlZFswXSAhPT0gdmVyc2lvbiB8fFxuICAgIGJhc2UzMkVuY29kZShkZWNvZGVkKSAhPT0gdmFsdWUgfHxcbiAgICBjcmMxNlhtb2RlbShkZWNvZGVkLnN1YmFycmF5KDAsIFNUUktFWV9ERUNPREVEX0JZVEVTIC0gMikpICE9PSBkZWNvZGVkLnJlYWRVSW50MTZMRShTVFJLRVlfREVDT0RFRF9CWVRFUyAtIDIpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlZDI1NTE5IFN0cktleSAke2xhYmVsfWApO1xuICB9XG4gIHJldHVybiBkZWNvZGVkLnN1YmFycmF5KDEsIDMzKTtcbn1cblxuLyoqIFJldHVybnMgdHJ1ZSBmb3IgY2Fub25pY2FsIGJhc2UzMi1lbmNvZGVkIDY0LWJ5dGUgcHVibGljIGRlcml2YXRpb24gbWF0ZXJpYWwuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEZXJpdmFibGVFZDI1NTE5UHViKHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBCQVNFMzJfUk9PVF9SRUdFWC50ZXN0KHB1YikgJiYgYmFzZTMyRW5jb2RlKGJhc2UzMkRlY29kZShwdWIpKSA9PT0gcHViO1xufVxuXG4vKiogVGhyb3dzIHVubGVzcyB0aGUgdmFsdWUgaXMgY2Fub25pY2FsIGJhc2UzMi1lbmNvZGVkIDY0LWJ5dGUgcm9vdCBtYXRlcmlhbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnREZXJpdmFibGVFZDI1NTE5UHViKHB1Yjogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghaXNEZXJpdmFibGVFZDI1NTE5UHViKHB1YikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGVyaXZhYmxlIGVkMjU1MTkgcHViOiBleHBlY3RlZCA2NCBieXRlcyBvZiBjYW5vbmljYWwgYmFzZTMyJyk7XG4gIH1cbn1cblxuLyoqIENvbXBvc2UgcmF3IHB1YmxpYy1rZXkgYW5kIGNoYWluLWNvZGUgYnl0ZXMgaW50byBvbmUgYmFzZTMyIHJvb3QgdmFsdWUuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlRGVyaXZhYmxlRWQyNTUxOVB1YihwdWI6IEJ1ZmZlciwgY2hhaW5Db2RlOiBCdWZmZXIpOiBzdHJpbmcge1xuICBpZiAocHViLmxlbmd0aCAhPT0gREVSSVZBQkxFX0VEMjU1MTlfUFVCTElDX0tFWV9CWVRFUyB8fCBjaGFpbkNvZGUubGVuZ3RoICE9PSBERVJJVkFCTEVfRUQyNTUxOV9DSEFJTl9DT0RFX0JZVEVTKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRlcml2YWJsZSBlZDI1NTE5IHB1YjogZXhwZWN0ZWQgMzItYnl0ZSBwdWJsaWMga2V5IGFuZCBjaGFpbiBjb2RlIGJ1ZmZlcnMnKTtcbiAgfVxuICByZXR1cm4gYmFzZTMyRW5jb2RlKEJ1ZmZlci5jb25jYXQoW3B1YiwgY2hhaW5Db2RlXSkpO1xufVxuXG4vKiogRGVjb2RlIGEgYmFzZTMyIHJvb3QgaW50byByYXcgcHVibGljLWtleSBhbmQgY2hhaW4tY29kZSBidWZmZXJzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZURlcml2YWJsZUVkMjU1MTlQdWIoY29tcG9zaXRlOiBzdHJpbmcpOiB7IHB1YjogQnVmZmVyOyBjaGFpbkNvZGU6IEJ1ZmZlciB9IHtcbiAgYXNzZXJ0RGVyaXZhYmxlRWQyNTUxOVB1Yihjb21wb3NpdGUpO1xuICBjb25zdCBkZWNvZGVkID0gYmFzZTMyRGVjb2RlKGNvbXBvc2l0ZSk7XG4gIHJldHVybiB7XG4gICAgcHViOiBkZWNvZGVkLnN1YmFycmF5KDAsIERFUklWQUJMRV9FRDI1NTE5X1BVQkxJQ19LRVlfQllURVMpLFxuICAgIGNoYWluQ29kZTogZGVjb2RlZC5zdWJhcnJheShERVJJVkFCTEVfRUQyNTUxOV9QVUJMSUNfS0VZX0JZVEVTKSxcbiAgfTtcbn1cblxuLyoqIEdlbmVyYXRlIGEgZnJlc2ggcmF3IDMyLWJ5dGUgY2hhaW4gY29kZSBmb3Igcm9vdCBjb21wb3NpdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUVkMjU1MTlDaGFpbkNvZGUoKTogQnVmZmVyIHtcbiAgcmV0dXJuIHJhbmRvbUJ5dGVzKERFUklWQUJMRV9FRDI1NTE5X0NIQUlOX0NPREVfQllURVMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRWQyNTUxOVN0cktleVB1YmxpY0tleShwdWI6IHN0cmluZyk6IEJ1ZmZlciB7XG4gIGlmICghU1RSS0VZX1BVQkxJQ19LRVlfUkVHRVgudGVzdChwdWIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVkMjU1MTkgU3RyS2V5IHB1YmxpYyBrZXknKTtcbiAgfVxuICByZXR1cm4gZGVjb2RlU3RyS2V5KHB1YiwgU1RSS0VZX1ZFUlNJT05fUFVCTElDX0tFWSwgJ3B1YmxpYyBrZXknKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRFZDI1NTE5U3RyS2V5UHVibGljS2V5KHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgZGVjb2RlRWQyNTUxOVN0cktleVB1YmxpY0tleShwdWIpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUVkMjU1MTlTdHJLZXlTZWNyZXRTZWVkKHNlZWQ6IHN0cmluZyk6IEJ1ZmZlciB7XG4gIGlmICghU1RSS0VZX1NFQ1JFVF9TRUVEX1JFR0VYLnRlc3Qoc2VlZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZWQyNTUxOSBTdHJLZXkgc2VjcmV0IHNlZWQnKTtcbiAgfVxuICByZXR1cm4gZGVjb2RlU3RyS2V5KHNlZWQsIFNUUktFWV9WRVJTSU9OX1NFQ1JFVF9TRUVELCAnc2VjcmV0IHNlZWQnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUVkMjU1MTlTdHJLZXlQdWJsaWNLZXkocmF3UHViOiBCdWZmZXIpOiBzdHJpbmcge1xuICBpZiAocmF3UHViLmxlbmd0aCAhPT0gREVSSVZBQkxFX0VEMjU1MTlfUFVCTElDX0tFWV9CWVRFUykge1xuICAgIHRocm93IG5ldyBFcnJvcignZWQyNTUxOSBwdWJsaWMga2V5IG11c3QgYmUgMzIgYnl0ZXMnKTtcbiAgfVxuICBjb25zdCBwYXlsb2FkID0gQnVmZmVyLmNvbmNhdChbQnVmZmVyLmZyb20oW1NUUktFWV9WRVJTSU9OX1BVQkxJQ19LRVldKSwgcmF3UHViXSk7XG4gIGNvbnN0IGNoZWNrc3VtID0gQnVmZmVyLmFsbG9jKDIpO1xuICBjaGVja3N1bS53cml0ZVVJbnQxNkxFKGNyYzE2WG1vZGVtKHBheWxvYWQpLCAwKTtcbiAgcmV0dXJuIGJhc2UzMkVuY29kZShCdWZmZXIuY29uY2F0KFtwYXlsb2FkLCBjaGVja3N1bV0pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2hlY2tzdW1WYWxpZFN0cktleUVkMjU1MTlQdWIocHViOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBkZWNvZGVFZDI1NTE5U3RyS2V5UHVibGljS2V5KHB1Yik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5sZXQgZWRkc2FQcm9taXNlOiBQcm9taXNlPEVkZHNhPiB8IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIGdldEVkZHNhKCk6IFByb21pc2U8RWRkc2E+IHtcbiAgaWYgKCFlZGRzYVByb21pc2UpIHtcbiAgICBlZGRzYVByb21pc2UgPSAoYXN5bmMgKCkgPT4gRWRkc2EuaW5pdGlhbGl6ZShhd2FpdCBFZDI1NTE5QklQMzIuaW5pdGlhbGl6ZSgpKSkoKTtcbiAgICBlZGRzYVByb21pc2UuY2F0Y2goKCkgPT4ge1xuICAgICAgZWRkc2FQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBlZGRzYVByb21pc2U7XG59XG5cbi8qKiBTb2Z0LWRlcml2ZSBgbS88aW5kZXg+YCBhbmQgcmV0dXJuIHRoZSBkZXJpdmVkIHJhdyAzMi1ieXRlIHB1YmxpYyBrZXkuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc29mdERlcml2ZUNoaWxkUHViRWQyNTUxOShjb21wb3NpdGVQdWI6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IFByb21pc2U8QnVmZmVyPiB7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihpbmRleCkgfHwgaW5kZXggPCAwIHx8IGluZGV4ID4gMHg3ZmZmZmZmZikge1xuICAgIHRocm93IG5ldyBFcnJvcihgZWQyNTUxOSBzYWZlIGNvLXNpZ25lciBkZXJpdmF0aW9uIGluZGV4IG11c3QgYmUgbm9uLWhhcmRlbmVkLCBnb3QgJHtpbmRleH1gKTtcbiAgfVxuICBjb25zdCB7IHB1YiwgY2hhaW5Db2RlIH0gPSBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViKGNvbXBvc2l0ZVB1Yik7XG4gIGNvbnN0IGVkZHNhID0gYXdhaXQgZ2V0RWRkc2EoKTtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKFxuICAgIGVkZHNhLmRlcml2ZVVuaGFyZGVuZWQoQnVmZmVyLmNvbmNhdChbcHViLCBjaGFpbkNvZGVdKS50b1N0cmluZygnaGV4JyksIGBtLyR7aW5kZXh9YCkuc2xpY2UoMCwgNjQpLFxuICAgICdoZXgnXG4gICk7XG59XG4iXX0=
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVyaXZhYmxlRWQyNTUxOVB1Yi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby9zYWZlL2Rlcml2YWJsZUVkMjU1MTlQdWIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7R0FTRzs7QUFpQkgsOERBVUM7QUF6QkQsbURBQXdEO0FBQ3hELDZEQUFzRTtBQUV0RSxJQUFJLFlBQXdDLENBQUM7QUFDN0MsU0FBUyxRQUFRO0lBQ2YsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xCLFlBQVksR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsbUJBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSwwQkFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2pGLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFO1lBQ3RCLFlBQVksR0FBRyxTQUFTLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQztBQUVELDZFQUE2RTtBQUN0RSxLQUFLLFVBQVUseUJBQXlCLENBQUMsWUFBb0IsRUFBRSxLQUFhO0lBQ2pGLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sSUFBSSxLQUFLLENBQUMscUVBQXFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUNELE1BQU0sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBQSx5Q0FBeUIsRUFBQyxZQUFZLENBQUMsQ0FBQztJQUNuRSxNQUFNLEtBQUssR0FBRyxNQUFNLFFBQVEsRUFBRSxDQUFDO0lBQy9CLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FDaEIsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQ2xHLEtBQUssQ0FDTixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRWQyNTUxOSBzYWZlLXJvb3QgcHVibGljIGRlcml2YXRpb24gbWF0ZXJpYWwgYW5kIFN0ZWxsYXIgdXNlci1rZXkgY29kZWNzLlxuICpcbiAqIFNhZmUgYmFja3VwIGFuZCBCaXRHbyByb290cyBzdG9yZSByYXcgcHVibGljIGtleSAoMzIgYnl0ZXMpIHx8IHJhdyBjaGFpbiBjb2RlICgzMiBieXRlcyksXG4gKiBlbmNvZGVkIHRvZ2V0aGVyIGFzIGNhbm9uaWNhbCB1bnBhZGRlZCBSRkMgNDY0OCBiYXNlMzIuIENvaW4tc3BlY2lmaWMgcHVibGljLWtleSBlbmNvZGluZ3MgYXJlXG4gKiBhcHBsaWVkIG9ubHkgdG8gZGVyaXZlZCB3YWxsZXQgY2hpbGRyZW4uXG4gKlxuICogVGhlIHB1cmUgY29kZWNzICsgY29tcG9zaXRlLXB1YiBlbmNvZGluZyBtb3ZlZCB0byBAYml0Z28tYmV0YS9zZGstbGliLXNhZmVzLiBPbmx5IHRoZSBXQVNNXG4gKiBzb2Z0LWRlcml2YXRpb24gcmVtYWlucyBoZXJlIChpdCBuZWVkcyBFZDI1NTE5QklQMzIvRWRkc2EsIHdoaWNoIGxpdmUgaW4gc2RrLWNvcmUpLlxuICovXG5cbmltcG9ydCB7IEVkMjU1MTlCSVAzMiwgRWRkc2EgfSBmcm9tICcuLi8uLi9hY2NvdW50LWxpYic7XG5pbXBvcnQgeyBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWxpYi1zYWZlcyc7XG5cbmxldCBlZGRzYVByb21pc2U6IFByb21pc2U8RWRkc2E+IHwgdW5kZWZpbmVkO1xuZnVuY3Rpb24gZ2V0RWRkc2EoKTogUHJvbWlzZTxFZGRzYT4ge1xuICBpZiAoIWVkZHNhUHJvbWlzZSkge1xuICAgIGVkZHNhUHJvbWlzZSA9IChhc3luYyAoKSA9PiBFZGRzYS5pbml0aWFsaXplKGF3YWl0IEVkMjU1MTlCSVAzMi5pbml0aWFsaXplKCkpKSgpO1xuICAgIGVkZHNhUHJvbWlzZS5jYXRjaCgoKSA9PiB7XG4gICAgICBlZGRzYVByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGVkZHNhUHJvbWlzZTtcbn1cblxuLyoqIFNvZnQtZGVyaXZlIGBtLzxpbmRleD5gIGFuZCByZXR1cm4gdGhlIGRlcml2ZWQgcmF3IDMyLWJ5dGUgcHVibGljIGtleS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzb2Z0RGVyaXZlQ2hpbGRQdWJFZDI1NTE5KGNvbXBvc2l0ZVB1Yjogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGluZGV4KSB8fCBpbmRleCA8IDAgfHwgaW5kZXggPiAweDdmZmZmZmZmKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBlZDI1NTE5IHNhZmUgY28tc2lnbmVyIGRlcml2YXRpb24gaW5kZXggbXVzdCBiZSBub24taGFyZGVuZWQsIGdvdCAke2luZGV4fWApO1xuICB9XG4gIGNvbnN0IHsgcHViLCBjaGFpbkNvZGUgfSA9IGRlY29kZURlcml2YWJsZUVkMjU1MTlQdWIoY29tcG9zaXRlUHViKTtcbiAgY29uc3QgZWRkc2EgPSBhd2FpdCBnZXRFZGRzYSgpO1xuICByZXR1cm4gQnVmZmVyLmZyb20oXG4gICAgZWRkc2EuZGVyaXZlVW5oYXJkZW5lZChCdWZmZXIuY29uY2F0KFtwdWIsIGNoYWluQ29kZV0pLnRvU3RyaW5nKCdoZXgnKSwgYG0vJHtpbmRleH1gKS5zbGljZSgwLCA2NCksXG4gICAgJ2hleCdcbiAgKTtcbn1cbiJdfQ==
@@ -2,6 +2,6 @@ export * from './derivableEd25519Pub';
2
2
  export * from './iSafe';
3
3
  export * from './iSafes';
4
4
  export * from './safe';
5
- export * from './safeDerivation';
6
5
  export * from './safes';
6
+ export * from '@bitgo-beta/sdk-lib-safes';
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,kBAAkB,CAAC;AACjC,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,2BAA2B,CAAC"}
@@ -18,6 +18,6 @@ __exportStar(require("./derivableEd25519Pub"), exports);
18
18
  __exportStar(require("./iSafe"), exports);
19
19
  __exportStar(require("./iSafes"), exports);
20
20
  __exportStar(require("./safe"), exports);
21
- __exportStar(require("./safeDerivation"), exports);
22
21
  __exportStar(require("./safes"), exports);
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYml0Z28vc2FmZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsd0RBQXNDO0FBQ3RDLDBDQUF3QjtBQUN4QiwyQ0FBeUI7QUFDekIseUNBQXVCO0FBQ3ZCLG1EQUFpQztBQUNqQywwQ0FBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2Rlcml2YWJsZUVkMjU1MTlQdWInO1xuZXhwb3J0ICogZnJvbSAnLi9pU2FmZSc7XG5leHBvcnQgKiBmcm9tICcuL2lTYWZlcyc7XG5leHBvcnQgKiBmcm9tICcuL3NhZmUnO1xuZXhwb3J0ICogZnJvbSAnLi9zYWZlRGVyaXZhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3NhZmVzJztcbiJdfQ==
22
+ __exportStar(require("@bitgo-beta/sdk-lib-safes"), exports);
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYml0Z28vc2FmZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsd0RBQXNDO0FBQ3RDLDBDQUF3QjtBQUN4QiwyQ0FBeUI7QUFDekIseUNBQXVCO0FBQ3ZCLDBDQUF3QjtBQUN4Qiw0REFBMEMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2Rlcml2YWJsZUVkMjU1MTlQdWInO1xuZXhwb3J0ICogZnJvbSAnLi9pU2FmZSc7XG5leHBvcnQgKiBmcm9tICcuL2lTYWZlcyc7XG5leHBvcnQgKiBmcm9tICcuL3NhZmUnO1xuZXhwb3J0ICogZnJvbSAnLi9zYWZlcyc7XG5leHBvcnQgKiBmcm9tICdAYml0Z28tYmV0YS9zZGstbGliLXNhZmVzJztcbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"safe.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/safe.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAoB,MAAM,qBAAqB,CAAC;AAGhH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAMzC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,0BAA0B,EAC1B,uBAAuB,EACvB,KAAK,EACL,iBAAiB,EACjB,eAAe,EAChB,MAAM,SAAS,CAAC;AA0EjB;;GAEG;AACH,qBAAa,IAAK,YAAW,KAAK;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,SAAgB,KAAK,EAAE,QAAQ,CAAC;gBAEpB,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ;IAKhD,EAAE,IAAI,MAAM;IAIZ,YAAY,IAAI,MAAM;IAItB,KAAK,IAAI,MAAM;IAIf,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC;IAI5B;;;OAGG;IACH,GAAG,CAAC,KAAK,SAAK,GAAG,MAAM;IAIvB;;;;;;;;;OASG;IACG,YAAY,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC;IAiFpE;;;OAGG;YACW,qBAAqB;YA+CrB,aAAa;IAK3B;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAIhE;;OAEG;IACG,iBAAiB,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAAC,eAAe,CAAC;IAIrF;;OAEG;IACG,UAAU,CAAC,MAAM,GAAE;QAAE,KAAK,CAAC,EAAE,cAAc,CAAA;KAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAInF;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,aAAa,CAAC;IAIzE;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK1D;;;OAGG;IACG,MAAM,CAAC,MAAM,GAAE,cAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK5D;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC;IAKlC,MAAM,IAAI,QAAQ;CAGnB"}
1
+ {"version":3,"file":"safe.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/safe.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAoB,MAAM,qBAAqB,CAAC;AAEhH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAMzC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,0BAA0B,EAC1B,uBAAuB,EACvB,KAAK,EACL,iBAAiB,EACjB,eAAe,EAChB,MAAM,SAAS,CAAC;AAgDjB;;GAEG;AACH,qBAAa,IAAK,YAAW,KAAK;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,SAAgB,KAAK,EAAE,QAAQ,CAAC;gBAEpB,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ;IAKhD,EAAE,IAAI,MAAM;IAIZ,YAAY,IAAI,MAAM;IAItB,KAAK,IAAI,MAAM;IAIf,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC;IAI5B;;;OAGG;IACH,GAAG,CAAC,KAAK,SAAK,GAAG,MAAM;IAIvB;;;;;;;;;OASG;IACG,YAAY,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC;IAuFpE;;;OAGG;YACW,qBAAqB;YA+CrB,aAAa;IAK3B;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAIhE;;OAEG;IACG,iBAAiB,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAAC,eAAe,CAAC;IAIrF;;OAEG;IACG,UAAU,CAAC,MAAM,GAAE;QAAE,KAAK,CAAC,EAAE,cAAc,CAAA;KAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAInF;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,aAAa,CAAC;IAIzE;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK1D;;;OAGG;IACG,MAAM,CAAC,MAAM,GAAE,cAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK5D;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC;IAKlC,MAAM,IAAI,QAAQ;CAGnB"}
@@ -42,7 +42,6 @@ exports.Safe = void 0;
42
42
  */
43
43
  const t = __importStar(require("io-ts"));
44
44
  const public_types_1 = require("@bitgo/public-types");
45
- const statics_1 = require("@bitgo-beta/statics");
46
45
  const errors_1 = require("../errors");
47
46
  const keychain_1 = require("../keychain");
48
47
  const utils_1 = require("../utils");
@@ -50,7 +49,7 @@ const codecs_1 = require("../utils/codecs");
50
49
  const postWithCodec_1 = require("../utils/postWithCodec");
51
50
  const wallet_1 = require("../wallet");
52
51
  const safeKeychain_1 = require("../wallet/safeKeychain");
53
- const safeDerivation_1 = require("./safeDerivation");
52
+ const sdk_lib_safes_1 = require("@bitgo-beta/sdk-lib-safes");
54
53
  const SafeRootKeySlot = t.keyof({
55
54
  secp256k1Multisig: null,
56
55
  ecdsaMpc: null,
@@ -78,32 +77,6 @@ const CreateWalletInSafeBody = t.union([
78
77
  keys: t.tuple([t.string, t.string, t.string]),
79
78
  }),
80
79
  ]);
81
- function onchainSlotForCoin(coin) {
82
- if (coin.getDefaultMultisigType() === 'tss') {
83
- throw new Error('MPC safe wallet minting requires multisigType "tss"; use "onchain" for non-MPC minting');
84
- }
85
- const curve = statics_1.coins.get(coin.getChain()).primaryKeyCurve;
86
- if (curve === statics_1.KeyCurve.Secp256k1) {
87
- return 'secp256k1Multisig';
88
- }
89
- if (curve === statics_1.KeyCurve.Ed25519) {
90
- return 'ed25519Multisig';
91
- }
92
- throw new Error(`Coin '${coin.getChain()}' is not supported for safe wallet minting`);
93
- }
94
- function tssSlotForCoin(coin) {
95
- if (coin.getDefaultMultisigType() !== 'tss') {
96
- throw new Error(`Coin '${coin.getChain()}' is not a TSS coin; cannot mint a tss safe wallet for it`);
97
- }
98
- const curve = statics_1.coins.get(coin.getChain()).primaryKeyCurve;
99
- if (curve === statics_1.KeyCurve.Secp256k1) {
100
- return 'ecdsaMpc';
101
- }
102
- if (curve === statics_1.KeyCurve.Ed25519) {
103
- throw new Error('ed25519 MPC safe wallet minting is not yet supported');
104
- }
105
- throw new Error(`Coin '${coin.getChain()}' is not supported for safe wallet minting`);
106
- }
107
80
  function rootIdFromSafe(safe, slot, position) {
108
81
  const triplet = safe.rootKeys?.hot?.[slot];
109
82
  if (!triplet || triplet.length !== 3) {
@@ -158,7 +131,13 @@ class Safe {
158
131
  }
159
132
  const isTss = params.multisigType === 'tss';
160
133
  const coin = this.bitgo.coin(params.coin);
161
- const slot = isTss ? tssSlotForCoin(coin) : onchainSlotForCoin(coin);
134
+ if (isTss && coin.getDefaultMultisigType() !== 'tss') {
135
+ throw new Error(`Coin '${coin.getChain()}' is not a TSS coin; cannot mint a tss safe wallet for it`);
136
+ }
137
+ if (!isTss && coin.getDefaultMultisigType() === 'tss') {
138
+ throw new Error('MPC safe wallet minting requires multisigType "tss"; use "onchain" for non-MPC minting');
139
+ }
140
+ const slot = isTss ? (0, sdk_lib_safes_1.tssSlotForCoin)(coin.getChain()) : (0, sdk_lib_safes_1.onchainSlotForCoin)(coin.getChain());
162
141
  const indexResponse = await this.bitgo.get(this.url('/derivation-index')).query({ slot }).result();
163
142
  const peeked = (0, codecs_1.decodeWithCodec)(GetDerivationIndexResponse, indexResponse, 'GetDerivationIndexResponse');
164
143
  if (peeked.slot !== slot) {
@@ -191,9 +170,9 @@ class Safe {
191
170
  throw new errors_1.IncorrectPasswordError();
192
171
  }
193
172
  const derived = slot === 'ed25519Multisig'
194
- ? (0, safeDerivation_1.deriveSafeChildEd25519Hardened)(rootPrv, index)
195
- : (0, safeDerivation_1.deriveAndSelfCheckSafeChildHardened)(rootPrv, index);
196
- const derivedFromParentWithHardenedPath = (0, codecs_1.decodeWithCodec)(safeDerivation_1.DerivedFromParentWithHardenedPath, derived.derivationPath, 'derivedFromParentWithHardenedPath');
173
+ ? (0, sdk_lib_safes_1.deriveSafeChildEd25519Hardened)(rootPrv, index)
174
+ : (0, sdk_lib_safes_1.deriveAndSelfCheckSafeChildHardened)(rootPrv, index);
175
+ const derivedFromParentWithHardenedPath = (0, codecs_1.decodeWithCodec)(sdk_lib_safes_1.DerivedFromParentWithHardenedPath, derived.derivationPath, 'derivedFromParentWithHardenedPath');
197
176
  const child = await keychains.add({
198
177
  pub: derived.pub,
199
178
  source: 'user',
@@ -312,4 +291,4 @@ class Safe {
312
291
  }
313
292
  }
314
293
  exports.Safe = Safe;
315
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby9zYWZlL3NhZmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7O0dBS0c7QUFDSCx5Q0FBMkI7QUFDM0Isc0RBQWdIO0FBQ2hILGlEQUFzRDtBQUd0RCxzQ0FBbUQ7QUFDbkQsMENBQXdEO0FBQ3hELG9DQUFzQztBQUN0Qyw0Q0FBOEQ7QUFDOUQsMERBQXVEO0FBQ3ZELHNDQUFtQztBQUNuQyx5REFBd0U7QUFVeEUscURBSTBCO0FBRTFCLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDOUIsaUJBQWlCLEVBQUUsSUFBSTtJQUN2QixRQUFRLEVBQUUsSUFBSTtJQUNkLFFBQVEsRUFBRSxJQUFJO0lBQ2QsZUFBZSxFQUFFLElBQUk7Q0FDdEIsQ0FBQyxDQUFDO0FBRUgsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3hDLElBQUksRUFBRSxlQUFlO0lBQ3JCLEtBQUssRUFBRSxJQUFBLG1CQUFVLEVBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQztDQUNwRCxDQUFDLENBQUM7QUFFSCxNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDckMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNQLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTTtRQUNkLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTTtRQUNmLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUN0QixZQUFZLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDbEMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDMUIsQ0FBQztJQUNGLHlEQUF5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QUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzdFLE9BQU8sSUFBQSx3QkFBZSxFQUFDLHVCQUFRLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQTdPRCxvQkE2T0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICpcbiAqIEBleHBlcmltZW50YWwgVGhlIHNhZmUgY2xpZW50IHN1cmZhY2UgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIChpbmNsdWRpbmcgYnJlYWtpbmdcbiAqIGNoYW5nZXMpIGJlZm9yZSB0aGUgcHVibGljIHJlbGVhc2UuXG4gKi9cbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuaW1wb3J0IHsgRnJlZXplU2FmZUJvZHksIFNhZmVEYXRhLCBTYWZlU2hhcmVEYXRhLCBTYWZlU2hhcmVTdGF0ZSwgdHlwZSBSb290S2V5VHlwZSB9IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgY29pbnMsIEtleUN1cnZlIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBJQmFzZUNvaW4gfSBmcm9tICcuLi9iYXNlQ29pbic7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgSW5jb3JyZWN0UGFzc3dvcmRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBkZWNyeXB0S2V5Y2hhaW5Qcml2YXRlS2V5IH0gZnJvbSAnLi4va2V5Y2hhaW4nO1xuaW1wb3J0IHsgRUNEU0FVdGlscyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IGJvdW5kZWRJbnQsIGRlY29kZVdpdGhDb2RlYyB9IGZyb20gJy4uL3V0aWxzL2NvZGVjcyc7XG5pbXBvcnQgeyBwb3N0V2l0aENvZGVjIH0gZnJvbSAnLi4vdXRpbHMvcG9zdFdpdGhDb2RlYyc7XG5pbXBvcnQgeyBXYWxsZXQgfSBmcm9tICcuLi93YWxsZXQnO1xuaW1wb3J0IHsgSW52YWxpZFJvb3RLZXljaGFpblNvdXJjZUVycm9yIH0gZnJvbSAnLi4vd2FsbGV0L3NhZmVLZXljaGFpbic7XG5pbXBvcnQge1xuICBBY2NlcHRTYWZlU2hhcmVPcHRpb25zLFxuICBBZGRTYWZlTWVtYmVyT3B0aW9ucyxcbiAgQWRkU2FmZVdhbGxldE1lbWJlck9wdGlvbnMsXG4gIENyZWF0ZVNhZmVXYWxsZXRPcHRpb25zLFxuICBJU2FmZSxcbiAgVXBkYXRlU2FmZU9wdGlvbnMsXG4gIFdhbGxldFNoYXJlRGF0YSxcbn0gZnJvbSAnLi9pU2FmZSc7XG5pbXBvcnQge1xuICBkZXJpdmVBbmRTZWxmQ2hlY2tTYWZlQ2hpbGRIYXJkZW5lZCxcbiAgZGVyaXZlU2FmZUNoaWxkRWQyNTUxOUhhcmRlbmVkLFxuICBEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgsXG59IGZyb20gJy4vc2FmZURlcml2YXRpb24nO1xuXG5jb25zdCBTYWZlUm9vdEtleVNsb3QgPSB0LmtleW9mKHtcbiAgc2VjcDI1NmsxTXVsdGlzaWc6IG51bGwsXG4gIGVjZHNhTXBjOiBudWxsLFxuICBlZGRzYU1wYzogbnVsbCxcbiAgZWQyNTUxOU11bHRpc2lnOiBudWxsLFxufSk7XG5cbmNvbnN0IEdldERlcml2YXRpb25JbmRleFJlc3BvbnNlID0gdC50eXBlKHtcbiAgc2xvdDogU2FmZVJvb3RLZXlTbG90LFxuICBpbmRleDogYm91bmRlZEludCgwLCAweDdmZmZmZmZmLCAnZGVyaXZhdGlvbkluZGV4JyksXG59KTtcblxuY29uc3QgQ3JlYXRlV2FsbGV0SW5TYWZlQm9keSA9IHQudW5pb24oW1xuICB0LnN0cmljdCh7XG4gICAgY29pbjogdC5zdHJpbmcsXG4gICAgbGFiZWw6IHQuc3RyaW5nLFxuICAgIHR5cGU6IHQubGl0ZXJhbCgnaG90JyksXG4gICAgbXVsdGlzaWdUeXBlOiB0LmxpdGVyYWwoJ29uY2hhaW4nKSxcbiAgICBrZXlzOiB0LnR1cGxlKFt0LnN0cmluZ10pLFxuICB9KSxcbiAgLy8gVFNTIG1pbnQgdXNlcyBvcmRlcmVkIHVzZXIgYW5kIGJhY2t1cCBjaGlsZCBkb2N1bWVudHMuXG4gIHQuc3RyaWN0KHtcbiAgICBjb2luOiB0LnN0cmluZyxcbiAgICBsYWJlbDogdC5zdHJpbmcsXG4gICAgdHlwZTogdC5saXRlcmFsKCdob3QnKSxcbiAgICBtdWx0aXNpZ1R5cGU6IHQubGl0ZXJhbCgndHNzJyksXG4gICAga2V5czogdC50dXBsZShbdC5zdHJpbmcsIHQuc3RyaW5nLCB0LnN0cmluZ10pLFxuICB9KSxcbl0pO1xuXG5mdW5jdGlvbiBvbmNoYWluU2xvdEZvckNvaW4oY29pbjogSUJhc2VDb2luKTogRXh0cmFjdDxSb290S2V5VHlwZSwgJ3NlY3AyNTZrMU11bHRpc2lnJyB8ICdlZDI1NTE5TXVsdGlzaWcnPiB7XG4gIGlmIChjb2luLmdldERlZmF1bHRNdWx0aXNpZ1R5cGUoKSA9PT0gJ3RzcycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01QQyBzYWZlIHdhbGxldCBtaW50aW5nIHJlcXVpcmVzIG11bHRpc2lnVHlwZSBcInRzc1wiOyB1c2UgXCJvbmNoYWluXCIgZm9yIG5vbi1NUEMgbWludGluZycpO1xuICB9XG4gIGNvbnN0IGN1cnZlID0gY29pbnMuZ2V0KGNvaW4uZ2V0Q2hhaW4oKSkucHJpbWFyeUtleUN1cnZlO1xuICBpZiAoY3VydmUgPT09IEtleUN1cnZlLlNlY3AyNTZrMSkge1xuICAgIHJldHVybiAnc2VjcDI1NmsxTXVsdGlzaWcnO1xuICB9XG4gIGlmIChjdXJ2ZSA9PT0gS2V5Q3VydmUuRWQyNTUxOSkge1xuICAgIHJldHVybiAnZWQyNTUxOU11bHRpc2lnJztcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYENvaW4gJyR7Y29pbi5nZXRDaGFpbigpfScgaXMgbm90IHN1cHBvcnRlZCBmb3Igc2FmZSB3YWxsZXQgbWludGluZ2ApO1xufVxuXG5mdW5jdGlvbiB0c3NTbG90Rm9yQ29pbihjb2luOiBJQmFzZUNvaW4pOiBFeHRyYWN0PFJvb3RLZXlUeXBlLCAnZWNkc2FNcGMnPiB7XG4gIGlmIChjb2luLmdldERlZmF1bHRNdWx0aXNpZ1R5cGUoKSAhPT0gJ3RzcycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvaW4gJyR7Y29pbi5nZXRDaGFpbigpfScgaXMgbm90IGEgVFNTIGNvaW47IGNhbm5vdCBtaW50IGEgdHNzIHNhZmUgd2FsbGV0IGZvciBpdGApO1xuICB9XG4gIGNvbnN0IGN1cnZlID0gY29pbnMuZ2V0KGNvaW4uZ2V0Q2hhaW4oKSkucHJpbWFyeUtleUN1cnZlO1xuICBpZiAoY3VydmUgPT09IEtleUN1cnZlLlNlY3AyNTZrMSkge1xuICAgIHJldHVybiAnZWNkc2FNcGMnO1xuICB9XG4gIGlmIChjdXJ2ZSA9PT0gS2V5Q3VydmUuRWQyNTUxOSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZWQyNTUxOSBNUEMgc2FmZSB3YWxsZXQgbWludGluZyBpcyBub3QgeWV0IHN1cHBvcnRlZCcpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgQ29pbiAnJHtjb2luLmdldENoYWluKCl9JyBpcyBub3Qgc3VwcG9ydGVkIGZvciBzYWZlIHdhbGxldCBtaW50aW5nYCk7XG59XG5cbmZ1bmN0aW9uIHJvb3RJZEZyb21TYWZlKHNhZmU6IFNhZmVEYXRhLCBzbG90OiBSb290S2V5VHlwZSwgcG9zaXRpb246IDAgfCAxIHwgMik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRyaXBsZXQgPSBzYWZlLnJvb3RLZXlzPy5ob3Q/LltzbG90XTtcbiAgaWYgKCF0cmlwbGV0IHx8IHRyaXBsZXQubGVuZ3RoICE9PSAzKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCByb290SWQgPSB0cmlwbGV0W3Bvc2l0aW9uXTtcbiAgcmV0dXJuIHJvb3RJZC5sZW5ndGggPiAwID8gcm9vdElkIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGNsYXNzIFNhZmUgaW1wbGVtZW50cyBJU2FmZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYml0Z286IEJpdEdvQmFzZTtcbiAgcHVibGljIHJlYWRvbmx5IF9zYWZlOiBTYWZlRGF0YTtcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzYWZlRGF0YTogU2FmZURhdGEpIHtcbiAgICB0aGlzLmJpdGdvID0gYml0Z287XG4gICAgdGhpcy5fc2FmZSA9IHNhZmVEYXRhO1xuICB9XG5cbiAgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2FmZS5pZDtcbiAgfVxuXG4gIGVudGVycHJpc2VJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zYWZlLmVudGVycHJpc2VJZDtcbiAgfVxuXG4gIGxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NhZmUubGFiZWw7XG4gIH1cblxuICBzdGF0dXMoKTogU2FmZURhdGFbJ3N0YXR1cyddIHtcbiAgICByZXR1cm4gdGhpcy5fc2FmZS5zdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogRW50ZXJwcmlzZS1zY29wZWQgdjIgVVJMIGZvciB0aGlzIHNhZmUsIGUuZy4gL2FwaS92Mi9lbnRlcnByaXNlLzplSWQvc2FmZXMvOnNhZmVJZFxuICAgKiBAcGFyYW0gZXh0cmFcbiAgICovXG4gIHVybChleHRyYSA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5iaXRnby51cmwoYC9lbnRlcnByaXNlLyR7dGhpcy5lbnRlcnByaXNlSWQoKX0vc2FmZXMvJHt0aGlzLmlkKCl9JHtleHRyYX1gLCAyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNaW50IGEgY2hpbGQgd2FsbGV0OiBwZWVrIHRoZSBzZXF1ZW50aWFsIGluZGV4LCBkZXJpdmUgdGhlIGNoaWxkIGtleXMsIHJlZ2lzdGVyXG4gICAqIHRoZW0sIHRoZW4gbWludC5cbiAgICpcbiAgICogYG9uY2hhaW5gOiBoYXJkZW5lZC1kZXJpdmUgdGhlIHVzZXIgY2hpbGQgKGBtLzxpbmRleD4nYCksIHJlZ2lzdGVyIGl0XG4gICAqIHB1YmxpYy1vbmx5OyBiYWNrdXAgYW5kIEJpdEdvIGNoaWxkcmVuIGFyZSBzb2Z0LWRlcml2ZWQgb24gdGhlIHNlcnZlci5cbiAgICpcbiAgICogYHRzc2A6IGRlY3J5cHQgdGhlIHVzZXIgcm9vdCBibG9iLCBydW4gdGhlIHVzZXIvQml0R28gaGFyZC1kZXJpdmUgY2VyZW1vbnksXG4gICAqIHJlZ2lzdGVyIHRoZSBvcmRlcmVkIGNoaWxkIGRvY3VtZW50cywgdGhlbiBtaW50LlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlV2FsbGV0KHBhcmFtczogQ3JlYXRlU2FmZVdhbGxldE9wdGlvbnMpOiBQcm9taXNlPFdhbGxldD4ge1xuICAgIGlmIChwYXJhbXMucGFzc3BocmFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGFzc3BocmFzZSBpcyByZXF1aXJlZCB0byBtaW50IGEgc2FmZSB3YWxsZXQnKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy50eXBlICE9PSB1bmRlZmluZWQgJiYgcGFyYW1zLnR5cGUgIT09ICdob3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NhZmUgd2FsbGV0cyBhcmUgaG90LW9ubHkgaW4gdjEnKTtcbiAgICB9XG4gICAgY29uc3QgaXNUc3MgPSBwYXJhbXMubXVsdGlzaWdUeXBlID09PSAndHNzJztcblxuICAgIGNvbnN0IGNvaW4gPSB0aGlzLmJpdGdvLmNvaW4ocGFyYW1zLmNvaW4pO1xuICAgIGNvbnN0IHNsb3QgPSBpc1RzcyA/IHRzc1Nsb3RGb3JDb2luKGNvaW4pIDogb25jaGFpblNsb3RGb3JDb2luKGNvaW4pO1xuXG4gICAgY29uc3QgaW5kZXhSZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvZGVyaXZhdGlvbi1pbmRleCcpKS5xdWVyeSh7IHNsb3QgfSkucmVzdWx0KCk7XG4gICAgY29uc3QgcGVla2VkID0gZGVjb2RlV2l0aENvZGVjKEdldERlcml2YXRpb25JbmRleFJlc3BvbnNlLCBpbmRleFJlc3BvbnNlLCAnR2V0RGVyaXZhdGlvbkluZGV4UmVzcG9uc2UnKTtcbiAgICBpZiAocGVla2VkLnNsb3QgIT09IHNsb3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZGVyaXZhdGlvbi1pbmRleCByZXR1cm5lZCBzbG90ICcke3BlZWtlZC5zbG90fScsIGV4cGVjdGVkICcke3Nsb3R9J2ApO1xuICAgIH1cbiAgICBjb25zdCB7IGluZGV4IH0gPSBwZWVrZWQ7XG5cbiAgICBjb25zdCBzYWZlRGF0YSA9IHJvb3RJZEZyb21TYWZlKHRoaXMuX3NhZmUsIHNsb3QsIDApICE9PSB1bmRlZmluZWQgPyB0aGlzLl9zYWZlIDogYXdhaXQgdGhpcy5mZXRjaFNhZmVEYXRhKCk7XG4gICAgY29uc3QgdXNlclJvb3RJZCA9IHJvb3RJZEZyb21TYWZlKHNhZmVEYXRhLCBzbG90LCAwKTtcbiAgICBpZiAodXNlclJvb3RJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNhZmUgJHt0aGlzLmlkKCl9IGlzIG1pc3Npbmcgcm9vdEtleXMuaG90LiR7c2xvdH1gKTtcbiAgICB9XG5cbiAgICBpZiAoaXNUc3MpIHtcbiAgICAgIGNvbnN0IGJhY2t1cFJvb3RJZCA9IHJvb3RJZEZyb21TYWZlKHNhZmVEYXRhLCBzbG90LCAxKTtcbiAgICAgIGNvbnN0IGJpdGdvUm9vdElkID0gcm9vdElkRnJvbVNhZmUoc2FmZURhdGEsIHNsb3QsIDIpO1xuICAgICAgaWYgKGJhY2t1cFJvb3RJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2FmZSAke3RoaXMuaWQoKX0gaXMgbWlzc2luZyByb290S2V5cy5ob3QuJHtzbG90fSBiYWNrdXAga2V5YCk7XG4gICAgICB9XG4gICAgICBpZiAoYml0Z29Sb290SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNhZmUgJHt0aGlzLmlkKCl9IGlzIG1pc3Npbmcgcm9vdEtleXMuaG90LiR7c2xvdH0gYml0Z28ga2V5YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVUc3NXYWxsZXRJblNhZmUoY29pbiwgdXNlclJvb3RJZCwgYmFja3VwUm9vdElkLCBiaXRnb1Jvb3RJZCwgaW5kZXgsIHBhcmFtcyk7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gY29pbi5rZXljaGFpbnMoKTtcbiAgICBjb25zdCByb290S2V5Y2hhaW4gPSBhd2FpdCBrZXljaGFpbnMuZ2V0KHsgaWQ6IHVzZXJSb290SWQgfSk7XG4gICAgaWYgKHJvb3RLZXljaGFpbi5zb3VyY2UgIT09ICd1c2VyJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRSb290S2V5Y2hhaW5Tb3VyY2VFcnJvcihyb290S2V5Y2hhaW4uaWQsIHJvb3RLZXljaGFpbi5zb3VyY2UpO1xuICAgIH1cbiAgICBjb25zdCByb290UHJ2ID0gYXdhaXQgZGVjcnlwdEtleWNoYWluUHJpdmF0ZUtleSh0aGlzLmJpdGdvLCByb290S2V5Y2hhaW4sIHBhcmFtcy5wYXNzcGhyYXNlKTtcbiAgICBpZiAoIXJvb3RQcnYpIHtcbiAgICAgIHRocm93IG5ldyBJbmNvcnJlY3RQYXNzd29yZEVycm9yKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVyaXZlZCA9XG4gICAgICBzbG90ID09PSAnZWQyNTUxOU11bHRpc2lnJ1xuICAgICAgICA/IGRlcml2ZVNhZmVDaGlsZEVkMjU1MTlIYXJkZW5lZChyb290UHJ2LCBpbmRleClcbiAgICAgICAgOiBkZXJpdmVBbmRTZWxmQ2hlY2tTYWZlQ2hpbGRIYXJkZW5lZChyb290UHJ2LCBpbmRleCk7XG4gICAgY29uc3QgZGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoID0gZGVjb2RlV2l0aENvZGVjKFxuICAgICAgRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoLFxuICAgICAgZGVyaXZlZC5kZXJpdmF0aW9uUGF0aCxcbiAgICAgICdkZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgnXG4gICAgKTtcblxuICAgIGNvbnN0IGNoaWxkID0gYXdhaXQga2V5Y2hhaW5zLmFkZCh7XG4gICAgICBwdWI6IGRlcml2ZWQucHViLFxuICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICBrZXlUeXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgcGFyZW50OiB1c2VyUm9vdElkLFxuICAgICAgc2FmZUlkOiB0aGlzLmlkKCksXG4gICAgICBkZXJpdmVkRnJvbVBhcmVudFdpdGhQYXRoOiBkZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgsXG4gICAgfSk7XG4gICAgY29uc3QgY2hpbGRJZCA9IGNoaWxkLmlkO1xuICAgIGlmIChjaGlsZElkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzYWZlIGNoaWxkIGtleSByZWdpc3RyYXRpb24gcmV0dXJuZWQgYW4gZW1wdHkgaWQnKTtcbiAgICB9XG4gICAgY29uc3Qga2V5czogW3N0cmluZ10gPSBbY2hpbGRJZF07XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3RXaXRoQ29kZWModGhpcy5iaXRnbywgdGhpcy51cmwoJy93YWxsZXRzJyksIENyZWF0ZVdhbGxldEluU2FmZUJvZHksIHtcbiAgICAgIGNvaW46IHBhcmFtcy5jb2luLFxuICAgICAgbGFiZWw6IHBhcmFtcy5sYWJlbCxcbiAgICAgIHR5cGU6ICdob3QnLFxuICAgICAgbXVsdGlzaWdUeXBlOiAnb25jaGFpbicsXG4gICAgICBrZXlzLFxuICAgIH0pLnJlc3VsdCgpO1xuICAgIHJldHVybiBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIGNvaW4sIHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUU1Mgd2FsbGV0IG1pbnQ6IGRlY3J5cHQgdGhlIHVzZXIgcm9vdCBibG9iLCBydW4gdGhlIHVzZXIvQml0R28gaGFyZC1kZXJpdmVcbiAgICogY2VyZW1vbnksIHJlZ2lzdGVyIHRoZSBvcmRlcmVkIGNoaWxkIGRvY3VtZW50cywgdGhlbiBtaW50LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVUc3NXYWxsZXRJblNhZmUoXG4gICAgY29pbjogSUJhc2VDb2luLFxuICAgIHVzZXJSb290SWQ6IHN0cmluZyxcbiAgICBiYWNrdXBSb290SWQ6IHN0cmluZyxcbiAgICBiaXRnb1Jvb3RJZDogc3RyaW5nLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgcGFyYW1zOiBDcmVhdGVTYWZlV2FsbGV0T3B0aW9uc1xuICApOiBQcm9taXNlPFdhbGxldD4ge1xuICAgIGNvbnN0IGtleWNoYWlucyA9IGNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgY29uc3QgdXNlclJvb3RLZXljaGFpbiA9IGF3YWl0IGtleWNoYWlucy5nZXQoeyBpZDogdXNlclJvb3RJZCB9KTtcbiAgICBpZiAodXNlclJvb3RLZXljaGFpbi5zb3VyY2UgIT09ICd1c2VyJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRSb290S2V5Y2hhaW5Tb3VyY2VFcnJvcih1c2VyUm9vdEtleWNoYWluLmlkLCB1c2VyUm9vdEtleWNoYWluLnNvdXJjZSk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlclJvb3RQcnYgPSBhd2FpdCBkZWNyeXB0S2V5Y2hhaW5Qcml2YXRlS2V5KHRoaXMuYml0Z28sIHVzZXJSb290S2V5Y2hhaW4sIHBhcmFtcy5wYXNzcGhyYXNlKTtcbiAgICBpZiAoIXVzZXJSb290UHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgSW5jb3JyZWN0UGFzc3dvcmRFcnJvcigpO1xuICAgIH1cbiAgICBjb25zdCB1c2VyUm9vdE1hdGVyaWFsID0gRUNEU0FVdGlscy5wYXJzZVZyZktleUVudmVsb3Blcyh1c2VyUm9vdFBydik7XG5cbiAgICBjb25zdCB0c3NVdGlscyA9IG5ldyBFQ0RTQVV0aWxzLkVjZHNhVnJmTVBDdjJVdGlscyh0aGlzLmJpdGdvLCBjb2luKTtcbiAgICBjb25zdCB7IHVzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW4gfSA9IGF3YWl0IHRzc1V0aWxzLmNyZWF0ZVNhZmVDaGlsZEtleWNoYWlucyh7XG4gICAgICBwYXNzcGhyYXNlOiBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgIGVudGVycHJpc2U6IHRoaXMuZW50ZXJwcmlzZUlkKCksXG4gICAgICBzYWZlSWQ6IHRoaXMuaWQoKSxcbiAgICAgIHBhcmVudEtleUlkOiBiaXRnb1Jvb3RJZCxcbiAgICAgIGRlcml2YXRpb25JbmRleDogaW5kZXgsXG4gICAgICB1c2VyUm9vdEtleUlkOiB1c2VyUm9vdElkLFxuICAgICAgYmFja3VwUm9vdEtleUlkOiBiYWNrdXBSb290SWQsXG4gICAgICB1c2VyUm9vdEtleVNoYXJlOiB1c2VyUm9vdE1hdGVyaWFsLnNpZ25pbmcsXG4gICAgICB1c2VyUm9vdFZyZktleVNoYXJlOiB1c2VyUm9vdE1hdGVyaWFsLnZyZixcbiAgICB9KTtcbiAgICBpZiAodXNlcktleWNoYWluLmlkLmxlbmd0aCA9PT0gMCB8fCBiYWNrdXBLZXljaGFpbi5pZC5sZW5ndGggPT09IDAgfHwgYml0Z29LZXljaGFpbi5pZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2FmZSBjaGlsZCBrZXkgcmVnaXN0cmF0aW9uIHJldHVybmVkIGFuIGVtcHR5IGlkJyk7XG4gICAgfVxuICAgIGNvbnN0IGtleXM6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXSA9IFt1c2VyS2V5Y2hhaW4uaWQsIGJhY2t1cEtleWNoYWluLmlkLCBiaXRnb0tleWNoYWluLmlkXTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdFdpdGhDb2RlYyh0aGlzLmJpdGdvLCB0aGlzLnVybCgnL3dhbGxldHMnKSwgQ3JlYXRlV2FsbGV0SW5TYWZlQm9keSwge1xuICAgICAgY29pbjogcGFyYW1zLmNvaW4sXG4gICAgICBsYWJlbDogcGFyYW1zLmxhYmVsLFxuICAgICAgdHlwZTogJ2hvdCcsXG4gICAgICBtdWx0aXNpZ1R5cGU6ICd0c3MnLFxuICAgICAga2V5cyxcbiAgICB9KS5yZXN1bHQoKTtcbiAgICByZXR1cm4gbmV3IFdhbGxldCh0aGlzLmJpdGdvLCBjb2luLCByZXNwb25zZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoU2FmZURhdGEoKTogUHJvbWlzZTxTYWZlRGF0YT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoKSkucmVzdWx0KCk7XG4gICAgcmV0dXJuIGRlY29kZVdpdGhDb2RlYyhTYWZlRGF0YSwgcmVzcG9uc2UsICdTYWZlRGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG1lbWJlciB0byB0aGUgd2hvbGUgc2FmZSAodmlldy9hZG1pbi9zcGVuZCkuIFNwZW5kIG9wZW5zIGEga2V5IHNoYXJlLlxuICAgKi9cbiAgYXN5bmMgYWRkTWVtYmVyKHBhcmFtczogQWRkU2FmZU1lbWJlck9wdGlvbnMpOiBQcm9taXNlPFNhZmVEYXRhPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTYWZlLmFkZE1lbWJlciBpcyBub3QgeWV0IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogU2hhcmUgT05FIHNhZmUgd2FsbGV0IHdpdGggYSBub24tbWVtYmVyIHZpYSB0aGUgZXhpc3Rpbmcgd2FsbGV0LXNoYXJlIGhhbmRzaGFrZS5cbiAgICovXG4gIGFzeW5jIGFkZE1lbWJlclRvV2FsbGV0KHBhcmFtczogQWRkU2FmZVdhbGxldE1lbWJlck9wdGlvbnMpOiBQcm9taXNlPFdhbGxldFNoYXJlRGF0YT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignU2FmZS5hZGRNZW1iZXJUb1dhbGxldCBpcyBub3QgeWV0IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgc2FmZSBrZXkgc2hhcmVzIHZpc2libGUgdG8gdGhlIGNhbGxlci5cbiAgICovXG4gIGFzeW5jIGxpc3RTaGFyZXMocGFyYW1zOiB7IHN0YXRlPzogU2FmZVNoYXJlU3RhdGUgfSA9IHt9KTogUHJvbWlzZTxTYWZlU2hhcmVEYXRhW10+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NhZmUubGlzdFNoYXJlcyBpcyBub3QgeWV0IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0IGEgc2FmZSBrZXkgc2hhcmUgYWRkcmVzc2VkIHRvIHRoZSBjYWxsZXIuXG4gICAqL1xuICBhc3luYyBhY2NlcHRTaGFyZShwYXJhbXM6IEFjY2VwdFNhZmVTaGFyZU9wdGlvbnMpOiBQcm9taXNlPFNhZmVTaGFyZURhdGE+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NhZmUuYWNjZXB0U2hhcmUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgc2FmZSBsYWJlbC5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZShwYXJhbXM6IFVwZGF0ZVNhZmVPcHRpb25zKTogUHJvbWlzZTxTYWZlRGF0YT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnby5wdXQodGhpcy51cmwoKSkuc2VuZCh7IGxhYmVsOiBwYXJhbXMubGFiZWwgfSkucmVzdWx0KCk7XG4gICAgcmV0dXJuIGRlY29kZVdpdGhDb2RlYyhTYWZlRGF0YSwgcmVzcG9uc2UsICdTYWZlRGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZyZWV6ZSB0aGUgc2FmZSDigJQgYmxvY2tzIHdpdGhkcmF3YWxzIG9uIGFsbCBzYWZlIHdhbGxldHMuIFNhZmUgc3RheXMgJ2FjdGl2ZScuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGZyZWV6ZShwYXJhbXM6IEZyZWV6ZVNhZmVCb2R5ID0ge30pOiBQcm9taXNlPFNhZmVEYXRhPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwb3N0V2l0aENvZGVjKHRoaXMuYml0Z28sIHRoaXMudXJsKCcvZnJlZXplJyksIEZyZWV6ZVNhZmVCb2R5LCBwYXJhbXMpLnJlc3VsdCgpO1xuICAgIHJldHVybiBkZWNvZGVXaXRoQ29kZWMoU2FmZURhdGEsIHJlc3BvbnNlLCAnU2FmZURhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcmNoaXZlIHRoZSBzYWZlLiBSZXF1aXJlcyBldmVyeSBzYWZlIHdhbGxldCB0byBhbHJlYWR5IGJlIGFyY2hpdmVkOyBhbHNvIHRoZSBhYmFuZG9ubWVudFxuICAgKiBwYXRoIGZvciBhIHN0dWNrICdpbml0aWFsaXppbmcnIHNhZmUuXG4gICAqL1xuICBhc3luYyBhcmNoaXZlKCk6IFByb21pc2U8U2FmZURhdGE+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL2FyY2hpdmUnKSkuc2VuZCgpLnJlc3VsdCgpO1xuICAgIHJldHVybiBkZWNvZGVXaXRoQ29kZWMoU2FmZURhdGEsIHJlc3BvbnNlLCAnU2FmZURhdGEnKTtcbiAgfVxuXG4gIHRvSlNPTigpOiBTYWZlRGF0YSB7XG4gICAgcmV0dXJuIHRoaXMuX3NhZmU7XG4gIH1cbn1cbiJdfQ==
294
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby9zYWZlL3NhZmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7O0dBS0c7QUFDSCx5Q0FBMkI7QUFDM0Isc0RBQWdIO0FBR2hILHNDQUFtRDtBQUNuRCwwQ0FBd0Q7QUFDeEQsb0NBQXNDO0FBQ3RDLDRDQUE4RDtBQUM5RCwwREFBdUQ7QUFDdkQsc0NBQW1DO0FBQ25DLHlEQUF3RTtBQVV4RSw2REFNbUM7QUFFbkMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM5QixpQkFBaUIsRUFBRSxJQUFJO0lBQ3ZCLFFBQVEsRUFBRSxJQUFJO0lBQ2QsUUFBUSxFQUFFLElBQUk7SUFDZCxlQUFlLEVBQUUsSUFBSTtDQUN0QixDQUFDLENBQUM7QUFFSCxNQUFNLDBCQUEwQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDeEMsSUFBSSxFQUFFLGVBQWU7SUFDckIsS0FBSyxFQUFFLElBQUEsbUJBQVUsRUFBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixDQUFDO0NBQ3BELENBQUMsQ0FBQztBQUVILE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNyQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ1AsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNO1FBQ2QsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNO1FBQ2YsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ3RCLFlBQVksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUNsQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUMxQixDQUFDO0lBQ0YseURBQXlEO0lBQ3pELENBQUMs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Q0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUF5QixFQUFFO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBQSw2QkFBYSxFQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSw2QkFBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZHLE9BQU8sSUFBQSx3QkFBZSxFQUFDLHVCQUFRLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzdFLE9BQU8sSUFBQSx3QkFBZSxFQUFDLHVCQUFRLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQW5QRCxvQkFtUEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICpcbiAqIEBleHBlcmltZW50YWwgVGhlIHNhZmUgY2xpZW50IHN1cmZhY2UgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIChpbmNsdWRpbmcgYnJlYWtpbmdcbiAqIGNoYW5nZXMpIGJlZm9yZSB0aGUgcHVibGljIHJlbGVhc2UuXG4gKi9cbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuaW1wb3J0IHsgRnJlZXplU2FmZUJvZHksIFNhZmVEYXRhLCBTYWZlU2hhcmVEYXRhLCBTYWZlU2hhcmVTdGF0ZSwgdHlwZSBSb290S2V5VHlwZSB9IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgSUJhc2VDb2luIH0gZnJvbSAnLi4vYmFzZUNvaW4nO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnLi4vYml0Z29CYXNlJztcbmltcG9ydCB7IEluY29ycmVjdFBhc3N3b3JkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgZGVjcnlwdEtleWNoYWluUHJpdmF0ZUtleSB9IGZyb20gJy4uL2tleWNoYWluJztcbmltcG9ydCB7IEVDRFNBVXRpbHMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBib3VuZGVkSW50LCBkZWNvZGVXaXRoQ29kZWMgfSBmcm9tICcuLi91dGlscy9jb2RlY3MnO1xuaW1wb3J0IHsgcG9zdFdpdGhDb2RlYyB9IGZyb20gJy4uL3V0aWxzL3Bvc3RXaXRoQ29kZWMnO1xuaW1wb3J0IHsgV2FsbGV0IH0gZnJvbSAnLi4vd2FsbGV0JztcbmltcG9ydCB7IEludmFsaWRSb290S2V5Y2hhaW5Tb3VyY2VFcnJvciB9IGZyb20gJy4uL3dhbGxldC9zYWZlS2V5Y2hhaW4nO1xuaW1wb3J0IHtcbiAgQWNjZXB0U2FmZVNoYXJlT3B0aW9ucyxcbiAgQWRkU2FmZU1lbWJlck9wdGlvbnMsXG4gIEFkZFNhZmVXYWxsZXRNZW1iZXJPcHRpb25zLFxuICBDcmVhdGVTYWZlV2FsbGV0T3B0aW9ucyxcbiAgSVNhZmUsXG4gIFVwZGF0ZVNhZmVPcHRpb25zLFxuICBXYWxsZXRTaGFyZURhdGEsXG59IGZyb20gJy4vaVNhZmUnO1xuaW1wb3J0IHtcbiAgZGVyaXZlQW5kU2VsZkNoZWNrU2FmZUNoaWxkSGFyZGVuZWQsXG4gIGRlcml2ZVNhZmVDaGlsZEVkMjU1MTlIYXJkZW5lZCxcbiAgRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoLFxuICBvbmNoYWluU2xvdEZvckNvaW4sXG4gIHRzc1Nsb3RGb3JDb2luLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstbGliLXNhZmVzJztcblxuY29uc3QgU2FmZVJvb3RLZXlTbG90ID0gdC5rZXlvZih7XG4gIHNlY3AyNTZrMU11bHRpc2lnOiBudWxsLFxuICBlY2RzYU1wYzogbnVsbCxcbiAgZWRkc2FNcGM6IG51bGwsXG4gIGVkMjU1MTlNdWx0aXNpZzogbnVsbCxcbn0pO1xuXG5jb25zdCBHZXREZXJpdmF0aW9uSW5kZXhSZXNwb25zZSA9IHQudHlwZSh7XG4gIHNsb3Q6IFNhZmVSb290S2V5U2xvdCxcbiAgaW5kZXg6IGJvdW5kZWRJbnQoMCwgMHg3ZmZmZmZmZiwgJ2Rlcml2YXRpb25JbmRleCcpLFxufSk7XG5cbmNvbnN0IENyZWF0ZVdhbGxldEluU2FmZUJvZHkgPSB0LnVuaW9uKFtcbiAgdC5zdHJpY3Qoe1xuICAgIGNvaW46IHQuc3RyaW5nLFxuICAgIGxhYmVsOiB0LnN0cmluZyxcbiAgICB0eXBlOiB0LmxpdGVyYWwoJ2hvdCcpLFxuICAgIG11bHRpc2lnVHlwZTogdC5saXRlcmFsKCdvbmNoYWluJyksXG4gICAga2V5czogdC50dXBsZShbdC5zdHJpbmddKSxcbiAgfSksXG4gIC8vIFRTUyBtaW50IHVzZXMgb3JkZXJlZCB1c2VyIGFuZCBiYWNrdXAgY2hpbGQgZG9jdW1lbnRzLlxuICB0LnN0cmljdCh7XG4gICAgY29pbjogdC5zdHJpbmcsXG4gICAgbGFiZWw6IHQuc3RyaW5nLFxuICAgIHR5cGU6IHQubGl0ZXJhbCgnaG90JyksXG4gICAgbXVsdGlzaWdUeXBlOiB0LmxpdGVyYWwoJ3RzcycpLFxuICAgIGtleXM6IHQudHVwbGUoW3Quc3RyaW5nLCB0LnN0cmluZywgdC5zdHJpbmddKSxcbiAgfSksXG5dKTtcblxuZnVuY3Rpb24gcm9vdElkRnJvbVNhZmUoc2FmZTogU2FmZURhdGEsIHNsb3Q6IFJvb3RLZXlUeXBlLCBwb3NpdGlvbjogMCB8IDEgfCAyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdHJpcGxldCA9IHNhZmUucm9vdEtleXM/LmhvdD8uW3Nsb3RdO1xuICBpZiAoIXRyaXBsZXQgfHwgdHJpcGxldC5sZW5ndGggIT09IDMpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IHJvb3RJZCA9IHRyaXBsZXRbcG9zaXRpb25dO1xuICByZXR1cm4gcm9vdElkLmxlbmd0aCA+IDAgPyByb290SWQgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgY2xhc3MgU2FmZSBpbXBsZW1lbnRzIElTYWZlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiaXRnbzogQml0R29CYXNlO1xuICBwdWJsaWMgcmVhZG9ubHkgX3NhZmU6IFNhZmVEYXRhO1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIHNhZmVEYXRhOiBTYWZlRGF0YSkge1xuICAgIHRoaXMuYml0Z28gPSBiaXRnbztcbiAgICB0aGlzLl9zYWZlID0gc2FmZURhdGE7XG4gIH1cblxuICBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zYWZlLmlkO1xuICB9XG5cbiAgZW50ZXJwcmlzZUlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NhZmUuZW50ZXJwcmlzZUlkO1xuICB9XG5cbiAgbGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2FmZS5sYWJlbDtcbiAgfVxuXG4gIHN0YXR1cygpOiBTYWZlRGF0YVsnc3RhdHVzJ10ge1xuICAgIHJldHVybiB0aGlzLl9zYWZlLnN0YXR1cztcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnRlcnByaXNlLXNjb3BlZCB2MiBVUkwgZm9yIHRoaXMgc2FmZSwgZS5nLiAvYXBpL3YyL2VudGVycHJpc2UvOmVJZC9zYWZlcy86c2FmZUlkXG4gICAqIEBwYXJhbSBleHRyYVxuICAgKi9cbiAgdXJsKGV4dHJhID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJpdGdvLnVybChgL2VudGVycHJpc2UvJHt0aGlzLmVudGVycHJpc2VJZCgpfS9zYWZlcy8ke3RoaXMuaWQoKX0ke2V4dHJhfWAsIDIpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1pbnQgYSBjaGlsZCB3YWxsZXQ6IHBlZWsgdGhlIHNlcXVlbnRpYWwgaW5kZXgsIGRlcml2ZSB0aGUgY2hpbGQga2V5cywgcmVnaXN0ZXJcbiAgICogdGhlbSwgdGhlbiBtaW50LlxuICAgKlxuICAgKiBgb25jaGFpbmA6IGhhcmRlbmVkLWRlcml2ZSB0aGUgdXNlciBjaGlsZCAoYG0vPGluZGV4PidgKSwgcmVnaXN0ZXIgaXRcbiAgICogcHVibGljLW9ubHk7IGJhY2t1cCBhbmQgQml0R28gY2hpbGRyZW4gYXJlIHNvZnQtZGVyaXZlZCBvbiB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBgdHNzYDogZGVjcnlwdCB0aGUgdXNlciByb290IGJsb2IsIHJ1biB0aGUgdXNlci9CaXRHbyBoYXJkLWRlcml2ZSBjZXJlbW9ueSxcbiAgICogcmVnaXN0ZXIgdGhlIG9yZGVyZWQgY2hpbGQgZG9jdW1lbnRzLCB0aGVuIG1pbnQuXG4gICAqL1xuICBhc3luYyBjcmVhdGVXYWxsZXQocGFyYW1zOiBDcmVhdGVTYWZlV2FsbGV0T3B0aW9ucyk6IFByb21pc2U8V2FsbGV0PiB7XG4gICAgaWYgKHBhcmFtcy5wYXNzcGhyYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXNzcGhyYXNlIGlzIHJlcXVpcmVkIHRvIG1pbnQgYSBzYWZlIHdhbGxldCcpO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLnR5cGUgIT09IHVuZGVmaW5lZCAmJiBwYXJhbXMudHlwZSAhPT0gJ2hvdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2FmZSB3YWxsZXRzIGFyZSBob3Qtb25seSBpbiB2MScpO1xuICAgIH1cbiAgICBjb25zdCBpc1RzcyA9IHBhcmFtcy5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnO1xuXG4gICAgY29uc3QgY29pbiA9IHRoaXMuYml0Z28uY29pbihwYXJhbXMuY29pbik7XG4gICAgaWYgKGlzVHNzICYmIGNvaW4uZ2V0RGVmYXVsdE11bHRpc2lnVHlwZSgpICE9PSAndHNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb2luICcke2NvaW4uZ2V0Q2hhaW4oKX0nIGlzIG5vdCBhIFRTUyBjb2luOyBjYW5ub3QgbWludCBhIHRzcyBzYWZlIHdhbGxldCBmb3IgaXRgKTtcbiAgICB9XG4gICAgaWYgKCFpc1RzcyAmJiBjb2luLmdldERlZmF1bHRNdWx0aXNpZ1R5cGUoKSA9PT0gJ3RzcycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTVBDIHNhZmUgd2FsbGV0IG1pbnRpbmcgcmVxdWlyZXMgbXVsdGlzaWdUeXBlIFwidHNzXCI7IHVzZSBcIm9uY2hhaW5cIiBmb3Igbm9uLU1QQyBtaW50aW5nJyk7XG4gICAgfVxuICAgIGNvbnN0IHNsb3QgPSBpc1RzcyA/IHRzc1Nsb3RGb3JDb2luKGNvaW4uZ2V0Q2hhaW4oKSkgOiBvbmNoYWluU2xvdEZvckNvaW4oY29pbi5nZXRDaGFpbigpKTtcblxuICAgIGNvbnN0IGluZGV4UmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL2Rlcml2YXRpb24taW5kZXgnKSkucXVlcnkoeyBzbG90IH0pLnJlc3VsdCgpO1xuICAgIGNvbnN0IHBlZWtlZCA9IGRlY29kZVdpdGhDb2RlYyhHZXREZXJpdmF0aW9uSW5kZXhSZXNwb25zZSwgaW5kZXhSZXNwb25zZSwgJ0dldERlcml2YXRpb25JbmRleFJlc3BvbnNlJyk7XG4gICAgaWYgKHBlZWtlZC5zbG90ICE9PSBzbG90KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGRlcml2YXRpb24taW5kZXggcmV0dXJuZWQgc2xvdCAnJHtwZWVrZWQuc2xvdH0nLCBleHBlY3RlZCAnJHtzbG90fSdgKTtcbiAgICB9XG4gICAgY29uc3QgeyBpbmRleCB9ID0gcGVla2VkO1xuXG4gICAgY29uc3Qgc2FmZURhdGEgPSByb290SWRGcm9tU2FmZSh0aGlzLl9zYWZlLCBzbG90LCAwKSAhPT0gdW5kZWZpbmVkID8gdGhpcy5fc2FmZSA6IGF3YWl0IHRoaXMuZmV0Y2hTYWZlRGF0YSgpO1xuICAgIGNvbnN0IHVzZXJSb290SWQgPSByb290SWRGcm9tU2FmZShzYWZlRGF0YSwgc2xvdCwgMCk7XG4gICAgaWYgKHVzZXJSb290SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTYWZlICR7dGhpcy5pZCgpfSBpcyBtaXNzaW5nIHJvb3RLZXlzLmhvdC4ke3Nsb3R9YCk7XG4gICAgfVxuXG4gICAgaWYgKGlzVHNzKSB7XG4gICAgICBjb25zdCBiYWNrdXBSb290SWQgPSByb290SWRGcm9tU2FmZShzYWZlRGF0YSwgc2xvdCwgMSk7XG4gICAgICBjb25zdCBiaXRnb1Jvb3RJZCA9IHJvb3RJZEZyb21TYWZlKHNhZmVEYXRhLCBzbG90LCAyKTtcbiAgICAgIGlmIChiYWNrdXBSb290SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNhZmUgJHt0aGlzLmlkKCl9IGlzIG1pc3Npbmcgcm9vdEtleXMuaG90LiR7c2xvdH0gYmFja3VwIGtleWApO1xuICAgICAgfVxuICAgICAgaWYgKGJpdGdvUm9vdElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTYWZlICR7dGhpcy5pZCgpfSBpcyBtaXNzaW5nIHJvb3RLZXlzLmhvdC4ke3Nsb3R9IGJpdGdvIGtleWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVHNzV2FsbGV0SW5TYWZlKGNvaW4sIHVzZXJSb290SWQsIGJhY2t1cFJvb3RJZCwgYml0Z29Sb290SWQsIGluZGV4LCBwYXJhbXMpO1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWlucyA9IGNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgY29uc3Qgcm9vdEtleWNoYWluID0gYXdhaXQga2V5Y2hhaW5zLmdldCh7IGlkOiB1c2VyUm9vdElkIH0pO1xuICAgIGlmIChyb290S2V5Y2hhaW4uc291cmNlICE9PSAndXNlcicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUm9vdEtleWNoYWluU291cmNlRXJyb3Iocm9vdEtleWNoYWluLmlkLCByb290S2V5Y2hhaW4uc291cmNlKTtcbiAgICB9XG4gICAgY29uc3Qgcm9vdFBydiA9IGF3YWl0IGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXkodGhpcy5iaXRnbywgcm9vdEtleWNoYWluLCBwYXJhbXMucGFzc3BocmFzZSk7XG4gICAgaWYgKCFyb290UHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgSW5jb3JyZWN0UGFzc3dvcmRFcnJvcigpO1xuICAgIH1cblxuICAgIGNvbnN0IGRlcml2ZWQgPVxuICAgICAgc2xvdCA9PT0gJ2VkMjU1MTlNdWx0aXNpZydcbiAgICAgICAgPyBkZXJpdmVTYWZlQ2hpbGRFZDI1NTE5SGFyZGVuZWQocm9vdFBydiwgaW5kZXgpXG4gICAgICAgIDogZGVyaXZlQW5kU2VsZkNoZWNrU2FmZUNoaWxkSGFyZGVuZWQocm9vdFBydiwgaW5kZXgpO1xuICAgIGNvbnN0IGRlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCA9IGRlY29kZVdpdGhDb2RlYyhcbiAgICAgIERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCxcbiAgICAgIGRlcml2ZWQuZGVyaXZhdGlvblBhdGgsXG4gICAgICAnZGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoJ1xuICAgICk7XG5cbiAgICBjb25zdCBjaGlsZCA9IGF3YWl0IGtleWNoYWlucy5hZGQoe1xuICAgICAgcHViOiBkZXJpdmVkLnB1YixcbiAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAga2V5VHlwZTogJ2luZGVwZW5kZW50JyxcbiAgICAgIHBhcmVudDogdXNlclJvb3RJZCxcbiAgICAgIHNhZmVJZDogdGhpcy5pZCgpLFxuICAgICAgZGVyaXZlZEZyb21QYXJlbnRXaXRoUGF0aDogZGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoLFxuICAgIH0pO1xuICAgIGNvbnN0IGNoaWxkSWQgPSBjaGlsZC5pZDtcbiAgICBpZiAoY2hpbGRJZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2FmZSBjaGlsZCBrZXkgcmVnaXN0cmF0aW9uIHJldHVybmVkIGFuIGVtcHR5IGlkJyk7XG4gICAgfVxuICAgIGNvbnN0IGtleXM6IFtzdHJpbmddID0gW2NoaWxkSWRdO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwb3N0V2l0aENvZGVjKHRoaXMuYml0Z28sIHRoaXMudXJsKCcvd2FsbGV0cycpLCBDcmVhdGVXYWxsZXRJblNhZmVCb2R5LCB7XG4gICAgICBjb2luOiBwYXJhbXMuY29pbixcbiAgICAgIGxhYmVsOiBwYXJhbXMubGFiZWwsXG4gICAgICB0eXBlOiAnaG90JyxcbiAgICAgIG11bHRpc2lnVHlwZTogJ29uY2hhaW4nLFxuICAgICAga2V5cyxcbiAgICB9KS5yZXN1bHQoKTtcbiAgICByZXR1cm4gbmV3IFdhbGxldCh0aGlzLmJpdGdvLCBjb2luLCByZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogVFNTIHdhbGxldCBtaW50OiBkZWNyeXB0IHRoZSB1c2VyIHJvb3QgYmxvYiwgcnVuIHRoZSB1c2VyL0JpdEdvIGhhcmQtZGVyaXZlXG4gICAqIGNlcmVtb255LCByZWdpc3RlciB0aGUgb3JkZXJlZCBjaGlsZCBkb2N1bWVudHMsIHRoZW4gbWludC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlVHNzV2FsbGV0SW5TYWZlKFxuICAgIGNvaW46IElCYXNlQ29pbixcbiAgICB1c2VyUm9vdElkOiBzdHJpbmcsXG4gICAgYmFja3VwUm9vdElkOiBzdHJpbmcsXG4gICAgYml0Z29Sb290SWQ6IHN0cmluZyxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHBhcmFtczogQ3JlYXRlU2FmZVdhbGxldE9wdGlvbnNcbiAgKTogUHJvbWlzZTxXYWxsZXQ+IHtcbiAgICBjb25zdCBrZXljaGFpbnMgPSBjb2luLmtleWNoYWlucygpO1xuICAgIGNvbnN0IHVzZXJSb290S2V5Y2hhaW4gPSBhd2FpdCBrZXljaGFpbnMuZ2V0KHsgaWQ6IHVzZXJSb290SWQgfSk7XG4gICAgaWYgKHVzZXJSb290S2V5Y2hhaW4uc291cmNlICE9PSAndXNlcicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUm9vdEtleWNoYWluU291cmNlRXJyb3IodXNlclJvb3RLZXljaGFpbi5pZCwgdXNlclJvb3RLZXljaGFpbi5zb3VyY2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJSb290UHJ2ID0gYXdhaXQgZGVjcnlwdEtleWNoYWluUHJpdmF0ZUtleSh0aGlzLmJpdGdvLCB1c2VyUm9vdEtleWNoYWluLCBwYXJhbXMucGFzc3BocmFzZSk7XG4gICAgaWYgKCF1c2VyUm9vdFBydikge1xuICAgICAgdGhyb3cgbmV3IEluY29ycmVjdFBhc3N3b3JkRXJyb3IoKTtcbiAgICB9XG4gICAgY29uc3QgdXNlclJvb3RNYXRlcmlhbCA9IEVDRFNBVXRpbHMucGFyc2VWcmZLZXlFbnZlbG9wZXModXNlclJvb3RQcnYpO1xuXG4gICAgY29uc3QgdHNzVXRpbHMgPSBuZXcgRUNEU0FVdGlscy5FY2RzYVZyZk1QQ3YyVXRpbHModGhpcy5iaXRnbywgY29pbik7XG4gICAgY29uc3QgeyB1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluIH0gPSBhd2FpdCB0c3NVdGlscy5jcmVhdGVTYWZlQ2hpbGRLZXljaGFpbnMoe1xuICAgICAgcGFzc3BocmFzZTogcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICBlbnRlcnByaXNlOiB0aGlzLmVudGVycHJpc2VJZCgpLFxuICAgICAgc2FmZUlkOiB0aGlzLmlkKCksXG4gICAgICBwYXJlbnRLZXlJZDogYml0Z29Sb290SWQsXG4gICAgICBkZXJpdmF0aW9uSW5kZXg6IGluZGV4LFxuICAgICAgdXNlclJvb3RLZXlJZDogdXNlclJvb3RJZCxcbiAgICAgIGJhY2t1cFJvb3RLZXlJZDogYmFja3VwUm9vdElkLFxuICAgICAgdXNlclJvb3RLZXlTaGFyZTogdXNlclJvb3RNYXRlcmlhbC5zaWduaW5nLFxuICAgICAgdXNlclJvb3RWcmZLZXlTaGFyZTogdXNlclJvb3RNYXRlcmlhbC52cmYsXG4gICAgfSk7XG4gICAgaWYgKHVzZXJLZXljaGFpbi5pZC5sZW5ndGggPT09IDAgfHwgYmFja3VwS2V5Y2hhaW4uaWQubGVuZ3RoID09PSAwIHx8IGJpdGdvS2V5Y2hhaW4uaWQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NhZmUgY2hpbGQga2V5IHJlZ2lzdHJhdGlvbiByZXR1cm5lZCBhbiBlbXB0eSBpZCcpO1xuICAgIH1cbiAgICBjb25zdCBrZXlzOiBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ10gPSBbdXNlcktleWNoYWluLmlkLCBiYWNrdXBLZXljaGFpbi5pZCwgYml0Z29LZXljaGFpbi5pZF07XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3RXaXRoQ29kZWModGhpcy5iaXRnbywgdGhpcy51cmwoJy93YWxsZXRzJyksIENyZWF0ZVdhbGxldEluU2FmZUJvZHksIHtcbiAgICAgIGNvaW46IHBhcmFtcy5jb2luLFxuICAgICAgbGFiZWw6IHBhcmFtcy5sYWJlbCxcbiAgICAgIHR5cGU6ICdob3QnLFxuICAgICAgbXVsdGlzaWdUeXBlOiAndHNzJyxcbiAgICAgIGtleXMsXG4gICAgfSkucmVzdWx0KCk7XG4gICAgcmV0dXJuIG5ldyBXYWxsZXQodGhpcy5iaXRnbywgY29pbiwgcmVzcG9uc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFNhZmVEYXRhKCk6IFByb21pc2U8U2FmZURhdGE+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCkpLnJlc3VsdCgpO1xuICAgIHJldHVybiBkZWNvZGVXaXRoQ29kZWMoU2FmZURhdGEsIHJlc3BvbnNlLCAnU2FmZURhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBtZW1iZXIgdG8gdGhlIHdob2xlIHNhZmUgKHZpZXcvYWRtaW4vc3BlbmQpLiBTcGVuZCBvcGVucyBhIGtleSBzaGFyZS5cbiAgICovXG4gIGFzeW5jIGFkZE1lbWJlcihwYXJhbXM6IEFkZFNhZmVNZW1iZXJPcHRpb25zKTogUHJvbWlzZTxTYWZlRGF0YT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignU2FmZS5hZGRNZW1iZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlIE9ORSBzYWZlIHdhbGxldCB3aXRoIGEgbm9uLW1lbWJlciB2aWEgdGhlIGV4aXN0aW5nIHdhbGxldC1zaGFyZSBoYW5kc2hha2UuXG4gICAqL1xuICBhc3luYyBhZGRNZW1iZXJUb1dhbGxldChwYXJhbXM6IEFkZFNhZmVXYWxsZXRNZW1iZXJPcHRpb25zKTogUHJvbWlzZTxXYWxsZXRTaGFyZURhdGE+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NhZmUuYWRkTWVtYmVyVG9XYWxsZXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIHNhZmUga2V5IHNoYXJlcyB2aXNpYmxlIHRvIHRoZSBjYWxsZXIuXG4gICAqL1xuICBhc3luYyBsaXN0U2hhcmVzKHBhcmFtczogeyBzdGF0ZT86IFNhZmVTaGFyZVN0YXRlIH0gPSB7fSk6IFByb21pc2U8U2FmZVNoYXJlRGF0YVtdPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTYWZlLmxpc3RTaGFyZXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdCBhIHNhZmUga2V5IHNoYXJlIGFkZHJlc3NlZCB0byB0aGUgY2FsbGVyLlxuICAgKi9cbiAgYXN5bmMgYWNjZXB0U2hhcmUocGFyYW1zOiBBY2NlcHRTYWZlU2hhcmVPcHRpb25zKTogUHJvbWlzZTxTYWZlU2hhcmVEYXRhPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTYWZlLmFjY2VwdFNoYXJlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIHNhZmUgbGFiZWwuXG4gICAqL1xuICBhc3luYyB1cGRhdGUocGFyYW1zOiBVcGRhdGVTYWZlT3B0aW9ucyk6IFByb21pc2U8U2FmZURhdGE+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28ucHV0KHRoaXMudXJsKCkpLnNlbmQoeyBsYWJlbDogcGFyYW1zLmxhYmVsIH0pLnJlc3VsdCgpO1xuICAgIHJldHVybiBkZWNvZGVXaXRoQ29kZWMoU2FmZURhdGEsIHJlc3BvbnNlLCAnU2FmZURhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGcmVlemUgdGhlIHNhZmUg4oCUIGJsb2NrcyB3aXRoZHJhd2FscyBvbiBhbGwgc2FmZSB3YWxsZXRzLiBTYWZlIHN0YXlzICdhY3RpdmUnLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBmcmVlemUocGFyYW1zOiBGcmVlemVTYWZlQm9keSA9IHt9KTogUHJvbWlzZTxTYWZlRGF0YT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdFdpdGhDb2RlYyh0aGlzLmJpdGdvLCB0aGlzLnVybCgnL2ZyZWV6ZScpLCBGcmVlemVTYWZlQm9keSwgcGFyYW1zKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gZGVjb2RlV2l0aENvZGVjKFNhZmVEYXRhLCByZXNwb25zZSwgJ1NhZmVEYXRhJyk7XG4gIH1cblxuICAvKipcbiAgICogQXJjaGl2ZSB0aGUgc2FmZS4gUmVxdWlyZXMgZXZlcnkgc2FmZSB3YWxsZXQgdG8gYWxyZWFkeSBiZSBhcmNoaXZlZDsgYWxzbyB0aGUgYWJhbmRvbm1lbnRcbiAgICogcGF0aCBmb3IgYSBzdHVjayAnaW5pdGlhbGl6aW5nJyBzYWZlLlxuICAgKi9cbiAgYXN5bmMgYXJjaGl2ZSgpOiBQcm9taXNlPFNhZmVEYXRhPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9hcmNoaXZlJykpLnNlbmQoKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gZGVjb2RlV2l0aENvZGVjKFNhZmVEYXRhLCByZXNwb25zZSwgJ1NhZmVEYXRhJyk7XG4gIH1cblxuICB0b0pTT04oKTogU2FmZURhdGEge1xuICAgIHJldHVybiB0aGlzLl9zYWZlO1xuICB9XG59XG4iXX0=
@@ -45,7 +45,7 @@ const public_types_1 = require("@bitgo/public-types");
45
45
  const common_1 = require("../../common");
46
46
  const errors_1 = require("../errors");
47
47
  const codecs_1 = require("../utils/codecs");
48
- const derivableEd25519Pub_1 = require("./derivableEd25519Pub");
48
+ const sdk_lib_safes_1 = require("@bitgo-beta/sdk-lib-safes");
49
49
  const postWithCodec_1 = require("../utils/postWithCodec");
50
50
  const safe_1 = require("./safe");
51
51
  /**
@@ -259,9 +259,9 @@ class Safes {
259
259
  // Coin-specific child encoding is performed by Wallet Platform after soft derivation.
260
260
  if (slot === 'ed25519Multisig' &&
261
261
  (!backupKeychain.pub ||
262
- !(0, derivableEd25519Pub_1.isDerivableEd25519Pub)(backupKeychain.pub) ||
262
+ !(0, sdk_lib_safes_1.isDerivableEd25519Pub)(backupKeychain.pub) ||
263
263
  !bitgoKeychain.pub ||
264
- !(0, derivableEd25519Pub_1.isDerivableEd25519Pub)(bitgoKeychain.pub))) {
264
+ !(0, sdk_lib_safes_1.isDerivableEd25519Pub)(bitgoKeychain.pub))) {
265
265
  throw new Error('Safe ed25519Multisig roots are not derivable: expected 64-byte canonical base32 material');
266
266
  }
267
267
  return [userKeychain.id, backupKeychain.id, bitgoKeychain.id];
@@ -314,4 +314,4 @@ class Safes {
314
314
  }
315
315
  }
316
316
  exports.Safes = Safes;
317
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYml0Z28vc2FmZS9zYWZlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7Ozs7R0FLRztBQUNILHlDQUEyQjtBQUMzQixzREFRNkI7QUFDN0IseUNBQTRDO0FBRzVDLHNDQUE2QztBQUM3Qyw0Q0FBa0Q7QUFDbEQsK0RBQThEO0FBQzlELDBEQUF1RDtBQUd2RCxpQ0FBOEI7QUFFOUI7Ozs7OztHQU1HO0FBQ0gsTUFBTSxvQkFBb0IsR0FBK0Q7SUFDdkYsT0FBTyxFQUFFO1FBQ1AsaUJBQWlCO1FBQ2pCLGlCQUFpQixFQUFFLEtBQUs7UUFDeEIsZUFBZSxFQUFFLEtBQUs7UUFDdEIsWUFBWTtRQUNaLFFBQVEsRUFBRSxLQUFLO1FBQ2YsUUFBUSxFQUFFLEtBQUs7S0FDaEI7SUFDRCxPQUFPLEVBQUU7UUFDUCxpQkFBaUI7UUFDakIsaUJBQWlCLEVBQUUsTUFBTTtRQUN6QixlQUFlLEVBQUUsTUFBTTtRQUN2QixZQUFZO1FBQ1osUUFBUSxFQUFFLE9BQU87UUFDakIsUUFBUSxFQUFFLE1BQU07S0FDakI7Q0FDRixDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUM7SUFDdkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLHVCQUFRLENBQUMsRUFBRSxDQUFDO0lBQ3BDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQ3pDLENBQUMsQ0FBQztBQUVIOzs7Ozs7R0FNRztBQUNILE1BQWEsS0FBSztJQUloQixZQUFZLEtBQWdCLEVBQUUsWUFBb0I7UUFDaEQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIs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UUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxRSxNQUFNLFFBQVEsR0FBRyxJQUFBLHdCQUFlLEVBQUMsdUJBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDakUsT0FBTyxJQUFJLFdBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7Q0FDRjtBQXBRRCxzQkFvUUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICpcbiAqIEBleHBlcmltZW50YWwgVGhlIHNhZmUgY2xpZW50IHN1cmZhY2UgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIChpbmNsdWRpbmcgYnJlYWtpbmdcbiAqIGNoYW5nZXMpIGJlZm9yZSB0aGUgcHVibGljIHJlbGVhc2UuXG4gKi9cbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuaW1wb3J0IHtcbiAgRmluYWxpemVTYWZlQm9keSxcbiAgSW5pdGlhbGl6ZVNhZmVCb2R5LFxuICBJbml0aWFsaXplU2FmZVJlc3BvbnNlLFxuICBSb290S2V5c0J5VHlwZSxcbiAgUm9vdEtleVRyaXBsZXQsXG4gIFJvb3RLZXlUeXBlLFxuICBTYWZlRGF0YSxcbn0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudHMgfSBmcm9tICcuLi8uLi9jb21tb24nO1xuaW1wb3J0IHsgSUJhc2VDb2luIH0gZnJvbSAnLi4vYmFzZUNvaW4nO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnLi4vYml0Z29CYXNlJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgZGVjb2RlV2l0aENvZGVjIH0gZnJvbSAnLi4vdXRpbHMvY29kZWNzJztcbmltcG9ydCB7IGlzRGVyaXZhYmxlRWQyNTUxOVB1YiB9IGZyb20gJy4vZGVyaXZhYmxlRWQyNTUxOVB1Yic7XG5pbXBvcnQgeyBwb3N0V2l0aENvZGVjIH0gZnJvbSAnLi4vdXRpbHMvcG9zdFdpdGhDb2RlYyc7XG5pbXBvcnQgeyBGaW5hbGl6ZVNhZmVPcHRpb25zLCBJbml0aWFsaXplU2FmZU9wdGlvbnMgfSBmcm9tICcuL2lTYWZlJztcbmltcG9ydCB7IENyZWF0ZVNhZmVPcHRpb25zLCBHZXRTYWZlT3B0aW9ucywgSVNhZmVzLCBMaXN0U2FmZXNPcHRpb25zLCBTYWZlQ3JlYXRpb25IYW5kbGUsIFNhZmVLZXlzIH0gZnJvbSAnLi9pU2FmZXMnO1xuaW1wb3J0IHsgU2FmZSB9IGZyb20gJy4vc2FmZSc7XG5cbi8qKlxuICogUmVwcmVzZW50YXRpdmUgY29pbiBwZXIgcm9vdCBzbG90LCBieSBuZXR3b3JrLiBTYWZlIHJvb3RzIGFyZSBjdXJ2ZS9zY2hlbWUtc2NvcGVkLCBub3RcbiAqIGNvaW4tc2NvcGVkIOKAlCBXUCBzdGFtcHMgYGN1cnZlYCBzZXJ2ZXItc2lkZSBmcm9tIHRoZSBjb2luJ3Mga2V5IGN1cnZlLCBzbyBhbnkgY29pbiBvZiB0aGVcbiAqIHJpZ2h0IChjdXJ2ZSwgc2NoZW1lKSB3b3Jrcy4gVGhlc2UgYXJlIHN0YWJsZSwgYWx3YXlzLWF2YWlsYWJsZSBjaG9pY2VzIHVzZWQgb25seSB0byByb3V0ZVxuICogdGhlIGtleS1nZW5lcmF0aW9uIGNlcmVtb255OyB0aGUgcmVzdWx0aW5nIHJvb3QgaXMgaW50ZXJjaGFuZ2VhYmxlIGFjcm9zcyBjb2lucyBvZiB0aGUgc2xvdC5cbiAqIEBleHBlcmltZW50YWxcbiAqL1xuY29uc3QgUk9PVF9DT0lOX0JZX05FVFdPUks6IFJlY29yZDwnbWFpbm5ldCcgfCAndGVzdG5ldCcsIFJlY29yZDxSb290S2V5VHlwZSwgc3RyaW5nPj4gPSB7XG4gIG1haW5uZXQ6IHtcbiAgICAvLyBtdWx0aXNpZyByb290c1xuICAgIHNlY3AyNTZrMU11bHRpc2lnOiAnYnRjJyxcbiAgICBlZDI1NTE5TXVsdGlzaWc6ICd4bG0nLFxuICAgIC8vIE1QQyByb290c1xuICAgIGVjZHNhTXBjOiAnZXRoJyxcbiAgICBlZGRzYU1wYzogJ3NvbCcsXG4gIH0sXG4gIHRlc3RuZXQ6IHtcbiAgICAvLyBtdWx0aXNpZyByb290c1xuICAgIHNlY3AyNTZrMU11bHRpc2lnOiAndGJ0YycsXG4gICAgZWQyNTUxOU11bHRpc2lnOiAndHhsbScsXG4gICAgLy8gTVBDIHJvb3RzXG4gICAgZWNkc2FNcGM6ICdodGV0aCcsXG4gICAgZWRkc2FNcGM6ICd0c29sJyxcbiAgfSxcbn07XG5cbi8qKlxuICogV2lyZSBzaGFwZSBvZiB0aGUgcGFnaW5hdGVkIGBHRVQgL2VudGVycHJpc2UvOmVJZC9zYWZlc2AgcmVzcG9uc2UuIFdQIHBhZ2luYXRlcyB3aXRoIHRoZSB2MlxuICogYHByZXZJZGAvYG5leHRCYXRjaFByZXZJZGAgY29udmVudGlvbjsgdGhlIFNESyByZS1leHBvc2VzIGl0IGFzIGFuIG9wYXF1ZSBgY3Vyc29yYC9gbmV4dEN1cnNvcmBcbiAqIChzZWUgYGxpc3RgKS5cbiAqIEBleHBlcmltZW50YWxcbiAqL1xuY29uc3QgTGlzdFNhZmVzUmVzcG9uc2UgPSB0LmludGVyc2VjdGlvbihbXG4gIHQudHlwZSh7IHNhZmVzOiB0LmFycmF5KFNhZmVEYXRhKSB9KSxcbiAgdC5wYXJ0aWFsKHsgbmV4dEJhdGNoUHJldklkOiB0LnN0cmluZyB9KSxcbl0pO1xuXG4vKipcbiAqIENvbGxlY3Rpb24gYWNjZXNzb3IgZm9yIGEgc2luZ2xlIGVudGVycHJpc2UncyBzYWZlcywgbWlycm9yaW5nIFdhbGxldHMgLyBFbnRlcnByaXNlcy5cbiAqIFNhZmUgcm91dGVzIGFyZSBlbnRlcnByaXNlLXNjb3BlZCAoL2FwaS92Mi9lbnRlcnByaXNlLzplSWQvc2FmZXMpLCBzbyB0aGUgYWNjZXNzb3IgaXNcbiAqIGNvbnN0cnVjdGVkIHdpdGggdGhlIGVudGVycHJpc2UgaWQgKHNlZSBFbnRlcnByaXNlLnNhZmVzKCkpLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGNsYXNzIFNhZmVzIGltcGxlbWVudHMgSVNhZmVzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiaXRnbzogQml0R29CYXNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGVudGVycHJpc2VJZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIGVudGVycHJpc2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5iaXRnbyA9IGJpdGdvO1xuICAgIHRoaXMuZW50ZXJwcmlzZUlkID0gZW50ZXJwcmlzZUlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEVudGVycHJpc2Utc2NvcGVkIHYyIFVSTCBmb3IgdGhlIHNhZmVzIGNvbGxlY3Rpb24sIGUuZy4gL2FwaS92Mi9lbnRlcnByaXNlLzplSWQvc2FmZXNcbiAgICogQHBhcmFtIGV4dHJhXG4gICAqL1xuICBwcml2YXRlIHVybChleHRyYSA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5iaXRnby51cmwoYC9lbnRlcnByaXNlLyR7dGhpcy5lbnRlcnByaXNlSWR9L3NhZmVzJHtleHRyYX1gLCAyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUtY2FsbCBjb252ZW5pZW5jZSB3cmFwcGVyIGNoYWluaW5nIHRoZSB0aHJlZSBjcmVhdGlvbiBwaGFzZXM6XG4gICAqIGluaXRpYWxpemUgKFBoYXNlIDEpIOKGkiBjcmVhdGVTYWZlS2V5cyAoUGhhc2UgMiwgZW5hYmxlZC1zbG90IGNlcmVtb25pZXMpIOKGklxuICAgKiBmaW5hbGl6ZSAoUGhhc2UgMykuIEhPVCBjdXN0b2R5IG9ubHkgaW4gdjEuXG4gICAqXG4gICAqIElmIGEga2V5IGNlcmVtb255IGZhaWxzLCBgY3JlYXRlU2FmZUtleXNgIGFyY2hpdmVzIHRoZSBzYWZlIGJlZm9yZSB0aHJvd2luZywgc28gYSBmYWlsZWQgcnVuXG4gICAqIGxlYXZlcyBubyBoYWxmLWNyZWF0ZWQgc2FmZSBiZWhpbmQg4oCUIGNyZWF0ZSBhIG5ldyBzYWZlIGFuZCByZXRyeS5cbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVTYWZlKHBhcmFtczogQ3JlYXRlU2FmZU9wdGlvbnMpOiBQcm9taXNlPFNhZmU+IHtcbiAgICBjb25zdCBzYWZlID0gYXdhaXQgdGhpcy5pbml0aWFsaXplU2FmZSh7IGxhYmVsOiBwYXJhbXMubGFiZWwgfSk7XG4gICAgY29uc3Qgcm9vdEtleXMgPSBhd2FpdCB0aGlzLmNyZWF0ZVNhZmVLZXlzKHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHNhZmVJZDogc2FmZS5pZCxcbiAgICAgIGVuYWJsZWRSb290U2xvdHM6IHNhZmUuZW5hYmxlZFJvb3RTbG90cyxcbiAgICB9KTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5hbGl6ZVNhZmUoc2FmZS5pZCwgcm9vdEtleXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBoYXNlIDEg4oCUIGluaXRpYWxpemUgYSBzYWZlIChtZXRhZGF0YSBvbmx5LCBubyBrZXkgbWF0ZXJpYWwpLlxuICAgKiBQT1NUIC9hcGkvdjIvZW50ZXJwcmlzZS86ZUlkL3NhZmVzIHsgbGFiZWwgfVxuICAgKiBSZXNwb25zZSBpcyBgeyBpZCwgc3RhdHVzIH1gIHBsdXMgb3B0aW9uYWwgYGVuYWJsZWRSb290U2xvdHNgIChhYnNlbnQgb24gb2xkZXIgV1ApLlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICBhc3luYyBpbml0aWFsaXplU2FmZShwYXJhbXM6IEluaXRpYWxpemVTYWZlT3B0aW9ucyk6IFByb21pc2U8SW5pdGlhbGl6ZVNhZmVSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdFdpdGhDb2RlYyh0aGlzLmJpdGdvLCB0aGlzLnVybCgpLCBJbml0aWFsaXplU2FmZUJvZHksIHBhcmFtcykucmVzdWx0KCk7XG4gICAgcmV0dXJuIGRlY29kZVdpdGhDb2RlYyhJbml0aWFsaXplU2FmZVJlc3BvbnNlLCByZXNwb25zZSwgJ0luaXRpYWxpemVTYWZlUmVzcG9uc2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaGFzZSAyIOKAlCBydW4gdGhlIGVuYWJsZWQgcm9vdCBrZXkgY2VyZW1vbmllcyB0YWdnZWQgd2l0aCBgc2FmZUlkYDsgcmV0dXJucyBvcmRlcmVkXG4gICAqIFt1c2VyLCBiYWNrdXAsIGJpdGdvXSB0cmlwbGV0cyBmb3IgdGhvc2Ugc2xvdHMuIEhPVCBjdXN0b2R5IG9ubHkgaW4gdjEuXG4gICAqXG4gICAqIEFic2VudCBgZW5hYmxlZFJvb3RTbG90c2AgKG9sZGVyIFdQLCBwcmUtZ2F0aW5nKSBydW5zIGFsbCA0IHNsb3RzLiBFbmFibGVkIGNlcmVtb25pZXNcbiAgICogKDIuMSBtdWx0aXNpZyDikaDikaMsIDIuMiBNUEMg4pGh4pGiKSBydW4gaW4gcGFyYWxsZWwuIElmIGFueSBvZiB0aGVtIGZhaWwsIHRoZVxuICAgKiBwYXJ0aWFsbHktY3JlYXRlZCBzYWZlIGlzIGFyY2hpdmVkIChhIGxlZ2FsIGBpbml0aWFsaXppbmcg4oaSIGFyY2hpdmVkYCB0cmFuc2l0aW9uLCBzbyB0aGVcbiAgICogb3JwaGFuZWQgdGFnZ2VkIGtleXMgYXJlIGluZXJ0KSBhbmQgYW4gZXJyb3IgbGlzdGluZyBldmVyeSBjZXJlbW9ueSBmYWlsdXJlIGlzIHRocm93biDigJRcbiAgICogY3JlYXRlIGEgbmV3IHNhZmUgYW5kIHJldHJ5LlxuICAgKlxuICAgKiBOb3QgaW5kZXBlbmRlbnRseSBpZGVtcG90ZW50OiByZS1ydW5uaW5nIGFnYWluc3QgYSBzYWZlIHRoYXQgYWxyZWFkeSBoYXMgc29tZSByb290cyBoaXRzIFdQJ3NcbiAgICogdW5pcXVlIHJvb3Qtc2xvdCBpbmRleC5cbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgYXN5bmMgY3JlYXRlU2FmZUtleXMocGFyYW1zOiBDcmVhdGVTYWZlT3B0aW9ucyAmIFNhZmVDcmVhdGlvbkhhbmRsZSk6IFByb21pc2U8U2FmZUtleXM+IHtcbiAgICBjb25zdCB7IHNhZmVJZCwgcGFzc3BocmFzZSwgZW5hYmxlZFJvb3RTbG90cyB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGVudGVycHJpc2UgPSB0aGlzLmVudGVycHJpc2VJZDtcblxuICAgIC8vIEFic2VudCBgZW5hYmxlZFJvb3RTbG90c2AgKG9sZGVyIFdQLCBwcmUtZ2F0aW5nKSDih5IgYWxsIDQsIHByZXNlcnZpbmcgY3VycmVudCBiZWhhdmlvci5cbiAgICAvLyBPcmRlcmVkIGJ5IHNjaGVtZTogdGhlIHR3byBtdWx0aXNpZyByb290cyBmaXJzdCwgdGhlbiB0aGUgdHdvIE1QQyByb290cy5cbiAgICBjb25zdCBhbGxTbG90czogUm9vdEtleVR5cGVbXSA9IFsnc2VjcDI1NmsxTXVsdGlzaWcnLCAnZWQyNTUxOU11bHRpc2lnJywgJ2VjZHNhTXBjJywgJ2VkZHNhTXBjJ107XG4gICAgY29uc3QgZW5hYmxlZCA9IG5ldyBTZXQoZW5hYmxlZFJvb3RTbG90cyA/PyBhbGxTbG90cyk7XG4gICAgY29uc3Qgc2xvdHMgPSBhbGxTbG90cy5maWx0ZXIoKHNsb3QpID0+IGVuYWJsZWQuaGFzKHNsb3QpKTtcbiAgICBjb25zdCBjZXJlbW9uaWVzOiBSZWNvcmQ8Um9vdEtleVR5cGUsICgpID0+IFByb21pc2U8Um9vdEtleVRyaXBsZXQ+PiA9IHtcbiAgICAgIC8vIFBoYXNlIDIuMSDigJQgbXVsdGlzaWcgcm9vdHMgKOKRoOKRoyk6IGxvY2FsIHVzZXIvYmFja3VwIGtleXBhaXJzICsgQml0R28ga2V5LCBhbGwgc2FmZUlkLXRhZ2dlZC5cbiAgICAgIHNlY3AyNTZrMU11bHRpc2lnOiAoKSA9PiB0aGlzLmNyZWF0ZU11bHRpc2lnUm9vdCgnc2VjcDI1NmsxTXVsdGlzaWcnLCBzYWZlSWQsIHBhc3NwaHJhc2UsIGVudGVycHJpc2UpLFxuICAgICAgZWQyNTUxOU11bHRpc2lnOiAoKSA9PiB0aGlzLmNyZWF0ZU11bHRpc2lnUm9vdCgnZWQyNTUxOU11bHRpc2lnJywgc2FmZUlkLCBwYXNzcGhyYXNlLCBlbnRlcnByaXNlKSxcbiAgICAgIC8vIFBoYXNlIDIuMiDigJQgTVBDIHJvb3RzICjikaHikaIpOiB0aGUgZXhpc3RpbmcgREtMUyAo4pGhKSBhbmQgRWREU0EgKOKRoikgY2VyZW1vbmllcywgc2FmZUlkIHRocmVhZGVkLlxuICAgICAgZWNkc2FNcGM6ICgpID0+IHRoaXMuY3JlYXRlTXBjUm9vdCgnZWNkc2FNcGMnLCBzYWZlSWQsIHBhc3NwaHJhc2UsIGVudGVycHJpc2UpLFxuICAgICAgZWRkc2FNcGM6ICgpID0+IHRoaXMuY3JlYXRlTXBjUm9vdCgnZWRkc2FNcGMnLCBzYWZlSWQsIHBhc3NwaHJhc2UsIGVudGVycHJpc2UpLFxuICAgIH07XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChzbG90cy5tYXAoKHNsb3QpID0+IGNlcmVtb25pZXNbc2xvdF0oKSkpO1xuXG4gICAgLy8gU2luZ2xlIHBhc3Mgb3ZlciB0aGUgc2V0dGxlZCByZXN1bHRzOiBgc3RhdHVzID09PSAnZnVsZmlsbGVkJ2AgbmFycm93cyBgLnZhbHVlYCB0byBhXG4gICAgLy8gUm9vdEtleVRyaXBsZXQsIGFuZCByZWplY3Rpb25zIGFyZSBjb2xsZWN0ZWQgcGVyLXNsb3QgZm9yIHRoZSBlcnJvciBiZWxvdy5cbiAgICBjb25zdCBob3Q6IFJvb3RLZXlzQnlUeXBlID0ge307XG4gICAgY29uc3QgZmFpbHVyZXM6IHN0cmluZ1tdID0gW107XG4gICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQsIGkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJykge1xuICAgICAgICBob3Rbc2xvdHNbaV1dID0gcmVzdWx0LnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVhc29uID0gcmVzdWx0LnJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gcmVzdWx0LnJlYXNvbi5tZXNzYWdlIDogU3RyaW5nKHJlc3VsdC5yZWFzb24pO1xuICAgICAgICAvLyBBcGlSZXNwb25zZUVycm9yIGNhcnJpZXMgdGhlIHNlcnZlci1lY2hvZWQgYFJlcXVlc3QtSURgIGhlYWRlciDigJQgaW5jbHVkZSBpdCAod2hlblxuICAgICAgICAvLyBwcmVzZW50KSBzbyBhIGZhaWxlZCBjZXJlbW9ueSBjYW4gYmUgY29ycmVsYXRlZCB3aXRoIFdQJ3Mgc2VydmVyLXNpZGUgbG9ncy5cbiAgICAgICAgY29uc3QgcmVxdWVzdElkID0gcmVzdWx0LnJlYXNvbiBpbnN0YW5jZW9mIEFwaVJlc3BvbnNlRXJyb3IgPyByZXN1bHQucmVhc29uLnJlcXVlc3RJZCA6IHVuZGVmaW5lZDtcbiAgICAgICAgZmFpbHVyZXMucHVzaChgJHtzbG90c1tpXX06ICR7cmVhc29ufSR7cmVxdWVzdElkID8gYCAocmVxdWVzdElkOiAke3JlcXVlc3RJZH0pYCA6ICcnfWApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGZhaWx1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEJlc3QtZWZmb3J0IGFiYW5kb24gdGhlIHBhcnRpYWxseS1jcmVhdGVkIHNhZmUgc28gYSByZXRyeSBzdGFydHMgZnJvbSBhIGNsZWFuIHNsYXRlLiBLZWVwXG4gICAgICAvLyB0aGUgY2VyZW1vbnkgZmFpbHVyZXMgYXMgdGhlIHByaW1hcnkgZXJyb3I7IG5vdGUgaXQgaWYgdGhlIGNsZWFudXAgYXJjaGl2ZSBhbHNvIGZhaWxlZC5cbiAgICAgIGxldCBhcmNoaXZlRXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcmNoaXZlU2FmZShzYWZlSWQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBhcmNoaXZlRXJyb3IgPSBlIGluc3RhbmNlb2YgRXJyb3IgPyBlIDogbmV3IEVycm9yKFN0cmluZyhlKSk7XG4gICAgICB9XG4gICAgICBsZXQgbWVzc2FnZSA9XG4gICAgICAgIGBTYWZlIGtleSBnZW5lcmF0aW9uIGZhaWxlZCBmb3IgJHtmYWlsdXJlcy5sZW5ndGh9IHJvb3QgY2VyZW1vbnkvaWVzIGAgK1xuICAgICAgICBgWyR7ZmFpbHVyZXMuam9pbignOyAnKX1dLiBUaGUgc2FmZSAoJHtzYWZlSWR9KSBoYXMgYmVlbiBhcmNoaXZlZDsgY3JlYXRlIGEgbmV3IHNhZmUgYW5kIHJldHJ5LmA7XG4gICAgICBpZiAoYXJjaGl2ZUVycm9yKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gYCBOT1RFOiBhcmNoaXZpbmcgdGhlIHNhZmUgYWxzbyBmYWlsZWQgKCR7YXJjaGl2ZUVycm9yLm1lc3NhZ2V9KTsgYXJjaGl2ZSBpdCBtYW51YWxseSBiZWZvcmUgcmV0cnlpbmcuYDtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyByb290S2V5czogeyBob3QgfSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFyY2hpdmUgYSBzYWZlLiBBbHNvIHRoZSBhYmFuZG9ubWVudCBwYXRoIGZvciBhIHN0dWNrIGBpbml0aWFsaXppbmdgIHNhZmUgKHVzZWQgYnlcbiAgICogYGNyZWF0ZVNhZmVLZXlzYCB0byBjbGVhbiB1cCBhZnRlciBhIGZhaWxlZCBjZXJlbW9ueSkuXG4gICAqIFBPU1QgL2FwaS92Mi9lbnRlcnByaXNlLzplSWQvc2FmZXMvOnNhZmVJZC9hcmNoaXZlXG4gICAqIEBleHBlcmltZW50YWxcbiAgICovXG4gIGFzeW5jIGFyY2hpdmVTYWZlKHNhZmVJZDogc3RyaW5nKTogUHJvbWlzZTxTYWZlPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLnVybChgLyR7c2FmZUlkfS9hcmNoaXZlYCkpXG4gICAgICAuc2VuZCgpXG4gICAgICAucmVzdWx0KCk7XG4gICAgY29uc3Qgc2FmZURhdGEgPSBkZWNvZGVXaXRoQ29kZWMoU2FmZURhdGEsIHJlc3BvbnNlLCAnU2FmZURhdGEnKTtcbiAgICByZXR1cm4gbmV3IFNhZmUodGhpcy5iaXRnbywgc2FmZURhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBoYXNlIDMg4oCUIGZpbmFsaXplIGEgc2FmZSB3aXRoIHRoZSBtaW50ZWQgcm9vdCBrZXkgaWRzIGFzIG9yZGVyZWQgW3VzZXIsIGJhY2t1cCwgYml0Z29dIHRyaXBsZXRzLlxuICAgKiBQT1NUIC9hcGkvdjIvZW50ZXJwcmlzZS86ZUlkL3NhZmVzLzpzYWZlSWQvZmluYWxpemUgeyByb290S2V5cyB9LlxuICAgKiBJZGVtcG90ZW50OiByZS1maW5hbGl6aW5nIHdpdGggdGhlIHNhbWUgYHJvb3RLZXlzYCByZXR1cm5zIHRoZSBhY3RpdmUgc2FmZSBhZ2FpbiAoMjAwKS5cbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgYXN5bmMgZmluYWxpemVTYWZlKHNhZmVJZDogc3RyaW5nLCBwYXJhbXM6IEZpbmFsaXplU2FmZU9wdGlvbnMpOiBQcm9taXNlPFNhZmU+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3RXaXRoQ29kZWMoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy51cmwoYC8ke3NhZmVJZH0vZmluYWxpemVgKSxcbiAgICAgIEZpbmFsaXplU2FmZUJvZHksXG4gICAgICBwYXJhbXNcbiAgICApLnJlc3VsdCgpO1xuICAgIGNvbnN0IHNhZmVEYXRhID0gZGVjb2RlV2l0aENvZGVjKFNhZmVEYXRhLCByZXNwb25zZSwgJ1NhZmVEYXRhJyk7XG4gICAgcmV0dXJuIG5ldyBTYWZlKHRoaXMuYml0Z28sIHNhZmVEYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2luIHVzZWQgdG8gcm91dGUgYSBnaXZlbiByb290J3Mga2V5IGNlcmVtb255IChzZWUgUk9PVF9DT0lOX0JZX05FVFdPUkspLlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICBwcml2YXRlIGNvaW5Gb3JSb290KHNsb3Q6IFJvb3RLZXlUeXBlKTogSUJhc2VDb2luIHtcbiAgICAvLyBWMU5ldHdvcmsgaXMgZXhhY3RseSAnYml0Y29pbicgfCAndGVzdG5ldCcsIHNvIHRoaXMgYnJhbmNoIGlzIGV4aGF1c3RpdmUgb3ZlciBldmVyeVxuICAgIC8vIGVudmlyb25tZW50OiAnYml0Y29pbicgaXMgbWFpbm5ldCBhbmQgZXZlcnkgb3RoZXIgdmFsdWUgaXMgYSB0ZXN0bmV0LlxuICAgIGNvbnN0IG5ldHdvcmsgPSBFbnZpcm9ubWVudHNbdGhpcy5iaXRnby5nZXRFbnYoKV0ubmV0d29yayA9PT0gJ2JpdGNvaW4nID8gJ21haW5uZXQnIDogJ3Rlc3RuZXQnO1xuICAgIHJldHVybiB0aGlzLmJpdGdvLmNvaW4oUk9PVF9DT0lOX0JZX05FVFdPUktbbmV0d29ya11bc2xvdF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBoYXNlIDIuMSBoZWxwZXIg4oCUIG1pbnQgb25lIG9uY2hhaW4tbXVsdGlzaWcgcm9vdCAoY29sZCBtb2RlbCwgYXMgd2FsbGV0IGNyZWF0aW9uIGRvZXMgdG9kYXkpOlxuICAgKiBnZW5lcmF0ZSB1c2VyL2JhY2t1cCBrZXlwYWlycyBsb2NhbGx5LCBlbmNyeXB0IHdpdGggYHBhc3NwaHJhc2VgLCByZWdpc3RlciB2aWEgUE9TVCAvOmNvaW4va2V5XG4gICAqIHdpdGggYHNhZmVJZGA7IHRoZSBCaXRHbyBrZXkgaXMgY3JlYXRlZCB0aHJvdWdoIHRoZSBzYW1lIHJvdXRlJ3MgYHNvdXJjZTonYml0Z28nYCBwYXRoLlxuICAgKiBSZXR1cm5zIHRoZSBbdXNlciwgYmFja3VwLCBiaXRnb10ga2V5IGlkIHRyaXBsZXQuXG4gICAqIEBleHBlcmltZW50YWxcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlTXVsdGlzaWdSb290KFxuICAgIHNsb3Q6ICdzZWNwMjU2azFNdWx0aXNpZycgfCAnZWQyNTUxOU11bHRpc2lnJyxcbiAgICBzYWZlSWQ6IHN0cmluZyxcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmcsXG4gICAgZW50ZXJwcmlzZTogc3RyaW5nXG4gICk6IFByb21pc2U8Um9vdEtleVRyaXBsZXQ+IHtcbiAgICBjb25zdCBrZXljaGFpbnMgPSB0aGlzLmNvaW5Gb3JSb290KHNsb3QpLmtleWNoYWlucygpO1xuXG4gICAgY29uc3QgdXNlcktleVBhaXIgPSBrZXljaGFpbnMuY3JlYXRlKCk7XG4gICAgY29uc3QgdXNlcktleWNoYWluUHJvbWlzZSA9IGtleWNoYWlucy5hZGQoe1xuICAgICAgcHViOiB1c2VyS2V5UGFpci5wdWIsXG4gICAgICBlbmNyeXB0ZWRQcnY6IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7IGlucHV0OiB1c2VyS2V5UGFpci5wcnYsIHBhc3N3b3JkOiBwYXNzcGhyYXNlIH0pLFxuICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICBzYWZlSWQsXG4gICAgfSk7XG4gICAgY29uc3QgYmFja3VwS2V5Y2hhaW5Qcm9taXNlID0ga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7IHBhc3NwaHJhc2UsIHNhZmVJZCB9KTtcbiAgICBjb25zdCBiaXRnb0tleWNoYWluUHJvbWlzZSA9IGtleWNoYWlucy5jcmVhdGVCaXRHbyh7IGVudGVycHJpc2UsIHNhZmVJZCB9KTtcblxuICAgIGNvbnN0IFt1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHVzZXJLZXljaGFpblByb21pc2UsXG4gICAgICBiYWNrdXBLZXljaGFpblByb21pc2UsXG4gICAgICBiaXRnb0tleWNoYWluUHJvbWlzZSxcbiAgICBdKTtcblxuICAgIC8vIFNsb3Qg4pGjIHJvb3RzIHVzZSBuZXV0cmFsIHJhdyBwdWJsaWMgZGVyaXZhdGlvbiBtYXRlcmlhbCAoMzItYnl0ZSBwdWJsaWMga2V5IHBsdXMgMzItYnl0ZVxuICAgIC8vIGNoYWluIGNvZGUpLCBzZXJpYWxpemVkIHRvZ2V0aGVyIGFzIGNhbm9uaWNhbCB1bnBhZGRlZCBSRkMgNDY0OCBiYXNlMzIgKDEwMyBjaGFyYWN0ZXJzKS5cbiAgICAvLyBDb2luLXNwZWNpZmljIGNoaWxkIGVuY29kaW5nIGlzIHBlcmZvcm1lZCBieSBXYWxsZXQgUGxhdGZvcm0gYWZ0ZXIgc29mdCBkZXJpdmF0aW9uLlxuICAgIGlmIChcbiAgICAgIHNsb3QgPT09ICdlZDI1NTE5TXVsdGlzaWcnICYmXG4gICAgICAoIWJhY2t1cEtleWNoYWluLnB1YiB8fFxuICAgICAgICAhaXNEZXJpdmFibGVFZDI1NTE5UHViKGJhY2t1cEtleWNoYWluLnB1YikgfHxcbiAgICAgICAgIWJpdGdvS2V5Y2hhaW4ucHViIHx8XG4gICAgICAgICFpc0Rlcml2YWJsZUVkMjU1MTlQdWIoYml0Z29LZXljaGFpbi5wdWIpKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTYWZlIGVkMjU1MTlNdWx0aXNpZyByb290cyBhcmUgbm90IGRlcml2YWJsZTogZXhwZWN0ZWQgNjQtYnl0ZSBjYW5vbmljYWwgYmFzZTMyIG1hdGVyaWFsJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFt1c2VyS2V5Y2hhaW4uaWQsIGJhY2t1cEtleWNoYWluLmlkLCBiaXRnb0tleWNoYWluLmlkXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaGFzZSAyLjIgaGVscGVyIOKAlCBydW4gb25lIE1QQyBjZXJlbW9ueSAoREtMUyBmb3IgZWNkc2FNcGMsIEVkRFNBIGZvciBlZGRzYU1wYykgdmlhIHRoZVxuICAgKiBleGlzdGluZyBgY3JlYXRlTXBjYCBmbG93IHdpdGggYHNhZmVJZGAgdGhyZWFkZWQgdGhyb3VnaCwgc28gdGhlIHJlc3VsdGluZyB1c2VyL2JhY2t1cC9iaXRnb1xuICAgKiBrZXlzIGxhbmQgdGFnZ2VkLiBSZXR1cm5zIHRoZSBbdXNlciwgYmFja3VwLCBiaXRnb10ga2V5IGlkIHRyaXBsZXQuXG4gICAqIEBleHBlcmltZW50YWxcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlTXBjUm9vdChcbiAgICBzbG90OiAnZWNkc2FNcGMnIHwgJ2VkZHNhTXBjJyxcbiAgICBzYWZlSWQ6IHN0cmluZyxcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmcsXG4gICAgZW50ZXJwcmlzZTogc3RyaW5nXG4gICk6IFByb21pc2U8Um9vdEtleVRyaXBsZXQ+IHtcbiAgICBjb25zdCB7IHVzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW4gfSA9IGF3YWl0IHRoaXMuY29pbkZvclJvb3Qoc2xvdClcbiAgICAgIC5rZXljaGFpbnMoKVxuICAgICAgLmNyZWF0ZU1wYyh7IG11bHRpc2lnVHlwZTogJ3RzcycsIHBhc3NwaHJhc2UsIGVudGVycHJpc2UsIHNhZmVJZCB9KTtcbiAgICByZXR1cm4gW3VzZXJLZXljaGFpbi5pZCwgYmFja3VwS2V5Y2hhaW4uaWQsIGJpdGdvS2V5Y2hhaW4uaWRdO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIGVudGVycHJpc2UncyBzYWZlcyB0aGUgY2FsbGVyIGlzIGEgbWVtYmVyIG9mIChjdXJzb3IgcGFnaW5hdGlvbikuXG4gICAqIEdFVCAvYXBpL3YyL2VudGVycHJpc2UvOmVJZC9zYWZlcz9saW1pdCZwcmV2SWRcbiAgICpcbiAgICogYGN1cnNvcmAgaXMgdGhlIG9wYXF1ZSBgbmV4dEN1cnNvcmAgcmV0dXJuZWQgYnkgYSBwcmV2aW91cyBjYWxsOyBwYWdlIGZvcndhcmQgdW50aWxcbiAgICogYG5leHRDdXJzb3JgIGlzIGFic2VudC5cbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgYXN5bmMgbGlzdChwYXJhbXM6IExpc3RTYWZlc09wdGlvbnMgPSB7fSk6IFByb21pc2U8eyBzYWZlczogU2FmZVtdOyBuZXh0Q3Vyc29yPzogc3RyaW5nIH0+IHtcbiAgICAvLyBTREsgZXhwb3NlcyBhbiBvcGFxdWUgY3Vyc29yOyBXUCBzcGVha3MgcHJldklkL25leHRCYXRjaFByZXZJZCAodjIgbGlzdCBjb252ZW50aW9uKS5cbiAgICBjb25zdCBxdWVyeTogeyBsaW1pdD86IG51bWJlcjsgcHJldklkPzogc3RyaW5nIH0gPSB7fTtcbiAgICBpZiAocGFyYW1zLmxpbWl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmN1cnNvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMuY3Vyc29yO1xuICAgIH1cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCkpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgICBjb25zdCB7IHNhZmVzLCBuZXh0QmF0Y2hQcmV2SWQgfSA9IGRlY29kZVdpdGhDb2RlYyhMaXN0U2FmZXNSZXNwb25zZSwgcmVzcG9uc2UsICdMaXN0U2FmZXNSZXNwb25zZScpO1xuICAgIHJldHVybiB7XG4gICAgICBzYWZlczogc2FmZXMubWFwKChzYWZlRGF0YSkgPT4gbmV3IFNhZmUodGhpcy5iaXRnbywgc2FmZURhdGEpKSxcbiAgICAgIG5leHRDdXJzb3I6IG5leHRCYXRjaFByZXZJZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgc2luZ2xlIHNhZmUgYnkgaWQuIE5vbi1tZW1iZXJzIGdldCBhIDQwNCAoZXhpc3RlbmNlIGlzIG5vdCBsZWFrZWQpLlxuICAgKiBHRVQgL2FwaS92Mi9lbnRlcnByaXNlLzplSWQvc2FmZXMvOnNhZmVJZFxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICBhc3luYyBnZXQocGFyYW1zOiBHZXRTYWZlT3B0aW9ucyk6IFByb21pc2U8U2FmZT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoYC8ke3BhcmFtcy5pZH1gKSkucmVzdWx0KCk7XG4gICAgY29uc3Qgc2FmZURhdGEgPSBkZWNvZGVXaXRoQ29kZWMoU2FmZURhdGEsIHJlc3BvbnNlLCAnU2FmZURhdGEnKTtcbiAgICByZXR1cm4gbmV3IFNhZmUodGhpcy5iaXRnbywgc2FmZURhdGEpO1xuICB9XG59XG4iXX0=
317
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYml0Z28vc2FmZS9zYWZlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7Ozs7R0FLRztBQUNILHlDQUEyQjtBQUMzQixzREFRNkI7QUFDN0IseUNBQTRDO0FBRzVDLHNDQUE2QztBQUM3Qyw0Q0FBa0Q7QUFDbEQsNkRBQWtFO0FBQ2xFLDBEQUF1RDtBQUd2RCxpQ0FBOEI7QUFFOUI7Ozs7OztHQU1HO0FBQ0gsTUFBTSxvQkFBb0IsR0FBK0Q7SUFDdkYsT0FBTyxFQUFFO1FBQ1AsaUJBQWlCO1FBQ2pCLGlCQUFpQixFQUFFLEtBQUs7UUFDeEIsZUFBZSxFQUFFLEtBQUs7UUFDdEIsWUFBWTtRQUNaLFFBQVEsRUFBRSxLQUFLO1FBQ2YsUUFBUSxFQUFFLEtBQUs7S0FDaEI7SUFDRCxPQUFPLEVBQUU7UUFDUCxpQkFBaUI7UUFDakIsaUJBQWlCLEVBQUUsTUFBTTtRQUN6QixlQUFlLEVBQUUsTUFBTTtRQUN2QixZQUFZO1FBQ1osUUFBUSxFQUFFLE9BQU87UUFDakIsUUFBUSxFQUFFLE1BQU07S0FDakI7Q0FDRixDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUM7SUFDdkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLHVCQUFRLENBQUMsRUFBRSxDQUFDO0lBQ3BDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQ3pDLENBQUMsQ0FBQztBQUVIOzs7Ozs7R0FNRztBQUNILE1BQWEsS0FBSztJQUloQixZQUFZLEtBQWdCLEVBQUUsWUFBb0I7UUFDaEQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIs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UUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxRSxNQUFNLFFBQVEsR0FBRyxJQUFBLHdCQUFlLEVBQUMsdUJBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDakUsT0FBTyxJQUFJLFdBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7Q0FDRjtBQXBRRCxzQkFvUUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICpcbiAqIEBleHBlcmltZW50YWwgVGhlIHNhZmUgY2xpZW50IHN1cmZhY2UgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIChpbmNsdWRpbmcgYnJlYWtpbmdcbiAqIGNoYW5nZXMpIGJlZm9yZSB0aGUgcHVibGljIHJlbGVhc2UuXG4gKi9cbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuaW1wb3J0IHtcbiAgRmluYWxpemVTYWZlQm9keSxcbiAgSW5pdGlhbGl6ZVNhZmVCb2R5LFxuICBJbml0aWFsaXplU2FmZVJlc3BvbnNlLFxuICBSb290S2V5c0J5VHlwZSxcbiAgUm9vdEtleVRyaXBsZXQsXG4gIFJvb3RLZXlUeXBlLFxuICBTYWZlRGF0YSxcbn0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudHMgfSBmcm9tICcuLi8uLi9jb21tb24nO1xuaW1wb3J0IHsgSUJhc2VDb2luIH0gZnJvbSAnLi4vYmFzZUNvaW4nO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnLi4vYml0Z29CYXNlJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgZGVjb2RlV2l0aENvZGVjIH0gZnJvbSAnLi4vdXRpbHMvY29kZWNzJztcbmltcG9ydCB7IGlzRGVyaXZhYmxlRWQyNTUxOVB1YiB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItc2FmZXMnO1xuaW1wb3J0IHsgcG9zdFdpdGhDb2RlYyB9IGZyb20gJy4uL3V0aWxzL3Bvc3RXaXRoQ29kZWMnO1xuaW1wb3J0IHsgRmluYWxpemVTYWZlT3B0aW9ucywgSW5pdGlhbGl6ZVNhZmVPcHRpb25zIH0gZnJvbSAnLi9pU2FmZSc7XG5pbXBvcnQgeyBDcmVhdGVTYWZlT3B0aW9ucywgR2V0U2FmZU9wdGlvbnMsIElTYWZlcywgTGlzdFNhZmVzT3B0aW9ucywgU2FmZUNyZWF0aW9uSGFuZGxlLCBTYWZlS2V5cyB9IGZyb20gJy4vaVNhZmVzJztcbmltcG9ydCB7IFNhZmUgfSBmcm9tICcuL3NhZmUnO1xuXG4vKipcbiAqIFJlcHJlc2VudGF0aXZlIGNvaW4gcGVyIHJvb3Qgc2xvdCwgYnkgbmV0d29yay4gU2FmZSByb290cyBhcmUgY3VydmUvc2NoZW1lLXNjb3BlZCwgbm90XG4gKiBjb2luLXNjb3BlZCDigJQgV1Agc3RhbXBzIGBjdXJ2ZWAgc2VydmVyLXNpZGUgZnJvbSB0aGUgY29pbidzIGtleSBjdXJ2ZSwgc28gYW55IGNvaW4gb2YgdGhlXG4gKiByaWdodCAoY3VydmUsIHNjaGVtZSkgd29ya3MuIFRoZXNlIGFyZSBzdGFibGUsIGFsd2F5cy1hdmFpbGFibGUgY2hvaWNlcyB1c2VkIG9ubHkgdG8gcm91dGVcbiAqIHRoZSBrZXktZ2VuZXJhdGlvbiBjZXJlbW9ueTsgdGhlIHJlc3VsdGluZyByb290IGlzIGludGVyY2hhbmdlYWJsZSBhY3Jvc3MgY29pbnMgb2YgdGhlIHNsb3QuXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmNvbnN0IFJPT1RfQ09JTl9CWV9ORVRXT1JLOiBSZWNvcmQ8J21haW5uZXQnIHwgJ3Rlc3RuZXQnLCBSZWNvcmQ8Um9vdEtleVR5cGUsIHN0cmluZz4+ID0ge1xuICBtYWlubmV0OiB7XG4gICAgLy8gbXVsdGlzaWcgcm9vdHNcbiAgICBzZWNwMjU2azFNdWx0aXNpZzogJ2J0YycsXG4gICAgZWQyNTUxOU11bHRpc2lnOiAneGxtJyxcbiAgICAvLyBNUEMgcm9vdHNcbiAgICBlY2RzYU1wYzogJ2V0aCcsXG4gICAgZWRkc2FNcGM6ICdzb2wnLFxuICB9LFxuICB0ZXN0bmV0OiB7XG4gICAgLy8gbXVsdGlzaWcgcm9vdHNcbiAgICBzZWNwMjU2azFNdWx0aXNpZzogJ3RidGMnLFxuICAgIGVkMjU1MTlNdWx0aXNpZzogJ3R4bG0nLFxuICAgIC8vIE1QQyByb290c1xuICAgIGVjZHNhTXBjOiAnaHRldGgnLFxuICAgIGVkZHNhTXBjOiAndHNvbCcsXG4gIH0sXG59O1xuXG4vKipcbiAqIFdpcmUgc2hhcGUgb2YgdGhlIHBhZ2luYXRlZCBgR0VUIC9lbnRlcnByaXNlLzplSWQvc2FmZXNgIHJlc3BvbnNlLiBXUCBwYWdpbmF0ZXMgd2l0aCB0aGUgdjJcbiAqIGBwcmV2SWRgL2BuZXh0QmF0Y2hQcmV2SWRgIGNvbnZlbnRpb247IHRoZSBTREsgcmUtZXhwb3NlcyBpdCBhcyBhbiBvcGFxdWUgYGN1cnNvcmAvYG5leHRDdXJzb3JgXG4gKiAoc2VlIGBsaXN0YCkuXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmNvbnN0IExpc3RTYWZlc1Jlc3BvbnNlID0gdC5pbnRlcnNlY3Rpb24oW1xuICB0LnR5cGUoeyBzYWZlczogdC5hcnJheShTYWZlRGF0YSkgfSksXG4gIHQucGFydGlhbCh7IG5leHRCYXRjaFByZXZJZDogdC5zdHJpbmcgfSksXG5dKTtcblxuLyoqXG4gKiBDb2xsZWN0aW9uIGFjY2Vzc29yIGZvciBhIHNpbmdsZSBlbnRlcnByaXNlJ3Mgc2FmZXMsIG1pcnJvcmluZyBXYWxsZXRzIC8gRW50ZXJwcmlzZXMuXG4gKiBTYWZlIHJvdXRlcyBhcmUgZW50ZXJwcmlzZS1zY29wZWQgKC9hcGkvdjIvZW50ZXJwcmlzZS86ZUlkL3NhZmVzKSwgc28gdGhlIGFjY2Vzc29yIGlzXG4gKiBjb25zdHJ1Y3RlZCB3aXRoIHRoZSBlbnRlcnByaXNlIGlkIChzZWUgRW50ZXJwcmlzZS5zYWZlcygpKS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBjbGFzcyBTYWZlcyBpbXBsZW1lbnRzIElTYWZlcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYml0Z286IEJpdEdvQmFzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBlbnRlcnByaXNlSWQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBlbnRlcnByaXNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuYml0Z28gPSBiaXRnbztcbiAgICB0aGlzLmVudGVycHJpc2VJZCA9IGVudGVycHJpc2VJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnRlcnByaXNlLXNjb3BlZCB2MiBVUkwgZm9yIHRoZSBzYWZlcyBjb2xsZWN0aW9uLCBlLmcuIC9hcGkvdjIvZW50ZXJwcmlzZS86ZUlkL3NhZmVzXG4gICAqIEBwYXJhbSBleHRyYVxuICAgKi9cbiAgcHJpdmF0ZSB1cmwoZXh0cmEgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYml0Z28udXJsKGAvZW50ZXJwcmlzZS8ke3RoaXMuZW50ZXJwcmlzZUlkfS9zYWZlcyR7ZXh0cmF9YCwgMik7XG4gIH1cblxuICAvKipcbiAgICogT25lLWNhbGwgY29udmVuaWVuY2Ugd3JhcHBlciBjaGFpbmluZyB0aGUgdGhyZWUgY3JlYXRpb24gcGhhc2VzOlxuICAgKiBpbml0aWFsaXplIChQaGFzZSAxKSDihpIgY3JlYXRlU2FmZUtleXMgKFBoYXNlIDIsIGVuYWJsZWQtc2xvdCBjZXJlbW9uaWVzKSDihpJcbiAgICogZmluYWxpemUgKFBoYXNlIDMpLiBIT1QgY3VzdG9keSBvbmx5IGluIHYxLlxuICAgKlxuICAgKiBJZiBhIGtleSBjZXJlbW9ueSBmYWlscywgYGNyZWF0ZVNhZmVLZXlzYCBhcmNoaXZlcyB0aGUgc2FmZSBiZWZvcmUgdGhyb3dpbmcsIHNvIGEgZmFpbGVkIHJ1blxuICAgKiBsZWF2ZXMgbm8gaGFsZi1jcmVhdGVkIHNhZmUgYmVoaW5kIOKAlCBjcmVhdGUgYSBuZXcgc2FmZSBhbmQgcmV0cnkuXG4gICAqIEBleHBlcmltZW50YWxcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlU2FmZShwYXJhbXM6IENyZWF0ZVNhZmVPcHRpb25zKTogUHJvbWlzZTxTYWZlPiB7XG4gICAgY29uc3Qgc2FmZSA9IGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVNhZmUoeyBsYWJlbDogcGFyYW1zLmxhYmVsIH0pO1xuICAgIGNvbnN0IHJvb3RLZXlzID0gYXdhaXQgdGhpcy5jcmVhdGVTYWZlS2V5cyh7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICBzYWZlSWQ6IHNhZmUuaWQsXG4gICAgICBlbmFibGVkUm9vdFNsb3RzOiBzYWZlLmVuYWJsZWRSb290U2xvdHMsXG4gICAgfSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluYWxpemVTYWZlKHNhZmUuaWQsIHJvb3RLZXlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaGFzZSAxIOKAlCBpbml0aWFsaXplIGEgc2FmZSAobWV0YWRhdGEgb25seSwgbm8ga2V5IG1hdGVyaWFsKS5cbiAgICogUE9TVCAvYXBpL3YyL2VudGVycHJpc2UvOmVJZC9zYWZlcyB7IGxhYmVsIH1cbiAgICogUmVzcG9uc2UgaXMgYHsgaWQsIHN0YXR1cyB9YCBwbHVzIG9wdGlvbmFsIGBlbmFibGVkUm9vdFNsb3RzYCAoYWJzZW50IG9uIG9sZGVyIFdQKS5cbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZVNhZmUocGFyYW1zOiBJbml0aWFsaXplU2FmZU9wdGlvbnMpOiBQcm9taXNlPEluaXRpYWxpemVTYWZlUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3RXaXRoQ29kZWModGhpcy5iaXRnbywgdGhpcy51cmwoKSwgSW5pdGlhbGl6ZVNhZmVCb2R5LCBwYXJhbXMpLnJlc3VsdCgpO1xuICAgIHJldHVybiBkZWNvZGVXaXRoQ29kZWMoSW5pdGlhbGl6ZVNhZmVSZXNwb25zZSwgcmVzcG9uc2UsICdJbml0aWFsaXplU2FmZVJlc3BvbnNlJyk7XG4gIH1cblxuICAvKipcbiAgICogUGhhc2UgMiDigJQgcnVuIHRoZSBlbmFibGVkIHJvb3Qga2V5IGNlcmVtb25pZXMgdGFnZ2VkIHdpdGggYHNhZmVJZGA7IHJldHVybnMgb3JkZXJlZFxuICAgKiBbdXNlciwgYmFja3VwLCBiaXRnb10gdHJpcGxldHMgZm9yIHRob3NlIHNsb3RzLiBIT1QgY3VzdG9keSBvbmx5IGluIHYxLlxuICAgKlxuICAgKiBBYnNlbnQgYGVuYWJsZWRSb290U2xvdHNgIChvbGRlciBXUCwgcHJlLWdhdGluZykgcnVucyBhbGwgNCBzbG90cy4gRW5hYmxlZCBjZXJlbW9uaWVzXG4gICAqICgyLjEgbXVsdGlzaWcg4pGg4pGjLCAyLjIgTVBDIOKRoeKRoikgcnVuIGluIHBhcmFsbGVsLiBJZiBhbnkgb2YgdGhlbSBmYWlsLCB0aGVcbiAgICogcGFydGlhbGx5LWNyZWF0ZWQgc2FmZSBpcyBhcmNoaXZlZCAoYSBsZWdhbCBgaW5pdGlhbGl6aW5nIOKGkiBhcmNoaXZlZGAgdHJhbnNpdGlvbiwgc28gdGhlXG4gICAqIG9ycGhhbmVkIHRhZ2dlZCBrZXlzIGFyZSBpbmVydCkgYW5kIGFuIGVycm9yIGxpc3RpbmcgZXZlcnkgY2VyZW1vbnkgZmFpbHVyZSBpcyB0aHJvd24g4oCUXG4gICAqIGNyZWF0ZSBhIG5ldyBzYWZlIGFuZCByZXRyeS5cbiAgICpcbiAgICogTm90IGluZGVwZW5kZW50bHkgaWRlbXBvdGVudDogcmUtcnVubmluZyBhZ2FpbnN0IGEgc2FmZSB0aGF0IGFscmVhZHkgaGFzIHNvbWUgcm9vdHMgaGl0cyBXUCdzXG4gICAqIHVuaXF1ZSByb290LXNsb3QgaW5kZXguXG4gICAqIEBleHBlcmltZW50YWxcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVNhZmVLZXlzKHBhcmFtczogQ3JlYXRlU2FmZU9wdGlvbnMgJiBTYWZlQ3JlYXRpb25IYW5kbGUpOiBQcm9taXNlPFNhZmVLZXlzPiB7XG4gICAgY29uc3QgeyBzYWZlSWQsIHBhc3NwaHJhc2UsIGVuYWJsZWRSb290U2xvdHMgfSA9IHBhcmFtcztcbiAgICBjb25zdCBlbnRlcnByaXNlID0gdGhpcy5lbnRlcnByaXNlSWQ7XG5cbiAgICAvLyBBYnNlbnQgYGVuYWJsZWRSb290U2xvdHNgIChvbGRlciBXUCwgcHJlLWdhdGluZykg4oeSIGFsbCA0LCBwcmVzZXJ2aW5nIGN1cnJlbnQgYmVoYXZpb3IuXG4gICAgLy8gT3JkZXJlZCBieSBzY2hlbWU6IHRoZSB0d28gbXVsdGlzaWcgcm9vdHMgZmlyc3QsIHRoZW4gdGhlIHR3byBNUEMgcm9vdHMuXG4gICAgY29uc3QgYWxsU2xvdHM6IFJvb3RLZXlUeXBlW10gPSBbJ3NlY3AyNTZrMU11bHRpc2lnJywgJ2VkMjU1MTlNdWx0aXNpZycsICdlY2RzYU1wYycsICdlZGRzYU1wYyddO1xuICAgIGNvbnN0IGVuYWJsZWQgPSBuZXcgU2V0KGVuYWJsZWRSb290U2xvdHMgPz8gYWxsU2xvdHMpO1xuICAgIGNvbnN0IHNsb3RzID0gYWxsU2xvdHMuZmlsdGVyKChzbG90KSA9PiBlbmFibGVkLmhhcyhzbG90KSk7XG4gICAgY29uc3QgY2VyZW1vbmllczogUmVjb3JkPFJvb3RLZXlUeXBlLCAoKSA9PiBQcm9taXNlPFJvb3RLZXlUcmlwbGV0Pj4gPSB7XG4gICAgICAvLyBQaGFzZSAyLjEg4oCUIG11bHRpc2lnIHJvb3RzICjikaDikaMpOiBsb2NhbCB1c2VyL2JhY2t1cCBrZXlwYWlycyArIEJpdEdvIGtleSwgYWxsIHNhZmVJZC10YWdnZWQuXG4gICAgICBzZWNwMjU2azFNdWx0aXNpZzogKCkgPT4gdGhpcy5jcmVhdGVNdWx0aXNpZ1Jvb3QoJ3NlY3AyNTZrMU11bHRpc2lnJywgc2FmZUlkLCBwYXNzcGhyYXNlLCBlbnRlcnByaXNlKSxcbiAgICAgIGVkMjU1MTlNdWx0aXNpZzogKCkgPT4gdGhpcy5jcmVhdGVNdWx0aXNpZ1Jvb3QoJ2VkMjU1MTlNdWx0aXNpZycsIHNhZmVJZCwgcGFzc3BocmFzZSwgZW50ZXJwcmlzZSksXG4gICAgICAvLyBQaGFzZSAyLjIg4oCUIE1QQyByb290cyAo4pGh4pGiKTogdGhlIGV4aXN0aW5nIERLTFMgKOKRoSkgYW5kIEVkRFNBICjikaIpIGNlcmVtb25pZXMsIHNhZmVJZCB0aHJlYWRlZC5cbiAgICAgIGVjZHNhTXBjOiAoKSA9PiB0aGlzLmNyZWF0ZU1wY1Jvb3QoJ2VjZHNhTXBjJywgc2FmZUlkLCBwYXNzcGhyYXNlLCBlbnRlcnByaXNlKSxcbiAgICAgIGVkZHNhTXBjOiAoKSA9PiB0aGlzLmNyZWF0ZU1wY1Jvb3QoJ2VkZHNhTXBjJywgc2FmZUlkLCBwYXNzcGhyYXNlLCBlbnRlcnByaXNlKSxcbiAgICB9O1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoc2xvdHMubWFwKChzbG90KSA9PiBjZXJlbW9uaWVzW3Nsb3RdKCkpKTtcblxuICAgIC8vIFNpbmdsZSBwYXNzIG92ZXIgdGhlIHNldHRsZWQgcmVzdWx0czogYHN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCdgIG5hcnJvd3MgYC52YWx1ZWAgdG8gYVxuICAgIC8vIFJvb3RLZXlUcmlwbGV0LCBhbmQgcmVqZWN0aW9ucyBhcmUgY29sbGVjdGVkIHBlci1zbG90IGZvciB0aGUgZXJyb3IgYmVsb3cuXG4gICAgY29uc3QgaG90OiBSb290S2V5c0J5VHlwZSA9IHt9O1xuICAgIGNvbnN0IGZhaWx1cmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0LCBpKSA9PiB7XG4gICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcpIHtcbiAgICAgICAgaG90W3Nsb3RzW2ldXSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlYXNvbiA9IHJlc3VsdC5yZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHJlc3VsdC5yZWFzb24ubWVzc2FnZSA6IFN0cmluZyhyZXN1bHQucmVhc29uKTtcbiAgICAgICAgLy8gQXBpUmVzcG9uc2VFcnJvciBjYXJyaWVzIHRoZSBzZXJ2ZXItZWNob2VkIGBSZXF1ZXN0LUlEYCBoZWFkZXIg4oCUIGluY2x1ZGUgaXQgKHdoZW5cbiAgICAgICAgLy8gcHJlc2VudCkgc28gYSBmYWlsZWQgY2VyZW1vbnkgY2FuIGJlIGNvcnJlbGF0ZWQgd2l0aCBXUCdzIHNlcnZlci1zaWRlIGxvZ3MuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IHJlc3VsdC5yZWFzb24gaW5zdGFuY2VvZiBBcGlSZXNwb25zZUVycm9yID8gcmVzdWx0LnJlYXNvbi5yZXF1ZXN0SWQgOiB1bmRlZmluZWQ7XG4gICAgICAgIGZhaWx1cmVzLnB1c2goYCR7c2xvdHNbaV19OiAke3JlYXNvbn0ke3JlcXVlc3RJZCA/IGAgKHJlcXVlc3RJZDogJHtyZXF1ZXN0SWR9KWAgOiAnJ31gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChmYWlsdXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBCZXN0LWVmZm9ydCBhYmFuZG9uIHRoZSBwYXJ0aWFsbHktY3JlYXRlZCBzYWZlIHNvIGEgcmV0cnkgc3RhcnRzIGZyb20gYSBjbGVhbiBzbGF0ZS4gS2VlcFxuICAgICAgLy8gdGhlIGNlcmVtb255IGZhaWx1cmVzIGFzIHRoZSBwcmltYXJ5IGVycm9yOyBub3RlIGl0IGlmIHRoZSBjbGVhbnVwIGFyY2hpdmUgYWxzbyBmYWlsZWQuXG4gICAgICBsZXQgYXJjaGl2ZUVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXJjaGl2ZVNhZmUoc2FmZUlkKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgYXJjaGl2ZUVycm9yID0gZSBpbnN0YW5jZW9mIEVycm9yID8gZSA6IG5ldyBFcnJvcihTdHJpbmcoZSkpO1xuICAgICAgfVxuICAgICAgbGV0IG1lc3NhZ2UgPVxuICAgICAgICBgU2FmZSBrZXkgZ2VuZXJhdGlvbiBmYWlsZWQgZm9yICR7ZmFpbHVyZXMubGVuZ3RofSByb290IGNlcmVtb255L2llcyBgICtcbiAgICAgICAgYFske2ZhaWx1cmVzLmpvaW4oJzsgJyl9XS4gVGhlIHNhZmUgKCR7c2FmZUlkfSkgaGFzIGJlZW4gYXJjaGl2ZWQ7IGNyZWF0ZSBhIG5ldyBzYWZlIGFuZCByZXRyeS5gO1xuICAgICAgaWYgKGFyY2hpdmVFcnJvcikge1xuICAgICAgICBtZXNzYWdlICs9IGAgTk9URTogYXJjaGl2aW5nIHRoZSBzYWZlIGFsc28gZmFpbGVkICgke2FyY2hpdmVFcnJvci5tZXNzYWdlfSk7IGFyY2hpdmUgaXQgbWFudWFsbHkgYmVmb3JlIHJldHJ5aW5nLmA7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcm9vdEtleXM6IHsgaG90IH0gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcmNoaXZlIGEgc2FmZS4gQWxzbyB0aGUgYWJhbmRvbm1lbnQgcGF0aCBmb3IgYSBzdHVjayBgaW5pdGlhbGl6aW5nYCBzYWZlICh1c2VkIGJ5XG4gICAqIGBjcmVhdGVTYWZlS2V5c2AgdG8gY2xlYW4gdXAgYWZ0ZXIgYSBmYWlsZWQgY2VyZW1vbnkpLlxuICAgKiBQT1NUIC9hcGkvdjIvZW50ZXJwcmlzZS86ZUlkL3NhZmVzLzpzYWZlSWQvYXJjaGl2ZVxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICBhc3luYyBhcmNoaXZlU2FmZShzYWZlSWQ6IHN0cmluZyk6IFByb21pc2U8U2FmZT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy51cmwoYC8ke3NhZmVJZH0vYXJjaGl2ZWApKVxuICAgICAgLnNlbmQoKVxuICAgICAgLnJlc3VsdCgpO1xuICAgIGNvbnN0IHNhZmVEYXRhID0gZGVjb2RlV2l0aENvZGVjKFNhZmVEYXRhLCByZXNwb25zZSwgJ1NhZmVEYXRhJyk7XG4gICAgcmV0dXJuIG5ldyBTYWZlKHRoaXMuYml0Z28sIHNhZmVEYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaGFzZSAzIOKAlCBmaW5hbGl6ZSBhIHNhZmUgd2l0aCB0aGUgbWludGVkIHJvb3Qga2V5IGlkcyBhcyBvcmRlcmVkIFt1c2VyLCBiYWNrdXAsIGJpdGdvXSB0cmlwbGV0cy5cbiAgICogUE9TVCAvYXBpL3YyL2VudGVycHJpc2UvOmVJZC9zYWZlcy86c2FmZUlkL2ZpbmFsaXplIHsgcm9vdEtleXMgfS5cbiAgICogSWRlbXBvdGVudDogcmUtZmluYWxpemluZyB3aXRoIHRoZSBzYW1lIGByb290S2V5c2AgcmV0dXJucyB0aGUgYWN0aXZlIHNhZmUgYWdhaW4gKDIwMCkuXG4gICAqIEBleHBlcmltZW50YWxcbiAgICovXG4gIGFzeW5jIGZpbmFsaXplU2FmZShzYWZlSWQ6IHN0cmluZywgcGFyYW1zOiBGaW5hbGl6ZVNhZmVPcHRpb25zKTogUHJvbWlzZTxTYWZlPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwb3N0V2l0aENvZGVjKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMudXJsKGAvJHtzYWZlSWR9L2ZpbmFsaXplYCksXG4gICAgICBGaW5hbGl6ZVNhZmVCb2R5LFxuICAgICAgcGFyYW1zXG4gICAgKS5yZXN1bHQoKTtcbiAgICBjb25zdCBzYWZlRGF0YSA9IGRlY29kZVdpdGhDb2RlYyhTYWZlRGF0YSwgcmVzcG9uc2UsICdTYWZlRGF0YScpO1xuICAgIHJldHVybiBuZXcgU2FmZSh0aGlzLmJpdGdvLCBzYWZlRGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogQ29pbiB1c2VkIHRvIHJvdXRlIGEgZ2l2ZW4gcm9vdCdzIGtleSBjZXJlbW9ueSAoc2VlIFJPT1RfQ09JTl9CWV9ORVRXT1JLKS5cbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgcHJpdmF0ZSBjb2luRm9yUm9vdChzbG90OiBSb290S2V5VHlwZSk6IElCYXNlQ29pbiB7XG4gICAgLy8gVjFOZXR3b3JrIGlzIGV4YWN0bHkgJ2JpdGNvaW4nIHwgJ3Rlc3RuZXQnLCBzbyB0aGlzIGJyYW5jaCBpcyBleGhhdXN0aXZlIG92ZXIgZXZlcnlcbiAgICAvLyBlbnZpcm9ubWVudDogJ2JpdGNvaW4nIGlzIG1haW5uZXQgYW5kIGV2ZXJ5IG90aGVyIHZhbHVlIGlzIGEgdGVzdG5ldC5cbiAgICBjb25zdCBuZXR3b3JrID0gRW52aXJvbm1lbnRzW3RoaXMuYml0Z28uZ2V0RW52KCldLm5ldHdvcmsgPT09ICdiaXRjb2luJyA/ICdtYWlubmV0JyA6ICd0ZXN0bmV0JztcbiAgICByZXR1cm4gdGhpcy5iaXRnby5jb2luKFJPT1RfQ09JTl9CWV9ORVRXT1JLW25ldHdvcmtdW3Nsb3RdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaGFzZSAyLjEgaGVscGVyIOKAlCBtaW50IG9uZSBvbmNoYWluLW11bHRpc2lnIHJvb3QgKGNvbGQgbW9kZWwsIGFzIHdhbGxldCBjcmVhdGlvbiBkb2VzIHRvZGF5KTpcbiAgICogZ2VuZXJhdGUgdXNlci9iYWNrdXAga2V5cGFpcnMgbG9jYWxseSwgZW5jcnlwdCB3aXRoIGBwYXNzcGhyYXNlYCwgcmVnaXN0ZXIgdmlhIFBPU1QgLzpjb2luL2tleVxuICAgKiB3aXRoIGBzYWZlSWRgOyB0aGUgQml0R28ga2V5IGlzIGNyZWF0ZWQgdGhyb3VnaCB0aGUgc2FtZSByb3V0ZSdzIGBzb3VyY2U6J2JpdGdvJ2AgcGF0aC5cbiAgICogUmV0dXJucyB0aGUgW3VzZXIsIGJhY2t1cCwgYml0Z29dIGtleSBpZCB0cmlwbGV0LlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNyZWF0ZU11bHRpc2lnUm9vdChcbiAgICBzbG90OiAnc2VjcDI1NmsxTXVsdGlzaWcnIHwgJ2VkMjU1MTlNdWx0aXNpZycsXG4gICAgc2FmZUlkOiBzdHJpbmcsXG4gICAgcGFzc3BocmFzZTogc3RyaW5nLFxuICAgIGVudGVycHJpc2U6IHN0cmluZ1xuICApOiBQcm9taXNlPFJvb3RLZXlUcmlwbGV0PiB7XG4gICAgY29uc3Qga2V5Y2hhaW5zID0gdGhpcy5jb2luRm9yUm9vdChzbG90KS5rZXljaGFpbnMoKTtcblxuICAgIGNvbnN0IHVzZXJLZXlQYWlyID0ga2V5Y2hhaW5zLmNyZWF0ZSgpO1xuICAgIGNvbnN0IHVzZXJLZXljaGFpblByb21pc2UgPSBrZXljaGFpbnMuYWRkKHtcbiAgICAgIHB1YjogdXNlcktleVBhaXIucHViLFxuICAgICAgZW5jcnlwdGVkUHJ2OiBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoeyBpbnB1dDogdXNlcktleVBhaXIucHJ2LCBwYXNzd29yZDogcGFzc3BocmFzZSB9KSxcbiAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAgc2FmZUlkLFxuICAgIH0pO1xuICAgIGNvbnN0IGJhY2t1cEtleWNoYWluUHJvbWlzZSA9IGtleWNoYWlucy5jcmVhdGVCYWNrdXAoeyBwYXNzcGhyYXNlLCBzYWZlSWQgfSk7XG4gICAgY29uc3QgYml0Z29LZXljaGFpblByb21pc2UgPSBrZXljaGFpbnMuY3JlYXRlQml0R28oeyBlbnRlcnByaXNlLCBzYWZlSWQgfSk7XG5cbiAgICBjb25zdCBbdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbl0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB1c2VyS2V5Y2hhaW5Qcm9taXNlLFxuICAgICAgYmFja3VwS2V5Y2hhaW5Qcm9taXNlLFxuICAgICAgYml0Z29LZXljaGFpblByb21pc2UsXG4gICAgXSk7XG5cbiAgICAvLyBTbG90IOKRoyByb290cyB1c2UgbmV1dHJhbCByYXcgcHVibGljIGRlcml2YXRpb24gbWF0ZXJpYWwgKDMyLWJ5dGUgcHVibGljIGtleSBwbHVzIDMyLWJ5dGVcbiAgICAvLyBjaGFpbiBjb2RlKSwgc2VyaWFsaXplZCB0b2dldGhlciBhcyBjYW5vbmljYWwgdW5wYWRkZWQgUkZDIDQ2NDggYmFzZTMyICgxMDMgY2hhcmFjdGVycykuXG4gICAgLy8gQ29pbi1zcGVjaWZpYyBjaGlsZCBlbmNvZGluZyBpcyBwZXJmb3JtZWQgYnkgV2FsbGV0IFBsYXRmb3JtIGFmdGVyIHNvZnQgZGVyaXZhdGlvbi5cbiAgICBpZiAoXG4gICAgICBzbG90ID09PSAnZWQyNTUxOU11bHRpc2lnJyAmJlxuICAgICAgKCFiYWNrdXBLZXljaGFpbi5wdWIgfHxcbiAgICAgICAgIWlzRGVyaXZhYmxlRWQyNTUxOVB1YihiYWNrdXBLZXljaGFpbi5wdWIpIHx8XG4gICAgICAgICFiaXRnb0tleWNoYWluLnB1YiB8fFxuICAgICAgICAhaXNEZXJpdmFibGVFZDI1NTE5UHViKGJpdGdvS2V5Y2hhaW4ucHViKSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2FmZSBlZDI1NTE5TXVsdGlzaWcgcm9vdHMgYXJlIG5vdCBkZXJpdmFibGU6IGV4cGVjdGVkIDY0LWJ5dGUgY2Fub25pY2FsIGJhc2UzMiBtYXRlcmlhbCcpO1xuICAgIH1cblxuICAgIHJldHVybiBbdXNlcktleWNoYWluLmlkLCBiYWNrdXBLZXljaGFpbi5pZCwgYml0Z29LZXljaGFpbi5pZF07XG4gIH1cblxuICAvKipcbiAgICogUGhhc2UgMi4yIGhlbHBlciDigJQgcnVuIG9uZSBNUEMgY2VyZW1vbnkgKERLTFMgZm9yIGVjZHNhTXBjLCBFZERTQSBmb3IgZWRkc2FNcGMpIHZpYSB0aGVcbiAgICogZXhpc3RpbmcgYGNyZWF0ZU1wY2AgZmxvdyB3aXRoIGBzYWZlSWRgIHRocmVhZGVkIHRocm91Z2gsIHNvIHRoZSByZXN1bHRpbmcgdXNlci9iYWNrdXAvYml0Z29cbiAgICoga2V5cyBsYW5kIHRhZ2dlZC4gUmV0dXJucyB0aGUgW3VzZXIsIGJhY2t1cCwgYml0Z29dIGtleSBpZCB0cmlwbGV0LlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNyZWF0ZU1wY1Jvb3QoXG4gICAgc2xvdDogJ2VjZHNhTXBjJyB8ICdlZGRzYU1wYycsXG4gICAgc2FmZUlkOiBzdHJpbmcsXG4gICAgcGFzc3BocmFzZTogc3RyaW5nLFxuICAgIGVudGVycHJpc2U6IHN0cmluZ1xuICApOiBQcm9taXNlPFJvb3RLZXlUcmlwbGV0PiB7XG4gICAgY29uc3QgeyB1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluIH0gPSBhd2FpdCB0aGlzLmNvaW5Gb3JSb290KHNsb3QpXG4gICAgICAua2V5Y2hhaW5zKClcbiAgICAgIC5jcmVhdGVNcGMoeyBtdWx0aXNpZ1R5cGU6ICd0c3MnLCBwYXNzcGhyYXNlLCBlbnRlcnByaXNlLCBzYWZlSWQgfSk7XG4gICAgcmV0dXJuIFt1c2VyS2V5Y2hhaW4uaWQsIGJhY2t1cEtleWNoYWluLmlkLCBiaXRnb0tleWNoYWluLmlkXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSBlbnRlcnByaXNlJ3Mgc2FmZXMgdGhlIGNhbGxlciBpcyBhIG1lbWJlciBvZiAoY3Vyc29yIHBhZ2luYXRpb24pLlxuICAgKiBHRVQgL2FwaS92Mi9lbnRlcnByaXNlLzplSWQvc2FmZXM/bGltaXQmcHJldklkXG4gICAqXG4gICAqIGBjdXJzb3JgIGlzIHRoZSBvcGFxdWUgYG5leHRDdXJzb3JgIHJldHVybmVkIGJ5IGEgcHJldmlvdXMgY2FsbDsgcGFnZSBmb3J3YXJkIHVudGlsXG4gICAqIGBuZXh0Q3Vyc29yYCBpcyBhYnNlbnQuXG4gICAqIEBleHBlcmltZW50YWxcbiAgICovXG4gIGFzeW5jIGxpc3QocGFyYW1zOiBMaXN0U2FmZXNPcHRpb25zID0ge30pOiBQcm9taXNlPHsgc2FmZXM6IFNhZmVbXTsgbmV4dEN1cnNvcj86IHN0cmluZyB9PiB7XG4gICAgLy8gU0RLIGV4cG9zZXMgYW4gb3BhcXVlIGN1cnNvcjsgV1Agc3BlYWtzIHByZXZJZC9uZXh0QmF0Y2hQcmV2SWQgKHYyIGxpc3QgY29udmVudGlvbikuXG4gICAgY29uc3QgcXVlcnk6IHsgbGltaXQ/OiBudW1iZXI7IHByZXZJZD86IHN0cmluZyB9ID0ge307XG4gICAgaWYgKHBhcmFtcy5saW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBxdWVyeS5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5jdXJzb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLmN1cnNvcjtcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgpKS5xdWVyeShxdWVyeSkucmVzdWx0KCk7XG4gICAgY29uc3QgeyBzYWZlcywgbmV4dEJhdGNoUHJldklkIH0gPSBkZWNvZGVXaXRoQ29kZWMoTGlzdFNhZmVzUmVzcG9uc2UsIHJlc3BvbnNlLCAnTGlzdFNhZmVzUmVzcG9uc2UnKTtcbiAgICByZXR1cm4ge1xuICAgICAgc2FmZXM6IHNhZmVzLm1hcCgoc2FmZURhdGEpID0+IG5ldyBTYWZlKHRoaXMuYml0Z28sIHNhZmVEYXRhKSksXG4gICAgICBuZXh0Q3Vyc29yOiBuZXh0QmF0Y2hQcmV2SWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhIHNpbmdsZSBzYWZlIGJ5IGlkLiBOb24tbWVtYmVycyBnZXQgYSA0MDQgKGV4aXN0ZW5jZSBpcyBub3QgbGVha2VkKS5cbiAgICogR0VUIC9hcGkvdjIvZW50ZXJwcmlzZS86ZUlkL3NhZmVzLzpzYWZlSWRcbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgYXN5bmMgZ2V0KHBhcmFtczogR2V0U2FmZU9wdGlvbnMpOiBQcm9taXNlPFNhZmU+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKGAvJHtwYXJhbXMuaWR9YCkpLnJlc3VsdCgpO1xuICAgIGNvbnN0IHNhZmVEYXRhID0gZGVjb2RlV2l0aENvZGVjKFNhZmVEYXRhLCByZXNwb25zZSwgJ1NhZmVEYXRhJyk7XG4gICAgcmV0dXJuIG5ldyBTYWZlKHRoaXMuYml0Z28sIHNhZmVEYXRhKTtcbiAgfVxufVxuIl19