@bitgo/sdk-core 8.0.0 → 8.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts +5 -4
  3. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -1
  4. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.js +10 -8
  5. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts +19 -1
  6. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts.map +1 -1
  7. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.js +139 -11
  8. package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts +25 -0
  9. package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts.map +1 -1
  10. package/dist/src/account-lib/mpc/tss/ecdsa/types.js +1 -1
  11. package/dist/src/account-lib/util/crypto.d.ts +10 -0
  12. package/dist/src/account-lib/util/crypto.d.ts.map +1 -1
  13. package/dist/src/account-lib/util/crypto.js +22 -2
  14. package/dist/src/bitgo/bitgoBase.d.ts +4 -1
  15. package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
  16. package/dist/src/bitgo/bitgoBase.js +1 -1
  17. package/dist/src/bitgo/ecdh.d.ts +11 -0
  18. package/dist/src/bitgo/ecdh.d.ts.map +1 -1
  19. package/dist/src/bitgo/ecdh.js +21 -2
  20. package/dist/src/bitgo/enterprise/enterprise.d.ts +24 -0
  21. package/dist/src/bitgo/enterprise/enterprise.d.ts.map +1 -1
  22. package/dist/src/bitgo/enterprise/enterprise.js +40 -1
  23. package/dist/src/bitgo/enterprise/iEnterprise.d.ts +6 -0
  24. package/dist/src/bitgo/enterprise/iEnterprise.d.ts.map +1 -1
  25. package/dist/src/bitgo/enterprise/iEnterprise.js +1 -1
  26. package/dist/src/bitgo/keychain/iKeychains.d.ts +7 -0
  27. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  28. package/dist/src/bitgo/keychain/iKeychains.js +1 -1
  29. package/dist/src/bitgo/tss/common.d.ts +14 -13
  30. package/dist/src/bitgo/tss/common.d.ts.map +1 -1
  31. package/dist/src/bitgo/tss/common.js +30 -30
  32. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +0 -5
  33. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  34. package/dist/src/bitgo/utils/tss/baseTypes.js +1 -1
  35. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +77 -1
  36. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
  37. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +274 -7
  38. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts +28 -0
  39. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts.map +1 -1
  40. package/dist/src/bitgo/utils/tss/ecdsa/types.js +1 -1
  41. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  42. package/dist/src/bitgo/wallet/wallet.js +6 -1
  43. package/dist/src/bitgo/wallet/wallets.js +2 -2
  44. package/dist/src/index.d.ts +1 -0
  45. package/dist/src/index.d.ts.map +1 -1
  46. package/dist/src/index.js +2 -1
  47. package/dist/src/openssl/index.d.ts +2 -0
  48. package/dist/src/openssl/index.d.ts.map +1 -0
  49. package/dist/src/openssl/index.js +14 -0
  50. package/dist/src/openssl/openssl.d.ts +9 -0
  51. package/dist/src/openssl/openssl.d.ts.map +1 -0
  52. package/dist/src/openssl/openssl.js +45 -0
  53. package/dist/src/openssl/opensslbytes.d.ts +4 -0
  54. package/dist/src/openssl/opensslbytes.d.ts.map +1 -0
  55. package/dist/src/openssl/opensslbytes.js +20 -0
  56. package/dist/tsconfig.tsbuildinfo +137 -67
  57. package/package.json +5 -4
@@ -34,6 +34,10 @@ const opengpgUtils_1 = require("../../opengpgUtils");
34
34
  const assert_1 = __importDefault(require("assert"));
35
35
  const utxo_lib_1 = require("@bitgo/utxo-lib");
36
36
  const ecdsa_2 = require("../../../tss/ecdsa/ecdsa");
37
+ const rangeproof_1 = require("../../../../account-lib/mpc/tss/ecdsa/rangeproof");
38
+ const ecdh_1 = require("../../../ecdh");
39
+ const buffer_1 = require("buffer");
40
+ const account_lib_1 = require("../../../../account-lib");
37
41
  const common_1 = require("../../../tss/common");
38
42
  const encryptNShare = ecdsa_1.default.encryptNShare;
39
43
  /** @inheritdoc */
