@bitgo/sdk-core 37.3.0 → 37.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/account-lib/baseCoin/enum.d.ts +3 -1
- package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/enum.js +6 -2
- package/dist/src/api/types.d.ts +10 -0
- package/dist/src/api/types.d.ts.map +1 -1
- package/dist/src/api/types.js +1 -1
- package/dist/src/bitgo/bitgoBase.d.ts +1 -0
- package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
- package/dist/src/bitgo/bitgoBase.js +1 -1
- package/dist/src/bitgo/internal/keycard.d.ts +18 -6
- package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
- package/dist/src/bitgo/internal/keycard.js +97 -38
- package/dist/src/bitgo/keychain/iKeychains.d.ts +6 -1
- package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/iKeychains.js +1 -1
- package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/keychains.js +2 -1
- package/dist/src/bitgo/recovery/initiate.d.ts +16 -0
- package/dist/src/bitgo/recovery/initiate.d.ts.map +1 -1
- package/dist/src/bitgo/recovery/initiate.js +75 -33
- package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/mpcUtils.js +8 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +8 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +53 -15
- package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts +21 -0
- package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.js +118 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +13 -1
- package/dist/src/bitgo/utils/tss/eddsa/index.d.ts +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/index.js +2 -1
- package/dist/src/bitgo/wallet/BuildParams.d.ts +3 -0
- package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/BuildParams.js +4 -1
- package/dist/src/bitgo/wallet/iWallet.d.ts +22 -0
- package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallet.js +1 -1
- package/dist/src/bitgo/wallet/wallet.d.ts +10 -0
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +108 -34
- package/dist/test/unit/bitgo/recovery/initiate.d.ts +2 -0
- package/dist/test/unit/bitgo/recovery/initiate.d.ts.map +1 -0
- package/dist/test/unit/bitgo/recovery/initiate.js +230 -0
- package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.js +4 -1
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +13 -5
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +50 -1
- package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.js +311 -0
- package/dist/test/unit/bitgo/wallet/BuildParams.js +30 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initiate.d.ts","sourceRoot":"","sources":["../../../../../test/unit/bitgo/recovery/initiate.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
require("should");
|
|
37
|
+
const sinon = __importStar(require("sinon"));
|
|
38
|
+
const sjcl = __importStar(require("@bitgo/sjcl"));
|
|
39
|
+
const initiate_1 = require("../../../../src/bitgo/recovery/initiate");
|
|
40
|
+
// A deterministic xprv used across all tests.
|
|
41
|
+
const TEST_XPRV = 'xprv9s21ZrQH143K2fJ91S4BRsupcYrE6mmY96fcX5HkhoTrrwmwjd16Cn87cWinJjByrfpojjx7ezsJLx7TAKLT8m8hM5Kax9YcoxnBeJZ3t2k';
|
|
42
|
+
const TEST_XPUB = 'xpub661MyMwAqRbcF9Nc7TbBo1rZAagiWEVPWKbDKThNG8zqjk76HAKLkaSbTn6dK2dQPfuD7xjicxCZVWvj67fP5nQ9W7QURmoMVAX8m6jZsGp';
|
|
43
|
+
/**
|
|
44
|
+
* Encrypt plaintext with SJCL (same algorithm as BitGoAPI.encrypt).
|
|
45
|
+
*/
|
|
46
|
+
function sjclEncrypt(password, input) {
|
|
47
|
+
return sjcl.encrypt(password, input);
|
|
48
|
+
}
|
|
49
|
+
function makeMockBitGo(decryptImpl) {
|
|
50
|
+
return {
|
|
51
|
+
decrypt: sinon.stub().callsFake(decryptImpl),
|
|
52
|
+
decryptAsync: sinon.stub().callsFake(async (params) => decryptImpl(params)),
|
|
53
|
+
encrypt: sinon.stub(),
|
|
54
|
+
encryptAsync: sinon.stub(),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
describe('validateKey', () => {
|
|
58
|
+
afterEach(() => {
|
|
59
|
+
sinon.restore();
|
|
60
|
+
});
|
|
61
|
+
it('returns a BIP32 node directly when key starts with xprv (bypasses decrypt)', () => {
|
|
62
|
+
const bitgo = makeMockBitGo(() => {
|
|
63
|
+
throw new Error('should not be called');
|
|
64
|
+
});
|
|
65
|
+
const node = (0, initiate_1.validateKey)(bitgo, {
|
|
66
|
+
key: TEST_XPRV,
|
|
67
|
+
source: 'user',
|
|
68
|
+
passphrase: 'secret',
|
|
69
|
+
isUnsignedSweep: false,
|
|
70
|
+
isKrsRecovery: false,
|
|
71
|
+
});
|
|
72
|
+
node.toBase58().should.equal(TEST_XPRV);
|
|
73
|
+
bitgo.decrypt.callCount.should.equal(0);
|
|
74
|
+
});
|
|
75
|
+
it('calls decrypt and returns BIP32 node when key is encrypted (not xprv)', () => {
|
|
76
|
+
const passphrase = 'hunter2';
|
|
77
|
+
const encryptedKey = sjclEncrypt(passphrase, TEST_XPRV);
|
|
78
|
+
const bitgo = makeMockBitGo(({ password, input }) => {
|
|
79
|
+
if (input === encryptedKey && password === passphrase)
|
|
80
|
+
return TEST_XPRV;
|
|
81
|
+
throw new Error('unexpected decrypt call');
|
|
82
|
+
});
|
|
83
|
+
const node = (0, initiate_1.validateKey)(bitgo, {
|
|
84
|
+
key: encryptedKey,
|
|
85
|
+
source: 'user',
|
|
86
|
+
passphrase,
|
|
87
|
+
isUnsignedSweep: false,
|
|
88
|
+
isKrsRecovery: false,
|
|
89
|
+
});
|
|
90
|
+
node.toBase58().should.equal(TEST_XPRV);
|
|
91
|
+
bitgo.decrypt.callCount.should.equal(1);
|
|
92
|
+
});
|
|
93
|
+
it('throws with friendly message when decrypt fails (wrong passphrase)', () => {
|
|
94
|
+
const bitgo = makeMockBitGo(() => {
|
|
95
|
+
throw new Error('sjcl: ccm: tag does not match');
|
|
96
|
+
});
|
|
97
|
+
(() => (0, initiate_1.validateKey)(bitgo, {
|
|
98
|
+
key: 'notAnXprv',
|
|
99
|
+
source: 'user',
|
|
100
|
+
passphrase: 'wrong',
|
|
101
|
+
isUnsignedSweep: false,
|
|
102
|
+
isKrsRecovery: false,
|
|
103
|
+
})).should.throw('Failed to decrypt user key with passcode - try again!');
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
describe('validateKeyAsync', () => {
|
|
107
|
+
afterEach(() => {
|
|
108
|
+
sinon.restore();
|
|
109
|
+
});
|
|
110
|
+
it('returns a BIP32 node directly when key starts with xprv (bypasses decryptAsync)', async () => {
|
|
111
|
+
const bitgo = makeMockBitGo(() => {
|
|
112
|
+
throw new Error('should not be called');
|
|
113
|
+
});
|
|
114
|
+
const node = await (0, initiate_1.validateKeyAsync)(bitgo, {
|
|
115
|
+
key: TEST_XPRV,
|
|
116
|
+
source: 'user',
|
|
117
|
+
passphrase: 'secret',
|
|
118
|
+
isUnsignedSweep: false,
|
|
119
|
+
isKrsRecovery: false,
|
|
120
|
+
});
|
|
121
|
+
node.toBase58().should.equal(TEST_XPRV);
|
|
122
|
+
bitgo.decryptAsync.callCount.should.equal(0);
|
|
123
|
+
});
|
|
124
|
+
it('calls decryptAsync and returns BIP32 node when key is encrypted (not xprv)', async () => {
|
|
125
|
+
const passphrase = 'hunter2';
|
|
126
|
+
const encryptedKey = sjclEncrypt(passphrase, TEST_XPRV);
|
|
127
|
+
const bitgo = makeMockBitGo(({ password, input }) => {
|
|
128
|
+
if (input === encryptedKey && password === passphrase)
|
|
129
|
+
return TEST_XPRV;
|
|
130
|
+
throw new Error('unexpected decrypt call');
|
|
131
|
+
});
|
|
132
|
+
const node = await (0, initiate_1.validateKeyAsync)(bitgo, {
|
|
133
|
+
key: encryptedKey,
|
|
134
|
+
source: 'user',
|
|
135
|
+
passphrase,
|
|
136
|
+
isUnsignedSweep: false,
|
|
137
|
+
isKrsRecovery: false,
|
|
138
|
+
});
|
|
139
|
+
node.toBase58().should.equal(TEST_XPRV);
|
|
140
|
+
bitgo.decryptAsync.callCount.should.equal(1);
|
|
141
|
+
});
|
|
142
|
+
it('rejects with friendly message when decryptAsync fails (wrong passphrase)', async () => {
|
|
143
|
+
const bitgo = makeMockBitGo(() => {
|
|
144
|
+
throw new Error('sjcl: ccm: tag does not match');
|
|
145
|
+
});
|
|
146
|
+
await (0, initiate_1.validateKeyAsync)(bitgo, {
|
|
147
|
+
key: 'notAnXprv',
|
|
148
|
+
source: 'user',
|
|
149
|
+
passphrase: 'wrong',
|
|
150
|
+
isUnsignedSweep: false,
|
|
151
|
+
isKrsRecovery: false,
|
|
152
|
+
}).should.be.rejectedWith('Failed to decrypt user key with passcode - try again!');
|
|
153
|
+
});
|
|
154
|
+
it('skips decryptAsync for unsigned sweep (isUnsignedSweep = true)', async () => {
|
|
155
|
+
const bitgo = makeMockBitGo(() => {
|
|
156
|
+
throw new Error('should not be called');
|
|
157
|
+
});
|
|
158
|
+
const node = await (0, initiate_1.validateKeyAsync)(bitgo, {
|
|
159
|
+
key: TEST_XPUB,
|
|
160
|
+
source: 'user',
|
|
161
|
+
passphrase: 'secret',
|
|
162
|
+
isUnsignedSweep: true,
|
|
163
|
+
isKrsRecovery: false,
|
|
164
|
+
});
|
|
165
|
+
node.neutered().toBase58().should.equal(TEST_XPUB);
|
|
166
|
+
bitgo.decryptAsync.callCount.should.equal(0);
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
describe('getBip32Keys', () => {
|
|
170
|
+
afterEach(() => {
|
|
171
|
+
sinon.restore();
|
|
172
|
+
});
|
|
173
|
+
it('returns [userKey, backupKey] when both are provided as xprv', () => {
|
|
174
|
+
const bitgo = makeMockBitGo(() => {
|
|
175
|
+
throw new Error('should not be called');
|
|
176
|
+
});
|
|
177
|
+
const keys = (0, initiate_1.getBip32Keys)(bitgo, { userKey: TEST_XPRV, backupKey: TEST_XPRV, recoveryDestination: 'addr' }, { requireBitGoXpub: false });
|
|
178
|
+
keys.should.have.length(2);
|
|
179
|
+
keys[0].toBase58().should.equal(TEST_XPRV);
|
|
180
|
+
keys[1].toBase58().should.equal(TEST_XPRV);
|
|
181
|
+
});
|
|
182
|
+
it('throws when requireBitGoXpub is true but bitgoKey is missing', () => {
|
|
183
|
+
const bitgo = makeMockBitGo(() => {
|
|
184
|
+
throw new Error('should not be called');
|
|
185
|
+
});
|
|
186
|
+
(() => (0, initiate_1.getBip32Keys)(bitgo, { userKey: TEST_XPRV, backupKey: TEST_XPRV, recoveryDestination: 'addr' }, { requireBitGoXpub: true })).should.throw('BitGo xpub required but not provided');
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
describe('getBip32KeysAsync', () => {
|
|
190
|
+
afterEach(() => {
|
|
191
|
+
sinon.restore();
|
|
192
|
+
});
|
|
193
|
+
it('returns [userKey, backupKey] when both are provided as xprv', async () => {
|
|
194
|
+
const bitgo = makeMockBitGo(() => {
|
|
195
|
+
throw new Error('should not be called');
|
|
196
|
+
});
|
|
197
|
+
const keys = await (0, initiate_1.getBip32KeysAsync)(bitgo, { userKey: TEST_XPRV, backupKey: TEST_XPRV, recoveryDestination: 'addr' }, { requireBitGoXpub: false });
|
|
198
|
+
keys.should.have.length(2);
|
|
199
|
+
keys[0].toBase58().should.equal(TEST_XPRV);
|
|
200
|
+
keys[1].toBase58().should.equal(TEST_XPRV);
|
|
201
|
+
});
|
|
202
|
+
it('returns three keys when requireBitGoXpub is true and bitgoKey is valid', async () => {
|
|
203
|
+
const bitgo = makeMockBitGo(() => {
|
|
204
|
+
throw new Error('should not be called');
|
|
205
|
+
});
|
|
206
|
+
const keys = await (0, initiate_1.getBip32KeysAsync)(bitgo, { userKey: TEST_XPRV, backupKey: TEST_XPRV, bitgoKey: TEST_XPUB, recoveryDestination: 'addr' }, { requireBitGoXpub: true });
|
|
207
|
+
keys.should.have.length(3);
|
|
208
|
+
keys[2].neutered().toBase58().should.equal(TEST_XPUB);
|
|
209
|
+
});
|
|
210
|
+
it('calls decryptAsync for encrypted user key', async () => {
|
|
211
|
+
const passphrase = 'pass1';
|
|
212
|
+
const encryptedUserKey = sjclEncrypt(passphrase, TEST_XPRV);
|
|
213
|
+
const bitgo = makeMockBitGo(({ password, input }) => {
|
|
214
|
+
if (input === encryptedUserKey && password === passphrase)
|
|
215
|
+
return TEST_XPRV;
|
|
216
|
+
throw new Error('unexpected decrypt call');
|
|
217
|
+
});
|
|
218
|
+
const keys = await (0, initiate_1.getBip32KeysAsync)(bitgo, { userKey: encryptedUserKey, backupKey: TEST_XPRV, walletPassphrase: passphrase, recoveryDestination: 'addr' }, { requireBitGoXpub: false });
|
|
219
|
+
keys.should.have.length(2);
|
|
220
|
+
keys[0].toBase58().should.equal(TEST_XPRV);
|
|
221
|
+
bitgo.decryptAsync.callCount.should.equal(1);
|
|
222
|
+
});
|
|
223
|
+
it('rejects when requireBitGoXpub is true but bitgoKey is missing', async () => {
|
|
224
|
+
const bitgo = makeMockBitGo(() => {
|
|
225
|
+
throw new Error('should not be called');
|
|
226
|
+
});
|
|
227
|
+
await (0, initiate_1.getBip32KeysAsync)(bitgo, { userKey: TEST_XPRV, backupKey: TEST_XPRV, recoveryDestination: 'addr' }, { requireBitGoXpub: true }).should.be.rejectedWith('BitGo xpub required but not provided');
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdGlhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvYml0Z28vcmVjb3ZlcnkvaW5pdGlhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrQkFBZ0I7QUFDaEIsNkNBQStCO0FBQy9CLGtEQUFvQztBQUNwQyxzRUFLaUQ7QUFHakQsOENBQThDO0FBQzlDLE1BQU0sU0FBUyxHQUNiLGlIQUFpSCxDQUFDO0FBQ3BILE1BQU0sU0FBUyxHQUNiLGlIQUFpSCxDQUFDO0FBRXBIOztHQUVHO0FBQ0gsU0FBUyxXQUFXLENBQUMsUUFBZ0IsRUFBRSxLQUFhO0lBQ2xELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFzQixDQUFDO0FBQzVELENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxXQUFxRTtJQUMxRixPQUFPO1FBQ0wsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQzVDLFlBQVksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUE0QyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakgsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUU7UUFDckIsWUFBWSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUU7S0FDSCxDQUFDO0FBQzVCLENBQUM7QUFFRCxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtJQUMzQixTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDRFQUE0RSxFQUFFLEdBQUcsRUFBRTtRQUNwRixNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLElBQUEsc0JBQVcsRUFBQyxLQUFLLEVBQUU7WUFDOUIsR0FBRyxFQUFFLFNBQVM7WUFDZCxNQUFNLEVBQUUsTUFBTTtZQUNkLFVBQVUsRUFBRSxRQUFRO1lBQ3BCLGVBQWUsRUFBRSxLQUFLO1lBQ3RCLGFBQWEsRUFBRSxLQUFLO1NBQ3JCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZDLEtBQUssQ0FBQyxPQUEyQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHVFQUF1RSxFQUFFLEdBQUcsRUFBRTtRQUMvRSxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDN0IsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN4RCxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2xELElBQUksS0FBSyxLQUFLLFlBQVksSUFBSSxRQUFRLEtBQUssVUFBVTtnQkFBRSxPQUFPLFNBQVMsQ0FBQztZQUN4RSxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxJQUFBLHNCQUFXLEVBQUMsS0FBSyxFQUFFO1lBQzlCLEdBQUcsRUFBRSxZQUFZO1lBQ2pCLE1BQU0sRUFBRSxNQUFNO1lBQ2QsVUFBVTtZQUNWLGVBQWUsRUFBRSxLQUFLO1lBQ3RCLGFBQWEsRUFBRSxLQUFLO1NBQ3JCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZDLEtBQUssQ0FBQyxPQUEyQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG9FQUFvRSxFQUFFLEdBQUcsRUFBRTtRQUM1RSxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztRQUNILENBQUMsR0FBRyxFQUFFLENBQ0osSUFBQSxzQkFBVyxFQUFDLEtBQUssRUFBRTtZQUNqQixHQUFHLEVBQUUsV0FBVztZQUNoQixNQUFNLEVBQUUsTUFBTTtZQUNkLFVBQVUsRUFBRSxPQUFPO1lBQ25CLGVBQWUsRUFBRSxLQUFLO1lBQ3RCLGFBQWEsRUFBRSxLQUFLO1NBQ3JCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztJQUM5RSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRTtJQUNoQyxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGlGQUFpRixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQy9GLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxHQUFHLEVBQUU7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFBLDJCQUFnQixFQUFDLEtBQUssRUFBRTtZQUN6QyxHQUFHLEVBQUUsU0FBUztZQUNkLE1BQU0sRUFBRSxNQUFNO1lBQ2QsVUFBVSxFQUFFLFFBQVE7WUFDcEIsZUFBZSxFQUFFLEtBQUs7WUFDdEIsYUFBYSxFQUFFLEtBQUs7U0FDckIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkMsS0FBSyxDQUFDLFlBQWdDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNEVBQTRFLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDMUYsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQzdCLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDeEQsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNsRCxJQUFJLEtBQUssS0FBSyxZQUFZLElBQUksUUFBUSxLQUFLLFVBQVU7Z0JBQUUsT0FBTyxTQUFTLENBQUM7WUFDeEUsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFBLDJCQUFnQixFQUFDLEtBQUssRUFBRTtZQUN6QyxHQUFHLEVBQUUsWUFBWTtZQUNqQixNQUFNLEVBQUUsTUFBTTtZQUNkLFVBQVU7WUFDVixlQUFlLEVBQUUsS0FBSztZQUN0QixhQUFhLEVBQUUsS0FBSztTQUNyQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2QyxLQUFLLENBQUMsWUFBZ0MsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywwRUFBMEUsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN4RixNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBQSwyQkFBZ0IsRUFBQyxLQUFLLEVBQUU7WUFDNUIsR0FBRyxFQUFFLFdBQVc7WUFDaEIsTUFBTSxFQUFFLE1BQU07WUFDZCxVQUFVLEVBQUUsT0FBTztZQUNuQixlQUFlLEVBQUUsS0FBSztZQUN0QixhQUFhLEVBQUUsS0FBSztTQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsdURBQXVELENBQUMsQ0FBQztJQUNyRixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxnRUFBZ0UsRUFBRSxLQUFLLElBQUksRUFBRTtRQUM5RSxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBQSwyQkFBZ0IsRUFBQyxLQUFLLEVBQUU7WUFDekMsR0FBRyxFQUFFLFNBQVM7WUFDZCxNQUFNLEVBQUUsTUFBTTtZQUNkLFVBQVUsRUFBRSxRQUFRO1lBQ3BCLGVBQWUsRUFBRSxJQUFJO1lBQ3JCLGFBQWEsRUFBRSxLQUFLO1NBQ3JCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xELEtBQUssQ0FBQyxZQUFnQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUM7QUFFSCxRQUFRLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTtJQUM1QixTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDZEQUE2RCxFQUFFLEdBQUcsRUFBRTtRQUNyRSxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLElBQUEsdUJBQVksRUFDdkIsS0FBSyxFQUNMLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxFQUN6RSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxDQUM1QixDQUFDO1FBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDhEQUE4RCxFQUFFLEdBQUcsRUFBRTtRQUN0RSxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNILENBQUMsR0FBRyxFQUFFLENBQ0osSUFBQSx1QkFBWSxFQUNWLEtBQUssRUFDTCxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLEVBQUUsRUFDekUsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsQ0FDM0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUM1RCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUNqQyxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDZEQUE2RCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzNFLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxHQUFHLEVBQUU7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFBLDRCQUFpQixFQUNsQyxLQUFLLEVBQ0wsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLEVBQ3pFLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLENBQzVCLENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDN0MsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsd0VBQXdFLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDdEYsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEdBQUcsRUFBRTtZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUEsNEJBQWlCLEVBQ2xDLEtBQUssRUFDTCxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxFQUM5RixFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxDQUMzQixDQUFDO1FBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDJDQUEyQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3pELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQztRQUMzQixNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDNUQsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNsRCxJQUFJLEtBQUssS0FBSyxnQkFBZ0IsSUFBSSxRQUFRLEtBQUssVUFBVTtnQkFBRSxPQUFPLFNBQVMsQ0FBQztZQUM1RSxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUEsNEJBQWlCLEVBQ2xDLEtBQUssRUFDTCxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLEVBQUUsRUFDOUcsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsQ0FDNUIsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQyxLQUFLLENBQUMsWUFBZ0MsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywrREFBK0QsRUFBRSxLQUFLLElBQUksRUFBRTtRQUM3RSxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBQSw0QkFBaUIsRUFDckIsS0FBSyxFQUNMLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxFQUN6RSxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxDQUMzQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFDbkUsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnc2hvdWxkJztcbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCAqIGFzIHNqY2wgZnJvbSAnQGJpdGdvL3NqY2wnO1xuaW1wb3J0IHtcbiAgdmFsaWRhdGVLZXksXG4gIHZhbGlkYXRlS2V5QXN5bmMsXG4gIGdldEJpcDMyS2V5cyxcbiAgZ2V0QmlwMzJLZXlzQXN5bmMsXG59IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby9yZWNvdmVyeS9pbml0aWF0ZSc7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvYml0Z28vYml0Z29CYXNlJztcblxuLy8gQSBkZXRlcm1pbmlzdGljIHhwcnYgdXNlZCBhY3Jvc3MgYWxsIHRlc3RzLlxuY29uc3QgVEVTVF9YUFJWID1cbiAgJ3hwcnY5czIxWnJRSDE0M0syZko5MVM0QlJzdXBjWXJFNm1tWTk2ZmNYNUhraG9UcnJ3bXdqZDE2Q244N2NXaW5KakJ5cmZwb2pqeDdlenNKTHg3VEFLTFQ4bThoTTVLYXg5WWNveG5CZUpaM3Qyayc7XG5jb25zdCBURVNUX1hQVUIgPVxuICAneHB1YjY2MU15TXdBcVJiY0Y5TmM3VGJCbzFyWkFhZ2lXRVZQV0tiREtUaE5HOHpxams3NkhBS0xrYVNiVG42ZEsyZFFQZnVEN3hqaWN4Q1pWV3ZqNjdmUDVuUTlXN1FVUm1vTVZBWDhtNmpac0dwJztcblxuLyoqXG4gKiBFbmNyeXB0IHBsYWludGV4dCB3aXRoIFNKQ0wgKHNhbWUgYWxnb3JpdGhtIGFzIEJpdEdvQVBJLmVuY3J5cHQpLlxuICovXG5mdW5jdGlvbiBzamNsRW5jcnlwdChwYXNzd29yZDogc3RyaW5nLCBpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNqY2wuZW5jcnlwdChwYXNzd29yZCwgaW5wdXQpIGFzIHVua25vd24gYXMgc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBtYWtlTW9ja0JpdEdvKGRlY3J5cHRJbXBsOiAocGFyYW1zOiB7IHBhc3N3b3JkPzogc3RyaW5nOyBpbnB1dDogc3RyaW5nIH0pID0+IHN0cmluZyk6IEJpdEdvQmFzZSB7XG4gIHJldHVybiB7XG4gICAgZGVjcnlwdDogc2lub24uc3R1YigpLmNhbGxzRmFrZShkZWNyeXB0SW1wbCksXG4gICAgZGVjcnlwdEFzeW5jOiBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKGFzeW5jIChwYXJhbXM6IHsgcGFzc3dvcmQ/OiBzdHJpbmc7IGlucHV0OiBzdHJpbmcgfSkgPT4gZGVjcnlwdEltcGwocGFyYW1zKSksXG4gICAgZW5jcnlwdDogc2lub24uc3R1YigpLFxuICAgIGVuY3J5cHRBc3luYzogc2lub24uc3R1YigpLFxuICB9IGFzIHVua25vd24gYXMgQml0R29CYXNlO1xufVxuXG5kZXNjcmliZSgndmFsaWRhdGVLZXknLCAoKSA9PiB7XG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgc2lub24ucmVzdG9yZSgpO1xuICB9KTtcblxuICBpdCgncmV0dXJucyBhIEJJUDMyIG5vZGUgZGlyZWN0bHkgd2hlbiBrZXkgc3RhcnRzIHdpdGggeHBydiAoYnlwYXNzZXMgZGVjcnlwdCknLCAoKSA9PiB7XG4gICAgY29uc3QgYml0Z28gPSBtYWtlTW9ja0JpdEdvKCgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hvdWxkIG5vdCBiZSBjYWxsZWQnKTtcbiAgICB9KTtcbiAgICBjb25zdCBub2RlID0gdmFsaWRhdGVLZXkoYml0Z28sIHtcbiAgICAgIGtleTogVEVTVF9YUFJWLFxuICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICBwYXNzcGhyYXNlOiAnc2VjcmV0JyxcbiAgICAgIGlzVW5zaWduZWRTd2VlcDogZmFsc2UsXG4gICAgICBpc0tyc1JlY292ZXJ5OiBmYWxzZSxcbiAgICB9KTtcbiAgICBub2RlLnRvQmFzZTU4KCkuc2hvdWxkLmVxdWFsKFRFU1RfWFBSVik7XG4gICAgKGJpdGdvLmRlY3J5cHQgYXMgc2lub24uU2lub25TdHViKS5jYWxsQ291bnQuc2hvdWxkLmVxdWFsKDApO1xuICB9KTtcblxuICBpdCgnY2FsbHMgZGVjcnlwdCBhbmQgcmV0dXJucyBCSVAzMiBub2RlIHdoZW4ga2V5IGlzIGVuY3J5cHRlZCAobm90IHhwcnYpJywgKCkgPT4ge1xuICAgIGNvbnN0IHBhc3NwaHJhc2UgPSAnaHVudGVyMic7XG4gICAgY29uc3QgZW5jcnlwdGVkS2V5ID0gc2pjbEVuY3J5cHQocGFzc3BocmFzZSwgVEVTVF9YUFJWKTtcbiAgICBjb25zdCBiaXRnbyA9IG1ha2VNb2NrQml0R28oKHsgcGFzc3dvcmQsIGlucHV0IH0pID0+IHtcbiAgICAgIGlmIChpbnB1dCA9PT0gZW5jcnlwdGVkS2V5ICYmIHBhc3N3b3JkID09PSBwYXNzcGhyYXNlKSByZXR1cm4gVEVTVF9YUFJWO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmV4cGVjdGVkIGRlY3J5cHQgY2FsbCcpO1xuICAgIH0pO1xuICAgIGNvbnN0IG5vZGUgPSB2YWxpZGF0ZUtleShiaXRnbywge1xuICAgICAga2V5OiBlbmNyeXB0ZWRLZXksXG4gICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBpc1Vuc2lnbmVkU3dlZXA6IGZhbHNlLFxuICAgICAgaXNLcnNSZWNvdmVyeTogZmFsc2UsXG4gICAgfSk7XG4gICAgbm9kZS50b0Jhc2U1OCgpLnNob3VsZC5lcXVhbChURVNUX1hQUlYpO1xuICAgIChiaXRnby5kZWNyeXB0IGFzIHNpbm9uLlNpbm9uU3R1YikuY2FsbENvdW50LnNob3VsZC5lcXVhbCgxKTtcbiAgfSk7XG5cbiAgaXQoJ3Rocm93cyB3aXRoIGZyaWVuZGx5IG1lc3NhZ2Ugd2hlbiBkZWNyeXB0IGZhaWxzICh3cm9uZyBwYXNzcGhyYXNlKScsICgpID0+IHtcbiAgICBjb25zdCBiaXRnbyA9IG1ha2VNb2NrQml0R28oKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzamNsOiBjY206IHRhZyBkb2VzIG5vdCBtYXRjaCcpO1xuICAgIH0pO1xuICAgICgoKSA9PlxuICAgICAgdmFsaWRhdGVLZXkoYml0Z28sIHtcbiAgICAgICAga2V5OiAnbm90QW5YcHJ2JyxcbiAgICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICAgIHBhc3NwaHJhc2U6ICd3cm9uZycsXG4gICAgICAgIGlzVW5zaWduZWRTd2VlcDogZmFsc2UsXG4gICAgICAgIGlzS3JzUmVjb3Zlcnk6IGZhbHNlLFxuICAgICAgfSkpLnNob3VsZC50aHJvdygnRmFpbGVkIHRvIGRlY3J5cHQgdXNlciBrZXkgd2l0aCBwYXNzY29kZSAtIHRyeSBhZ2FpbiEnKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ3ZhbGlkYXRlS2V5QXN5bmMnLCAoKSA9PiB7XG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgc2lub24ucmVzdG9yZSgpO1xuICB9KTtcblxuICBpdCgncmV0dXJucyBhIEJJUDMyIG5vZGUgZGlyZWN0bHkgd2hlbiBrZXkgc3RhcnRzIHdpdGggeHBydiAoYnlwYXNzZXMgZGVjcnlwdEFzeW5jKScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBiaXRnbyA9IG1ha2VNb2NrQml0R28oKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaG91bGQgbm90IGJlIGNhbGxlZCcpO1xuICAgIH0pO1xuICAgIGNvbnN0IG5vZGUgPSBhd2FpdCB2YWxpZGF0ZUtleUFzeW5jKGJpdGdvLCB7XG4gICAgICBrZXk6IFRFU1RfWFBSVixcbiAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAgcGFzc3BocmFzZTogJ3NlY3JldCcsXG4gICAgICBpc1Vuc2lnbmVkU3dlZXA6IGZhbHNlLFxuICAgICAgaXNLcnNSZWNvdmVyeTogZmFsc2UsXG4gICAgfSk7XG4gICAgbm9kZS50b0Jhc2U1OCgpLnNob3VsZC5lcXVhbChURVNUX1hQUlYpO1xuICAgIChiaXRnby5kZWNyeXB0QXN5bmMgYXMgc2lub24uU2lub25TdHViKS5jYWxsQ291bnQuc2hvdWxkLmVxdWFsKDApO1xuICB9KTtcblxuICBpdCgnY2FsbHMgZGVjcnlwdEFzeW5jIGFuZCByZXR1cm5zIEJJUDMyIG5vZGUgd2hlbiBrZXkgaXMgZW5jcnlwdGVkIChub3QgeHBydiknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGFzc3BocmFzZSA9ICdodW50ZXIyJztcbiAgICBjb25zdCBlbmNyeXB0ZWRLZXkgPSBzamNsRW5jcnlwdChwYXNzcGhyYXNlLCBURVNUX1hQUlYpO1xuICAgIGNvbnN0IGJpdGdvID0gbWFrZU1vY2tCaXRHbygoeyBwYXNzd29yZCwgaW5wdXQgfSkgPT4ge1xuICAgICAgaWYgKGlucHV0ID09PSBlbmNyeXB0ZWRLZXkgJiYgcGFzc3dvcmQgPT09IHBhc3NwaHJhc2UpIHJldHVybiBURVNUX1hQUlY7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuZXhwZWN0ZWQgZGVjcnlwdCBjYWxsJyk7XG4gICAgfSk7XG4gICAgY29uc3Qgbm9kZSA9IGF3YWl0IHZhbGlkYXRlS2V5QXN5bmMoYml0Z28sIHtcbiAgICAgIGtleTogZW5jcnlwdGVkS2V5LFxuICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgaXNVbnNpZ25lZFN3ZWVwOiBmYWxzZSxcbiAgICAgIGlzS3JzUmVjb3Zlcnk6IGZhbHNlLFxuICAgIH0pO1xuICAgIG5vZGUudG9CYXNlNTgoKS5zaG91bGQuZXF1YWwoVEVTVF9YUFJWKTtcbiAgICAoYml0Z28uZGVjcnlwdEFzeW5jIGFzIHNpbm9uLlNpbm9uU3R1YikuY2FsbENvdW50LnNob3VsZC5lcXVhbCgxKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgd2l0aCBmcmllbmRseSBtZXNzYWdlIHdoZW4gZGVjcnlwdEFzeW5jIGZhaWxzICh3cm9uZyBwYXNzcGhyYXNlKScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBiaXRnbyA9IG1ha2VNb2NrQml0R28oKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzamNsOiBjY206IHRhZyBkb2VzIG5vdCBtYXRjaCcpO1xuICAgIH0pO1xuICAgIGF3YWl0IHZhbGlkYXRlS2V5QXN5bmMoYml0Z28sIHtcbiAgICAgIGtleTogJ25vdEFuWHBydicsXG4gICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgIHBhc3NwaHJhc2U6ICd3cm9uZycsXG4gICAgICBpc1Vuc2lnbmVkU3dlZXA6IGZhbHNlLFxuICAgICAgaXNLcnNSZWNvdmVyeTogZmFsc2UsXG4gICAgfSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnRmFpbGVkIHRvIGRlY3J5cHQgdXNlciBrZXkgd2l0aCBwYXNzY29kZSAtIHRyeSBhZ2FpbiEnKTtcbiAgfSk7XG5cbiAgaXQoJ3NraXBzIGRlY3J5cHRBc3luYyBmb3IgdW5zaWduZWQgc3dlZXAgKGlzVW5zaWduZWRTd2VlcCA9IHRydWUpJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJpdGdvID0gbWFrZU1vY2tCaXRHbygoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nob3VsZCBub3QgYmUgY2FsbGVkJyk7XG4gICAgfSk7XG4gICAgY29uc3Qgbm9kZSA9IGF3YWl0IHZhbGlkYXRlS2V5QXN5bmMoYml0Z28sIHtcbiAgICAgIGtleTogVEVTVF9YUFVCLFxuICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICBwYXNzcGhyYXNlOiAnc2VjcmV0JyxcbiAgICAgIGlzVW5zaWduZWRTd2VlcDogdHJ1ZSxcbiAgICAgIGlzS3JzUmVjb3Zlcnk6IGZhbHNlLFxuICAgIH0pO1xuICAgIG5vZGUubmV1dGVyZWQoKS50b0Jhc2U1OCgpLnNob3VsZC5lcXVhbChURVNUX1hQVUIpO1xuICAgIChiaXRnby5kZWNyeXB0QXN5bmMgYXMgc2lub24uU2lub25TdHViKS5jYWxsQ291bnQuc2hvdWxkLmVxdWFsKDApO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnZ2V0QmlwMzJLZXlzJywgKCkgPT4ge1xuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ3JldHVybnMgW3VzZXJLZXksIGJhY2t1cEtleV0gd2hlbiBib3RoIGFyZSBwcm92aWRlZCBhcyB4cHJ2JywgKCkgPT4ge1xuICAgIGNvbnN0IGJpdGdvID0gbWFrZU1vY2tCaXRHbygoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nob3VsZCBub3QgYmUgY2FsbGVkJyk7XG4gICAgfSk7XG4gICAgY29uc3Qga2V5cyA9IGdldEJpcDMyS2V5cyhcbiAgICAgIGJpdGdvLFxuICAgICAgeyB1c2VyS2V5OiBURVNUX1hQUlYsIGJhY2t1cEtleTogVEVTVF9YUFJWLCByZWNvdmVyeURlc3RpbmF0aW9uOiAnYWRkcicgfSxcbiAgICAgIHsgcmVxdWlyZUJpdEdvWHB1YjogZmFsc2UgfVxuICAgICk7XG4gICAga2V5cy5zaG91bGQuaGF2ZS5sZW5ndGgoMik7XG4gICAga2V5c1swXS50b0Jhc2U1OCgpLnNob3VsZC5lcXVhbChURVNUX1hQUlYpO1xuICAgIGtleXNbMV0udG9CYXNlNTgoKS5zaG91bGQuZXF1YWwoVEVTVF9YUFJWKTtcbiAgfSk7XG5cbiAgaXQoJ3Rocm93cyB3aGVuIHJlcXVpcmVCaXRHb1hwdWIgaXMgdHJ1ZSBidXQgYml0Z29LZXkgaXMgbWlzc2luZycsICgpID0+IHtcbiAgICBjb25zdCBiaXRnbyA9IG1ha2VNb2NrQml0R28oKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaG91bGQgbm90IGJlIGNhbGxlZCcpO1xuICAgIH0pO1xuICAgICgoKSA9PlxuICAgICAgZ2V0QmlwMzJLZXlzKFxuICAgICAgICBiaXRnbyxcbiAgICAgICAgeyB1c2VyS2V5OiBURVNUX1hQUlYsIGJhY2t1cEtleTogVEVTVF9YUFJWLCByZWNvdmVyeURlc3RpbmF0aW9uOiAnYWRkcicgfSxcbiAgICAgICAgeyByZXF1aXJlQml0R29YcHViOiB0cnVlIH1cbiAgICAgICkpLnNob3VsZC50aHJvdygnQml0R28geHB1YiByZXF1aXJlZCBidXQgbm90IHByb3ZpZGVkJyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdnZXRCaXAzMktleXNBc3luYycsICgpID0+IHtcbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KCdyZXR1cm5zIFt1c2VyS2V5LCBiYWNrdXBLZXldIHdoZW4gYm90aCBhcmUgcHJvdmlkZWQgYXMgeHBydicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBiaXRnbyA9IG1ha2VNb2NrQml0R28oKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaG91bGQgbm90IGJlIGNhbGxlZCcpO1xuICAgIH0pO1xuICAgIGNvbnN0IGtleXMgPSBhd2FpdCBnZXRCaXAzMktleXNBc3luYyhcbiAgICAgIGJpdGdvLFxuICAgICAgeyB1c2VyS2V5OiBURVNUX1hQUlYsIGJhY2t1cEtleTogVEVTVF9YUFJWLCByZWNvdmVyeURlc3RpbmF0aW9uOiAnYWRkcicgfSxcbiAgICAgIHsgcmVxdWlyZUJpdEdvWHB1YjogZmFsc2UgfVxuICAgICk7XG4gICAga2V5cy5zaG91bGQuaGF2ZS5sZW5ndGgoMik7XG4gICAga2V5c1swXS50b0Jhc2U1OCgpLnNob3VsZC5lcXVhbChURVNUX1hQUlYpO1xuICAgIGtleXNbMV0udG9CYXNlNTgoKS5zaG91bGQuZXF1YWwoVEVTVF9YUFJWKTtcbiAgfSk7XG5cbiAgaXQoJ3JldHVybnMgdGhyZWUga2V5cyB3aGVuIHJlcXVpcmVCaXRHb1hwdWIgaXMgdHJ1ZSBhbmQgYml0Z29LZXkgaXMgdmFsaWQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYml0Z28gPSBtYWtlTW9ja0JpdEdvKCgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hvdWxkIG5vdCBiZSBjYWxsZWQnKTtcbiAgICB9KTtcbiAgICBjb25zdCBrZXlzID0gYXdhaXQgZ2V0QmlwMzJLZXlzQXN5bmMoXG4gICAgICBiaXRnbyxcbiAgICAgIHsgdXNlcktleTogVEVTVF9YUFJWLCBiYWNrdXBLZXk6IFRFU1RfWFBSViwgYml0Z29LZXk6IFRFU1RfWFBVQiwgcmVjb3ZlcnlEZXN0aW5hdGlvbjogJ2FkZHInIH0sXG4gICAgICB7IHJlcXVpcmVCaXRHb1hwdWI6IHRydWUgfVxuICAgICk7XG4gICAga2V5cy5zaG91bGQuaGF2ZS5sZW5ndGgoMyk7XG4gICAga2V5c1syXS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkuc2hvdWxkLmVxdWFsKFRFU1RfWFBVQik7XG4gIH0pO1xuXG4gIGl0KCdjYWxscyBkZWNyeXB0QXN5bmMgZm9yIGVuY3J5cHRlZCB1c2VyIGtleScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXNzcGhyYXNlID0gJ3Bhc3MxJztcbiAgICBjb25zdCBlbmNyeXB0ZWRVc2VyS2V5ID0gc2pjbEVuY3J5cHQocGFzc3BocmFzZSwgVEVTVF9YUFJWKTtcbiAgICBjb25zdCBiaXRnbyA9IG1ha2VNb2NrQml0R28oKHsgcGFzc3dvcmQsIGlucHV0IH0pID0+IHtcbiAgICAgIGlmIChpbnB1dCA9PT0gZW5jcnlwdGVkVXNlcktleSAmJiBwYXNzd29yZCA9PT0gcGFzc3BocmFzZSkgcmV0dXJuIFRFU1RfWFBSVjtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5leHBlY3RlZCBkZWNyeXB0IGNhbGwnKTtcbiAgICB9KTtcbiAgICBjb25zdCBrZXlzID0gYXdhaXQgZ2V0QmlwMzJLZXlzQXN5bmMoXG4gICAgICBiaXRnbyxcbiAgICAgIHsgdXNlcktleTogZW5jcnlwdGVkVXNlcktleSwgYmFja3VwS2V5OiBURVNUX1hQUlYsIHdhbGxldFBhc3NwaHJhc2U6IHBhc3NwaHJhc2UsIHJlY292ZXJ5RGVzdGluYXRpb246ICdhZGRyJyB9LFxuICAgICAgeyByZXF1aXJlQml0R29YcHViOiBmYWxzZSB9XG4gICAgKTtcbiAgICBrZXlzLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICBrZXlzWzBdLnRvQmFzZTU4KCkuc2hvdWxkLmVxdWFsKFRFU1RfWFBSVik7XG4gICAgKGJpdGdvLmRlY3J5cHRBc3luYyBhcyBzaW5vbi5TaW5vblN0dWIpLmNhbGxDb3VudC5zaG91bGQuZXF1YWwoMSk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIHdoZW4gcmVxdWlyZUJpdEdvWHB1YiBpcyB0cnVlIGJ1dCBiaXRnb0tleSBpcyBtaXNzaW5nJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJpdGdvID0gbWFrZU1vY2tCaXRHbygoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nob3VsZCBub3QgYmUgY2FsbGVkJyk7XG4gICAgfSk7XG4gICAgYXdhaXQgZ2V0QmlwMzJLZXlzQXN5bmMoXG4gICAgICBiaXRnbyxcbiAgICAgIHsgdXNlcktleTogVEVTVF9YUFJWLCBiYWNrdXBLZXk6IFRFU1RfWFBSViwgcmVjb3ZlcnlEZXN0aW5hdGlvbjogJ2FkZHInIH0sXG4gICAgICB7IHJlcXVpcmVCaXRHb1hwdWI6IHRydWUgfVxuICAgICkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnQml0R28geHB1YiByZXF1aXJlZCBidXQgbm90IHByb3ZpZGVkJyk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -91,6 +91,9 @@ describe('Base TSS Utils', function () {
|
|
|
91
91
|
mockBg.encrypt = sinon
|
|
92
92
|
.stub()
|
|
93
93
|
.callsFake((params) => encryptWithSjcl(params.password ?? '', params.input, params.adata));
|
|
94
|
+
mockBg.encryptAsync = sinon
|
|
95
|
+
.stub()
|
|
96
|
+
.callsFake(async (params) => encryptWithSjcl(params.password ?? '', params.input, params.adata));
|
|
94
97
|
mockBg.decrypt = sinon.stub().callsFake((params) => sjcl.decrypt(params.password ?? '', params.input));
|
|
95
98
|
mockBg.decryptAsync = decryptAsyncStub;
|
|
96
99
|
mockBitgo = mockBg;
|
|
@@ -302,4 +305,4 @@ function bytesToWord(bytes) {
|
|
|
302
305
|
}
|
|
303
306
|
return bytes.reduce((num, byte) => num * 0x100 + byte, 0);
|
|
304
307
|
}
|
|
305
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZVRTU1V0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3V0aWxzL3Rzcy9iYXNlVFNTVXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsbUNBQTJDO0FBQzNDLG9EQUFzQztBQUN0QyxpREFBbUM7QUFDbkMsNkNBQStCO0FBQy9CLGtEQUFvQztBQUNwQyxvREFBK0M7QUFFL0MsNENBQXNGO0FBQ3RGLG1HQUEyRTtBQVkzRSxNQUFNLGdCQUFpQixTQUFRLHNCQUFvQjtJQUNqRCxzQ0FBc0MsQ0FDcEMsU0FBb0IsRUFDcEIsMEJBQW1DO1FBRW5DLE9BQU8sSUFBSSxDQUFDLCtCQUErQixDQUFDLFNBQVMsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxLQUFhLEVBQUUsVUFBa0IsRUFBRSxvQkFBNEI7UUFDbEYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELDZCQUE2QixDQUMzQixpQkFBeUIsRUFDekIsc0JBQThCLEVBQzlCLGdCQUF3QixFQUN4QixLQUFhLEVBQ2IseUJBQWlDO1FBRWpDLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUNoQyxpQkFBaUIsRUFDakIsc0JBQXNCLEVBQ3RCLGdCQUFnQixFQUNoQixLQUFLLEVBQ0wseUJBQXlCLENBQzFCLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFFRCxRQUFRLENBQUMsZ0JBQWdCLEVBQUU7SUFDekIsTUFBTSxnQkFBZ0IsR0FBRyxlQUFlLENBQUM7SUFDekMsTUFBTSxnQ0FBZ0MsR0FBRyw4QkFBOEIsQ0FBQztJQUN4RSxNQUFNLHVCQUF1QixHQUFHLDhCQUE4QixDQUFDO0lBRS9ELElBQUksWUFBOEIsQ0FBQztJQUNuQyxJQUFJLGVBQWdDLENBQUM7SUFDckMsSUFBSSxTQUFvQixDQUFDO0lBQ3pCLElBQUksZ0JBQWlDLENBQUM7SUFDdEMsSUFBSSxlQUFnQyxDQUFDO0lBQ3JDLElBQUksY0FBK0IsQ0FBQztJQUNwQyxJQUFJLFNBQWlCLENBQUM7SUFFdEIsTUFBTSxDQUFDLEtBQUs7UUFDVixPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3hDLGVBQWUsR0FBRyxNQUFNLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDMUMsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JELEtBQUssRUFBRSxTQUFTO1lBQ2hCLE1BQU0sRUFBRSxTQUFTO1NBQ2xCLENBQUMsQ0FBQztRQUNILGNBQWMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDekMsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsQ0FBQztZQUNuRCxLQUFLLEVBQUUsU0FBUztZQUNoQixNQUFNLEVBQUUsU0FBUztTQUNsQixDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsTUFBTSx1QkFBUyxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDaEUsU0FBUyxHQUFHLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMzQyxDQUFDLENBQUMsQ0FBQztJQUVILFVBQVUsQ0FBQztRQUNULGdCQUFnQixHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBNEMsRUFBRSxFQUFFO1FBQ2hHLGdFQUFnRTtRQUNoRSxPQUFPLENBQUMsT0FBTyxDQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUEyQixDQUFDLFNBQVMsQ0FBQyxDQUN4RSxDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsRUFBZSxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QyxNQUFNLENBQUMsT0FBTyxHQUFHLEtBQUs7YUFDbkIsSUFBSSxFQUFFO2FBQ04sU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxFQUFFLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUM3RixNQUFNLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxFQUFFLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDdkcsTUFBTSxDQUFDLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQztRQUN2QyxTQUFTLEdBQUcsTUFBTSxDQUFDO1FBRW5CLE1BQU0sUUFBUSxHQUFHLEVBQWUsQ0FBQztRQUNqQyxRQUFRLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSxnQkFBZ0IsRUFBQyxXQUFXLENBQVMsQ0FBQyxDQUFDO1FBRS9GLFlBQVksR0FBRyxJQUFJLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN6RCxlQUFlLEdBQUcsSUFBSSxxQkFBZSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM3RCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxpQ0FBaUMsRUFBRTtRQUMxQyxFQUFFLENBQUMsZ0VBQWdFLEVBQUU7WUFDbkUsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDO2dCQUMvQixZQUFZLEVBQUU7b0JBQ1osZ0JBQWdCLENBQUM7d0JBQ2YsVUFBVSxFQUFFLHdCQUF3QixDQUFDLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLENBQUM7cUJBQzNGLENBQUM7aUJBQ0g7YUFDRixDQUFDLENBQUM7WUFFSCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsc0NBQXNDLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDOUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRTtZQUM5QyxNQUFNLENBQUMsTUFBTSxDQUNYLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxzQ0FBc0MsQ0FBQyxpQ0FBaUMsRUFBRSxDQUFDLEVBQzlGLGtFQUFrRSxDQUNuRSxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMseUNBQXlDLEVBQUU7WUFDNUMsTUFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsc0NBQXNDLENBQUMsY0FBYyxDQUFDLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFDL0Ysa0VBQWtFLENBQ25FLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywwREFBMEQsRUFBRTtZQUM3RCxNQUFNLENBQUMsTUFBTSxDQUNYLEdBQUcsRUFBRSxDQUNILFlBQVksQ0FBQyxzQ0FBc0MsQ0FDakQsY0FBYyxDQUFDO2dCQUNiLFlBQVksRUFBRTtvQkFDWixnQkFBZ0IsQ0FBQzt3QkFDZixVQUFVLEVBQUUsd0JBQXdCLENBQUMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsQ0FBQztxQkFDcEYsQ0FBQztvQkFDRixnQkFBZ0IsQ0FBQzt3QkFDZixVQUFVLEVBQUUsd0JBQXdCLENBQUMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsQ0FBQztxQkFDcEYsQ0FBQztpQkFDSDthQUNGLENBQUMsQ0FDSCxFQUNILGtFQUFrRSxDQUNuRSxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbUNBQW1DLEVBQUU7WUFDdEMsMEVBQTBFO1lBQzFFLE1BQU0sWUFBWSxHQUF5QixFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDOUYsTUFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsc0NBQXNDLENBQUMsY0FBYyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQzNHLG9DQUFvQyxDQUNyQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0NBQW9DLEVBQUU7WUFDdkMsMEVBQTBFO1lBQzFFLE1BQU0sYUFBYSxHQUF3QixFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ2xHLE1BQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFLENBQ0gsWUFBWSxDQUFDLHNDQUFzQyxDQUNqRCxjQUFjLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUNwRixFQUNILG1DQUFtQyxDQUNwQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsdUNBQXVDLEVBQUU7WUFDMUMsMEVBQTBFO1lBQzFFLE1BQU0sZ0JBQWdCLEdBQXdCLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLENBQUM7WUFDdkcsTUFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUUsQ0FDSCxZQUFZLENBQUMsc0NBQXNDLENBQ2pELGNBQWMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDdkYsRUFDSCxzQ0FBc0MsQ0FDdkMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZUFBZSxFQUFFO1FBQ3hCLEVBQUUsQ0FBQyxpREFBaUQsRUFBRTtZQUNwRCxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUM7WUFDM0IsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQztnQkFDbkMsS0FBSyxFQUFFLFFBQVE7Z0JBQ2YsUUFBUSxFQUFFLGdCQUFnQjtnQkFDMUIsS0FBSyxFQUFFLEdBQUcsdUJBQXVCLElBQUksS0FBSyxFQUFFO2FBQzdDLENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO1FBQzNHLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG9EQUFvRCxFQUFFO1lBQ3ZELE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQztZQUMzQixNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUM3RixNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixDQUFDLENBQUMsQ0FBQztRQUMzRyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRTtZQUNyQyxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDO2dCQUNuQyxLQUFLLEVBQUUsUUFBUTtnQkFDZixRQUFRLEVBQUUsZ0JBQWdCO2dCQUMxQixLQUFLLEVBQUUsR0FBRyx1QkFBdUIsVUFBVTthQUM1QyxDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsTUFBTSxDQUNYLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixDQUFDLEVBQ3JGLHVDQUF1QyxDQUN4QyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMENBQTBDLEVBQUU7WUFDN0MsTUFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSx1QkFBdUIsQ0FBQyxFQUNyRixvQ0FBb0MsQ0FDckMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsd0JBQXdCLEVBQUU7UUFDakMsRUFBRSxDQUFDLDhEQUE4RCxFQUFFLEtBQUs7WUFDdEUsTUFBTSxzQkFBc0IsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDO2dCQUMvQyxLQUFLLEVBQUUsY0FBYyxDQUFDLFVBQVU7Z0JBQ2hDLFFBQVEsRUFBRSxnQkFBZ0I7YUFDM0IsQ0FBQyxDQUFDO1lBRUgsTUFBTSxNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsNkJBQTZCLENBQzdELGVBQWUsQ0FBQyxTQUFTLEVBQ3pCLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFDaEIsRUFBRSxFQUNGLGdDQUFnQyxDQUNqQyxDQUFDO1lBRUYsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDOUIsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLCtDQUErQyxFQUFFLEtBQUs7WUFDdkQsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDO1lBQzNCLE1BQU0sc0JBQXNCLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQztnQkFDL0MsS0FBSyxFQUFFLGNBQWMsQ0FBQyxVQUFVO2dCQUNoQyxRQUFRLEVBQUUsZ0JBQWdCO2dCQUMxQixLQUFLLEVBQUUsR0FBRyxnQ0FBZ0MsSUFBSSxLQUFLLEVBQUU7YUFDdEQsQ0FBQyxDQUFDO1lBRUgsTUFBTSxNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsNkJBQTZCLENBQzdELGVBQWUsQ0FBQyxTQUFTLEVBQ3pCLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFDaEIsS0FBSyxFQUNMLGdDQUFnQyxDQUNqQyxDQUFDO1lBRUYsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDOUIsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDJDQUEyQyxFQUFFLEtBQUs7WUFDbkQsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDO1lBQzNCLHVHQUF1RztZQUN2RyxNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQzVDLENBQUMsRUFBRSxDQUFDO2dCQUNKLEtBQUssRUFBRSxHQUFHLGdDQUFnQyxJQUFJLEtBQUssRUFBRTtnQkFDckQsU0FBUyxFQUFFLGNBQWMsQ0FBQyxVQUFVO2FBQ3JDLENBQUMsQ0FBQztZQUVILE1BQU0sTUFBTSxHQUFHLE1BQU0sWUFBWSxDQUFDLDZCQUE2QixDQUM3RCxlQUFlLENBQUMsU0FBUyxFQUN6QixzQkFBc0IsRUFDdEIsZ0JBQWdCLEVBQ2hCLEtBQUssRUFDTCxnQ0FBZ0MsQ0FDakMsQ0FBQztZQUVGLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDMUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDOUIsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtDQUFrQyxFQUFFLEtBQUs7WUFDMUMsTUFBTSxzQkFBc0IsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDO2dCQUMvQyxLQUFLLEVBQUUsY0FBYyxDQUFDLFVBQVU7Z0JBQ2hDLFFBQVEsRUFBRSxnQkFBZ0I7Z0JBQzFCLEtBQUssRUFBRSxHQUFHLGdDQUFnQyxnQkFBZ0I7YUFDM0QsQ0FBQyxDQUFDO1lBRUgsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUNsQixZQUFZLENBQUMsNkJBQTZCLENBQ3hDLGVBQWUsQ0FBQyxTQUFTLEVBQ3pCLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLGdDQUFnQyxDQUNqQyxFQUNELHVDQUF1QyxDQUN4QyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMENBQTBDLEVBQUUsS0FBSztZQUNsRCxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQ2xCLFlBQVksQ0FBQyw2QkFBNkIsQ0FDeEMsZUFBZSxDQUFDLFNBQVMsRUFDekIsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osZ0NBQWdDLENBQ2pDLEVBQ0QsZ0RBQWdELENBQ2pELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLDBDQUEwQyxFQUFFO1FBQ25ELEVBQUUsQ0FBQyxtRkFBbUYsRUFBRSxLQUFLO1lBQzNGLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQztZQUMvQixNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUM7WUFDN0IsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDO2dCQUMvQixZQUFZLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLFVBQVUsRUFBRSx3QkFBd0IsQ0FBQyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUM1RyxDQUFDLENBQUM7WUFDSCxNQUFNLGtCQUFrQixHQUFHLElBQUEsZ0JBQWdCLEVBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7WUFFMUcsTUFBTSxFQUFFLHNCQUFzQixFQUFFLEdBQUcsTUFBTSxlQUFlLENBQUMsd0JBQXdCLENBQUM7Z0JBQ2hGLFNBQVM7Z0JBQ1QsR0FBRyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO2dCQUNqQyxnQkFBZ0I7YUFDakIsQ0FBQyxDQUFDO1lBRUgsdUdBQXVHO1lBQ3ZHLHVHQUF1RztZQUN2RyxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBdUIsQ0FBQztZQUMzRSxNQUFNLENBQUMsS0FBSyxDQUNWLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQ3ZELCtCQUErQixrQkFBa0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksY0FBYyxFQUFFLENBQ3RGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw4REFBOEQsRUFBRSxLQUFLO1lBQ3RFLDBFQUEwRTtZQUMxRSxNQUFNLFlBQVksR0FBeUIsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRSxDQUFDO1lBQzlGLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FDbEIsZUFBZSxDQUFDLHdCQUF3QixDQUFDO2dCQUN2QyxTQUFTLEVBQUUsY0FBYyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDM0QsR0FBRyxFQUFFLFFBQVE7Z0JBQ2IsZ0JBQWdCO2FBQ2pCLENBQUMsRUFDRixvQ0FBb0MsQ0FDckMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQztBQUVILDhFQUE4RTtBQUM5RSxtQkFBbUI7QUFDbkIsOEVBQThFO0FBRTlFLFNBQVMsY0FBYyxDQUFDLFlBQWdDLEVBQUU7SUFDeEQsT0FBTztRQUNMLFdBQVcsRUFBRSxlQUFlO1FBQzVCLFFBQVEsRUFBRSxXQUFXO1FBQ3JCLFVBQVUsRUFBRSxLQUFLO1FBQ2pCLE9BQU8sRUFBRSxDQUFDO1FBQ1YsS0FBSyxFQUFFLGFBQWE7UUFDcEIsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRTtRQUMvQixNQUFNLEVBQUUsU0FBUztRQUNqQixNQUFNLEVBQUUsRUFBRTtRQUNWLGVBQWUsRUFBRSxJQUFJO1FBQ3JCLFdBQVcsRUFBRSxFQUFFO1FBQ2YsWUFBWSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNsQyxNQUFNLEVBQUUsSUFBSTtRQUNaLEdBQUcsU0FBUztLQUNiLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxpQ0FBaUM7SUFDeEMsTUFBTSxTQUFTLEdBQUcsY0FBYyxFQUFFLENBQUM7SUFDbkMsT0FBTyxTQUFTLENBQUMsWUFBWSxDQUFDO0lBQzlCLE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLFlBQTJDLEVBQUU7SUFDckUsT0FBTyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsd0JBQXdCLEVBQUUsRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFLEdBQUcsU0FBUyxFQUFFLENBQUM7QUFDbEgsQ0FBQztBQUVELFNBQVMsd0JBQXdCLENBQUMsWUFBMEMsRUFBRTtJQUM1RSxPQUFPLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsR0FBRyxTQUFTLEVBQUUsQ0FBQztBQUN2RyxDQUFDO0FBRUQsOEVBQThFO0FBQzlFLDJEQUEyRDtBQUMzRCw4RUFBOEU7QUFFOUUsU0FBUyxlQUFlLENBQUMsUUFBZ0IsRUFBRSxLQUFhLEVBQUUsS0FBYztJQUN0RSxNQUFNLElBQUksR0FBRyxJQUFBLG9CQUFXLEVBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsTUFBTSxFQUFFLEdBQUcsSUFBQSxvQkFBVyxFQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzNCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFO1FBQ25DLElBQUksRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkUsRUFBRSxFQUFFO1lBQ0YsV0FBVyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzlCLFdBQVcsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5QixXQUFXLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDL0IsV0FBVyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ2pDO1FBQ0QsR0FBRyxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUMxQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsS0FBaUI7SUFDcEMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEtBQUssR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgSGFzaCwgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IGNyZWF0ZUtlY2Nha0hhc2ggZnJvbSAna2VjY2FrJztcbmltcG9ydCAqIGFzIG9wZW5wZ3AgZnJvbSAnb3BlbnBncCc7XG5pbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgKiBhcyBzamNsIGZyb20gJ0BiaXRnby9zamNsJztcbmltcG9ydCB7IERrbHNVdGlscyB9IGZyb20gJ0BiaXRnby9zZGstbGliLW1wYyc7XG5cbmltcG9ydCB7IEJpdEdvQmFzZSwgRWNkc2FNUEN2MlV0aWxzLCBJQmFzZUNvaW4sIFR4UmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgQmFzZVRzc1V0aWxzIGZyb20gJy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90c3MvYmFzZVRTU1V0aWxzJztcblxudHlwZSBCaXRnb0dwZ0tleVBhaXIgPSBvcGVucGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4gJiB7IHJldm9jYXRpb25DZXJ0aWZpY2F0ZTogc3RyaW5nIH07XG50eXBlIFR4UmVxdWVzdFRyYW5zYWN0aW9uID0gTm9uTnVsbGFibGU8VHhSZXF1ZXN0Wyd0cmFuc2FjdGlvbnMnXT5bbnVtYmVyXTtcbnR5cGUgVW5zaWduZWRUcmFuc2FjdGlvbiA9IFR4UmVxdWVzdFRyYW5zYWN0aW9uWyd1bnNpZ25lZFR4J107XG50eXBlIFNpZ25hYmxlSGV4QW5kRGVyaXZhdGlvblBhdGggPSB7XG4gIHNpZ25hYmxlSGV4OiBzdHJpbmc7XG4gIGRlcml2YXRpb25QYXRoOiBzdHJpbmc7XG4gIHNlcmlhbGl6ZWRUeEhleDogc3RyaW5nIHwgdW5kZWZpbmVkO1xufTtcbnR5cGUgRGVjcnlwdGVkR3BnS2V5cyA9IHsgYml0Z29HcGdLZXk6IG9wZW5wZ3AuS2V5OyB1c2VyR3BnUHJ2S2V5OiBvcGVucGdwLlByaXZhdGVLZXkgfTtcblxuY2xhc3MgVGVzdEJhc2VUc3NVdGlscyBleHRlbmRzIEJhc2VUc3NVdGlsczxCdWZmZXI+IHtcbiAgZ2V0U2lnbmFibGVIZXhBbmREZXJpdmF0aW9uUGF0aEZvclRlc3QoXG4gICAgdHhSZXF1ZXN0OiBUeFJlcXVlc3QsXG4gICAgbWlzc2luZ1RyYW5zYWN0aW9uc01lc3NhZ2U/OiBzdHJpbmdcbiAgKTogU2lnbmFibGVIZXhBbmREZXJpdmF0aW9uUGF0aCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U2lnbmFibGVIZXhBbmREZXJpdmF0aW9uUGF0aCh0eFJlcXVlc3QsIG1pc3NpbmdUcmFuc2FjdGlvbnNNZXNzYWdlKTtcbiAgfVxuXG4gIHZhbGlkYXRlQWRhdGFGb3JUZXN0KGFkYXRhOiBzdHJpbmcsIGN5cGhlcnRleHQ6IHN0cmluZywgcm91bmREb21haW5TZXBhcmF0b3I6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdGVBZGF0YShhZGF0YSwgY3lwaGVydGV4dCwgcm91bmREb21haW5TZXBhcmF0b3IpO1xuICB9XG5cbiAgZ2V0Qml0Z29BbmRVc2VyR3BnS2V5c0ZvclRlc3QoXG4gICAgYml0Z29QdWJsaWNHcGdLZXk6IHN0cmluZyxcbiAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5OiBzdHJpbmcsXG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nLFxuICAgIGFkYXRhOiBzdHJpbmcsXG4gICAgdXNlckdwZ0tleURvbWFpblNlcGFyYXRvcjogc3RyaW5nXG4gICk6IFByb21pc2U8RGVjcnlwdGVkR3BnS2V5cz4ge1xuICAgIHJldHVybiB0aGlzLmdldEJpdGdvQW5kVXNlckdwZ0tleXMoXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgYWRhdGEsXG4gICAgICB1c2VyR3BnS2V5RG9tYWluU2VwYXJhdG9yXG4gICAgKTtcbiAgfVxufVxuXG5kZXNjcmliZSgnQmFzZSBUU1MgVXRpbHMnLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHdhbGxldFBhc3NwaHJhc2UgPSAndGVzdC1wYXNzd29yZCc7XG4gIGNvbnN0IHNpZ25pbmdVc2VyR3BnS2V5RG9tYWluU2VwYXJhdG9yID0gJ01QU19EU0dfU0lHTklOR19VU0VSX0dQR19LRVknO1xuICBjb25zdCByb3VuZE9uZURvbWFpblNlcGFyYXRvciA9ICdNUFNfRFNHX1NJR05JTkdfUk9VTkQxX1NUQVRFJztcblxuICBsZXQgYmFzZVRzc1V0aWxzOiBUZXN0QmFzZVRzc1V0aWxzO1xuICBsZXQgZWNkc2FNUEN2MlV0aWxzOiBFY2RzYU1QQ3YyVXRpbHM7XG4gIGxldCBtb2NrQml0Z286IEJpdEdvQmFzZTtcbiAgbGV0IGRlY3J5cHRBc3luY1N0dWI6IHNpbm9uLlNpbm9uU3R1YjtcbiAgbGV0IGJpdGdvR3BnS2V5UGFpcjogQml0Z29HcGdLZXlQYWlyO1xuICBsZXQgdXNlckdwZ0tleVBhaXI6IEJpdGdvR3BnS2V5UGFpcjtcbiAgbGV0IHVzZXJTaGFyZTogQnVmZmVyO1xuXG4gIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgb3BlbnBncC5jb25maWcucmVqZWN0Q3VydmVzID0gbmV3IFNldCgpO1xuICAgIGJpdGdvR3BnS2V5UGFpciA9IGF3YWl0IG9wZW5wZ3AuZ2VuZXJhdGVLZXkoe1xuICAgICAgdXNlcklEczogW3sgbmFtZTogJ2JpdGdvJywgZW1haWw6ICdiaXRnb0B0ZXN0LmNvbScgfV0sXG4gICAgICBjdXJ2ZTogJ2VkMjU1MTknLFxuICAgICAgZm9ybWF0OiAnYXJtb3JlZCcsXG4gICAgfSk7XG4gICAgdXNlckdwZ0tleVBhaXIgPSBhd2FpdCBvcGVucGdwLmdlbmVyYXRlS2V5KHtcbiAgICAgIHVzZXJJRHM6IFt7IG5hbWU6ICd1c2VyJywgZW1haWw6ICd1c2VyQHRlc3QuY29tJyB9XSxcbiAgICAgIGN1cnZlOiAnZWQyNTUxOScsXG4gICAgICBmb3JtYXQ6ICdhcm1vcmVkJyxcbiAgICB9KTtcblxuICAgIGNvbnN0IFt1c2VyRGtnU2Vzc2lvbl0gPSBhd2FpdCBEa2xzVXRpbHMuZ2VuZXJhdGVES0dLZXlTaGFyZXMoKTtcbiAgICB1c2VyU2hhcmUgPSB1c2VyRGtnU2Vzc2lvbi5nZXRLZXlTaGFyZSgpO1xuICB9KTtcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBkZWNyeXB0QXN5bmNTdHViID0gc2lub24uc3R1YigpLmNhbGxzRmFrZSgoeyBpbnB1dCB9OiBQYXJhbWV0ZXJzPEJpdEdvQmFzZVsnZGVjcnlwdEFzeW5jJ10+WzBdKSA9PlxuICAgICAgLy8gRmFrZSB2MiBlbnZlbG9wZTogcmVzb2x2ZSB0aGUgcGxhaW50ZXh0IGVtYmVkZGVkIGluIHRoZSBKU09OLlxuICAgICAgUHJvbWlzZS5yZXNvbHZlKChKU09OLnBhcnNlKGlucHV0KSBhcyB7IHBsYWludGV4dDogc3RyaW5nIH0pLnBsYWludGV4dClcbiAgICApO1xuXG4gICAgY29uc3QgbW9ja0JnID0ge30gYXMgQml0R29CYXNlO1xuICAgIG1vY2tCZy5nZXRFbnYgPSBzaW5vbi5zdHViKCkucmV0dXJucygndGVzdCcpO1xuICAgIG1vY2tCZy5lbmNyeXB0ID0gc2lub25cbiAgICAgIC5zdHViKClcbiAgICAgIC5jYWxsc0Zha2UoKHBhcmFtcykgPT4gZW5jcnlwdFdpdGhTamNsKHBhcmFtcy5wYXNzd29yZCA/PyAnJywgcGFyYW1zLmlucHV0LCBwYXJhbXMuYWRhdGEpKTtcbiAgICBtb2NrQmcuZGVjcnlwdCA9IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoKHBhcmFtcykgPT4gc2pjbC5kZWNyeXB0KHBhcmFtcy5wYXNzd29yZCA/PyAnJywgcGFyYW1zLmlucHV0KSk7XG4gICAgbW9ja0JnLmRlY3J5cHRBc3luYyA9IGRlY3J5cHRBc3luY1N0dWI7XG4gICAgbW9ja0JpdGdvID0gbW9ja0JnO1xuXG4gICAgY29uc3QgbW9ja0NvaW4gPSB7fSBhcyBJQmFzZUNvaW47XG4gICAgbW9ja0NvaW4uZ2V0SGFzaEZ1bmN0aW9uID0gc2lub24uc3R1YigpLmNhbGxzRmFrZSgoKSA9PiBjcmVhdGVLZWNjYWtIYXNoKCdrZWNjYWsyNTYnKSBhcyBIYXNoKTtcblxuICAgIGJhc2VUc3NVdGlscyA9IG5ldyBUZXN0QmFzZVRzc1V0aWxzKG1vY2tCaXRnbywgbW9ja0NvaW4pO1xuICAgIGVjZHNhTVBDdjJVdGlscyA9IG5ldyBFY2RzYU1QQ3YyVXRpbHMobW9ja0JpdGdvLCBtb2NrQ29pbik7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRTaWduYWJsZUhleEFuZERlcml2YXRpb25QYXRoJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdleHRyYWN0cyBzaWduYWJsZUhleCBhbmQgZGVyaXZhdGlvblBhdGggZnJvbSBhIHZhbGlkIHR4UmVxdWVzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UmVxdWVzdCA9IGJ1aWxkVHhSZXF1ZXN0KHtcbiAgICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgICAgYnVpbGRUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICB1bnNpZ25lZFR4OiBidWlsZFVuc2lnbmVkVHJhbnNhY3Rpb24oeyBzaWduYWJsZUhleDogJ2RlYWRiZWVmJywgZGVyaXZhdGlvblBhdGg6ICdtLzAvMCcgfSksXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYmFzZVRzc1V0aWxzLmdldFNpZ25hYmxlSGV4QW5kRGVyaXZhdGlvblBhdGhGb3JUZXN0KHR4UmVxdWVzdCk7XG4gICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnNpZ25hYmxlSGV4LCAnZGVhZGJlZWYnKTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuZGVyaXZhdGlvblBhdGgsICdtLzAvMCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyB3aGVuIHRyYW5zYWN0aW9ucyBmaWVsZCBpcyBtaXNzaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYmFzZVRzc1V0aWxzLmdldFNpZ25hYmxlSGV4QW5kRGVyaXZhdGlvblBhdGhGb3JUZXN0KGJ1aWxkVHhSZXF1ZXN0V2l0aG91dFRyYW5zYWN0aW9ucygpKSxcbiAgICAgICAgL2NyZWF0ZU9mZmxpbmVTaGFyZSByZXF1aXJlcyBleGFjdGx5IG9uZSB0cmFuc2FjdGlvbiBpbiB0eFJlcXVlc3QvXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyB3aGVuIHRyYW5zYWN0aW9ucyBhcnJheSBpcyBlbXB0eScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IGJhc2VUc3NVdGlscy5nZXRTaWduYWJsZUhleEFuZERlcml2YXRpb25QYXRoRm9yVGVzdChidWlsZFR4UmVxdWVzdCh7IHRyYW5zYWN0aW9uczogW10gfSkpLFxuICAgICAgICAvY3JlYXRlT2ZmbGluZVNoYXJlIHJlcXVpcmVzIGV4YWN0bHkgb25lIHRyYW5zYWN0aW9uIGluIHR4UmVxdWVzdC9cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIHdoZW4gdHJhbnNhY3Rpb25zIGFycmF5IGhhcyBtb3JlIHRoYW4gb25lIGVsZW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIGJhc2VUc3NVdGlscy5nZXRTaWduYWJsZUhleEFuZERlcml2YXRpb25QYXRoRm9yVGVzdChcbiAgICAgICAgICAgIGJ1aWxkVHhSZXF1ZXN0KHtcbiAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgYnVpbGRUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICAgICAgICB1bnNpZ25lZFR4OiBidWlsZFVuc2lnbmVkVHJhbnNhY3Rpb24oeyBzaWduYWJsZUhleDogJ2FhYScsIGRlcml2YXRpb25QYXRoOiAnbS8wJyB9KSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBidWlsZFRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkVHg6IGJ1aWxkVW5zaWduZWRUcmFuc2FjdGlvbih7IHNpZ25hYmxlSGV4OiAnYmJiJywgZGVyaXZhdGlvblBhdGg6ICdtLzEnIH0pLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApLFxuICAgICAgICAvY3JlYXRlT2ZmbGluZVNoYXJlIHJlcXVpcmVzIGV4YWN0bHkgb25lIHRyYW5zYWN0aW9uIGluIHR4UmVxdWVzdC9cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIHdoZW4gdW5zaWduZWRUeCBpcyBtaXNzaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBJbnRlbnRpb25hbGx5IG1hbGZvcm1lZCB0byBleGVyY2lzZSB0aGUgcnVudGltZSBndWFyZC5cbiAgICAgIGNvbnN0IG5vVW5zaWduZWRUeDogVHhSZXF1ZXN0VHJhbnNhY3Rpb24gPSB7IHN0YXRlOiAncGVuZGluZ1NpZ25hdHVyZScsIHNpZ25hdHVyZVNoYXJlczogW10gfTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IGJhc2VUc3NVdGlscy5nZXRTaWduYWJsZUhleEFuZERlcml2YXRpb25QYXRoRm9yVGVzdChidWlsZFR4UmVxdWVzdCh7IHRyYW5zYWN0aW9uczogW25vVW5zaWduZWRUeF0gfSkpLFxuICAgICAgICAvTWlzc2luZyB1bnNpZ25lZFR4IGluIHRyYW5zYWN0aW9ucy9cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIHdoZW4gc2lnbmFibGVIZXggaXMgbWlzc2luZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgSW50ZW50aW9uYWxseSBtYWxmb3JtZWQgdG8gZXhlcmNpc2UgdGhlIHJ1bnRpbWUgZ3VhcmQuXG4gICAgICBjb25zdCBub1NpZ25hYmxlSGV4OiBVbnNpZ25lZFRyYW5zYWN0aW9uID0geyBzZXJpYWxpemVkVHhIZXg6ICdhYWJiY2NkZCcsIGRlcml2YXRpb25QYXRoOiAnbS8wJyB9O1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBiYXNlVHNzVXRpbHMuZ2V0U2lnbmFibGVIZXhBbmREZXJpdmF0aW9uUGF0aEZvclRlc3QoXG4gICAgICAgICAgICBidWlsZFR4UmVxdWVzdCh7IHRyYW5zYWN0aW9uczogW2J1aWxkVHJhbnNhY3Rpb24oeyB1bnNpZ25lZFR4OiBub1NpZ25hYmxlSGV4IH0pXSB9KVxuICAgICAgICAgICksXG4gICAgICAgIC9NaXNzaW5nIHNpZ25hYmxlSGV4IGluIHVuc2lnbmVkVHgvXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyB3aGVuIGRlcml2YXRpb25QYXRoIGlzIG1pc3NpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEludGVudGlvbmFsbHkgbWFsZm9ybWVkIHRvIGV4ZXJjaXNlIHRoZSBydW50aW1lIGd1YXJkLlxuICAgICAgY29uc3Qgbm9EZXJpdmF0aW9uUGF0aDogVW5zaWduZWRUcmFuc2FjdGlvbiA9IHsgc2VyaWFsaXplZFR4SGV4OiAnYWFiYmNjZGQnLCBzaWduYWJsZUhleDogJ2RlYWRiZWVmJyB9O1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBiYXNlVHNzVXRpbHMuZ2V0U2lnbmFibGVIZXhBbmREZXJpdmF0aW9uUGF0aEZvclRlc3QoXG4gICAgICAgICAgICBidWlsZFR4UmVxdWVzdCh7IHRyYW5zYWN0aW9uczogW2J1aWxkVHJhbnNhY3Rpb24oeyB1bnNpZ25lZFR4OiBub0Rlcml2YXRpb25QYXRoIH0pXSB9KVxuICAgICAgICAgICksXG4gICAgICAgIC9NaXNzaW5nIGRlcml2YXRpb25QYXRoIGluIHVuc2lnbmVkVHgvXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmFsaWRhdGVBZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgncGFzc2VzIHdoZW4gYWRhdGEgbWF0Y2hlcyB3aXRoIGRvbWFpbiBzZXBhcmF0b3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGF0YSA9ICd0ZXN0LXZhbHVlJztcbiAgICAgIGNvbnN0IGN5cGhlcnRleHQgPSBtb2NrQml0Z28uZW5jcnlwdCh7XG4gICAgICAgIGlucHV0OiAnc2VjcmV0JyxcbiAgICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIGFkYXRhOiBgJHtyb3VuZE9uZURvbWFpblNlcGFyYXRvcn06JHthZGF0YX1gLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IGJhc2VUc3NVdGlscy52YWxpZGF0ZUFkYXRhRm9yVGVzdChhZGF0YSwgY3lwaGVydGV4dCwgcm91bmRPbmVEb21haW5TZXBhcmF0b3IpKTtcbiAgICB9KTtcblxuICAgIGl0KCdwYXNzZXMgd2hlbiBhZGF0YSBtYXRjaGVzIHdpdGhvdXQgZG9tYWluIHNlcGFyYXRvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkYXRhID0gJ3Rlc3QtdmFsdWUnO1xuICAgICAgY29uc3QgY3lwaGVydGV4dCA9IG1vY2tCaXRnby5lbmNyeXB0KHsgaW5wdXQ6ICdzZWNyZXQnLCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSwgYWRhdGEgfSk7XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IGJhc2VUc3NVdGlscy52YWxpZGF0ZUFkYXRhRm9yVGVzdChhZGF0YSwgY3lwaGVydGV4dCwgcm91bmRPbmVEb21haW5TZXBhcmF0b3IpKTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3Mgd2hlbiBhZGF0YSBkb2VzIG5vdCBtYXRjaCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGN5cGhlcnRleHQgPSBtb2NrQml0Z28uZW5jcnlwdCh7XG4gICAgICAgIGlucHV0OiAnc2VjcmV0JyxcbiAgICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIGFkYXRhOiBgJHtyb3VuZE9uZURvbWFpblNlcGFyYXRvcn06Y29ycmVjdGAsXG4gICAgICB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IGJhc2VUc3NVdGlscy52YWxpZGF0ZUFkYXRhRm9yVGVzdCgnd3JvbmcnLCBjeXBoZXJ0ZXh0LCByb3VuZE9uZURvbWFpblNlcGFyYXRvciksXG4gICAgICAgIC9BZGF0YSBkb2VzIG5vdCBtYXRjaCBjeXBoZXJ0ZXh0IGFkYXRhL1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3Mgd2hlbiBjeXBoZXJ0ZXh0IGlzIG5vdCB2YWxpZCBKU09OJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYmFzZVRzc1V0aWxzLnZhbGlkYXRlQWRhdGFGb3JUZXN0KCdhZGF0YScsICdub3QtanNvbicsIHJvdW5kT25lRG9tYWluU2VwYXJhdG9yKSxcbiAgICAgICAgL0ZhaWxlZCB0byBwYXJzZSBjeXBoZXJ0ZXh0IHRvIEpTT04vXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0Qml0Z29BbmRVc2VyR3BnS2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnZGVjcnlwdHMgdjEgU0pDTCBlbnZlbG9wZSB3aXRob3V0IGFkYXRhIGFuZCBza2lwcyB2YWxpZGF0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZW5jcnlwdGVkVXNlckdwZ1BydktleSA9IG1vY2tCaXRnby5lbmNyeXB0KHtcbiAgICAgICAgaW5wdXQ6IHVzZXJHcGdLZXlQYWlyLnByaXZhdGVLZXksXG4gICAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2VUc3NVdGlscy5nZXRCaXRnb0FuZFVzZXJHcGdLZXlzRm9yVGVzdChcbiAgICAgICAgYml0Z29HcGdLZXlQYWlyLnB1YmxpY0tleSxcbiAgICAgICAgZW5jcnlwdGVkVXNlckdwZ1BydktleSxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgJycsXG4gICAgICAgIHNpZ25pbmdVc2VyR3BnS2V5RG9tYWluU2VwYXJhdG9yXG4gICAgICApO1xuXG4gICAgICBhc3NlcnQub2socmVzdWx0LmJpdGdvR3BnS2V5KTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQudXNlckdwZ1BydktleS5pc1ByaXZhdGUoKSwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZGVjcnlwdHMgdjEgU0pDTCBlbnZlbG9wZSB3aXRoIG1hdGNoaW5nIGFkYXRhJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRhdGEgPSAndGVzdC1hZGF0YSc7XG4gICAgICBjb25zdCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5ID0gbW9ja0JpdGdvLmVuY3J5cHQoe1xuICAgICAgICBpbnB1dDogdXNlckdwZ0tleVBhaXIucHJpdmF0ZUtleSxcbiAgICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIGFkYXRhOiBgJHtzaWduaW5nVXNlckdwZ0tleURvbWFpblNlcGFyYXRvcn06JHthZGF0YX1gLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2VUc3NVdGlscy5nZXRCaXRnb0FuZFVzZXJHcGdLZXlzRm9yVGVzdChcbiAgICAgICAgYml0Z29HcGdLZXlQYWlyLnB1YmxpY0tleSxcbiAgICAgICAgZW5jcnlwdGVkVXNlckdwZ1BydktleSxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgYWRhdGEsXG4gICAgICAgIHNpZ25pbmdVc2VyR3BnS2V5RG9tYWluU2VwYXJhdG9yXG4gICAgICApO1xuXG4gICAgICBhc3NlcnQub2socmVzdWx0LmJpdGdvR3BnS2V5KTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQudXNlckdwZ1BydktleS5pc1ByaXZhdGUoKSwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZGVjcnlwdHMgdjIgZW52ZWxvcGUgYW5kIHJldHVybnMgR1BHIGtleXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGF0YSA9ICd0ZXN0LWFkYXRhJztcbiAgICAgIC8vIEZha2UgdjIgZW52ZWxvcGU6IEpTT04gd2l0aCB2OjIgdHJpZ2dlcnMgaXNWMkVudmVsb3BlOyBkZWNyeXB0QXN5bmMgc3R1YiByZXR1cm5zIHBsYWludGV4dCBkaXJlY3RseS5cbiAgICAgIGNvbnN0IGVuY3J5cHRlZFVzZXJHcGdQcnZLZXkgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHY6IDIsXG4gICAgICAgIGFkYXRhOiBgJHtzaWduaW5nVXNlckdwZ0tleURvbWFpblNlcGFyYXRvcn06JHthZGF0YX1gLFxuICAgICAgICBwbGFpbnRleHQ6IHVzZXJHcGdLZXlQYWlyLnByaXZhdGVLZXksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZVRzc1V0aWxzLmdldEJpdGdvQW5kVXNlckdwZ0tleXNGb3JUZXN0KFxuICAgICAgICBiaXRnb0dwZ0tleVBhaXIucHVibGljS2V5LFxuICAgICAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICBhZGF0YSxcbiAgICAgICAgc2lnbmluZ1VzZXJHcGdLZXlEb21haW5TZXBhcmF0b3JcbiAgICAgICk7XG5cbiAgICAgIHNpbm9uLmFzc2VydC5jYWxsZWRPbmNlKGRlY3J5cHRBc3luY1N0dWIpO1xuICAgICAgYXNzZXJ0Lm9rKHJlc3VsdC5iaXRnb0dwZ0tleSk7XG4gICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnVzZXJHcGdQcnZLZXkuaXNQcml2YXRlKCksIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyB3aGVuIGFkYXRhIGRvZXMgbm90IG1hdGNoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZW5jcnlwdGVkVXNlckdwZ1BydktleSA9IG1vY2tCaXRnby5lbmNyeXB0KHtcbiAgICAgICAgaW5wdXQ6IHVzZXJHcGdLZXlQYWlyLnByaXZhdGVLZXksXG4gICAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICBhZGF0YTogYCR7c2lnbmluZ1VzZXJHcGdLZXlEb21haW5TZXBhcmF0b3J9OmNvcnJlY3QtYWRhdGFgLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICBiYXNlVHNzVXRpbHMuZ2V0Qml0Z29BbmRVc2VyR3BnS2V5c0ZvclRlc3QoXG4gICAgICAgICAgYml0Z29HcGdLZXlQYWlyLnB1YmxpY0tleSxcbiAgICAgICAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LFxuICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgJ3dyb25nLWFkYXRhJyxcbiAgICAgICAgICBzaWduaW5nVXNlckdwZ0tleURvbWFpblNlcGFyYXRvclxuICAgICAgICApLFxuICAgICAgICAvQWRhdGEgZG9lcyBub3QgbWF0Y2ggY3lwaGVydGV4dCBhZGF0YS9cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIHdoZW4gY3lwaGVydGV4dCBpcyBub3QgdmFsaWQgSlNPTicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICBiYXNlVHNzVXRpbHMuZ2V0Qml0Z29BbmRVc2VyR3BnS2V5c0ZvclRlc3QoXG4gICAgICAgICAgYml0Z29HcGdLZXlQYWlyLnB1YmxpY0tleSxcbiAgICAgICAgICAnbm90LXZhbGlkLWpzb24nLFxuICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgJ3Rlc3QtYWRhdGEnLFxuICAgICAgICAgIHNpZ25pbmdVc2VyR3BnS2V5RG9tYWluU2VwYXJhdG9yXG4gICAgICAgICksXG4gICAgICAgIC9qc29uIGRlY29kZXxGYWlsZWQgdG8gcGFyc2UgY3lwaGVydGV4dCB0byBKU09OL1xuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0VDRFNBIE1QQyB2MiBkZWxlZ2F0ZWQgdHhSZXF1ZXN0IHBhcnNpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2dldEhhc2hTdHJpbmdBbmREZXJpdmF0aW9uUGF0aCBwcm9kdWNlcyB0aGUgY29ycmVjdCBoYXNoQnVmZmVyIGFuZCBkZXJpdmF0aW9uUGF0aCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNpZ25hYmxlSGV4ID0gJ2RlYWRiZWVmJztcbiAgICAgIGNvbnN0IGRlcml2YXRpb25QYXRoID0gJ20vMCc7XG4gICAgICBjb25zdCB0eFJlcXVlc3QgPSBidWlsZFR4UmVxdWVzdCh7XG4gICAgICAgIHRyYW5zYWN0aW9uczogW2J1aWxkVHJhbnNhY3Rpb24oeyB1bnNpZ25lZFR4OiBidWlsZFVuc2lnbmVkVHJhbnNhY3Rpb24oeyBzaWduYWJsZUhleCwgZGVyaXZhdGlvblBhdGggfSkgfSldLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBleHBlY3RlZEhhc2hCdWZmZXIgPSBjcmVhdGVLZWNjYWtIYXNoKCdrZWNjYWsyNTYnKS51cGRhdGUoQnVmZmVyLmZyb20oc2lnbmFibGVIZXgsICdoZXgnKSkuZGlnZXN0KCk7XG5cbiAgICAgIGNvbnN0IHsgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiB9ID0gYXdhaXQgZWNkc2FNUEN2MlV0aWxzLmNyZWF0ZU9mZmxpbmVSb3VuZDFTaGFyZSh7XG4gICAgICAgIHR4UmVxdWVzdCxcbiAgICAgICAgcHJ2OiB1c2VyU2hhcmUudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFRoZSByb3VuZC0xIHNlc3Npb24gaXMgZW5jcnlwdGVkIHdpdGggYWRhdGEgPSBcIkRLTFMyM19TSUdOSU5HX1JPVU5EMV9TVEFURTo8aGFzaD46PGRlcml2YXRpb25QYXRoPlwiLFxuICAgICAgLy8gd2hpY2ggcHJvdmVzIGdldEhhc2hTdHJpbmdBbmREZXJpdmF0aW9uUGF0aCBwcm9kdWNlZCB0aGUgcmlnaHQgdmFsdWVzIGFmdGVyIHRoZSBkZWxlZ2F0aW9uIHJlZmFjdG9yLlxuICAgICAgY29uc3QgeyBhZGF0YSB9ID0gSlNPTi5wYXJzZShlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uKSBhcyB7IGFkYXRhPzogc3RyaW5nIH07XG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIGFkYXRhID09PSB1bmRlZmluZWQgPyBhZGF0YSA6IGRlY29kZVVSSUNvbXBvbmVudChhZGF0YSksXG4gICAgICAgIGBES0xTMjNfU0lHTklOR19ST1VORDFfU1RBVEU6JHtleHBlY3RlZEhhc2hCdWZmZXIudG9TdHJpbmcoJ2hleCcpfToke2Rlcml2YXRpb25QYXRofWBcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgncHJvcGFnYXRlcyB0aGUgYmFzZSB1bnNpZ25lZFR4IGd1YXJkIHRocm91Z2ggdGhlIEVDRFNBIHJvdXRlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBJbnRlbnRpb25hbGx5IG1hbGZvcm1lZCB0byBleGVyY2lzZSB0aGUgcnVudGltZSBndWFyZC5cbiAgICAgIGNvbnN0IG5vVW5zaWduZWRUeDogVHhSZXF1ZXN0VHJhbnNhY3Rpb24gPSB7IHN0YXRlOiAncGVuZGluZ1NpZ25hdHVyZScsIHNpZ25hdHVyZVNoYXJlczogW10gfTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICBlY2RzYU1QQ3YyVXRpbHMuY3JlYXRlT2ZmbGluZVJvdW5kMVNoYXJlKHtcbiAgICAgICAgICB0eFJlcXVlc3Q6IGJ1aWxkVHhSZXF1ZXN0KHsgdHJhbnNhY3Rpb25zOiBbbm9VbnNpZ25lZFR4XSB9KSxcbiAgICAgICAgICBwcnY6ICd1bnVzZWQnLFxuICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIH0pLFxuICAgICAgICAvTWlzc2luZyB1bnNpZ25lZFR4IGluIHRyYW5zYWN0aW9ucy9cbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRml4dHVyZSBidWlsZGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGJ1aWxkVHhSZXF1ZXN0KG92ZXJyaWRlczogUGFydGlhbDxUeFJlcXVlc3Q+ID0ge30pOiBUeFJlcXVlc3Qge1xuICByZXR1cm4ge1xuICAgIHR4UmVxdWVzdElkOiAndHgtcmVxdWVzdC1pZCcsXG4gICAgd2FsbGV0SWQ6ICd3YWxsZXQtaWQnLFxuICAgIHdhbGxldFR5cGU6ICdob3QnLFxuICAgIHZlcnNpb246IDEsXG4gICAgc3RhdGU6ICdpbml0aWFsaXplZCcsXG4gICAgZGF0ZTogbmV3IERhdGUoMCkudG9JU09TdHJpbmcoKSxcbiAgICB1c2VySWQ6ICd1c2VyLWlkJyxcbiAgICBpbnRlbnQ6IHt9LFxuICAgIHBvbGljaWVzQ2hlY2tlZDogdHJ1ZSxcbiAgICB1bnNpZ25lZFR4czogW10sXG4gICAgdHJhbnNhY3Rpb25zOiBbYnVpbGRUcmFuc2FjdGlvbigpXSxcbiAgICBsYXRlc3Q6IHRydWUsXG4gICAgLi4ub3ZlcnJpZGVzLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFR4UmVxdWVzdFdpdGhvdXRUcmFuc2FjdGlvbnMoKTogVHhSZXF1ZXN0IHtcbiAgY29uc3QgdHhSZXF1ZXN0ID0gYnVpbGRUeFJlcXVlc3QoKTtcbiAgZGVsZXRlIHR4UmVxdWVzdC50cmFuc2FjdGlvbnM7XG4gIHJldHVybiB0eFJlcXVlc3Q7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVHJhbnNhY3Rpb24ob3ZlcnJpZGVzOiBQYXJ0aWFsPFR4UmVxdWVzdFRyYW5zYWN0aW9uPiA9IHt9KTogVHhSZXF1ZXN0VHJhbnNhY3Rpb24ge1xuICByZXR1cm4geyBzdGF0ZTogJ3BlbmRpbmdTaWduYXR1cmUnLCB1bnNpZ25lZFR4OiBidWlsZFVuc2lnbmVkVHJhbnNhY3Rpb24oKSwgc2lnbmF0dXJlU2hhcmVzOiBbXSwgLi4ub3ZlcnJpZGVzIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVW5zaWduZWRUcmFuc2FjdGlvbihvdmVycmlkZXM6IFBhcnRpYWw8VW5zaWduZWRUcmFuc2FjdGlvbj4gPSB7fSk6IFVuc2lnbmVkVHJhbnNhY3Rpb24ge1xuICByZXR1cm4geyBzZXJpYWxpemVkVHhIZXg6ICdhYWJiY2NkZCcsIHNpZ25hYmxlSGV4OiAnZGVhZGJlZWYnLCBkZXJpdmF0aW9uUGF0aDogJ20vMCcsIC4uLm92ZXJyaWRlcyB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEVuY3J5cHRpb24gaGVscGVycyAobWlycm9ycyB0aGUgZWNkc2FNUEN2MiB0ZXN0IHBhdHRlcm4pXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gZW5jcnlwdFdpdGhTamNsKHBhc3N3b3JkOiBzdHJpbmcsIGlucHV0OiBzdHJpbmcsIGFkYXRhPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc2FsdCA9IHJhbmRvbUJ5dGVzKDgpO1xuICBjb25zdCBpdiA9IHJhbmRvbUJ5dGVzKDE2KTtcbiAgcmV0dXJuIHNqY2wuZW5jcnlwdChwYXNzd29yZCwgaW5wdXQsIHtcbiAgICBzYWx0OiBbYnl0ZXNUb1dvcmQoc2FsdC5zdWJhcnJheSgwLCA0KSksIGJ5dGVzVG9Xb3JkKHNhbHQuc3ViYXJyYXkoNCkpXSxcbiAgICBpdjogW1xuICAgICAgYnl0ZXNUb1dvcmQoaXYuc3ViYXJyYXkoMCwgNCkpLFxuICAgICAgYnl0ZXNUb1dvcmQoaXYuc3ViYXJyYXkoNCwgOCkpLFxuICAgICAgYnl0ZXNUb1dvcmQoaXYuc3ViYXJyYXkoOCwgMTIpKSxcbiAgICAgIGJ5dGVzVG9Xb3JkKGl2LnN1YmFycmF5KDEyLCAxNikpLFxuICAgIF0sXG4gICAgLi4uKGFkYXRhICE9PSB1bmRlZmluZWQgPyB7IGFkYXRhIH0gOiB7fSksXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBieXRlc1RvV29yZChieXRlczogVWludDhBcnJheSk6IG51bWJlciB7XG4gIGlmIChieXRlcy5sZW5ndGggIT09IDQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2J5dGVzIG11c3QgaGF2ZSBsZW5ndGggNCcpO1xuICB9XG4gIHJldHVybiBieXRlcy5yZWR1Y2UoKG51bSwgYnl0ZSkgPT4gbnVtICogMHgxMDAgKyBieXRlLCAwKTtcbn1cbiJdfQ==
|
|
308
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZVRTU1V0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3V0aWxzL3Rzcy9iYXNlVFNTVXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsbUNBQTJDO0FBQzNDLG9EQUFzQztBQUN0QyxpREFBbUM7QUFDbkMsNkNBQStCO0FBQy9CLGtEQUFvQztBQUNwQyxvREFBK0M7QUFFL0MsNENBQXNGO0FBQ3RGLG1HQUEyRTtBQVkzRSxNQUFNLGdCQUFpQixTQUFRLHNCQUFvQjtJQUNqRCxzQ0FBc0MsQ0FDcEMsU0FBb0IsRUFDcEIsMEJBQW1DO1FBRW5DLE9BQU8sSUFBSSxDQUFDLCtCQUErQixDQUFDLFNBQVMsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxLQUFhLEVBQUUsVUFBa0IsRUFBRSxvQkFBNEI7UUFDbEYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELDZCQUE2QixDQUMzQixpQkFBeUIsRUFDekIsc0JBQThCLEVBQzlCLGdCQUF3QixFQUN4QixLQUFhLEVBQ2IseUJBQWlDO1FBRWpDLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUNoQyxpQkFBaUIsRUFDakIsc0JBQXNCLEVBQ3RCLGdCQUFnQixFQUNoQixLQUFLLEVBQ0wseUJBQXlCLENBQzFCLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFFRCxRQUFRLENBQUMsZ0JBQWdCLEVBQUU7SUFDekIsTUFBTSxnQkFBZ0IsR0FBRyxlQUFlLENBQUM7SUFDekMsTUFBTSxnQ0FBZ0MsR0FBRyw4QkFBOEIsQ0FBQztJQUN4RSxNQUFNLHVCQUF1QixHQUFHLDhCQUE4QixDQUFDO0lBRS9ELElBQUksWUFBOEIs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QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUFpQjtJQUNwQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsS0FBSyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM1RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBIYXNoLCByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgY3JlYXRlS2VjY2FrSGFzaCBmcm9tICdrZWNjYWsnO1xuaW1wb3J0ICogYXMgb3BlbnBncCBmcm9tICdvcGVucGdwJztcbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCAqIGFzIHNqY2wgZnJvbSAnQGJpdGdvL3NqY2wnO1xuaW1wb3J0IHsgRGtsc1V0aWxzIH0gZnJvbSAnQGJpdGdvL3Nkay1saWItbXBjJztcblxuaW1wb3J0IHsgQml0R29CYXNlLCBFY2RzYU1QQ3YyVXRpbHMsIElCYXNlQ29pbiwgVHhSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc3JjJztcbmltcG9ydCBCYXNlVHNzVXRpbHMgZnJvbSAnLi4vLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3V0aWxzL3Rzcy9iYXNlVFNTVXRpbHMnO1xuXG50eXBlIEJpdGdvR3BnS2V5UGFpciA9IG9wZW5wZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPiAmIHsgcmV2b2NhdGlvbkNlcnRpZmljYXRlOiBzdHJpbmcgfTtcbnR5cGUgVHhSZXF1ZXN0VHJhbnNhY3Rpb24gPSBOb25OdWxsYWJsZTxUeFJlcXVlc3RbJ3RyYW5zYWN0aW9ucyddPltudW1iZXJdO1xudHlwZSBVbnNpZ25lZFRyYW5zYWN0aW9uID0gVHhSZXF1ZXN0VHJhbnNhY3Rpb25bJ3Vuc2lnbmVkVHgnXTtcbnR5cGUgU2lnbmFibGVIZXhBbmREZXJpdmF0aW9uUGF0aCA9IHtcbiAgc2lnbmFibGVIZXg6IHN0cmluZztcbiAgZGVyaXZhdGlvblBhdGg6IHN0cmluZztcbiAgc2VyaWFsaXplZFR4SGV4OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59O1xudHlwZSBEZWNyeXB0ZWRHcGdLZXlzID0geyBiaXRnb0dwZ0tleTogb3BlbnBncC5LZXk7IHVzZXJHcGdQcnZLZXk6IG9wZW5wZ3AuUHJpdmF0ZUtleSB9O1xuXG5jbGFzcyBUZXN0QmFzZVRzc1V0aWxzIGV4dGVuZHMgQmFzZVRzc1V0aWxzPEJ1ZmZlcj4ge1xuICBnZXRTaWduYWJsZUhleEFuZERlcml2YXRpb25QYXRoRm9yVGVzdChcbiAgICB0eFJlcXVlc3Q6IFR4UmVxdWVzdCxcbiAgICBtaXNzaW5nVHJhbnNhY3Rpb25zTWVzc2FnZT86IHN0cmluZ1xuICApOiBTaWduYWJsZUhleEFuZERlcml2YXRpb25QYXRoIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTaWduYWJsZUhleEFuZERlcml2YXRpb25QYXRoKHR4UmVxdWVzdCwgbWlzc2luZ1RyYW5zYWN0aW9uc01lc3NhZ2UpO1xuICB9XG5cbiAgdmFsaWRhdGVBZGF0YUZvclRlc3QoYWRhdGE6IHN0cmluZywgY3lwaGVydGV4dDogc3RyaW5nLCByb3VuZERvbWFpblNlcGFyYXRvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy52YWxpZGF0ZUFkYXRhKGFkYXRhLCBjeXBoZXJ0ZXh0LCByb3VuZERvbWFpblNlcGFyYXRvcik7XG4gIH1cblxuICBnZXRCaXRnb0FuZFVzZXJHcGdLZXlzRm9yVGVzdChcbiAgICBiaXRnb1B1YmxpY0dwZ0tleTogc3RyaW5nLFxuICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXk6IHN0cmluZyxcbiAgICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmcsXG4gICAgYWRhdGE6IHN0cmluZyxcbiAgICB1c2VyR3BnS2V5RG9tYWluU2VwYXJhdG9yOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxEZWNyeXB0ZWRHcGdLZXlzPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qml0Z29BbmRVc2VyR3BnS2V5cyhcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgICAgZW5jcnlwdGVkVXNlckdwZ1BydktleSxcbiAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBhZGF0YSxcbiAgICAgIHVzZXJHcGdLZXlEb21haW5TZXBhcmF0b3JcbiAgICApO1xuICB9XG59XG5cbmRlc2NyaWJlKCdCYXNlIFRTUyBVdGlscycsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3Qgd2FsbGV0UGFzc3BocmFzZSA9ICd0ZXN0LXBhc3N3b3JkJztcbiAgY29uc3Qgc2lnbmluZ1VzZXJHcGdLZXlEb21haW5TZXBhcmF0b3IgPSAnTVBTX0RTR19TSUdOSU5HX1VTRVJfR1BHX0tFWSc7XG4gIGNvbnN0IHJvdW5kT25lRG9tYWluU2VwYXJhdG9yID0gJ01QU19EU0dfU0lHTklOR19ST1VORDFfU1RBVEUnO1xuXG4gIGxldCBiYXNlVHNzVXRpbHM6IFRlc3RCYXNlVHNzVXRpbHM7XG4gIGxldCBlY2RzYU1QQ3YyVXRpbHM6IEVjZHNhTVBDdjJVdGlscztcbiAgbGV0IG1vY2tCaXRnbzogQml0R29CYXNlO1xuICBsZXQgZGVjcnlwdEFzeW5jU3R1Yjogc2lub24uU2lub25TdHViO1xuICBsZXQgYml0Z29HcGdLZXlQYWlyOiBCaXRnb0dwZ0tleVBhaXI7XG4gIGxldCB1c2VyR3BnS2V5UGFpcjogQml0Z29HcGdLZXlQYWlyO1xuICBsZXQgdXNlclNoYXJlOiBCdWZmZXI7XG5cbiAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBvcGVucGdwLmNvbmZpZy5yZWplY3RDdXJ2ZXMgPSBuZXcgU2V0KCk7XG4gICAgYml0Z29HcGdLZXlQYWlyID0gYXdhaXQgb3BlbnBncC5nZW5lcmF0ZUtleSh7XG4gICAgICB1c2VySURzOiBbeyBuYW1lOiAnYml0Z28nLCBlbWFpbDogJ2JpdGdvQHRlc3QuY29tJyB9XSxcbiAgICAgIGN1cnZlOiAnZWQyNTUxOScsXG4gICAgICBmb3JtYXQ6ICdhcm1vcmVkJyxcbiAgICB9KTtcbiAgICB1c2VyR3BnS2V5UGFpciA9IGF3YWl0IG9wZW5wZ3AuZ2VuZXJhdGVLZXkoe1xuICAgICAgdXNlcklEczogW3sgbmFtZTogJ3VzZXInLCBlbWFpbDogJ3VzZXJAdGVzdC5jb20nIH1dLFxuICAgICAgY3VydmU6ICdlZDI1NTE5JyxcbiAgICAgIGZvcm1hdDogJ2FybW9yZWQnLFxuICAgIH0pO1xuXG4gICAgY29uc3QgW3VzZXJEa2dTZXNzaW9uXSA9IGF3YWl0IERrbHNVdGlscy5nZW5lcmF0ZURLR0tleVNoYXJlcygpO1xuICAgIHVzZXJTaGFyZSA9IHVzZXJEa2dTZXNzaW9uLmdldEtleVNoYXJlKCk7XG4gIH0pO1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIGRlY3J5cHRBc3luY1N0dWIgPSBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKCh7IGlucHV0IH06IFBhcmFtZXRlcnM8Qml0R29CYXNlWydkZWNyeXB0QXN5bmMnXT5bMF0pID0+XG4gICAgICAvLyBGYWtlIHYyIGVudmVsb3BlOiByZXNvbHZlIHRoZSBwbGFpbnRleHQgZW1iZWRkZWQgaW4gdGhlIEpTT04uXG4gICAgICBQcm9taXNlLnJlc29sdmUoKEpTT04ucGFyc2UoaW5wdXQpIGFzIHsgcGxhaW50ZXh0OiBzdHJpbmcgfSkucGxhaW50ZXh0KVxuICAgICk7XG5cbiAgICBjb25zdCBtb2NrQmcgPSB7fSBhcyBCaXRHb0Jhc2U7XG4gICAgbW9ja0JnLmdldEVudiA9IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCd0ZXN0Jyk7XG4gICAgbW9ja0JnLmVuY3J5cHQgPSBzaW5vblxuICAgICAgLnN0dWIoKVxuICAgICAgLmNhbGxzRmFrZSgocGFyYW1zKSA9PiBlbmNyeXB0V2l0aFNqY2wocGFyYW1zLnBhc3N3b3JkID8/ICcnLCBwYXJhbXMuaW5wdXQsIHBhcmFtcy5hZGF0YSkpO1xuICAgIG1vY2tCZy5lbmNyeXB0QXN5bmMgPSBzaW5vblxuICAgICAgLnN0dWIoKVxuICAgICAgLmNhbGxzRmFrZShhc3luYyAocGFyYW1zKSA9PiBlbmNyeXB0V2l0aFNqY2wocGFyYW1zLnBhc3N3b3JkID8/ICcnLCBwYXJhbXMuaW5wdXQsIHBhcmFtcy5hZGF0YSkpO1xuICAgIG1vY2tCZy5kZWNyeXB0ID0gc2lub24uc3R1YigpLmNhbGxzRmFrZSgocGFyYW1zKSA9PiBzamNsLmRlY3J5cHQocGFyYW1zLnBhc3N3b3JkID8/ICcnLCBwYXJhbXMuaW5wdXQpKTtcbiAgICBtb2NrQmcuZGVjcnlwdEFzeW5jID0gZGVjcnlwdEFzeW5jU3R1YjtcbiAgICBtb2NrQml0Z28gPSBtb2NrQmc7XG5cbiAgICBjb25zdCBtb2NrQ29pbiA9IHt9IGFzIElCYXNlQ29pbjtcbiAgICBtb2NrQ29pbi5nZXRIYXNoRnVuY3Rpb24gPSBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKCgpID0+IGNyZWF0ZUtlY2Nha0hhc2goJ2tlY2NhazI1NicpIGFzIEhhc2gpO1xuXG4gICAgYmFzZVRzc1V0aWxzID0gbmV3IFRlc3RCYXNlVHNzVXRpbHMobW9ja0JpdGdvLCBtb2NrQ29pbik7XG4gICAgZWNkc2FNUEN2MlV0aWxzID0gbmV3IEVjZHNhTVBDdjJVdGlscyhtb2NrQml0Z28sIG1vY2tDb2luKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldFNpZ25hYmxlSGV4QW5kRGVyaXZhdGlvblBhdGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2V4dHJhY3RzIHNpZ25hYmxlSGV4IGFuZCBkZXJpdmF0aW9uUGF0aCBmcm9tIGEgdmFsaWQgdHhSZXF1ZXN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhSZXF1ZXN0ID0gYnVpbGRUeFJlcXVlc3Qoe1xuICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICBidWlsZFRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIHVuc2lnbmVkVHg6IGJ1aWxkVW5zaWduZWRUcmFuc2FjdGlvbih7IHNpZ25hYmxlSGV4OiAnZGVhZGJlZWYnLCBkZXJpdmF0aW9uUGF0aDogJ20vMC8wJyB9KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBiYXNlVHNzVXRpbHMuZ2V0U2lnbmFibGVIZXhBbmREZXJpdmF0aW9uUGF0aEZvclRlc3QodHhSZXF1ZXN0KTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc2lnbmFibGVIZXgsICdkZWFkYmVlZicpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5kZXJpdmF0aW9uUGF0aCwgJ20vMC8wJyk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIHdoZW4gdHJhbnNhY3Rpb25zIGZpZWxkIGlzIG1pc3NpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiBiYXNlVHNzVXRpbHMuZ2V0U2lnbmFibGVIZXhBbmREZXJpdmF0aW9uUGF0aEZvclRlc3QoYnVpbGRUeFJlcXVlc3RXaXRob3V0VHJhbnNhY3Rpb25zKCkpLFxuICAgICAgICAvY3JlYXRlT2ZmbGluZVNoYXJlIHJlcXVpcmVzIGV4YWN0bHkgb25lIHRyYW5zYWN0aW9uIGluIHR4UmVxdWVzdC9cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIHdoZW4gdHJhbnNhY3Rpb25zIGFycmF5IGlzIGVtcHR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYmFzZVRzc1V0aWxzLmdldFNpZ25hYmxlSGV4QW5kRGVyaXZhdGlvblBhdGhGb3JUZXN0KGJ1aWxkVHhSZXF1ZXN0KHsgdHJhbnNhY3Rpb25zOiBbXSB9KSksXG4gICAgICAgIC9jcmVhdGVPZmZsaW5lU2hhcmUgcmVxdWlyZXMgZXhhY3RseSBvbmUgdHJhbnNhY3Rpb24gaW4gdHhSZXF1ZXN0L1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3Mgd2hlbiB0cmFuc2FjdGlvbnMgYXJyYXkgaGFzIG1vcmUgdGhhbiBvbmUgZWxlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgYmFzZVRzc1V0aWxzLmdldFNpZ25hYmxlSGV4QW5kRGVyaXZhdGlvblBhdGhGb3JUZXN0KFxuICAgICAgICAgICAgYnVpbGRUeFJlcXVlc3Qoe1xuICAgICAgICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICBidWlsZFRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkVHg6IGJ1aWxkVW5zaWduZWRUcmFuc2FjdGlvbih7IHNpZ25hYmxlSGV4OiAnYWFhJywgZGVyaXZhdGlvblBhdGg6ICdtLzAnIH0pLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGJ1aWxkVHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgICAgICAgdW5zaWduZWRUeDogYnVpbGRVbnNpZ25lZFRyYW5zYWN0aW9uKHsgc2lnbmFibGVIZXg6ICdiYmInLCBkZXJpdmF0aW9uUGF0aDogJ20vMScgfSksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICksXG4gICAgICAgIC9jcmVhdGVPZmZsaW5lU2hhcmUgcmVxdWlyZXMgZXhhY3RseSBvbmUgdHJhbnNhY3Rpb24gaW4gdHhSZXF1ZXN0L1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3Mgd2hlbiB1bnNpZ25lZFR4IGlzIG1pc3NpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEludGVudGlvbmFsbHkgbWFsZm9ybWVkIHRvIGV4ZXJjaXNlIHRoZSBydW50aW1lIGd1YXJkLlxuICAgICAgY29uc3Qgbm9VbnNpZ25lZFR4OiBUeFJlcXVlc3RUcmFuc2FjdGlvbiA9IHsgc3RhdGU6ICdwZW5kaW5nU2lnbmF0dXJlJywgc2lnbmF0dXJlU2hhcmVzOiBbXSB9O1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYmFzZVRzc1V0aWxzLmdldFNpZ25hYmxlSGV4QW5kRGVyaXZhdGlvblBhdGhGb3JUZXN0KGJ1aWxkVHhSZXF1ZXN0KHsgdHJhbnNhY3Rpb25zOiBbbm9VbnNpZ25lZFR4XSB9KSksXG4gICAgICAgIC9NaXNzaW5nIHVuc2lnbmVkVHggaW4gdHJhbnNhY3Rpb25zL1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3Mgd2hlbiBzaWduYWJsZUhleCBpcyBtaXNzaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBJbnRlbnRpb25hbGx5IG1hbGZvcm1lZCB0byBleGVyY2lzZSB0aGUgcnVudGltZSBndWFyZC5cbiAgICAgIGNvbnN0IG5vU2lnbmFibGVIZXg6IFVuc2lnbmVkVHJhbnNhY3Rpb24gPSB7IHNlcmlhbGl6ZWRUeEhleDogJ2FhYmJjY2RkJywgZGVyaXZhdGlvblBhdGg6ICdtLzAnIH07XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIGJhc2VUc3NVdGlscy5nZXRTaWduYWJsZUhleEFuZERlcml2YXRpb25QYXRoRm9yVGVzdChcbiAgICAgICAgICAgIGJ1aWxkVHhSZXF1ZXN0KHsgdHJhbnNhY3Rpb25zOiBbYnVpbGRUcmFuc2FjdGlvbih7IHVuc2lnbmVkVHg6IG5vU2lnbmFibGVIZXggfSldIH0pXG4gICAgICAgICAgKSxcbiAgICAgICAgL01pc3Npbmcgc2lnbmFibGVIZXggaW4gdW5zaWduZWRUeC9cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIHdoZW4gZGVyaXZhdGlvblBhdGggaXMgbWlzc2luZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgSW50ZW50aW9uYWxseSBtYWxmb3JtZWQgdG8gZXhlcmNpc2UgdGhlIHJ1bnRpbWUgZ3VhcmQuXG4gICAgICBjb25zdCBub0Rlcml2YXRpb25QYXRoOiBVbnNpZ25lZFRyYW5zYWN0aW9uID0geyBzZXJpYWxpemVkVHhIZXg6ICdhYWJiY2NkZCcsIHNpZ25hYmxlSGV4OiAnZGVhZGJlZWYnIH07XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIGJhc2VUc3NVdGlscy5nZXRTaWduYWJsZUhleEFuZERlcml2YXRpb25QYXRoRm9yVGVzdChcbiAgICAgICAgICAgIGJ1aWxkVHhSZXF1ZXN0KHsgdHJhbnNhY3Rpb25zOiBbYnVpbGRUcmFuc2FjdGlvbih7IHVuc2lnbmVkVHg6IG5vRGVyaXZhdGlvblBhdGggfSldIH0pXG4gICAgICAgICAgKSxcbiAgICAgICAgL01pc3NpbmcgZGVyaXZhdGlvblBhdGggaW4gdW5zaWduZWRUeC9cbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2YWxpZGF0ZUFkYXRhJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdwYXNzZXMgd2hlbiBhZGF0YSBtYXRjaGVzIHdpdGggZG9tYWluIHNlcGFyYXRvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkYXRhID0gJ3Rlc3QtdmFsdWUnO1xuICAgICAgY29uc3QgY3lwaGVydGV4dCA9IG1vY2tCaXRnby5lbmNyeXB0KHtcbiAgICAgICAgaW5wdXQ6ICdzZWNyZXQnLFxuICAgICAgICBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgYWRhdGE6IGAke3JvdW5kT25lRG9tYWluU2VwYXJhdG9yfToke2FkYXRhfWAsXG4gICAgICB9KTtcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4gYmFzZVRzc1V0aWxzLnZhbGlkYXRlQWRhdGFGb3JUZXN0KGFkYXRhLCBjeXBoZXJ0ZXh0LCByb3VuZE9uZURvbWFpblNlcGFyYXRvcikpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Bhc3NlcyB3aGVuIGFkYXRhIG1hdGNoZXMgd2l0aG91dCBkb21haW4gc2VwYXJhdG9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRhdGEgPSAndGVzdC12YWx1ZSc7XG4gICAgICBjb25zdCBjeXBoZXJ0ZXh0ID0gbW9ja0JpdGdvLmVuY3J5cHQoeyBpbnB1dDogJ3NlY3JldCcsIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLCBhZGF0YSB9KTtcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4gYmFzZVRzc1V0aWxzLnZhbGlkYXRlQWRhdGFGb3JUZXN0KGFkYXRhLCBjeXBoZXJ0ZXh0LCByb3VuZE9uZURvbWFpblNlcGFyYXRvcikpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyB3aGVuIGFkYXRhIGRvZXMgbm90IG1hdGNoJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY3lwaGVydGV4dCA9IG1vY2tCaXRnby5lbmNyeXB0KHtcbiAgICAgICAgaW5wdXQ6ICdzZWNyZXQnLFxuICAgICAgICBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgYWRhdGE6IGAke3JvdW5kT25lRG9tYWluU2VwYXJhdG9yfTpjb3JyZWN0YCxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYmFzZVRzc1V0aWxzLnZhbGlkYXRlQWRhdGFGb3JUZXN0KCd3cm9uZycsIGN5cGhlcnRleHQsIHJvdW5kT25lRG9tYWluU2VwYXJhdG9yKSxcbiAgICAgICAgL0FkYXRhIGRvZXMgbm90IG1hdGNoIGN5cGhlcnRleHQgYWRhdGEvXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyB3aGVuIGN5cGhlcnRleHQgaXMgbm90IHZhbGlkIEpTT04nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiBiYXNlVHNzVXRpbHMudmFsaWRhdGVBZGF0YUZvclRlc3QoJ2FkYXRhJywgJ25vdC1qc29uJywgcm91bmRPbmVEb21haW5TZXBhcmF0b3IpLFxuICAgICAgICAvRmFpbGVkIHRvIHBhcnNlIGN5cGhlcnRleHQgdG8gSlNPTi9cbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRCaXRnb0FuZFVzZXJHcGdLZXlzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdkZWNyeXB0cyB2MSBTSkNMIGVudmVsb3BlIHdpdGhvdXQgYWRhdGEgYW5kIHNraXBzIHZhbGlkYXRpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5ID0gbW9ja0JpdGdvLmVuY3J5cHQoe1xuICAgICAgICBpbnB1dDogdXNlckdwZ0tleVBhaXIucHJpdmF0ZUtleSxcbiAgICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZVRzc1V0aWxzLmdldEJpdGdvQW5kVXNlckdwZ0tleXNGb3JUZXN0KFxuICAgICAgICBiaXRnb0dwZ0tleVBhaXIucHVibGljS2V5LFxuICAgICAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICAnJyxcbiAgICAgICAgc2lnbmluZ1VzZXJHcGdLZXlEb21haW5TZXBhcmF0b3JcbiAgICAgICk7XG5cbiAgICAgIGFzc2VydC5vayhyZXN1bHQuYml0Z29HcGdLZXkpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC51c2VyR3BnUHJ2S2V5LmlzUHJpdmF0ZSgpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdkZWNyeXB0cyB2MSBTSkNMIGVudmVsb3BlIHdpdGggbWF0Y2hpbmcgYWRhdGEnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGF0YSA9ICd0ZXN0LWFkYXRhJztcbiAgICAgIGNvbnN0IGVuY3J5cHRlZFVzZXJHcGdQcnZLZXkgPSBtb2NrQml0Z28uZW5jcnlwdCh7XG4gICAgICAgIGlucHV0OiB1c2VyR3BnS2V5UGFpci5wcml2YXRlS2V5LFxuICAgICAgICBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgYWRhdGE6IGAke3NpZ25pbmdVc2VyR3BnS2V5RG9tYWluU2VwYXJhdG9yfToke2FkYXRhfWAsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZVRzc1V0aWxzLmdldEJpdGdvQW5kVXNlckdwZ0tleXNGb3JUZXN0KFxuICAgICAgICBiaXRnb0dwZ0tleVBhaXIucHVibGljS2V5LFxuICAgICAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICBhZGF0YSxcbiAgICAgICAgc2lnbmluZ1VzZXJHcGdLZXlEb21haW5TZXBhcmF0b3JcbiAgICAgICk7XG5cbiAgICAgIGFzc2VydC5vayhyZXN1bHQuYml0Z29HcGdLZXkpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC51c2VyR3BnUHJ2S2V5LmlzUHJpdmF0ZSgpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdkZWNyeXB0cyB2MiBlbnZlbG9wZSBhbmQgcmV0dXJucyBHUEcga2V5cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkYXRhID0gJ3Rlc3QtYWRhdGEnO1xuICAgICAgLy8gRmFrZSB2MiBlbnZlbG9wZTogSlNPTiB3aXRoIHY6MiB0cmlnZ2VycyBpc1YyRW52ZWxvcGU7IGRlY3J5cHRBc3luYyBzdHViIHJldHVybnMgcGxhaW50ZXh0IGRpcmVjdGx5LlxuICAgICAgY29uc3QgZW5jcnlwdGVkVXNlckdwZ1BydktleSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdjogMixcbiAgICAgICAgYWRhdGE6IGAke3NpZ25pbmdVc2VyR3BnS2V5RG9tYWluU2VwYXJhdG9yfToke2FkYXRhfWAsXG4gICAgICAgIHBsYWludGV4dDogdXNlckdwZ0tleVBhaXIucHJpdmF0ZUtleSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlVHNzVXRpbHMuZ2V0Qml0Z29BbmRVc2VyR3BnS2V5c0ZvclRlc3QoXG4gICAgICAgIGJpdGdvR3BnS2V5UGFpci5wdWJsaWNLZXksXG4gICAgICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIGFkYXRhLFxuICAgICAgICBzaWduaW5nVXNlckdwZ0tleURvbWFpblNlcGFyYXRvclxuICAgICAgKTtcblxuICAgICAgc2lub24uYXNzZXJ0LmNhbGxlZE9uY2UoZGVjcnlwdEFzeW5jU3R1Yik7XG4gICAgICBhc3NlcnQub2socmVzdWx0LmJpdGdvR3BnS2V5KTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQudXNlckdwZ1BydktleS5pc1ByaXZhdGUoKSwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIHdoZW4gYWRhdGEgZG9lcyBub3QgbWF0Y2gnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5ID0gbW9ja0JpdGdvLmVuY3J5cHQoe1xuICAgICAgICBpbnB1dDogdXNlckdwZ0tleVBhaXIucHJpdmF0ZUtleSxcbiAgICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIGFkYXRhOiBgJHtzaWduaW5nVXNlckdwZ0tleURvbWFpblNlcGFyYXRvcn06Y29ycmVjdC1hZGF0YWAsXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIGJhc2VUc3NVdGlscy5nZXRCaXRnb0FuZFVzZXJHcGdLZXlzRm9yVGVzdChcbiAgICAgICAgICBiaXRnb0dwZ0tleVBhaXIucHVibGljS2V5LFxuICAgICAgICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksXG4gICAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgICAnd3JvbmctYWRhdGEnLFxuICAgICAgICAgIHNpZ25pbmdVc2VyR3BnS2V5RG9tYWluU2VwYXJhdG9yXG4gICAgICAgICksXG4gICAgICAgIC9BZGF0YSBkb2VzIG5vdCBtYXRjaCBjeXBoZXJ0ZXh0IGFkYXRhL1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3Mgd2hlbiBjeXBoZXJ0ZXh0IGlzIG5vdCB2YWxpZCBKU09OJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIGJhc2VUc3NVdGlscy5nZXRCaXRnb0FuZFVzZXJHcGdLZXlzRm9yVGVzdChcbiAgICAgICAgICBiaXRnb0dwZ0tleVBhaXIucHVibGljS2V5LFxuICAgICAgICAgICdub3QtdmFsaWQtanNvbicsXG4gICAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgICAndGVzdC1hZGF0YScsXG4gICAgICAgICAgc2lnbmluZ1VzZXJHcGdLZXlEb21haW5TZXBhcmF0b3JcbiAgICAgICAgKSxcbiAgICAgICAgL2pzb24gZGVjb2RlfEZhaWxlZCB0byBwYXJzZSBjeXBoZXJ0ZXh0IHRvIEpTT04vXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRUNEU0EgTVBDIHYyIGRlbGVnYXRlZCB0eFJlcXVlc3QgcGFyc2luZycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnZ2V0SGFzaFN0cmluZ0FuZERlcml2YXRpb25QYXRoIHByb2R1Y2VzIHRoZSBjb3JyZWN0IGhhc2hCdWZmZXIgYW5kIGRlcml2YXRpb25QYXRoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2lnbmFibGVIZXggPSAnZGVhZGJlZWYnO1xuICAgICAgY29uc3QgZGVyaXZhdGlvblBhdGggPSAnbS8wJztcbiAgICAgIGNvbnN0IHR4UmVxdWVzdCA9IGJ1aWxkVHhSZXF1ZXN0KHtcbiAgICAgICAgdHJhbnNhY3Rpb25zOiBbYnVpbGRUcmFuc2FjdGlvbih7IHVuc2lnbmVkVHg6IGJ1aWxkVW5zaWduZWRUcmFuc2FjdGlvbih7IHNpZ25hYmxlSGV4LCBkZXJpdmF0aW9uUGF0aCB9KSB9KV0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkSGFzaEJ1ZmZlciA9IGNyZWF0ZUtlY2Nha0hhc2goJ2tlY2NhazI1NicpLnVwZGF0ZShCdWZmZXIuZnJvbShzaWduYWJsZUhleCwgJ2hleCcpKS5kaWdlc3QoKTtcblxuICAgICAgY29uc3QgeyBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uIH0gPSBhd2FpdCBlY2RzYU1QQ3YyVXRpbHMuY3JlYXRlT2ZmbGluZVJvdW5kMVNoYXJlKHtcbiAgICAgICAgdHhSZXF1ZXN0LFxuICAgICAgICBwcnY6IHVzZXJTaGFyZS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICB9KTtcblxuICAgICAgLy8gVGhlIHJvdW5kLTEgc2Vzc2lvbiBpcyBlbmNyeXB0ZWQgd2l0aCBhZGF0YSA9IFwiREtMUzIzX1NJR05JTkdfUk9VTkQxX1NUQVRFOjxoYXNoPjo8ZGVyaXZhdGlvblBhdGg+XCIsXG4gICAgICAvLyB3aGljaCBwcm92ZXMgZ2V0SGFzaFN0cmluZ0FuZERlcml2YXRpb25QYXRoIHByb2R1Y2VkIHRoZSByaWdodCB2YWx1ZXMgYWZ0ZXIgdGhlIGRlbGVnYXRpb24gcmVmYWN0b3IuXG4gICAgICBjb25zdCB7IGFkYXRhIH0gPSBKU09OLnBhcnNlKGVuY3J5cHRlZFJvdW5kMVNlc3Npb24pIGFzIHsgYWRhdGE/OiBzdHJpbmcgfTtcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgYWRhdGEgPT09IHVuZGVmaW5lZCA/IGFkYXRhIDogZGVjb2RlVVJJQ29tcG9uZW50KGFkYXRhKSxcbiAgICAgICAgYERLTFMyM19TSUdOSU5HX1JPVU5EMV9TVEFURToke2V4cGVjdGVkSGFzaEJ1ZmZlci50b1N0cmluZygnaGV4Jyl9OiR7ZGVyaXZhdGlvblBhdGh9YFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdwcm9wYWdhdGVzIHRoZSBiYXNlIHVuc2lnbmVkVHggZ3VhcmQgdGhyb3VnaCB0aGUgRUNEU0Egcm91dGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEludGVudGlvbmFsbHkgbWFsZm9ybWVkIHRvIGV4ZXJjaXNlIHRoZSBydW50aW1lIGd1YXJkLlxuICAgICAgY29uc3Qgbm9VbnNpZ25lZFR4OiBUeFJlcXVlc3RUcmFuc2FjdGlvbiA9IHsgc3RhdGU6ICdwZW5kaW5nU2lnbmF0dXJlJywgc2lnbmF0dXJlU2hhcmVzOiBbXSB9O1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIGVjZHNhTVBDdjJVdGlscy5jcmVhdGVPZmZsaW5lUm91bmQxU2hhcmUoe1xuICAgICAgICAgIHR4UmVxdWVzdDogYnVpbGRUeFJlcXVlc3QoeyB0cmFuc2FjdGlvbnM6IFtub1Vuc2lnbmVkVHhdIH0pLFxuICAgICAgICAgIHBydjogJ3VudXNlZCcsXG4gICAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgfSksXG4gICAgICAgIC9NaXNzaW5nIHVuc2lnbmVkVHggaW4gdHJhbnNhY3Rpb25zL1xuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGaXh0dXJlIGJ1aWxkZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gYnVpbGRUeFJlcXVlc3Qob3ZlcnJpZGVzOiBQYXJ0aWFsPFR4UmVxdWVzdD4gPSB7fSk6IFR4UmVxdWVzdCB7XG4gIHJldHVybiB7XG4gICAgdHhSZXF1ZXN0SWQ6ICd0eC1yZXF1ZXN0LWlkJyxcbiAgICB3YWxsZXRJZDogJ3dhbGxldC1pZCcsXG4gICAgd2FsbGV0VHlwZTogJ2hvdCcsXG4gICAgdmVyc2lvbjogMSxcbiAgICBzdGF0ZTogJ2luaXRpYWxpemVkJyxcbiAgICBkYXRlOiBuZXcgRGF0ZSgwKS50b0lTT1N0cmluZygpLFxuICAgIHVzZXJJZDogJ3VzZXItaWQnLFxuICAgIGludGVudDoge30sXG4gICAgcG9saWNpZXNDaGVja2VkOiB0cnVlLFxuICAgIHVuc2lnbmVkVHhzOiBbXSxcbiAgICB0cmFuc2FjdGlvbnM6IFtidWlsZFRyYW5zYWN0aW9uKCldLFxuICAgIGxhdGVzdDogdHJ1ZSxcbiAgICAuLi5vdmVycmlkZXMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVHhSZXF1ZXN0V2l0aG91dFRyYW5zYWN0aW9ucygpOiBUeFJlcXVlc3Qge1xuICBjb25zdCB0eFJlcXVlc3QgPSBidWlsZFR4UmVxdWVzdCgpO1xuICBkZWxldGUgdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucztcbiAgcmV0dXJuIHR4UmVxdWVzdDtcbn1cblxuZnVuY3Rpb24gYnVpbGRUcmFuc2FjdGlvbihvdmVycmlkZXM6IFBhcnRpYWw8VHhSZXF1ZXN0VHJhbnNhY3Rpb24+ID0ge30pOiBUeFJlcXVlc3RUcmFuc2FjdGlvbiB7XG4gIHJldHVybiB7IHN0YXRlOiAncGVuZGluZ1NpZ25hdHVyZScsIHVuc2lnbmVkVHg6IGJ1aWxkVW5zaWduZWRUcmFuc2FjdGlvbigpLCBzaWduYXR1cmVTaGFyZXM6IFtdLCAuLi5vdmVycmlkZXMgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRVbnNpZ25lZFRyYW5zYWN0aW9uKG92ZXJyaWRlczogUGFydGlhbDxVbnNpZ25lZFRyYW5zYWN0aW9uPiA9IHt9KTogVW5zaWduZWRUcmFuc2FjdGlvbiB7XG4gIHJldHVybiB7IHNlcmlhbGl6ZWRUeEhleDogJ2FhYmJjY2RkJywgc2lnbmFibGVIZXg6ICdkZWFkYmVlZicsIGRlcml2YXRpb25QYXRoOiAnbS8wJywgLi4ub3ZlcnJpZGVzIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRW5jcnlwdGlvbiBoZWxwZXJzIChtaXJyb3JzIHRoZSBlY2RzYU1QQ3YyIHRlc3QgcGF0dGVybilcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBlbmNyeXB0V2l0aFNqY2wocGFzc3dvcmQ6IHN0cmluZywgaW5wdXQ6IHN0cmluZywgYWRhdGE/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzYWx0ID0gcmFuZG9tQnl0ZXMoOCk7XG4gIGNvbnN0IGl2ID0gcmFuZG9tQnl0ZXMoMTYpO1xuICByZXR1cm4gc2pjbC5lbmNyeXB0KHBhc3N3b3JkLCBpbnB1dCwge1xuICAgIHNhbHQ6IFtieXRlc1RvV29yZChzYWx0LnN1YmFycmF5KDAsIDQpKSwgYnl0ZXNUb1dvcmQoc2FsdC5zdWJhcnJheSg0KSldLFxuICAgIGl2OiBbXG4gICAgICBieXRlc1RvV29yZChpdi5zdWJhcnJheSgwLCA0KSksXG4gICAgICBieXRlc1RvV29yZChpdi5zdWJhcnJheSg0LCA4KSksXG4gICAgICBieXRlc1RvV29yZChpdi5zdWJhcnJheSg4LCAxMikpLFxuICAgICAgYnl0ZXNUb1dvcmQoaXYuc3ViYXJyYXkoMTIsIDE2KSksXG4gICAgXSxcbiAgICAuLi4oYWRhdGEgIT09IHVuZGVmaW5lZCA/IHsgYWRhdGEgfSA6IHt9KSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ5dGVzVG9Xb3JkKGJ5dGVzOiBVaW50OEFycmF5KTogbnVtYmVyIHtcbiAgaWYgKGJ5dGVzLmxlbmd0aCAhPT0gNCkge1xuICAgIHRocm93IG5ldyBFcnJvcignYnl0ZXMgbXVzdCBoYXZlIGxlbmd0aCA0Jyk7XG4gIH1cbiAgcmV0dXJuIGJ5dGVzLnJlZHVjZSgobnVtLCBieXRlKSA9PiBudW0gKiAweDEwMCArIGJ5dGUsIDApO1xufVxuIl19
|