@bitgo-beta/sdk-core 8.2.1-beta.12 → 8.2.1-beta.13

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.
@@ -28,7 +28,6 @@ const secp = __importStar(require("@noble/secp256k1"));
28
28
  const hdTree_1 = require("../../hdTree");
29
29
  const crypto_1 = require("crypto");
30
30
  const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
31
- const crypto_2 = require("../../../util/crypto");
32
31
  const util_1 = require("../../util");
33
32
  const curves_1 = require("../../curves");
34
33
  const shamir_1 = __importDefault(require("../../shamir"));
@@ -122,14 +121,14 @@ class Ecdsa {
122
121
  keyCombine(pShare, nShares) {
123
122
  const allShares = [pShare, ...nShares];
124
123
  // Compute the public key.
125
- const y = allShares.map((participant) => crypto_2.hexToBigInt(participant['y'])).reduce(Ecdsa.curve.pointAdd);
124
+ const y = allShares.map((participant) => sdk_lib_mpc_1.hexToBigInt(participant['y'])).reduce(Ecdsa.curve.pointAdd);
126
125
  // Add secret shares
127
- const x = allShares.map((participant) => crypto_2.hexToBigInt(participant['u'])).reduce(Ecdsa.curve.scalarAdd);
126
+ const x = allShares.map((participant) => sdk_lib_mpc_1.hexToBigInt(participant['u'])).reduce(Ecdsa.curve.scalarAdd);
128
127
  // Verify shares.
129
128
  for (const share of nShares) {
130
129
  if (share.v) {
131
130
  try {
132
- Ecdsa.shamir.verify(crypto_2.hexToBigInt(share.u), [crypto_2.hexToBigInt(share.y), crypto_2.hexToBigInt(share.v)], pShare.i);
131
+ Ecdsa.shamir.verify(sdk_lib_mpc_1.hexToBigInt(share.u), [sdk_lib_mpc_1.hexToBigInt(share.y), sdk_lib_mpc_1.hexToBigInt(share.v)], pShare.i);
133
132
  }
134
133
  catch (err) {
135
134
  throw new Error(`Could not verify share from participant ${share.j}. Verification error: ${err}`);
@@ -171,17 +170,17 @@ class Ecdsa {
171
170
  * be distributed to participants at their corresponding index.
172
171
  */
173
172
  keyDerive(pShare, nShares, path) {
174
- const yValues = [pShare, ...nShares].map((share) => crypto_2.hexToBigInt(share.y));
173
+ const yValues = [pShare, ...nShares].map((share) => sdk_lib_mpc_1.hexToBigInt(share.y));
175
174
  const y = yValues.reduce((partial, share) => Ecdsa.curve.pointAdd(partial, share));
176
175
  const u = BigInt(pShare.uu);
177
- let contribChaincode = crypto_2.hexToBigInt(pShare.chaincode);
178
- const chaincodes = [contribChaincode, ...nShares.map(({ chaincode }) => crypto_2.hexToBigInt(chaincode))];
176
+ let contribChaincode = sdk_lib_mpc_1.hexToBigInt(pShare.chaincode);
177
+ const chaincodes = [contribChaincode, ...nShares.map(({ chaincode }) => sdk_lib_mpc_1.hexToBigInt(chaincode))];
179
178
  const chaincode = chaincodes.reduce((acc, chaincode) => (acc + chaincode) % hdTree_1.chaincodeBase);
180
179
  // Verify shares.
181
180
  for (const share of nShares) {
182
181
  if (share.v) {
183
182
  try {
184
- Ecdsa.shamir.verify(crypto_2.hexToBigInt(share.u), [crypto_2.hexToBigInt(share.y), crypto_2.hexToBigInt(share.v)], pShare.i);
183
+ Ecdsa.shamir.verify(sdk_lib_mpc_1.hexToBigInt(share.u), [sdk_lib_mpc_1.hexToBigInt(share.y), sdk_lib_mpc_1.hexToBigInt(share.v)], pShare.i);
185
184
  }
186
185
  catch (err) {
187
186
  throw new Error(`Could not verify share from participant ${share.j}. Verification error: ${err}`);
@@ -198,7 +197,7 @@ class Ecdsa {
198
197
  // Calculate new u values.
199
198
  const { shares: split_u, v } = Ecdsa.shamir.split(subkey.sk, pShare.t || 2, pShare.c || 3);
200
199
  // Calculate new signing key.
201
- const x = [split_u[pShare.i], ...nShares.map(({ u }) => crypto_2.hexToBigInt(u))].reduce(Ecdsa.curve.scalarAdd);
200
+ const x = [split_u[pShare.i], ...nShares.map(({ u }) => sdk_lib_mpc_1.hexToBigInt(u))].reduce(Ecdsa.curve.scalarAdd);
202
201
  const P_i = {
203
202
  i: pShare.i,
204
203
  l: pShare.l,
@@ -249,30 +248,20 @@ class Ecdsa {
249
248
  /**
250
249
  * Appends a given range proof challenge to the shares previously created
251
250
  * by #keyCombine. Generates a new challenge if not provided.
252
- * @param {XShare} xShare Private xShare of signer
253
- * @param {YShare} yShare YShare of the other participant involved in
254
- * this signing operation
251
+ * @param {XShare | YShare} share Private xShare or yShare of the signing operation
255
252
  * @param {EcdsaTypes.SerializedNtilde} challenge
256
- * @returns {KeyCombined} The new XShare and YShares with the amended
257
- * challenge values
253
+ * @returns {KeyCombined} The share with amended challenge values
258
254
  */
259
- async appendChallenge(xShare, yShare, challenge) {
255
+ async appendChallenge(share, challenge) {
260
256
  if (!challenge) {
261
257
  challenge = sdk_lib_mpc_1.EcdsaTypes.serializeNtilde(await sdk_lib_mpc_1.EcdsaRangeProof.generateNtilde(3072));
262
258
  }
263
259
  const { ntilde, h1, h2 } = challenge;
264
260
  return {
265
- xShare: { ...xShare, ntilde, h1, h2 },
266
- yShares: {
267
- [yShare.j]: {
268
- i: yShare.j,
269
- j: yShare.i,
270
- n: xShare.n,
271
- ntilde,
272
- h1,
273
- h2,
274
- },
275
- },
261
+ ...share,
262
+ ntilde,
263
+ h1,
264
+ h2,
276
265
  };
277
266
  }
278
267
  /**
@@ -283,19 +272,19 @@ class Ecdsa {
283
272
  * and k-share to be distributed to other participant signer
284
273
  */
285
274
  async signShare(xShare, yShare) {
286
- const pk = util_1.getPaillierPublicKey(crypto_2.hexToBigInt(xShare.n));
275
+ const pk = util_1.getPaillierPublicKey(sdk_lib_mpc_1.hexToBigInt(xShare.n));
287
276
  // Generate a challenge if ntilde is not present in the xShare.
288
277
  if (!hasNtilde(xShare)) {
289
- xShare = (await this.appendChallenge(xShare, yShare)).xShare;
278
+ xShare = await this.appendChallenge(xShare);
290
279
  }
291
280
  const k = Ecdsa.curve.scalarRandom();
292
- const rk = await sdk_lib_mpc_1.randomCoPrimeTo(pk.n);
281
+ const rk = await sdk_lib_mpc_1.randomPositiveCoPrimeTo(pk.n);
293
282
  const ck = pk.encrypt(k, rk);
294
283
  const gamma = Ecdsa.curve.scalarRandom();
295
284
  const d = Ecdsa.curve.scalarMult(Ecdsa.curve.scalarSub(BigInt(yShare.j), BigInt(xShare.i)), BigInt(xShare.i));
296
285
  const w = [
297
286
  Ecdsa.curve.scalarMult(BigInt(yShare.j), BigInt(xShare.i)),
298
- crypto_2.hexToBigInt(xShare['x']),
287
+ sdk_lib_mpc_1.hexToBigInt(xShare['x']),
299
288
  Ecdsa.curve.scalarInvert(d),
300
289
  ].reduce(Ecdsa.curve.scalarMult);
301
290
  const { ntilde: ntildea, h1: h1a, h2: h2a } = xShare;
@@ -318,9 +307,9 @@ class Ecdsa {
318
307
  };
319
308
  const { ntilde: ntildeb, h1: h1b, h2: h2b } = yShare;
320
309
  const proof = await sdk_lib_mpc_1.EcdsaRangeProof.prove(Ecdsa.curve, 3072, pk, {
321
- ntilde: crypto_2.hexToBigInt(ntildeb),
322
- h1: crypto_2.hexToBigInt(h1b),
323
- h2: crypto_2.hexToBigInt(h2b),
310
+ ntilde: sdk_lib_mpc_1.hexToBigInt(ntildeb),
311
+ h1: sdk_lib_mpc_1.hexToBigInt(h1b),
312
+ h2: sdk_lib_mpc_1.hexToBigInt(h2b),
324
313
  }, ck, k, rk);
325
314
  const proofShare = {
326
315
  z: util_1.bigIntToBufferBE(proof.z, 384).toString('hex'),
@@ -379,13 +368,13 @@ class Ecdsa {
379
368
  if (shareToBeSent.alpha) {
380
369
  const bShareParticipant = shareParticipant;
381
370
  const aShareToBeSent = shareToBeSent;
382
- const pka = util_1.getPaillierPublicKey(crypto_2.hexToBigInt(bShareParticipant.n));
371
+ const pka = util_1.getPaillierPublicKey(sdk_lib_mpc_1.hexToBigInt(bShareParticipant.n));
383
372
  let ntildea, h1a, h2a, ck;
384
373
  if (bShareParticipant.ntilde) {
385
- ntildea = crypto_2.hexToBigInt(bShareParticipant.ntilde);
386
- h1a = crypto_2.hexToBigInt(bShareParticipant.h1);
387
- h2a = crypto_2.hexToBigInt(bShareParticipant.h2);
388
- ck = crypto_2.hexToBigInt(bShareParticipant.ck);
374
+ ntildea = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.ntilde);
375
+ h1a = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.h1);
376
+ h2a = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.h2);
377
+ ck = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.ck);
389
378
  }
390
379
  // Verify $\gamma_i \in Z_{N^2}$.
391
380
  if (!sdk_lib_mpc_1.EcdsaRangeProof.verifyWithCheck(Ecdsa.curve, 3072, pka, {
@@ -393,18 +382,18 @@ class Ecdsa {
393
382
  h1: h1a,
394
383
  h2: h2a,
395
384
  }, {
396
- z: crypto_2.hexToBigInt(aShareToBeSent.gammaProof.z),
397
- zprm: crypto_2.hexToBigInt(aShareToBeSent.gammaProof.zprm),
398
- t: crypto_2.hexToBigInt(aShareToBeSent.gammaProof.t),
399
- v: crypto_2.hexToBigInt(aShareToBeSent.gammaProof.v),
400
- w: crypto_2.hexToBigInt(aShareToBeSent.gammaProof.w),
401
- s: crypto_2.hexToBigInt(aShareToBeSent.gammaProof.s),
402
- s1: crypto_2.hexToBigInt(aShareToBeSent.gammaProof.s1),
403
- s2: crypto_2.hexToBigInt(aShareToBeSent.gammaProof.s2),
404
- t1: crypto_2.hexToBigInt(aShareToBeSent.gammaProof.t1),
405
- t2: crypto_2.hexToBigInt(aShareToBeSent.gammaProof.t2),
406
- u: crypto_2.hexToBigInt(aShareToBeSent.gammaProof.u),
407
- }, ck, crypto_2.hexToBigInt(aShareToBeSent.alpha), crypto_2.hexToBigInt(aShareToBeSent.gammaProof.x))) {
385
+ z: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.z),
386
+ zprm: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.zprm),
387
+ t: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.t),
388
+ v: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.v),
389
+ w: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.w),
390
+ s: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.s),
391
+ s1: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.s1),
392
+ s2: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.s2),
393
+ t1: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.t1),
394
+ t2: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.t2),
395
+ u: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.u),
396
+ }, ck, sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.alpha), sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.x))) {
408
397
  throw new Error('could not verify signing share for gamma proof');
409
398
  }
410
399
  // Verify $\w_i \in Z_{N^2}$.
@@ -413,26 +402,26 @@ class Ecdsa {
413
402
  h1: h1a,
414
403
  h2: h2a,
415
404
  }, {
416
- z: crypto_2.hexToBigInt(aShareToBeSent.wProof.z),
417
- zprm: crypto_2.hexToBigInt(aShareToBeSent.wProof.zprm),
418
- t: crypto_2.hexToBigInt(aShareToBeSent.wProof.t),
419
- v: crypto_2.hexToBigInt(aShareToBeSent.wProof.v),
420
- w: crypto_2.hexToBigInt(aShareToBeSent.wProof.w),
421
- s: crypto_2.hexToBigInt(aShareToBeSent.wProof.s),
422
- s1: crypto_2.hexToBigInt(aShareToBeSent.wProof.s1),
423
- s2: crypto_2.hexToBigInt(aShareToBeSent.wProof.s2),
424
- t1: crypto_2.hexToBigInt(aShareToBeSent.wProof.t1),
425
- t2: crypto_2.hexToBigInt(aShareToBeSent.wProof.t2),
426
- u: crypto_2.hexToBigInt(aShareToBeSent.wProof.u),
427
- }, ck, crypto_2.hexToBigInt(aShareToBeSent.mu), crypto_2.hexToBigInt(aShareToBeSent.wProof.x))) {
405
+ z: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.z),
406
+ zprm: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.zprm),
407
+ t: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.t),
408
+ v: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.v),
409
+ w: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.w),
410
+ s: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.s),
411
+ s1: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.s1),
412
+ s2: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.s2),
413
+ t1: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.t1),
414
+ t2: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.t2),
415
+ u: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.u),
416
+ }, ck, sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.mu), sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.x))) {
428
417
  throw new Error('could not verify share for wProof');
429
418
  }
430
- const sk = new paillierBigint.PrivateKey(crypto_2.hexToBigInt(bShareParticipant.l), crypto_2.hexToBigInt(bShareParticipant.m), pka);
419
+ const sk = new paillierBigint.PrivateKey(sdk_lib_mpc_1.hexToBigInt(bShareParticipant.l), sdk_lib_mpc_1.hexToBigInt(bShareParticipant.m), pka);
431
420
  const gShareParticipant = shareParticipant;
432
421
  const muShareToBeSent = shareToBeSent;
433
- const alpha = sk.decrypt(crypto_2.hexToBigInt(aShareToBeSent.alpha));
422
+ const alpha = sk.decrypt(sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.alpha));
434
423
  gShareParticipant.alpha = util_1.bigIntToBufferBE(Ecdsa.curve.scalarReduce(alpha), 32).toString('hex');
435
- const mu = sk.decrypt(crypto_2.hexToBigInt(aShareToBeSent.mu)); // recheck encrypted number
424
+ const mu = sk.decrypt(sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.mu)); // recheck encrypted number
436
425
  gShareParticipant.mu = util_1.bigIntToBufferBE(Ecdsa.curve.scalarReduce(mu), 32).toString('hex');
437
426
  const partialShareParticipant = shareParticipant;
438
427
  const partialShareToBeSent = muShareToBeSent;
@@ -444,37 +433,37 @@ class Ecdsa {
444
433
  if (shareToBeSent.k) {
445
434
  const bShareParticipant = shareParticipant;
446
435
  const aShareToBeSent = shareToBeSent;
447
- const n = crypto_2.hexToBigInt(aShareToBeSent.n); // Paillier pub from other signer
436
+ const n = sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.n); // Paillier pub from other signer
448
437
  const pka = util_1.getPaillierPublicKey(n);
449
438
  let ntildea, h1a, h2a, ntildeb, h1b, h2b;
450
439
  if (aShareToBeSent.ntilde) {
451
- ntildea = crypto_2.hexToBigInt(aShareToBeSent.ntilde);
452
- h1a = crypto_2.hexToBigInt(aShareToBeSent.h1);
453
- h2a = crypto_2.hexToBigInt(aShareToBeSent.h2);
454
- ntildeb = crypto_2.hexToBigInt(bShareParticipant.ntilde);
455
- h1b = crypto_2.hexToBigInt(bShareParticipant.h1);
456
- h2b = crypto_2.hexToBigInt(bShareParticipant.h2);
440
+ ntildea = sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.ntilde);
441
+ h1a = sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.h1);
442
+ h2a = sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.h2);
443
+ ntildeb = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.ntilde);
444
+ h1b = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.h1);
445
+ h2b = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.h2);
457
446
  }
458
- const k = crypto_2.hexToBigInt(aShareToBeSent.k);
447
+ const k = sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.k);
459
448
  if (!sdk_lib_mpc_1.EcdsaRangeProof.verify(Ecdsa.curve, 3072, pka, {
460
449
  ntilde: ntildeb,
461
450
  h1: h1b,
462
451
  h2: h2b,
463
452
  }, {
464
- z: crypto_2.hexToBigInt(aShareToBeSent.proof.z),
465
- u: crypto_2.hexToBigInt(aShareToBeSent.proof.u),
466
- w: crypto_2.hexToBigInt(aShareToBeSent.proof.w),
467
- s: crypto_2.hexToBigInt(aShareToBeSent.proof.s),
468
- s1: crypto_2.hexToBigInt(aShareToBeSent.proof.s1),
469
- s2: crypto_2.hexToBigInt(aShareToBeSent.proof.s2),
453
+ z: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.proof.z),
454
+ u: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.proof.u),
455
+ w: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.proof.w),
456
+ s: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.proof.s),
457
+ s1: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.proof.s1),
458
+ s2: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.proof.s2),
470
459
  }, k)) {
471
460
  throw new Error('Could not verify signing A share proof');
472
461
  }
473
462
  // MtA $k_j, \gamma_i$.
474
463
  const beta0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
475
464
  bShareParticipant.beta = util_1.bigIntToBufferBE(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(beta0)), 32).toString('hex');
476
- const g = crypto_2.hexToBigInt(bShareParticipant.gamma);
477
- const rb = await sdk_lib_mpc_1.randomCoPrimeTo(pka.n);
465
+ const g = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.gamma);
466
+ const rb = await sdk_lib_mpc_1.randomPositiveCoPrimeTo(pka.n);
478
467
  const cb = pka.encrypt(beta0, rb);
479
468
  const alpha = pka.addition(pka.multiply(k, g), cb);
480
469
  aShareToBeSent.alpha = util_1.bigIntToBufferBE(alpha, 32).toString('hex');
@@ -504,8 +493,8 @@ class Ecdsa {
504
493
  // MtA $k_j, w_i$.
505
494
  const nu0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
506
495
  shareParticipant.nu = util_1.bigIntToBufferBE(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(nu0)), 32).toString('hex');
507
- const w = crypto_2.hexToBigInt(bShareParticipant.w);
508
- const rn = await sdk_lib_mpc_1.randomCoPrimeTo(pka.n);
496
+ const w = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.w);
497
+ const rn = await sdk_lib_mpc_1.randomPositiveCoPrimeTo(pka.n);
509
498
  const cn = pka.encrypt(nu0, rn);
510
499
  const mu = pka.addition(pka.multiply(k, w), cn);
511
500
  shareToBeSent.mu = util_1.bigIntToBufferBE(mu, 32).toString('hex');