@@ -74,9 +78,9 @@ class EcdsaUtils extends baseTSSUtils_1.default {
74
78
  var _a;
75
79
  const encryptedUserToBackupShare = await encryptNShare(userKeyShare, 2, thirdPartyBackupPublicGpgKey.armor(), userGpgKey);
76
80
  const bitgoToBackupKeyShare = (_a = bitgoKeychain.keyShares) === null || _a === void 0 ? void 0 : _a.find((keyShare) => keyShare.from === 'bitgo' && keyShare.to === 'backup');
77
- const userPublicShare = Buffer.concat([
78
- Buffer.from(userKeyShare.nShares[2].y, 'hex'),
79
- Buffer.from(userKeyShare.nShares[2].chaincode, 'hex'),
81
+ const userPublicShare = buffer_1.Buffer.concat([
82
+ buffer_1.Buffer.from(userKeyShare.nShares[2].y, 'hex'),
83
+ buffer_1.Buffer.from(userKeyShare.nShares[2].chaincode, 'hex'),
80
84
  ]).toString('hex');
81
85
  assert_1.default(bitgoToBackupKeyShare);
82
86
  const keyResponse = await this.bitgo
@@ -451,7 +455,7 @@ class EcdsaUtils extends baseTSSUtils_1.default {
451
455
  const unsignedTx = txRequestResolved.apiVersion === 'full'
452
456
  ? txRequestResolved.transactions[0].unsignedTx
453
457
  : txRequestResolved.unsignedTxs[0];
454
- signablePayload = Buffer.from(unsignedTx.signableHex, 'hex');
458
+ signablePayload = buffer_1.Buffer.from(unsignedTx.signableHex, 'hex');
455
459
  derivationPath = txRequestResolved.transactions[0].unsignedTx.derivationPath;
456
460
  }
457
461
  else if (requestType === baseTypes_1.RequestType.message) {
@@ -469,7 +473,7 @@ class EcdsaUtils extends baseTSSUtils_1.default {
469
473
  n: signingKey.nShares[bitgoIndex].n,
470
474
  };
471
475
  const [signingKeyWithChallenge, bitgoChallenge] = await Promise.all([
472
- MPC.signChallenge(signingKey.xShare, yShare),
476
+ MPC.appendChallenge(signingKey.xShare, yShare),
473
477
  common_1.getTxRequestChallenge(this.bitgo, this.wallet.id(), txRequestId, '0', requestType, 'ecdsa'),
474
478
  ]);
475
479
  const userSignShare = await ecdsa_1.default.createUserSignShare(signingKeyWithChallenge.xShare, {
@@ -485,7 +489,7 @@ class EcdsaUtils extends baseTSSUtils_1.default {
485
489
  while (chaincode.length < 64) {
486
490
  chaincode = '0' + chaincode;
487
491
  }
488
- const signerShare = utxo_lib_1.bip32.fromPrivateKey(Buffer.from(u, 'hex'), Buffer.from(chaincode, 'hex')).toBase58();
492
+ const signerShare = utxo_lib_1.bip32.fromPrivateKey(buffer_1.Buffer.from(u, 'hex'), buffer_1.Buffer.from(chaincode, 'hex')).toBase58();
489
493
  const bitgoGpgKey = await opengpgUtils_1.getBitgoGpgPubKey(this.bitgo);
490
494
  const encryptedSignerShare = (await openpgp.encrypt({
491
495
  message: await openpgp.createMessage({
@@ -542,6 +546,45 @@ class EcdsaUtils extends baseTSSUtils_1.default {
542
546
  }
543
547
  return this.signRequestBase(params, baseTypes_1.RequestType.message);
544
548
  }
549
+ /**
550
+ * Get the challenge values for enterprise and BitGo in ECDSA signing
551
+ * Only returns the challenges if they are verified by the user's enterprise admin's ecdh key
552
+ * @param bitgo
553
+ * @param walletId
554
+ * @param enterpriseId
555
+ */
556
+ static async getChallengesForEcdsaSigning(bitgo, walletId, enterpriseId) {
557
+ const result = await bitgo.getChallengesForEcdsaSigning(walletId);
558
+ const enterpriseChallenge = result.enterpriseChallenge;
559
+ const bitgoChallenge = result.bitgoChallenge;
560
+ const challengeVerifierUserId = result.createdBy;
561
+ const adminSigningKeyResponse = await bitgo.getSigningKeyForUser(enterpriseId, challengeVerifierUserId);
562
+ const pubkeyOfAdminEcdhKeyHex = adminSigningKeyResponse.derivedPubkey;
563
+ // Verify enterprise's challenge is signed by the respective admin's ecdh keychain
564
+ const enterpriseRawChallenge = {
565
+ ntilde: enterpriseChallenge.ntilde,
566
+ h1: enterpriseChallenge.h1,
567
+ h2: enterpriseChallenge.h2,
568
+ };
569
+ const adminSignatureOnEntChallenge = enterpriseChallenge.verifiers.adminSignature;
570
+ if (!ecdh_1.verifyEcdhSignature(this.getMessageToSignFromChallenge(enterpriseRawChallenge), adminSignatureOnEntChallenge, buffer_1.Buffer.from(pubkeyOfAdminEcdhKeyHex, 'hex'))) {
571
+ throw new Error(`Admin signature for enterprise challenge is not valid. Please contact your enterprise admin.`);
572
+ }
573
+ // Verify that the BitGo challenge's ZK proofs have been verified by the admin
574
+ const bitGoRawChallenge = {
575
+ ntilde: bitgoChallenge.ntilde,
576
+ h1: bitgoChallenge.h1,
577
+ h2: bitgoChallenge.h2,
578
+ };
579
+ const adminVerificationSignatureForBitGoChallenge = bitgoChallenge.verifiers.adminSignature;
580
+ if (!ecdh_1.verifyEcdhSignature(this.getMessageToSignFromChallenge(bitGoRawChallenge), adminVerificationSignatureForBitGoChallenge, buffer_1.Buffer.from(pubkeyOfAdminEcdhKeyHex, 'hex'))) {
581
+ throw new Error(`Admin signature for BitGo's challenge is not valid. Please contact your enterprise admin.`);
582
+ }
583
+ return {
584
+ enterpriseChallenge: enterpriseRawChallenge,
585
+ bitgoChallenge: bitGoRawChallenge,
586
+ };
587
+ }
545
588
  /**
546
589
  * Verifies the u-value proofs and GPG keys used in generating a TSS ECDSA wallet.
547
590
  * @param userGpgPub The user's public GPG key for encryption between user/server
@@ -587,6 +630,230 @@ class EcdsaUtils extends baseTSSUtils_1.default {
587
630
  verifierIndex,
588
631
  });
589
632
  }
633
+ /**
634
+ * Signs a challenge with the provided v1 ecdh key at a derived path
635
+ * @param challenge challenge to sign
636
+ * @param ecdhXprv xprv of the ecdh key
637
+ * @param derivationPath the derived path at which the ecdh key will sign
638
+ */
639
+ static signChallenge(challenge, ecdhXprv, derivationPath) {
640
+ const messageToSign = this.getMessageToSignFromChallenge(challenge);
641
+ return ecdh_1.signMessageWithDerivedEcdhKey(messageToSign, ecdhXprv, derivationPath);
642
+ }
643
+ /**
644
+ * Converts challenge to a common message format which can be signed.
645
+ * @param challenge
646
+ */
647
+ static getMessageToSignFromChallenge(challenge) {
648
+ return challenge.ntilde.concat(challenge.h1).concat(challenge.h2);
649
+ }
650
+ /**
651
+ Verifies ZK proofs of BitGo's challenges for both nitro and institutional HSMs
652
+ which are fetched from the WP API.
653
+ */
654
+ static async verifyBitGoChallenges(bitgoChallenges) {
655
+ // Verify institutional hsm challenge proof
656
+ const instChallengeVerified = await this.verifyBitGoChallenge({
657
+ ntilde: bitgoChallenges.bitgoInstitutionalHsm.ntilde,
658
+ h1: bitgoChallenges.bitgoInstitutionalHsm.h1,
659
+ h2: bitgoChallenges.bitgoInstitutionalHsm.h2,
660
+ ntildeProof: bitgoChallenges.bitgoInstitutionalHsm.ntildeProof,
661
+ });
662
+ // Verify nitro hsm challenge proof
663
+ const nitroChallengeVerified = await this.verifyBitGoChallenge({
664
+ ntilde: bitgoChallenges.bitgoNitroHsm.ntilde,
665
+ h1: bitgoChallenges.bitgoNitroHsm.h1,
666
+ h2: bitgoChallenges.bitgoNitroHsm.h2,
667
+ ntildeProof: bitgoChallenges.bitgoNitroHsm.ntildeProof,
668
+ });
669
+ return instChallengeVerified && nitroChallengeVerified;
670
+ }
671
+ /**
672
+ * Verifies ZK proof for a single BitGo challenge
673
+ * @param bitgoChallenge
674
+ */
675
+ static async verifyBitGoChallenge(bitgoChallenge) {
676
+ const deserializedInstChallenge = this.deserializeNTilde(bitgoChallenge);
677
+ if (!deserializedInstChallenge.ntildeProof) {
678
+ throw new Error('Expected BitGo challenge proof to be present. Contact support@bitgo.com.');
679
+ }
680
+ const ntildeProofH1WrtH2Verified = await rangeproof_1.verifyNtildeProof({
681
+ ntilde: deserializedInstChallenge.ntilde,
682
+ h1: deserializedInstChallenge.h1,
683
+ h2: deserializedInstChallenge.h2,
684
+ }, deserializedInstChallenge.ntildeProof.h1WrtH2);
685
+ const ntildeProofH2WrtH1Verified = await rangeproof_1.verifyNtildeProof({
686
+ ntilde: deserializedInstChallenge.ntilde,
687
+ h1: deserializedInstChallenge.h2,
688
+ h2: deserializedInstChallenge.h1,
689
+ }, deserializedInstChallenge.ntildeProof.h2WrtH1);
690
+ return ntildeProofH1WrtH2Verified && ntildeProofH2WrtH1Verified;
691
+ }
692
+ /**
693
+ * Gets the bitgo challenges for both nitro and institutional HSMs from WP API.
694
+ * @param bitgo
695
+ */
696
+ static async getBitGoChallenges(bitgo) {
697
+ return await bitgo.get(bitgo.url('/tss/ecdsa/challenges', 2)).send().result();
698
+ }
699
+ /**
700
+ * Deserializes a challenge and it's proofs from hex strings to bigint
701
+ */
702
+ static deserializeNTilde(challenge) {
703
+ const deserializedNtilde = {
704
+ ntilde: account_lib_1.hexToBigInt(challenge.ntilde),
705
+ h1: account_lib_1.hexToBigInt(challenge.h1),
706
+ h2: account_lib_1.hexToBigInt(challenge.h2),
707
+ };
708
+ if (challenge.ntildeProof) {
709
+ deserializedNtilde.ntildeProof = {
710
+ h1WrtH2: {
711
+ alpha: account_lib_1.convertHexArrToBigIntArr(challenge.ntildeProof.h1WrtH2.alpha),
712
+ t: account_lib_1.convertHexArrToBigIntArr(challenge.ntildeProof.h1WrtH2.t),
713
+ },
714
+ h2WrtH1: {
715
+ alpha: account_lib_1.convertHexArrToBigIntArr(challenge.ntildeProof.h2WrtH1.alpha),
716
+ t: account_lib_1.convertHexArrToBigIntArr(challenge.ntildeProof.h2WrtH1.t),
717
+ },
718
+ };
719
+ }
720
+ return deserializedNtilde;
721
+ }
722
+ /**
723
+ * Serializes a challenge and it's proofs from big int to hex strings.
724
+ * @param challenge
725
+ */
726
+ static serializeNTilde(challenge) {
727
+ const serializedNtilde = {
728
+ ntilde: account_lib_1.bigIntToHex(challenge.ntilde),
729
+ h1: account_lib_1.bigIntToHex(challenge.h1),
730
+ h2: account_lib_1.bigIntToHex(challenge.h2),
731
+ };
732
+ if (challenge.ntildeProof) {
733
+ serializedNtilde.ntildeProof = {
734
+ h1WrtH2: {
735
+ alpha: account_lib_1.convertBigIntArrToHexArr(challenge.ntildeProof.h1WrtH2.alpha),
736
+ t: account_lib_1.convertBigIntArrToHexArr(challenge.ntildeProof.h1WrtH2.t),
737
+ },
738
+ h2WrtH1: {
739
+ alpha: account_lib_1.convertBigIntArrToHexArr(challenge.ntildeProof.h2WrtH1.alpha),
740
+ t: account_lib_1.convertBigIntArrToHexArr(challenge.ntildeProof.h2WrtH1.t),
741
+ },
742
+ };
743
+ }
744
+ return serializedNtilde;
745
+ }
746
+ /**
747
+ * Gets BitGo's proofs from API and signs them if the proofs are valid.
748
+ * @param bitgo
749
+ * @param enterpriseId
750
+ * @param userPassword
751
+ */
752
+ static async getVerifyAndSignBitGoChallenges(bitgo, enterpriseId, userPassword) {
753
+ // Fetch user's ecdh public keychain needed for signing the challenges
754
+ const userSigningKey = await bitgo.getSigningKeyForUser(enterpriseId);
755
+ if (!userSigningKey.ecdhKeychain || !userSigningKey.derivationPath) {
756
+ throw new Error('Something went wrong with the user keychain. Please contact support@bitgo.com.');
757
+ }
758
+ const userEcdhKeychain = await bitgo.getECDHKeychain(userSigningKey.ecdhKeychain);
759
+ let xprv;
760
+ try {
761
+ xprv = bitgo.decrypt({
762
+ password: userPassword,
763
+ input: userEcdhKeychain.encryptedXprv,
764
+ });
765
+ }
766
+ catch (e) {
767
+ throw new Error('Incorrect password. Please try again.');
768
+ }
769
+ // Fetch BitGo's challenge and verify
770
+ const bitgoChallengesWithProofs = await EcdsaUtils.getBitGoChallenges(bitgo);
771
+ if (!(await EcdsaUtils.verifyBitGoChallenges(bitgoChallengesWithProofs))) {
772
+ throw new Error(`Failed to verify BitGo's challenge needed to enable ECDSA signing. Please contact support@bitgo.com`);
773
+ }
774
+ const signedBitGoInstChallenge = EcdsaUtils.signChallenge(bitgoChallengesWithProofs.bitgoInstitutionalHsm, xprv, userSigningKey.derivationPath);
775
+ const signedBitGoNitroChallenge = EcdsaUtils.signChallenge(bitgoChallengesWithProofs.bitgoNitroHsm, xprv, userSigningKey.derivationPath);
776
+ return {
777
+ bitgoInstHsmAdminSignature: signedBitGoInstChallenge,
778
+ bitgoNitroHsmAdminSignature: signedBitGoNitroChallenge,
779
+ };
780
+ }
781
+ /**
782
+ * This is needed to enable ecdsa signing on the enterprise.
783
+ * It receives the enterprise challenge and signatures of verified bitgo proofs
784
+ * and uploads them on the enterprise.
785
+ * @param bitgo
786
+ * @param entId - enterprise id to enable ecdsa signing on
787
+ * @param userPassword - enterprise admin's login pw
788
+ * @param bitgoInstChallengeProofSignature - signature on bitgo's institutional HSM challenge after verification
789
+ * @param bitgoNitroChallengeProofSignature - signature on bitgo's nitro HSM challenge after verification
790
+ * @param challenge - optionally use the challenge for enterprise challenge
791
+ */
792
+ static async initiateChallengesForEnterprise(bitgo, entId, userPassword, bitgoInstChallengeProofSignature, bitgoNitroChallengeProofSignature, challenge) {
793
+ // Fetch user's ecdh public keychain needed for signing the challenges
794
+ const userSigningKey = await bitgo.getSigningKeyForUser(entId);
795
+ if (!userSigningKey.ecdhKeychain || !userSigningKey.derivationPath) {
796
+ throw new Error('Something went wrong with the user keychain. Please contact support@bitgo.com.');
797
+ }
798
+ const userEcdhKeychain = await bitgo.getECDHKeychain(userSigningKey.ecdhKeychain);
799
+ let xprv;
800
+ try {
801
+ xprv = bitgo.decrypt({
802
+ password: userPassword,
803
+ input: userEcdhKeychain.encryptedXprv,
804
+ });
805
+ }
806
+ catch (e) {
807
+ throw new Error('Incorrect password. Please try again.');
808
+ }
809
+ // Generate and sign enterprise challenge
810
+ const entChallengeWithProof = challenge !== null && challenge !== void 0 ? challenge : (await rangeproof_1.generateNTilde(3072));
811
+ const signedEnterpriseChallenge = EcdsaUtils.signChallenge(this.serializeNTilde(entChallengeWithProof), xprv, userSigningKey.derivationPath);
812
+ await this.uploadChallengesToEnterprise(bitgo, entId, this.serializeNTilde(entChallengeWithProof), signedEnterpriseChallenge.toString('hex'), bitgoInstChallengeProofSignature.toString('hex'), bitgoNitroChallengeProofSignature.toString('hex'));
813
+ }
814
+ /**
815
+ * Uploads the signed challenges and their proofs on the enterprise.
816
+ * This initiates ecdsa signing for the enterprise users.
817
+ * @param bitgo
818
+ * @param entId - enterprise to enable ecdsa signing on
819
+ * @param entChallengeWithProofs - client side generated ent challenge with ZK proofs
820
+ * @param entChallengeSignature - signature on enterprise challenge
821
+ * @param bitgoIntChallengeSignature - signature on BitGo's institutional HSM challenge
822
+ * @param bitgoNitroChallengeSignature - signature on BitGo's nitro HSM challenge
823
+ */
824
+ static async uploadChallengesToEnterprise(bitgo, entId, entChallengeWithProofs, entChallengeSignature, bitgoIntChallengeSignature, bitgoNitroChallengeSignature) {
825
+ if (!entChallengeWithProofs.ntildeProof) {
826
+ throw new Error('Missing challenge proofs to enable ECDSA signing. Please contact support@bitgo.com');
827
+ }
828
+ const body = {
829
+ enterprise: {
830
+ ntilde: entChallengeWithProofs.ntilde,
831
+ h1: entChallengeWithProofs.h1,
832
+ h2: entChallengeWithProofs.h2,
833
+ ntildeProof: {
834
+ h1WrtH2: entChallengeWithProofs.ntildeProof.h1WrtH2,
835
+ h2WrtH1: entChallengeWithProofs.ntildeProof.h2WrtH1,
836
+ },
837
+ verifiers: {
838
+ adminSignature: entChallengeSignature,
839
+ },
840
+ },
841
+ bitgoInstitutionalHsm: {
842
+ verifiers: {
843
+ adminSignature: bitgoIntChallengeSignature,
844
+ },
845
+ },
846
+ bitgoNitroHsm: {
847
+ verifiers: {
848
+ adminSignature: bitgoNitroChallengeSignature,
849
+ },
850
+ },
851
+ };
852
+ await bitgo
853
+ .put(bitgo.url(`/enterprise/${entId}/tssconfig/ecdsa/challenge`, 2))
854
+ .send(body)
855
+ .result();
856
+ }
590
857
  }
591
858
  exports.EcdsaUtils = EcdsaUtils;
592
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdXRpbHMvdHNzL2VjZHNhL2VjZHNhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx5REFBK0Q7QUFDL0QsaURBQW1DO0FBR25DLCtEQUFvRTtBQUVwRSxtRUFBMkM7QUFFM0MsNENBUXNCO0FBQ3RCLHNDQUE0QztBQUM1QyxvREFBMEY7QUFDMUYscURBQWdIO0FBR2hILG9EQUE0QjtBQUM1Qiw4Q0FBd0M7QUFDeEMsb0RBQXNIO0FBQ3RILGdEQUE0RDtBQUU1RCxNQUFNLGFBQWEsR0FBRyxlQUFZLENBQUMsYUFBYSxDQUFDO0FBRWpELGtCQUFrQjtBQUNsQixNQUFhLFVBQVcsU0FBUSxzQkFBc0I7SUFJcEQsWUFBWSxLQUFnQixFQUFFLFFBQW1CLEVBQUUsTUFBZ0I7UUFDakUsS0FBSyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFKakMsNktBQTZLO1FBQ3JLLHNCQUFpQixHQUE0QixTQUFTLENBQUM7UUFJN0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFTyxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBSztRQUNuQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxnQ0FBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsS0FBSyxDQUFDLG9CQUFvQjtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzNCLGdDQUFnQztZQUNoQyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFD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QUFDLENBQUM7U0FDMUc7UUFDRCxJQUFJLFdBQVcsS0FBSyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLEVBQUU7WUFDbEUsTUFBTSxJQUFJLEtBQUssQ0FBQywwRkFBMEYsQ0FBQyxDQUFDO1NBQzdHO1FBRUQsTUFBTSw2QkFBcUIsQ0FBQztZQUMxQixlQUFlLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLGNBQWMsRUFBRSxhQUFhLENBQUMsY0FBYztZQUM1QyxTQUFTO1lBQ1QsV0FBVztZQUNYLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLGNBQWM7WUFDZCxhQUFhO1NBQ2QsQ0FBQyxDQUFDO1FBRUgsTUFBTSw2QkFBcUIsQ0FBQztZQUMxQixlQUFlLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLGNBQWMsRUFBRSxhQUFhLENBQUMsY0FBYztZQUM1QyxTQUFTO1lBQ1QsV0FBVztZQUNYLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLGNBQWM7WUFDZCxhQUFhO1NBQ2QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBOXhCRCxnQ0E4eEJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRUNEU0EsIEVjZHNhIH0gZnJvbSAnLi4vLi4vLi4vLi4vYWNjb3VudC1saWIvbXBjL3Rzcyc7XG5pbXBvcnQgKiBhcyBvcGVucGdwIGZyb20gJ29wZW5wZ3AnO1xuaW1wb3J0IHsgS2V5LCBTZXJpYWxpemVkS2V5UGFpciB9IGZyb20gJ29wZW5wZ3AnO1xuaW1wb3J0IHsgQWRkS2V5Y2hhaW5PcHRpb25zLCBBcGlLZXlTaGFyZSwgQ3JlYXRlQmFja3VwT3B0aW9ucywgS2V5Y2hhaW4sIEtleVR5cGUgfSBmcm9tICcuLi8uLi8uLi9rZXljaGFpbic7XG5pbXBvcnQgRUNEU0FNZXRob2RzLCB7IEVDRFNBTWV0aG9kVHlwZXMgfSBmcm9tICcuLi8uLi8uLi90c3MvZWNkc2EnO1xuaW1wb3J0IHsgSUJhc2VDb2luLCBLZXljaGFpbnNUcmlwbGV0IH0gZnJvbSAnLi4vLi4vLi4vYmFzZUNvaW4nO1xuaW1wb3J0IGJhc2VUU1NVdGlscyBmcm9tICcuLi9iYXNlVFNTVXRpbHMnO1xuaW1wb3J0IHsgQ3JlYXRlRWNkc2FCaXRHb0tleWNoYWluUGFyYW1zLCBDcmVhdGVFY2RzYUtleWNoYWluUGFyYW1zLCBEZWNyeXB0YWJsZU5TaGFyZSwgS2V5U2hhcmUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7XG4gIEJhY2t1cEdwZ0tleSxcbiAgQmFja3VwS2V5U2hhcmUsXG4gIEJpdGdvSGVsZEJhY2t1cEtleVNoYXJlLFxuICBSZXF1ZXN0VHlwZSxcbiAgVFNTUGFyYW1zLFxuICBUU1NQYXJhbXNGb3JNZXNzYWdlLFxuICBUeFJlcXVlc3QsXG59IGZyb20gJy4uL2Jhc2VUeXBlcyc7XG5pbXBvcnQgeyBnZXRUeFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi90c3MnO1xuaW1wb3J0IHsgQVNoYXJlLCBEU2hhcmUsIEVuY3J5cHRlZE5TaGFyZSwgU2VuZFNoYXJlVHlwZSB9IGZyb20gJy4uLy4uLy4uL3Rzcy9lY2RzYS90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVTaGFyZVByb29mLCBnZW5lcmF0ZUdQR0tleVBhaXIsIGdldEJpdGdvR3BnUHViS2V5LCBnZXRUcnVzdEdwZ1B1YktleSB9IGZyb20gJy4uLy4uL29wZW5ncGdVdGlscyc7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi8uLi8uLi9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgQmFja3VwUHJvdmlkZXIsIElXYWxsZXQgfSBmcm9tICcuLi8uLi8uLi93YWxsZXQnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgYmlwMzIgfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0IHsgYnVpbGROU2hhcmVGcm9tQVBJS2V5U2hhcmUsIGdldFBhcnRpY2lwYW50RnJvbUluZGV4LCB2ZXJpZnlXYWxsZXRTaWduYXR1cmUgfSBmcm9tICcuLi8uLi8uLi90c3MvZWNkc2EvZWNkc2EnO1xuaW1wb3J0IHsgZ2V0VHhSZXF1ZXN0Q2hhbGxlbmdlIH0gZnJvbSAnLi4vLi4vLi4vdHNzL2NvbW1vbic7XG5cbmNvbnN0IGVuY3J5cHROU2hhcmUgPSBFQ0RTQU1ldGhvZHMuZW5jcnlwdE5TaGFyZTtcblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgY2xhc3MgRWNkc2FVdGlscyBleHRlbmRzIGJhc2VUU1NVdGlsczxLZXlTaGFyZT4ge1xuICAvLyBXZSBkbyBub3QgaGF2ZSBmdWxsIHN1cHBvcnQgZm9yIDMtcGFydHkgdmVyaWZpY2F0aW9uICh3LyBleHRlcm5hbCBzb3VyY2UpIG9mIGtleSBzaGFyZXMgYW5kIHNpZ25hdHVyZSBzaGFyZXMuIFRoZXJlIGlzIG5vIDNyZCBwYXJ0eSBrZXkgc2VydmljZSBzdXBwb3J0IHdpdGggdGhpcyByZWxlYXNlLlxuICBwcml2YXRlIGJpdGdvUHVibGljR3BnS2V5OiBvcGVucGdwLktleSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBiYXNlQ29pbjogSUJhc2VDb2luLCB3YWxsZXQ/OiBJV2FsbGV0KSB7XG4gICAgc3VwZXIoYml0Z28sIGJhc2VDb2luLCB3YWxsZXQpO1xuICAgIHRoaXMuc2V0Qml0Z29HcGdQdWJLZXkoYml0Z28pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXRCaXRnb0dwZ1B1YktleShiaXRnbykge1xuICAgIHRoaXMuYml0Z29QdWJsaWNHcGdLZXkgPSBhd2FpdCBnZXRCaXRnb0dwZ1B1YktleShiaXRnbyk7XG4gIH1cblxuICBhc3luYyBnZXRCaXRnb1B1YmxpY0dwZ0tleSgpOiBQcm9taXNlPG9wZW5wZ3AuS2V5PiB7XG4gICAgaWYgKCF0aGlzLmJpdGdvUHVibGljR3BnS2V5KSB7XG4gICAgICAvLyByZXRyeSBnZXR0aW5nIGJpdGdvJ3MgZ3BnIGtleVxuICAgICAgYXdhaXQgdGhpcy5zZXRCaXRnb0dwZ1B1YktleSh0aGlzLmJpdGdvKTtcbiAgICAgIGlmICghdGhpcy5iaXRnb1B1YmxpY0dwZ0tleSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZ2V0IEJpdGdvJ3MgZ3BnIGtleVwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5iaXRnb1B1YmxpY0dwZ0tleTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjb21tb24gcHVibGljIGtleSBmcm9tIGNvbW1vbktleWNoYWluLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY29tbW9uS2V5Y2hhaW4gY29tbW9uIGtleSBjaGFpbiBiZXR3ZWVuIG4gcGFydGllc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBlbmNvZGVkIHB1YmxpYyBrZXlcbiAgICovXG4gIHN0YXRpYyBnZXRQdWJsaWNLZXlGcm9tQ29tbW9uS2V5Y2hhaW4oY29tbW9uS2V5Y2hhaW46IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGNvbW1vbktleWNoYWluLmxlbmd0aCAhPT0gMTMwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29tbW9uS2V5Y2hhaW4gbGVuZ3RoLCBleHBlY3RlZCAxMzAsIGdvdCAke2NvbW1vbktleWNoYWluLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgY29uc3QgY29tbW9uUHViSGV4U3RyID0gY29tbW9uS2V5Y2hhaW4uc2xpY2UoMCwgNjYpO1xuICAgIHJldHVybiBjb21tb25QdWJIZXhTdHI7XG4gIH1cblxuICBhc3luYyBmaW5hbGl6ZUJpdGdvSGVsZEJhY2t1cEtleVNoYXJlKFxuICAgIGtleUlkOiBzdHJpbmcsXG4gICAgY29tbW9uS2V5Y2hhaW46IHN0cmluZyxcbiAgICB1c2VyS2V5U2hhcmU6IEtleVNoYXJlLFxuICAgIGJpdGdvS2V5Y2hhaW46IEtleWNoYWluLFxuICAgIHVzZXJHcGdLZXk6IFNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gICAgdGhpcmRQYXJ0eUJhY2t1cFB1YmxpY0dwZ0tleTogS2V5XG4gICk6IFByb21pc2U8Qml0Z29IZWxkQmFja3VwS2V5U2hhcmU+IHtcbiAgICBjb25zdCBlbmNyeXB0ZWRVc2VyVG9CYWNrdXBTaGFyZSA9IGF3YWl0IGVuY3J5cHROU2hhcmUoXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICAyLFxuICAgICAgdGhpcmRQYXJ0eUJhY2t1cFB1YmxpY0dwZ0tleS5hcm1vcigpLFxuICAgICAgdXNlckdwZ0tleVxuICAgICk7XG4gICAgY29uc3QgYml0Z29Ub0JhY2t1cEtleVNoYXJlID0gYml0Z29LZXljaGFpbi5rZXlTaGFyZXM/LmZpbmQoXG4gICAgICAoa2V5U2hhcmUpID0+IGtleVNoYXJlLmZyb20gPT09ICdiaXRnbycgJiYga2V5U2hhcmUudG8gPT09ICdiYWNrdXAnXG4gICAgKTtcbiAgICBjb25zdCB1c2VyUHVibGljU2hhcmUgPSBCdWZmZXIuY29uY2F0KFtcbiAgICAgIEJ1ZmZlci5mcm9tKHVzZXJLZXlTaGFyZS5uU2hhcmVzWzJdLnksICdoZXgnKSxcbiAgICAgIEJ1ZmZlci5mcm9tKHVzZXJLZXlTaGFyZS5uU2hhcmVzWzJdLmNoYWluY29kZSwgJ2hleCcpLFxuICAgIF0pLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBhc3NlcnQoYml0Z29Ub0JhY2t1cEtleVNoYXJlKTtcbiAgICBjb25zdCBrZXlSZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wdXQodGhpcy5iYXNlQ29pbi51cmwoYC9rcnMvYmFja3Vwa2V5cy8ke2tleUlkfWApKVxuICAgICAgLnNlbmQoe1xuICAgICAgICBjb21tb25LZXljaGFpbixcbiAgICAgICAga2V5U2hhcmVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgZnJvbTogJ3VzZXInLFxuICAgICAgICAgICAgdG86ICdiYWNrdXAnLFxuICAgICAgICAgICAgcHVibGljU2hhcmU6IHVzZXJQdWJsaWNTaGFyZSxcbiAgICAgICAgICAgIHByaXZhdGVTaGFyZTogZW5jcnlwdGVkVXNlclRvQmFja3VwU2hhcmUuZW5jcnlwdGVkUHJpdmF0ZVNoYXJlLFxuICAgICAgICAgICAgcHJpdmF0ZVNoYXJlUHJvb2Y6IGVuY3J5cHRlZFVzZXJUb0JhY2t1cFNoYXJlLnByaXZhdGVTaGFyZVByb29mLFxuICAgICAgICAgICAgdnNzUHJvb2Y6IGVuY3J5cHRlZFVzZXJUb0JhY2t1cFNoYXJlLnZzc1Byb29mLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYml0Z29Ub0JhY2t1cEtleVNoYXJlLFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgICBpZiAoIWtleVJlc3BvbnNlIHx8ICFrZXlSZXNwb25zZS5jb21tb25LZXljaGFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgYmFja3VwIGtleSB2ZXJpZmljYXRpb24uJyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBpZDoga2V5UmVzcG9uc2UuaWQsXG4gICAgICBrZXlTaGFyZXM6IGtleVJlc3BvbnNlLmtleVNoYXJlcyxcbiAgICAgIGNvbW1vbktleWNoYWluOiBrZXlSZXNwb25zZS5jb21tb25LZXljaGFpbixcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGFzeW5jIGNyZWF0ZUtleWNoYWlucyhwYXJhbXM6IHtcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmc7XG4gICAgZW50ZXJwcmlzZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgYmFja3VwUHJvdmlkZXI/OiBCYWNrdXBQcm92aWRlcjtcbiAgfSk6IFByb21pc2U8S2V5Y2hhaW5zVHJpcGxldD4ge1xuICAgIGNvbnN0IE1QQyA9IG5ldyBFY2RzYSgpO1xuICAgIGNvbnN0IG0gPSAyO1xuICAgIGNvbnN0IG4gPSAzO1xuXG4gICAgY29uc3QgdXNlcktleVNoYXJlID0gYXdhaXQgTVBDLmtleVNoYXJlKDEsIG0sIG4pO1xuICAgIGNvbnN0IHVzZXJHcGdLZXkgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ3NlY3AyNTZrMScpO1xuICAgIGNvbnN0IGlzVGhpcmRQYXJ0eUJhY2t1cCA9IHRoaXMuaXNWYWxpZFRoaXJkUGFydHlCYWNrdXBQcm92aWRlcihwYXJhbXMuYmFja3VwUHJvdmlkZXIpO1xuICAgIGNvbnN0IGJhY2t1cEtleVNoYXJlID0gYXdhaXQgdGhpcy5jcmVhdGVCYWNrdXBLZXlTaGFyZXMoaXNUaGlyZFBhcnR5QmFja3VwLCB1c2VyR3BnS2V5LCBwYXJhbXMuZW50ZXJwcmlzZSk7XG4gICAgY29uc3QgYmFja3VwR3BnS2V5ID0gYXdhaXQgdGhpcy5nZXRCYWNrdXBHcGdQdWJLZXkoaXNUaGlyZFBhcnR5QmFja3VwKTtcblxuICAgIC8vIEdldCB0aGUgQml0R28gcHVibGljIGtleSBiYXNlZCBvbiB1c2VyL2VudGVycHJpc2UgZmVhdHVyZSBmbGFnc1xuICAgIC8vIElmIGl0IGRvZXNuJ3Qgd29yaywgdXNlIHRoZSBkZWZhdWx0IHB1YmxpYyBrZXkgZnJvbSB0aGUgY29uc3RhbnRzXG4gICAgY29uc3QgYml0Z29QdWJsaWNHcGdLZXkgPVxuICAgICAgKGF3YWl0IHRoaXMuZ2V0Qml0Z29HcGdQdWJrZXlCYXNlZE9uRmVhdHVyZUZsYWdzKHBhcmFtcy5lbnRlcnByaXNlKSkgPz8gdGhpcy5iaXRnb1B1YmxpY0dwZ0tleTtcblxuICAgIGNvbnN0IGJpdGdvS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmNyZWF0ZUJpdGdvS2V5Y2hhaW4oe1xuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJhY2t1cEdwZ0tleSxcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgYmFja3VwS2V5U2hhcmUsXG4gICAgICBlbnRlcnByaXNlOiBwYXJhbXMuZW50ZXJwcmlzZSxcbiAgICAgIGlzVGhpcmRQYXJ0eUJhY2t1cCxcbiAgICB9KTtcbiAgICBjb25zdCB1c2VyS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5jcmVhdGVVc2VyS2V5Y2hhaW4oe1xuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJhY2t1cEdwZ0tleSxcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgYmFja3VwS2V5U2hhcmUsXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgcGFzc3BocmFzZTogcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU6IHBhcmFtcy5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICBpc1RoaXJkUGFydHlCYWNrdXAsXG4gICAgfSk7XG4gICAgY29uc3QgYmFja3VwS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5jcmVhdGVCYWNrdXBLZXljaGFpbih7XG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYmFja3VwR3BnS2V5LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICBwYXNzcGhyYXNlOiBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgIGJhY2t1cFByb3ZpZGVyOiBwYXJhbXMuYmFja3VwUHJvdmlkZXIsXG4gICAgfSk7XG5cbiAgICBjb25zdCBbdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbl0gPSBhd2FpdCBQcm9taXNlLmFsbChbdXNlcktleWNoYWluUHJvbWlzZSwgYmFja3VwS2V5Y2hhaW5Qcm9taXNlXSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogSWYgYSB0aGlyZCBwYXJ0eSBiYWNrdXAgaXMgcmVxdWVzdGVkLCBpdCB3aWxsIGNyZWF0ZSBiYWNrdXAgc2hhcmVzIGZyb21cbiAgICogYSB0aGlyZCBwYXJ0eSAoQml0R28gYXMgb2Ygbm93KSwgb3RoZXJ3aXNlIHRoZSBrZXkgc2hhcmVzIHdpbGwgYmUgY2xpZW50IGdlbmVyYXRlZFxuICAgKi9cbiAgYXN5bmMgY3JlYXRlQmFja3VwS2V5U2hhcmVzKFxuICAgIGlzVGhpcmRQYXJ0eUJhY2t1cCA9IGZhbHNlLFxuICAgIHVzZXJHcGdQdWJLZXk6IFNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gICAgZW50ZXJwcmlzZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICk6IFByb21pc2U8QmFja3VwS2V5U2hhcmU+IHtcbiAgICBsZXQgYmFja3VwS2V5U2hhcmU6IEJhY2t1cEtleVNoYXJlO1xuICAgIGlmIChpc1RoaXJkUGFydHlCYWNrdXApIHtcbiAgICAgIGNvbnN0IGJpdGdvSGVsZEJhY2t1cEtleVNoYXJlcyA9IGF3YWl0IHRoaXMuY3JlYXRlQml0Z29IZWxkQmFja3VwS2V5U2hhcmUodXNlckdwZ1B1YktleSwgZW50ZXJwcmlzZSk7XG4gICAgICBiYWNrdXBLZXlTaGFyZSA9IHtcbiAgICAgICAgYml0R29IZWxkS2V5U2hhcmVzOiBiaXRnb0hlbGRCYWNrdXBLZXlTaGFyZXMsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBNUEMgPSBuZXcgRWNkc2EoKTtcbiAgICAgIGNvbnN0IG0gPSAyO1xuICAgICAgY29uc3QgbiA9IDM7XG4gICAgICBiYWNrdXBLZXlTaGFyZSA9IHtcbiAgICAgICAgdXNlckhlbGRLZXlTaGFyZTogYXdhaXQgTVBDLmtleVNoYXJlKDIsIG0sIG4pLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGJhY2t1cEtleVNoYXJlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYmFja3VwIHB1YiBncGcga2V5IHN0cmluZ1xuICAgKiBpZiBhIHRoaXJkIHBhcnR5IHByb3ZpZGVkIHRoZW4gZ2V0IGZyb20gdHJ1c3RcbiAgICogQHBhcmFtIGlzVGhpcmRQYXJ0eUJhY2t1cFxuICAgKi9cbiAgYXN5bmMgZ2V0QmFja3VwR3BnUHViS2V5KGlzVGhpcmRQYXJ0eUJhY2t1cCA9IGZhbHNlKTogUHJvbWlzZTxCYWNrdXBHcGdLZXk+IHtcbiAgICByZXR1cm4gaXNUaGlyZFBhcnR5QmFja3VwID8gZ2V0VHJ1c3RHcGdQdWJLZXkodGhpcy5iaXRnbykgOiBnZW5lcmF0ZUdQR0tleVBhaXIoJ3NlY3AyNTZrMScpO1xuICB9XG5cbiAgY3JlYXRlVXNlcktleWNoYWluKHtcbiAgICB1c2VyR3BnS2V5LFxuICAgIGJhY2t1cEdwZ0tleSxcbiAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICB1c2VyS2V5U2hhcmUsXG4gICAgYmFja3VwS2V5U2hhcmUsXG4gICAgYml0Z29LZXljaGFpbixcbiAgICBwYXNzcGhyYXNlLFxuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICBpc1RoaXJkUGFydHlCYWNrdXAgPSBmYWxzZSxcbiAgfTogQ3JlYXRlRWNkc2FLZXljaGFpblBhcmFtcyk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBpZiAoIXBhc3NwaHJhc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHByb3ZpZGUgYSB3YWxsZXQgcGFzc3BocmFzZScpO1xuICAgIH1cbiAgICBpZiAoaXNUaGlyZFBhcnR5QmFja3VwICYmIGJhY2t1cEtleVNoYXJlLmJpdEdvSGVsZEtleVNoYXJlcz8ua2V5U2hhcmVzKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVVc2VyS2V5Y2hhaW5Gcm9tVGhpcmRQYXJ0eUJhY2t1cChcbiAgICAgICAgdXNlckdwZ0tleSxcbiAgICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICAgIGJhY2t1cEdwZ0tleSBhcyBLZXksXG4gICAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgICAgYmFja3VwS2V5U2hhcmUuYml0R29IZWxkS2V5U2hhcmVzLmtleVNoYXJlcyxcbiAgICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgICAgcGFzc3BocmFzZSxcbiAgICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlXG4gICAgICApO1xuICAgIH1cbiAgICBhc3NlcnQoYmFja3VwS2V5U2hhcmUudXNlckhlbGRLZXlTaGFyZSk7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICBiYWNrdXBHcGdLZXkgYXMgU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgICAgMSxcbiAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgIGJhY2t1cEtleVNoYXJlLnVzZXJIZWxkS2V5U2hhcmUsXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgcGFzc3BocmFzZSxcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZVxuICAgICk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVCYWNrdXBLZXljaGFpbih7XG4gICAgdXNlckdwZ0tleSxcbiAgICB1c2VyS2V5U2hhcmUsXG4gICAgYmFja3VwR3BnS2V5LFxuICAgIGJhY2t1cEtleVNoYXJlLFxuICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgcGFzc3BocmFzZSxcbiAgICBiYWNrdXBQcm92aWRlcixcbiAgfTogQ3JlYXRlRWNkc2FLZXljaGFpblBhcmFtcyk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkVGhpcmRQYXJ0eUJhY2t1cFByb3ZpZGVyKGJhY2t1cFByb3ZpZGVyKSAmJiBiYWNrdXBLZXlTaGFyZS5iaXRHb0hlbGRLZXlTaGFyZXM/LmtleVNoYXJlcykge1xuICAgICAgYXNzZXJ0KGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pO1xuICAgICAgY29uc3QgZmluYWxpemVkQmFja3VwS2V5U2hhcmUgPSBhd2FpdCB0aGlzLmZpbmFsaXplQml0Z29IZWxkQmFja3VwS2V5U2hhcmUoXG4gICAgICAgIGJhY2t1cEtleVNoYXJlLmJpdEdvSGVsZEtleVNoYXJlcy5pZCxcbiAgICAgICAgYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbixcbiAgICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgICB1c2VyR3BnS2V5LFxuICAgICAgICBiYWNrdXBHcGdLZXkgYXMgS2V5XG4gICAgICApO1xuICAgICAgaWYgKGZpbmFsaXplZEJhY2t1cEtleVNoYXJlLmNvbW1vbktleWNoYWluICE9PSBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBiYWNrdXAga2V5Y2hhaW4gLSBjb21tb25LZXljaGFpbnMgZG8gbm90IG1hdGNoJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrdXBLZXlQYXJhbXM6IENyZWF0ZUJhY2t1cE9wdGlvbnMgPSB7XG4gICAgICAgIHNvdXJjZTogJ2JhY2t1cCcsXG4gICAgICAgIGtleVR5cGU6ICd0c3MnLFxuICAgICAgICBjb21tb25LZXljaGFpbjogZmluYWxpemVkQmFja3VwS2V5U2hhcmUuY29tbW9uS2V5Y2hhaW4sXG4gICAgICAgIHByb3ZpZGVyOiBiYWNrdXBQcm92aWRlciA/PyAnQml0R29UcnVzdEFzS3JzJyxcbiAgICAgIH07XG4gICAgICBjb25zdCBiYWNrdXBLZXljaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlQmFja3VwKGJhY2t1cEtleVBhcmFtcyk7XG4gICAgICBiYWNrdXBLZXljaGFpbi5rZXlTaGFyZXMgPSBmaW5hbGl6ZWRCYWNrdXBLZXlTaGFyZS5rZXlTaGFyZXM7XG4gICAgICByZXR1cm4gYmFja3VwS2V5Y2hhaW47XG4gICAgfVxuICAgIGFzc2VydChiYWNrdXBLZXlTaGFyZS51c2VySGVsZEtleVNoYXJlKTtcbiAgICBhc3NlcnQocGFzc3BocmFzZSk7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICBiYWNrdXBHcGdLZXkgYXMgU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgICAgMixcbiAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgIGJhY2t1cEtleVNoYXJlLnVzZXJIZWxkS2V5U2hhcmUsXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgcGFzc3BocmFzZVxuICAgICk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgYXN5bmMgY3JlYXRlQml0Z29LZXljaGFpbih7XG4gICAgdXNlckdwZ0tleSxcbiAgICBiYWNrdXBHcGdLZXksXG4gICAgdXNlcktleVNoYXJlLFxuICAgIGJhY2t1cEtleVNoYXJlLFxuICAgIGVudGVycHJpc2UsXG4gICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgaXNUaGlyZFBhcnR5QmFja3VwID0gZmFsc2UsXG4gIH06IENyZWF0ZUVjZHNhQml0R29LZXljaGFpblBhcmFtcyk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBjb25zdCByZWNpcGllbnRJbmRleCA9IDM7XG4gICAgY29uc3QgdXNlclRvQml0Z29TaGFyZSA9IGF3YWl0IGVuY3J5cHROU2hhcmUodXNlcktleVNoYXJlLCByZWNpcGllbnRJbmRleCwgYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKSwgdXNlckdwZ0tleSk7XG5cbiAgICBjb25zdCBiYWNrdXBUb0JpdGdvU2hhcmUgPSBhd2FpdCB0aGlzLmdldEJhY2t1cEVuY3J5cHRlZE5TaGFyZShcbiAgICAgIGJhY2t1cEtleVNoYXJlLFxuICAgICAgcmVjaXBpZW50SW5kZXgsXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleS5hcm1vcigpLFxuICAgICAgYmFja3VwR3BnS2V5IGFzIFNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gICAgICBpc1RoaXJkUGFydHlCYWNrdXBcbiAgICApO1xuXG4gICAgY29uc3QgY3JlYXRlQml0R29NUENQYXJhbXM6IEFkZEtleWNoYWluT3B0aW9ucyA9IHtcbiAgICAgIGtleVR5cGU6ICd0c3MnIGFzIEtleVR5cGUsXG4gICAgICBzb3VyY2U6ICdiaXRnbycsXG4gICAgICBrZXlTaGFyZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZyb206ICd1c2VyJyxcbiAgICAgICAgICB0bzogJ2JpdGdvJyxcbiAgICAgICAgICBwdWJsaWNTaGFyZTogdXNlclRvQml0Z29TaGFyZS5wdWJsaWNTaGFyZSxcbiAgICAgICAgICBwcml2YXRlU2hhcmU6IHVzZXJUb0JpdGdvU2hhcmUuZW5jcnlwdGVkUHJpdmF0ZVNoYXJlLFxuICAgICAgICAgIG46IHVzZXJUb0JpdGdvU2hhcmUubixcbiAgICAgICAgICB2c3NQcm9vZjogdXNlclRvQml0Z29TaGFyZS52c3NQcm9vZixcbiAgICAgICAgICBwcml2YXRlU2hhcmVQcm9vZjogdXNlclRvQml0Z29TaGFyZS5wcml2YXRlU2hhcmVQcm9vZixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGZyb206ICdiYWNrdXAnLFxuICAgICAgICAgIHRvOiAnYml0Z28nLFxuICAgICAgICAgIHB1YmxpY1NoYXJlOiBiYWNrdXBUb0JpdGdvU2hhcmUucHVibGljU2hhcmUsXG4gICAgICAgICAgcHJpdmF0ZVNoYXJlOiBiYWNrdXBUb0JpdGdvU2hhcmUuZW5jcnlwdGVkUHJpdmF0ZVNoYXJlLFxuICAgICAgICAgIG46IGJhY2t1cFRvQml0Z29TaGFyZS5uLFxuICAgICAgICAgIHZzc1Byb29mOiBiYWNrdXBUb0JpdGdvU2hhcmUudnNzUHJvb2YsXG4gICAgICAgICAgcHJpdmF0ZVNoYXJlUHJvb2Y6IGJhY2t1cFRvQml0Z29TaGFyZS5wcml2YXRlU2hhcmVQcm9vZixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICB1c2VyR1BHUHVibGljS2V5OiB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIGJhY2t1cEdQR1B1YmxpY0tleTogaXNUaGlyZFBhcnR5QmFja3VwXG4gICAgICAgID8gKGJhY2t1cEdwZ0tleSBhcyBLZXkpLmFybW9yKClcbiAgICAgICAgOiAoYmFja3VwR3BnS2V5IGFzIFNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4pLnB1YmxpY0tleSxcbiAgICAgIGVudGVycHJpc2U6IGVudGVycHJpc2UsXG4gICAgICBhbGdvVXNlZDogJ2VjZHNhJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuYWRkKGNyZWF0ZUJpdEdvTVBDUGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGJ1aWxkcyB0aGUgcmVsZXZhbnQgYmFja3VwIGVuY3J5cHRlZE5TaGFyZSBiYXNlZCBvbiB3aGV0aGVyIHRoZVxuICAgKiBiYWNrdXAga2V5IGlzIHVzZXIgb3IgdGhpcmQgcGFydHkgZ2VuZXJhdGVkXG4gICAqIEBwYXJhbSBiYWNrdXBTaGFyZSBjYW4gZWl0aGVyIGhhdmUga2V5IHNoYXJlcyBmcm9tIHRoZSB1c2VyIG9yIHRoaXJkIHBhcnR5XG4gICAqIEBwYXJhbSByZWNpcGllbnRJbmRleCBpbmRleCBvZiB0aGUgcGFydHkgcmVjZWl2aW5nIHRoZSBiYWNrdXAgc2hhcmVzXG4gICAqIEBwYXJhbSByZWNpcGllbnRHcGdQdWJsaWNBcm1vciBncGcgYXJtb3Igb2YgdGhlIHBhcnR5IHJlY2VpdmluZyB0aGUgYmFja3VwIHNoYXJlc1xuICAgKiBAcGFyYW0gYmFja3VwR3BnS2V5IGJhY2t1cCBncGcga2V5XG4gICAqIEBwYXJhbSBpc1RoaXJkUGFydHlCYWNrdXAgd2hldGhlciB0aGUgYmFja3VwIGlzIGdlbmVyYXRlZCBieSB0aGlyZCBwYXJ0eVxuICAgKi9cbiAgYXN5bmMgZ2V0QmFja3VwRW5jcnlwdGVkTlNoYXJlKFxuICAgIGJhY2t1cFNoYXJlOiBCYWNrdXBLZXlTaGFyZSxcbiAgICByZWNpcGllbnRJbmRleDogbnVtYmVyLFxuICAgIHJlY2lwaWVudEdwZ1B1YmxpY0FybW9yOiBzdHJpbmcsXG4gICAgYmFja3VwR3BnS2V5OiBTZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+LFxuICAgIGlzVGhpcmRQYXJ0eUJhY2t1cCA9IGZhbHNlXG4gICk6IFByb21pc2U8RW5jcnlwdGVkTlNoYXJlPiB7XG4gICAgbGV0IGJhY2t1cFRvUmVjaXBpZW50U2hhcmU6IEVuY3J5cHRlZE5TaGFyZTtcbiAgICBpZiAoaXNUaGlyZFBhcnR5QmFja3VwKSB7XG4gICAgICBpZiAoIWJhY2t1cFNoYXJlLmJpdEdvSGVsZEtleVNoYXJlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgdGhpcmQgcGFydHkgYmFja3VwIGtleSBzaGFyZXNgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhY2t1cFRvUmVjaXBpZW50QXBpU2hhcmUgPSBiYWNrdXBTaGFyZS5iaXRHb0hlbGRLZXlTaGFyZXMua2V5U2hhcmVzLmZpbmQoXG4gICAgICAgIChrZXlTaGFyZSkgPT4ga2V5U2hhcmUuZnJvbSA9PT0gJ2JhY2t1cCcgJiYga2V5U2hhcmUudG8gPT09IGdldFBhcnRpY2lwYW50RnJvbUluZGV4KHJlY2lwaWVudEluZGV4KVxuICAgICAgKTtcbiAgICAgIGlmICghYmFja3VwVG9SZWNpcGllbnRBcGlTaGFyZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgYmFja3VwIHRvICR7Z2V0UGFydGljaXBhbnRGcm9tSW5kZXgocmVjaXBpZW50SW5kZXgpfSBrZXkgc2hhcmVgKTtcbiAgICAgIH1cbiAgICAgIC8vIFNpbmNlIGJhY2t1cCBpcyBmcm9tIGEgdGhpcmQgcGFydHksIGl0IGlzIGFscmVhZHkgZW5jcnlwdGVkXG4gICAgICBiYWNrdXBUb1JlY2lwaWVudFNoYXJlID0gYXdhaXQgYnVpbGROU2hhcmVGcm9tQVBJS2V5U2hhcmUoYmFja3VwVG9SZWNpcGllbnRBcGlTaGFyZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChiYWNrdXBTaGFyZS51c2VySGVsZEtleVNoYXJlKTtcbiAgICAgIGJhY2t1cFRvUmVjaXBpZW50U2hhcmUgPSBhd2FpdCBlbmNyeXB0TlNoYXJlKFxuICAgICAgICBiYWNrdXBTaGFyZS51c2VySGVsZEtleVNoYXJlLFxuICAgICAgICByZWNpcGllbnRJbmRleCxcbiAgICAgICAgcmVjaXBpZW50R3BnUHVibGljQXJtb3IsXG4gICAgICAgIGJhY2t1cEdwZ0tleVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGJhY2t1cFRvUmVjaXBpZW50U2hhcmU7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyB1c2VzIHRoZSBiYWNrdXAga2V5IGZyb20gYSB0aGlyZCBwYXJ0eSAoYml0Z28gaW4gdGhpcyBjYXNlKVxuICAgKiB0byBjcmVhdGUgdGhlIHVzZXIga2V5Y2hhaW4gdmlhIFdQLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlVXNlcktleWNoYWluRnJvbVRoaXJkUGFydHlCYWNrdXAoXG4gICAgdXNlckdwZ0tleTogb3BlbnBncC5TZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+LFxuICAgIGJpdGdvUHVibGljR3BnS2V5OiBLZXksXG4gICAgdGhpcmRQYXJ0eUJhY2t1cFB1YmxpY0dwZ0tleTogS2V5LFxuICAgIHVzZXJLZXlTaGFyZTogS2V5U2hhcmUsXG4gICAgdGhpcmRQYXJ0eWJhY2t1cEtleVNoYXJlczogQXBpS2V5U2hhcmVbXSxcbiAgICBiaXRnb0tleWNoYWluOiBLZXljaGFpbixcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmcsXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nXG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBjb25zdCBiaXRnb0tleVNoYXJlcyA9IGJpdGdvS2V5Y2hhaW4ua2V5U2hhcmVzO1xuICAgIGlmICghYml0Z29LZXlTaGFyZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBCaXRHbyBrZXkgc2hhcmVzJyk7XG4gICAgfVxuICAgIGlmICghYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGNvbW1vbiBrZXkgY2hhaW46ICR7Yml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbn1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRHb1RvVXNlclNoYXJlID0gYml0Z29LZXlTaGFyZXMuZmluZCgoa2V5U2hhcmUpID0+IGtleVNoYXJlLmZyb20gPT09ICdiaXRnbycgJiYga2V5U2hhcmUudG8gPT09ICd1c2VyJyk7XG4gICAgaWYgKCFiaXRHb1RvVXNlclNoYXJlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgQml0R28gdG8gVXNlciBrZXkgc2hhcmUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBiYWNrdXBUb1VzZXJTaGFyZSA9IHRoaXJkUGFydHliYWNrdXBLZXlTaGFyZXMuZmluZChcbiAgICAgIChrZXlTaGFyZSkgPT4ga2V5U2hhcmUuZnJvbSA9PT0gJ2JhY2t1cCcgJiYga2V5U2hhcmUudG8gPT09ICd1c2VyJ1xuICAgICk7XG4gICAgaWYgKCFiYWNrdXBUb1VzZXJTaGFyZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIEJhY2t1cCB0byBVc2VyIGtleSBzaGFyZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGJhY2t1cFRvVXNlck5TaGFyZSA9IGF3YWl0IGJ1aWxkTlNoYXJlRnJvbUFQSUtleVNoYXJlKGJhY2t1cFRvVXNlclNoYXJlKTtcbiAgICBjb25zdCBiaXRHb1RvVXNlck5TaGFyZSA9IGF3YWl0IGJ1aWxkTlNoYXJlRnJvbUFQSUtleVNoYXJlKGJpdEdvVG9Vc2VyU2hhcmUpO1xuICAgIGNvbnN0IGVuY3J5cHRlZE5TaGFyZXM6IERlY3J5cHRhYmxlTlNoYXJlW10gPSBbXG4gICAgICB7XG4gICAgICAgIG5TaGFyZTogYmFja3VwVG9Vc2VyTlNoYXJlLFxuICAgICAgICByZWNpcGllbnRQcml2YXRlQXJtb3I6IHVzZXJHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgICAgc2VuZGVyUHVibGljQXJtb3I6IHRoaXJkUGFydHlCYWNrdXBQdWJsaWNHcGdLZXkuYXJtb3IoKSxcbiAgICAgICAgaXNiczU4RW5jb2RlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuU2hhcmU6IGJpdEdvVG9Vc2VyTlNoYXJlLFxuICAgICAgICByZWNpcGllbnRQcml2YXRlQXJtb3I6IHVzZXJHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgICAgc2VuZGVyUHVibGljQXJtb3I6IGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCksXG4gICAgICAgIGlzYnM1OEVuY29kZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgdXNlckNvbWJpbmVkS2V5ID0gYXdhaXQgRUNEU0FNZXRob2RzLmNyZWF0ZUNvbWJpbmVkS2V5KFxuICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgZW5jcnlwdGVkTlNoYXJlcyxcbiAgICAgIGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW5cbiAgICApO1xuICAgIGlmICh1c2VyQ29tYmluZWRLZXkuY29tbW9uS2V5Y2hhaW4gIT09IGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNyZWF0ZSB1c2VyIGtleWNoYWluIC0gY29tbW9uS2V5Y2hhaW5zIGRvIG5vdCBtYXRjaC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcnYgPSBKU09OLnN0cmluZ2lmeSh1c2VyQ29tYmluZWRLZXkuc2lnbmluZ01hdGVyaWFsKTtcbiAgICBjb25zdCB1c2VyS2V5Y2hhaW5QYXJhbXMgPSB7XG4gICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgIGtleVR5cGU6ICd0c3MnIGFzIEtleVR5cGUsXG4gICAgICBjb21tb25LZXljaGFpbjogdXNlckNvbWJpbmVkS2V5LmNvbW1vbktleWNoYWluLFxuICAgICAgcHJ2OiBwcnYsXG4gICAgICBlbmNyeXB0ZWRQcnY6IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgIGlucHV0OiBwcnYsXG4gICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgfSksXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgfTtcblxuICAgIGNvbnN0IGtleWNoYWlucyA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgcmV0dXJuIGF3YWl0IGtleWNoYWlucy5hZGQodXNlcktleWNoYWluUGFyYW1zKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBhc3luYyBjcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgIHVzZXJHcGdLZXk6IG9wZW5wZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICB1c2VyTG9jYWxCYWNrdXBHcGdLZXk6IG9wZW5wZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICBiaXRnb1B1YmxpY0dwZ0tleTogS2V5LFxuICAgIHJlY2lwaWVudEluZGV4OiBudW1iZXIsXG4gICAgdXNlcktleVNoYXJlOiBLZXlTaGFyZSxcbiAgICBiYWNrdXBLZXlTaGFyZTogS2V5U2hhcmUsXG4gICAgYml0Z29LZXljaGFpbjogS2V5Y2hhaW4sXG4gICAgcGFzc3BocmFzZTogc3RyaW5nLFxuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZ1xuICApOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgY29uc3QgYml0Z29LZXlTaGFyZXMgPSBiaXRnb0tleWNoYWluLmtleVNoYXJlcztcbiAgICBpZiAoIWJpdGdvS2V5U2hhcmVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgQml0R28ga2V5IHNoYXJlcycpO1xuICAgIH1cbiAgICBpZiAoIWJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBjb21tb24ga2V5IGNoYWluOiAke2JpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW59YCk7XG4gICAgfVxuXG4gICAgbGV0IHJlY2lwaWVudDogc3RyaW5nO1xuICAgIGxldCBrZXlTaGFyZTogS2V5U2hhcmU7XG4gICAgbGV0IG90aGVyU2hhcmU6IEtleVNoYXJlO1xuICAgIGxldCByZWNpcGllbnRHcGdLZXk6IG9wZW5wZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPjtcbiAgICBsZXQgc2VuZGVyR3BnS2V5OiBvcGVucGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz47XG4gICAgaWYgKHJlY2lwaWVudEluZGV4ID09PSAxKSB7XG4gICAgICBrZXlTaGFyZSA9IHVzZXJLZXlTaGFyZTtcbiAgICAgIG90aGVyU2hhcmUgPSBiYWNrdXBLZXlTaGFyZTtcbiAgICAgIHJlY2lwaWVudCA9ICd1c2VyJztcbiAgICAgIHJlY2lwaWVudEdwZ0tleSA9IHVzZXJHcGdLZXk7XG4gICAgICBzZW5kZXJHcGdLZXkgPSB1c2VyTG9jYWxCYWNrdXBHcGdLZXk7XG4gICAgfSBlbHNlIGlmIChyZWNpcGllbnRJbmRleCA9PT0gMikge1xuICAgICAga2V5U2hhcmUgPSBiYWNrdXBLZXlTaGFyZTtcbiAgICAgIG90aGVyU2hhcmUgPSB1c2VyS2V5U2hhcmU7XG4gICAgICByZWNpcGllbnQgPSAnYmFja3VwJztcbiAgICAgIHJlY2lwaWVudEdwZ0tleSA9IHVzZXJMb2NhbEJhY2t1cEdwZ0tleTtcbiAgICAgIHNlbmRlckdwZ0tleSA9IHVzZXJHcGdLZXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1c2VyIGluZGV4Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0R29Ub1JlY2lwaWVudFNoYXJlID0gYml0Z29LZXlTaGFyZXMuZmluZChcbiAgICAgIChrZXlTaGFyZSkgPT4ga2V5U2hhcmUuZnJvbSA9PT0gJ2JpdGdvJyAmJiBrZXlTaGFyZS50byA9PT0gcmVjaXBpZW50XG4gICAgKTtcbiAgICBpZiAoIWJpdEdvVG9SZWNpcGllbnRTaGFyZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIEJpdEdvIHRvICR7cmVjaXBpZW50fSBrZXkgc2hhcmVgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNyeXB0ZWRTaGFyZSA9IGF3YWl0IHRoaXMuZGVjcnlwdFByaXZhdGVTaGFyZShiaXRHb1RvUmVjaXBpZW50U2hhcmUucHJpdmF0ZVNoYXJlLCByZWNpcGllbnRHcGdLZXkpO1xuXG4gICAgYXdhaXQgdGhpcy52ZXJpZnlXYWxsZXRTaWduYXR1cmVzKFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB1c2VyTG9jYWxCYWNrdXBHcGdLZXkucHVibGljS2V5LFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIGRlY3J5cHRlZFNoYXJlLFxuICAgICAgcmVjaXBpZW50SW5kZXhcbiAgICApO1xuXG4gICAgY29uc3Qgc2VuZGVyVG9SZWNpcGllbnRTaGFyZSA9IGF3YWl0IGVuY3J5cHROU2hhcmUoXG4gICAgICBvdGhlclNoYXJlLFxuICAgICAgcmVjaXBpZW50SW5kZXgsXG4gICAgICByZWNpcGllbnRHcGdLZXkucHVibGljS2V5LFxuICAgICAgc2VuZGVyR3BnS2V5XG4gICAgKTtcbiAgICBjb25zdCBlbmNyeXB0ZWROU2hhcmVzOiBEZWNyeXB0YWJsZU5TaGFyZVtdID0gW1xuICAgICAge1xuICAgICAgICAvLyB1c2VyVG9CYWNrdXAgb3IgYmFja3VwVG9Vc2VyXG4gICAgICAgIG5TaGFyZTogc2VuZGVyVG9SZWNpcGllbnRTaGFyZSxcbiAgICAgICAgcmVjaXBpZW50UHJpdmF0ZUFybW9yOiByZWNpcGllbnRHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgICAgc2VuZGVyUHVibGljQXJtb3I6IHNlbmRlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAvLyBiaXRnb1RvUmVjaXBpZW50XG4gICAgICAgIG5TaGFyZToge1xuICAgICAgICAgIGk6IHJlY2lwaWVudEluZGV4LFxuICAgICAgICAgIGo6IDMsXG4gICAgICAgICAgcHVibGljU2hhcmU6IGJpdEdvVG9SZWNpcGllbnRTaGFyZS5wdWJsaWNTaGFyZSxcbiAgICAgICAgICBlbmNyeXB0ZWRQcml2YXRlU2hhcmU6IGJpdEdvVG9SZWNpcGllbnRTaGFyZS5wcml2YXRlU2hhcmUsXG4gICAgICAgICAgbjogYml0R29Ub1JlY2lwaWVudFNoYXJlLm4hLFxuICAgICAgICAgIHZzc1Byb29mOiBiaXRHb1RvUmVjaXBpZW50U2hhcmUudnNzUHJvb2YsXG4gICAgICAgICAgcHJpdmF0ZVNoYXJlUHJvb2Y6IGJpdEdvVG9SZWNpcGllbnRTaGFyZS5wcml2YXRlU2hhcmVQcm9vZixcbiAgICAgICAgfSxcbiAgICAgICAgcmVjaXBpZW50UHJpdmF0ZUFybW9yOiByZWNpcGllbnRHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgICAgc2VuZGVyUHVibGljQXJtb3I6IGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCksXG4gICAgICAgIGlzYnM1OEVuY29kZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgcmVjaXBpZW50Q29tYmluZWRLZXkgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlQ29tYmluZWRLZXkoXG4gICAgICBrZXlTaGFyZSxcbiAgICAgIGVuY3J5cHRlZE5TaGFyZXMsXG4gICAgICBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluXG4gICAgKTtcblxuICAgIGNvbnN0IHBydiA9IEpTT04uc3RyaW5naWZ5KHJlY2lwaWVudENvbWJpbmVkS2V5LnNpZ25pbmdNYXRlcmlhbCk7XG4gICAgY29uc3QgcmVjaXBpZW50S2V5Y2hhaW5QYXJhbXMgPSB7XG4gICAgICBzb3VyY2U6IHJlY2lwaWVudCxcbiAgICAgIGtleVR5cGU6ICd0c3MnIGFzIEtleVR5cGUsXG4gICAgICBjb21tb25LZXljaGFpbjogYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbixcbiAgICAgIHBydjogcHJ2LFxuICAgICAgZW5jcnlwdGVkUHJ2OiB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICBpbnB1dDogcHJ2LFxuICAgICAgICBwYXNzd29yZDogcGFzc3BocmFzZSxcbiAgICAgIH0pLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgIH07XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpO1xuICAgIHJldHVybiByZWNpcGllbnRJbmRleCA9PT0gMVxuICAgICAgPyBhd2FpdCBrZXljaGFpbnMuYWRkKHJlY2lwaWVudEtleWNoYWluUGFyYW1zKVxuICAgICAgOiBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHJlY2lwaWVudEtleWNoYWluUGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHNpZ25pbmcga2V5LCB0eFJlcXVlc3RSZXNvbHZlZCBhbmQgdHhSZXF1ZXN0SWRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdCBvciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0geyBzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8RUNEU0FTaWduaW5nUmVxdWVzdEJhc2VSZXN1bHQ+fVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduUmVxdWVzdEJhc2UocGFyYW1zOiBUU1NQYXJhbXMgfCBUU1NQYXJhbXNGb3JNZXNzYWdlLCByZXF1ZXN0VHlwZTogUmVxdWVzdFR5cGUpOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGxldCB0eFJlcXVlc3RSZXNvbHZlZDogVHhSZXF1ZXN0O1xuICAgIGxldCB0eFJlcXVlc3RJZDogc3RyaW5nO1xuXG4gICAgY29uc3QgeyB0eFJlcXVlc3QsIHBydiB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKHR5cGVvZiB0eFJlcXVlc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZCA9IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCB0eFJlcXVlc3QpO1xuICAgICAgdHhSZXF1ZXN0SWQgPSB0eFJlcXVlc3RSZXNvbHZlZC50eFJlcXVlc3RJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQgPSB0eFJlcXVlc3Q7XG4gICAgICB0eFJlcXVlc3RJZCA9IHR4UmVxdWVzdC50eFJlcXVlc3RJZDtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyU2lnbmluZ01hdGVyaWFsOiBFQ0RTQU1ldGhvZFR5cGVzLlNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UocHJ2KTtcbiAgICBpZiAodXNlclNpZ25pbmdNYXRlcmlhbC5wU2hhcmUuaSAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHVzZXIga2V5Jyk7XG4gICAgfVxuICAgIGlmICghdXNlclNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1c2VyIGtleSAtIG1pc3NpbmcgYmFja3VwTlNoYXJlJyk7XG4gICAgfVxuXG4gICAgbGV0IHNpZ25hYmxlUGF5bG9hZDtcbiAgICBsZXQgZGVyaXZhdGlvblBhdGg7XG5cbiAgICBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4KSB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIHR4UmVxdWVzdFJlc29sdmVkLnRyYW5zYWN0aW9ucyB8fCB0eFJlcXVlc3RSZXNvbHZlZC51bnNpZ25lZFR4cyxcbiAgICAgICAgJ1VuYWJsZSB0byBmaW5kIHRyYW5zYWN0aW9ucyBpbiB0eFJlcXVlc3QnXG4gICAgICApO1xuICAgICAgY29uc3QgdW5zaWduZWRUeCA9XG4gICAgICAgIHR4UmVxdWVzdFJlc29sdmVkLmFwaVZlcnNpb24gPT09ICdmdWxsJ1xuICAgICAgICAgID8gdHhSZXF1ZXN0UmVzb2x2ZWQudHJhbnNhY3Rpb25zIVswXS51bnNpZ25lZFR4XG4gICAgICAgICAgOiB0eFJlcXVlc3RSZXNvbHZlZC51bnNpZ25lZFR4c1swXTtcbiAgICAgIHNpZ25hYmxlUGF5bG9hZCA9IEJ1ZmZlci5mcm9tKHVuc2lnbmVkVHguc2lnbmFibGVIZXgsICdoZXgnKTtcbiAgICAgIGRlcml2YXRpb25QYXRoID0gdHhSZXF1ZXN0UmVzb2x2ZWQudHJhbnNhY3Rpb25zIVswXS51bnNpZ25lZFR4LmRlcml2YXRpb25QYXRoO1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLm1lc3NhZ2UpIHtcbiAgICAgIHNpZ25hYmxlUGF5bG9hZCA9IChwYXJhbXMgYXMgVFNTUGFyYW1zRm9yTWVzc2FnZSkuYnVmZmVyVG9TaWduO1xuICAgICAgLy8gVE9ETyBCRy02NzI5OSBNZXNzYWdlIHNpZ25pbmcgd2l0aCBkZXJpdmF0aW9uIHBhdGhcbiAgICAgIGRlcml2YXRpb25QYXRoID0gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgTVBDID0gbmV3IEVjZHNhKCk7XG4gICAgY29uc3Qgc2lnbmluZ0tleSA9IE1QQy5rZXlEZXJpdmUoXG4gICAgICB1c2VyU2lnbmluZ01hdGVyaWFsLnBTaGFyZSxcbiAgICAgIFt1c2VyU2lnbmluZ01hdGVyaWFsLmJpdGdvTlNoYXJlLCB1c2VyU2lnbmluZ01hdGVyaWFsLmJhY2t1cE5TaGFyZV0sXG4gICAgICBkZXJpdmF0aW9uUGF0aFxuICAgICk7XG5cbiAgICBjb25zdCBiaXRnb0luZGV4ID0gMztcbiAgICBjb25zdCB1c2VySW5kZXggPSAxO1xuICAgIGNvbnN0IHlTaGFyZSA9IHtcbiAgICAgIGk6IHVzZXJTaWduaW5nTWF0ZXJpYWwucFNoYXJlLmksXG4gICAgICBqOiBiaXRnb0luZGV4LFxuICAgICAgbjogc2lnbmluZ0tleS5uU2hhcmVzW2JpdGdvSW5kZXhdLm4sXG4gICAgfTtcblxuICAgIGNvbnN0IFtzaWduaW5nS2V5V2l0aENoYWxsZW5nZSwgYml0Z29DaGFsbGVuZ2VdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgTVBDLnNpZ25DaGFsbGVuZ2Uoc2lnbmluZ0tleS54U2hhcmUsIHlTaGFyZSksXG4gICAgICBnZXRUeFJlcXVlc3RDaGFsbGVuZ2UodGhpcy5iaXRnbywgdGhpcy53YWxsZXQuaWQoKSwgdHhSZXF1ZXN0SWQsICcwJywgcmVxdWVzdFR5cGUsICdlY2RzYScpLFxuICAgIF0pO1xuXG4gICAgY29uc3QgdXNlclNpZ25TaGFyZSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVVc2VyU2lnblNoYXJlKHNpZ25pbmdLZXlXaXRoQ2hhbGxlbmdlLnhTaGFyZSwge1xuICAgICAgaTogdXNlckluZGV4LFxuICAgICAgajogYml0Z29JbmRleCxcbiAgICAgIG46IHVzZXJTaWduaW5nTWF0ZXJpYWwuYml0Z29OU2hhcmUubixcbiAgICAgIG50aWxkZTogYml0Z29DaGFsbGVuZ2UubnRpbGRlLFxuICAgICAgaDE6IGJpdGdvQ2hhbGxlbmdlLmgxLFxuICAgICAgaDI6IGJpdGdvQ2hhbGxlbmdlLmgyLFxuICAgIH0pO1xuICAgIGNvbnN0IHUgPSBzaWduaW5nS2V5Lm5TaGFyZXNbYml0Z29JbmRleF0udTtcblxuICAgIGxldCBjaGFpbmNvZGUgPSB1c2VyU2lnbmluZ01hdGVyaWFsLmJpdGdvTlNoYXJlLmNoYWluY29kZTtcbiAgICB3aGlsZSAoY2hhaW5jb2RlLmxlbmd0aCA8IDY0KSB7XG4gICAgICBjaGFpbmNvZGUgPSAnMCcgKyBjaGFpbmNvZGU7XG4gICAgfVxuICAgIGNvbnN0IHNpZ25lclNoYXJlID0gYmlwMzIuZnJvbVByaXZhdGVLZXkoQnVmZmVyLmZyb20odSwgJ2hleCcpLCBCdWZmZXIuZnJvbShjaGFpbmNvZGUsICdoZXgnKSkudG9CYXNlNTgoKTtcbiAgICBjb25zdCBiaXRnb0dwZ0tleSA9IGF3YWl0IGdldEJpdGdvR3BnUHViS2V5KHRoaXMuYml0Z28pO1xuICAgIGNvbnN0IGVuY3J5cHRlZFNpZ25lclNoYXJlID0gKGF3YWl0IG9wZW5wZ3AuZW5jcnlwdCh7XG4gICAgICBtZXNzYWdlOiBhd2FpdCBvcGVucGdwLmNyZWF0ZU1lc3NhZ2Uoe1xuICAgICAgICB0ZXh0OiBzaWduZXJTaGFyZSxcbiAgICAgIH0pLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHJlamVjdEN1cnZlczogbmV3IFNldCgpLFxuICAgICAgfSxcbiAgICAgIGVuY3J5cHRpb25LZXlzOiBbYml0Z29HcGdLZXldLFxuICAgIH0pKSBhcyBzdHJpbmc7XG4gICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignc2VjcDI1NmsxJyk7XG4gICAgY29uc3QgcHJpdmF0ZVNoYXJlUHJvb2YgPSBhd2FpdCBjcmVhdGVTaGFyZVByb29mKHVzZXJHcGdLZXkucHJpdmF0ZUtleSwgc2lnbmluZ0tleS5uU2hhcmVzW2JpdGdvSW5kZXhdLnUsICdlY2RzYScpO1xuICAgIGNvbnN0IHZzc1Byb29mID0gc2lnbmluZ0tleS5uU2hhcmVzW2JpdGdvSW5kZXhdLnY7XG4gICAgY29uc3QgdXNlclB1YmxpY0dwZ0tleSA9IHVzZXJHcGdLZXkucHVibGljS2V5O1xuICAgIGNvbnN0IHB1YmxpY1NoYXJlID0gc2lnbmluZ0tleS5uU2hhcmVzW2JpdGdvSW5kZXhdLnkgKyBzaWduaW5nS2V5Lm5TaGFyZXNbYml0Z29JbmRleF0uY2hhaW5jb2RlO1xuXG4gICAgLy8gc2lnbmluZyBzdGFnZSBvbmUgd2l0aCBLIHNoYXJlIHNlbmQgdG8gYml0Z28gYW5kIHJlY2VpdmVzIEEgc2hhcmVcbiAgICBjb25zdCBiaXRnb1RvVXNlckFTaGFyZSA9IChhd2FpdCBFQ0RTQU1ldGhvZHMuc2VuZFNoYXJlVG9CaXRnbyhcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0aGlzLndhbGxldC5pZCgpLFxuICAgICAgdHhSZXF1ZXN0SWQsXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIFNlbmRTaGFyZVR5cGUuS1NoYXJlLFxuICAgICAgdXNlclNpZ25TaGFyZS5rU2hhcmUsXG4gICAgICBlbmNyeXB0ZWRTaWduZXJTaGFyZSxcbiAgICAgIHZzc1Byb29mLFxuICAgICAgcHJpdmF0ZVNoYXJlUHJvb2YsXG4gICAgICBwdWJsaWNTaGFyZSxcbiAgICAgIHVzZXJQdWJsaWNHcGdLZXlcbiAgICApKSBhcyBPbWl0PEFTaGFyZSwgJ250aWxkZScgfCAnaDEnIHwgJ2gyJz47IC8vIFdQL0hTTSBkb2VzIG5vdCByZXR1cm4gdGhlIGluaXRpYWwgY2hhbGxlbmdlXG5cbiAgICAvLyBBcHBlbmQgdGhlIEJpdEdvIGNoYWxsZW5nZSB0byB0aGUgQXNoYXJlIHRvIGJlIHVzZWQgaW4gc3Vic2VxdWVudCBwcm9vZnNcbiAgICBjb25zdCBiaXRnb1RvVXNlckFTaGFyZVdpdGhOVGlsZGU6IEFTaGFyZSA9IHtcbiAgICAgIC4uLmJpdGdvVG9Vc2VyQVNoYXJlLFxuICAgICAgLi4uYml0Z29DaGFsbGVuZ2UsXG4gICAgfTtcblxuICAgIGNvbnN0IHVzZXJHYW1tYUFuZE11U2hhcmVzID0gYXdhaXQgRUNEU0FNZXRob2RzLmNyZWF0ZVVzZXJHYW1tYUFuZE11U2hhcmUoXG4gICAgICB1c2VyU2lnblNoYXJlLndTaGFyZSxcbiAgICAgIGJpdGdvVG9Vc2VyQVNoYXJlV2l0aE5UaWxkZVxuICAgICk7XG4gICAgY29uc3QgdXNlck9taWNyb25BbmREZWx0YVNoYXJlID0gYXdhaXQgRUNEU0FNZXRob2RzLmNyZWF0ZVVzZXJPbWljcm9uQW5kRGVsdGFTaGFyZShcbiAgICAgIHVzZXJHYW1tYUFuZE11U2hhcmVzLmdTaGFyZSBhcyBFQ0RTQS5HU2hhcmVcbiAgICApO1xuICAgIGNvbnN0IG11U2hhcmUgPSB1c2VyR2FtbWFBbmRNdVNoYXJlcy5tdVNoYXJlITtcbiAgICBjb25zdCBkU2hhcmUgPSB1c2VyT21pY3JvbkFuZERlbHRhU2hhcmUuZFNoYXJlO1xuXG4gICAgLy8gc2lnbmluZyBzdGFnZSB0d28gd2l0aCBtdVNoYXJlIGFuZCBkU2hhcmUgc2VuZCB0byBiaXRnbyBhbmQgcmVjZWl2ZXMgRCBzaGFyZVxuICAgIGNvbnN0IGJpdGdvVG9Vc2VyRFNoYXJlID0gKGF3YWl0IEVDRFNBTWV0aG9kcy5zZW5kU2hhcmVUb0JpdGdvKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0eFJlcXVlc3RJZCxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgU2VuZFNoYXJlVHlwZS5NVVNoYXJlLFxuICAgICAgeyBtdVNoYXJlLCBkU2hhcmUsIGk6IG11U2hhcmUuaSB9XG4gICAgKSkgYXMgRFNoYXJlO1xuXG4gICAgY29uc3QgdXNlclNTaGFyZSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVVc2VyU2lnbmF0dXJlU2hhcmUoXG4gICAgICB1c2VyT21pY3JvbkFuZERlbHRhU2hhcmUub1NoYXJlLFxuICAgICAgYml0Z29Ub1VzZXJEU2hhcmUsXG4gICAgICBzaWduYWJsZVBheWxvYWQsXG4gICAgICBwYXJhbXMuaGFzaFxuICAgICk7XG5cbiAgICAvLyBzaWduaW5nIHN0YWdlIHRocmVlIHdpdGggU1NoYXJlIHNlbmQgdG8gYml0Z28gYW5kIHJlY2VpdmVzIFNTaGFyZVxuICAgIGF3YWl0IEVDRFNBTWV0aG9kcy5zZW5kU2hhcmVUb0JpdGdvKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0eFJlcXVlc3RJZCxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgU2VuZFNoYXJlVHlwZS5TU2hhcmUsXG4gICAgICB1c2VyU1NoYXJlXG4gICAgKTtcbiAgICByZXR1cm4gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHR4UmVxdWVzdElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyB0aGUgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB0byB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdCBvciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJlcUlkIC0gcmVxdWVzdCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fSBmdWxseSBzaWduZWQgVHhSZXF1ZXN0IG9iamVjdFxuICAgKi9cbiAgYXN5bmMgc2lnblR4UmVxdWVzdChwYXJhbXM6IFRTU1BhcmFtcyk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgcmV0dXJuIHRoaXMuc2lnblJlcXVlc3RCYXNlKHBhcmFtcywgUmVxdWVzdFR5cGUudHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIHRoZSBtZXNzYWdlIGFzc29jaWF0ZWQgdG8gdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVHhSZXF1ZXN0fSBwYXJhbXMudHhSZXF1ZXN0IC0gdHJhbnNhY3Rpb24gcmVxdWVzdCBvYmplY3Qgb3IgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5wcnYgLSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8VHhSZXF1ZXN0Pn0gZnVsbHkgc2lnbmVkIFR4UmVxdWVzdCBvYmplY3RcbiAgICovXG4gIGFzeW5jIHNpZ25UeFJlcXVlc3RGb3JNZXNzYWdlKHBhcmFtczogVFNTUGFyYW1zRm9yTWVzc2FnZSk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgaWYgKCFwYXJhbXMubWVzc2FnZVJhdykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSYXcgbWVzc2FnZSByZXF1aXJlZCB0byBzaWduIG1lc3NhZ2UnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2lnblJlcXVlc3RCYXNlKHBhcmFtcywgUmVxdWVzdFR5cGUubWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhlIHUtdmFsdWUgcHJvb2ZzIGFuZCBHUEcga2V5cyB1c2VkIGluIGdlbmVyYXRpbmcgYSBUU1MgRUNEU0Egd2FsbGV0LlxuICAgKiBAcGFyYW0gdXNlckdwZ1B1YiBUaGUgdXNlcidzIHB1YmxpYyBHUEcga2V5IGZvciBlbmNyeXB0aW9uIGJldHdlZW4gdXNlci9zZXJ2ZXJcbiAgICogQHBhcmFtIGJhY2t1cEdwZ1B1YiBUaGUgYmFja3VwJ3MgcHVibGljIEdQRyBrZXkgZm9yIGVuY3J5cHRpb24gYmV0d2VlbiBiYWNrdXAvc2VydmVyXG4gICAqIEBwYXJhbSBiaXRnb0tleWNoYWluIHByZXZpb3VzbHkgY3JlYXRlZCBCaXRHbyBrZXljaGFpbjsgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdXNlciBhbmQgYmFja3VwIGtleSBzaGFyZXNcbiAgICogQHBhcmFtIGRlY3J5cHRlZFNoYXJlIFRoZSBkZWNyeXB0ZWQgYml0Z28tdG8tdXNlci9iYWNrdXAgcHJpdmF0ZSBzaGFyZSByZXRyaWV2ZWQgZnJvbSB0aGUga2V5Y2hhaW5cbiAgICogQHBhcmFtIHZlcmlmaWVySW5kZXggVGhlIGluZGV4IG9mIHRoZSBwYXJ0eSB0byB2ZXJpZnk6IDEgPSB1c2VyLCAyID0gYmFja3VwXG4gICAqL1xuICBhc3luYyB2ZXJpZnlXYWxsZXRTaWduYXR1cmVzKFxuICAgIHVzZXJHcGdQdWI6IHN0cmluZyxcbiAgICBiYWNrdXBHcGdQdWI6IHN0cmluZyxcbiAgICBiaXRnb0tleWNoYWluOiBLZXljaGFpbixcbiAgICBkZWNyeXB0ZWRTaGFyZTogc3RyaW5nLFxuICAgIHZlcmlmaWVySW5kZXg6IDEgfCAyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGFzc2VydChiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluKTtcbiAgICBhc3NlcnQoYml0Z29LZXljaGFpbi53YWxsZXRIU01HUEdQdWJsaWNLZXlTaWdzKTtcblxuICAgIGNvbnN0IGJpdGdvR3BnS2V5ID0gYXdhaXQgZ2V0Qml0Z29HcGdQdWJLZXkodGhpcy5iaXRnbyk7XG4gICAgY29uc3QgdXNlcktleVB1YiA9IGF3YWl0IG9wZW5wZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IHVzZXJHcGdQdWIgfSk7XG4gICAgY29uc3QgdXNlcktleUlkID0gdXNlcktleVB1Yi5rZXlQYWNrZXQuZ2V0RmluZ2VycHJpbnQoKTtcbiAgICBjb25zdCBiYWNrdXBLZXlQdWIgPSBhd2FpdCBvcGVucGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiBiYWNrdXBHcGdQdWIgfSk7XG4gICAgY29uc3QgYmFja3VwS2V5SWQgPSBiYWNrdXBLZXlQdWIua2V5UGFja2V0LmdldEZpbmdlcnByaW50KCk7XG5cbiAgICBjb25zdCB3YWxsZXRTaWduYXR1cmVzID0gYXdhaXQgb3BlbnBncC5yZWFkS2V5cyh7IGFybW9yZWRLZXlzOiBiaXRnb0tleWNoYWluLndhbGxldEhTTUdQR1B1YmxpY0tleVNpZ3MgfSk7XG4gICAgaWYgKHdhbGxldFNpZ25hdHVyZXMubGVuZ3RoICE9PSAyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgd2FsbGV0IHNpZ25hdHVyZXMnKTtcbiAgICB9XG4gICAgaWYgKHVzZXJLZXlJZCAhPT0gd2FsbGV0U2lnbmF0dXJlc1swXS5rZXlQYWNrZXQuZ2V0RmluZ2VycHJpbnQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBmaXJzdCB3YWxsZXQgc2lnbmF0dXJlJ3MgZmluZ2VycHJpbnQgZG9lcyBub3QgbWF0Y2ggcGFzc2VkIHVzZXIgZ3BnIGtleSdzIGZpbmdlcnByaW50YCk7XG4gICAgfVxuICAgIGlmIChiYWNrdXBLZXlJZCAhPT0gd2FsbGV0U2lnbmF0dXJlc1sxXS5rZXlQYWNrZXQuZ2V0RmluZ2VycHJpbnQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZWNvbmQgd2FsbGV0IHNpZ25hdHVyZSdzIGZpbmdlcnByaW50IGRvZXMgbm90IG1hdGNoIHBhc3NlZCBiYWNrdXAgZ3BnIGtleSdzIGZpbmdlcnByaW50YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdmVyaWZ5V2FsbGV0U2lnbmF0dXJlKHtcbiAgICAgIHdhbGxldFNpZ25hdHVyZTogd2FsbGV0U2lnbmF0dXJlc1swXSxcbiAgICAgIGNvbW1vbktleWNoYWluOiBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluLFxuICAgICAgdXNlcktleUlkLFxuICAgICAgYmFja3VwS2V5SWQsXG4gICAgICBiaXRnb1B1YjogYml0Z29HcGdLZXksXG4gICAgICBkZWNyeXB0ZWRTaGFyZSxcbiAgICAgIHZlcmlmaWVySW5kZXgsXG4gICAgfSk7XG5cbiAgICBhd2FpdCB2ZXJpZnlXYWxsZXRTaWduYXR1cmUoe1xuICAgICAgd2FsbGV0U2lnbmF0dXJlOiB3YWxsZXRTaWduYXR1cmVzWzFdLFxuICAgICAgY29tbW9uS2V5Y2hhaW46IGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4sXG4gICAgICB1c2VyS2V5SWQsXG4gICAgICBiYWNrdXBLZXlJZCxcbiAgICAgIGJpdGdvUHViOiBiaXRnb0dwZ0tleSxcbiAgICAgIGRlY3J5cHRlZFNoYXJlLFxuICAgICAgdmVyaWZpZXJJbmRleCxcbiAgICB9KTtcbiAgfVxufVxuIl19
859
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdXRpbHMvdHNzL2VjZHNhL2VjZHNhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx5REFBK0Q7QUFDL0QsaURBQW1DO0FBR25DLCtEQUFvRTtBQUVwRSxtRUFBMkM7QUFVM0MsNENBUXNCO0FBQ3RCLHNDQUE0QztBQUM1QyxvREFBMEY7QUFDMUYscURBQWdIO0FBR2hILG9EQUE0QjtBQUM1Qiw4Q0FBd0M7QUFDeEMsb0RBQXNIO0FBRXRILGlGQUFxRztBQUNyRyx3Q0FBbUY7QUFDbkYsbUNBQWdDO0FBQ2hDLHlEQUF1SDtBQUN2SCxnREFBNEQ7QUFFNUQsTUFBTSxhQUFhLEdBQUcsZUFBWSxDQUFDLGFBQWEsQ0FBQztBQUVqRCxrQkFBa0I7QUFDbEIsTUFBYSxVQUFXLFNBQVEsc0JBQXNCO0lBSXBELFlBQVksS0FBZ0IsRUFBRSxRQUFtQixFQUFFLE1BQWdCO1FBQ2pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBSmpDLDZLQUE2SztRQUNySyxzQkFBaUIsR0FBNEIsU0FBUyxDQUFDO1FBSTdELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRU8sS0FBSyxDQUFDLGlCQUFpQixDQUFDLEtBQUs7UUFDbkMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sZ0NBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELEtBQUssQ0FBQyxvQkFBb0I7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMzQixnQ0FBZ0M7WUFDaEMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQzthQUNsRDtTQUNGO1FBRUQsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLDhCQUE4QixDQUFDLGNBQXNCO1FBQzFELElBQUksY0FBYyxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7U0FDOUY7UUFDRCxNQUFNLGVBQWUsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwRCxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRUQsS0FBSyxDQUFDLCtCQUErQixDQUNuQyxLQUFhLEVBQ2IsY0FBc0IsRUFDdEIsWUFBc0IsRUFDdEIsYUFBdUIsRUFDdkIsVUFBcUMsRUFDckMsNEJBQWlDOztRQUVqQyxNQUFNLDBCQUEwQixHQUFHLE1BQU0sYUFBYSxDQUNwRCxZQUFZLEVBQ1osQ0FBQyxFQUNELDRCQUE0QixDQUFDLEtBQUssRUFBRSxFQUNwQyxVQUFVLENBQ1gsQ0FBQztRQUNGLE1BQU0scUJBQXFCLEdBQUcsTUFBQSxhQUFhLENBQUMsU0FBUywwQ0FBRSxJQUFJLENBQ3pELENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxRQUFRLENBQUMsRUFBRSxLQUFLLFFBQVEsQ0FDcEUsQ0FBQztRQUNGLE1BQU0sZUFBZSxHQUFHLGVBQU0sQ0FBQyxNQUFNLENBQUM7WUFDcEMsZUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7WUFDN0MsZUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUM7U0FDdEQsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQixnQkFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDOUIsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSzthQUNqQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEtBQUssRUFBRSxDQUFDLENBQUM7YUFDbEQsSUFBSSxDQUFDO1lBQ0osY0FBYztZQUNkLFNBQVMsRUFBRTtnQkFDVDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixFQUFFLEVBQUUsUUFBUTtvQkFDWixXQUFXLEVBQUUsZUFBZTtvQkFDNUIsWUFBWSxFQUFFLDBCQUEwQixDQUFDLHFCQUFxQjtvQkFDOUQsaUJBQWlCLEVBQUUsMEJBQTBCLENBQUMsaUJBQWlCO29CQUMvRCxRQUFRLEVBQUUsMEJBQTBCLENBQUMsUUFBUTtpQkFDOUM7Z0JBQ0QscUJBQXFCO2FBQ3RCO1NBQ0YsQ0FBQzthQUNELE1BQU0sRUFBRSxDQUFDO1FBQ1osSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUU7WUFDL0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1NBQ3BEO1FBQ0QsT0FBTztZQUNMLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRTtZQUNsQixTQUFTLEVBQUUsV0FBVyxDQUFDLFNBQVM7WUFDaEMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxjQUFjO1NBQzNDLENBQUM7SUFDSixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFLckI7O1FBQ0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxXQUFLLEVBQUUsQ0FBQztRQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFWixNQUFNLFlBQVksR0FBRyxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqRCxNQUFNLFVBQVUsR0FBRyxNQUFNLGlDQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLCtCQUErQixDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN2RixNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNHLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFdkUsa0VBQWtFO1FBQ2xFLG9FQUFvRTtRQUNwRSxNQUFNLGlCQUFpQixHQUNyQixNQUFBLENBQUMsTUFBTSxJQUFJLENBQUMsb0NBQW9DLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLG1DQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUVqRyxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztZQUNuRCxVQUFVO1lBQ1YsWUFBWTtZQUNaLGlCQUFpQjtZQUNqQixZQUFZO1lBQ1osY0FBYztZQUNkLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtZQUM3QixrQkFBa0I7U0FDbkIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFDbEQsVUFBVTtZQUNWLFlBQVk7WUFDWixpQkFBaUI7WUFDakIsWUFBWTtZQUNaLGNBQWM7WUFDZCxhQUFhO1lBQ2IsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO1lBQzdCLDhCQUE4QixFQUFFLE1BQU0sQ0FBQyw4QkFBOEI7WUFDckUsa0JBQWtCO1NBQ25CLENBQUMsQ0FBQztRQUNILE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1lBQ3RELFVBQVU7WUFDVixZQUFZO1lBQ1osaUJBQWlCO1lBQ2pCLFlBQVk7WUFDWixjQUFjO1lBQ2QsYUFBYTtZQUNiLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtZQUM3QixjQUFjLEVBQUUsTUFBTSxDQUFDLGNBQWM7U0FDdEMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLFlBQVksRUFBRSxjQUFjLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxtQkFBbUIsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7UUFFdkcsT0FBTztZQUNMLFlBQVk7WUFDWixjQUFjO1lBQ2QsYUFBYTtTQUNkLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLHFCQUFxQixDQUN6QixrQkFBa0IsR0FBRyxLQUFLLEVBQzFCLGFBQXdDLEVBQ3hDLFVBQThCO1FBRTlCLElBQUksY0FBOEIsQ0FBQztRQUNuQyxJQUFJLGtCQUFrQixFQUFFO1lBQ3RCLE1BQU0sd0JBQXdCLEdBQUcsTUFBTSxJQUFJLENBQUMsNkJBQTZCLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3JHLGNBQWMsR0FBRztnQkFDZixrQkFBa0IsRUFBRSx3QkFBd0I7YUFDN0MsQ0FBQztTQUNIO2FBQU07WUFDTCxNQUFNLEdBQUcsR0FBRyxJQUFJLFdBQUssRUFBRSxDQUFDO1lBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNaLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNaLGNBQWMsR0FBRztnQkFDZixnQkFBZ0IsRUFBRSxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDOUMsQ0FBQztTQUNIO1FBQ0QsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLEdBQUcsS0FBSztRQUNqRCxPQUFPLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxnQ0FBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlDQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzlGLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxFQUNqQixVQUFVLEVBQ1YsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osY0FBYyxFQUNkLGFBQWEsRUFDYixVQUFVLEVBQ1YsOEJBQThCLEVBQzlCLGtCQUFrQixHQUFHLEtBQUssR0FDQTs7UUFDMUIsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztTQUN2RDtRQUNELElBQUksa0JBQWtCLEtBQUksTUFBQSxjQUFjLENBQUMsa0JBQWtCLDBDQUFFLFNBQVMsQ0FBQSxFQUFFO1lBQ3RFLE9BQU8sSUFBSSxDQUFDLHNDQUFzQyxDQUNoRCxVQUFVLEVBQ1YsaUJBQWlCLEVBQ2pCLFlBQW1CLEVBQ25CLFlBQVksRUFDWixjQUFjLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUMzQyxhQUFhLEVBQ2IsVUFBVSxFQUNWLDhCQUE4QixDQUMvQixDQUFDO1NBQ0g7UUFDRCxnQkFBTSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUNuQyxVQUFVLEVBQ1YsWUFBeUMsRUFDekMsaUJBQWlCLEVBQ2pCLENBQUMsRUFDRCxZQUFZLEVBQ1osY0FBYyxDQUFDLGdCQUFnQixFQUMvQixhQUFhLEVBQ2IsVUFBVSxFQUNWLDhCQUE4QixDQUMvQixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxFQUN6QixVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixjQUFjLEVBQ2QsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsY0FBYyxHQUNZOztRQUMxQixJQUFJLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxjQUFjLENBQUMsS0FBSSxNQUFBLGNBQWMsQ0FBQyxrQkFBa0IsMENBQUUsU0FBUyxDQUFBLEVBQUU7WUFDeEcsZ0JBQU0sQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDckMsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLElBQUksQ0FBQywrQkFBK0IsQ0FDeEUsY0FBYyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsRUFDcEMsYUFBYSxDQUFDLGNBQWMsRUFDNUIsWUFBWSxFQUNaLGFBQWEsRUFDYixVQUFVLEVBQ1YsWUFBbUIsQ0FDcEIsQ0FBQztZQUNGLElBQUksdUJBQXVCLENBQUMsY0FBYyxLQUFLLGFBQWEsQ0FBQyxjQUFjLEVBQUU7Z0JBQzNFLE1BQU0sSUFBSSxLQUFLLENBQUMsaUVBQWlFLENBQUMsQ0FBQzthQUNwRjtZQUNELE1BQU0sZUFBZSxHQUF3QjtnQkFDM0MsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLE9BQU8sRUFBRSxLQUFLO2dCQUNkLGNBQWMsRUFBRSx1QkFBdUIsQ0FBQyxjQUFjO2dCQUN0RCxRQUFRLEVBQUUsY0FBYyxhQUFkLGNBQWMsY0FBZCxjQUFjLEdBQUksaUJBQWlCO2FBQzlDLENBQUM7WUFDRixNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3JGLGNBQWMsQ0FBQyxTQUFTLEdBQUcsdUJBQXVCLENBQUMsU0FBUyxDQUFDO1lBQzdELE9BQU8sY0FBYyxDQUFDO1NBQ3ZCO1FBQ0QsZ0JBQU0sQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN4QyxnQkFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUNuQyxVQUFVLEVBQ1YsWUFBeUMsRUFDekMsaUJBQWlCLEVBQ2pCLENBQUMsRUFDRCxZQUFZLEVBQ1osY0FBYyxDQUFDLGdCQUFnQixFQUMvQixhQUFhLEVBQ2IsVUFBVSxDQUNYLENBQUM7SUFDSixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxFQUN4QixVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixjQUFjLEVBQ2QsVUFBVSxFQUNWLGlCQUFpQixFQUNqQixrQkFBa0IsR0FBRyxLQUFLLEdBQ0s7UUFDL0IsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxhQUFhLENBQUMsWUFBWSxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUVsSCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUM1RCxjQUFjLEVBQ2QsY0FBYyxFQUNkLGlCQUFpQixDQUFDLEtBQUssRUFBRSxFQUN6QixZQUF5QyxFQUN6QyxrQkFBa0IsQ0FDbkIsQ0FBQztRQUVGLE1BQU0sb0JBQW9CLEdBQXVCO1lBQy9DLE9BQU8sRUFBRSxLQUFnQjtZQUN6QixNQUFNLEVBQUUsT0FBTztZQUNmLFNBQVMsRUFBRTtnQkFDVDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixFQUFFLEVBQUUsT0FBTztvQkFDWCxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsV0FBVztvQkFDekMsWUFBWSxFQUFFLGdCQUFnQixDQUFDLHFCQUFxQjtvQkFDcEQsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLENBQUM7b0JBQ3JCLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxRQUFRO29CQUNuQyxpQkFBaUIsRUFBRSxnQkFBZ0IsQ0FBQyxpQkFBaUI7aUJBQ3REO2dCQUNEO29CQUNFLElBQUksRUFBRSxRQUFRO29CQUNkLEVBQUUsRUFBRSxPQUFPO29CQUNYLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxXQUFXO29CQUMzQyxZQUFZLEVBQUUsa0JBQWtCLENBQUMscUJBQXFCO29CQUN0RCxDQUFDLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztvQkFDdkIsUUFBUSxFQUFFLGtCQUFrQixDQUFDLFFBQVE7b0JBQ3JDLGlCQUFpQixFQUFFLGtCQUFrQixDQUFDLGlCQUFpQjtpQkFDeEQ7YUFDRjtZQUNELGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxTQUFTO1lBQ3RDLGtCQUFrQixFQUFFLGtCQUFrQjtnQkFDcEMsQ0FBQyxDQUFFLFlBQW9CLENBQUMsS0FBSyxFQUFFO2dCQUMvQixDQUFDLENBQUUsWUFBMEMsQ0FBQyxTQUFTO1lBQ3pELFVBQVUsRUFBRSxVQUFVO1lBQ3RCLFFBQVEsRUFBRSxPQUFPO1NBQ2xCLENBQUM7UUFFRixPQUFPLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMsd0JBQXdCLENBQzVCLFdBQTJCLEVBQzNCLGNBQXNCLEVBQ3RCLHVCQUErQixFQUMvQixZQUF1QyxFQUN2QyxrQkFBa0IsR0FBRyxLQUFLO1FBRTFCLElBQUksc0JBQXVDLENBQUM7UUFDNUMsSUFBSSxrQkFBa0IsRUFBRTtZQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFO2dCQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7YUFDMUQ7WUFDRCxNQUFNLHlCQUF5QixHQUFHLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUM3RSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksUUFBUSxDQUFDLEVBQUUsS0FBSywrQkFBdUIsQ0FBQyxjQUFjLENBQUMsQ0FDcEcsQ0FBQztZQUNGLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtnQkFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsK0JBQXVCLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQzNGO1lBQ0QsOERBQThEO1lBQzlELHNCQUFzQixHQUFHLE1BQU0sa0NBQTBCLENBQUMseUJBQXlCLENBQUMsQ0FBQztTQUN0RjthQUFNO1lBQ0wsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNyQyxzQkFBc0IsR0FBRyxNQUFNLGFBQWEsQ0FDMUMsV0FBVyxDQUFDLGdCQUFnQixFQUM1QixjQUFjLEVBQ2QsdUJBQXVCLEVBQ3ZCLFlBQVksQ0FDYixDQUFDO1NBQ0g7UUFDRCxPQUFPLHNCQUFzQixDQUFDO0lBQ2hDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsc0NBQXNDLENBQzFDLFVBQTZDLEVBQzdDLGlCQUFzQixFQUN0Qiw0QkFBaUMsRUFDakMsWUFBc0IsRUFDdEIseUJBQXdDLEVBQ3hDLGFBQXVCLEVBQ3ZCLFVBQWtCLEVBQ2xCLDhCQUF1QztRQUV2QyxNQUFNLGNBQWMsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDO1FBQy9DLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1NBQzdDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUU7WUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7U0FDOUU7UUFFRCxNQUFNLGdCQUFnQixHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLFFBQVEsQ0FBQyxFQUFFLEtBQUssTUFBTSxDQUFDLENBQUM7UUFDaEgsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztTQUNwRDtRQUVELE1BQU0saUJBQWlCLEdBQUcseUJBQXlCLENBQUMsSUFBSSxDQUN0RCxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksUUFBUSxDQUFDLEVBQUUsS0FBSyxNQUFNLENBQ25FLENBQUM7UUFDRixJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1NBQ3JEO1FBRUQsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLGtDQUEwQixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDL0UsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLGtDQUEwQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDN0UsTUFBTSxnQkFBZ0IsR0FBd0I7WUFDNUM7Z0JBQ0UsTUFBTSxFQUFFLGtCQUFrQjtnQkFDMUIscUJBQXFCLEVBQUUsVUFBVSxDQUFDLFVBQVU7Z0JBQzVDLGlCQUFpQixFQUFFLDRCQUE0QixDQUFDLEtBQUssRUFBRTtnQkFDdkQsYUFBYSxFQUFFLEtBQUs7YUFDckI7WUFDRDtnQkFDRSxNQUFNLEVBQUUsaUJBQWlCO2dCQUN6QixxQkFBcUIsRUFBRSxVQUFVLENBQUMsVUFBVTtnQkFDNUMsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxFQUFFO2dCQUM1QyxhQUFhLEVBQUUsS0FBSzthQUNyQjtTQUNGLENBQUM7UUFFRixNQUFNLGVBQWUsR0FBRyxNQUFNLGVBQVksQ0FBQyxpQkFBaUIsQ0FDMUQsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixhQUFhLENBQUMsY0FBYyxDQUM3QixDQUFDO1FBQ0YsSUFBSSxlQUFlLENBQUMsY0FBYyxLQUFLLGFBQWEsQ0FBQyxjQUFjLEVBQUU7WUFDbkUsTUFBTSxJQUFJLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO1NBQ25GO1FBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDNUQsTUFBTSxrQkFBa0IsR0FBRztZQUN6QixNQUFNLEVBQUUsTUFBTTtZQUNkLE9BQU8sRUFBRSxLQUFnQjtZQUN6QixjQUFjLEVBQUUsZUFBZSxDQUFDLGNBQWM7WUFDOUMsR0FBRyxFQUFFLEdBQUc7WUFDUixZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7Z0JBQy9CLEtBQUssRUFBRSxHQUFHO2dCQUNWLFFBQVEsRUFBRSxVQUFVO2FBQ3JCLENBQUM7WUFDRiw4QkFBOEI7U0FDL0IsQ0FBQztRQUVGLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDNUMsT0FBTyxNQUFNLFNBQVMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLEtBQUssQ0FBQyx5QkFBeUIsQ0FDN0IsVUFBNkMsRUFDN0MscUJBQXdELEVBQ3hELGlCQUFzQixFQUN0QixjQUFzQixFQUN0QixZQUFzQixFQUN0QixjQUF3QixFQUN4QixhQUF1QixFQUN2QixVQUFrQixFQUNsQiw4QkFBdUM7UUFFdkMsTUFBTSxjQUFjLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQztRQUMvQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztTQUM3QztRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLGFBQWEsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1NBQzlFO1FBRUQsSUFBSSxTQUFpQixDQUFDO1FBQ3RCLElBQUksUUFBa0IsQ0FBQztRQUN2QixJQUFJLFVBQW9CLENBQUM7UUFDekIsSUFBSSxlQUFrRCxDQUFDO1FBQ3ZELElBQUksWUFBK0MsQ0FBQztRQUNwRCxJQUFJLGNBQWMsS0FBSyxDQUFDLEVBQUU7WUFDeEIsUUFBUSxHQUFHLFlBQVksQ0FBQztZQUN4QixVQUFVLEdBQUcsY0FBYyxDQUFDO1lBQzVCLFNBQVMsR0FBRyxNQUFNLENBQUM7WUFDbkIsZUFBZSxHQUFHLFVBQVUsQ0FBQztZQUM3QixZQUFZLEdBQUcscUJBQXFCLENBQUM7U0FDdEM7YUFBTSxJQUFJLGNBQWMsS0FBSyxDQUFDLEVBQUU7WUFDL0IsUUFBUSxHQUFHLGNBQWMsQ0FBQztZQUMxQixVQUFVLEdBQUcsWUFBWSxDQUFDO1lBQzFCLFNBQVMsR0FBRyxRQUFRLENBQUM7WUFDckIsZUFBZSxHQUFHLHFCQUFxQixDQUFDO1lBQ3hDLFlBQVksR0FBRyxVQUFVLENBQUM7U0FDM0I7YUFBTTtZQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztTQUN2QztRQUVELE1BQU0scUJBQXFCLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FDL0MsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLFFBQVEsQ0FBQyxFQUFFLEtBQUssU0FBUyxDQUNyRSxDQUFDO1FBQ0YsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLFNBQVMsWUFBWSxDQUFDLENBQUM7U0FDNUQ7UUFFRCxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFM0csTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQy9CLFVBQVUsQ0FBQyxTQUFTLEVBQ3BCLHFCQUFxQixDQUFDLFNBQVMsRUFDL0IsYUFBYSxFQUNiLGNBQWMsRUFDZCxjQUFjLENBQ2YsQ0FBQztRQUVGLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxhQUFhLENBQ2hELFVBQVUsRUFDVixjQUFjLEVBQ2QsZUFBZSxDQUFDLFNBQVMsRUFDekIsWUFBWSxDQUNiLENBQUM7UUFDRixNQUFNLGdCQUFnQixHQUF3QjtZQUM1QztnQkFDRSwrQkFBK0I7Z0JBQy9CLE1BQU0sRUFBRSxzQkFBc0I7Z0JBQzlCLHFCQUFxQixFQUFFLGVBQWUsQ0FBQyxVQUFVO2dCQUNqRCxpQkFBaUIsRUFBRSxZQUFZLENBQUMsU0FBUzthQUMxQztZQUNEO2dCQUNFLG1CQUFtQjtnQkFDbkIsTUFBTSxFQUFFO29CQUNOLENBQUMsRUFBRSxjQUFjO29CQUNqQixDQUFDLEVBQUUsQ0FBQztvQkFDSixXQUFXLEVBQUUscUJBQXFCLENBQUMsV0FBVztvQkFDOUMscUJBQXFCLEVBQUUscUJBQXFCLENBQUMsWUFBWTtvQkFDekQsQ0FBQyxFQUFFLHFCQUFxQixDQUFDLENBQUU7b0JBQzNCLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxRQUFRO29CQUN4QyxpQkFBaUIsRUFBRSxxQkFBcUIsQ0FBQyxpQkFBaUI7aUJBQzNEO2dCQUNELHFCQUFxQixFQUFFLGVBQWUsQ0FBQyxVQUFVO2dCQUNqRCxpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUU7Z0JBQzVDLGFBQWEsRUFBRSxLQUFLO2FBQ3JCO1NBQ0YsQ0FBQztRQUVGLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxlQUFZLENBQUMsaUJBQWlCLENBQy9ELFFBQVEsRUFDUixnQkFBZ0IsRUFDaEIsYUFBYSxDQUFDLGNBQWMsQ0FDN0IsQ0FBQztRQUVGLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakUsTUFBTSx1QkFBdUIsR0FBRztZQUM5QixNQUFNLEVBQUUsU0FBUztZQUNqQixPQUFPLEVBQUUsS0FBZ0I7WUFDekIsY0FBYyxFQUFFLGFBQWEsQ0FBQyxjQUFjO1lBQzVDLEdBQUcsRUFBRSxHQUFHO1lBQ1IsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO2dCQUMvQixLQUFLLEVBQUUsR0FBRztnQkFDVixRQUFRLEVBQUUsVUFBVTthQUNyQixDQUFDO1lBQ0YsOEJBQThCO1NBQy9CLENBQUM7UUFFRixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzVDLE9BQU8sY0FBYyxLQUFLLENBQUM7WUFDekIsQ0FBQyxDQUFDLE1BQU0sU0FBUyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQztZQUM5QyxDQUFDLENBQUMsTUFBTSxTQUFTLENBQUMsWUFBWSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBdUMsRUFBRSxXQUF3QjtRQUM3RixJQUFJLGlCQUE0QixDQUFDO1FBQ2pDLElBQUksV0FBbUIsQ0FBQztRQUV4QixNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUVsQyxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsRUFBRTtZQUNqQyxpQkFBaUIsR0FBRyxNQUFNLGtCQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ2hGLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQyxXQUFXLENBQUM7U0FDN0M7YUFBTTtZQUNMLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztZQUM5QixXQUFXLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQztTQUNyQztRQUVELE1BQU0sbUJBQW1CLEdBQXFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUUsSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDckM7UUFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFO1lBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztTQUM1RDtRQUVELElBQUksZUFBZSxDQUFDO1FBQ3BCLElBQUksY0FBYyxDQUFDO1FBRW5CLElBQUksV0FBVyxLQUFLLHVCQUFXLENBQUMsRUFBRSxFQUFFO1lBQ2xDLGdCQUFNLENBQ0osaUJBQWlCLENBQUMsWUFBWSxJQUFJLGlCQUFpQixDQUFDLFdBQVcsRUFDL0QsMENBQTBDLENBQzNDLENBQUM7WUFDRixNQUFNLFVBQVUsR0FDZCxpQkFBaUIsQ0FBQyxVQUFVLEtBQUssTUFBTTtnQkFDckMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFlBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVO2dCQUMvQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLGVBQWUsR0FBRyxlQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDN0QsY0FBYyxHQUFHLGlCQUFpQixDQUFDLFlBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDO1NBQy9FO2FBQU0sSUFBSSxXQUFXLEtBQUssdUJBQVcsQ0FBQyxPQUFPLEVBQUU7WUFDOUMsZUFBZSxHQUFJLE1BQThCLENBQUMsWUFBWSxDQUFDO1lBQy9ELHFEQUFxRDtZQUNyRCxjQUFjLEdBQUcsRUFBRSxDQUFDO1NBQ3JCO1FBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxXQUFLLEVBQUUsQ0FBQztRQUN4QixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUM5QixtQkFBbUIsQ0FBQyxNQUFNLEVBQzFCLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxFQUNuRSxjQUFjLENBQ2YsQ0FBQztRQUVGLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNyQixNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDcEIsTUFBTSxNQUFNLEdBQUc7WUFDYixDQUFDLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0IsQ0FBQyxFQUFFLFVBQVU7WUFDYixDQUFDLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1NBQ3BDLENBQUM7UUFFRixNQUFNLENBQUMsdUJBQXVCLEVBQUUsY0FBYyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ2xFLEdBQUcsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7WUFDOUMsOEJBQXFCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQztTQUM1RixDQUFDLENBQUM7UUFFSCxNQUFNLGFBQWEsR0FBRyxNQUFNLGVBQVksQ0FBQyxtQkFBbUIsQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEVBQUU7WUFDM0YsQ0FBQyxFQUFFLFNBQVM7WUFDWixDQUFDLEVBQUUsVUFBVTtZQUNiLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNwQyxNQUFNLEVBQUUsY0FBYyxDQUFDLE1BQU07WUFDN0IsRUFBRSxFQUFFLGNBQWMsQ0FBQyxFQUFFO1lBQ3JCLEVBQUUsRUFBRSxjQUFjLENBQUMsRUFBRTtTQUN0QixDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUzQyxJQUFJLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO1FBQzFELE9BQU8sU0FBUyxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUU7WUFDNUIsU0FBUyxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUM7U0FDN0I7UUFDRCxNQUFNLFdBQVcsR0FBRyxnQkFBSyxDQUFDLGNBQWMsQ0FBQyxlQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxlQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFHLE1BQU0sV0FBVyxHQUFHLE1BQU0sZ0NBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hELE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDbEQsT0FBTyxFQUFFLE1BQU0sT0FBTyxDQUFDLGFBQWEsQ0FBQztnQkFDbkMsSUFBSSxFQUFFLFdBQVc7YUFDbEIsQ0FBQztZQUNGLE1BQU0sRUFBRTtnQkFDTixZQUFZLEVBQUUsSUFBSSxHQUFHLEVBQUU7YUFDeEI7WUFDRCxjQUFjLEVBQUUsQ0FBQyxXQUFXLENBQUM7U0FDOUIsQ0FBQyxDQUFXLENBQUM7UUFDZCxNQUFNLFVBQVUsR0FBRyxNQUFNLGlDQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3pELE1BQU0saUJBQWlCLEdBQUcsTUFBTSwrQkFBZ0IsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ25ILE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUM5QyxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUVoRyxvRUFBb0U7UUFDcEUsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLE1BQU0sZUFBWSxDQUFDLGdCQUFnQixDQUM1RCxJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQ2hCLFdBQVcsRUFDWCxXQUFXLEVBQ1gscUJBQWEsQ0FBQyxNQUFNLEVBQ3BCLGFBQWEsQ0FBQyxNQUFNLEVBQ3BCLG9CQUFvQixFQUNwQixRQUFRLEVBQ1IsaUJBQWlCLEVBQ2pCLFdBQVcsRUFDWCxnQkFBZ0IsQ0FDakIsQ0FBeUMsQ0FBQyxDQUFDLCtDQUErQztRQUUzRiwyRUFBMkU7UUFDM0UsTUFBTSwyQkFBMkIsR0FBVztZQUMxQyxHQUFHLGlCQUFpQjtZQUNwQixHQUFHLGNBQWM7U0FDbEIsQ0FBQztRQUVGLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxlQUFZLENBQUMseUJBQXlCLENBQ3ZFLGFBQWEsQ0FBQyxNQUFNLEVBQ3BCLDJCQUEyQixDQUM1QixDQUFDO1FBQ0YsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLGVBQVksQ0FBQyw4QkFBOEIsQ0FDaEYsb0JBQW9CLENBQUMsTUFBc0IsQ0FDNUMsQ0FBQztRQUNGLE1BQU0sT0FBTyxHQUFHLG9CQUFvQixDQUFDLE9BQVEsQ0FBQztRQUM5QyxNQUFNLE1BQU0sR0FBRyx3QkFBd0IsQ0FBQyxNQUFNLENBQUM7UUFFL0MsK0VBQStFO1FBQy9FLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxNQUFNLGVBQVksQ0FBQyxnQkFBZ0IsQ0FDNUQsSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUNoQixXQUFXLEVBQ1gsV0FBVyxFQUNYLHFCQUFhLENBQUMsT0FBTyxFQUNyQixFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FDbEMsQ0FBVyxDQUFDO1FBRWIsTUFBTSxVQUFVLEdBQUcsTUFBTSxlQUFZLENBQUMsd0JBQXdCLENBQzVELHdCQUF3QixDQUFDLE1BQU0sRUFDL0IsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixNQUFNLENBQUMsSUFBSSxDQUNaLENBQUM7UUFFRixvRUFBb0U7UUFDcEUsTUFBTSxlQUFZLENBQUMsZ0JBQWdCLENBQ2pDLElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFDaEIsV0FBVyxFQUNYLFdBQVcsRUFDWCxxQkFBYSxDQUFDLE1BQU0sRUFDcEIsVUFBVSxDQUNYLENBQUM7UUFDRixPQUFPLE1BQU0sa0JBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBaUI7UUFDbkMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSx1QkFBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsdUJBQXVCLENBQUMsTUFBMkI7UUFDdkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1NBQ3pEO1FBQ0QsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSx1QkFBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLDRCQUE0QixDQUN2QyxLQUFnQixFQUNoQixRQUFnQixFQUNoQixZQUFvQjtRQUVwQixNQUFNLE1BQU0sR0FBRyxNQUFNLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsRSxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQztRQUN2RCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDO1FBRTdDLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUNqRCxNQUFNLHVCQUF1QixHQUFHLE1BQU0sS0FBSyxDQUFDLG9CQUFvQixDQUFDLFlBQVksRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3hHLE1BQU0sdUJBQXVCLEdBQUcsdUJBQXVCLENBQUMsYUFBYSxDQUFDO1FBRXRFLGtGQUFrRjtRQUNsRixNQUFNLHNCQUFzQixHQUFHO1lBQzdCLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxNQUFNO1lBQ2xDLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFO1lBQzFCLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFO1NBQzNCLENBQUM7UUFDRixNQUFNLDRCQUE0QixHQUFXLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUM7UUFDMUYsSUFDRSxDQUFDLDBCQUFtQixDQUNsQixJQUFJLENBQUMsNkJBQTZCLENBQUMsc0JBQXNCLENBQUMsRUFDMUQsNEJBQTRCLEVBQzVCLGVBQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLENBQzVDLEVBQ0Q7WUFDQSxNQUFNLElBQUksS0FBSyxDQUFDLDhGQUE4RixDQUFDLENBQUM7U0FDakg7UUFFRCw4RUFBOEU7UUFDOUUsTUFBTSxpQkFBaUIsR0FBRztZQUN4QixNQUFNLEVBQUUsY0FBYyxDQUFDLE1BQU07WUFDN0IsRUFBRSxFQUFFLGNBQWMsQ0FBQyxFQUFFO1lBQ3JCLEVBQUUsRUFBRSxjQUFjLENBQUMsRUFBRTtTQUN0QixDQUFDO1FBQ0YsTUFBTSwyQ0FBMkMsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQztRQUM1RixJQUNFLENBQUMsMEJBQW1CLENBQ2xCLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxpQkFBaUIsQ0FBQyxFQUNyRCwyQ0FBMkMsRUFDM0MsZUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsQ0FDNUMsRUFDRDtZQUNBLE1BQU0sSUFBSSxLQUFLLENBQUMsMkZBQTJGLENBQUMsQ0FBQztTQUM5RztRQUVELE9BQU87WUFDTCxtQkFBbUIsRUFBRSxzQkFBc0I7WUFDM0MsY0FBYyxFQUFFLGlCQUFpQjtTQUNsQyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsc0JBQXNCLENBQzFCLFVBQWtCLEVBQ2xCLFlBQW9CLEVBQ3BCLGFBQXVCLEVBQ3ZCLGNBQXNCLEVBQ3RCLGFBQW9CO1FBRXBCLGdCQUFNLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3JDLGdCQUFNLENBQUMsYUFBYSxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFFaEQsTUFBTSxXQUFXLEdBQUcsTUFBTSxnQ0FBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEQsTUFBTSxVQUFVLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDckUsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN4RCxNQUFNLFlBQVksR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUN6RSxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRTVELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsV0FBVyxFQUFFLGFBQWEsQ0FBQyx5QkFBeUIsRUFBRSxDQUFDLENBQUM7UUFDMUcsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztTQUM5QztRQUNELElBQUksU0FBUyxLQUFLLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsRUFBRTtZQUNoRSxNQUFNLElBQUksS0FBSyxDQUFDLHVGQUF1RixDQUFDLENBQUM7U0FDMUc7UUFDRCxJQUFJLFdBQVcsS0FBSyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLEVBQUU7WUFDbEUsTUFBTSxJQUFJLEtBQUssQ0FBQywwRkFBMEYsQ0FBQyxDQUFDO1NBQzdHO1FBRUQsTUFBTSw2QkFBcUIsQ0FBQztZQUMxQixlQUFlLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLGNBQWMsRUFBRSxhQUFhLENBQUMsY0FBYztZQUM1QyxTQUFTO1lBQ1QsV0FBVztZQUNYLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLGNBQWM7WUFDZCxhQUFhO1NBQ2QsQ0FBQyxDQUFDO1FBRUgsTUFBTSw2QkFBcUIsQ0FBQztZQUMxQixlQUFlLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLGNBQWMsRUFBRSxhQUFhLENBQUMsY0FBYztZQUM1QyxTQUFTO1lBQ1QsV0FBVztZQUNYLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLGNBQWM7WUFDZCxhQUFhO1NBQ2QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLGFBQWEsQ0FBQyxTQUFzQixFQUFFLFFBQWdCLEVBQUUsY0FBc0I7UUFDbkYsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BFLE9BQU8sb0NBQTZCLENBQUMsYUFBYSxFQUFFLFFBQVEsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLDZCQUE2QixDQUFDLFNBQXNCO1FBQ3pELE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsZUFBc0M7UUFDdkUsMkNBQTJDO1FBQzNDLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUM7WUFDNUQsTUFBTSxFQUFFLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNO1lBQ3BELEVBQUUsRUFBRSxlQUFlLENBQUMscUJBQXFCLENBQUMsRUFBRTtZQUM1QyxFQUFFLEVBQUUsZUFBZSxDQUFDLHFCQUFxQixDQUFDLEVBQUU7WUFDNUMsV0FBVyxFQUFFLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXO1NBQy9ELENBQUMsQ0FBQztRQUVILG1DQUFtQztRQUNuQyxNQUFNLHNCQUFzQixHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDO1lBQzdELE1BQU0sRUFBRSxlQUFlLENBQUMsYUFBYSxDQUFDLE1BQU07WUFDNUMsRUFBRSxFQUFFLGVBQWUsQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUNwQyxFQUFFLEVBQUUsZUFBZSxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQ3BDLFdBQVcsRUFBRSxlQUFlLENBQUMsYUFBYSxDQUFDLFdBQVc7U0FDdkQsQ0FBQyxDQUFDO1FBRUgsT0FBTyxxQkFBcUIsSUFBSSxzQkFBc0IsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxjQUEyQjtRQUMzRCxNQUFNLHlCQUF5QixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMseUJBQXlCLENBQUMsV0FBVyxFQUFFO1lBQzFDLE1BQU0sSUFBSSxLQUFLLENBQUMsMEVBQTBFLENBQUMsQ0FBQztTQUM3RjtRQUNELE1BQU0sMEJBQTBCLEdBQUcsTUFBTSw4QkFBaUIsQ0FDeEQ7WUFDRSxNQUFNLEVBQUUseUJBQXlCLENBQUMsTUFBTTtZQUN4QyxFQUFFLEVBQUUseUJBQXlCLENBQUMsRUFBRTtZQUNoQyxFQUFFLEVBQUUseUJBQXlCLENBQUMsRUFBRTtTQUNqQyxFQUNELHlCQUF5QixDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQzlDLENBQUM7UUFDRixNQUFNLDBCQUEwQixHQUFHLE1BQU0sOEJBQWlCLENBQ3hEO1lBQ0UsTUFBTSxFQUFFLHlCQUF5QixDQUFDLE1BQU07WUFDeEMsRUFBRSxFQUFFLHlCQUF5QixDQUFDLEVBQUU7WUFDaEMsRUFBRSxFQUFFLHlCQUF5QixDQUFDLEVBQUU7U0FDakMsRUFDRCx5QkFBeUIsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUM5QyxDQUFDO1FBQ0YsT0FBTywwQkFBMEIsSUFBSSwwQkFBMEIsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUFnQjtRQUM5QyxPQUFPLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLHVCQUF1QixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDaEYsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFNBQXNCO1FBQzdDLE1BQU0sa0JBQWtCLEdBQVc7WUFDakMsTUFBTSxFQUFFLHlCQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUNyQyxFQUFFLEVBQUUseUJBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzdCLEVBQUUsRUFBRSx5QkFBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7U0FDOUIsQ0FBQztRQUNGLElBQUksU0FBUyxDQUFDLFdBQVcsRUFBRTtZQUN6QixrQkFBa0IsQ0FBQyxXQUFXLEdBQUc7Z0JBQy9CLE9BQU8sRUFBRTtvQkFDUCxLQUFLLEVBQUUsc0NBQXdCLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO29CQUNwRSxDQUFDLEVBQUUsc0NBQXdCLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2lCQUM3RDtnQkFDRCxPQUFPLEVBQUU7b0JBQ1AsS0FBSyxFQUFFLHNDQUF3QixDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztvQkFDcEUsQ0FBQyxFQUFFLHNDQUF3QixDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztpQkFDN0Q7YUFDRixDQUFDO1NBQ0g7UUFDRCxPQUFPLGtCQUFrQixDQUFDO0lBQzVCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsZUFBZSxDQUFDLFNBQWlCO1FBQ3RDLE1BQU0sZ0JBQWdCLEdBQWdCO1lBQ3BDLE1BQU0sRUFBRSx5QkFBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDckMsRUFBRSxFQUFFLHlCQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUM3QixFQUFFLEVBQUUseUJBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1NBQzlCLENBQUM7UUFDRixJQUFJLFNBQVMsQ0FBQyxXQUFXLEVBQUU7WUFDekIsZ0JBQWdCLENBQUMsV0FBVyxHQUFHO2dCQUM3QixPQUFPLEVBQUU7b0JBQ1AsS0FBSyxFQUFFLHNDQUF3QixDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztvQkFDcEUsQ0FBQyxFQUFFLHNDQUF3QixDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztpQkFDN0Q7Z0JBQ0QsT0FBTyxFQUFFO29CQUNQLEtBQUssRUFBRSxzQ0FBd0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7b0JBQ3BFLENBQUMsRUFBRSxzQ0FBd0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7aUJBQzdEO2FBQ0YsQ0FBQztTQUNIO1FBQ0QsT0FBTyxnQkFBZ0IsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLCtCQUErQixDQUMxQyxLQUFnQixFQUNoQixZQUFvQixFQUNwQixZQUFvQjtRQUVwQixzRUFBc0U7UUFDdEUsTUFBTSxjQUFjLEdBQUcsTUFBTSxLQUFLLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxFQUFFO1lBQ2xFLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0ZBQWdGLENBQUMsQ0FBQztTQUNuRztRQUNELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxLQUFLLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNsRixJQUFJLElBQUksQ0FBQztRQUNULElBQUk7WUFDRixJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztnQkFDbkIsUUFBUSxFQUFFLFlBQVk7Z0JBQ3RCLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxhQUFhO2FBQ3RDLENBQUMsQ0FBQztTQUNKO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7U0FDMUQ7UUFFRCxxQ0FBcUM7UUFDckMsTUFBTSx5QkFBeUIsR0FBRyxNQUFNLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsQ0FBQyxNQUFNLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEVBQUU7WUFDeEUsTUFBTSxJQUFJLEtBQUssQ0FDYixxR0FBcUcsQ0FDdEcsQ0FBQztTQUNIO1FBQ0QsTUFBTSx3QkFBd0IsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUN2RCx5QkFBeUIsQ0FBQyxxQkFBcUIsRUFDL0MsSUFBSSxFQUNKLGNBQWMsQ0FBQyxjQUFjLENBQzlCLENBQUM7UUFDRixNQUFNLHlCQUF5QixHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQ3hELHlCQUF5QixDQUFDLGFBQWEsRUFDdkMsSUFBSSxFQUNKLGNBQWMsQ0FBQyxjQUFjLENBQzlCLENBQUM7UUFDRixPQUFPO1lBQ0wsMEJBQTBCLEVBQUUsd0JBQXdCO1lBQ3BELDJCQUEyQixFQUFFLHlCQUF5QjtTQUN2RCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLCtCQUErQixDQUMxQyxLQUFnQixFQUNoQixLQUFhLEVBQ2IsWUFBb0IsRUFDcEIsZ0NBQXdDLEVBQ3hDLGlDQUF5QyxFQUN6QyxTQUFrQjtRQUVsQixzRUFBc0U7UUFDdEUsTUFBTSxjQUFjLEdBQUcsTUFBTSxLQUFLLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxFQUFFO1lBQ2xFLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0ZBQWdGLENBQUMsQ0FBQztTQUNuRztRQUNELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxLQUFLLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNsRixJQUFJLElBQUksQ0FBQztRQUNULElBQUk7WUFDRixJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztnQkFDbkIsUUFBUSxFQUFFLFlBQVk7Z0JBQ3RCLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxhQUFhO2FBQ3RDLENBQUMsQ0FBQztTQUNKO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7U0FDMUQ7UUFFRCx5Q0FBeUM7UUFDekMsTUFBTSxxQkFBcUIsR0FBRyxTQUFTLGFBQVQsU0FBUyxjQUFULFNBQVMsR0FBSSxDQUFDLE1BQU0sMkJBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRXhFLE1BQU0seUJBQXlCLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FDeEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxFQUMzQyxJQUFJLEVBQ0osY0FBYyxDQUFDLGNBQWMsQ0FDOUIsQ0FBQztRQUVGLE1BQU0sSUFBSSxDQUFDLDRCQUE0QixDQUNyQyxLQUFLLEVBQ0wsS0FBSyxFQUNMLElBQUksQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsRUFDM0MseUJBQXlCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUN6QyxnQ0FBZ0MsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQ2hELGlDQUFpQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FDbEQsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLDRCQUE0QixDQUN2QyxLQUFnQixFQUNoQixLQUFhLEVBQ2Isc0JBQW1DLEVBQ25DLHFCQUE2QixFQUM3QiwwQkFBa0MsRUFDbEMsNEJBQW9DO1FBRXBDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUU7WUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvRkFBb0YsQ0FBQyxDQUFDO1NBQ3ZHO1FBQ0QsTUFBTSxJQUFJLEdBQUc7WUFDWCxVQUFVLEVBQUU7Z0JBQ1YsTUFBTSxFQUFFLHNCQUFzQixDQUFDLE1BQU07Z0JBQ3JDLEVBQUUsRUFBRSxzQkFBc0IsQ0FBQyxFQUFFO2dCQUM3QixFQUFFLEVBQUUsc0JBQXNCLENBQUMsRUFBRTtnQkFDN0IsV0FBVyxFQUFFO29CQUNYLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsT0FBTztvQkFDbkQsT0FBTyxFQUFFLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxPQUFPO2lCQUNwRDtnQkFDRCxTQUFTLEVBQUU7b0JBQ1QsY0FBYyxFQUFFLHFCQUFxQjtpQkFDdEM7YUFDRjtZQUNELHFCQUFxQixFQUFFO2dCQUNyQixTQUFTLEVBQUU7b0JBQ1QsY0FBYyxFQUFFLDBCQUEwQjtpQkFDM0M7YUFDRjtZQUNELGFBQWEsRUFBRTtnQkFDYixTQUFTLEVBQUU7b0JBQ1QsY0FBYyxFQUFFLDRCQUE0QjtpQkFDN0M7YUFDRjtTQUNGLENBQUM7UUFDRixNQUFNLEtBQUs7YUFDUixHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEtBQUssNEJBQTRCLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDbkUsSUFBSSxDQUFDLElBQUksQ0FBQzthQUNWLE1BQU0sRUFBRSxDQUFDO0lBQ2QsQ0FBQztDQUNGO0FBcm5DRCxnQ0FxbkNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRUNEU0EsIEVjZHNhIH0gZnJvbSAnLi4vLi4vLi4vLi4vYWNjb3VudC1saWIvbXBjL3Rzcyc7XG5pbXBvcnQgKiBhcyBvcGVucGdwIGZyb20gJ29wZW5wZ3AnO1xuaW1wb3J0IHsgS2V5LCBTZXJpYWxpemVkS2V5UGFpciB9IGZyb20gJ29wZW5wZ3AnO1xuaW1wb3J0IHsgQWRkS2V5Y2hhaW5PcHRpb25zLCBBcGlLZXlTaGFyZSwgQ3JlYXRlQmFja3VwT3B0aW9ucywgS2V5Y2hhaW4sIEtleVR5cGUgfSBmcm9tICcuLi8uLi8uLi9rZXljaGFpbic7XG5pbXBvcnQgRUNEU0FNZXRob2RzLCB7IEVDRFNBTWV0aG9kVHlwZXMgfSBmcm9tICcuLi8uLi8uLi90c3MvZWNkc2EnO1xuaW1wb3J0IHsgSUJhc2VDb2luLCBLZXljaGFpbnNUcmlwbGV0IH0gZnJvbSAnLi4vLi4vLi4vYmFzZUNvaW4nO1xuaW1wb3J0IGJhc2VUU1NVdGlscyBmcm9tICcuLi9iYXNlVFNTVXRpbHMnO1xuaW1wb3J0IHtcbiAgQXBpQ2hhbGxlbmdlcyxcbiAgQml0R29Qcm9vZlNpZ25hdHVyZXMsXG4gIENyZWF0ZUVjZHNhQml0R29LZXljaGFpblBhcmFtcyxcbiAgQ3JlYXRlRWNkc2FLZXljaGFpblBhcmFtcyxcbiAgRGVjcnlwdGFibGVOU2hhcmUsXG4gIEdldEJpdEdvQ2hhbGxlbmdlc0FwaSxcbiAgS2V5U2hhcmUsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgQmFja3VwR3BnS2V5LFxuICBCYWNrdXBLZXlTaGFyZSxcbiAgQml0Z29IZWxkQmFja3VwS2V5U2hhcmUsXG4gIFJlcXVlc3RUeXBlLFxuICBUU1NQYXJhbXMsXG4gIFRTU1BhcmFtc0Zvck1lc3NhZ2UsXG4gIFR4UmVxdWVzdCxcbn0gZnJvbSAnLi4vYmFzZVR5cGVzJztcbmltcG9ydCB7IGdldFR4UmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL3Rzcyc7XG5pbXBvcnQgeyBBU2hhcmUsIERTaGFyZSwgRW5jcnlwdGVkTlNoYXJlLCBTZW5kU2hhcmVUeXBlIH0gZnJvbSAnLi4vLi4vLi4vdHNzL2VjZHNhL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZVNoYXJlUHJvb2YsIGdlbmVyYXRlR1BHS2V5UGFpciwgZ2V0Qml0Z29HcGdQdWJLZXksIGdldFRydXN0R3BnUHViS2V5IH0gZnJvbSAnLi4vLi4vb3BlbmdwZ1V0aWxzJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uLy4uLy4uL2JpdGdvQmFzZSc7XG5pbXBvcnQgeyBCYWNrdXBQcm92aWRlciwgSVdhbGxldCB9IGZyb20gJy4uLy4uLy4uL3dhbGxldCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyBidWlsZE5TaGFyZUZyb21BUElLZXlTaGFyZSwgZ2V0UGFydGljaXBhbnRGcm9tSW5kZXgsIHZlcmlmeVdhbGxldFNpZ25hdHVyZSB9IGZyb20gJy4uLy4uLy4uL3Rzcy9lY2RzYS9lY2RzYSc7XG5pbXBvcnQgeyBOVGlsZGUsIE5UaWxkZVNoYXJlIH0gZnJvbSAnLi4vLi4vLi4vLi4vYWNjb3VudC1saWIvbXBjL3Rzcy9lY2RzYS90eXBlcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU5UaWxkZSwgdmVyaWZ5TnRpbGRlUHJvb2YgfSBmcm9tICcuLi8uLi8uLi8uLi9hY2NvdW50LWxpYi9tcGMvdHNzL2VjZHNhL3JhbmdlcHJvb2YnO1xuaW1wb3J0IHsgc2lnbk1lc3NhZ2VXaXRoRGVyaXZlZEVjZGhLZXksIHZlcmlmeUVjZGhTaWduYXR1cmUgfSBmcm9tICcuLi8uLi8uLi9lY2RoJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgeyBiaWdJbnRUb0hleCwgY29udmVydEJpZ0ludEFyclRvSGV4QXJyLCBjb252ZXJ0SGV4QXJyVG9CaWdJbnRBcnIsIGhleFRvQmlnSW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vYWNjb3VudC1saWInO1xuaW1wb3J0IHsgZ2V0VHhSZXF1ZXN0Q2hhbGxlbmdlIH0gZnJvbSAnLi4vLi4vLi4vdHNzL2NvbW1vbic7XG5cbmNvbnN0IGVuY3J5cHROU2hhcmUgPSBFQ0RTQU1ldGhvZHMuZW5jcnlwdE5TaGFyZTtcblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgY2xhc3MgRWNkc2FVdGlscyBleHRlbmRzIGJhc2VUU1NVdGlsczxLZXlTaGFyZT4ge1xuICAvLyBXZSBkbyBub3QgaGF2ZSBmdWxsIHN1cHBvcnQgZm9yIDMtcGFydHkgdmVyaWZpY2F0aW9uICh3LyBleHRlcm5hbCBzb3VyY2UpIG9mIGtleSBzaGFyZXMgYW5kIHNpZ25hdHVyZSBzaGFyZXMuIFRoZXJlIGlzIG5vIDNyZCBwYXJ0eSBrZXkgc2VydmljZSBzdXBwb3J0IHdpdGggdGhpcyByZWxlYXNlLlxuICBwcml2YXRlIGJpdGdvUHVibGljR3BnS2V5OiBvcGVucGdwLktleSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBiYXNlQ29pbjogSUJhc2VDb2luLCB3YWxsZXQ/OiBJV2FsbGV0KSB7XG4gICAgc3VwZXIoYml0Z28sIGJhc2VDb2luLCB3YWxsZXQpO1xuICAgIHRoaXMuc2V0Qml0Z29HcGdQdWJLZXkoYml0Z28pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXRCaXRnb0dwZ1B1YktleShiaXRnbykge1xuICAgIHRoaXMuYml0Z29QdWJsaWNHcGdLZXkgPSBhd2FpdCBnZXRCaXRnb0dwZ1B1YktleShiaXRnbyk7XG4gIH1cblxuICBhc3luYyBnZXRCaXRnb1B1YmxpY0dwZ0tleSgpOiBQcm9taXNlPG9wZW5wZ3AuS2V5PiB7XG4gICAgaWYgKCF0aGlzLmJpdGdvUHVibGljR3BnS2V5KSB7XG4gICAgICAvLyByZXRyeSBnZXR0aW5nIGJpdGdvJ3MgZ3BnIGtleVxuICAgICAgYXdhaXQgdGhpcy5zZXRCaXRnb0dwZ1B1YktleSh0aGlzLmJpdGdvKTtcbiAgICAgIGlmICghdGhpcy5iaXRnb1B1YmxpY0dwZ0tleSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZ2V0IEJpdGdvJ3MgZ3BnIGtleVwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5iaXRnb1B1YmxpY0dwZ0tleTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjb21tb24gcHVibGljIGtleSBmcm9tIGNvbW1vbktleWNoYWluLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY29tbW9uS2V5Y2hhaW4gY29tbW9uIGtleSBjaGFpbiBiZXR3ZWVuIG4gcGFydGllc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBlbmNvZGVkIHB1YmxpYyBrZXlcbiAgICovXG4gIHN0YXRpYyBnZXRQdWJsaWNLZXlGcm9tQ29tbW9uS2V5Y2hhaW4oY29tbW9uS2V5Y2hhaW46IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGNvbW1vbktleWNoYWluLmxlbmd0aCAhPT0gMTMwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29tbW9uS2V5Y2hhaW4gbGVuZ3RoLCBleHBlY3RlZCAxMzAsIGdvdCAke2NvbW1vbktleWNoYWluLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgY29uc3QgY29tbW9uUHViSGV4U3RyID0gY29tbW9uS2V5Y2hhaW4uc2xpY2UoMCwgNjYpO1xuICAgIHJldHVybiBjb21tb25QdWJIZXhTdHI7XG4gIH1cblxuICBhc3luYyBmaW5hbGl6ZUJpdGdvSGVsZEJhY2t1cEtleVNoYXJlKFxuICAgIGtleUlkOiBzdHJpbmcsXG4gICAgY29tbW9uS2V5Y2hhaW46IHN0cmluZyxcbiAgICB1c2VyS2V5U2hhcmU6IEtleVNoYXJlLFxuICAgIGJpdGdvS2V5Y2hhaW46IEtleWNoYWluLFxuICAgIHVzZXJHcGdLZXk6IFNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gICAgdGhpcmRQYXJ0eUJhY2t1cFB1YmxpY0dwZ0tleTogS2V5XG4gICk6IFByb21pc2U8Qml0Z29IZWxkQmFja3VwS2V5U2hhcmU+IHtcbiAgICBjb25zdCBlbmNyeXB0ZWRVc2VyVG9CYWNrdXBTaGFyZSA9IGF3YWl0IGVuY3J5cHROU2hhcmUoXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICAyLFxuICAgICAgdGhpcmRQYXJ0eUJhY2t1cFB1YmxpY0dwZ0tleS5hcm1vcigpLFxuICAgICAgdXNlckdwZ0tleVxuICAgICk7XG4gICAgY29uc3QgYml0Z29Ub0JhY2t1cEtleVNoYXJlID0gYml0Z29LZXljaGFpbi5rZXlTaGFyZXM/LmZpbmQoXG4gICAgICAoa2V5U2hhcmUpID0+IGtleVNoYXJlLmZyb20gPT09ICdiaXRnbycgJiYga2V5U2hhcmUudG8gPT09ICdiYWNrdXAnXG4gICAgKTtcbiAgICBjb25zdCB1c2VyUHVibGljU2hhcmUgPSBCdWZmZXIuY29uY2F0KFtcbiAgICAgIEJ1ZmZlci5mcm9tKHVzZXJLZXlTaGFyZS5uU2hhcmVzWzJdLnksICdoZXgnKSxcbiAgICAgIEJ1ZmZlci5mcm9tKHVzZXJLZXlTaGFyZS5uU2hhcmVzWzJdLmNoYWluY29kZSwgJ2hleCcpLFxuICAgIF0pLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBhc3NlcnQoYml0Z29Ub0JhY2t1cEtleVNoYXJlKTtcbiAgICBjb25zdCBrZXlSZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wdXQodGhpcy5iYXNlQ29pbi51cmwoYC9rcnMvYmFja3Vwa2V5cy8ke2tleUlkfWApKVxuICAgICAgLnNlbmQoe1xuICAgICAgICBjb21tb25LZXljaGFpbixcbiAgICAgICAga2V5U2hhcmVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgZnJvbTogJ3VzZXInLFxuICAgICAgICAgICAgdG86ICdiYWNrdXAnLFxuICAgICAgICAgICAgcHVibGljU2hhcmU6IHVzZXJQdWJsaWNTaGFyZSxcbiAgICAgICAgICAgIHByaXZhdGVTaGFyZTogZW5jcnlwdGVkVXNlclRvQmFja3VwU2hhcmUuZW5jcnlwdGVkUHJpdmF0ZVNoYXJlLFxuICAgICAgICAgICAgcHJpdmF0ZVNoYXJlUHJvb2Y6IGVuY3J5cHRlZFVzZXJUb0JhY2t1cFNoYXJlLnByaXZhdGVTaGFyZVByb29mLFxuICAgICAgICAgICAgdnNzUHJvb2Y6IGVuY3J5cHRlZFVzZXJUb0JhY2t1cFNoYXJlLnZzc1Byb29mLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYml0Z29Ub0JhY2t1cEtleVNoYXJlLFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgICBpZiAoIWtleVJlc3BvbnNlIHx8ICFrZXlSZXNwb25zZS5jb21tb25LZXljaGFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgYmFja3VwIGtleSB2ZXJpZmljYXRpb24uJyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBpZDoga2V5UmVzcG9uc2UuaWQsXG4gICAgICBrZXlTaGFyZXM6IGtleVJlc3BvbnNlLmtleVNoYXJlcyxcbiAgICAgIGNvbW1vbktleWNoYWluOiBrZXlSZXNwb25zZS5jb21tb25LZXljaGFpbixcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGFzeW5jIGNyZWF0ZUtleWNoYWlucyhwYXJhbXM6IHtcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmc7XG4gICAgZW50ZXJwcmlzZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgYmFja3VwUHJvdmlkZXI/OiBCYWNrdXBQcm92aWRlcjtcbiAgfSk6IFByb21pc2U8S2V5Y2hhaW5zVHJpcGxldD4ge1xuICAgIGNvbnN0IE1QQyA9IG5ldyBFY2RzYSgpO1xuICAgIGNvbnN0IG0gPSAyO1xuICAgIGNvbnN0IG4gPSAzO1xuXG4gICAgY29uc3QgdXNlcktleVNoYXJlID0gYXdhaXQgTVBDLmtleVNoYXJlKDEsIG0sIG4pO1xuICAgIGNvbnN0IHVzZXJHcGdLZXkgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ3NlY3AyNTZrMScpO1xuICAgIGNvbnN0IGlzVGhpcmRQYXJ0eUJhY2t1cCA9IHRoaXMuaXNWYWxpZFRoaXJkUGFydHlCYWNrdXBQcm92aWRlcihwYXJhbXMuYmFja3VwUHJvdmlkZXIpO1xuICAgIGNvbnN0IGJhY2t1cEtleVNoYXJlID0gYXdhaXQgdGhpcy5jcmVhdGVCYWNrdXBLZXlTaGFyZXMoaXNUaGlyZFBhcnR5QmFja3VwLCB1c2VyR3BnS2V5LCBwYXJhbXMuZW50ZXJwcmlzZSk7XG4gICAgY29uc3QgYmFja3VwR3BnS2V5ID0gYXdhaXQgdGhpcy5nZXRCYWNrdXBHcGdQdWJLZXkoaXNUaGlyZFBhcnR5QmFja3VwKTtcblxuICAgIC8vIEdldCB0aGUgQml0R28gcHVibGljIGtleSBiYXNlZCBvbiB1c2VyL2VudGVycHJpc2UgZmVhdHVyZSBmbGFnc1xuICAgIC8vIElmIGl0IGRvZXNuJ3Qgd29yaywgdXNlIHRoZSBkZWZhdWx0IHB1YmxpYyBrZXkgZnJvbSB0aGUgY29uc3RhbnRzXG4gICAgY29uc3QgYml0Z29QdWJsaWNHcGdLZXkgPVxuICAgICAgKGF3YWl0IHRoaXMuZ2V0Qml0Z29HcGdQdWJrZXlCYXNlZE9uRmVhdHVyZUZsYWdzKHBhcmFtcy5lbnRlcnByaXNlKSkgPz8gdGhpcy5iaXRnb1B1YmxpY0dwZ0tleTtcblxuICAgIGNvbnN0IGJpdGdvS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmNyZWF0ZUJpdGdvS2V5Y2hhaW4oe1xuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJhY2t1cEdwZ0tleSxcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgYmFja3VwS2V5U2hhcmUsXG4gICAgICBlbnRlcnByaXNlOiBwYXJhbXMuZW50ZXJwcmlzZSxcbiAgICAgIGlzVGhpcmRQYXJ0eUJhY2t1cCxcbiAgICB9KTtcbiAgICBjb25zdCB1c2VyS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5jcmVhdGVVc2VyS2V5Y2hhaW4oe1xuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJhY2t1cEdwZ0tleSxcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgYmFja3VwS2V5U2hhcmUsXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgcGFzc3BocmFzZTogcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU6IHBhcmFtcy5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICBpc1RoaXJkUGFydHlCYWNrdXAsXG4gICAgfSk7XG4gICAgY29uc3QgYmFja3VwS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5jcmVhdGVCYWNrdXBLZXljaGFpbih7XG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYmFja3VwR3BnS2V5LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICBwYXNzcGhyYXNlOiBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgIGJhY2t1cFByb3ZpZGVyOiBwYXJhbXMuYmFja3VwUHJvdmlkZXIsXG4gICAgfSk7XG5cbiAgICBjb25zdCBbdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbl0gPSBhd2FpdCBQcm9taXNlLmFsbChbdXNlcktleWNoYWluUHJvbWlzZSwgYmFja3VwS2V5Y2hhaW5Qcm9taXNlXSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogSWYgYSB0aGlyZCBwYXJ0eSBiYWNrdXAgaXMgcmVxdWVzdGVkLCBpdCB3aWxsIGNyZWF0ZSBiYWNrdXAgc2hhcmVzIGZyb21cbiAgICogYSB0aGlyZCBwYXJ0eSAoQml0R28gYXMgb2Ygbm93KSwgb3RoZXJ3aXNlIHRoZSBrZXkgc2hhcmVzIHdpbGwgYmUgY2xpZW50IGdlbmVyYXRlZFxuICAgKi9cbiAgYXN5bmMgY3JlYXRlQmFja3VwS2V5U2hhcmVzKFxuICAgIGlzVGhpcmRQYXJ0eUJhY2t1cCA9IGZhbHNlLFxuICAgIHVzZXJHcGdQdWJLZXk6IFNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gICAgZW50ZXJwcmlzZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICk6IFByb21pc2U8QmFja3VwS2V5U2hhcmU+IHtcbiAgICBsZXQgYmFja3VwS2V5U2hhcmU6IEJhY2t1cEtleVNoYXJlO1xuICAgIGlmIChpc1RoaXJkUGFydHlCYWNrdXApIHtcbiAgICAgIGNvbnN0IGJpdGdvSGVsZEJhY2t1cEtleVNoYXJlcyA9IGF3YWl0IHRoaXMuY3JlYXRlQml0Z29IZWxkQmFja3VwS2V5U2hhcmUodXNlckdwZ1B1YktleSwgZW50ZXJwcmlzZSk7XG4gICAgICBiYWNrdXBLZXlTaGFyZSA9IHtcbiAgICAgICAgYml0R29IZWxkS2V5U2hhcmVzOiBiaXRnb0hlbGRCYWNrdXBLZXlTaGFyZXMsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBNUEMgPSBuZXcgRWNkc2EoKTtcbiAgICAgIGNvbnN0IG0gPSAyO1xuICAgICAgY29uc3QgbiA9IDM7XG4gICAgICBiYWNrdXBLZXlTaGFyZSA9IHtcbiAgICAgICAgdXNlckhlbGRLZXlTaGFyZTogYXdhaXQgTVBDLmtleVNoYXJlKDIsIG0sIG4pLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGJhY2t1cEtleVNoYXJlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYmFja3VwIHB1YiBncGcga2V5IHN0cmluZ1xuICAgKiBpZiBhIHRoaXJkIHBhcnR5IHByb3ZpZGVkIHRoZW4gZ2V0IGZyb20gdHJ1c3RcbiAgICogQHBhcmFtIGlzVGhpcmRQYXJ0eUJhY2t1cFxuICAgKi9cbiAgYXN5bmMgZ2V0QmFja3VwR3BnUHViS2V5KGlzVGhpcmRQYXJ0eUJhY2t1cCA9IGZhbHNlKTogUHJvbWlzZTxCYWNrdXBHcGdLZXk+IHtcbiAgICByZXR1cm4gaXNUaGlyZFBhcnR5QmFja3VwID8gZ2V0VHJ1c3RHcGdQdWJLZXkodGhpcy5iaXRnbykgOiBnZW5lcmF0ZUdQR0tleVBhaXIoJ3NlY3AyNTZrMScpO1xuICB9XG5cbiAgY3JlYXRlVXNlcktleWNoYWluKHtcbiAgICB1c2VyR3BnS2V5LFxuICAgIGJhY2t1cEdwZ0tleSxcbiAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICB1c2VyS2V5U2hhcmUsXG4gICAgYmFja3VwS2V5U2hhcmUsXG4gICAgYml0Z29LZXljaGFpbixcbiAgICBwYXNzcGhyYXNlLFxuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICBpc1RoaXJkUGFydHlCYWNrdXAgPSBmYWxzZSxcbiAgfTogQ3JlYXRlRWNkc2FLZXljaGFpblBhcmFtcyk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBpZiAoIXBhc3NwaHJhc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHByb3ZpZGUgYSB3YWxsZXQgcGFzc3BocmFzZScpO1xuICAgIH1cbiAgICBpZiAoaXNUaGlyZFBhcnR5QmFja3VwICYmIGJhY2t1cEtleVNoYXJlLmJpdEdvSGVsZEtleVNoYXJlcz8ua2V5U2hhcmVzKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVVc2VyS2V5Y2hhaW5Gcm9tVGhpcmRQYXJ0eUJhY2t1cChcbiAgICAgICAgdXNlckdwZ0tleSxcbiAgICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICAgIGJhY2t1cEdwZ0tleSBhcyBLZXksXG4gICAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgICAgYmFja3VwS2V5U2hhcmUuYml0R29IZWxkS2V5U2hhcmVzLmtleVNoYXJlcyxcbiAgICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgICAgcGFzc3BocmFzZSxcbiAgICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlXG4gICAgICApO1xuICAgIH1cbiAgICBhc3NlcnQoYmFja3VwS2V5U2hhcmUudXNlckhlbGRLZXlTaGFyZSk7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICBiYWNrdXBHcGdLZXkgYXMgU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgICAgMSxcbiAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgIGJhY2t1cEtleVNoYXJlLnVzZXJIZWxkS2V5U2hhcmUsXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgcGFzc3BocmFzZSxcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZVxuICAgICk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVCYWNrdXBLZXljaGFpbih7XG4gICAgdXNlckdwZ0tleSxcbiAgICB1c2VyS2V5U2hhcmUsXG4gICAgYmFja3VwR3BnS2V5LFxuICAgIGJhY2t1cEtleVNoYXJlLFxuICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgcGFzc3BocmFzZSxcbiAgICBiYWNrdXBQcm92aWRlcixcbiAgfTogQ3JlYXRlRWNkc2FLZXljaGFpblBhcmFtcyk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkVGhpcmRQYXJ0eUJhY2t1cFByb3ZpZGVyKGJhY2t1cFByb3ZpZGVyKSAmJiBiYWNrdXBLZXlTaGFyZS5iaXRHb0hlbGRLZXlTaGFyZXM/LmtleVNoYXJlcykge1xuICAgICAgYXNzZXJ0KGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pO1xuICAgICAgY29uc3QgZmluYWxpemVkQmFja3VwS2V5U2hhcmUgPSBhd2FpdCB0aGlzLmZpbmFsaXplQml0Z29IZWxkQmFja3VwS2V5U2hhcmUoXG4gICAgICAgIGJhY2t1cEtleVNoYXJlLmJpdEdvSGVsZEtleVNoYXJlcy5pZCxcbiAgICAgICAgYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbixcbiAgICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgICB1c2VyR3BnS2V5LFxuICAgICAgICBiYWNrdXBHcGdLZXkgYXMgS2V5XG4gICAgICApO1xuICAgICAgaWYgKGZpbmFsaXplZEJhY2t1cEtleVNoYXJlLmNvbW1vbktleWNoYWluICE9PSBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBiYWNrdXAga2V5Y2hhaW4gLSBjb21tb25LZXljaGFpbnMgZG8gbm90IG1hdGNoJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrdXBLZXlQYXJhbXM6IENyZWF0ZUJhY2t1cE9wdGlvbnMgPSB7XG4gICAgICAgIHNvdXJjZTogJ2JhY2t1cCcsXG4gICAgICAgIGtleVR5cGU6ICd0c3MnLFxuICAgICAgICBjb21tb25LZXljaGFpbjogZmluYWxpemVkQmFja3VwS2V5U2hhcmUuY29tbW9uS2V5Y2hhaW4sXG4gICAgICAgIHByb3ZpZGVyOiBiYWNrdXBQcm92aWRlciA/PyAnQml0R29UcnVzdEFzS3JzJyxcbiAgICAgIH07XG4gICAgICBjb25zdCBiYWNrdXBLZXljaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlQmFja3VwKGJhY2t1cEtleVBhcmFtcyk7XG4gICAgICBiYWNrdXBLZXljaGFpbi5rZXlTaGFyZXMgPSBmaW5hbGl6ZWRCYWNrdXBLZXlTaGFyZS5rZXlTaGFyZXM7XG4gICAgICByZXR1cm4gYmFja3VwS2V5Y2hhaW47XG4gICAgfVxuICAgIGFzc2VydChiYWNrdXBLZXlTaGFyZS51c2VySGVsZEtleVNoYXJlKTtcbiAgICBhc3NlcnQocGFzc3BocmFzZSk7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICBiYWNrdXBHcGdLZXkgYXMgU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgICAgMixcbiAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgIGJhY2t1cEtleVNoYXJlLnVzZXJIZWxkS2V5U2hhcmUsXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgcGFzc3BocmFzZVxuICAgICk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgYXN5bmMgY3JlYXRlQml0Z29LZXljaGFpbih7XG4gICAgdXNlckdwZ0tleSxcbiAgICBiYWNrdXBHcGdLZXksXG4gICAgdXNlcktleVNoYXJlLFxuICAgIGJhY2t1cEtleVNoYXJlLFxuICAgIGVudGVycHJpc2UsXG4gICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgaXNUaGlyZFBhcnR5QmFja3VwID0gZmFsc2UsXG4gIH06IENyZWF0ZUVjZHNhQml0R29LZXljaGFpblBhcmFtcyk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBjb25zdCByZWNpcGllbnRJbmRleCA9IDM7XG4gICAgY29uc3QgdXNlclRvQml0Z29TaGFyZSA9IGF3YWl0IGVuY3J5cHROU2hhcmUodXNlcktleVNoYXJlLCByZWNpcGllbnRJbmRleCwgYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKSwgdXNlckdwZ0tleSk7XG5cbiAgICBjb25zdCBiYWNrdXBUb0JpdGdvU2hhcmUgPSBhd2FpdCB0aGlzLmdldEJhY2t1cEVuY3J5cHRlZE5TaGFyZShcbiAgICAgIGJhY2t1cEtleVNoYXJlLFxuICAgICAgcmVjaXBpZW50SW5kZXgsXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleS5hcm1vcigpLFxuICAgICAgYmFja3VwR3BnS2V5IGFzIFNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gICAgICBpc1RoaXJkUGFydHlCYWNrdXBcbiAgICApO1xuXG4gICAgY29uc3QgY3JlYXRlQml0R29NUENQYXJhbXM6IEFkZEtleWNoYWluT3B0aW9ucyA9IHtcbiAgICAgIGtleVR5cGU6ICd0c3MnIGFzIEtleVR5cGUsXG4gICAgICBzb3VyY2U6ICdiaXRnbycsXG4gICAgICBrZXlTaGFyZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZyb206ICd1c2VyJyxcbiAgICAgICAgICB0bzogJ2JpdGdvJyxcbiAgICAgICAgICBwdWJsaWNTaGFyZTogdXNlclRvQml0Z29TaGFyZS5wdWJsaWNTaGFyZSxcbiAgICAgICAgICBwcml2YXRlU2hhcmU6IHVzZXJUb0JpdGdvU2hhcmUuZW5jcnlwdGVkUHJpdmF0ZVNoYXJlLFxuICAgICAgICAgIG46IHVzZXJUb0JpdGdvU2hhcmUubixcbiAgICAgICAgICB2c3NQcm9vZjogdXNlclRvQml0Z29TaGFyZS52c3NQcm9vZixcbiAgICAgICAgICBwcml2YXRlU2hhcmVQcm9vZjogdXNlclRvQml0Z29TaGFyZS5wcml2YXRlU2hhcmVQcm9vZixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGZyb206ICdiYWNrdXAnLFxuICAgICAgICAgIHRvOiAnYml0Z28nLFxuICAgICAgICAgIHB1YmxpY1NoYXJlOiBiYWNrdXBUb0JpdGdvU2hhcmUucHVibGljU2hhcmUsXG4gICAgICAgICAgcHJpdmF0ZVNoYXJlOiBiYWNrdXBUb0JpdGdvU2hhcmUuZW5jcnlwdGVkUHJpdmF0ZVNoYXJlLFxuICAgICAgICAgIG46IGJhY2t1cFRvQml0Z29TaGFyZS5uLFxuICAgICAgICAgIHZzc1Byb29mOiBiYWNrdXBUb0JpdGdvU2hhcmUudnNzUHJvb2YsXG4gICAgICAgICAgcHJpdmF0ZVNoYXJlUHJvb2Y6IGJhY2t1cFRvQml0Z29TaGFyZS5wcml2YXRlU2hhcmVQcm9vZixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICB1c2VyR1BHUHVibGljS2V5OiB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIGJhY2t1cEdQR1B1YmxpY0tleTogaXNUaGlyZFBhcnR5QmFja3VwXG4gICAgICAgID8gKGJhY2t1cEdwZ0tleSBhcyBLZXkpLmFybW9yKClcbiAgICAgICAgOiAoYmFja3VwR3BnS2V5IGFzIFNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4pLnB1YmxpY0tleSxcbiAgICAgIGVudGVycHJpc2U6IGVudGVycHJpc2UsXG4gICAgICBhbGdvVXNlZDogJ2VjZHNhJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuYWRkKGNyZWF0ZUJpdEdvTVBDUGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGJ1aWxkcyB0aGUgcmVsZXZhbnQgYmFja3VwIGVuY3J5cHRlZE5TaGFyZSBiYXNlZCBvbiB3aGV0aGVyIHRoZVxuICAgKiBiYWNrdXAga2V5IGlzIHVzZXIgb3IgdGhpcmQgcGFydHkgZ2VuZXJhdGVkXG4gICAqIEBwYXJhbSBiYWNrdXBTaGFyZSBjYW4gZWl0aGVyIGhhdmUga2V5IHNoYXJlcyBmcm9tIHRoZSB1c2VyIG9yIHRoaXJkIHBhcnR5XG4gICAqIEBwYXJhbSByZWNpcGllbnRJbmRleCBpbmRleCBvZiB0aGUgcGFydHkgcmVjZWl2aW5nIHRoZSBiYWNrdXAgc2hhcmVzXG4gICAqIEBwYXJhbSByZWNpcGllbnRHcGdQdWJsaWNBcm1vciBncGcgYXJtb3Igb2YgdGhlIHBhcnR5IHJlY2VpdmluZyB0aGUgYmFja3VwIHNoYXJlc1xuICAgKiBAcGFyYW0gYmFja3VwR3BnS2V5IGJhY2t1cCBncGcga2V5XG4gICAqIEBwYXJhbSBpc1RoaXJkUGFydHlCYWNrdXAgd2hldGhlciB0aGUgYmFja3VwIGlzIGdlbmVyYXRlZCBieSB0aGlyZCBwYXJ0eVxuICAgKi9cbiAgYXN5bmMgZ2V0QmFja3VwRW5jcnlwdGVkTlNoYXJlKFxuICAgIGJhY2t1cFNoYXJlOiBCYWNrdXBLZXlTaGFyZSxcbiAgICByZWNpcGllbnRJbmRleDogbnVtYmVyLFxuICAgIHJlY2lwaWVudEdwZ1B1YmxpY0FybW9yOiBzdHJpbmcsXG4gICAgYmFja3VwR3BnS2V5OiBTZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+LFxuICAgIGlzVGhpcmRQYXJ0eUJhY2t1cCA9IGZhbHNlXG4gICk6IFByb21pc2U8RW5jcnlwdGVkTlNoYXJlPiB7XG4gICAgbGV0IGJhY2t1cFRvUmVjaXBpZW50U2hhcmU6IEVuY3J5cHRlZE5TaGFyZTtcbiAgICBpZiAoaXNUaGlyZFBhcnR5QmFja3VwKSB7XG4gICAgICBpZiAoIWJhY2t1cFNoYXJlLmJpdEdvSGVsZEtleVNoYXJlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgdGhpcmQgcGFydHkgYmFja3VwIGtleSBzaGFyZXNgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhY2t1cFRvUmVjaXBpZW50QXBpU2hhcmUgPSBiYWNrdXBTaGFyZS5iaXRHb0hlbGRLZXlTaGFyZXMua2V5U2hhcmVzLmZpbmQoXG4gICAgICAgIChrZXlTaGFyZSkgPT4ga2V5U2hhcmUuZnJvbSA9PT0gJ2JhY2t1cCcgJiYga2V5U2hhcmUudG8gPT09IGdldFBhcnRpY2lwYW50RnJvbUluZGV4KHJlY2lwaWVudEluZGV4KVxuICAgICAgKTtcbiAgICAgIGlmICghYmFja3VwVG9SZWNpcGllbnRBcGlTaGFyZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgYmFja3VwIHRvICR7Z2V0UGFydGljaXBhbnRGcm9tSW5kZXgocmVjaXBpZW50SW5kZXgpfSBrZXkgc2hhcmVgKTtcbiAgICAgIH1cbiAgICAgIC8vIFNpbmNlIGJhY2t1cCBpcyBmcm9tIGEgdGhpcmQgcGFydHksIGl0IGlzIGFscmVhZHkgZW5jcnlwdGVkXG4gICAgICBiYWNrdXBUb1JlY2lwaWVudFNoYXJlID0gYXdhaXQgYnVpbGROU2hhcmVGcm9tQVBJS2V5U2hhcmUoYmFja3VwVG9SZWNpcGllbnRBcGlTaGFyZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChiYWNrdXBTaGFyZS51c2VySGVsZEtleVNoYXJlKTtcbiAgICAgIGJhY2t1cFRvUmVjaXBpZW50U2hhcmUgPSBhd2FpdCBlbmNyeXB0TlNoYXJlKFxuICAgICAgICBiYWNrdXBTaGFyZS51c2VySGVsZEtleVNoYXJlLFxuICAgICAgICByZWNpcGllbnRJbmRleCxcbiAgICAgICAgcmVjaXBpZW50R3BnUHVibGljQXJtb3IsXG4gICAgICAgIGJhY2t1cEdwZ0tleVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGJhY2t1cFRvUmVjaXBpZW50U2hhcmU7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyB1c2VzIHRoZSBiYWNrdXAga2V5IGZyb20gYSB0aGlyZCBwYXJ0eSAoYml0Z28gaW4gdGhpcyBjYXNlKVxuICAgKiB0byBjcmVhdGUgdGhlIHVzZXIga2V5Y2hhaW4gdmlhIFdQLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlVXNlcktleWNoYWluRnJvbVRoaXJkUGFydHlCYWNrdXAoXG4gICAgdXNlckdwZ0tleTogb3BlbnBncC5TZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+LFxuICAgIGJpdGdvUHVibGljR3BnS2V5OiBLZXksXG4gICAgdGhpcmRQYXJ0eUJhY2t1cFB1YmxpY0dwZ0tleTogS2V5LFxuICAgIHVzZXJLZXlTaGFyZTogS2V5U2hhcmUsXG4gICAgdGhpcmRQYXJ0eWJhY2t1cEtleVNoYXJlczogQXBpS2V5U2hhcmVbXSxcbiAgICBiaXRnb0tleWNoYWluOiBLZXljaGFpbixcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmcsXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nXG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBjb25zdCBiaXRnb0tleVNoYXJlcyA9IGJpdGdvS2V5Y2hhaW4ua2V5U2hhcmVzO1xuICAgIGlmICghYml0Z29LZXlTaGFyZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBCaXRHbyBrZXkgc2hhcmVzJyk7XG4gICAgfVxuICAgIGlmICghYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGNvbW1vbiBrZXkgY2hhaW46ICR7Yml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbn1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRHb1RvVXNlclNoYXJlID0gYml0Z29LZXlTaGFyZXMuZmluZCgoa2V5U2hhcmUpID0+IGtleVNoYXJlLmZyb20gPT09ICdiaXRnbycgJiYga2V5U2hhcmUudG8gPT09ICd1c2VyJyk7XG4gICAgaWYgKCFiaXRHb1RvVXNlclNoYXJlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgQml0R28gdG8gVXNlciBrZXkgc2hhcmUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBiYWNrdXBUb1VzZXJTaGFyZSA9IHRoaXJkUGFydHliYWNrdXBLZXlTaGFyZXMuZmluZChcbiAgICAgIChrZXlTaGFyZSkgPT4ga2V5U2hhcmUuZnJvbSA9PT0gJ2JhY2t1cCcgJiYga2V5U2hhcmUudG8gPT09ICd1c2VyJ1xuICAgICk7XG4gICAgaWYgKCFiYWNrdXBUb1VzZXJTaGFyZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIEJhY2t1cCB0byBVc2VyIGtleSBzaGFyZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGJhY2t1cFRvVXNlck5TaGFyZSA9IGF3YWl0IGJ1aWxkTlNoYXJlRnJvbUFQSUtleVNoYXJlKGJhY2t1cFRvVXNlclNoYXJlKTtcbiAgICBjb25zdCBiaXRHb1RvVXNlck5TaGFyZSA9IGF3YWl0IGJ1aWxkTlNoYXJlRnJvbUFQSUtleVNoYXJlKGJpdEdvVG9Vc2VyU2hhcmUpO1xuICAgIGNvbnN0IGVuY3J5cHRlZE5TaGFyZXM6IERlY3J5cHRhYmxlTlNoYXJlW10gPSBbXG4gICAgICB7XG4gICAgICAgIG5TaGFyZTogYmFja3VwVG9Vc2VyTlNoYXJlLFxuICAgICAgICByZWNpcGllbnRQcml2YXRlQXJtb3I6IHVzZXJHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgICAgc2VuZGVyUHVibGljQXJtb3I6IHRoaXJkUGFydHlCYWNrdXBQdWJsaWNHcGdLZXkuYXJtb3IoKSxcbiAgICAgICAgaXNiczU4RW5jb2RlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuU2hhcmU6IGJpdEdvVG9Vc2VyTlNoYXJlLFxuICAgICAgICByZWNpcGllbnRQcml2YXRlQXJtb3I6IHVzZXJHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgICAgc2VuZGVyUHVibGljQXJtb3I6IGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCksXG4gICAgICAgIGlzYnM1OEVuY29kZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgdXNlckNvbWJpbmVkS2V5ID0gYXdhaXQgRUNEU0FNZXRob2RzLmNyZWF0ZUNvbWJpbmVkS2V5KFxuICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgZW5jcnlwdGVkTlNoYXJlcyxcbiAgICAgIGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW5cbiAgICApO1xuICAgIGlmICh1c2VyQ29tYmluZWRLZXkuY29tbW9uS2V5Y2hhaW4gIT09IGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNyZWF0ZSB1c2VyIGtleWNoYWluIC0gY29tbW9uS2V5Y2hhaW5zIGRvIG5vdCBtYXRjaC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcnYgPSBKU09OLnN0cmluZ2lmeSh1c2VyQ29tYmluZWRLZXkuc2lnbmluZ01hdGVyaWFsKTtcbiAgICBjb25zdCB1c2VyS2V5Y2hhaW5QYXJhbXMgPSB7XG4gICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgIGtleVR5cGU6ICd0c3MnIGFzIEtleVR5cGUsXG4gICAgICBjb21tb25LZXljaGFpbjogdXNlckNvbWJpbmVkS2V5LmNvbW1vbktleWNoYWluLFxuICAgICAgcHJ2OiBwcnYsXG4gICAgICBlbmNyeXB0ZWRQcnY6IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgIGlucHV0OiBwcnYsXG4gICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgfSksXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgfTtcblxuICAgIGNvbnN0IGtleWNoYWlucyA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgcmV0dXJuIGF3YWl0IGtleWNoYWlucy5hZGQodXNlcktleWNoYWluUGFyYW1zKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBhc3luYyBjcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgIHVzZXJHcGdLZXk6IG9wZW5wZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICB1c2VyTG9jYWxCYWNrdXBHcGdLZXk6IG9wZW5wZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICBiaXRnb1B1YmxpY0dwZ0tleTogS2V5LFxuICAgIHJlY2lwaWVudEluZGV4OiBudW1iZXIsXG4gICAgdXNlcktleVNoYXJlOiBLZXlTaGFyZSxcbiAgICBiYWNrdXBLZXlTaGFyZTogS2V5U2hhcmUsXG4gICAgYml0Z29LZXljaGFpbjogS2V5Y2hhaW4sXG4gICAgcGFzc3BocmFzZTogc3RyaW5nLFxuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZ1xuICApOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgY29uc3QgYml0Z29LZXlTaGFyZXMgPSBiaXRnb0tleWNoYWluLmtleVNoYXJlcztcbiAgICBpZiAoIWJpdGdvS2V5U2hhcmVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgQml0R28ga2V5IHNoYXJlcycpO1xuICAgIH1cbiAgICBpZiAoIWJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBjb21tb24ga2V5IGNoYWluOiAke2JpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW59YCk7XG4gICAgfVxuXG4gICAgbGV0IHJlY2lwaWVudDogc3RyaW5nO1xuICAgIGxldCBrZXlTaGFyZTogS2V5U2hhcmU7XG4gICAgbGV0IG90aGVyU2hhcmU6IEtleVNoYXJlO1xuICAgIGxldCByZWNpcGllbnRHcGdLZXk6IG9wZW5wZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPjtcbiAgICBsZXQgc2VuZGVyR3BnS2V5OiBvcGVucGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz47XG4gICAgaWYgKHJlY2lwaWVudEluZGV4ID09PSAxKSB7XG4gICAgICBrZXlTaGFyZSA9IHVzZXJLZXlTaGFyZTtcbiAgICAgIG90aGVyU2hhcmUgPSBiYWNrdXBLZXlTaGFyZTtcbiAgICAgIHJlY2lwaWVudCA9ICd1c2VyJztcbiAgICAgIHJlY2lwaWVudEdwZ0tleSA9IHVzZXJHcGdLZXk7XG4gICAgICBzZW5kZXJHcGdLZXkgPSB1c2VyTG9jYWxCYWNrdXBHcGdLZXk7XG4gICAgfSBlbHNlIGlmIChyZWNpcGllbnRJbmRleCA9PT0gMikge1xuICAgICAga2V5U2hhcmUgPSBiYWNrdXBLZXlTaGFyZTtcbiAgICAgIG90aGVyU2hhcmUgPSB1c2VyS2V5U2hhcmU7XG4gICAgICByZWNpcGllbnQgPSAnYmFja3VwJztcbiAgICAgIHJlY2lwaWVudEdwZ0tleSA9IHVzZXJMb2NhbEJhY2t1cEdwZ0tleTtcbiAgICAgIHNlbmRlckdwZ0tleSA9IHVzZXJHcGdLZXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1c2VyIGluZGV4Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0R29Ub1JlY2lwaWVudFNoYXJlID0gYml0Z29LZXlTaGFyZXMuZmluZChcbiAgICAgIChrZXlTaGFyZSkgPT4ga2V5U2hhcmUuZnJvbSA9PT0gJ2JpdGdvJyAmJiBrZXlTaGFyZS50byA9PT0gcmVjaXBpZW50XG4gICAgKTtcbiAgICBpZiAoIWJpdEdvVG9SZWNpcGllbnRTaGFyZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIEJpdEdvIHRvICR7cmVjaXBpZW50fSBrZXkgc2hhcmVgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNyeXB0ZWRTaGFyZSA9IGF3YWl0IHRoaXMuZGVjcnlwdFByaXZhdGVTaGFyZShiaXRHb1RvUmVjaXBpZW50U2hhcmUucHJpdmF0ZVNoYXJlLCByZWNpcGllbnRHcGdLZXkpO1xuXG4gICAgYXdhaXQgdGhpcy52ZXJpZnlXYWxsZXRTaWduYXR1cmVzKFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB1c2VyTG9jYWxCYWNrdXBHcGdLZXkucHVibGljS2V5LFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIGRlY3J5cHRlZFNoYXJlLFxuICAgICAgcmVjaXBpZW50SW5kZXhcbiAgICApO1xuXG4gICAgY29uc3Qgc2VuZGVyVG9SZWNpcGllbnRTaGFyZSA9IGF3YWl0IGVuY3J5cHROU2hhcmUoXG4gICAgICBvdGhlclNoYXJlLFxuICAgICAgcmVjaXBpZW50SW5kZXgsXG4gICAgICByZWNpcGllbnRHcGdLZXkucHVibGljS2V5LFxuICAgICAgc2VuZGVyR3BnS2V5XG4gICAgKTtcbiAgICBjb25zdCBlbmNyeXB0ZWROU2hhcmVzOiBEZWNyeXB0YWJsZU5TaGFyZVtdID0gW1xuICAgICAge1xuICAgICAgICAvLyB1c2VyVG9CYWNrdXAgb3IgYmFja3VwVG9Vc2VyXG4gICAgICAgIG5TaGFyZTogc2VuZGVyVG9SZWNpcGllbnRTaGFyZSxcbiAgICAgICAgcmVjaXBpZW50UHJpdmF0ZUFybW9yOiByZWNpcGllbnRHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgICAgc2VuZGVyUHVibGljQXJtb3I6IHNlbmRlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAvLyBiaXRnb1RvUmVjaXBpZW50XG4gICAgICAgIG5TaGFyZToge1xuICAgICAgICAgIGk6IHJlY2lwaWVudEluZGV4LFxuICAgICAgICAgIGo6IDMsXG4gICAgICAgICAgcHVibGljU2hhcmU6IGJpdEdvVG9SZWNpcGllbnRTaGFyZS5wdWJsaWNTaGFyZSxcbiAgICAgICAgICBlbmNyeXB0ZWRQcml2YXRlU2hhcmU6IGJpdEdvVG9SZWNpcGllbnRTaGFyZS5wcml2YXRlU2hhcmUsXG4gICAgICAgICAgbjogYml0R29Ub1JlY2lwaWVudFNoYXJlLm4hLFxuICAgICAgICAgIHZzc1Byb29mOiBiaXRHb1RvUmVjaXBpZW50U2hhcmUudnNzUHJvb2YsXG4gICAgICAgICAgcHJpdmF0ZVNoYXJlUHJvb2Y6IGJpdEdvVG9SZWNpcGllbnRTaGFyZS5wcml2YXRlU2hhcmVQcm9vZixcbiAgICAgICAgfSxcbiAgICAgICAgcmVjaXBpZW50UHJpdmF0ZUFybW9yOiByZWNpcGllbnRHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgICAgc2VuZGVyUHVibGljQXJtb3I6IGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCksXG4gICAgICAgIGlzYnM1OEVuY29kZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgcmVjaXBpZW50Q29tYmluZWRLZXkgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlQ29tYmluZWRLZXkoXG4gICAgICBrZXlTaGFyZSxcbiAgICAgIGVuY3J5cHRlZE5TaGFyZXMsXG4gICAgICBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluXG4gICAgKTtcblxuICAgIGNvbnN0IHBydiA9IEpTT04uc3RyaW5naWZ5KHJlY2lwaWVudENvbWJpbmVkS2V5LnNpZ25pbmdNYXRlcmlhbCk7XG4gICAgY29uc3QgcmVjaXBpZW50S2V5Y2hhaW5QYXJhbXMgPSB7XG4gICAgICBzb3VyY2U6IHJlY2lwaWVudCxcbiAgICAgIGtleVR5cGU6ICd0c3MnIGFzIEtleVR5cGUsXG4gICAgICBjb21tb25LZXljaGFpbjogYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbixcbiAgICAgIHBydjogcHJ2LFxuICAgICAgZW5jcnlwdGVkUHJ2OiB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICBpbnB1dDogcHJ2LFxuICAgICAgICBwYXNzd29yZDogcGFzc3BocmFzZSxcbiAgICAgIH0pLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgIH07XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpO1xuICAgIHJldHVybiByZWNpcGllbnRJbmRleCA9PT0gMVxuICAgICAgPyBhd2FpdCBrZXljaGFpbnMuYWRkKHJlY2lwaWVudEtleWNoYWluUGFyYW1zKVxuICAgICAgOiBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHJlY2lwaWVudEtleWNoYWluUGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHNpZ25pbmcga2V5LCB0eFJlcXVlc3RSZXNvbHZlZCBhbmQgdHhSZXF1ZXN0SWRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdCBvciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0geyBzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8RUNEU0FTaWduaW5nUmVxdWVzdEJhc2VSZXN1bHQ+fVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduUmVxdWVzdEJhc2UocGFyYW1zOiBUU1NQYXJhbXMgfCBUU1NQYXJhbXNGb3JNZXNzYWdlLCByZXF1ZXN0VHlwZTogUmVxdWVzdFR5cGUpOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGxldCB0eFJlcXVlc3RSZXNvbHZlZDogVHhSZXF1ZXN0O1xuICAgIGxldCB0eFJlcXVlc3RJZDogc3RyaW5nO1xuXG4gICAgY29uc3QgeyB0eFJlcXVlc3QsIHBydiB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKHR5cGVvZiB0eFJlcXVlc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZCA9IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCB0eFJlcXVlc3QpO1xuICAgICAgdHhSZXF1ZXN0SWQgPSB0eFJlcXVlc3RSZXNvbHZlZC50eFJlcXVlc3RJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQgPSB0eFJlcXVlc3Q7XG4gICAgICB0eFJlcXVlc3RJZCA9IHR4UmVxdWVzdC50eFJlcXVlc3RJZDtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyU2lnbmluZ01hdGVyaWFsOiBFQ0RTQU1ldGhvZFR5cGVzLlNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UocHJ2KTtcbiAgICBpZiAodXNlclNpZ25pbmdNYXRlcmlhbC5wU2hhcmUuaSAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHVzZXIga2V5Jyk7XG4gICAgfVxuICAgIGlmICghdXNlclNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1c2VyIGtleSAtIG1pc3NpbmcgYmFja3VwTlNoYXJlJyk7XG4gICAgfVxuXG4gICAgbGV0IHNpZ25hYmxlUGF5bG9hZDtcbiAgICBsZXQgZGVyaXZhdGlvblBhdGg7XG5cbiAgICBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4KSB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIHR4UmVxdWVzdFJlc29sdmVkLnRyYW5zYWN0aW9ucyB8fCB0eFJlcXVlc3RSZXNvbHZlZC51bnNpZ25lZFR4cyxcbiAgICAgICAgJ1VuYWJsZSB0byBmaW5kIHRyYW5zYWN0aW9ucyBpbiB0eFJlcXVlc3QnXG4gICAgICApO1xuICAgICAgY29uc3QgdW5zaWduZWRUeCA9XG4gICAgICAgIHR4UmVxdWVzdFJlc29sdmVkLmFwaVZlcnNpb24gPT09ICdmdWxsJ1xuICAgICAgICAgID8gdHhSZXF1ZXN0UmVzb2x2ZWQudHJhbnNhY3Rpb25zIVswXS51bnNpZ25lZFR4XG4gICAgICAgICAgOiB0eFJlcXVlc3RSZXNvbHZlZC51bnNpZ25lZFR4c1swXTtcbiAgICAgIHNpZ25hYmxlUGF5bG9hZCA9IEJ1ZmZlci5mcm9tKHVuc2lnbmVkVHguc2lnbmFibGVIZXgsICdoZXgnKTtcbiAgICAgIGRlcml2YXRpb25QYXRoID0gdHhSZXF1ZXN0UmVzb2x2ZWQudHJhbnNhY3Rpb25zIVswXS51bnNpZ25lZFR4LmRlcml2YXRpb25QYXRoO1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLm1lc3NhZ2UpIHtcbiAgICAgIHNpZ25hYmxlUGF5bG9hZCA9IChwYXJhbXMgYXMgVFNTUGFyYW1zRm9yTWVzc2FnZSkuYnVmZmVyVG9TaWduO1xuICAgICAgLy8gVE9ETyBCRy02NzI5OSBNZXNzYWdlIHNpZ25pbmcgd2l0aCBkZXJpdmF0aW9uIHBhdGhcbiAgICAgIGRlcml2YXRpb25QYXRoID0gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgTVBDID0gbmV3IEVjZHNhKCk7XG4gICAgY29uc3Qgc2lnbmluZ0tleSA9IE1QQy5rZXlEZXJpdmUoXG4gICAgICB1c2VyU2lnbmluZ01hdGVyaWFsLnBTaGFyZSxcbiAgICAgIFt1c2VyU2lnbmluZ01hdGVyaWFsLmJpdGdvTlNoYXJlLCB1c2VyU2lnbmluZ01hdGVyaWFsLmJhY2t1cE5TaGFyZV0sXG4gICAgICBkZXJpdmF0aW9uUGF0aFxuICAgICk7XG5cbiAgICBjb25zdCBiaXRnb0luZGV4ID0gMztcbiAgICBjb25zdCB1c2VySW5kZXggPSAxO1xuICAgIGNvbnN0IHlTaGFyZSA9IHtcbiAgICAgIGk6IHVzZXJTaWduaW5nTWF0ZXJpYWwucFNoYXJlLmksXG4gICAgICBqOiBiaXRnb0luZGV4LFxuICAgICAgbjogc2lnbmluZ0tleS5uU2hhcmVzW2JpdGdvSW5kZXhdLm4sXG4gICAgfTtcblxuICAgIGNvbnN0IFtzaWduaW5nS2V5V2l0aENoYWxsZW5nZSwgYml0Z29DaGFsbGVuZ2VdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgTVBDLmFwcGVuZENoYWxsZW5nZShzaWduaW5nS2V5LnhTaGFyZSwgeVNoYXJlKSxcbiAgICAgIGdldFR4UmVxdWVzdENoYWxsZW5nZSh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCB0eFJlcXVlc3RJZCwgJzAnLCByZXF1ZXN0VHlwZSwgJ2VjZHNhJyksXG4gICAgXSk7XG5cbiAgICBjb25zdCB1c2VyU2lnblNoYXJlID0gYXdhaXQgRUNEU0FNZXRob2RzLmNyZWF0ZVVzZXJTaWduU2hhcmUoc2lnbmluZ0tleVdpdGhDaGFsbGVuZ2UueFNoYXJlLCB7XG4gICAgICBpOiB1c2VySW5kZXgsXG4gICAgICBqOiBiaXRnb0luZGV4LFxuICAgICAgbjogdXNlclNpZ25pbmdNYXRlcmlhbC5iaXRnb05TaGFyZS5uLFxuICAgICAgbnRpbGRlOiBiaXRnb0NoYWxsZW5nZS5udGlsZGUsXG4gICAgICBoMTogYml0Z29DaGFsbGVuZ2UuaDEsXG4gICAgICBoMjogYml0Z29DaGFsbGVuZ2UuaDIsXG4gICAgfSk7XG4gICAgY29uc3QgdSA9IHNpZ25pbmdLZXkublNoYXJlc1tiaXRnb0luZGV4XS51O1xuXG4gICAgbGV0IGNoYWluY29kZSA9IHVzZXJTaWduaW5nTWF0ZXJpYWwuYml0Z29OU2hhcmUuY2hhaW5jb2RlO1xuICAgIHdoaWxlIChjaGFpbmNvZGUubGVuZ3RoIDwgNjQpIHtcbiAgICAgIGNoYWluY29kZSA9ICcwJyArIGNoYWluY29kZTtcbiAgICB9XG4gICAgY29uc3Qgc2lnbmVyU2hhcmUgPSBiaXAzMi5mcm9tUHJpdmF0ZUtleShCdWZmZXIuZnJvbSh1LCAnaGV4JyksIEJ1ZmZlci5mcm9tKGNoYWluY29kZSwgJ2hleCcpKS50b0Jhc2U1OCgpO1xuICAgIGNvbnN0IGJpdGdvR3BnS2V5ID0gYXdhaXQgZ2V0Qml0Z29HcGdQdWJLZXkodGhpcy5iaXRnbyk7XG4gICAgY29uc3QgZW5jcnlwdGVkU2lnbmVyU2hhcmUgPSAoYXdhaXQgb3BlbnBncC5lbmNyeXB0KHtcbiAgICAgIG1lc3NhZ2U6IGF3YWl0IG9wZW5wZ3AuY3JlYXRlTWVzc2FnZSh7XG4gICAgICAgIHRleHQ6IHNpZ25lclNoYXJlLFxuICAgICAgfSksXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgcmVqZWN0Q3VydmVzOiBuZXcgU2V0KCksXG4gICAgICB9LFxuICAgICAgZW5jcnlwdGlvbktleXM6IFtiaXRnb0dwZ0tleV0sXG4gICAgfSkpIGFzIHN0cmluZztcbiAgICBjb25zdCB1c2VyR3BnS2V5ID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdzZWNwMjU2azEnKTtcbiAgICBjb25zdCBwcml2YXRlU2hhcmVQcm9vZiA9IGF3YWl0IGNyZWF0ZVNoYXJlUHJvb2YodXNlckdwZ0tleS5wcml2YXRlS2V5LCBzaWduaW5nS2V5Lm5TaGFyZXNbYml0Z29JbmRleF0udSwgJ2VjZHNhJyk7XG4gICAgY29uc3QgdnNzUHJvb2YgPSBzaWduaW5nS2V5Lm5TaGFyZXNbYml0Z29JbmRleF0udjtcbiAgICBjb25zdCB1c2VyUHVibGljR3BnS2V5ID0gdXNlckdwZ0tleS5wdWJsaWNLZXk7XG4gICAgY29uc3QgcHVibGljU2hhcmUgPSBzaWduaW5nS2V5Lm5TaGFyZXNbYml0Z29JbmRleF0ueSArIHNpZ25pbmdLZXkublNoYXJlc1tiaXRnb0luZGV4XS5jaGFpbmNvZGU7XG5cbiAgICAvLyBzaWduaW5nIHN0YWdlIG9uZSB3aXRoIEsgc2hhcmUgc2VuZCB0byBiaXRnbyBhbmQgcmVjZWl2ZXMgQSBzaGFyZVxuICAgIGNvbnN0IGJpdGdvVG9Vc2VyQVNoYXJlID0gKGF3YWl0IEVDRFNBTWV0aG9kcy5zZW5kU2hhcmVUb0JpdGdvKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0eFJlcXVlc3RJZCxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgU2VuZFNoYXJlVHlwZS5LU2hhcmUsXG4gICAgICB1c2VyU2lnblNoYXJlLmtTaGFyZSxcbiAgICAgIGVuY3J5cHRlZFNpZ25lclNoYXJlLFxuICAgICAgdnNzUHJvb2YsXG4gICAgICBwcml2YXRlU2hhcmVQcm9vZixcbiAgICAgIHB1YmxpY1NoYXJlLFxuICAgICAgdXNlclB1YmxpY0dwZ0tleVxuICAgICkpIGFzIE9taXQ8QVNoYXJlLCAnbnRpbGRlJyB8ICdoMScgfCAnaDInPjsgLy8gV1AvSFNNIGRvZXMgbm90IHJldHVybiB0aGUgaW5pdGlhbCBjaGFsbGVuZ2VcblxuICAgIC8vIEFwcGVuZCB0aGUgQml0R28gY2hhbGxlbmdlIHRvIHRoZSBBc2hhcmUgdG8gYmUgdXNlZCBpbiBzdWJzZXF1ZW50IHByb29mc1xuICAgIGNvbnN0IGJpdGdvVG9Vc2VyQVNoYXJlV2l0aE5UaWxkZTogQVNoYXJlID0ge1xuICAgICAgLi4uYml0Z29Ub1VzZXJBU2hhcmUsXG4gICAgICAuLi5iaXRnb0NoYWxsZW5nZSxcbiAgICB9O1xuXG4gICAgY29uc3QgdXNlckdhbW1hQW5kTXVTaGFyZXMgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlVXNlckdhbW1hQW5kTXVTaGFyZShcbiAgICAgIHVzZXJTaWduU2hhcmUud1NoYXJlLFxuICAgICAgYml0Z29Ub1VzZXJBU2hhcmVXaXRoTlRpbGRlXG4gICAgKTtcbiAgICBjb25zdCB1c2VyT21pY3JvbkFuZERlbHRhU2hhcmUgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlVXNlck9taWNyb25BbmREZWx0YVNoYXJlKFxuICAgICAgdXNlckdhbW1hQW5kTXVTaGFyZXMuZ1NoYXJlIGFzIEVDRFNBLkdTaGFyZVxuICAgICk7XG4gICAgY29uc3QgbXVTaGFyZSA9IHVzZXJHYW1tYUFuZE11U2hhcmVzLm11U2hhcmUhO1xuICAgIGNvbnN0IGRTaGFyZSA9IHVzZXJPbWljcm9uQW5kRGVsdGFTaGFyZS5kU2hhcmU7XG5cbiAgICAvLyBzaWduaW5nIHN0YWdlIHR3byB3aXRoIG11U2hhcmUgYW5kIGRTaGFyZSBzZW5kIHRvIGJpdGdvIGFuZCByZWNlaXZlcyBEIHNoYXJlXG4gICAgY29uc3QgYml0Z29Ub1VzZXJEU2hhcmUgPSAoYXdhaXQgRUNEU0FNZXRob2RzLnNlbmRTaGFyZVRvQml0Z28oXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy53YWxsZXQuaWQoKSxcbiAgICAgIHR4UmVxdWVzdElkLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICBTZW5kU2hhcmVUeXBlLk1VU2hhcmUsXG4gICAgICB7IG11U2hhcmUsIGRTaGFyZSwgaTogbXVTaGFyZS5pIH1cbiAgICApKSBhcyBEU2hhcmU7XG5cbiAgICBjb25zdCB1c2VyU1NoYXJlID0gYXdhaXQgRUNEU0FNZXRob2RzLmNyZWF0ZVVzZXJTaWduYXR1cmVTaGFyZShcbiAgICAgIHVzZXJPbWljcm9uQW5kRGVsdGFTaGFyZS5vU2hhcmUsXG4gICAgICBiaXRnb1RvVXNlckRTaGFyZSxcbiAgICAgIHNpZ25hYmxlUGF5bG9hZCxcbiAgICAgIHBhcmFtcy5oYXNoXG4gICAgKTtcblxuICAgIC8vIHNpZ25pbmcgc3RhZ2UgdGhyZWUgd2l0aCBTU2hhcmUgc2VuZCB0byBiaXRnbyBhbmQgcmVjZWl2ZXMgU1NoYXJlXG4gICAgYXdhaXQgRUNEU0FNZXRob2RzLnNlbmRTaGFyZVRvQml0Z28oXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy53YWxsZXQuaWQoKSxcbiAgICAgIHR4UmVxdWVzdElkLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICBTZW5kU2hhcmVUeXBlLlNTaGFyZSxcbiAgICAgIHVzZXJTU2hhcmVcbiAgICApO1xuICAgIHJldHVybiBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy53YWxsZXQuaWQoKSwgdHhSZXF1ZXN0SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIHRoZSB0cmFuc2FjdGlvbiBhc3NvY2lhdGVkIHRvIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFR4UmVxdWVzdH0gcGFyYW1zLnR4UmVxdWVzdCAtIHRyYW5zYWN0aW9uIHJlcXVlc3Qgb2JqZWN0IG9yIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucHJ2IC0gZGVjcnlwdGVkIHByaXZhdGUga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucmVxSWQgLSByZXF1ZXN0IGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFR4UmVxdWVzdD59IGZ1bGx5IHNpZ25lZCBUeFJlcXVlc3Qgb2JqZWN0XG4gICAqL1xuICBhc3luYyBzaWduVHhSZXF1ZXN0KHBhcmFtczogVFNTUGFyYW1zKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICByZXR1cm4gdGhpcy5zaWduUmVxdWVzdEJhc2UocGFyYW1zLCBSZXF1ZXN0VHlwZS50eCk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgdGhlIG1lc3NhZ2UgYXNzb2NpYXRlZCB0byB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdCBvciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJlcUlkIC0gcmVxdWVzdCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fSBmdWxseSBzaWduZWQgVHhSZXF1ZXN0IG9iamVjdFxuICAgKi9cbiAgYXN5bmMgc2lnblR4UmVxdWVzdEZvck1lc3NhZ2UocGFyYW1zOiBUU1NQYXJhbXNGb3JNZXNzYWdlKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBpZiAoIXBhcmFtcy5tZXNzYWdlUmF3KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JhdyBtZXNzYWdlIHJlcXVpcmVkIHRvIHNpZ24gbWVzc2FnZScpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaWduUmVxdWVzdEJhc2UocGFyYW1zLCBSZXF1ZXN0VHlwZS5tZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNoYWxsZW5nZSB2YWx1ZXMgZm9yIGVudGVycHJpc2UgYW5kIEJpdEdvIGluIEVDRFNBIHNpZ25pbmdcbiAgICogT25seSByZXR1cm5zIHRoZSBjaGFsbGVuZ2VzIGlmIHRoZXkgYXJlIHZlcmlmaWVkIGJ5IHRoZSB1c2VyJ3MgZW50ZXJwcmlzZSBhZG1pbidzIGVjZGgga2V5XG4gICAqIEBwYXJhbSBiaXRnb1xuICAgKiBAcGFyYW0gd2FsbGV0SWRcbiAgICogQHBhcmFtIGVudGVycHJpc2VJZFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldENoYWxsZW5nZXNGb3JFY2RzYVNpZ25pbmcoXG4gICAgYml0Z286IEJpdEdvQmFzZSxcbiAgICB3YWxsZXRJZDogc3RyaW5nLFxuICAgIGVudGVycHJpc2VJZDogc3RyaW5nXG4gICk6IFByb21pc2U8QXBpQ2hhbGxlbmdlcz4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJpdGdvLmdldENoYWxsZW5nZXNGb3JFY2RzYVNpZ25pbmcod2FsbGV0SWQpO1xuICAgIGNvbnN0IGVudGVycHJpc2VDaGFsbGVuZ2UgPSByZXN1bHQuZW50ZXJwcmlzZUNoYWxsZW5nZTtcbiAgICBjb25zdCBiaXRnb0NoYWxsZW5nZSA9IHJlc3VsdC5iaXRnb0NoYWxsZW5nZTtcblxuICAgIGNvbnN0IGNoYWxsZW5nZVZlcmlmaWVyVXNlcklkID0gcmVzdWx0LmNyZWF0ZWRCeTtcbiAgICBjb25zdCBhZG1pblNpZ25pbmdLZXlSZXNwb25zZSA9IGF3YWl0IGJpdGdvLmdldFNpZ25pbmdLZXlGb3JVc2VyKGVudGVycHJpc2VJZCwgY2hhbGxlbmdlVmVyaWZpZXJVc2VySWQpO1xuICAgIGNvbnN0IHB1YmtleU9mQWRtaW5FY2RoS2V5SGV4ID0gYWRtaW5TaWduaW5nS2V5UmVzcG9uc2UuZGVyaXZlZFB1YmtleTtcblxuICAgIC8vIFZlcmlmeSBlbnRlcnByaXNlJ3MgY2hhbGxlbmdlIGlzIHNpZ25lZCBieSB0aGUgcmVzcGVjdGl2ZSBhZG1pbidzIGVjZGgga2V5Y2hhaW5cbiAgICBjb25zdCBlbnRlcnByaXNlUmF3Q2hhbGxlbmdlID0ge1xuICAgICAgbnRpbGRlOiBlbnRlcnByaXNlQ2hhbGxlbmdlLm50aWxkZSxcbiAgICAgIGgxOiBlbnRlcnByaXNlQ2hhbGxlbmdlLmgxLFxuICAgICAgaDI6IGVudGVycHJpc2VDaGFsbGVuZ2UuaDIsXG4gICAgfTtcbiAgICBjb25zdCBhZG1pblNpZ25hdHVyZU9uRW50Q2hhbGxlbmdlOiBzdHJpbmcgPSBlbnRlcnByaXNlQ2hhbGxlbmdlLnZlcmlmaWVycy5hZG1pblNpZ25hdHVyZTtcbiAgICBpZiAoXG4gICAgICAhdmVyaWZ5RWNkaFNpZ25hdHVyZShcbiAgICAgICAgdGhpcy5nZXRNZXNzYWdlVG9TaWduRnJvbUNoYWxsZW5nZShlbnRlcnByaXNlUmF3Q2hhbGxlbmdlKSxcbiAgICAgICAgYWRtaW5TaWduYXR1cmVPbkVudENoYWxsZW5nZSxcbiAgICAgICAgQnVmZmVyLmZyb20ocHVia2V5T2ZBZG1pbkVjZGhLZXlIZXgsICdoZXgnKVxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBZG1pbiBzaWduYXR1cmUgZm9yIGVudGVycHJpc2UgY2hhbGxlbmdlIGlzIG5vdCB2YWxpZC4gUGxlYXNlIGNvbnRhY3QgeW91ciBlbnRlcnByaXNlIGFkbWluLmApO1xuICAgIH1cblxuICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBCaXRHbyBjaGFsbGVuZ2UncyBaSyBwcm9vZnMgaGF2ZSBiZWVuIHZlcmlmaWVkIGJ5IHRoZSBhZG1pblxuICAgIGNvbnN0IGJpdEdvUmF3Q2hhbGxlbmdlID0ge1xuICAgICAgbnRpbGRlOiBiaXRnb0NoYWxsZW5nZS5udGlsZGUsXG4gICAgICBoMTogYml0Z29DaGFsbGVuZ2UuaDEsXG4gICAgICBoMjogYml0Z29DaGFsbGVuZ2UuaDIsXG4gICAgfTtcbiAgICBjb25zdCBhZG1pblZlcmlmaWNhdGlvblNpZ25hdHVyZUZvckJpdEdvQ2hhbGxlbmdlID0gYml0Z29DaGFsbGVuZ2UudmVyaWZpZXJzLmFkbWluU2lnbmF0dXJlO1xuICAgIGlmIChcbiAgICAgICF2ZXJpZnlFY2RoU2lnbmF0dXJlKFxuICAgICAgICB0aGlzLmdldE1lc3NhZ2VUb1NpZ25Gcm9tQ2hhbGxlbmdlKGJpdEdvUmF3Q2hhbGxlbmdlKSxcbiAgICAgICAgYWRtaW5WZXJpZmljYXRpb25TaWduYXR1cmVGb3JCaXRHb0NoYWxsZW5nZSxcbiAgICAgICAgQnVmZmVyLmZyb20ocHVia2V5T2ZBZG1pbkVjZGhLZXlIZXgsICdoZXgnKVxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBZG1pbiBzaWduYXR1cmUgZm9yIEJpdEdvJ3MgY2hhbGxlbmdlIGlzIG5vdCB2YWxpZC4gUGxlYXNlIGNvbnRhY3QgeW91ciBlbnRlcnByaXNlIGFkbWluLmApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBlbnRlcnByaXNlQ2hhbGxlbmdlOiBlbnRlcnByaXNlUmF3Q2hhbGxlbmdlLFxuICAgICAgYml0Z29DaGFsbGVuZ2U6IGJpdEdvUmF3Q2hhbGxlbmdlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhlIHUtdmFsdWUgcHJvb2ZzIGFuZCBHUEcga2V5cyB1c2VkIGluIGdlbmVyYXRpbmcgYSBUU1MgRUNEU0Egd2FsbGV0LlxuICAgKiBAcGFyYW0gdXNlckdwZ1B1YiBUaGUgdXNlcidzIHB1YmxpYyBHUEcga2V5IGZvciBlbmNyeXB0aW9uIGJldHdlZW4gdXNlci9zZXJ2ZXJcbiAgICogQHBhcmFtIGJhY2t1cEdwZ1B1YiBUaGUgYmFja3VwJ3MgcHVibGljIEdQRyBrZXkgZm9yIGVuY3J5cHRpb24gYmV0d2VlbiBiYWNrdXAvc2VydmVyXG4gICAqIEBwYXJhbSBiaXRnb0tleWNoYWluIHByZXZpb3VzbHkgY3JlYXRlZCBCaXRHbyBrZXljaGFpbjsgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdXNlciBhbmQgYmFja3VwIGtleSBzaGFyZXNcbiAgICogQHBhcmFtIGRlY3J5cHRlZFNoYXJlIFRoZSBkZWNyeXB0ZWQgYml0Z28tdG8tdXNlci9iYWNrdXAgcHJpdmF0ZSBzaGFyZSByZXRyaWV2ZWQgZnJvbSB0aGUga2V5Y2hhaW5cbiAgICogQHBhcmFtIHZlcmlmaWVySW5kZXggVGhlIGluZGV4IG9mIHRoZSBwYXJ0eSB0byB2ZXJpZnk6IDEgPSB1c2VyLCAyID0gYmFja3VwXG4gICAqL1xuICBhc3luYyB2ZXJpZnlXYWxsZXRTaWduYXR1cmVzKFxuICAgIHVzZXJHcGdQdWI6IHN0cmluZyxcbiAgICBiYWNrdXBHcGdQdWI6IHN0cmluZyxcbiAgICBiaXRnb0tleWNoYWluOiBLZXljaGFpbixcbiAgICBkZWNyeXB0ZWRTaGFyZTogc3RyaW5nLFxuICAgIHZlcmlmaWVySW5kZXg6IDEgfCAyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGFzc2VydChiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluKTtcbiAgICBhc3NlcnQoYml0Z29LZXljaGFpbi53YWxsZXRIU01HUEdQdWJsaWNLZXlTaWdzKTtcblxuICAgIGNvbnN0IGJpdGdvR3BnS2V5ID0gYXdhaXQgZ2V0Qml0Z29HcGdQdWJLZXkodGhpcy5iaXRnbyk7XG4gICAgY29uc3QgdXNlcktleVB1YiA9IGF3YWl0IG9wZW5wZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IHVzZXJHcGdQdWIgfSk7XG4gICAgY29uc3QgdXNlcktleUlkID0gdXNlcktleVB1Yi5rZXlQYWNrZXQuZ2V0RmluZ2VycHJpbnQoKTtcbiAgICBjb25zdCBiYWNrdXBLZXlQdWIgPSBhd2FpdCBvcGVucGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiBiYWNrdXBHcGdQdWIgfSk7XG4gICAgY29uc3QgYmFja3VwS2V5SWQgPSBiYWNrdXBLZXlQdWIua2V5UGFja2V0LmdldEZpbmdlcnByaW50KCk7XG5cbiAgICBjb25zdCB3YWxsZXRTaWduYXR1cmVzID0gYXdhaXQgb3BlbnBncC5yZWFkS2V5cyh7IGFybW9yZWRLZXlzOiBiaXRnb0tleWNoYWluLndhbGxldEhTTUdQR1B1YmxpY0tleVNpZ3MgfSk7XG4gICAgaWYgKHdhbGxldFNpZ25hdHVyZXMubGVuZ3RoICE9PSAyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgd2FsbGV0IHNpZ25hdHVyZXMnKTtcbiAgICB9XG4gICAgaWYgKHVzZXJLZXlJZCAhPT0gd2FsbGV0U2lnbmF0dXJlc1swXS5rZXlQYWNrZXQuZ2V0RmluZ2VycHJpbnQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBmaXJzdCB3YWxsZXQgc2lnbmF0dXJlJ3MgZmluZ2VycHJpbnQgZG9lcyBub3QgbWF0Y2ggcGFzc2VkIHVzZXIgZ3BnIGtleSdzIGZpbmdlcnByaW50YCk7XG4gICAgfVxuICAgIGlmIChiYWNrdXBLZXlJZCAhPT0gd2FsbGV0U2lnbmF0dXJlc1sxXS5rZXlQYWNrZXQuZ2V0RmluZ2VycHJpbnQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZWNvbmQgd2FsbGV0IHNpZ25hdHVyZSdzIGZpbmdlcnByaW50IGRvZXMgbm90IG1hdGNoIHBhc3NlZCBiYWNrdXAgZ3BnIGtleSdzIGZpbmdlcnByaW50YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdmVyaWZ5V2FsbGV0U2lnbmF0dXJlKHtcbiAgICAgIHdhbGxldFNpZ25hdHVyZTogd2FsbGV0U2lnbmF0dXJlc1swXSxcbiAgICAgIGNvbW1vbktleWNoYWluOiBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluLFxuICAgICAgdXNlcktleUlkLFxuICAgICAgYmFja3VwS2V5SWQsXG4gICAgICBiaXRnb1B1YjogYml0Z29HcGdLZXksXG4gICAgICBkZWNyeXB0ZWRTaGFyZSxcbiAgICAgIHZlcmlmaWVySW5kZXgsXG4gICAgfSk7XG5cbiAgICBhd2FpdCB2ZXJpZnlXYWxsZXRTaWduYXR1cmUoe1xuICAgICAgd2FsbGV0U2lnbmF0dXJlOiB3YWxsZXRTaWduYXR1cmVzWzFdLFxuICAgICAgY29tbW9uS2V5Y2hhaW46IGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4sXG4gICAgICB1c2VyS2V5SWQsXG4gICAgICBiYWNrdXBLZXlJZCxcbiAgICAgIGJpdGdvUHViOiBiaXRnb0dwZ0tleSxcbiAgICAgIGRlY3J5cHRlZFNoYXJlLFxuICAgICAgdmVyaWZpZXJJbmRleCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIGNoYWxsZW5nZSB3aXRoIHRoZSBwcm92aWRlZCB2MSBlY2RoIGtleSBhdCBhIGRlcml2ZWQgcGF0aFxuICAgKiBAcGFyYW0gY2hhbGxlbmdlIGNoYWxsZW5nZSB0byBzaWduXG4gICAqIEBwYXJhbSBlY2RoWHBydiB4cHJ2IG9mIHRoZSBlY2RoIGtleVxuICAgKiBAcGFyYW0gZGVyaXZhdGlvblBhdGggdGhlIGRlcml2ZWQgcGF0aCBhdCB3aGljaCB0aGUgZWNkaCBrZXkgd2lsbCBzaWduXG4gICAqL1xuICBzdGF0aWMgc2lnbkNoYWxsZW5nZShjaGFsbGVuZ2U6IE5UaWxkZVNoYXJlLCBlY2RoWHBydjogc3RyaW5nLCBkZXJpdmF0aW9uUGF0aDogc3RyaW5nKTogQnVmZmVyIHtcbiAgICBjb25zdCBtZXNzYWdlVG9TaWduID0gdGhpcy5nZXRNZXNzYWdlVG9TaWduRnJvbUNoYWxsZW5nZShjaGFsbGVuZ2UpO1xuICAgIHJldHVybiBzaWduTWVzc2FnZVdpdGhEZXJpdmVkRWNkaEtleShtZXNzYWdlVG9TaWduLCBlY2RoWHBydiwgZGVyaXZhdGlvblBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGNoYWxsZW5nZSB0byBhIGNvbW1vbiBtZXNzYWdlIGZvcm1hdCB3aGljaCBjYW4gYmUgc2lnbmVkLlxuICAgKiBAcGFyYW0gY2hhbGxlbmdlXG4gICAqL1xuICBzdGF0aWMgZ2V0TWVzc2FnZVRvU2lnbkZyb21DaGFsbGVuZ2UoY2hhbGxlbmdlOiBOVGlsZGVTaGFyZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNoYWxsZW5nZS5udGlsZGUuY29uY2F0KGNoYWxsZW5nZS5oMSkuY29uY2F0KGNoYWxsZW5nZS5oMik7XG4gIH1cblxuICAvKipcbiAgIFZlcmlmaWVzIFpLIHByb29mcyBvZiBCaXRHbydzIGNoYWxsZW5nZXMgZm9yIGJvdGggbml0cm8gYW5kIGluc3RpdHV0aW9uYWwgSFNNc1xuICAgd2hpY2ggYXJlIGZldGNoZWQgZnJvbSB0aGUgV1AgQVBJLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHZlcmlmeUJpdEdvQ2hhbGxlbmdlcyhiaXRnb0NoYWxsZW5nZXM6IEdldEJpdEdvQ2hhbGxlbmdlc0FwaSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIFZlcmlmeSBpbnN0aXR1dGlvbmFsIGhzbSBjaGFsbGVuZ2UgcHJvb2ZcbiAgICBjb25zdCBpbnN0Q2hhbGxlbmdlVmVyaWZpZWQgPSBhd2FpdCB0aGlzLnZlcmlmeUJpdEdvQ2hhbGxlbmdlKHtcbiAgICAgIG50aWxkZTogYml0Z29DaGFsbGVuZ2VzLmJpdGdvSW5zdGl0dXRpb25hbEhzbS5udGlsZGUsXG4gICAgICBoMTogYml0Z29DaGFsbGVuZ2VzLmJpdGdvSW5zdGl0dXRpb25hbEhzbS5oMSxcbiAgICAgIGgyOiBiaXRnb0NoYWxsZW5nZXMuYml0Z29JbnN0aXR1dGlvbmFsSHNtLmgyLFxuICAgICAgbnRpbGRlUHJvb2Y6IGJpdGdvQ2hhbGxlbmdlcy5iaXRnb0luc3RpdHV0aW9uYWxIc20ubnRpbGRlUHJvb2YsXG4gICAgfSk7XG5cbiAgICAvLyBWZXJpZnkgbml0cm8gaHNtIGNoYWxsZW5nZSBwcm9vZlxuICAgIGNvbnN0IG5pdHJvQ2hhbGxlbmdlVmVyaWZpZWQgPSBhd2FpdCB0aGlzLnZlcmlmeUJpdEdvQ2hhbGxlbmdlKHtcbiAgICAgIG50aWxkZTogYml0Z29DaGFsbGVuZ2VzLmJpdGdvTml0cm9Ic20ubnRpbGRlLFxuICAgICAgaDE6IGJpdGdvQ2hhbGxlbmdlcy5iaXRnb05pdHJvSHNtLmgxLFxuICAgICAgaDI6IGJpdGdvQ2hhbGxlbmdlcy5iaXRnb05pdHJvSHNtLmgyLFxuICAgICAgbnRpbGRlUHJvb2Y6IGJpdGdvQ2hhbGxlbmdlcy5iaXRnb05pdHJvSHNtLm50aWxkZVByb29mLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGluc3RDaGFsbGVuZ2VWZXJpZmllZCAmJiBuaXRyb0NoYWxsZW5nZVZlcmlmaWVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIFpLIHByb29mIGZvciBhIHNpbmdsZSBCaXRHbyBjaGFsbGVuZ2VcbiAgICogQHBhcmFtIGJpdGdvQ2hhbGxlbmdlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgdmVyaWZ5Qml0R29DaGFsbGVuZ2UoYml0Z29DaGFsbGVuZ2U6IE5UaWxkZVNoYXJlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZGVzZXJpYWxpemVkSW5zdENoYWxsZW5nZSA9IHRoaXMuZGVzZXJpYWxpemVOVGlsZGUoYml0Z29DaGFsbGVuZ2UpO1xuICAgIGlmICghZGVzZXJpYWxpemVkSW5zdENoYWxsZW5nZS5udGlsZGVQcm9vZikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBCaXRHbyBjaGFsbGVuZ2UgcHJvb2YgdG8gYmUgcHJlc2VudC4gQ29udGFjdCBzdXBwb3J0QGJpdGdvLmNvbS4nKTtcbiAgICB9XG4gICAgY29uc3QgbnRpbGRlUHJvb2ZIMVdydEgyVmVyaWZpZWQgPSBhd2FpdCB2ZXJpZnlOdGlsZGVQcm9vZihcbiAgICAgIHtcbiAgICAgICAgbnRpbGRlOiBkZXNlcmlhbGl6ZWRJbnN0Q2hhbGxlbmdlLm50aWxkZSxcbiAgICAgICAgaDE6IGRlc2VyaWFsaXplZEluc3RDaGFsbGVuZ2UuaDEsXG4gICAgICAgIGgyOiBkZXNlcmlhbGl6ZWRJbnN0Q2hhbGxlbmdlLmgyLFxuICAgICAgfSxcbiAgICAgIGRlc2VyaWFsaXplZEluc3RDaGFsbGVuZ2UubnRpbGRlUHJvb2YuaDFXcnRIMlxuICAgICk7XG4gICAgY29uc3QgbnRpbGRlUHJvb2ZIMldydEgxVmVyaWZpZWQgPSBhd2FpdCB2ZXJpZnlOdGlsZGVQcm9vZihcbiAgICAgIHtcbiAgICAgICAgbnRpbGRlOiBkZXNlcmlhbGl6ZWRJbnN0Q2hhbGxlbmdlLm50aWxkZSxcbiAgICAgICAgaDE6IGRlc2VyaWFsaXplZEluc3RDaGFsbGVuZ2UuaDIsXG4gICAgICAgIGgyOiBkZXNlcmlhbGl6ZWRJbnN0Q2hhbGxlbmdlLmgxLFxuICAgICAgfSxcbiAgICAgIGRlc2VyaWFsaXplZEluc3RDaGFsbGVuZ2UubnRpbGRlUHJvb2YuaDJXcnRIMVxuICAgICk7XG4gICAgcmV0dXJuIG50aWxkZVByb29mSDFXcnRIMlZlcmlmaWVkICYmIG50aWxkZVByb29mSDJXcnRIMVZlcmlmaWVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGJpdGdvIGNoYWxsZW5nZXMgZm9yIGJvdGggbml0cm8gYW5kIGluc3RpdHV0aW9uYWwgSFNNcyBmcm9tIFdQIEFQSS5cbiAgICogQHBhcmFtIGJpdGdvXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0Qml0R29DaGFsbGVuZ2VzKGJpdGdvOiBCaXRHb0Jhc2UpOiBQcm9taXNlPEdldEJpdEdvQ2hhbGxlbmdlc0FwaT4ge1xuICAgIHJldHVybiBhd2FpdCBiaXRnby5nZXQoYml0Z28udXJsKCcvdHNzL2VjZHNhL2NoYWxsZW5nZXMnLCAyKSkuc2VuZCgpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyBhIGNoYWxsZW5nZSBhbmQgaXQncyBwcm9vZnMgZnJvbSBoZXggc3RyaW5ncyB0byBiaWdpbnRcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZU5UaWxkZShjaGFsbGVuZ2U6IE5UaWxkZVNoYXJlKTogTlRpbGRlIHtcbiAgICBjb25zdCBkZXNlcmlhbGl6ZWROdGlsZGU6IE5UaWxkZSA9IHtcbiAgICAgIG50aWxkZTogaGV4VG9CaWdJbnQoY2hhbGxlbmdlLm50aWxkZSksXG4gICAgICBoMTogaGV4VG9CaWdJbnQoY2hhbGxlbmdlLmgxKSxcbiAgICAgIGgyOiBoZXhUb0JpZ0ludChjaGFsbGVuZ2UuaDIpLFxuICAgIH07XG4gICAgaWYgKGNoYWxsZW5nZS5udGlsZGVQcm9vZikge1xuICAgICAgZGVzZXJpYWxpemVkTnRpbGRlLm50aWxkZVByb29mID0ge1xuICAgICAgICBoMVdydEgyOiB7XG4gICAgICAgICAgYWxwaGE6IGNvbnZlcnRIZXhBcnJUb0JpZ0ludEFycihjaGFsbGVuZ2UubnRpbGRlUHJvb2YuaDFXcnRIMi5hbHBoYSksXG4gICAgICAgICAgdDogY29udmVydEhleEFyclRvQmlnSW50QXJyKGNoYWxsZW5nZS5udGlsZGVQcm9vZi5oMVdydEgyLnQpLFxuICAgICAgICB9LFxuICAgICAgICBoMldydEgxOiB7XG4gICAgICAgICAgYWxwaGE6IGNvbnZlcnRIZXhBcnJUb0JpZ0ludEFycihjaGFsbGVuZ2UubnRpbGRlUHJvb2YuaDJXcnRIMS5hbHBoYSksXG4gICAgICAgICAgdDogY29udmVydEhleEFyclRvQmlnSW50QXJyKGNoYWxsZW5nZS5udGlsZGVQcm9vZi5oMldydEgxLnQpLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2VyaWFsaXplZE50aWxkZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgY2hhbGxlbmdlIGFuZCBpdCdzIHByb29mcyBmcm9tIGJpZyBpbnQgdG8gaGV4IHN0cmluZ3MuXG4gICAqIEBwYXJhbSBjaGFsbGVuZ2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVOVGlsZGUoY2hhbGxlbmdlOiBOVGlsZGUpOiBOVGlsZGVTaGFyZSB7XG4gICAgY29uc3Qgc2VyaWFsaXplZE50aWxkZTogTlRpbGRlU2hhcmUgPSB7XG4gICAgICBudGlsZGU6IGJpZ0ludFRvSGV4KGNoYWxsZW5nZS5udGlsZGUpLFxuICAgICAgaDE6IGJpZ0ludFRvSGV4KGNoYWxsZW5nZS5oMSksXG4gICAgICBoMjogYmlnSW50VG9IZXgoY2hhbGxlbmdlLmgyKSxcbiAgICB9O1xuICAgIGlmIChjaGFsbGVuZ2UubnRpbGRlUHJvb2YpIHtcbiAgICAgIHNlcmlhbGl6ZWROdGlsZGUubnRpbGRlUHJvb2YgPSB7XG4gICAgICAgIGgxV3J0SDI6IHtcbiAgICAgICAgICBhbHBoYTogY29udmVydEJpZ0ludEFyclRvSGV4QXJyKGNoYWxsZW5nZS5udGlsZGVQcm9vZi5oMVdydEgyLmFscGhhKSxcbiAgICAgICAgICB0OiBjb252ZXJ0QmlnSW50QXJyVG9IZXhBcnIoY2hhbGxlbmdlLm50aWxkZVByb29mLmgxV3J0SDIudCksXG4gICAgICAgIH0sXG4gICAgICAgIGgyV3J0SDE6IHtcbiAgICAgICAgICBhbHBoYTogY29udmVydEJpZ0ludEFyclRvSGV4QXJyKGNoYWxsZW5nZS5udGlsZGVQcm9vZi5oMldydEgxLmFscGhhKSxcbiAgICAgICAgICB0OiBjb252ZXJ0QmlnSW50QXJyVG9IZXhBcnIoY2hhbGxlbmdlLm50aWxkZVByb29mLmgyV3J0SDEudCksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gc2VyaWFsaXplZE50aWxkZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIEJpdEdvJ3MgcHJvb2ZzIGZyb20gQVBJIGFuZCBzaWducyB0aGVtIGlmIHRoZSBwcm9vZnMgYXJlIHZhbGlkLlxuICAgKiBAcGFyYW0gYml0Z29cbiAgICogQHBhcmFtIGVudGVycHJpc2VJZFxuICAgKiBAcGFyYW0gdXNlclBhc3N3b3JkXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0VmVyaWZ5QW5kU2lnbkJpdEdvQ2hhbGxlbmdlcyhcbiAgICBiaXRnbzogQml0R29CYXNlLFxuICAgIGVudGVycHJpc2VJZDogc3RyaW5nLFxuICAgIHVzZXJQYXNzd29yZDogc3RyaW5nXG4gICk6IFByb21pc2U8Qml0R29Qcm9vZlNpZ25hdHVyZXM+IHtcbiAgICAvLyBGZXRjaCB1c2VyJ3MgZWNkaCBwdWJsaWMga2V5Y2hhaW4gbmVlZGVkIGZvciBzaWduaW5nIHRoZSBjaGFsbGVuZ2VzXG4gICAgY29uc3QgdXNlclNpZ25pbmdLZXkgPSBhd2FpdCBiaXRnby5nZXRTaWduaW5nS2V5Rm9yVXNlcihlbnRlcnByaXNlSWQpO1xuICAgIGlmICghdXNlclNpZ25pbmdLZXkuZWNkaEtleWNoYWluIHx8ICF1c2VyU2lnbmluZ0tleS5kZXJpdmF0aW9uUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHRoZSB1c2VyIGtleWNoYWluLiBQbGVhc2UgY29udGFjdCBzdXBwb3J0QGJpdGdvLmNvbS4nKTtcbiAgICB9XG4gICAgY29uc3QgdXNlckVjZGhLZXljaGFpbiA9IGF3YWl0IGJpdGdvLmdldEVDREhLZXljaGFpbih1c2VyU2lnbmluZ0tleS5lY2RoS2V5Y2hhaW4pO1xuICAgIGxldCB4cHJ2O1xuICAgIHRyeSB7XG4gICAgICB4cHJ2ID0gYml0Z28uZGVjcnlwdCh7XG4gICAgICAgIHBhc3N3b3JkOiB1c2VyUGFzc3dvcmQsXG4gICAgICAgIGlucHV0OiB1c2VyRWNkaEtleWNoYWluLmVuY3J5cHRlZFhwcnYsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luY29ycmVjdCBwYXNzd29yZC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgICB9XG5cbiAgICAvLyBGZXRjaCBCaXRHbydzIGNoYWxsZW5nZSBhbmQgdmVyaWZ5XG4gICAgY29uc3QgYml0Z29DaGFsbGVuZ2VzV2l0aFByb29mcyA9IGF3YWl0IEVjZHNhVXRpbHMuZ2V0Qml0R29DaGFsbGVuZ2VzKGJpdGdvKTtcbiAgICBpZiAoIShhd2FpdCBFY2RzYVV0aWxzLnZlcmlmeUJpdEdvQ2hhbGxlbmdlcyhiaXRnb0NoYWxsZW5nZXNXaXRoUHJvb2ZzKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byB2ZXJpZnkgQml0R28ncyBjaGFsbGVuZ2UgbmVlZGVkIHRvIGVuYWJsZSBFQ0RTQSBzaWduaW5nLiBQbGVhc2UgY29udGFjdCBzdXBwb3J0QGJpdGdvLmNvbWBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHNpZ25lZEJpdEdvSW5zdENoYWxsZW5nZSA9IEVjZHNhVXRpbHMuc2lnbkNoYWxsZW5nZShcbiAgICAgIGJpdGdvQ2hhbGxlbmdlc1dpdGhQcm9vZnMuYml0Z29JbnN0aXR1dGlvbmFsSHNtLFxuICAgICAgeHBydixcbiAgICAgIHVzZXJTaWduaW5nS2V5LmRlcml2YXRpb25QYXRoXG4gICAgKTtcbiAgICBjb25zdCBzaWduZWRCaXRHb05pdHJvQ2hhbGxlbmdlID0gRWNkc2FVdGlscy5zaWduQ2hhbGxlbmdlKFxuICAgICAgYml0Z29DaGFsbGVuZ2VzV2l0aFByb29mcy5iaXRnb05pdHJvSHNtLFxuICAgICAgeHBydixcbiAgICAgIHVzZXJTaWduaW5nS2V5LmRlcml2YXRpb25QYXRoXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgYml0Z29JbnN0SHNtQWRtaW5TaWduYXR1cmU6IHNpZ25lZEJpdEdvSW5zdENoYWxsZW5nZSxcbiAgICAgIGJpdGdvTml0cm9Ic21BZG1pblNpZ25hdHVyZTogc2lnbmVkQml0R29OaXRyb0NoYWxsZW5nZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgbmVlZGVkIHRvIGVuYWJsZSBlY2RzYSBzaWduaW5nIG9uIHRoZSBlbnRlcnByaXNlLlxuICAgKiBJdCByZWNlaXZlcyB0aGUgZW50ZXJwcmlzZSBjaGFsbGVuZ2UgYW5kIHNpZ25hdHVyZXMgb2YgdmVyaWZpZWQgYml0Z28gcHJvb2ZzXG4gICAqIGFuZCB1cGxvYWRzIHRoZW0gb24gdGhlIGVudGVycHJpc2UuXG4gICAqIEBwYXJhbSBiaXRnb1xuICAgKiBAcGFyYW0gZW50SWQgLSBlbnRlcnByaXNlIGlkIHRvIGVuYWJsZSBlY2RzYSBzaWduaW5nIG9uXG4gICAqIEBwYXJhbSB1c2VyUGFzc3dvcmQgLSBlbnRlcnByaXNlIGFkbWluJ3MgbG9naW4gcHdcbiAgICogQHBhcmFtIGJpdGdvSW5zdENoYWxsZW5nZVByb29mU2lnbmF0dXJlIC0gc2lnbmF0dXJlIG9uIGJpdGdvJ3MgaW5zdGl0dXRpb25hbCBIU00gY2hhbGxlbmdlIGFmdGVyIHZlcmlmaWNhdGlvblxuICAgKiBAcGFyYW0gYml0Z29OaXRyb0NoYWxsZW5nZVByb29mU2lnbmF0dXJlIC0gc2lnbmF0dXJlIG9uIGJpdGdvJ3Mgbml0cm8gSFNNIGNoYWxsZW5nZSBhZnRlciB2ZXJpZmljYXRpb25cbiAgICogQHBhcmFtIGNoYWxsZW5nZSAtIG9wdGlvbmFsbHkgdXNlIHRoZSBjaGFsbGVuZ2UgZm9yIGVudGVycHJpc2UgY2hhbGxlbmdlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW5pdGlhdGVDaGFsbGVuZ2VzRm9yRW50ZXJwcmlzZShcbiAgICBiaXRnbzogQml0R29CYXNlLFxuICAgIGVudElkOiBzdHJpbmcsXG4gICAgdXNlclBhc3N3b3JkOiBzdHJpbmcsXG4gICAgYml0Z29JbnN0Q2hhbGxlbmdlUHJvb2ZTaWduYXR1cmU6IEJ1ZmZlcixcbiAgICBiaXRnb05pdHJvQ2hhbGxlbmdlUHJvb2ZTaWduYXR1cmU6IEJ1ZmZlcixcbiAgICBjaGFsbGVuZ2U/OiBOVGlsZGVcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gRmV0Y2ggdXNlcidzIGVjZGggcHVibGljIGtleWNoYWluIG5lZWRlZCBmb3Igc2lnbmluZyB0aGUgY2hhbGxlbmdlc1xuICAgIGNvbnN0IHVzZXJTaWduaW5nS2V5ID0gYXdhaXQgYml0Z28uZ2V0U2lnbmluZ0tleUZvclVzZXIoZW50SWQpO1xuICAgIGlmICghdXNlclNpZ25pbmdLZXkuZWNkaEtleWNoYWluIHx8ICF1c2VyU2lnbmluZ0tleS5kZXJpdmF0aW9uUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHRoZSB1c2VyIGtleWNoYWluLiBQbGVhc2UgY29udGFjdCBzdXBwb3J0QGJpdGdvLmNvbS4nKTtcbiAgICB9XG4gICAgY29uc3QgdXNlckVjZGhLZXljaGFpbiA9IGF3YWl0IGJpdGdvLmdldEVDREhLZXljaGFpbih1c2VyU2lnbmluZ0tleS5lY2RoS2V5Y2hhaW4pO1xuICAgIGxldCB4cHJ2O1xuICAgIHRyeSB7XG4gICAgICB4cHJ2ID0gYml0Z28uZGVjcnlwdCh7XG4gICAgICAgIHBhc3N3b3JkOiB1c2VyUGFzc3dvcmQsXG4gICAgICAgIGlucHV0OiB1c2VyRWNkaEtleWNoYWluLmVuY3J5cHRlZFhwcnYsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luY29ycmVjdCBwYXNzd29yZC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSBhbmQgc2lnbiBlbnRlcnByaXNlIGNoYWxsZW5nZVxuICAgIGNvbnN0IGVudENoYWxsZW5nZVdpdGhQcm9vZiA9IGNoYWxsZW5nZSA/PyAoYXdhaXQgZ2VuZXJhdGVOVGlsZGUoMzA3MikpO1xuXG4gICAgY29uc3Qgc2lnbmVkRW50ZXJwcmlzZUNoYWxsZW5nZSA9IEVjZHNhVXRpbHMuc2lnbkNoYWxsZW5nZShcbiAgICAgIHRoaXMuc2VyaWFsaXplTlRpbGRlKGVudENoYWxsZW5nZVdpdGhQcm9vZiksXG4gICAgICB4cHJ2LFxuICAgICAgdXNlclNpZ25pbmdLZXkuZGVyaXZhdGlvblBhdGhcbiAgICApO1xuXG4gICAgYXdhaXQgdGhpcy51cGxvYWRDaGFsbGVuZ2VzVG9FbnRlcnByaXNlKFxuICAgICAgYml0Z28sXG4gICAgICBlbnRJZCxcbiAgICAgIHRoaXMuc2VyaWFsaXplTlRpbGRlKGVudENoYWxsZW5nZVdpdGhQcm9vZiksXG4gICAgICBzaWduZWRFbnRlcnByaXNlQ2hhbGxlbmdlLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGJpdGdvSW5zdENoYWxsZW5nZVByb29mU2lnbmF0dXJlLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGJpdGdvTml0cm9DaGFsbGVuZ2VQcm9vZlNpZ25hdHVyZS50b1N0cmluZygnaGV4JylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZHMgdGhlIHNpZ25lZCBjaGFsbGVuZ2VzIGFuZCB0aGVpciBwcm9vZnMgb24gdGhlIGVudGVycHJpc2UuXG4gICAqIFRoaXMgaW5pdGlhdGVzIGVjZHNhIHNpZ25pbmcgZm9yIHRoZSBlbnRlcnByaXNlIHVzZXJzLlxuICAgKiBAcGFyYW0gYml0Z29cbiAgICogQHBhcmFtIGVudElkIC0gZW50ZXJwcmlzZSB0byBlbmFibGUgZWNkc2Egc2lnbmluZyBvblxuICAgKiBAcGFyYW0gZW50Q2hhbGxlbmdlV2l0aFByb29mcyAtIGNsaWVudCBzaWRlIGdlbmVyYXRlZCBlbnQgY2hhbGxlbmdlIHdpdGggWksgcHJvb2ZzXG4gICAqIEBwYXJhbSBlbnRDaGFsbGVuZ2VTaWduYXR1cmUgLSBzaWduYXR1cmUgb24gZW50ZXJwcmlzZSBjaGFsbGVuZ2VcbiAgICogQHBhcmFtIGJpdGdvSW50Q2hhbGxlbmdlU2lnbmF0dXJlIC0gc2lnbmF0dXJlIG9uIEJpdEdvJ3MgaW5zdGl0dXRpb25hbCBIU00gY2hhbGxlbmdlXG4gICAqIEBwYXJhbSBiaXRnb05pdHJvQ2hhbGxlbmdlU2lnbmF0dXJlIC0gc2lnbmF0dXJlIG9uIEJpdEdvJ3Mgbml0cm8gSFNNIGNoYWxsZW5nZVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHVwbG9hZENoYWxsZW5nZXNUb0VudGVycHJpc2UoXG4gICAgYml0Z286IEJpdEdvQmFzZSxcbiAgICBlbnRJZDogc3RyaW5nLFxuICAgIGVudENoYWxsZW5nZVdpdGhQcm9vZnM6IE5UaWxkZVNoYXJlLFxuICAgIGVudENoYWxsZW5nZVNpZ25hdHVyZTogc3RyaW5nLFxuICAgIGJpdGdvSW50Q2hhbGxlbmdlU2lnbmF0dXJlOiBzdHJpbmcsXG4gICAgYml0Z29OaXRyb0NoYWxsZW5nZVNpZ25hdHVyZTogc3RyaW5nXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghZW50Q2hhbGxlbmdlV2l0aFByb29mcy5udGlsZGVQcm9vZikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGNoYWxsZW5nZSBwcm9vZnMgdG8gZW5hYmxlIEVDRFNBIHNpZ25pbmcuIFBsZWFzZSBjb250YWN0IHN1cHBvcnRAYml0Z28uY29tJyk7XG4gICAgfVxuICAgIGNvbnN0IGJvZHkgPSB7XG4gICAgICBlbnRlcnByaXNlOiB7XG4gICAgICAgIG50aWxkZTogZW50Q2hhbGxlbmdlV2l0aFByb29mcy5udGlsZGUsXG4gICAgICAgIGgxOiBlbnRDaGFsbGVuZ2VXaXRoUHJvb2ZzLmgxLFxuICAgICAgICBoMjogZW50Q2hhbGxlbmdlV2l0aFByb29mcy5oMixcbiAgICAgICAgbnRpbGRlUHJvb2Y6IHtcbiAgICAgICAgICBoMVdydEgyOiBlbnRDaGFsbGVuZ2VXaXRoUHJvb2ZzLm50aWxkZVByb29mLmgxV3J0SDIsXG4gICAgICAgICAgaDJXcnRIMTogZW50Q2hhbGxlbmdlV2l0aFByb29mcy5udGlsZGVQcm9vZi5oMldydEgxLFxuICAgICAgICB9LFxuICAgICAgICB2ZXJpZmllcnM6IHtcbiAgICAgICAgICBhZG1pblNpZ25hdHVyZTogZW50Q2hhbGxlbmdlU2lnbmF0dXJlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGJpdGdvSW5zdGl0dXRpb25hbEhzbToge1xuICAgICAgICB2ZXJpZmllcnM6IHtcbiAgICAgICAgICBhZG1pblNpZ25hdHVyZTogYml0Z29JbnRDaGFsbGVuZ2VTaWduYXR1cmUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYml0Z29OaXRyb0hzbToge1xuICAgICAgICB2ZXJpZmllcnM6IHtcbiAgICAgICAgICBhZG1pblNpZ25hdHVyZTogYml0Z29OaXRyb0NoYWxsZW5nZVNpZ25hdHVyZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBhd2FpdCBiaXRnb1xuICAgICAgLnB1dChiaXRnby51cmwoYC9lbnRlcnByaXNlLyR7ZW50SWR9L3Rzc2NvbmZpZy9lY2RzYS9jaGFsbGVuZ2VgLCAyKSlcbiAgICAgIC5zZW5kKGJvZHkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cbn1cbiJdfQ==