@@ -515,7 +504,7 @@ class Ecdsa {
515
504
  ntilde: ntildea,
516
505
  h1: h1a,
517
506
  h2: h2a,
518
- }, k, crypto_2.hexToBigInt(aShareToBeSent.mu), w, nu0, rn, wx);
507
+ }, k, sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.mu), w, nu0, rn, wx);
519
508
  Object.assign(shareToBeSent, {
520
509
  wProof: {
521
510
  z: util_1.bigIntToBufferBE(proof.z, 384).toString('hex'),
@@ -589,13 +578,13 @@ class Ecdsa {
589
578
  signCombine(shares) {
590
579
  const gShare = shares.gShare;
591
580
  const S = shares.signIndex;
592
- const gamma = crypto_2.hexToBigInt(gShare.gamma);
593
- const alpha = crypto_2.hexToBigInt(gShare.alpha);
594
- const beta = crypto_2.hexToBigInt(gShare.beta);
595
- const mu = crypto_2.hexToBigInt(gShare.mu);
596
- const nu = crypto_2.hexToBigInt(gShare.nu);
597
- const k = crypto_2.hexToBigInt(gShare.k);
598
- const w = crypto_2.hexToBigInt(gShare.w);
581
+ const gamma = sdk_lib_mpc_1.hexToBigInt(gShare.gamma);
582
+ const alpha = sdk_lib_mpc_1.hexToBigInt(gShare.alpha);
583
+ const beta = sdk_lib_mpc_1.hexToBigInt(gShare.beta);
584
+ const mu = sdk_lib_mpc_1.hexToBigInt(gShare.mu);
585
+ const nu = sdk_lib_mpc_1.hexToBigInt(gShare.nu);
586
+ const k = sdk_lib_mpc_1.hexToBigInt(gShare.k);
587
+ const w = sdk_lib_mpc_1.hexToBigInt(gShare.w);
599
588
  const delta = Ecdsa.curve.scalarAdd(Ecdsa.curve.scalarMult(k, gamma), Ecdsa.curve.scalarAdd(alpha, beta));
600
589
  const omicron = Ecdsa.curve.scalarAdd(Ecdsa.curve.scalarMult(k, w), Ecdsa.curve.scalarAdd(mu, nu));
601
590
  const Gamma = Ecdsa.curve.basePointMult(gamma);
@@ -627,11 +616,11 @@ class Ecdsa {
627
616
  */
628
617
  sign(M, oShare, dShare, hash, shouldHash = true) {
629
618
  const m = shouldHash ? (hash || crypto_1.createHash('sha256')).update(M).digest() : M;
630
- const delta = Ecdsa.curve.scalarAdd(crypto_2.hexToBigInt(oShare.delta), crypto_2.hexToBigInt(dShare.delta));
631
- const R = Ecdsa.curve.pointMultiply(Ecdsa.curve.pointAdd(crypto_2.hexToBigInt(oShare.Gamma), crypto_2.hexToBigInt(dShare.Gamma)), Ecdsa.curve.scalarInvert(delta));
619
+ const delta = Ecdsa.curve.scalarAdd(sdk_lib_mpc_1.hexToBigInt(oShare.delta), sdk_lib_mpc_1.hexToBigInt(dShare.delta));
620
+ const R = Ecdsa.curve.pointMultiply(Ecdsa.curve.pointAdd(sdk_lib_mpc_1.hexToBigInt(oShare.Gamma), sdk_lib_mpc_1.hexToBigInt(dShare.Gamma)), Ecdsa.curve.scalarInvert(delta));
632
621
  const pointR = secp.Point.fromHex(util_1.bigIntToBufferBE(R, 32));
633
622
  const r = pointR.x;
634
- const s = Ecdsa.curve.scalarAdd(Ecdsa.curve.scalarMult(util_1.bigIntFromU8ABE(m), crypto_2.hexToBigInt(oShare.k)), Ecdsa.curve.scalarMult(r, crypto_2.hexToBigInt(oShare.omicron)));
623
+ const s = Ecdsa.curve.scalarAdd(Ecdsa.curve.scalarMult(util_1.bigIntFromU8ABE(m), sdk_lib_mpc_1.hexToBigInt(oShare.k)), Ecdsa.curve.scalarMult(r, sdk_lib_mpc_1.hexToBigInt(oShare.omicron)));
635
624
  return {
636
625
  i: oShare.i,
637
626
  y: oShare.y,
@@ -651,7 +640,7 @@ class Ecdsa {
651
640
  if (!isRMatching) {
652
641
  throw new Error('R value should be consistent across all shares');
653
642
  }
654
- let s = shares.map((share) => crypto_2.hexToBigInt(share['s'])).reduce(Ecdsa.curve.scalarAdd);
643
+ let s = shares.map((share) => sdk_lib_mpc_1.hexToBigInt(share['s'])).reduce(Ecdsa.curve.scalarAdd);
655
644
  const recid = (R.slice(0, 2) === '03' ? 1 : 0) ^ (s > Ecdsa.curve.order() / BigInt(2) ? 1 : 0);
656
645
  // Normalize s.
657
646
  s = s > Ecdsa.curve.order() / BigInt(2) ? Ecdsa.curve.order() - s : s;
@@ -674,9 +663,9 @@ class Ecdsa {
674
663
  const messageToVerify = shouldHash ? (hash || crypto_1.createHash('sha256')).update(message).digest() : message;
675
664
  return Ecdsa.curve.verify(messageToVerify, Buffer.concat([
676
665
  Buffer.from([signature['recid']]),
677
- util_1.bigIntToBufferBE(crypto_2.hexToBigInt(signature['r']), 32),
678
- util_1.bigIntToBufferBE(crypto_2.hexToBigInt(signature['s']), 32),
679
- ]), crypto_2.hexToBigInt(signature['y']));
666
+ util_1.bigIntToBufferBE(sdk_lib_mpc_1.hexToBigInt(signature['r']), 32),
667
+ util_1.bigIntToBufferBE(sdk_lib_mpc_1.hexToBigInt(signature['s']), 32),
668
+ ]), sdk_lib_mpc_1.hexToBigInt(signature['y']));
680
669
  }
681
670
  /**
682
671
  * Deserializes a challenge and it's proofs from hex strings to bigint
@@ -698,4 +687,4 @@ exports.default = Ecdsa;
698
687
  Ecdsa.curve = new curves_1.Secp256k1Curve();
699
688
  Ecdsa.hdTree = new hdTree_1.BIP32();
700
689
  Ecdsa.shamir = new shamir_1.default(Ecdsa.curve);
701
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYWNjb3VudC1saWIvbXBjL3Rzcy9lY2RzYS9lY2RzYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnRUFBa0Q7QUFDbEQsdUVBQXlEO0FBQ3pELHVEQUF5QztBQUN6Qyx5Q0FBNEQ7QUFDNUQsbUNBQXVEO0FBQ3ZELG1EQUE2QztBQUM3QyxpREFBbUQ7QUFDbkQscUNBQXlHO0FBQ3pHLHlDQUE4QztBQUM5QywwREFBa0M7QUFDbEMseURBQXVGO0FBNEJ2RixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFdEIsU0FBUyxTQUFTLENBQUMsS0FBc0I7SUFDdkMsT0FBTyxRQUFRLElBQUksS0FBSyxDQUFDO0FBQzNCLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQXFCLEtBQUs7SUFJeEI7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFhLEVBQUUsU0FBaUIsRUFBRSxTQUFpQixFQUFFLElBQWEsRUFBRSxJQUFJLEdBQUcsS0FBSzs7UUFDN0YsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksU0FBUyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ25GLE1BQU0seUJBQXlCLENBQUM7U0FDakM7UUFFRCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRTtZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7U0FDakU7UUFFRCxJQUFJLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUMvQixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRTtZQUM1QixrRUFBa0U7WUFDbEUsbUJBQW1CLEdBQUcsbUJBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDbEU7UUFFRCxrREFBa0Q7UUFDbEQsSUFBSSxlQUF1QyxDQUFDO1FBQzVDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxlQUFlLEdBQUcsTUFBTSxjQUFjLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3ZFO2FBQU07WUFDTCxlQUFlLEdBQUcsY0FBYyxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNyRTtRQUNELE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEdBQUcsZUFBZSxDQUFDO1FBQ2xELDBFQUEwRTtRQUMxRSxNQUFNLFNBQVMsR0FBRyxtQkFBbUIsSUFBSSxnQkFBSyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzdFLE1BQU0sQ0FBQyxHQUNMLE1BQUEsQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLFVBQVUsSUFBSSxzQkFBZSxDQUFDLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLG1DQUM1RixLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sU0FBUyxHQUFHLE1BQUEsQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxtQ0FBSSxvQkFBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLDJDQUEyQztRQUMzQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sa0JBQWtCLEdBQVc7WUFDakMsQ0FBQyxFQUFFLEtBQUs7WUFDUixDQUFDLEVBQUUsU0FBUztZQUNaLENBQUMsRUFBRSxTQUFTO1lBQ1osQ0FBQyxFQUFFLHVCQUFnQixDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUMzRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3ZELENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDckQsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQzFDLENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUN2RCxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRTtZQUNoQixTQUFTLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7U0FDckMsQ0FBQztRQUNGLE1BQU0sUUFBUSxHQUFhO1lBQ3pCLE1BQU0sRUFBRSxrQkFBa0I7WUFDMUIsT0FBTyxFQUFFLEVBQUU7U0FDWixDQUFDO1FBRUYsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUU7WUFDM0IsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLElBQUksZ0JBQWdCLEtBQUssS0FBSyxFQUFFO2dCQUM5QixRQUFRLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEdBQUc7b0JBQ25DLENBQUMsRUFBRSxnQkFBZ0I7b0JBQ25CLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxHQUFHLENBQUM7b0JBQzFCLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7b0JBQzNCLENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDMUMsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUM3QyxDQUFDLEVBQUUsdUJBQWdCLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDbEUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2lCQUMzQixDQUFDO2FBQ2I7U0FDRjtRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxVQUFVLENBQUMsTUFBYyxFQUFFLE9BQWlCO1FBQzFDLE1BQU0sU0FBUyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFDdkMsMEJBQTBCO1FBQzFCLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLG9CQUFXLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRyxvQkFBb0I7UUFDcEIsTUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsb0JBQVcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXRHLGlCQUFpQjtRQUNqQixLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRTtZQUMzQixJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQ1gsSUFBSTtvQkFDRixLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxvQkFBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLG9CQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLG9CQUFXLENBQUMsS0FBSyxDQUFDLENBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNwRztnQkFBQyxPQUFPLEdBQUcsRUFBRTtvQkFDWixNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxLQUFLLENBQUMsQ0FBQyx5QkFBeUIsR0FBRyxFQUFFLENBQUMsQ0FBQztpQkFDbkc7YUFDRjtTQUNGO1FBRUQsb0ZBQW9GO1FBQ3BGLE1BQU0sVUFBVSxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMseUJBQWtCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xILE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQ2pDLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQ2pCLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxzRUFBc0UsQ0FBQyxDQUFDLFFBQVE7U0FDOUcsQ0FBQztRQUVGLE1BQU0sWUFBWSxHQUFnQjtZQUNoQyxNQUFNLEVBQUU7Z0JBQ04sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNYLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDWCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ1gsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNYLENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztnQkFDMUMsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUMxQyxTQUFTLEVBQUUsdUJBQWdCLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7YUFDM0Q7WUFDRCxPQUFPLEVBQUUsRUFBRTtTQUNaLENBQUM7UUFFRixLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRTtZQUMzQixNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QyxZQUFZLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEdBQUc7Z0JBQ3ZDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDWCxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDdEIsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUM7YUFDdkIsQ0FBQztTQUNIO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxTQUFTLENBQUMsTUFBYyxFQUFFLE9BQWlCLEVBQUUsSUFBWTtRQUN2RCxNQUFNLE9BQU8sR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsb0JBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRSxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbkYsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1QixJQUFJLGdCQUFnQixHQUFHLG9CQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sVUFBVSxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsb0JBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakcsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxHQUFHLHNCQUFhLENBQUMsQ0FBQztRQUUzRixpQkFBaUI7UUFDakIsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUU7WUFDM0IsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNYLElBQUk7b0JBQ0YsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsb0JBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxvQkFBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxvQkFBVyxDQUFDLEtBQUssQ0FBQyxDQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEc7Z0JBQUMsT0FBTyxHQUFHLEVBQUU7b0JBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsS0FBSyxDQUFDLENBQUMseUJBQXlCLEdBQUcsRUFBRSxDQUFDLENBQUM7aUJBQ25HO2FBQ0Y7U0FDRjtRQUVELGlCQUFpQjtRQUNqQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUU3RSx5Q0FBeUM7UUFDekMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXRELHdDQUF3QztRQUN4QyxNQUFNLGNBQWMsR0FBRyxDQUFDLHNCQUFhLEdBQUcsTUFBTSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsR0FBRyxzQkFBYSxDQUFDO1FBQ3RGLGdCQUFnQixHQUFHLENBQUMsZ0JBQWdCLEdBQUcsY0FBYyxDQUFDLEdBQUcsc0JBQWEsQ0FBQztRQUV2RSwwQkFBMEI7UUFDMUIsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRTNGLDZCQUE2QjtRQUM3QixNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsb0JBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFdkcsTUFBTSxHQUFHLEdBQVc7WUFDbEIsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ1gsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ1gsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ1gsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ1gsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNsRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDMUMsU0FBUyxFQUFFLHVCQUFnQixDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztTQUNsRSxDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQWdCO1lBQzFCLE1BQU0sRUFBRSxHQUFHO1lBQ1gsT0FBTyxFQUFFLEVBQUU7U0FDWixDQUFDO1FBRUYsS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDN0MsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHO2dCQUN0QixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ1IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNSLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDUixDQUFDLEVBQUUsdUJBQWdCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUN2RCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQ2pELENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztnQkFDN0MsU0FBUyxFQUFFLHVCQUFnQixDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7YUFDbEUsQ0FBQztTQUNIO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGdCQUFnQixDQUFDLGNBQXNCLEVBQUUsSUFBWTtRQUNuRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQztTQUNuRTtRQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXBELE1BQU0scUJBQXFCLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQ3JEO1lBQ0UsRUFBRSxFQUFFLHlCQUFrQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLFNBQVMsRUFBRSx5QkFBa0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2xELEVBQ0QsSUFBSSxDQUNMLENBQUM7UUFFRixNQUFNLFNBQVMsR0FBRyx1QkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pGLE1BQU0sZ0JBQWdCLEdBQUcsdUJBQWdCLENBQUMscUJBQXFCLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUvRixPQUFPLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLGVBQWUsQ0FDbkIsTUFBYyxFQUNkLE1BQWMsRUFDZCxTQUF1QztRQUV2QyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2QsU0FBUyxHQUFHLHdCQUFVLENBQUMsZUFBZSxDQUFDLE1BQU0sNkJBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUNwRjtRQUNELE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLFNBQVMsQ0FBQztRQUNyQyxPQUFPO1lBQ0wsTUFBTSxFQUFFLEVBQUUsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDckMsT0FBTyxFQUFFO2dCQUNQLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNWLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDWCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7b0JBQ1gsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO29CQUNYLE1BQU07b0JBQ04sRUFBRTtvQkFDRixFQUFFO2lCQUNIO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBaUMsRUFBRSxNQUF3QjtRQUN6RSxNQUFNLEVBQUUsR0FBRywyQkFBb0IsQ0FBQyxvQkFBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXZELCtEQUErRDtRQUMvRCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3RCLE1BQU0sR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7U0FDOUQ7UUFFRCxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3JDLE1BQU0sRUFBRSxHQUFHLE1BQU0sNkJBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDN0IsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUV6QyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFOUcsTUFBTSxDQUFDLEdBQUc7WUFDUixLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUQsb0JBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEIsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1NBQzVCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFakMsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsTUFBMEIsQ0FBQztRQUV6RSxNQUFNLE9BQU8sR0FBZ0I7WUFDM0IsTUFBTSxFQUFFO2dCQUNOLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDWCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ1gsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNYLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDWCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ1gsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsRUFBRSxFQUFFLEdBQUc7Z0JBQ1AsRUFBRSxFQUFFLEdBQUc7Z0JBQ1AsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUMxQyxFQUFFLEVBQUUsdUJBQWdCLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQzdDLENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztnQkFDMUMsS0FBSyxFQUFFLHVCQUFnQixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2FBQ25EO1lBQ0QsTUFBTSxFQUFFLEVBQVk7U0FDckIsQ0FBQztRQUVGLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUNyRCxNQUFNLEtBQUssR0FBRyxNQUFNLDZCQUFlLENBQUMsS0FBSyxDQUN2QyxLQUFLLENBQUMsS0FBSyxFQUNYLElBQUksRUFDSixFQUFFLEVBQ0Y7WUFDRSxNQUFNLEVBQUUsb0JBQVcsQ0FBQyxPQUFPLENBQUM7WUFDNUIsRUFBRSxFQUFFLG9CQUFXLENBQUMsR0FBRyxDQUFDO1lBQ3BCLEVBQUUsRUFBRSxvQkFBVyxDQUFDLEdBQUcsQ0FBQztTQUNyQixFQUNELEVBQUUsRUFDRixDQUFDLEVBQ0QsRUFBRSxDQUNILENBQUM7UUFDRixNQUFNLFVBQVUsR0FBRztZQUNqQixDQUFDLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ2pELENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDakQsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNqRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ2pELEVBQUUsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDbEQsRUFBRSxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztTQUNwRCxDQUFDO1FBRUYsT0FBTyxDQUFDLE1BQU0sR0FBRztZQUNmLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNYLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNYLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDcEIsTUFBTSxFQUFFLE9BQU87WUFDZixFQUFFLEVBQUUsR0FBRztZQUNQLEVBQUUsRUFBRSxHQUFHO1lBQ1AsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQzVDLEtBQUssRUFBRSxVQUFVO1NBQ2xCLENBQUM7UUFFRixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQW1CO1FBQ25DLElBQUksZ0JBQW1ELEVBQUUsYUFBd0MsQ0FBQztRQUNsRyxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxNQUFNLEdBQW9CLEVBQUUsQ0FBQztRQUNqQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQ25ELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxtQ0FBbUM7WUFDakUsTUFBTSxNQUFNLEdBQUc7Z0JBQ2IsR0FBRyxNQUFNLENBQUMsTUFBTTtnQkFDaEIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTTtnQkFDNUIsRUFBRSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDcEIsRUFBRSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTthQUNyQixDQUFDO1lBQ0YsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN2RCxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUMxQixhQUFhLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQXFCLENBQUM7WUFDeEQsZ0JBQWdCLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQXFCLENBQUM7U0FDL0Q7YUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNoRixZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLGFBQWEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBYyxDQUFDLENBQUMsQ0FBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBYyxDQUFDO1lBQ3ZHLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFzQixDQUFDLENBQUMsQ0FBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBYSxDQUFDO1NBQ2pIO2FBQU07WUFDTCxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7U0FDcEQ7UUFDRCxJQUFJLGdCQUFnQixDQUFDLENBQUMsS0FBSyxhQUFhLENBQUMsQ0FBQyxFQUFFO1lBQzFDLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztTQUNqRDtRQUNELElBQUssYUFBd0IsQ0FBQyxLQUFLLEVBQUU7WUFDbkMsTUFBTSxpQkFBaUIsR0FBRyxnQkFBMEIsQ0FBQztZQUNyRCxNQUFNLGNBQWMsR0FBRyxhQUF1QixDQUFDO1lBQy9DLE1BQU0sR0FBRyxHQUFHLDJCQUFvQixDQUFDLG9CQUFXLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuRSxJQUFJLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUMxQixJQUFJLGlCQUFpQixDQUFDLE1BQU0sRUFBRTtnQkFDNUIsT0FBTyxHQUFHLG9CQUFXLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2hELEdBQUcsR0FBRyxvQkFBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN4QyxHQUFHLEdBQUcsb0JBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDeEMsRUFBRSxHQUFHLG9CQUFXLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDeEM7WUFDRCxpQ0FBaUM7WUFDakMsSUFDRSxDQUFDLDZCQUFlLENBQUMsZUFBZSxDQUM5QixLQUFLLENBQUMsS0FBSyxFQUNYLElBQUksRUFDSixHQUFHLEVBQ0g7Z0JBQ0UsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsRUFBRSxFQUFFLEdBQUc7Z0JBQ1AsRUFBRSxFQUFFLEdBQUc7YUFDUixFQUNEO2dCQUNFLENBQUMsRUFBRSxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxJQUFJLEVBQUUsb0JBQVcsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztnQkFDakQsQ0FBQyxFQUFFLG9CQUFXLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLENBQUMsRUFBRSxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxDQUFDLEVBQUUsb0JBQVcsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDM0MsQ0FBQyxFQUFFLG9CQUFXLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLEVBQUUsRUFBRSxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUM3QyxFQUFFLEVBQUUsb0JBQVcsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDN0MsRUFBRSxFQUFFLG9CQUFXLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQzdDLEVBQUUsRUFBRSxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUM3QyxDQUFDLEVBQUUsb0JBQVcsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQzthQUM1QyxFQUNELEVBQUUsRUFDRixvQkFBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFDakMsb0JBQVcsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUN6QyxFQUNEO2dCQUNBLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQzthQUNuRTtZQUNELDZCQUE2QjtZQUM3QixJQUNFLENBQUMsNkJBQWUsQ0FBQyxlQUFlLENBQzlCLEtBQUssQ0FBQyxLQUFLLEVBQ1gsSUFBSSxFQUNKLEdBQUcsRUFDSDtnQkFDRSxNQUFNLEVBQUUsT0FBTztnQkFDZixFQUFFLEVBQUUsR0FBRztnQkFDUCxFQUFFLEVBQUUsR0FBRzthQUNSLEVBQ0Q7Z0JBQ0UsQ0FBQyxFQUFFLG9CQUFXLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksRUFBRSxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUM3QyxDQUFDLEVBQUUsb0JBQVcsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDdkMsQ0FBQyxFQUFFLG9CQUFXLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLENBQUMsRUFBRSxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxDQUFDLEVBQUUsb0JBQVcsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDdkMsRUFBRSxFQUFFLG9CQUFXLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ3pDLEVBQUUsRUFBRSxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUN6QyxFQUFFLEVBQUUsb0JBQVcsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDekMsRUFBRSxFQUFFLG9CQUFXLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ3pDLENBQUMsRUFBRSxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2FBQ3hDLEVBQ0QsRUFBRSxFQUNGLG9CQUFXLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxFQUM5QixvQkFBVyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQ3JDLEVBQ0Q7Z0JBQ0EsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO2FBQ3REO1lBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxjQUFjLENBQUMsVUFBVSxDQUN0QyxvQkFBVyxDQUFDLGlCQUFpQixDQUFDLENBQVcsQ0FBQyxFQUMxQyxvQkFBVyxDQUFDLGlCQUFpQixDQUFDLENBQVcsQ0FBQyxFQUMxQyxHQUFHLENBQ0osQ0FBQztZQUNGLE1BQU0saUJBQWlCLEdBQUcsZ0JBQTBCLENBQUM7WUFDckQsTUFBTSxlQUFlLEdBQUcsYUFBd0IsQ0FBQztZQUNqRCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLG9CQUFXLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDNUQsaUJBQWlCLENBQUMsS0FBSyxHQUFHLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoRyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLG9CQUFXLENBQUMsY0FBYyxDQUFDLEVBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQywyQkFBMkI7WUFDNUYsaUJBQWlCLENBQUMsRUFBRSxHQUFHLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxRixNQUFNLHVCQUF1QixHQUFHLGdCQUFtQyxDQUFDO1lBQ3BFLE1BQU0sb0JBQW9CLEdBQUcsZUFBbUMsQ0FBQztZQUNqRSxPQUFPLHVCQUF1QixDQUFDLENBQUMsQ0FBQztZQUNqQyxPQUFPLHVCQUF1QixDQUFDLENBQUMsQ0FBQztZQUNqQyxPQUFPLG9CQUFvQixDQUFDLEtBQUssQ0FBQztZQUNsQyxPQUFPLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztTQUNoQztRQUNELElBQUssYUFBd0IsQ0FBQyxDQUFDLEVBQUU7WUFDL0IsTUFBTSxpQkFBaUIsR0FBRyxnQkFBMEIsQ0FBQztZQUNyRCxNQUFNLGNBQWMsR0FBRyxhQUF1QixDQUFDO1lBQy9DLE1BQU0sQ0FBQyxHQUFHLG9CQUFXLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUNBQWlDO1lBQzFFLE1BQU0sR0FBRyxHQUFHLDJCQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLElBQUksT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7WUFDekMsSUFBSSxjQUFjLENBQUMsTUFBTSxFQUFFO2dCQUN6QixPQUFPLEdBQUcsb0JBQVcsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzdDLEdBQUcsR0FBRyxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDckMsR0FBRyxHQUFHLG9CQUFXLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNyQyxPQUFPLEdBQUcsb0JBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDaEQsR0FBRyxHQUFHLG9CQUFXLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3hDLEdBQUcsR0FBRyxvQkFBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ3pDO1lBQ0QsTUFBTSxDQUFDLEdBQUcsb0JBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsSUFDRSxDQUFDLDZCQUFlLENBQUMsTUFBTSxDQUNyQixLQUFLLENBQUMsS0FBSyxFQUNYLElBQUksRUFDSixHQUFHLEVBQ0g7Z0JBQ0UsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsRUFBRSxFQUFFLEdBQUc7Z0JBQ1AsRUFBRSxFQUFFLEdBQUc7YUFDUixFQUNEO2dCQUNFLENBQUMsRUFBRSxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxDQUFDLEVBQUUsb0JBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsQ0FBQyxFQUFFLG9CQUFXLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLENBQUMsRUFBRSxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxFQUFFLEVBQUUsb0JBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsRUFBRSxFQUFFLG9CQUFXLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7YUFDekMsRUFDRCxDQUFDLENBQ0YsRUFDRDtnQkFDQSxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7YUFDM0Q7WUFDRCx1QkFBdUI7WUFDdkIsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUM7WUFDeEUsaUJBQWlCLENBQUMsSUFBSSxHQUFHLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUMvRyxLQUFLLENBQ04sQ0FBQztZQUNGLE1BQU0sQ0FBQyxHQUFHLG9CQUFXLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0MsTUFBTSxFQUFFLEdBQUcsTUFBTSw2QkFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNsQyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELGNBQWMsQ0FBQyxLQUFLLEdBQUcsdUJBQWdCLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuRSxnQ0FBZ0M7WUFDaEMsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsSUFBSSxLQUFLLEdBQUcsTUFBTSw2QkFBZSxDQUFDLGNBQWMsQ0FDOUMsS0FBSyxDQUFDLEtBQUssRUFDWCxJQUFJLEVBQ0osR0FBRyxFQUNIO2dCQUNFLE1BQU0sRUFBRSxPQUFPO2dCQUNmLEVBQUUsRUFBRSxHQUFHO2dCQUNQLEVBQUUsRUFBRSxHQUFHO2FBQ1IsRUFDRCxDQUFDLEVBQ0QsS0FBSyxFQUNMLENBQUMsRUFDRCxLQUFLLEVBQ0wsRUFBRSxFQUNGLEVBQUUsQ0FDSCxDQUFDO1lBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUU7Z0JBQzVCLFVBQVUsRUFBRTtvQkFDVixDQUFDLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNqRCxJQUFJLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUN2RCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNqRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNqRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNqRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNqRCxFQUFFLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNsRCxFQUFFLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNuRCxFQUFFLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNuRCxFQUFFLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNuRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNoRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7aUJBQzVDO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsa0JBQWtCO1lBQ2xCLE1BQU0sR0FBRyxHQUFHLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ3RFLGdCQUFnQixDQUFDLEVBQUUsR0FBRyx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FDMUcsS0FBSyxDQUNOLENBQUM7WUFDRixNQUFNLENBQUMsR0FBRyxvQkFBVyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sRUFBRSxHQUFHLE1BQU0sNkJBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDaEMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoRCxhQUFhLENBQUMsRUFBRSxHQUFHLHVCQUFnQixDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUQsNEJBQTRCO1lBQzVCLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLEtBQUssR0FBRyxNQUFNLDZCQUFlLENBQUMsY0FBYyxDQUMxQyxLQUFLLENBQUMsS0FBSyxFQUNYLElBQUksRUFDSixHQUFHLEVBQ0g7Z0JBQ0UsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsRUFBRSxFQUFFLEdBQUc7Z0JBQ1AsRUFBRSxFQUFFLEdBQUc7YUFDUixFQUNELENBQUMsRUFDRCxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsRUFDOUIsQ0FBQyxFQUNELEdBQUcsRUFDSCxFQUFFLEVBQ0YsRUFBRSxDQUNILENBQUM7WUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRTtnQkFDM0IsTUFBTSxFQUFFO29CQUNOLENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ2pELElBQUksRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ3ZELENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ2pELENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ2pELENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ2pELENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ2pELEVBQUUsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ2xELEVBQUUsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ25ELEVBQUUsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ25ELEVBQUUsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENB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eEJILHdCQXF4QkM7QUFweEJRLFdBQUssR0FBbUIsSUFBSSx1QkFBYyxFQUFFLENBQUM7QUFDN0MsWUFBTSxHQUFXLElBQUksY0FBSyxFQUFFLENBQUM7QUFDN0IsWUFBTSxHQUFXLElBQUksZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYWlsbGllckJpZ2ludCBmcm9tICdwYWlsbGllci1iaWdpbnQnO1xuaW1wb3J0ICogYXMgYmlnaW50Q3J5cHRvVXRpbHMgZnJvbSAnYmlnaW50LWNyeXB0by11dGlscyc7XG5pbXBvcnQgKiBhcyBzZWNwIGZyb20gJ0Bub2JsZS9zZWNwMjU2azEnO1xuaW1wb3J0IEhEVHJlZSwgeyBCSVAzMiwgY2hhaW5jb2RlQmFzZSB9IGZyb20gJy4uLy4uL2hkVHJlZSc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoLCBIYXNoLCByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IGhleFRvQmlnSW50IH0gZnJvbSAnLi4vLi4vLi4vdXRpbC9jcnlwdG8nO1xuaW1wb3J0IHsgYmlnSW50RnJvbUJ1ZmZlckJFLCBiaWdJbnRGcm9tVThBQkUsIGJpZ0ludFRvQnVmZmVyQkUsIGdldFBhaWxsaWVyUHVibGljS2V5IH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBTZWNwMjU2azFDdXJ2ZSB9IGZyb20gJy4uLy4uL2N1cnZlcyc7XG5pbXBvcnQgU2hhbWlyIGZyb20gJy4uLy4uL3NoYW1pcic7XG5pbXBvcnQgeyBFY2RzYVJhbmdlUHJvb2YsIEVjZHNhVHlwZXMsIHJhbmRvbUNvUHJpbWVUbyB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItbXBjJztcbmltcG9ydCB7XG4gIEFTaGFyZSxcbiAgQlNoYXJlLFxuICBEU2hhcmUsXG4gIEdTaGFyZSxcbiAgS2V5Q29tYmluZWQsXG4gIEtleUNvbWJpbmVkV2l0aE50aWxkZSxcbiAgS2V5U2hhcmUsXG4gIEtTaGFyZSxcbiAgTVVTaGFyZSxcbiAgTlNoYXJlLFxuICBPU2hhcmUsXG4gIFBTaGFyZSxcbiAgU2lnbmF0dXJlLFxuICBTaWduQ29tYmluZSxcbiAgU2lnbkNvbWJpbmVSVCxcbiAgU2lnbkNvbnZlcnQsXG4gIFNpZ25Db252ZXJ0UlQsXG4gIFNpZ25TaGFyZVJULFxuICBTU2hhcmUsXG4gIFN1YmtleVNoYXJlLFxuICBYU2hhcmUsXG4gIFhTaGFyZVdpdGhOdGlsZGUsXG4gIFlTaGFyZSxcbiAgWVNoYXJlV2l0aE50aWxkZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IF81biA9IEJpZ0ludCg1KTtcblxuZnVuY3Rpb24gaGFzTnRpbGRlKHNoYXJlOiBYU2hhcmUgfCBZU2hhcmUpOiBzaGFyZSBpcyBYU2hhcmVXaXRoTnRpbGRlIHwgWVNoYXJlV2l0aE50aWxkZSB7XG4gIHJldHVybiAnbnRpbGRlJyBpbiBzaGFyZTtcbn1cblxuLyoqXG4gKiBFQ0RTQSBUU1MgaW1wbGVtZW50YXRpb24gc3VwcG9ydGluZyAyOm4gVGhyZXNob2xkXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVjZHNhIHtcbiAgc3RhdGljIGN1cnZlOiBTZWNwMjU2azFDdXJ2ZSA9IG5ldyBTZWNwMjU2azFDdXJ2ZSgpO1xuICBzdGF0aWMgaGRUcmVlOiBIRFRyZWUgPSBuZXcgQklQMzIoKTtcbiAgc3RhdGljIHNoYW1pcjogU2hhbWlyID0gbmV3IFNoYW1pcihFY2RzYS5jdXJ2ZSk7XG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBzaGFyZXMgZm9yIHBhcnRpY2lwYW50IGF0IGluZGV4IGFuZCBzcGxpdCBrZXlzIGAodGhyZXNob2xkLG51bVNoYXJlcylgIHdheXMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBwYXJ0aWNpcGFudCBpbmRleFxuICAgKiBAcGFyYW0ge251bWJlcn0gdGhyZXNob2xkIFNpZ25pbmcgdGhyZXNob2xkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBudW1TaGFyZXMgIE51bWJlciBvZiBzaGFyZXNcbiAgICogQHBhcmFtIHtCdWZmZXJ9IHNlZWQgb3B0aW9uYWwgNjQgYnl0ZSBzZWVkIHRvIHVzZSBmb3Iga2V5IGdlbmVyYXRpb25cbiAgICogQHBhcmFtIHtCb29sZWFufSBzeW5jIG9wdGlvbmFsIHN5bmMgZmxhZywgaWYgdHJ1ZSB0aGVuIGEgc3luY2hyb25vdXMgdmVyc2lvbiBvZiBQYWlsbGllciBrZXkgZ2VuZXJhdGlvbiBpcyB1c2VkIHRoYXQgZG9lcyBub3Qgc3Bhd24gV29ya2VyIHRocmVhZHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEtleVNoYXJlPn0gUmV0dXJucyB0aGUgcHJpdmF0ZSBwLXNoYXJlXG4gICAqIGFuZCBuLXNoYXJlcyB0byBiZSBkaXN0cmlidXRlZCB0byBwYXJ0aWNpcGFudHMgYXQgdGhlaXIgY29ycmVzcG9uZGluZyBpbmRleC5cbiAgICovXG4gIGFzeW5jIGtleVNoYXJlKGluZGV4OiBudW1iZXIsIHRocmVzaG9sZDogbnVtYmVyLCBudW1TaGFyZXM6IG51bWJlciwgc2VlZD86IEJ1ZmZlciwgc3luYyA9IGZhbHNlKTogUHJvbWlzZTxLZXlTaGFyZT4ge1xuICAgIGlmICghKGluZGV4ID4gMCAmJiBpbmRleCA8PSBudW1TaGFyZXMgJiYgdGhyZXNob2xkIDw9IG51bVNoYXJlcyAmJiB0aHJlc2hvbGQgPT09IDIpKSB7XG4gICAgICB0aHJvdyAnSW52YWxpZCBLZXlTaGFyZSBDb25maWcnO1xuICAgIH1cblxuICAgIGlmIChzZWVkICYmIHNlZWQubGVuZ3RoIDwgNjQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2VlZCBtdXN0IGhhdmUgYSBsZW5ndGggb2YgYXQgbGVhc3QgNjQgYnl0ZXMnKTtcbiAgICB9XG5cbiAgICBsZXQgc2VlZFdpdGhWYWxpZExlbmd0aCA9IHNlZWQ7XG4gICAgaWYgKHNlZWQgJiYgc2VlZC5sZW5ndGggPiA2NCkge1xuICAgICAgLy8gaWYgc2VlZCBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIDY0IGJ5dGVzLCBoYXNoIHNlZWQgdG8gNjQgYnl0ZXMuXG4gICAgICBzZWVkV2l0aFZhbGlkTGVuZ3RoID0gY3JlYXRlSGFzaCgnc2hhNTEyJykudXBkYXRlKHNlZWQpLmRpZ2VzdCgpO1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlIGFkZGl0aXZlbHkgaG9tb21vcnBoaWMgZW5jcnlwdGlvbiBrZXkuXG4gICAgbGV0IHBhaWxsaWVyS2V5UGFpcjogcGFpbGxpZXJCaWdpbnQuS2V5UGFpcjtcbiAgICBpZiAoIXN5bmMpIHtcbiAgICAgIHBhaWxsaWVyS2V5UGFpciA9IGF3YWl0IHBhaWxsaWVyQmlnaW50LmdlbmVyYXRlUmFuZG9tS2V5cygzMDcyLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFpbGxpZXJLZXlQYWlyID0gcGFpbGxpZXJCaWdpbnQuZ2VuZXJhdGVSYW5kb21LZXlzU3luYygzMDcyLCB0cnVlKTtcbiAgICB9XG4gICAgY29uc3QgeyBwdWJsaWNLZXksIHByaXZhdGVLZXkgfSA9IHBhaWxsaWVyS2V5UGFpcjtcbiAgICAvLyBBY2NlcHQgYSA2NCBieXRlIHNlZWQgYW5kIGNyZWF0ZSBhbiBleHRlbmRlZCBwcml2YXRlIGtleSBmcm9tIHRoYXQgc2VlZFxuICAgIGNvbnN0IHNlY3JldEtleSA9IHNlZWRXaXRoVmFsaWRMZW5ndGggJiYgYmlwMzIuZnJvbVNlZWQoc2VlZFdpdGhWYWxpZExlbmd0aCk7XG4gICAgY29uc3QgdSA9XG4gICAgICAoc2VjcmV0S2V5ICYmIHNlY3JldEtleS5wcml2YXRlS2V5ICYmIGJpZ0ludEZyb21VOEFCRShuZXcgVWludDhBcnJheShzZWNyZXRLZXkucHJpdmF0ZUtleSkpKSA/P1xuICAgICAgRWNkc2EuY3VydmUuc2NhbGFyUmFuZG9tKCk7XG4gICAgY29uc3QgeSA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQodSk7XG4gICAgY29uc3QgY2hhaW5jb2RlID0gKHNlY3JldEtleSAmJiBzZWNyZXRLZXkuY2hhaW5Db2RlKSA/PyByYW5kb21CeXRlcygzMik7XG4gICAgLy8gQ29tcHV0ZSBzZWNyZXQgc2hhcmVzIG9mIHRoZSBwcml2YXRlIGtleVxuICAgIGNvbnN0IHsgc2hhcmVzOiB1U2hhcmVzLCB2IH0gPSBFY2RzYS5zaGFtaXIuc3BsaXQodSwgdGhyZXNob2xkLCBudW1TaGFyZXMpO1xuICAgIGNvbnN0IGN1cnJlbnRQYXJ0aWNpcGFudDogUFNoYXJlID0ge1xuICAgICAgaTogaW5kZXgsXG4gICAgICB0OiB0aHJlc2hvbGQsXG4gICAgICBjOiBudW1TaGFyZXMsXG4gICAgICBsOiBiaWdJbnRUb0J1ZmZlckJFKHByaXZhdGVLZXkubGFtYmRhLCAxOTIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIG06IGJpZ0ludFRvQnVmZmVyQkUocHJpdmF0ZUtleS5tdSwgMTkyKS50b1N0cmluZygnaGV4JyksXG4gICAgICBuOiBiaWdJbnRUb0J1ZmZlckJFKHB1YmxpY0tleS5uLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHk6IGJpZ0ludFRvQnVmZmVyQkUoeSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUodVNoYXJlc1tpbmRleF0sIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICB1dTogdS50b1N0cmluZygpLFxuICAgICAgY2hhaW5jb2RlOiBjaGFpbmNvZGUudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG4gICAgY29uc3Qga2V5U2hhcmU6IEtleVNoYXJlID0ge1xuICAgICAgcFNoYXJlOiBjdXJyZW50UGFydGljaXBhbnQsXG4gICAgICBuU2hhcmVzOiB7fSxcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBzaGFyZSBpbiB1U2hhcmVzKSB7XG4gICAgICBjb25zdCBwYXJ0aWNpcGFudEluZGV4ID0gcGFyc2VJbnQoc2hhcmUsIDEwKTtcbiAgICAgIGlmIChwYXJ0aWNpcGFudEluZGV4ICE9PSBpbmRleCkge1xuICAgICAgICBrZXlTaGFyZS5uU2hhcmVzW3BhcnRpY2lwYW50SW5kZXhdID0ge1xuICAgICAgICAgIGk6IHBhcnRpY2lwYW50SW5kZXgsXG4gICAgICAgICAgajogY3VycmVudFBhcnRpY2lwYW50WydpJ10sXG4gICAgICAgICAgbjogcHVibGljS2V5Lm4udG9TdHJpbmcoMTYpLFxuICAgICAgICAgIHk6IGJpZ0ludFRvQnVmZmVyQkUoeSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB2OiBiaWdJbnRUb0J1ZmZlckJFKHZbMF0sIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdTogYmlnSW50VG9CdWZmZXJCRSh1U2hhcmVzW3BhcnRpY2lwYW50SW5kZXhdLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIGNoYWluY29kZTogY2hhaW5jb2RlLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfSBhcyBOU2hhcmU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBrZXlTaGFyZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21iaW5lIGRhdGEgc2hhcmVkIGR1cmluZyB0aGUga2V5IGdlbmVyYXRpb24gcHJvdG9jb2wuXG4gICAqIEBwYXJhbSB7S2V5U2hhcmV9IHBhcnRpY2lwYW50U2hhcmVzIHByaXZhdGUgcC1zaGFyZSBhbmRcbiAgICogbi1zaGFyZXMgcmVjZWl2ZWQgZnJvbSBhbGwgb3RoZXIgcGFydGljaXBhbnRzLlxuICAgKiBAcmV0dXJucyB7S2V5Q29tYmluZWR9IFJldHVybnMgdGhlIHBhcnRpY2lwYW50IHByaXZhdGUgeC1zaGFyZVxuICAgKiBhbmQgeS1zaGFyZXMgdG8gYmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcgc2lnbmluZyBzaGFyZXMuXG4gICAqL1xuICBrZXlDb21iaW5lKHBTaGFyZTogUFNoYXJlLCBuU2hhcmVzOiBOU2hhcmVbXSk6IEtleUNvbWJpbmVkIHtcbiAgICBjb25zdCBhbGxTaGFyZXMgPSBbcFNoYXJlLCAuLi5uU2hhcmVzXTtcbiAgICAvLyBDb21wdXRlIHRoZSBwdWJsaWMga2V5LlxuICAgIGNvbnN0IHkgPSBhbGxTaGFyZXMubWFwKChwYXJ0aWNpcGFudCkgPT4gaGV4VG9CaWdJbnQocGFydGljaXBhbnRbJ3knXSkpLnJlZHVjZShFY2RzYS5jdXJ2ZS5wb2ludEFkZCk7XG4gICAgLy8gQWRkIHNlY3JldCBzaGFyZXNcbiAgICBjb25zdCB4ID0gYWxsU2hhcmVzLm1hcCgocGFydGljaXBhbnQpID0+IGhleFRvQmlnSW50KHBhcnRpY2lwYW50Wyd1J10pKS5yZWR1Y2UoRWNkc2EuY3VydmUuc2NhbGFyQWRkKTtcblxuICAgIC8vIFZlcmlmeSBzaGFyZXMuXG4gICAgZm9yIChjb25zdCBzaGFyZSBvZiBuU2hhcmVzKSB7XG4gICAgICBpZiAoc2hhcmUudikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEVjZHNhLnNoYW1pci52ZXJpZnkoaGV4VG9CaWdJbnQoc2hhcmUudSksIFtoZXhUb0JpZ0ludChzaGFyZS55KSwgaGV4VG9CaWdJbnQoc2hhcmUudiEpXSwgcFNoYXJlLmkpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCB2ZXJpZnkgc2hhcmUgZnJvbSBwYXJ0aWNpcGFudCAke3NoYXJlLmp9LiBWZXJpZmljYXRpb24gZXJyb3I6ICR7ZXJyfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hhaW5jb2RlIHdpbGwgYmUgdXNlZCBpbiBmdXR1cmUgd2hlbiB3ZSBhZGQgc3VwcG9ydCBmb3Iga2V5IGRlcml2YXRpb24gZm9yIGVjZHNhXG4gICAgY29uc3QgY2hhaW5jb2RlcyA9IFtwU2hhcmUsIC4uLm5TaGFyZXNdLm1hcCgoeyBjaGFpbmNvZGUgfSkgPT4gYmlnSW50RnJvbUJ1ZmZlckJFKEJ1ZmZlci5mcm9tKGNoYWluY29kZSwgJ2hleCcpKSk7XG4gICAgY29uc3QgY2hhaW5jb2RlID0gY2hhaW5jb2Rlcy5yZWR1Y2UoXG4gICAgICAoYWNjLCBjaGFpbmNvZGUpID0+XG4gICAgICAgIChhY2MgKyBjaGFpbmNvZGUpICUgQmlnSW50KCcweDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcpIC8vIDJeMjU2XG4gICAgKTtcblxuICAgIGNvbnN0IHBhcnRpY2lwYW50czogS2V5Q29tYmluZWQgPSB7XG4gICAgICB4U2hhcmU6IHtcbiAgICAgICAgaTogcFNoYXJlLmksXG4gICAgICAgIGw6IHBTaGFyZS5sLFxuICAgICAgICBtOiBwU2hhcmUubSxcbiAgICAgICAgbjogcFNoYXJlLm4sXG4gICAgICAgIHk6IGJpZ0ludFRvQnVmZmVyQkUoeSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgeDogYmlnSW50VG9CdWZmZXJCRSh4LCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBjaGFpbmNvZGU6IGJpZ0ludFRvQnVmZmVyQkUoY2hhaW5jb2RlLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgfSxcbiAgICAgIHlTaGFyZXM6IHt9LFxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IHNoYXJlIGluIG5TaGFyZXMpIHtcbiAgICAgIGNvbnN0IHBhcnRpY2lwYW50SW5kZXggPSBuU2hhcmVzW3NoYXJlXVsnaiddO1xuICAgICAgcGFydGljaXBhbnRzLnlTaGFyZXNbcGFydGljaXBhbnRJbmRleF0gPSB7XG4gICAgICAgIGk6IHBTaGFyZS5pLFxuICAgICAgICBqOiBuU2hhcmVzW3NoYXJlXVsnaiddLFxuICAgICAgICBuOiBuU2hhcmVzW3NoYXJlXVsnbiddLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRpY2lwYW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXJpdmUgc2hhcmVzIGZvciBhIEJJUC0zMiBzdWJrZXkuXG4gICAqIEBwYXJhbSB7UFNoYXJlfSBUaGUgdXNlcidzIHAtc2hhcmUuXG4gICAqIEBwYXJhbSB7TlNoYXJlW119IFRoZSBuLXNoYXJlcyByZWNlaXZlZCBmcm9tIHRoZSBvdGhlciBwYXJ0aWNpcGFudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgQklQLTMyIHBhdGggdG8gZGVyaXZlLlxuICAgKiBAcmV0dXJucyB7U3Via2V5U2hhcmV9IFJldHVybnMgdGhlIHByaXZhdGUgeC1zaGFyZSBhbmQgbi1zaGFyZXMgdG9cbiAgICogYmUgZGlzdHJpYnV0ZWQgdG8gcGFydGljaXBhbnRzIGF0IHRoZWlyIGNvcnJlc3BvbmRpbmcgaW5kZXguXG4gICAqL1xuICBrZXlEZXJpdmUocFNoYXJlOiBQU2hhcmUsIG5TaGFyZXM6IE5TaGFyZVtdLCBwYXRoOiBzdHJpbmcpOiBTdWJrZXlTaGFyZSB7XG4gICAgY29uc3QgeVZhbHVlcyA9IFtwU2hhcmUsIC4uLm5TaGFyZXNdLm1hcCgoc2hhcmUpID0+IGhleFRvQmlnSW50KHNoYXJlLnkpKTtcbiAgICBjb25zdCB5ID0geVZhbHVlcy5yZWR1Y2UoKHBhcnRpYWwsIHNoYXJlKSA9PiBFY2RzYS5jdXJ2ZS5wb2ludEFkZChwYXJ0aWFsLCBzaGFyZSkpO1xuICAgIGNvbnN0IHUgPSBCaWdJbnQocFNoYXJlLnV1KTtcbiAgICBsZXQgY29udHJpYkNoYWluY29kZSA9IGhleFRvQmlnSW50KHBTaGFyZS5jaGFpbmNvZGUpO1xuICAgIGNvbnN0IGNoYWluY29kZXMgPSBbY29udHJpYkNoYWluY29kZSwgLi4ublNoYXJlcy5tYXAoKHsgY2hhaW5jb2RlIH0pID0+IGhleFRvQmlnSW50KGNoYWluY29kZSkpXTtcbiAgICBjb25zdCBjaGFpbmNvZGUgPSBjaGFpbmNvZGVzLnJlZHVjZSgoYWNjLCBjaGFpbmNvZGUpID0+IChhY2MgKyBjaGFpbmNvZGUpICUgY2hhaW5jb2RlQmFzZSk7XG5cbiAgICAvLyBWZXJpZnkgc2hhcmVzLlxuICAgIGZvciAoY29uc3Qgc2hhcmUgb2YgblNoYXJlcykge1xuICAgICAgaWYgKHNoYXJlLnYpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBFY2RzYS5zaGFtaXIudmVyaWZ5KGhleFRvQmlnSW50KHNoYXJlLnUpLCBbaGV4VG9CaWdJbnQoc2hhcmUueSksIGhleFRvQmlnSW50KHNoYXJlLnYhKV0sIHBTaGFyZS5pKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgdmVyaWZ5IHNoYXJlIGZyb20gcGFydGljaXBhbnQgJHtzaGFyZS5qfS4gVmVyaWZpY2F0aW9uIGVycm9yOiAke2Vycn1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlcml2ZSBzdWJrZXkuXG4gICAgY29uc3Qgc3Via2V5ID0gRWNkc2EuaGRUcmVlLnByaXZhdGVEZXJpdmUoeyBwazogeSwgc2s6IHUsIGNoYWluY29kZSB9LCBwYXRoKTtcblxuICAgIC8vIENhbGN1bGF0ZSBuZXcgcHVibGljIGtleSBjb250cmlidXRpb24uXG4gICAgY29uc3QgY29udHJpYlkgPSBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KHN1YmtleS5zayk7XG5cbiAgICAvLyBDYWxjdWxhdGUgbmV3IGNoYWluY29kZSBjb250cmlidXRpb24uXG4gICAgY29uc3QgY2hhaW5jb2RlRGVsdGEgPSAoY2hhaW5jb2RlQmFzZSArIHN1YmtleS5jaGFpbmNvZGUgLSBjaGFpbmNvZGUpICUgY2hhaW5jb2RlQmFzZTtcbiAgICBjb250cmliQ2hhaW5jb2RlID0gKGNvbnRyaWJDaGFpbmNvZGUgKyBjaGFpbmNvZGVEZWx0YSkgJSBjaGFpbmNvZGVCYXNlO1xuXG4gICAgLy8gQ2FsY3VsYXRlIG5ldyB1IHZhbHVlcy5cbiAgICBjb25zdCB7IHNoYXJlczogc3BsaXRfdSwgdiB9ID0gRWNkc2Euc2hhbWlyLnNwbGl0KHN1YmtleS5zaywgcFNoYXJlLnQgfHwgMiwgcFNoYXJlLmMgfHwgMyk7XG5cbiAgICAvLyBDYWxjdWxhdGUgbmV3IHNpZ25pbmcga2V5LlxuICAgIGNvbnN0IHggPSBbc3BsaXRfdVtwU2hhcmUuaV0sIC4uLm5TaGFyZXMubWFwKCh7IHUgfSkgPT4gaGV4VG9CaWdJbnQodSkpXS5yZWR1Y2UoRWNkc2EuY3VydmUuc2NhbGFyQWRkKTtcblxuICAgIGNvbnN0IFBfaTogWFNoYXJlID0ge1xuICAgICAgaTogcFNoYXJlLmksXG4gICAgICBsOiBwU2hhcmUubCxcbiAgICAgIG06IHBTaGFyZS5tLFxuICAgICAgbjogcFNoYXJlLm4sXG4gICAgICB5OiBiaWdJbnRUb0J1ZmZlckJFKHN1YmtleS5waywgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHg6IGJpZ0ludFRvQnVmZmVyQkUoeCwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGNoYWluY29kZTogYmlnSW50VG9CdWZmZXJCRShzdWJrZXkuY2hhaW5jb2RlLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG5cbiAgICBjb25zdCBzaGFyZXM6IFN1YmtleVNoYXJlID0ge1xuICAgICAgeFNoYXJlOiBQX2ksXG4gICAgICBuU2hhcmVzOiB7fSxcbiAgICB9O1xuXG4gICAgZm9yIChsZXQgaW5kID0gMDsgaW5kIDwgblNoYXJlcy5sZW5ndGg7IGluZCsrKSB7XG4gICAgICBjb25zdCBQX2ogPSBuU2hhcmVzW2luZF07XG4gICAgICBzaGFyZXMublNoYXJlc1tQX2oual0gPSB7XG4gICAgICAgIGk6IFBfai5qLFxuICAgICAgICBqOiBQX2kuaSxcbiAgICAgICAgbjogUF9qLm4sXG4gICAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUoc3BsaXRfdVtQX2oual0sIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHk6IGJpZ0ludFRvQnVmZmVyQkUoY29udHJpYlksIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHY6IGJpZ0ludFRvQnVmZmVyQkUodlswXSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgY2hhaW5jb2RlOiBiaWdJbnRUb0J1ZmZlckJFKGNvbnRyaWJDaGFpbmNvZGUsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBzaGFyZXM7XG4gIH1cblxuICAvKipcbiAgICogRGVyaXZlcyBhIGNoaWxkIGNvbW1vbiBrZXljaGFpbiBmcm9tIGNvbW1vbiBrZXljaGFpblxuICAgKlxuICAgKiBAcGFyYW0ge2NvbW1vbktleWNoYWlufSBUaGUgY29tbW9uIGtleWNoYWluIGFzIGEgaGV4IHN0cmluZy5cbiAgICogQHBhcmFtIHtwYXRofSBUaGUgQklQLTMyIHBhdGggdG8gZGVyaXZlLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBkZXJpdmVkIGNvbW1vbiBrZXljaGFpbiBhcyBhIGhleCBzdHJpbmcuXG4gICAqL1xuICBkZXJpdmVVbmhhcmRlbmVkKGNvbW1vbktleWNoYWluOiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKEVjZHNhLmhkVHJlZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBkZXJpdmUga2V5IHdpdGhvdXQgSERUcmVlIGltcGxlbWVudGF0aW9uXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWluID0gQnVmZmVyLmZyb20oY29tbW9uS2V5Y2hhaW4sICdoZXgnKTtcblxuICAgIGNvbnN0IGRlcml2ZWRQdWJsaWNLZXljaGFpbiA9IEVjZHNhLmhkVHJlZS5wdWJsaWNEZXJpdmUoXG4gICAgICB7XG4gICAgICAgIHBrOiBiaWdJbnRGcm9tQnVmZmVyQkUoa2V5Y2hhaW4uc2xpY2UoMCwgMzMpKSxcbiAgICAgICAgY2hhaW5jb2RlOiBiaWdJbnRGcm9tQnVmZmVyQkUoa2V5Y2hhaW4uc2xpY2UoMzMpKSxcbiAgICAgIH0sXG4gICAgICBwYXRoXG4gICAgKTtcblxuICAgIGNvbnN0IGRlcml2ZWRQayA9IGJpZ0ludFRvQnVmZmVyQkUoZGVyaXZlZFB1YmxpY0tleWNoYWluLnBrLCAzMykudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IGRlcml2ZWRDaGFpbmNvZGUgPSBiaWdJbnRUb0J1ZmZlckJFKGRlcml2ZWRQdWJsaWNLZXljaGFpbi5jaGFpbmNvZGUsIDMyKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICByZXR1cm4gZGVyaXZlZFBrICsgZGVyaXZlZENoYWluY29kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGEgZ2l2ZW4gcmFuZ2UgcHJvb2YgY2hhbGxlbmdlIHRvIHRoZSBzaGFyZXMgcHJldmlvdXNseSBjcmVhdGVkXG4gICAqIGJ5ICNrZXlDb21iaW5lLiBHZW5lcmF0ZXMgYSBuZXcgY2hhbGxlbmdlIGlmIG5vdCBwcm92aWRlZC5cbiAgICogQHBhcmFtIHtYU2hhcmV9IHhTaGFyZSBQcml2YXRlIHhTaGFyZSBvZiBzaWduZXJcbiAgICogQHBhcmFtIHtZU2hhcmV9IHlTaGFyZSBZU2hhcmUgb2YgdGhlIG90aGVyIHBhcnRpY2lwYW50IGludm9sdmVkIGluXG4gICAqIHRoaXMgc2lnbmluZyBvcGVyYXRpb25cbiAgICogQHBhcmFtIHtFY2RzYVR5cGVzLlNlcmlhbGl6ZWROdGlsZGV9IGNoYWxsZW5nZVxuICAgKiBAcmV0dXJucyB7S2V5Q29tYmluZWR9IFRoZSBuZXcgWFNoYXJlIGFuZCBZU2hhcmVzIHdpdGggdGhlIGFtZW5kZWRcbiAgICogY2hhbGxlbmdlIHZhbHVlc1xuICAgKi9cbiAgYXN5bmMgYXBwZW5kQ2hhbGxlbmdlKFxuICAgIHhTaGFyZTogWFNoYXJlLFxuICAgIHlTaGFyZTogWVNoYXJlLFxuICAgIGNoYWxsZW5nZT86IEVjZHNhVHlwZXMuU2VyaWFsaXplZE50aWxkZVxuICApOiBQcm9taXNlPEtleUNvbWJpbmVkV2l0aE50aWxkZT4ge1xuICAgIGlmICghY2hhbGxlbmdlKSB7XG4gICAgICBjaGFsbGVuZ2UgPSBFY2RzYVR5cGVzLnNlcmlhbGl6ZU50aWxkZShhd2FpdCBFY2RzYVJhbmdlUHJvb2YuZ2VuZXJhdGVOdGlsZGUoMzA3MikpO1xuICAgIH1cbiAgICBjb25zdCB7IG50aWxkZSwgaDEsIGgyIH0gPSBjaGFsbGVuZ2U7XG4gICAgcmV0dXJuIHtcbiAgICAgIHhTaGFyZTogeyAuLi54U2hhcmUsIG50aWxkZSwgaDEsIGgyIH0sXG4gICAgICB5U2hhcmVzOiB7XG4gICAgICAgIFt5U2hhcmUual06IHtcbiAgICAgICAgICBpOiB5U2hhcmUuaixcbiAgICAgICAgICBqOiB5U2hhcmUuaSxcbiAgICAgICAgICBuOiB4U2hhcmUubixcbiAgICAgICAgICBudGlsZGUsXG4gICAgICAgICAgaDEsXG4gICAgICAgICAgaDIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHNpZ25pbmcgc2hhcmVzLlxuICAgKiBAcGFyYW0ge3hTaGFyZX0geFNoYXJlIFByaXZhdGUgeFNoYXJlIG9mIGN1cnJlbnQgcGFydGljaXBhbnQgc2lnbmVyXG4gICAqIEBwYXJhbSB7WVNoYXJlfSB5U2hhcmUgeVNoYXJlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG90aGVyIHBhcnRpY2lwYW50IHNpZ25lclxuICAgKiBAcmV0dXJucyB7U2lnblNoYXJlUlR9IFJldHVybnMgdGhlIHBhcnRpY2lwYW50IHByaXZhdGUgdy1zaGFyZVxuICAgKiBhbmQgay1zaGFyZSB0byBiZSBkaXN0cmlidXRlZCB0byBvdGhlciBwYXJ0aWNpcGFudCBzaWduZXJcbiAgICovXG4gIGFzeW5jIHNpZ25TaGFyZSh4U2hhcmU6IFhTaGFyZSB8IFhTaGFyZVdpdGhOdGlsZGUsIHlTaGFyZTogWVNoYXJlV2l0aE50aWxkZSk6IFByb21pc2U8U2lnblNoYXJlUlQ+IHtcbiAgICBjb25zdCBwayA9IGdldFBhaWxsaWVyUHVibGljS2V5KGhleFRvQmlnSW50KHhTaGFyZS5uKSk7XG5cbiAgICAvLyBHZW5lcmF0ZSBhIGNoYWxsZW5nZSBpZiBudGlsZGUgaXMgbm90IHByZXNlbnQgaW4gdGhlIHhTaGFyZS5cbiAgICBpZiAoIWhhc050aWxkZSh4U2hhcmUpKSB7XG4gICAgICB4U2hhcmUgPSAoYXdhaXQgdGhpcy5hcHBlbmRDaGFsbGVuZ2UoeFNoYXJlLCB5U2hhcmUpKS54U2hhcmU7XG4gICAgfVxuXG4gICAgY29uc3QgayA9IEVjZHNhLmN1cnZlLnNjYWxhclJhbmRvbSgpO1xuICAgIGNvbnN0IHJrID0gYXdhaXQgcmFuZG9tQ29QcmltZVRvKHBrLm4pO1xuICAgIGNvbnN0IGNrID0gcGsuZW5jcnlwdChrLCByayk7XG4gICAgY29uc3QgZ2FtbWEgPSBFY2RzYS5jdXJ2ZS5zY2FsYXJSYW5kb20oKTtcblxuICAgIGNvbnN0IGQgPSBFY2RzYS5jdXJ2ZS5zY2FsYXJNdWx0KEVjZHNhLmN1cnZlLnNjYWxhclN1YihCaWdJbnQoeVNoYXJlLmopLCBCaWdJbnQoeFNoYXJlLmkpKSwgQmlnSW50KHhTaGFyZS5pKSk7XG5cbiAgICBjb25zdCB3ID0gW1xuICAgICAgRWNkc2EuY3VydmUuc2NhbGFyTXVsdChCaWdJbnQoeVNoYXJlLmopLCBCaWdJbnQoeFNoYXJlLmkpKSxcbiAgICAgIGhleFRvQmlnSW50KHhTaGFyZVsneCddKSxcbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhckludmVydChkKSxcbiAgICBdLnJlZHVjZShFY2RzYS5jdXJ2ZS5zY2FsYXJNdWx0KTtcblxuICAgIGNvbnN0IHsgbnRpbGRlOiBudGlsZGVhLCBoMTogaDFhLCBoMjogaDJhIH0gPSB4U2hhcmUgYXMgWFNoYXJlV2l0aE50aWxkZTtcblxuICAgIGNvbnN0IHNpZ25lcnM6IFNpZ25TaGFyZVJUID0ge1xuICAgICAgd1NoYXJlOiB7XG4gICAgICAgIGk6IHhTaGFyZS5pLFxuICAgICAgICBsOiB4U2hhcmUubCxcbiAgICAgICAgbTogeFNoYXJlLm0sXG4gICAgICAgIG46IHhTaGFyZS5uLFxuICAgICAgICB5OiB4U2hhcmUueSxcbiAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICBoMTogaDFhLFxuICAgICAgICBoMjogaDJhLFxuICAgICAgICBrOiBiaWdJbnRUb0J1ZmZlckJFKGssIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIGNrOiBiaWdJbnRUb0J1ZmZlckJFKGNrLCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgdzogYmlnSW50VG9CdWZmZXJCRSh3LCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBnYW1tYTogYmlnSW50VG9CdWZmZXJCRShnYW1tYSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH0sXG4gICAgICBrU2hhcmU6IHt9IGFzIEtTaGFyZSxcbiAgICB9O1xuXG4gICAgY29uc3QgeyBudGlsZGU6IG50aWxkZWIsIGgxOiBoMWIsIGgyOiBoMmIgfSA9IHlTaGFyZTtcbiAgICBjb25zdCBwcm9vZiA9IGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi5wcm92ZShcbiAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgMzA3MixcbiAgICAgIHBrLFxuICAgICAge1xuICAgICAgICBudGlsZGU6IGhleFRvQmlnSW50KG50aWxkZWIpLFxuICAgICAgICBoMTogaGV4VG9CaWdJbnQoaDFiKSxcbiAgICAgICAgaDI6IGhleFRvQmlnSW50KGgyYiksXG4gICAgICB9LFxuICAgICAgY2ssXG4gICAgICBrLFxuICAgICAgcmtcbiAgICApO1xuICAgIGNvbnN0IHByb29mU2hhcmUgPSB7XG4gICAgICB6OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnosIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi51LCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHc6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgczE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczEsIDk2KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgfTtcblxuICAgIHNpZ25lcnMua1NoYXJlID0ge1xuICAgICAgaTogeVNoYXJlLmosXG4gICAgICBqOiB4U2hhcmUuaSxcbiAgICAgIG46IHBrLm4udG9TdHJpbmcoMTYpLFxuICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgaDE6IGgxYSxcbiAgICAgIGgyOiBoMmEsXG4gICAgICBrOiBiaWdJbnRUb0J1ZmZlckJFKGNrLCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHByb29mOiBwcm9vZlNoYXJlLFxuICAgIH07XG5cbiAgICByZXR1cm4gc2lnbmVycztcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIG11bHRpcGxpY2l0aXZlLXRvLWFkZGl0aXZlIChNdEEpIHNoYXJlIGNvbnZlcnNpb24gd2l0aCBhbm90aGVyXG4gICAqIHNpZ25lci5cbiAgICogQHBhcmFtIHtTaWduQ29udmVydH1cbiAgICogQHJldHVybnMge1NpZ25Db252ZXJ0UlR9XG4gICAqL1xuICBhc3luYyBzaWduQ29udmVydChzaGFyZXM6IFNpZ25Db252ZXJ0KTogUHJvbWlzZTxTaWduQ29udmVydFJUPiB7XG4gICAgbGV0IHNoYXJlUGFydGljaXBhbnQ6IFBhcnRpYWw8QlNoYXJlPiB8IFBhcnRpYWw8R1NoYXJlPiwgc2hhcmVUb0JlU2VudDogUGFydGlhbDxBU2hhcmU+IHwgTVVTaGFyZTtcbiAgICBsZXQgaXNHYW1tYVNoYXJlID0gZmFsc2U7XG4gICAgbGV0IGtTaGFyZTogUGFydGlhbDxLU2hhcmU+ID0ge307XG4gICAgaWYgKHNoYXJlcy54U2hhcmUgJiYgc2hhcmVzLnlTaGFyZSAmJiBzaGFyZXMua1NoYXJlKSB7XG4gICAgICBjb25zdCB4U2hhcmUgPSBzaGFyZXMueFNoYXJlOyAvLyBjdXJyZW50UGFydGljaXBhbnQgc2VjcmV0IHhTaGFyZVxuICAgICAgY29uc3QgeVNoYXJlID0ge1xuICAgICAgICAuLi5zaGFyZXMueVNoYXJlLFxuICAgICAgICBudGlsZGU6IHNoYXJlcy5rU2hhcmUubnRpbGRlLFxuICAgICAgICBoMTogc2hhcmVzLmtTaGFyZS5oMSxcbiAgICAgICAgaDI6IHNoYXJlcy5rU2hhcmUuaDIsXG4gICAgICB9O1xuICAgICAgY29uc3Qgc2lnblNoYXJlID0gYXdhaXQgdGhpcy5zaWduU2hhcmUoeFNoYXJlLCB5U2hhcmUpO1xuICAgICAga1NoYXJlID0gc2lnblNoYXJlLmtTaGFyZTtcbiAgICAgIHNoYXJlVG9CZVNlbnQgPSB7IC4uLnNoYXJlcy5rU2hhcmUgfSBhcyBQYXJ0aWFsPEFTaGFyZT47XG4gICAgICBzaGFyZVBhcnRpY2lwYW50ID0geyAuLi5zaWduU2hhcmUud1NoYXJlIH0gYXMgUGFydGlhbDxCU2hhcmU+O1xuICAgIH0gZWxzZSBpZiAoKHNoYXJlcy5iU2hhcmUgJiYgc2hhcmVzLm11U2hhcmUpIHx8IChzaGFyZXMuYVNoYXJlICYmIHNoYXJlcy53U2hhcmUpKSB7XG4gICAgICBpc0dhbW1hU2hhcmUgPSB0cnVlO1xuICAgICAgc2hhcmVUb0JlU2VudCA9IHNoYXJlcy5hU2hhcmUgPyAoeyAuLi5zaGFyZXMuYVNoYXJlIH0gYXMgTVVTaGFyZSkgOiAoeyAuLi5zaGFyZXMubXVTaGFyZSB9IGFzIE1VU2hhcmUpO1xuICAgICAgc2hhcmVQYXJ0aWNpcGFudCA9IHNoYXJlcy53U2hhcmUgPyAoeyAuLi5zaGFyZXMud1NoYXJlIH0gYXMgUGFydGlhbDxHU2hhcmU+KSA6ICh7IC4uLnNoYXJlcy5iU2hhcmUgfSBhcyBHU2hhcmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29uZmlnIGZvciBTaWduIENvbnZlcnQnKTtcbiAgICB9XG4gICAgaWYgKHNoYXJlUGFydGljaXBhbnQuaSAhPT0gc2hhcmVUb0JlU2VudC5pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NoYXJlcyBmcm9tIHNhbWUgcGFydGljaXBhbnQnKTtcbiAgICB9XG4gICAgaWYgKChzaGFyZVRvQmVTZW50IGFzIEFTaGFyZSkuYWxwaGEpIHtcbiAgICAgIGNvbnN0IGJTaGFyZVBhcnRpY2lwYW50ID0gc2hhcmVQYXJ0aWNpcGFudCBhcyBCU2hhcmU7XG4gICAgICBjb25zdCBhU2hhcmVUb0JlU2VudCA9IHNoYXJlVG9CZVNlbnQgYXMgQVNoYXJlO1xuICAgICAgY29uc3QgcGthID0gZ2V0UGFpbGxpZXJQdWJsaWNLZXkoaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQubikpO1xuICAgICAgbGV0IG50aWxkZWEsIGgxYSwgaDJhLCBjaztcbiAgICAgIGlmIChiU2hhcmVQYXJ0aWNpcGFudC5udGlsZGUpIHtcbiAgICAgICAgbnRpbGRlYSA9IGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50Lm50aWxkZSk7XG4gICAgICAgIGgxYSA9IGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50LmgxKTtcbiAgICAgICAgaDJhID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQuaDIpO1xuICAgICAgICBjayA9IGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50LmNrKTtcbiAgICAgIH1cbiAgICAgIC8vIFZlcmlmeSAkXFxnYW1tYV9pIFxcaW4gWl97Tl4yfSQuXG4gICAgICBpZiAoXG4gICAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5V2l0aENoZWNrKFxuICAgICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICAgIDMwNzIsXG4gICAgICAgICAgcGthLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICAgIGgxOiBoMWEsXG4gICAgICAgICAgICBoMjogaDJhLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgejogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi56KSxcbiAgICAgICAgICAgIHpwcm06IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YuenBybSksXG4gICAgICAgICAgICB0OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnQpLFxuICAgICAgICAgICAgdjogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi52KSxcbiAgICAgICAgICAgIHc6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YudyksXG4gICAgICAgICAgICBzOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnMpLFxuICAgICAgICAgICAgczE6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YuczEpLFxuICAgICAgICAgICAgczI6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YuczIpLFxuICAgICAgICAgICAgdDE6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YudDEpLFxuICAgICAgICAgICAgdDI6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YudDIpLFxuICAgICAgICAgICAgdTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi51KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNrLFxuICAgICAgICAgIGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmFscGhhKSxcbiAgICAgICAgICBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLngpXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCB2ZXJpZnkgc2lnbmluZyBzaGFyZSBmb3IgZ2FtbWEgcHJvb2YnKTtcbiAgICAgIH1cbiAgICAgIC8vIFZlcmlmeSAkXFx3X2kgXFxpbiBaX3tOXjJ9JC5cbiAgICAgIGlmIChcbiAgICAgICAgIUVjZHNhUmFuZ2VQcm9vZi52ZXJpZnlXaXRoQ2hlY2soXG4gICAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgICAgMzA3MixcbiAgICAgICAgICBwa2EsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICAgICAgaDE6IGgxYSxcbiAgICAgICAgICAgIGgyOiBoMmEsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB6OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YueiksXG4gICAgICAgICAgICB6cHJtOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YuenBybSksXG4gICAgICAgICAgICB0OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YudCksXG4gICAgICAgICAgICB2OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YudiksXG4gICAgICAgICAgICB3OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YudyksXG4gICAgICAgICAgICBzOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YucyksXG4gICAgICAgICAgICBzMTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnMxKSxcbiAgICAgICAgICAgIHMyOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YuczIpLFxuICAgICAgICAgICAgdDE6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi50MSksXG4gICAgICAgICAgICB0MjogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnQyKSxcbiAgICAgICAgICAgIHU6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi51KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNrLFxuICAgICAgICAgIGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50Lm11KSxcbiAgICAgICAgICBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YueClcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHZlcmlmeSBzaGFyZSBmb3Igd1Byb29mJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzayA9IG5ldyBwYWlsbGllckJpZ2ludC5Qcml2YXRlS2V5KFxuICAgICAgICBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5sIGFzIHN0cmluZyksXG4gICAgICAgIGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50Lm0gYXMgc3RyaW5nKSxcbiAgICAgICAgcGthXG4gICAgICApO1xuICAgICAgY29uc3QgZ1NoYXJlUGFydGljaXBhbnQgPSBzaGFyZVBhcnRpY2lwYW50IGFzIEdTaGFyZTtcbiAgICAgIGNvbnN0IG11U2hhcmVUb0JlU2VudCA9IHNoYXJlVG9CZVNlbnQgYXMgTVVTaGFyZTtcbiAgICAgIGNvbnN0IGFscGhhID0gc2suZGVjcnlwdChoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5hbHBoYSkpO1xuICAgICAgZ1NoYXJlUGFydGljaXBhbnQuYWxwaGEgPSBiaWdJbnRUb0J1ZmZlckJFKEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShhbHBoYSksIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBjb25zdCBtdSA9IHNrLmRlY3J5cHQoaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQubXUgYXMgc3RyaW5nKSk7IC8vIHJlY2hlY2sgZW5jcnlwdGVkIG51bWJlclxuICAgICAgZ1NoYXJlUGFydGljaXBhbnQubXUgPSBiaWdJbnRUb0J1ZmZlckJFKEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShtdSksIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBjb25zdCBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudCA9IHNoYXJlUGFydGljaXBhbnQgYXMgUGFydGlhbDxHU2hhcmU+O1xuICAgICAgY29uc3QgcGFydGlhbFNoYXJlVG9CZVNlbnQgPSBtdVNoYXJlVG9CZVNlbnQgYXMgUGFydGlhbDxNVVNoYXJlPjtcbiAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5sO1xuICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50Lm07XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlVG9CZVNlbnQuYWxwaGE7XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlVG9CZVNlbnQubXU7XG4gICAgfVxuICAgIGlmICgoc2hhcmVUb0JlU2VudCBhcyBBU2hhcmUpLmspIHtcbiAgICAgIGNvbnN0IGJTaGFyZVBhcnRpY2lwYW50ID0gc2hhcmVQYXJ0aWNpcGFudCBhcyBCU2hhcmU7XG4gICAgICBjb25zdCBhU2hhcmVUb0JlU2VudCA9IHNoYXJlVG9CZVNlbnQgYXMgQVNoYXJlO1xuICAgICAgY29uc3QgbiA9IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50Lm4pOyAvLyBQYWlsbGllciBwdWIgZnJvbSBvdGhlciBzaWduZXJcbiAgICAgIGNvbnN0IHBrYSA9IGdldFBhaWxsaWVyUHVibGljS2V5KG4pO1xuICAgICAgbGV0IG50aWxkZWEsIGgxYSwgaDJhLCBudGlsZGViLCBoMWIsIGgyYjtcbiAgICAgIGlmIChhU2hhcmVUb0JlU2VudC5udGlsZGUpIHtcbiAgICAgICAgbnRpbGRlYSA9IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50Lm50aWxkZSk7XG4gICAgICAgIGgxYSA9IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmgxKTtcbiAgICAgICAgaDJhID0gaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuaDIpO1xuICAgICAgICBudGlsZGViID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQubnRpbGRlKTtcbiAgICAgICAgaDFiID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQuaDEpO1xuICAgICAgICBoMmIgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5oMik7XG4gICAgICB9XG4gICAgICBjb25zdCBrID0gaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuayk7XG4gICAgICBpZiAoXG4gICAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5KFxuICAgICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICAgIDMwNzIsXG4gICAgICAgICAgcGthLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG50aWxkZTogbnRpbGRlYixcbiAgICAgICAgICAgIGgxOiBoMWIsXG4gICAgICAgICAgICBoMjogaDJiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgejogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQucHJvb2YueiksXG4gICAgICAgICAgICB1OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5wcm9vZi51KSxcbiAgICAgICAgICAgIHc6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LnByb29mLncpLFxuICAgICAgICAgICAgczogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQucHJvb2YucyksXG4gICAgICAgICAgICBzMTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQucHJvb2YuczEpLFxuICAgICAgICAgICAgczI6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LnByb29mLnMyKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGtcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHZlcmlmeSBzaWduaW5nIEEgc2hhcmUgcHJvb2YnKTtcbiAgICAgIH1cbiAgICAgIC8vIE10QSAka19qLCBcXGdhbW1hX2kkLlxuICAgICAgY29uc3QgYmV0YTAgPSBiaWdpbnRDcnlwdG9VdGlscy5yYW5kQmV0d2VlbihFY2RzYS5jdXJ2ZS5vcmRlcigpICoqIF81bik7XG4gICAgICBiU2hhcmVQYXJ0aWNpcGFudC5iZXRhID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKGJldGEwKSksIDMyKS50b1N0cmluZyhcbiAgICAgICAgJ2hleCdcbiAgICAgICk7XG4gICAgICBjb25zdCBnID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQuZ2FtbWEpO1xuICAgICAgY29uc3QgcmIgPSBhd2FpdCByYW5kb21Db1ByaW1lVG8ocGthLm4pO1xuICAgICAgY29uc3QgY2IgPSBwa2EuZW5jcnlwdChiZXRhMCwgcmIpO1xuICAgICAgY29uc3QgYWxwaGEgPSBwa2EuYWRkaXRpb24ocGthLm11bHRpcGx5KGssIGcpLCBjYik7XG4gICAgICBhU2hhcmVUb0JlU2VudC5hbHBoYSA9IGJpZ0ludFRvQnVmZmVyQkUoYWxwaGEsIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAvLyBQcm92ZSAkXFxnYW1tYV9pIFxcaW4gWl97Tl4yfSQuXG4gICAgICBjb25zdCBneCA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQoZyk7XG4gICAgICBsZXQgcHJvb2YgPSBhd2FpdCBFY2RzYVJhbmdlUHJvb2YucHJvdmVXaXRoQ2hlY2soXG4gICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICAzMDcyLFxuICAgICAgICBwa2EsXG4gICAgICAgIHtcbiAgICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgICAgaDE6IGgxYSxcbiAgICAgICAgICBoMjogaDJhLFxuICAgICAgICB9LFxuICAgICAgICBrLFxuICAgICAgICBhbHBoYSxcbiAgICAgICAgZyxcbiAgICAgICAgYmV0YTAsXG4gICAgICAgIHJiLFxuICAgICAgICBneFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oYVNoYXJlVG9CZVNlbnQsIHtcbiAgICAgICAgZ2FtbWFQcm9vZjoge1xuICAgICAgICAgIHo6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YueiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgenBybTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56cHJtLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB0OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHY6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudiwgNzY4KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdzogYmlnSW50VG9CdWZmZXJCRShwcm9vZi53LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHMxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMxLCA5NikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHMyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB0MTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MSwgMjI0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdDI6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudDIsIDQ4MCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB4OiBiaWdJbnRUb0J1ZmZlckJFKGd4LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICAvLyBNdEEgJGtfaiwgd19pJC5cbiAgICAgIGNvbnN0IG51MCA9IGJpZ2ludENyeXB0b1V0aWxzLnJhbmRCZXR3ZWVuKEVjZHNhLmN1cnZlLm9yZGVyKCkgKiogXzVuKTtcbiAgICAgIHNoYXJlUGFydGljaXBhbnQubnUgPSBiaWdJbnRUb0J1ZmZlckJFKEVjZHNhLmN1cnZlLnNjYWxhck5lZ2F0ZShFY2RzYS5jdXJ2ZS5zY2FsYXJSZWR1Y2UobnUwKSksIDMyKS50b1N0cmluZyhcbiAgICAgICAgJ2hleCdcbiAgICAgICk7XG4gICAgICBjb25zdCB3ID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQudyk7XG4gICAgICBjb25zdCBybiA9IGF3YWl0IHJhbmRvbUNvUHJpbWVUbyhwa2Eubik7XG4gICAgICBjb25zdCBjbiA9IHBrYS5lbmNyeXB0KG51MCwgcm4pO1xuICAgICAgY29uc3QgbXUgPSBwa2EuYWRkaXRpb24ocGthLm11bHRpcGx5KGssIHcpLCBjbik7XG4gICAgICBzaGFyZVRvQmVTZW50Lm11ID0gYmlnSW50VG9CdWZmZXJCRShtdSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIC8vIFByb3ZlICRcXHdfaSBcXGluIFpfe05eMn0kLlxuICAgICAgY29uc3Qgd3ggPSBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KHcpO1xuICAgICAgcHJvb2YgPSBhd2FpdCBFY2RzYVJhbmdlUHJvb2YucHJvdmVXaXRoQ2hlY2soXG4gICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICAzMDcyLFxuICAgICAgICBwa2EsXG4gICAgICAgIHtcbiAgICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgICAgaDE6IGgxYSxcbiAgICAgICAgICBoMjogaDJhLFxuICAgICAgICB9LFxuICAgICAgICBrLFxuICAgICAgICBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5tdSksXG4gICAgICAgIHcsXG4gICAgICAgIG51MCxcbiAgICAgICAgcm4sXG4gICAgICAgIHd4XG4gICAgICApO1xuICAgICAgT2JqZWN0LmFzc2lnbihzaGFyZVRvQmVTZW50LCB7XG4gICAgICAgIHdQcm9vZjoge1xuICAgICAgICAgIHo6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YueiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgenBybTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56cHJtLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB0OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHY6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudiwgNzY4KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdzogYmlnSW50VG9CdWZmZXJCRShwcm9vZi53LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHMxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMxLCA5NikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHMyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB0MTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MSwgMjI0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdDI6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudDIsIDQ4MCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB4OiBiaWdJbnRUb0J1ZmZlckJFKHd4LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBpZiAoKHNoYXJlUGFydGljaXBhbnQgYXMgR1NoYXJlKS5hbHBoYSkge1xuICAgICAgICBjb25zdCBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudCA9IHNoYXJlUGFydGljaXBhbnQgYXMgUGFydGlhbDxCU2hhcmU+O1xuICAgICAgICBjb25zdCBwYXJ0aWFsU2hhcmVUb0JlU2VudCA9IHNoYXJlVG9CZVNlbnQgYXMgUGFydGlhbDxBU2hhcmU+O1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQubnRpbGRlO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuaDE7XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5oMjtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50LmNrO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlVG9CZVNlbnQubjtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50Lm50aWxkZTtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50LmgxO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlVG9CZVNlbnQuaDI7XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5rO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlVG9CZVNlbnQucHJvb2Y7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3QuYXNzaWduKHNoYXJlVG9CZVNlbnQsIHtcbiAgICAgICAgICBuOiBrU2hhcmUubixcbiAgICAgICAgICBudGlsZGU6IGJpZ0ludFRvQnVmZmVyQkUobnRpbGRlYiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgaDE6IGJpZ0ludFRvQnVmZmVyQkUoaDFiLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBoMjogYmlnSW50VG9CdWZmZXJCRShoMmIsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIGs6IGtTaGFyZS5rLFxuICAgICAgICAgIHByb29mOiBrU2hhcmUucHJvb2YsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoISgnYWxwaGEnIGluIHNoYXJlVG9CZVNlbnQpICYmICEoJ2snIGluIHNoYXJlVG9CZVNlbnQpKSB7XG4gICAgICBjb25zdCBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudCA9IHNoYXJlUGFydGljaXBhbnQgYXMgUGFydGlhbDxCU2hhcmU+O1xuICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50Lm50aWxkZTtcbiAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5oMTtcbiAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5oMjtcbiAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5jaztcbiAgICAgIGNvbnN0IG11U2hhcmVUb0JlU2VudCA9IHNoYXJlVG9CZVNlbnQgYXMgTVVTaGFyZTtcbiAgICAgIHNoYXJlVG9CZVNlbnQgPSB7XG4gICAgICAgIGk6IG11U2hhcmVUb0JlU2VudC5pLFxuICAgICAgICBqOiBtdVNoYXJlVG9CZVNlbnQuaixcbiAgICAgIH0gYXMgTVVTaGFyZTtcbiAgICB9XG4gICAgW3NoYXJlVG9CZVNlbnQuaSwgc2hhcmVUb0JlU2VudC5qXSA9IFtzaGFyZVRvQmVTZW50LmosIHNoYXJlVG9CZVNlbnQuaV07XG4gICAgaWYgKGlzR2FtbWFTaGFyZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbXVTaGFyZTogc2hhcmVUb0JlU2VudCBhcyBNVVNoYXJlLFxuICAgICAgICBnU2hhcmU6IHNoYXJlUGFydGljaXBhbnQgYXMgR1NoYXJlLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGFTaGFyZTogc2hhcmVUb0JlU2VudCBhcyBBU2hhcmUsXG4gICAgICBiU2hhcmU6IHNoYXJlUGFydGljaXBhbnQgYXMgQlNoYXJlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29tYmluZSBnYW1tYSBzaGFyZXMgdG8gZ2V0IHRoZSBwcml2YXRlIG9taWNyb24gLyBkZWx0YSBzaGFyZXNcbiAgICogQHBhcmFtIHtTaWduQ29tYmluZX0gc2hhcmVzXG4gICAqIEByZXR1cm5zIHtTaWduQ29tYmluZVJUfVxuICAgKi9cbiAgc2lnbkNvbWJpbmUoc2hhcmVzOiBTaWduQ29tYmluZSk6IFNpZ25Db21iaW5lUlQge1xuICAgIGNvbnN0IGdTaGFyZSA9IHNoYXJlcy5nU2hhcmU7XG4gICAgY29uc3QgUyA9IHNoYXJlcy5zaWduSW5kZXg7XG4gICAgY29uc3QgZ2FtbWEgPSBoZXhUb0JpZ0ludChnU2hhcmUuZ2FtbWEpO1xuICAgIGNvbnN0IGFscGhhID0gaGV4VG9CaWdJbnQoZ1NoYXJlLmFscGhhKTtcbiAgICBjb25zdCBiZXRhID0gaGV4VG9CaWdJbnQoZ1NoYXJlLmJldGEpO1xuICAgIGNvbnN0IG11ID0gaGV4VG9CaWdJbnQoZ1NoYXJlLm11KTtcbiAgICBjb25zdCBudSA9IGhleFRvQmlnSW50KGdTaGFyZS5udSk7XG4gICAgY29uc3QgayA9IGhleFRvQmlnSW50KGdTaGFyZS5rKTtcbiAgICBjb25zdCB3ID0gaGV4VG9CaWdJbnQoZ1NoYXJlLncpO1xuXG4gICAgY29uc3QgZGVsdGEgPSBFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQoRWNkc2EuY3VydmUuc2NhbGFyTXVsdChrLCBnYW1tYSksIEVjZHNhLmN1cnZlLnNjYWxhckFkZChhbHBoYSwgYmV0YSkpO1xuICAgIGNvbnN0IG9taWNyb24gPSBFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQoRWNkc2EuY3VydmUuc2NhbGFyTXVsdChrLCB3KSwgRWNkc2EuY3VydmUuc2NhbGFyQWRkKG11LCBudSkpO1xuICAgIGNvbnN0IEdhbW1hID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdChnYW1tYSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgb1NoYXJlOiB7XG4gICAgICAgIGk6IGdTaGFyZS5pLFxuICAgICAgICB5OiBnU2hhcmUueSxcbiAgICAgICAgazogYmlnSW50VG9CdWZmZXJCRShrLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBvbWljcm9uOiBiaWdJbnRUb0J1ZmZlckJFKG9taWNyb24sIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIGRlbHRhOiBiaWdJbnRUb0J1ZmZlckJFKGRlbHRhLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBHYW1tYTogYmlnSW50VG9CdWZmZXJCRShHYW1tYSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH0sXG4gICAgICBkU2hhcmU6IHtcbiAgICAgICAgaTogUy5pLFxuICAgICAgICBqOiBnU2hhcmUuaSxcbiAgICAgICAgZGVsdGE6IGJpZ0ludFRvQnVmZmVyQkUoZGVsdGEsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIEdhbW1hOiBiaWdJbnRUb0J1ZmZlckJFKEdhbW1hLCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYSBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gTSBNZXNzYWdlIHRvIGJlIHNpZ25lZFxuICAgKiBAcGFyYW0ge09TaGFyZX0gb1NoYXJlIHByaXZhdGUgb21pY3JvbiBzaGFyZSBvZiBjdXJyZW50IHBhcnRpY2lwYW50XG4gICAqIEBwYXJhbSB7RFNoYXJlfSBkU2hhcmUgZGVsdGEgc2hhcmUgcmVjZWl2ZWQgZnJvbSB0aGUgb3RoZXIgcGFydGljaXBhbnRcbiAgICogQHBhcmFtIHtIYXNofSBoYXNoIGhhc2hpbmcgYWxnb3JpdGhtIGltcGxlbWVudGluZyBOb2RlYHMgc3RhbmRhcmQgY3J5cHRvIGhhc2ggaW50ZXJmYWNlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkSGFzaCBpZiB0cnVlLCB3ZSBoYXNoIHRoZSBwcm92aWRlZCBidWZmZXIgYmVmb3JlIHNpZ25pbmdcbiAgICogQHJldHVybnMge1NTaGFyZX1cbiAgICovXG4gIHNpZ24oTTogQnVmZmVyLCBvU2hhcmU6IE9TaGFyZSwgZFNoYXJlOiBEU2hhcmUsIGhhc2g/OiBIYXNoLCBzaG91bGRIYXNoID0gdHJ1ZSk6IFNTaGFyZSB7XG4gICAgY29uc3QgbSA9IHNob3VsZEhhc2ggPyAoaGFzaCB8fCBjcmVhdGVIYXNoKCdzaGEyNTYnKSkudXBkYXRlKE0pLmRpZ2VzdCgpIDogTTtcblxuICAgIGNvbnN0IGRlbHRhID0gRWNkc2EuY3VydmUuc2NhbGFyQWRkKGhleFRvQmlnSW50KG9TaGFyZS5kZWx0YSksIGhleFRvQmlnSW50KGRTaGFyZS5kZWx0YSkpO1xuXG4gICAgY29uc3QgUiA9IEVjZHNhLmN1cnZlLnBvaW50TXVsdGlwbHkoXG4gICAgICBFY2RzYS5jdXJ2ZS5wb2ludEFkZChoZXhUb0JpZ0ludChvU2hhcmUuR2FtbWEpLCBoZXhUb0JpZ0ludChkU2hhcmUuR2FtbWEpKSxcbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhckludmVydChkZWx0YSlcbiAgICApO1xuICAgIGNvbnN0IHBvaW50UiA9IHNlY3AuUG9pbnQuZnJvbUhleChiaWdJbnRUb0J1ZmZlckJFKFIsIDMyKSk7XG4gICAgY29uc3QgciA9IHBvaW50Ui54O1xuXG4gICAgY29uc3QgcyA9IEVjZHNhLmN1cnZlLnNjYWxhckFkZChcbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhck11bHQoYmlnSW50RnJvbVU4QUJFKG0pLCBoZXhUb0JpZ0ludChvU2hhcmUuaykpLFxuICAgICAgRWNkc2EuY3VydmUuc2NhbGFyTXVsdChyLCBoZXhUb0JpZ0ludChvU2hhcmUub21pY3JvbikpXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgaTogb1NoYXJlLmksXG4gICAgICB5OiBvU2hhcmUueSxcbiAgICAgIFI6IHBvaW50Ui50b0hleCh0cnVlKSxcbiAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocywgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBmdWxsIHNpZ25hdHVyZSBieSBjb21iaW5pbmcgU2lnbiBTaGFyZXNcbiAgICogQHBhcmFtIHtTU2hhcmVbXX0gc2hhcmVzXG4gICAqIEByZXR1cm5zIHtTaWduYXR1cmV9XG4gICAqL1xuICBjb25zdHJ1Y3RTaWduYXR1cmUoc2hhcmVzOiBTU2hhcmVbXSk6IFNpZ25hdHVyZSB7XG4gICAgLy8gRXZlcnkgUiBtdXN0IG1hdGNoLlxuICAgIGNvbnN0IFIgPSBzaGFyZXNbMF1bJ1InXTtcbiAgICBjb25zdCBpc1JNYXRjaGluZyA9IHNoYXJlcy5tYXAoKHNoYXJlKSA9PiBzaGFyZVsnUiddID09PSBSKS5yZWR1Y2UoKGEsIGIpID0+IGEgJiYgYik7XG4gICAgaWYgKCFpc1JNYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSIHZhbHVlIHNob3VsZCBiZSBjb25zaXN0ZW50IGFjcm9zcyBhbGwgc2hhcmVzJyk7XG4gICAgfVxuXG4gICAgbGV0IHMgPSBzaGFyZXMubWFwKChzaGFyZSkgPT4gaGV4VG9CaWdJbnQoc2hhcmVbJ3MnXSkpLnJlZHVjZShFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQpO1xuICAgIGNvbnN0IHJlY2lkID0gKFIuc2xpY2UoMCwgMikgPT09ICcwMycgPyAxIDogMCkgXiAocyA+IEVjZHNhLmN1cnZlLm9yZGVyKCkgLyBCaWdJbnQoMikgPyAxIDogMCk7XG5cbiAgICAvLyBOb3JtYWxpemUgcy5cbiAgICBzID0gcyA+IEVjZHNhLmN1cnZlLm9yZGVyKCkgLyBCaWdJbnQoMikgPyBFY2RzYS5jdXJ2ZS5vcmRlcigpIC0gcyA6IHM7XG4gICAgcmV0dXJuIHtcbiAgICAgIHk6IHNoYXJlc1swXVsneSddLFxuICAgICAgcjogUi5zbGljZSgyKSxcbiAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocywgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHJlY2lkOiByZWNpZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBlY2RzYSBzaWduYXR1cmVzXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBtZXNzYWdlXG4gICAqIEBwYXJhbSB7U2lnbmF0dXJlIH0gc2lnbmF0dXJlXG4gICAqIEBwYXJhbSB7SGFzaH0gaGFzaCBoYXNoaW5nIGFsZ29yaXRobSBpbXBsZW1lbnRpbmcgTm9kZWBzIHN0YW5kYXJkIGNyeXB0byBoYXNoIGludGVyZmFjZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZEhhc2ggaWYgdHJ1ZSwgd2UgaGFzaCB0aGUgcHJvdmlkZWQgYnVmZmVyIGJlZm9yZSB2ZXJpZnlpbmdcbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgc2lnbmF0dXJlIGlzIHZhbGlkOyBGYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHZlcmlmeShtZXNzYWdlOiBCdWZmZXIsIHNpZ25hdHVyZTogU2lnbmF0dXJlLCBoYXNoPzogSGFzaCwgc2hvdWxkSGFzaCA9IHRydWUpOiBib29sZWFuIHtcbiAgICBjb25zdCBtZXNzYWdlVG9WZXJpZnkgPSBzaG91bGRIYXNoID8gKGhhc2ggfHwgY3JlYXRlSGFzaCgnc2hhMjU2JykpLnVwZGF0ZShtZXNzYWdlKS5kaWdlc3QoKSA6IG1lc3NhZ2U7XG4gICAgcmV0dXJuIEVjZHNhLmN1cnZlLnZlcmlmeShcbiAgICAgIG1lc3NhZ2VUb1ZlcmlmeSxcbiAgICAgIEJ1ZmZlci5jb25jYXQoW1xuICAgICAgICBCdWZmZXIuZnJvbShbc2lnbmF0dXJlWydyZWNpZCddXSksXG4gICAgICAgIGJpZ0ludFRvQnVmZmVyQkUoaGV4VG9CaWdJbnQoc2lnbmF0dXJlWydyJ10pLCAzMiksXG4gICAgICAgIGJpZ0ludFRvQnVmZmVyQkUoaGV4VG9CaWdJbnQoc2lnbmF0dXJlWydzJ10pLCAzMiksXG4gICAgICBdKSxcbiAgICAgIGhleFRvQmlnSW50KHNpZ25hdHVyZVsneSddKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIGEgY2hhbGxlbmdlIGFuZCBpdCdzIHByb29mcyBmcm9tIGhleCBzdHJpbmdzIHRvIGJpZ2ludFxuICAgKiBAZGVwcmVjYXRlZCB1c2Ugc2RrLWxpYi1tcGMgRWNkc2FUeXBlcy5kZXNlcmlhbGl6ZU50aWxkZSBpbnN0ZWFkXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVOdGlsZGUoY2hhbGxlbmdlOiBFY2RzYVR5cGVzLlNlcmlhbGl6ZWROdGlsZGUpOiBFY2RzYVR5cGVzLkRlc2VyaWFsaXplZE50aWxkZSB7XG4gICAgcmV0dXJuIEVjZHNhVHlwZXMuZGVzZXJpYWxpemVOdGlsZGUoY2hhbGxlbmdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgY2hhbGxlbmdlIGFuZCBpdCdzIHByb29mcyBmcm9tIGJpZyBpbnQgdG8gaGV4IHN0cmluZ3MuXG4gICAqIEBkZXByZWNhdGVkIHVzZSBzZGstbGliLW1wYyBFY2RzYVR5cGVzLmRlc2VyaWFsaXplTnRpbGRlIGluc3RlYWRcbiAgICogQHBhcmFtIGNoYWxsZW5nZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZU50aWxkZShjaGFsbGVuZ2U6IEVjZHNhVHlwZXMuRGVzZXJpYWxpemVkTnRpbGRlKTogRWNkc2FUeXBlcy5TZXJpYWxpemVkTnRpbGRlIHtcbiAgICByZXR1cm4gRWNkc2FUeXBlcy5zZXJpYWxpemVOdGlsZGUoY2hhbGxlbmdlKTtcbiAgfVxufVxuIl19
690
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYWNjb3VudC1saWIvbXBjL3Rzcy9lY2RzYS9lY2RzYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnRUFBa0Q7QUFDbEQsdUVBQXlEO0FBQ3pELHVEQUF5QztBQUN6Qyx5Q0FBNEQ7QUFDNUQsbUNBQXVEO0FBQ3ZELG1EQUE2QztBQUM3QyxxQ0FBeUc7QUFDekcseUNBQThDO0FBQzlDLDBEQUFrQztBQUNsQyx5REFBNEc7QUEyQjVHLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUV0QixTQUFTLFNBQVMsQ0FBQyxLQUFzQjtJQUN2QyxPQUFPLFFBQVEsSUFBSSxLQUFLLENBQUM7QUFDM0IsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBcUIsS0FBSztJQUl4Qjs7Ozs7Ozs7O09BU0c7SUFDSCxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQWEsRUFBRSxTQUFpQixFQUFFLFNBQWlCLEVBQUUsSUFBYSxFQUFFLElBQUksR0FBRyxLQUFLOztRQUM3RixJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDbkYsTUFBTSx5QkFBeUIsQ0FBQztTQUNqQztRQUVELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztTQUNqRTtRQUVELElBQUksbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1FBQy9CLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFO1lBQzVCLGtFQUFrRTtZQUNsRSxtQkFBbUIsR0FBRyxtQkFBVSxDQUFDLFFB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QUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDakQsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDakQsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDakQsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDakQsRUFBRSxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDbEQsRUFBRSxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDbkQsRUFBRSxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDbkQsRUFBRSxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDbkQsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDaEQsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2lCQUM1QzthQUNGLENBQUMsQ0FBQztZQUNILElBQUssZ0JBQTJCLENBQUMsS0FBSyxFQUFFO2dCQUN0QyxNQUFNLHVCQUF1QixHQUFHLGdCQUFtQyxDQUFDO2dCQUNwRSxNQUFN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QUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDdkcsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FDdkIsZUFBZSxFQUNmLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDWixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDakMsdUJBQWdCLENBQUMseUJBQVcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakQsdUJBQWdCLENBQUMseUJBQVcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7U0FDbEQsQ0FBQyxFQUNGLHlCQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQzVCLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFNBQXNDO1FBQzdELE9BQU8sd0JBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxlQUFlLENBQUMsU0FBd0M7UUFDN0QsT0FBTyx3QkFBVSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvQyxDQUFDOztBQXp3Qkgsd0JBMHdCQztBQXp3QlEsV0FBSyxHQUFtQixJQUFJLHVCQUFjLEVBQUUsQ0FBQztBQUM3QyxZQUFNLEdBQVcsSUFBSSxjQUFLLEVBQUUsQ0FBQztBQUM3QixZQUFNLEdBQVcsSUFBSSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhaWxsaWVyQmlnaW50IGZyb20gJ3BhaWxsaWVyLWJpZ2ludCc7XG5pbXBvcnQgKiBhcyBiaWdpbnRDcnlwdG9VdGlscyBmcm9tICdiaWdpbnQtY3J5cHRvLXV0aWxzJztcbmltcG9ydCAqIGFzIHNlY3AgZnJvbSAnQG5vYmxlL3NlY3AyNTZrMSc7XG5pbXBvcnQgSERUcmVlLCB7IEJJUDMyLCBjaGFpbmNvZGVCYXNlIH0gZnJvbSAnLi4vLi4vaGRUcmVlJztcbmltcG9ydCB7IGNyZWF0ZUhhc2gsIEhhc2gsIHJhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0IHsgYmlnSW50RnJvbUJ1ZmZlckJFLCBiaWdJbnRGcm9tVThBQkUsIGJpZ0ludFRvQnVmZmVyQkUsIGdldFBhaWxsaWVyUHVibGljS2V5IH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBTZWNwMjU2azFDdXJ2ZSB9IGZyb20gJy4uLy4uL2N1cnZlcyc7XG5pbXBvcnQgU2hhbWlyIGZyb20gJy4uLy4uL3NoYW1pcic7XG5pbXBvcnQgeyBFY2RzYVJhbmdlUHJvb2YsIEVjZHNhVHlwZXMsIHJhbmRvbVBvc2l0aXZlQ29QcmltZVRvLCBoZXhUb0JpZ0ludCB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItbXBjJztcbmltcG9ydCB7XG4gIEFTaGFyZSxcbiAgQlNoYXJlLFxuICBEU2hhcmUsXG4gIEdTaGFyZSxcbiAgS2V5Q29tYmluZWQsXG4gIEtleVNoYXJlLFxuICBLU2hhcmUsXG4gIE1VU2hhcmUsXG4gIE5TaGFyZSxcbiAgT1NoYXJlLFxuICBQU2hhcmUsXG4gIFNpZ25hdHVyZSxcbiAgU2lnbkNvbWJpbmUsXG4gIFNpZ25Db21iaW5lUlQsXG4gIFNpZ25Db252ZXJ0LFxuICBTaWduQ29udmVydFJULFxuICBTaWduU2hhcmVSVCxcbiAgU1NoYXJlLFxuICBTdWJrZXlTaGFyZSxcbiAgWFNoYXJlLFxuICBYU2hhcmVXaXRoTnRpbGRlLFxuICBZU2hhcmUsXG4gIFlTaGFyZVdpdGhOdGlsZGUsXG59IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBfNW4gPSBCaWdJbnQoNSk7XG5cbmZ1bmN0aW9uIGhhc050aWxkZShzaGFyZTogWFNoYXJlIHwgWVNoYXJlKTogc2hhcmUgaXMgWFNoYXJlV2l0aE50aWxkZSB8IFlTaGFyZVdpdGhOdGlsZGUge1xuICByZXR1cm4gJ250aWxkZScgaW4gc2hhcmU7XG59XG5cbi8qKlxuICogRUNEU0EgVFNTIGltcGxlbWVudGF0aW9uIHN1cHBvcnRpbmcgMjpuIFRocmVzaG9sZFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFY2RzYSB7XG4gIHN0YXRpYyBjdXJ2ZTogU2VjcDI1NmsxQ3VydmUgPSBuZXcgU2VjcDI1NmsxQ3VydmUoKTtcbiAgc3RhdGljIGhkVHJlZTogSERUcmVlID0gbmV3IEJJUDMyKCk7XG4gIHN0YXRpYyBzaGFtaXI6IFNoYW1pciA9IG5ldyBTaGFtaXIoRWNkc2EuY3VydmUpO1xuICAvKipcbiAgICogR2VuZXJhdGUgc2hhcmVzIGZvciBwYXJ0aWNpcGFudCBhdCBpbmRleCBhbmQgc3BsaXQga2V5cyBgKHRocmVzaG9sZCxudW1TaGFyZXMpYCB3YXlzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggcGFydGljaXBhbnQgaW5kZXhcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRocmVzaG9sZCBTaWduaW5nIHRocmVzaG9sZFxuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtU2hhcmVzICBOdW1iZXIgb2Ygc2hhcmVzXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBzZWVkIG9wdGlvbmFsIDY0IGJ5dGUgc2VlZCB0byB1c2UgZm9yIGtleSBnZW5lcmF0aW9uXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gc3luYyBvcHRpb25hbCBzeW5jIGZsYWcsIGlmIHRydWUgdGhlbiBhIHN5bmNocm9ub3VzIHZlcnNpb24gb2YgUGFpbGxpZXIga2V5IGdlbmVyYXRpb24gaXMgdXNlZCB0aGF0IGRvZXMgbm90IHNwYXduIFdvcmtlciB0aHJlYWRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxLZXlTaGFyZT59IFJldHVybnMgdGhlIHByaXZhdGUgcC1zaGFyZVxuICAgKiBhbmQgbi1zaGFyZXMgdG8gYmUgZGlzdHJpYnV0ZWQgdG8gcGFydGljaXBhbnRzIGF0IHRoZWlyIGNvcnJlc3BvbmRpbmcgaW5kZXguXG4gICAqL1xuICBhc3luYyBrZXlTaGFyZShpbmRleDogbnVtYmVyLCB0aHJlc2hvbGQ6IG51bWJlciwgbnVtU2hhcmVzOiBudW1iZXIsIHNlZWQ/OiBCdWZmZXIsIHN5bmMgPSBmYWxzZSk6IFByb21pc2U8S2V5U2hhcmU+IHtcbiAgICBpZiAoIShpbmRleCA+IDAgJiYgaW5kZXggPD0gbnVtU2hhcmVzICYmIHRocmVzaG9sZCA8PSBudW1TaGFyZXMgJiYgdGhyZXNob2xkID09PSAyKSkge1xuICAgICAgdGhyb3cgJ0ludmFsaWQgS2V5U2hhcmUgQ29uZmlnJztcbiAgICB9XG5cbiAgICBpZiAoc2VlZCAmJiBzZWVkLmxlbmd0aCA8IDY0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlZWQgbXVzdCBoYXZlIGEgbGVuZ3RoIG9mIGF0IGxlYXN0IDY0IGJ5dGVzJyk7XG4gICAgfVxuXG4gICAgbGV0IHNlZWRXaXRoVmFsaWRMZW5ndGggPSBzZWVkO1xuICAgIGlmIChzZWVkICYmIHNlZWQubGVuZ3RoID4gNjQpIHtcbiAgICAgIC8vIGlmIHNlZWQgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiA2NCBieXRlcywgaGFzaCBzZWVkIHRvIDY0IGJ5dGVzLlxuICAgICAgc2VlZFdpdGhWYWxpZExlbmd0aCA9IGNyZWF0ZUhhc2goJ3NoYTUxMicpLnVwZGF0ZShzZWVkKS5kaWdlc3QoKTtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSBhZGRpdGl2ZWx5IGhvbW9tb3JwaGljIGVuY3J5cHRpb24ga2V5LlxuICAgIGxldCBwYWlsbGllcktleVBhaXI6IHBhaWxsaWVyQmlnaW50LktleVBhaXI7XG4gICAgaWYgKCFzeW5jKSB7XG4gICAgICBwYWlsbGllcktleVBhaXIgPSBhd2FpdCBwYWlsbGllckJpZ2ludC5nZW5lcmF0ZVJhbmRvbUtleXMoMzA3MiwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhaWxsaWVyS2V5UGFpciA9IHBhaWxsaWVyQmlnaW50LmdlbmVyYXRlUmFuZG9tS2V5c1N5bmMoMzA3MiwgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IHsgcHVibGljS2V5LCBwcml2YXRlS2V5IH0gPSBwYWlsbGllcktleVBhaXI7XG4gICAgLy8gQWNjZXB0IGEgNjQgYnl0ZSBzZWVkIGFuZCBjcmVhdGUgYW4gZXh0ZW5kZWQgcHJpdmF0ZSBrZXkgZnJvbSB0aGF0IHNlZWRcbiAgICBjb25zdCBzZWNyZXRLZXkgPSBzZWVkV2l0aFZhbGlkTGVuZ3RoICYmIGJpcDMyLmZyb21TZWVkKHNlZWRXaXRoVmFsaWRMZW5ndGgpO1xuICAgIGNvbnN0IHUgPVxuICAgICAgKHNlY3JldEtleSAmJiBzZWNyZXRLZXkucHJpdmF0ZUtleSAmJiBiaWdJbnRGcm9tVThBQkUobmV3IFVpbnQ4QXJyYXkoc2VjcmV0S2V5LnByaXZhdGVLZXkpKSkgPz9cbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhclJhbmRvbSgpO1xuICAgIGNvbnN0IHkgPSBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KHUpO1xuICAgIGNvbnN0IGNoYWluY29kZSA9IChzZWNyZXRLZXkgJiYgc2VjcmV0S2V5LmNoYWluQ29kZSkgPz8gcmFuZG9tQnl0ZXMoMzIpO1xuICAgIC8vIENvbXB1dGUgc2VjcmV0IHNoYXJlcyBvZiB0aGUgcHJpdmF0ZSBrZXlcbiAgICBjb25zdCB7IHNoYXJlczogdVNoYXJlcywgdiB9ID0gRWNkc2Euc2hhbWlyLnNwbGl0KHUsIHRocmVzaG9sZCwgbnVtU2hhcmVzKTtcbiAgICBjb25zdCBjdXJyZW50UGFydGljaXBhbnQ6IFBTaGFyZSA9IHtcbiAgICAgIGk6IGluZGV4LFxuICAgICAgdDogdGhyZXNob2xkLFxuICAgICAgYzogbnVtU2hhcmVzLFxuICAgICAgbDogYmlnSW50VG9CdWZmZXJCRShwcml2YXRlS2V5LmxhbWJkYSwgMTkyKS50b1N0cmluZygnaGV4JyksXG4gICAgICBtOiBiaWdJbnRUb0J1ZmZlckJFKHByaXZhdGVLZXkubXUsIDE5MikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgbjogYmlnSW50VG9CdWZmZXJCRShwdWJsaWNLZXkubiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB5OiBiaWdJbnRUb0J1ZmZlckJFKHksIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHVTaGFyZXNbaW5kZXhdLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdXU6IHUudG9TdHJpbmcoKSxcbiAgICAgIGNoYWluY29kZTogY2hhaW5jb2RlLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuICAgIGNvbnN0IGtleVNoYXJlOiBLZXlTaGFyZSA9IHtcbiAgICAgIHBTaGFyZTogY3VycmVudFBhcnRpY2lwYW50LFxuICAgICAgblNoYXJlczoge30sXG4gICAgfTtcblxuICAgIGZvciAoY29uc3Qgc2hhcmUgaW4gdVNoYXJlcykge1xuICAgICAgY29uc3QgcGFydGljaXBhbnRJbmRleCA9IHBhcnNlSW50KHNoYXJlLCAxMCk7XG4gICAgICBpZiAocGFydGljaXBhbnRJbmRleCAhPT0gaW5kZXgpIHtcbiAgICAgICAga2V5U2hhcmUublNoYXJlc1twYXJ0aWNpcGFudEluZGV4XSA9IHtcbiAgICAgICAgICBpOiBwYXJ0aWNpcGFudEluZGV4LFxuICAgICAgICAgIGo6IGN1cnJlbnRQYXJ0aWNpcGFudFsnaSddLFxuICAgICAgICAgIG46IHB1YmxpY0tleS5uLnRvU3RyaW5nKDE2KSxcbiAgICAgICAgICB5OiBiaWdJbnRUb0J1ZmZlckJFKHksIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdjogYmlnSW50VG9CdWZmZXJCRSh2WzBdLCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUodVNoYXJlc1twYXJ0aWNpcGFudEluZGV4XSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBjaGFpbmNvZGU6IGNoYWluY29kZS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIH0gYXMgTlNoYXJlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ga2V5U2hhcmU7XG4gIH1cblxuICAvKipcbiAgICogQ29tYmluZSBkYXRhIHNoYXJlZCBkdXJpbmcgdGhlIGtleSBnZW5lcmF0aW9uIHByb3RvY29sLlxuICAgKiBAcGFyYW0ge0tleVNoYXJlfSBwYXJ0aWNpcGFudFNoYXJlcyBwcml2YXRlIHAtc2hhcmUgYW5kXG4gICAqIG4tc2hhcmVzIHJlY2VpdmVkIGZyb20gYWxsIG90aGVyIHBhcnRpY2lwYW50cy5cbiAgICogQHJldHVybnMge0tleUNvbWJpbmVkfSBSZXR1cm5zIHRoZSBwYXJ0aWNpcGFudCBwcml2YXRlIHgtc2hhcmVcbiAgICogYW5kIHktc2hhcmVzIHRvIGJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHNpZ25pbmcgc2hhcmVzLlxuICAgKi9cbiAga2V5Q29tYmluZShwU2hhcmU6IFBTaGFyZSwgblNoYXJlczogTlNoYXJlW10pOiBLZXlDb21iaW5lZCB7XG4gICAgY29uc3QgYWxsU2hhcmVzID0gW3BTaGFyZSwgLi4ublNoYXJlc107XG4gICAgLy8gQ29tcHV0ZSB0aGUgcHVibGljIGtleS5cbiAgICBjb25zdCB5ID0gYWxsU2hhcmVzLm1hcCgocGFydGljaXBhbnQpID0+IGhleFRvQmlnSW50KHBhcnRpY2lwYW50Wyd5J10pKS5yZWR1Y2UoRWNkc2EuY3VydmUucG9pbnRBZGQpO1xuICAgIC8vIEFkZCBzZWNyZXQgc2hhcmVzXG4gICAgY29uc3QgeCA9IGFsbFNoYXJlcy5tYXAoKHBhcnRpY2lwYW50KSA9PiBoZXhUb0JpZ0ludChwYXJ0aWNpcGFudFsndSddKSkucmVkdWNlKEVjZHNhLmN1cnZlLnNjYWxhckFkZCk7XG5cbiAgICAvLyBWZXJpZnkgc2hhcmVzLlxuICAgIGZvciAoY29uc3Qgc2hhcmUgb2YgblNoYXJlcykge1xuICAgICAgaWYgKHNoYXJlLnYpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBFY2RzYS5zaGFtaXIudmVyaWZ5KGhleFRvQmlnSW50KHNoYXJlLnUpLCBbaGV4VG9CaWdJbnQoc2hhcmUueSksIGhleFRvQmlnSW50KHNoYXJlLnYhKV0sIHBTaGFyZS5pKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgdmVyaWZ5IHNoYXJlIGZyb20gcGFydGljaXBhbnQgJHtzaGFyZS5qfS4gVmVyaWZpY2F0aW9uIGVycm9yOiAke2Vycn1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoYWluY29kZSB3aWxsIGJlIHVzZWQgaW4gZnV0dXJlIHdoZW4gd2UgYWRkIHN1cHBvcnQgZm9yIGtleSBkZXJpdmF0aW9uIGZvciBlY2RzYVxuICAgIGNvbnN0IGNoYWluY29kZXMgPSBbcFNoYXJlLCAuLi5uU2hhcmVzXS5tYXAoKHsgY2hhaW5jb2RlIH0pID0+IGJpZ0ludEZyb21CdWZmZXJCRShCdWZmZXIuZnJvbShjaGFpbmNvZGUsICdoZXgnKSkpO1xuICAgIGNvbnN0IGNoYWluY29kZSA9IGNoYWluY29kZXMucmVkdWNlKFxuICAgICAgKGFjYywgY2hhaW5jb2RlKSA9PlxuICAgICAgICAoYWNjICsgY2hhaW5jb2RlKSAlIEJpZ0ludCgnMHgwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnKSAvLyAyXjI1NlxuICAgICk7XG5cbiAgICBjb25zdCBwYXJ0aWNpcGFudHM6IEtleUNvbWJpbmVkID0ge1xuICAgICAgeFNoYXJlOiB7XG4gICAgICAgIGk6IHBTaGFyZS5pLFxuICAgICAgICBsOiBwU2hhcmUubCxcbiAgICAgICAgbTogcFNoYXJlLm0sXG4gICAgICAgIG46IHBTaGFyZS5uLFxuICAgICAgICB5OiBiaWdJbnRUb0J1ZmZlckJFKHksIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHg6IGJpZ0ludFRvQnVmZmVyQkUoeCwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgY2hhaW5jb2RlOiBiaWdJbnRUb0J1ZmZlckJFKGNoYWluY29kZSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH0sXG4gICAgICB5U2hhcmVzOiB7fSxcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBzaGFyZSBpbiBuU2hhcmVzKSB7XG4gICAgICBjb25zdCBwYXJ0aWNpcGFudEluZGV4ID0gblNoYXJlc1tzaGFyZV1bJ2onXTtcbiAgICAgIHBhcnRpY2lwYW50cy55U2hhcmVzW3BhcnRpY2lwYW50SW5kZXhdID0ge1xuICAgICAgICBpOiBwU2hhcmUuaSxcbiAgICAgICAgajogblNoYXJlc1tzaGFyZV1bJ2onXSxcbiAgICAgICAgbjogblNoYXJlc1tzaGFyZV1bJ24nXSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBwYXJ0aWNpcGFudHM7XG4gIH1cblxuICAvKipcbiAgICogRGVyaXZlIHNoYXJlcyBmb3IgYSBCSVAtMzIgc3Via2V5LlxuICAgKiBAcGFyYW0ge1BTaGFyZX0gVGhlIHVzZXIncyBwLXNoYXJlLlxuICAgKiBAcGFyYW0ge05TaGFyZVtdfSBUaGUgbi1zaGFyZXMgcmVjZWl2ZWQgZnJvbSB0aGUgb3RoZXIgcGFydGljaXBhbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gVGhlIEJJUC0zMiBwYXRoIHRvIGRlcml2ZS5cbiAgICogQHJldHVybnMge1N1YmtleVNoYXJlfSBSZXR1cm5zIHRoZSBwcml2YXRlIHgtc2hhcmUgYW5kIG4tc2hhcmVzIHRvXG4gICAqIGJlIGRpc3RyaWJ1dGVkIHRvIHBhcnRpY2lwYW50cyBhdCB0aGVpciBjb3JyZXNwb25kaW5nIGluZGV4LlxuICAgKi9cbiAga2V5RGVyaXZlKHBTaGFyZTogUFNoYXJlLCBuU2hhcmVzOiBOU2hhcmVbXSwgcGF0aDogc3RyaW5nKTogU3Via2V5U2hhcmUge1xuICAgIGNvbnN0IHlWYWx1ZXMgPSBbcFNoYXJlLCAuLi5uU2hhcmVzXS5tYXAoKHNoYXJlKSA9PiBoZXhUb0JpZ0ludChzaGFyZS55KSk7XG4gICAgY29uc3QgeSA9IHlWYWx1ZXMucmVkdWNlKChwYXJ0aWFsLCBzaGFyZSkgPT4gRWNkc2EuY3VydmUucG9pbnRBZGQocGFydGlhbCwgc2hhcmUpKTtcbiAgICBjb25zdCB1ID0gQmlnSW50KHBTaGFyZS51dSk7XG4gICAgbGV0IGNvbnRyaWJDaGFpbmNvZGUgPSBoZXhUb0JpZ0ludChwU2hhcmUuY2hhaW5jb2RlKTtcbiAgICBjb25zdCBjaGFpbmNvZGVzID0gW2NvbnRyaWJDaGFpbmNvZGUsIC4uLm5TaGFyZXMubWFwKCh7IGNoYWluY29kZSB9KSA9PiBoZXhUb0JpZ0ludChjaGFpbmNvZGUpKV07XG4gICAgY29uc3QgY2hhaW5jb2RlID0gY2hhaW5jb2Rlcy5yZWR1Y2UoKGFjYywgY2hhaW5jb2RlKSA9PiAoYWNjICsgY2hhaW5jb2RlKSAlIGNoYWluY29kZUJhc2UpO1xuXG4gICAgLy8gVmVyaWZ5IHNoYXJlcy5cbiAgICBmb3IgKGNvbnN0IHNoYXJlIG9mIG5TaGFyZXMpIHtcbiAgICAgIGlmIChzaGFyZS52KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgRWNkc2Euc2hhbWlyLnZlcmlmeShoZXhUb0JpZ0ludChzaGFyZS51KSwgW2hleFRvQmlnSW50KHNoYXJlLnkpLCBoZXhUb0JpZ0ludChzaGFyZS52ISldLCBwU2hhcmUuaSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHZlcmlmeSBzaGFyZSBmcm9tIHBhcnRpY2lwYW50ICR7c2hhcmUuan0uIFZlcmlmaWNhdGlvbiBlcnJvcjogJHtlcnJ9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZXJpdmUgc3Via2V5LlxuICAgIGNvbnN0IHN1YmtleSA9IEVjZHNhLmhkVHJlZS5wcml2YXRlRGVyaXZlKHsgcGs6IHksIHNrOiB1LCBjaGFpbmNvZGUgfSwgcGF0aCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgbmV3IHB1YmxpYyBrZXkgY29udHJpYnV0aW9uLlxuICAgIGNvbnN0IGNvbnRyaWJZID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdChzdWJrZXkuc2spO1xuXG4gICAgLy8gQ2FsY3VsYXRlIG5ldyBjaGFpbmNvZGUgY29udHJpYnV0aW9uLlxuICAgIGNvbnN0IGNoYWluY29kZURlbHRhID0gKGNoYWluY29kZUJhc2UgKyBzdWJrZXkuY2hhaW5jb2RlIC0gY2hhaW5jb2RlKSAlIGNoYWluY29kZUJhc2U7XG4gICAgY29udHJpYkNoYWluY29kZSA9IChjb250cmliQ2hhaW5jb2RlICsgY2hhaW5jb2RlRGVsdGEpICUgY2hhaW5jb2RlQmFzZTtcblxuICAgIC8vIENhbGN1bGF0ZSBuZXcgdSB2YWx1ZXMuXG4gICAgY29uc3QgeyBzaGFyZXM6IHNwbGl0X3UsIHYgfSA9IEVjZHNhLnNoYW1pci5zcGxpdChzdWJrZXkuc2ssIHBTaGFyZS50IHx8IDIsIHBTaGFyZS5jIHx8IDMpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIG5ldyBzaWduaW5nIGtleS5cbiAgICBjb25zdCB4ID0gW3NwbGl0X3VbcFNoYXJlLmldLCAuLi5uU2hhcmVzLm1hcCgoeyB1IH0pID0+IGhleFRvQmlnSW50KHUpKV0ucmVkdWNlKEVjZHNhLmN1cnZlLnNjYWxhckFkZCk7XG5cbiAgICBjb25zdCBQX2k6IFhTaGFyZSA9IHtcbiAgICAgIGk6IHBTaGFyZS5pLFxuICAgICAgbDogcFNoYXJlLmwsXG4gICAgICBtOiBwU2hhcmUubSxcbiAgICAgIG46IHBTaGFyZS5uLFxuICAgICAgeTogYmlnSW50VG9CdWZmZXJCRShzdWJrZXkucGssIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICB4OiBiaWdJbnRUb0J1ZmZlckJFKHgsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICBjaGFpbmNvZGU6IGJpZ0ludFRvQnVmZmVyQkUoc3Via2V5LmNoYWluY29kZSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuXG4gICAgY29uc3Qgc2hhcmVzOiBTdWJrZXlTaGFyZSA9IHtcbiAgICAgIHhTaGFyZTogUF9pLFxuICAgICAgblNoYXJlczoge30sXG4gICAgfTtcblxuICAgIGZvciAobGV0IGluZCA9IDA7IGluZCA8IG5TaGFyZXMubGVuZ3RoOyBpbmQrKykge1xuICAgICAgY29uc3QgUF9qID0gblNoYXJlc1tpbmRdO1xuICAgICAgc2hhcmVzLm5TaGFyZXNbUF9qLmpdID0ge1xuICAgICAgICBpOiBQX2ouaixcbiAgICAgICAgajogUF9pLmksXG4gICAgICAgIG46IFBfai5uLFxuICAgICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHNwbGl0X3VbUF9qLmpdLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB5OiBiaWdJbnRUb0J1ZmZlckJFKGNvbnRyaWJZLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB2OiBiaWdJbnRUb0J1ZmZlckJFKHZbMF0sIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIGNoYWluY29kZTogYmlnSW50VG9CdWZmZXJCRShjb250cmliQ2hhaW5jb2RlLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2hhcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcml2ZXMgYSBjaGlsZCBjb21tb24ga2V5Y2hhaW4gZnJvbSBjb21tb24ga2V5Y2hhaW5cbiAgICpcbiAgICogQHBhcmFtIHtjb21tb25LZXljaGFpbn0gVGhlIGNvbW1vbiBrZXljaGFpbiBhcyBhIGhleCBzdHJpbmcuXG4gICAqIEBwYXJhbSB7cGF0aH0gVGhlIEJJUC0zMiBwYXRoIHRvIGRlcml2ZS5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZGVyaXZlZCBjb21tb24ga2V5Y2hhaW4gYXMgYSBoZXggc3RyaW5nLlxuICAgKi9cbiAgZGVyaXZlVW5oYXJkZW5lZChjb21tb25LZXljaGFpbjogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChFY2RzYS5oZFRyZWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgZGVyaXZlIGtleSB3aXRob3V0IEhEVHJlZSBpbXBsZW1lbnRhdGlvblwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXljaGFpbiA9IEJ1ZmZlci5mcm9tKGNvbW1vbktleWNoYWluLCAnaGV4Jyk7XG5cbiAgICBjb25zdCBkZXJpdmVkUHVibGljS2V5Y2hhaW4gPSBFY2RzYS5oZFRyZWUucHVibGljRGVyaXZlKFxuICAgICAge1xuICAgICAgICBwazogYmlnSW50RnJvbUJ1ZmZlckJFKGtleWNoYWluLnNsaWNlKDAsIDMzKSksXG4gICAgICAgIGNoYWluY29kZTogYmlnSW50RnJvbUJ1ZmZlckJFKGtleWNoYWluLnNsaWNlKDMzKSksXG4gICAgICB9LFxuICAgICAgcGF0aFxuICAgICk7XG5cbiAgICBjb25zdCBkZXJpdmVkUGsgPSBiaWdJbnRUb0J1ZmZlckJFKGRlcml2ZWRQdWJsaWNLZXljaGFpbi5waywgMzMpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBkZXJpdmVkQ2hhaW5jb2RlID0gYmlnSW50VG9CdWZmZXJCRShkZXJpdmVkUHVibGljS2V5Y2hhaW4uY2hhaW5jb2RlLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgcmV0dXJuIGRlcml2ZWRQayArIGRlcml2ZWRDaGFpbmNvZGU7XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBhIGdpdmVuIHJhbmdlIHByb29mIGNoYWxsZW5nZSB0byB0aGUgc2hhcmVzIHByZXZpb3VzbHkgY3JlYXRlZFxuICAgKiBieSAja2V5Q29tYmluZS4gR2VuZXJhdGVzIGEgbmV3IGNoYWxsZW5nZSBpZiBub3QgcHJvdmlkZWQuXG4gICAqIEBwYXJhbSB7WFNoYXJlIHwgWVNoYXJlfSBzaGFyZSBQcml2YXRlIHhTaGFyZSBvciB5U2hhcmUgb2YgdGhlIHNpZ25pbmcgb3BlcmF0aW9uXG4gICAqIEBwYXJhbSB7RWNkc2FUeXBlcy5TZXJpYWxpemVkTnRpbGRlfSBjaGFsbGVuZ2VcbiAgICogQHJldHVybnMge0tleUNvbWJpbmVkfSBUaGUgc2hhcmUgd2l0aCBhbWVuZGVkIGNoYWxsZW5nZSB2YWx1ZXNcbiAgICovXG4gIGFzeW5jIGFwcGVuZENoYWxsZW5nZTxUIGV4dGVuZHMgWFNoYXJlIHwgWVNoYXJlPihcbiAgICBzaGFyZTogVCxcbiAgICBjaGFsbGVuZ2U/OiBFY2RzYVR5cGVzLlNlcmlhbGl6ZWROdGlsZGVcbiAgKTogUHJvbWlzZTxUICYgRWNkc2FUeXBlcy5TZXJpYWxpemVkTnRpbGRlPiB7XG4gICAgaWYgKCFjaGFsbGVuZ2UpIHtcbiAgICAgIGNoYWxsZW5nZSA9IEVjZHNhVHlwZXMuc2VyaWFsaXplTnRpbGRlKGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi5nZW5lcmF0ZU50aWxkZSgzMDcyKSk7XG4gICAgfVxuICAgIGNvbnN0IHsgbnRpbGRlLCBoMSwgaDIgfSA9IGNoYWxsZW5nZTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc2hhcmUsXG4gICAgICBudGlsZGUsXG4gICAgICBoMSxcbiAgICAgIGgyLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHNpZ25pbmcgc2hhcmVzLlxuICAgKiBAcGFyYW0ge3hTaGFyZX0geFNoYXJlIFByaXZhdGUgeFNoYXJlIG9mIGN1cnJlbnQgcGFydGljaXBhbnQgc2lnbmVyXG4gICAqIEBwYXJhbSB7WVNoYXJlfSB5U2hhcmUgeVNoYXJlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG90aGVyIHBhcnRpY2lwYW50IHNpZ25lclxuICAgKiBAcmV0dXJucyB7U2lnblNoYXJlUlR9IFJldHVybnMgdGhlIHBhcnRpY2lwYW50IHByaXZhdGUgdy1zaGFyZVxuICAgKiBhbmQgay1zaGFyZSB0byBiZSBkaXN0cmlidXRlZCB0byBvdGhlciBwYXJ0aWNpcGFudCBzaWduZXJcbiAgICovXG4gIGFzeW5jIHNpZ25TaGFyZSh4U2hhcmU6IFhTaGFyZSB8IFhTaGFyZVdpdGhOdGlsZGUsIHlTaGFyZTogWVNoYXJlV2l0aE50aWxkZSk6IFByb21pc2U8U2lnblNoYXJlUlQ+IHtcbiAgICBjb25zdCBwayA9IGdldFBhaWxsaWVyUHVibGljS2V5KGhleFRvQmlnSW50KHhTaGFyZS5uKSk7XG5cbiAgICAvLyBHZW5lcmF0ZSBhIGNoYWxsZW5nZSBpZiBudGlsZGUgaXMgbm90IHByZXNlbnQgaW4gdGhlIHhTaGFyZS5cbiAgICBpZiAoIWhhc050aWxkZSh4U2hhcmUpKSB7XG4gICAgICB4U2hhcmUgPSBhd2FpdCB0aGlzLmFwcGVuZENoYWxsZW5nZSh4U2hhcmUpO1xuICAgIH1cblxuICAgIGNvbnN0IGsgPSBFY2RzYS5jdXJ2ZS5zY2FsYXJSYW5kb20oKTtcbiAgICBjb25zdCByayA9IGF3YWl0IHJhbmRvbVBvc2l0aXZlQ29QcmltZVRvKHBrLm4pO1xuICAgIGNvbnN0IGNrID0gcGsuZW5jcnlwdChrLCByayk7XG4gICAgY29uc3QgZ2FtbWEgPSBFY2RzYS5jdXJ2ZS5zY2FsYXJSYW5kb20oKTtcblxuICAgIGNvbnN0IGQgPSBFY2RzYS5jdXJ2ZS5zY2FsYXJNdWx0KEVjZHNhLmN1cnZlLnNjYWxhclN1YihCaWdJbnQoeVNoYXJlLmopLCBCaWdJbnQoeFNoYXJlLmkpKSwgQmlnSW50KHhTaGFyZS5pKSk7XG5cbiAgICBjb25zdCB3ID0gW1xuICAgICAgRWNkc2EuY3VydmUuc2NhbGFyTXVsdChCaWdJbnQoeVNoYXJlLmopLCBCaWdJbnQoeFNoYXJlLmkpKSxcbiAgICAgIGhleFRvQmlnSW50KHhTaGFyZVsneCddKSxcbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhckludmVydChkKSxcbiAgICBdLnJlZHVjZShFY2RzYS5jdXJ2ZS5zY2FsYXJNdWx0KTtcblxuICAgIGNvbnN0IHsgbnRpbGRlOiBudGlsZGVhLCBoMTogaDFhLCBoMjogaDJhIH0gPSB4U2hhcmUgYXMgWFNoYXJlV2l0aE50aWxkZTtcblxuICAgIGNvbnN0IHNpZ25lcnM6IFNpZ25TaGFyZVJUID0ge1xuICAgICAgd1NoYXJlOiB7XG4gICAgICAgIGk6IHhTaGFyZS5pLFxuICAgICAgICBsOiB4U2hhcmUubCxcbiAgICAgICAgbTogeFNoYXJlLm0sXG4gICAgICAgIG46IHhTaGFyZS5uLFxuICAgICAgICB5OiB4U2hhcmUueSxcbiAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICBoMTogaDFhLFxuICAgICAgICBoMjogaDJhLFxuICAgICAgICBrOiBiaWdJbnRUb0J1ZmZlckJFKGssIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIGNrOiBiaWdJbnRUb0J1ZmZlckJFKGNrLCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgdzogYmlnSW50VG9CdWZmZXJCRSh3LCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBnYW1tYTogYmlnSW50VG9CdWZmZXJCRShnYW1tYSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH0sXG4gICAgICBrU2hhcmU6IHt9IGFzIEtTaGFyZSxcbiAgICB9O1xuXG4gICAgY29uc3QgeyBudGlsZGU6IG50aWxkZWIsIGgxOiBoMWIsIGgyOiBoMmIgfSA9IHlTaGFyZTtcbiAgICBjb25zdCBwcm9vZiA9IGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi5wcm92ZShcbiAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgMzA3MixcbiAgICAgIHBrLFxuICAgICAge1xuICAgICAgICBudGlsZGU6IGhleFRvQmlnSW50KG50aWxkZWIpLFxuICAgICAgICBoMTogaGV4VG9CaWdJbnQoaDFiKSxcbiAgICAgICAgaDI6IGhleFRvQmlnSW50KGgyYiksXG4gICAgICB9LFxuICAgICAgY2ssXG4gICAgICBrLFxuICAgICAgcmtcbiAgICApO1xuICAgIGNvbnN0IHByb29mU2hhcmUgPSB7XG4gICAgICB6OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnosIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi51LCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHc6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgczE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczEsIDk2KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgfTtcblxuICAgIHNpZ25lcnMua1NoYXJlID0ge1xuICAgICAgaTogeVNoYXJlLmosXG4gICAgICBqOiB4U2hhcmUuaSxcbiAgICAgIG46IHBrLm4udG9TdHJpbmcoMTYpLFxuICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgaDE6IGgxYSxcbiAgICAgIGgyOiBoMmEsXG4gICAgICBrOiBiaWdJbnRUb0J1ZmZlckJFKGNrLCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHByb29mOiBwcm9vZlNoYXJlLFxuICAgIH07XG5cbiAgICByZXR1cm4gc2lnbmVycztcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIG11bHRpcGxpY2l0aXZlLXRvLWFkZGl0aXZlIChNdEEpIHNoYXJlIGNvbnZlcnNpb24gd2l0aCBhbm90aGVyXG4gICAqIHNpZ25lci5cbiAgICogQHBhcmFtIHtTaWduQ29udmVydH1cbiAgICogQHJldHVybnMge1NpZ25Db252ZXJ0UlR9XG4gICAqL1xuICBhc3luYyBzaWduQ29udmVydChzaGFyZXM6IFNpZ25Db252ZXJ0KTogUHJvbWlzZTxTaWduQ29udmVydFJUPiB7XG4gICAgbGV0IHNoYXJlUGFydGljaXBhbnQ6IFBhcnRpYWw8QlNoYXJlPiB8IFBhcnRpYWw8R1NoYXJlPiwgc2hhcmVUb0JlU2VudDogUGFydGlhbDxBU2hhcmU+IHwgTVVTaGFyZTtcbiAgICBsZXQgaXNHYW1tYVNoYXJlID0gZmFsc2U7XG4gICAgbGV0IGtTaGFyZTogUGFydGlhbDxLU2hhcmU+ID0ge307XG4gICAgaWYgKHNoYXJlcy54U2hhcmUgJiYgc2hhcmVzLnlTaGFyZSAmJiBzaGFyZXMua1NoYXJlKSB7XG4gICAgICBjb25zdCB4U2hhcmUgPSBzaGFyZXMueFNoYXJlOyAvLyBjdXJyZW50UGFydGljaXBhbnQgc2VjcmV0IHhTaGFyZVxuICAgICAgY29uc3QgeVNoYXJlID0ge1xuICAgICAgICAuLi5zaGFyZXMueVNoYXJlLFxuICAgICAgICBudGlsZGU6IHNoYXJlcy5rU2hhcmUubnRpbGRlLFxuICAgICAgICBoMTogc2hhcmVzLmtTaGFyZS5oMSxcbiAgICAgICAgaDI6IHNoYXJlcy5rU2hhcmUuaDIsXG4gICAgICB9O1xuICAgICAgY29uc3Qgc2lnblNoYXJlID0gYXdhaXQgdGhpcy5zaWduU2hhcmUoeFNoYXJlLCB5U2hhcmUpO1xuICAgICAga1NoYXJlID0gc2lnblNoYXJlLmtTaGFyZTtcbiAgICAgIHNoYXJlVG9CZVNlbnQgPSB7IC4uLnNoYXJlcy5rU2hhcmUgfSBhcyBQYXJ0aWFsPEFTaGFyZT47XG4gICAgICBzaGFyZVBhcnRpY2lwYW50ID0geyAuLi5zaWduU2hhcmUud1NoYXJlIH0gYXMgUGFydGlhbDxCU2hhcmU+O1xuICAgIH0gZWxzZSBpZiAoKHNoYXJlcy5iU2hhcmUgJiYgc2hhcmVzLm11U2hhcmUpIHx8IChzaGFyZXMuYVNoYXJlICYmIHNoYXJlcy53U2hhcmUpKSB7XG4gICAgICBpc0dhbW1hU2hhcmUgPSB0cnVlO1xuICAgICAgc2hhcmVUb0JlU2VudCA9IHNoYXJlcy5hU2hhcmUgPyAoeyAuLi5zaGFyZXMuYVNoYXJlIH0gYXMgTVVTaGFyZSkgOiAoeyAuLi5zaGFyZXMubXVTaGFyZSB9IGFzIE1VU2hhcmUpO1xuICAgICAgc2hhcmVQYXJ0aWNpcGFudCA9IHNoYXJlcy53U2hhcmUgPyAoeyAuLi5zaGFyZXMud1NoYXJlIH0gYXMgUGFydGlhbDxHU2hhcmU+KSA6ICh7IC4uLnNoYXJlcy5iU2hhcmUgfSBhcyBHU2hhcmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29uZmlnIGZvciBTaWduIENvbnZlcnQnKTtcbiAgICB9XG4gICAgaWYgKHNoYXJlUGFydGljaXBhbnQuaSAhPT0gc2hhcmVUb0JlU2VudC5pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NoYXJlcyBmcm9tIHNhbWUgcGFydGljaXBhbnQnKTtcbiAgICB9XG4gICAgaWYgKChzaGFyZVRvQmVTZW50IGFzIEFTaGFyZSkuYWxwaGEpIHtcbiAgICAgIGNvbnN0IGJTaGFyZVBhcnRpY2lwYW50ID0gc2hhcmVQYXJ0aWNpcGFudCBhcyBCU2hhcmU7XG4gICAgICBjb25zdCBhU2hhcmVUb0JlU2VudCA9IHNoYXJlVG9CZVNlbnQgYXMgQVNoYXJlO1xuICAgICAgY29uc3QgcGthID0gZ2V0UGFpbGxpZXJQdWJsaWNLZXkoaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQubikpO1xuICAgICAgbGV0IG50aWxkZWEsIGgxYSwgaDJhLCBjaztcbiAgICAgIGlmIChiU2hhcmVQYXJ0aWNpcGFudC5udGlsZGUpIHtcbiAgICAgICAgbnRpbGRlYSA9IGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50Lm50aWxkZSk7XG4gICAgICAgIGgxYSA9IGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50LmgxKTtcbiAgICAgICAgaDJhID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQuaDIpO1xuICAgICAgICBjayA9IGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50LmNrKTtcbiAgICAgIH1cbiAgICAgIC8vIFZlcmlmeSAkXFxnYW1tYV9pIFxcaW4gWl97Tl4yfSQuXG4gICAgICBpZiAoXG4gICAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5V2l0aENoZWNrKFxuICAgICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICAgIDMwNzIsXG4gICAgICAgICAgcGthLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICAgIGgxOiBoMWEsXG4gICAgICAgICAgICBoMjogaDJhLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgejogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi56KSxcbiAgICAgICAgICAgIHpwcm06IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YuenBybSksXG4gICAgICAgICAgICB0OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnQpLFxuICAgICAgICAgICAgdjogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi52KSxcbiAgICAgICAgICAgIHc6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YudyksXG4gICAgICAgICAgICBzOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnMpLFxuICAgICAgICAgICAgczE6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YuczEpLFxuICAgICAgICAgICAgczI6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YuczIpLFxuICAgICAgICAgICAgdDE6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YudDEpLFxuICAgICAgICAgICAgdDI6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YudDIpLFxuICAgICAgICAgICAgdTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi51KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNrLFxuICAgICAgICAgIGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmFscGhhKSxcbiAgICAgICAgICBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLngpXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCB2ZXJpZnkgc2lnbmluZyBzaGFyZSBmb3IgZ2FtbWEgcHJvb2YnKTtcbiAgICAgIH1cbiAgICAgIC8vIFZlcmlmeSAkXFx3X2kgXFxpbiBaX3tOXjJ9JC5cbiAgICAgIGlmIChcbiAgICAgICAgIUVjZHNhUmFuZ2VQcm9vZi52ZXJpZnlXaXRoQ2hlY2soXG4gICAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgICAgMzA3MixcbiAgICAgICAgICBwa2EsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICAgICAgaDE6IGgxYSxcbiAgICAgICAgICAgIGgyOiBoMmEsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB6OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YueiksXG4gICAgICAgICAgICB6cHJtOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YuenBybSksXG4gICAgICAgICAgICB0OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YudCksXG4gICAgICAgICAgICB2OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YudiksXG4gICAgICAgICAgICB3OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YudyksXG4gICAgICAgICAgICBzOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YucyksXG4gICAgICAgICAgICBzMTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnMxKSxcbiAgICAgICAgICAgIHMyOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YuczIpLFxuICAgICAgICAgICAgdDE6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi50MSksXG4gICAgICAgICAgICB0MjogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnQyKSxcbiAgICAgICAgICAgIHU6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi51KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNrLFxuICAgICAgICAgIGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50Lm11KSxcbiAgICAgICAgICBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YueClcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHZlcmlmeSBzaGFyZSBmb3Igd1Byb29mJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzayA9IG5ldyBwYWlsbGllckJpZ2ludC5Qcml2YXRlS2V5KFxuICAgICAgICBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5sIGFzIHN0cmluZyksXG4gICAgICAgIGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50Lm0gYXMgc3RyaW5nKSxcbiAgICAgICAgcGthXG4gICAgICApO1xuICAgICAgY29uc3QgZ1NoYXJlUGFydGljaXBhbnQgPSBzaGFyZVBhcnRpY2lwYW50IGFzIEdTaGFyZTtcbiAgICAgIGNvbnN0IG11U2hhcmVUb0JlU2VudCA9IHNoYXJlVG9CZVNlbnQgYXMgTVVTaGFyZTtcbiAgICAgIGNvbnN0IGFscGhhID0gc2suZGVjcnlwdChoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5hbHBoYSkpO1xuICAgICAgZ1NoYXJlUGFydGljaXBhbnQuYWxwaGEgPSBiaWdJbnRUb0J1ZmZlckJFKEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShhbHBoYSksIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBjb25zdCBtdSA9IHNrLmRlY3J5cHQoaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQubXUgYXMgc3RyaW5nKSk7IC8vIHJlY2hlY2sgZW5jcnlwdGVkIG51bWJlclxuICAgICAgZ1NoYXJlUGFydGljaXBhbnQubXUgPSBiaWdJbnRUb0J1ZmZlckJFKEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShtdSksIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBjb25zdCBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudCA9IHNoYXJlUGFydGljaXBhbnQgYXMgUGFydGlhbDxHU2hhcmU+O1xuICAgICAgY29uc3QgcGFydGlhbFNoYXJlVG9CZVNlbnQgPSBtdVNoYXJlVG9CZVNlbnQgYXMgUGFydGlhbDxNVVNoYXJlPjtcbiAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5sO1xuICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50Lm07XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlVG9CZVNlbnQuYWxwaGE7XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlVG9CZVNlbnQubXU7XG4gICAgfVxuICAgIGlmICgoc2hhcmVUb0JlU2VudCBhcyBBU2hhcmUpLmspIHtcbiAgICAgIGNvbnN0IGJTaGFyZVBhcnRpY2lwYW50ID0gc2hhcmVQYXJ0aWNpcGFudCBhcyBCU2hhcmU7XG4gICAgICBjb25zdCBhU2hhcmVUb0JlU2VudCA9IHNoYXJlVG9CZVNlbnQgYXMgQVNoYXJlO1xuICAgICAgY29uc3QgbiA9IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50Lm4pOyAvLyBQYWlsbGllciBwdWIgZnJvbSBvdGhlciBzaWduZXJcbiAgICAgIGNvbnN0IHBrYSA9IGdldFBhaWxsaWVyUHVibGljS2V5KG4pO1xuICAgICAgbGV0IG50aWxkZWEsIGgxYSwgaDJhLCBudGlsZGViLCBoMWIsIGgyYjtcbiAgICAgIGlmIChhU2hhcmVUb0JlU2VudC5udGlsZGUpIHtcbiAgICAgICAgbnRpbGRlYSA9IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50Lm50aWxkZSk7XG4gICAgICAgIGgxYSA9IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmgxKTtcbiAgICAgICAgaDJhID0gaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuaDIpO1xuICAgICAgICBudGlsZGViID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQubnRpbGRlKTtcbiAgICAgICAgaDFiID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQuaDEpO1xuICAgICAgICBoMmIgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5oMik7XG4gICAgICB9XG4gICAgICBjb25zdCBrID0gaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuayk7XG4gICAgICBpZiAoXG4gICAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5KFxuICAgICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICAgIDMwNzIsXG4gICAgICAgICAgcGthLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG50aWxkZTogbnRpbGRlYixcbiAgICAgICAgICAgIGgxOiBoMWIsXG4gICAgICAgICAgICBoMjogaDJiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgejogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQucHJvb2YueiksXG4gICAgICAgICAgICB1OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5wcm9vZi51KSxcbiAgICAgICAgICAgIHc6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LnByb29mLncpLFxuICAgICAgICAgICAgczogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQucHJvb2YucyksXG4gICAgICAgICAgICBzMTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQucHJvb2YuczEpLFxuICAgICAgICAgICAgczI6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LnByb29mLnMyKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGtcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHZlcmlmeSBzaWduaW5nIEEgc2hhcmUgcHJvb2YnKTtcbiAgICAgIH1cbiAgICAgIC8vIE10QSAka19qLCBcXGdhbW1hX2kkLlxuICAgICAgY29uc3QgYmV0YTAgPSBiaWdpbnRDcnlwdG9VdGlscy5yYW5kQmV0d2VlbihFY2RzYS5jdXJ2ZS5vcmRlcigpICoqIF81bik7XG4gICAgICBiU2hhcmVQYXJ0aWNpcGFudC5iZXRhID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKGJldGEwKSksIDMyKS50b1N0cmluZyhcbiAgICAgICAgJ2hleCdcbiAgICAgICk7XG4gICAgICBjb25zdCBnID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQuZ2FtbWEpO1xuICAgICAgY29uc3QgcmIgPSBhd2FpdCByYW5kb21Qb3NpdGl2ZUNvUHJpbWVUbyhwa2Eubik7XG4gICAgICBjb25zdCBjYiA9IHBrYS5lbmNyeXB0KGJldGEwLCByYik7XG4gICAgICBjb25zdCBhbHBoYSA9IHBrYS5hZGRpdGlvbihwa2EubXVsdGlwbHkoaywgZyksIGNiKTtcbiAgICAgIGFTaGFyZVRvQmVTZW50LmFscGhhID0gYmlnSW50VG9CdWZmZXJCRShhbHBoYSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIC8vIFByb3ZlICRcXGdhbW1hX2kgXFxpbiBaX3tOXjJ9JC5cbiAgICAgIGNvbnN0IGd4ID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdChnKTtcbiAgICAgIGxldCBwcm9vZiA9IGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi5wcm92ZVdpdGhDaGVjayhcbiAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgIDMwNzIsXG4gICAgICAgIHBrYSxcbiAgICAgICAge1xuICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgIGgyOiBoMmEsXG4gICAgICAgIH0sXG4gICAgICAgIGssXG4gICAgICAgIGFscGhhLFxuICAgICAgICBnLFxuICAgICAgICBiZXRhMCxcbiAgICAgICAgcmIsXG4gICAgICAgIGd4XG4gICAgICApO1xuICAgICAgT2JqZWN0LmFzc2lnbihhU2hhcmVUb0JlU2VudCwge1xuICAgICAgICBnYW1tYVByb29mOiB7XG4gICAgICAgICAgejogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB6cHJtOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnpwcm0sIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHQ6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudCwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi52LCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB3OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLncsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YucywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgczE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczEsIDk2KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgczI6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczIsIDQ4MCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHQxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQxLCAyMjQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB0MjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi51LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHg6IGJpZ0ludFRvQnVmZmVyQkUoZ3gsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIC8vIE10QSAka19qLCB3X2kkLlxuICAgICAgY29uc3QgbnUwID0gYmlnaW50Q3J5cHRvVXRpbHMucmFuZEJldHdlZW4oRWNkc2EuY3VydmUub3JkZXIoKSAqKiBfNW4pO1xuICAgICAgc2hhcmVQYXJ0aWNpcGFudC5udSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyTmVnYXRlKEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShudTApKSwgMzIpLnRvU3RyaW5nKFxuICAgICAgICAnaGV4J1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHcgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC53KTtcbiAgICAgIGNvbnN0IHJuID0gYXdhaXQgcmFuZG9tUG9zaXRpdmVDb1ByaW1lVG8ocGthLm4pO1xuICAgICAgY29uc3QgY24gPSBwa2EuZW5jcnlwdChudTAsIHJuKTtcbiAgICAgIGNvbnN0IG11ID0gcGthLmFkZGl0aW9uKHBrYS5tdWx0aXBseShrLCB3KSwgY24pO1xuICAgICAgc2hhcmVUb0JlU2VudC5tdSA9IGJpZ0ludFRvQnVmZmVyQkUobXUsIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAvLyBQcm92ZSAkXFx3X2kgXFxpbiBaX3tOXjJ9JC5cbiAgICAgIGNvbnN0IHd4ID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdCh3KTtcbiAgICAgIHByb29mID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnByb3ZlV2l0aENoZWNrKFxuICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgMzA3MixcbiAgICAgICAgcGthLFxuICAgICAgICB7XG4gICAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICAgIGgxOiBoMWEsXG4gICAgICAgICAgaDI6IGgyYSxcbiAgICAgICAgfSxcbiAgICAgICAgayxcbiAgICAgICAgaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQubXUpLFxuICAgICAgICB3LFxuICAgICAgICBudTAsXG4gICAgICAgIHJuLFxuICAgICAgICB3eFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oc2hhcmVUb0JlU2VudCwge1xuICAgICAgICB3UHJvb2Y6IHtcbiAgICAgICAgICB6OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnosIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHpwcm06IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuenBybSwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdDogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB2OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnYsIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHc6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgczogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBzMTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMSwgOTYpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBzMjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdDE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudDEsIDIyNCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHQyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnUsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgeDogYmlnSW50VG9CdWZmZXJCRSh3eCwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgaWYgKChzaGFyZVBhcnRpY2lwYW50IGFzIEdTaGFyZSkuYWxwaGEpIHtcbiAgICAgICAgY29uc3QgcGFydGlhbFNoYXJlUGFydGljaXBhbnQgPSBzaGFyZVBhcnRpY2lwYW50IGFzIFBhcnRpYWw8QlNoYXJlPjtcbiAgICAgICAgY29uc3QgcGFydGlhbFNoYXJlVG9CZVNlbnQgPSBzaGFyZVRvQmVTZW50IGFzIFBhcnRpYWw8QVNoYXJlPjtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50Lm50aWxkZTtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50LmgxO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuaDI7XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5jaztcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50Lm47XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5udGlsZGU7XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5oMTtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50LmgyO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlVG9CZVNlbnQuaztcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50LnByb29mO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzaGFyZVRvQmVTZW50LCB7XG4gICAgICAgICAgbjoga1NoYXJlLm4sXG4gICAgICAgICAgbnRpbGRlOiBiaWdJbnRUb0J1ZmZlckJFKG50aWxkZWIsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIGgxOiBiaWdJbnRUb0J1ZmZlckJFKGgxYiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgaDI6IGJpZ0ludFRvQnVmZmVyQkUoaDJiLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBrOiBrU2hhcmUuayxcbiAgICAgICAgICBwcm9vZjoga1NoYXJlLnByb29mLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEoJ2FscGhhJyBpbiBzaGFyZVRvQmVTZW50KSAmJiAhKCdrJyBpbiBzaGFyZVRvQmVTZW50KSkge1xuICAgICAgY29uc3QgcGFydGlhbFNoYXJlUGFydGljaXBhbnQgPSBzaGFyZVBhcnRpY2lwYW50IGFzIFBhcnRpYWw8QlNoYXJlPjtcbiAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5udGlsZGU7XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuaDE7XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuaDI7XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuY2s7XG4gICAgICBjb25zdCBtdVNoYXJlVG9CZVNlbnQgPSBzaGFyZVRvQmVTZW50IGFzIE1VU2hhcmU7XG4gICAgICBzaGFyZVRvQmVTZW50ID0ge1xuICAgICAgICBpOiBtdVNoYXJlVG9CZVNlbnQuaSxcbiAgICAgICAgajogbXVTaGFyZVRvQmVTZW50LmosXG4gICAgICB9IGFzIE1VU2hhcmU7XG4gICAgfVxuICAgIFtzaGFyZVRvQmVTZW50LmksIHNoYXJlVG9CZVNlbnQual0gPSBbc2hhcmVUb0JlU2VudC5qLCBzaGFyZVRvQmVTZW50LmldO1xuICAgIGlmIChpc0dhbW1hU2hhcmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG11U2hhcmU6IHNoYXJlVG9CZVNlbnQgYXMgTVVTaGFyZSxcbiAgICAgICAgZ1NoYXJlOiBzaGFyZVBhcnRpY2lwYW50IGFzIEdTaGFyZSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBhU2hhcmU6IHNoYXJlVG9CZVNlbnQgYXMgQVNoYXJlLFxuICAgICAgYlNoYXJlOiBzaGFyZVBhcnRpY2lwYW50IGFzIEJTaGFyZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbWJpbmUgZ2FtbWEgc2hhcmVzIHRvIGdldCB0aGUgcHJpdmF0ZSBvbWljcm9uIC8gZGVsdGEgc2hhcmVzXG4gICAqIEBwYXJhbSB7U2lnbkNvbWJpbmV9IHNoYXJlc1xuICAgKiBAcmV0dXJucyB7U2lnbkNvbWJpbmVSVH1cbiAgICovXG4gIHNpZ25Db21iaW5lKHNoYXJlczogU2lnbkNvbWJpbmUpOiBTaWduQ29tYmluZVJUIHtcbiAgICBjb25zdCBnU2hhcmUgPSBzaGFyZXMuZ1NoYXJlO1xuICAgIGNvbnN0IFMgPSBzaGFyZXMuc2lnbkluZGV4O1xuICAgIGNvbnN0IGdhbW1hID0gaGV4VG9CaWdJbnQoZ1NoYXJlLmdhbW1hKTtcbiAgICBjb25zdCBhbHBoYSA9IGhleFRvQmlnSW50KGdTaGFyZS5hbHBoYSk7XG4gICAgY29uc3QgYmV0YSA9IGhleFRvQmlnSW50KGdTaGFyZS5iZXRhKTtcbiAgICBjb25zdCBtdSA9IGhleFRvQmlnSW50KGdTaGFyZS5tdSk7XG4gICAgY29uc3QgbnUgPSBoZXhUb0JpZ0ludChnU2hhcmUubnUpO1xuICAgIGNvbnN0IGsgPSBoZXhUb0JpZ0ludChnU2hhcmUuayk7XG4gICAgY29uc3QgdyA9IGhleFRvQmlnSW50KGdTaGFyZS53KTtcblxuICAgIGNvbnN0IGRlbHRhID0gRWNkc2EuY3VydmUuc2NhbGFyQWRkKEVjZHNhLmN1cnZlLnNjYWxhck11bHQoaywgZ2FtbWEpLCBFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQoYWxwaGEsIGJldGEpKTtcbiAgICBjb25zdCBvbWljcm9uID0gRWNkc2EuY3VydmUuc2NhbGFyQWRkKEVjZHNhLmN1cnZlLnNjYWxhck11bHQoaywgdyksIEVjZHNhLmN1cnZlLnNjYWxhckFkZChtdSwgbnUpKTtcbiAgICBjb25zdCBHYW1tYSA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQoZ2FtbWEpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9TaGFyZToge1xuICAgICAgICBpOiBnU2hhcmUuaSxcbiAgICAgICAgeTogZ1NoYXJlLnksXG4gICAgICAgIGs6IGJpZ0ludFRvQnVmZmVyQkUoaywgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgb21pY3JvbjogYmlnSW50VG9CdWZmZXJCRShvbWljcm9uLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBkZWx0YTogYmlnSW50VG9CdWZmZXJCRShkZWx0YSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgR2FtbWE6IGJpZ0ludFRvQnVmZmVyQkUoR2FtbWEsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9LFxuICAgICAgZFNoYXJlOiB7XG4gICAgICAgIGk6IFMuaSxcbiAgICAgICAgajogZ1NoYXJlLmksXG4gICAgICAgIGRlbHRhOiBiaWdJbnRUb0J1ZmZlckJFKGRlbHRhLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBHYW1tYTogYmlnSW50VG9CdWZmZXJCRShHYW1tYSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IE0gTWVzc2FnZSB0byBiZSBzaWduZWRcbiAgICogQHBhcmFtIHtPU2hhcmV9IG9TaGFyZSBwcml2YXRlIG9taWNyb24gc2hhcmUgb2YgY3VycmVudCBwYXJ0aWNpcGFudFxuICAgKiBAcGFyYW0ge0RTaGFyZX0gZFNoYXJlIGRlbHRhIHNoYXJlIHJlY2VpdmVkIGZyb20gdGhlIG90aGVyIHBhcnRpY2lwYW50XG4gICAqIEBwYXJhbSB7SGFzaH0gaGFzaCBoYXNoaW5nIGFsZ29yaXRobSBpbXBsZW1lbnRpbmcgTm9kZWBzIHN0YW5kYXJkIGNyeXB0byBoYXNoIGludGVyZmFjZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZEhhc2ggaWYgdHJ1ZSwgd2UgaGFzaCB0aGUgcHJvdmlkZWQgYnVmZmVyIGJlZm9yZSBzaWduaW5nXG4gICAqIEByZXR1cm5zIHtTU2hhcmV9XG4gICAqL1xuICBzaWduKE06IEJ1ZmZlciwgb1NoYXJlOiBPU2hhcmUsIGRTaGFyZTogRFNoYXJlLCBoYXNoPzogSGFzaCwgc2hvdWxkSGFzaCA9IHRydWUpOiBTU2hhcmUge1xuICAgIGNvbnN0IG0gPSBzaG91bGRIYXNoID8gKGhhc2ggfHwgY3JlYXRlSGFzaCgnc2hhMjU2JykpLnVwZGF0ZShNKS5kaWdlc3QoKSA6IE07XG5cbiAgICBjb25zdCBkZWx0YSA9IEVjZHNhLmN1cnZlLnNjYWxhckFkZChoZXhUb0JpZ0ludChvU2hhcmUuZGVsdGEpLCBoZXhUb0JpZ0ludChkU2hhcmUuZGVsdGEpKTtcblxuICAgIGNvbnN0IFIgPSBFY2RzYS5jdXJ2ZS5wb2ludE11bHRpcGx5KFxuICAgICAgRWNkc2EuY3VydmUucG9pbnRBZGQoaGV4VG9CaWdJbnQob1NoYXJlLkdhbW1hKSwgaGV4VG9CaWdJbnQoZFNoYXJlLkdhbW1hKSksXG4gICAgICBFY2RzYS5jdXJ2ZS5zY2FsYXJJbnZlcnQoZGVsdGEpXG4gICAgKTtcbiAgICBjb25zdCBwb2ludFIgPSBzZWNwLlBvaW50LmZyb21IZXgoYmlnSW50VG9CdWZmZXJCRShSLCAzMikpO1xuICAgIGNvbnN0IHIgPSBwb2ludFIueDtcblxuICAgIGNvbnN0IHMgPSBFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQoXG4gICAgICBFY2RzYS5jdXJ2ZS5zY2FsYXJNdWx0KGJpZ0ludEZyb21VOEFCRShtKSwgaGV4VG9CaWdJbnQob1NoYXJlLmspKSxcbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhck11bHQociwgaGV4VG9CaWdJbnQob1NoYXJlLm9taWNyb24pKVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGk6IG9TaGFyZS5pLFxuICAgICAgeTogb1NoYXJlLnksXG4gICAgICBSOiBwb2ludFIudG9IZXgodHJ1ZSksXG4gICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHMsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgZnVsbCBzaWduYXR1cmUgYnkgY29tYmluaW5nIFNpZ24gU2hhcmVzXG4gICAqIEBwYXJhbSB7U1NoYXJlW119IHNoYXJlc1xuICAgKiBAcmV0dXJucyB7U2lnbmF0dXJlfVxuICAgKi9cbiAgY29uc3RydWN0U2lnbmF0dXJlKHNoYXJlczogU1NoYXJlW10pOiBTaWduYXR1cmUge1xuICAgIC8vIEV2ZXJ5IFIgbXVzdCBtYXRjaC5cbiAgICBjb25zdCBSID0gc2hhcmVzWzBdWydSJ107XG4gICAgY29uc3QgaXNSTWF0Y2hpbmcgPSBzaGFyZXMubWFwKChzaGFyZSkgPT4gc2hhcmVbJ1InXSA9PT0gUikucmVkdWNlKChhLCBiKSA9PiBhICYmIGIpO1xuICAgIGlmICghaXNSTWF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUiB2YWx1ZSBzaG91bGQgYmUgY29uc2lzdGVudCBhY3Jvc3MgYWxsIHNoYXJlcycpO1xuICAgIH1cblxuICAgIGxldCBzID0gc2hhcmVzLm1hcCgoc2hhcmUpID0+IGhleFRvQmlnSW50KHNoYXJlWydzJ10pKS5yZWR1Y2UoRWNkc2EuY3VydmUuc2NhbGFyQWRkKTtcbiAgICBjb25zdCByZWNpZCA9IChSLnNsaWNlKDAsIDIpID09PSAnMDMnID8gMSA6IDApIF4gKHMgPiBFY2RzYS5jdXJ2ZS5vcmRlcigpIC8gQmlnSW50KDIpID8gMSA6IDApO1xuXG4gICAgLy8gTm9ybWFsaXplIHMuXG4gICAgcyA9IHMgPiBFY2RzYS5jdXJ2ZS5vcmRlcigpIC8gQmlnSW50KDIpID8gRWNkc2EuY3VydmUub3JkZXIoKSAtIHMgOiBzO1xuICAgIHJldHVybiB7XG4gICAgICB5OiBzaGFyZXNbMF1bJ3knXSxcbiAgICAgIHI6IFIuc2xpY2UoMiksXG4gICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHMsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICByZWNpZDogcmVjaWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgZWNkc2Egc2lnbmF0dXJlc1xuICAgKiBAcGFyYW0ge0J1ZmZlcn0gbWVzc2FnZVxuICAgKiBAcGFyYW0ge1NpZ25hdHVyZSB9IHNpZ25hdHVyZVxuICAgKiBAcGFyYW0ge0hhc2h9IGhhc2ggaGFzaGluZyBhbGdvcml0aG0gaW1wbGVtZW50aW5nIE5vZGVgcyBzdGFuZGFyZCBjcnlwdG8gaGFzaCBpbnRlcmZhY2VcbiAgICogQHBhcmFtIHtib29sZWFufSBzaG91bGRIYXNoIGlmIHRydWUsIHdlIGhhc2ggdGhlIHByb3ZpZGVkIGJ1ZmZlciBiZWZvcmUgdmVyaWZ5aW5nXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHNpZ25hdHVyZSBpcyB2YWxpZDsgRmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICB2ZXJpZnkobWVzc2FnZTogQnVmZmVyLCBzaWduYXR1cmU6IFNpZ25hdHVyZSwgaGFzaD86IEhhc2gsIHNob3VsZEhhc2ggPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWVzc2FnZVRvVmVyaWZ5ID0gc2hvdWxkSGFzaCA/IChoYXNoIHx8IGNyZWF0ZUhhc2goJ3NoYTI1NicpKS51cGRhdGUobWVzc2FnZSkuZGlnZXN0KCkgOiBtZXNzYWdlO1xuICAgIHJldHVybiBFY2RzYS5jdXJ2ZS52ZXJpZnkoXG4gICAgICBtZXNzYWdlVG9WZXJpZnksXG4gICAgICBCdWZmZXIuY29uY2F0KFtcbiAgICAgICAgQnVmZmVyLmZyb20oW3NpZ25hdHVyZVsncmVjaWQnXV0pLFxuICAgICAgICBiaWdJbnRUb0J1ZmZlckJFKGhleFRvQmlnSW50KHNpZ25hdHVyZVsnciddKSwgMzIpLFxuICAgICAgICBiaWdJbnRUb0J1ZmZlckJFKGhleFRvQmlnSW50KHNpZ25hdHVyZVsncyddKSwgMzIpLFxuICAgICAgXSksXG4gICAgICBoZXhUb0JpZ0ludChzaWduYXR1cmVbJ3knXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyBhIGNoYWxsZW5nZSBhbmQgaXQncyBwcm9vZnMgZnJvbSBoZXggc3RyaW5ncyB0byBiaWdpbnRcbiAgICogQGRlcHJlY2F0ZWQgdXNlIHNkay1saWItbXBjIEVjZHNhVHlwZXMuZGVzZXJpYWxpemVOdGlsZGUgaW5zdGVhZFxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplTnRpbGRlKGNoYWxsZW5nZTogRWNkc2FUeXBlcy5TZXJpYWxpemVkTnRpbGRlKTogRWNkc2FUeXBlcy5EZXNlcmlhbGl6ZWROdGlsZGUge1xuICAgIHJldHVybiBFY2RzYVR5cGVzLmRlc2VyaWFsaXplTnRpbGRlKGNoYWxsZW5nZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIGNoYWxsZW5nZSBhbmQgaXQncyBwcm9vZnMgZnJvbSBiaWcgaW50IHRvIGhleCBzdHJpbmdzLlxuICAgKiBAZGVwcmVjYXRlZCB1c2Ugc2RrLWxpYi1tcGMgRWNkc2FUeXBlcy5kZXNlcmlhbGl6ZU50aWxkZSBpbnN0ZWFkXG4gICAqIEBwYXJhbSBjaGFsbGVuZ2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVOdGlsZGUoY2hhbGxlbmdlOiBFY2RzYVR5cGVzLkRlc2VyaWFsaXplZE50aWxkZSk6IEVjZHNhVHlwZXMuU2VyaWFsaXplZE50aWxkZSB7XG4gICAgcmV0dXJuIEVjZHNhVHlwZXMuc2VyaWFsaXplTnRpbGRlKGNoYWxsZW5nZSk7XG4gIH1cbn1cbiJdfQ==