@bitgo-beta/abstract-utxo 1.6.1-alpha.239 → 1.6.1-alpha.240
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +6 -0
- package/CHANGELOG.md +61 -0
- package/dist/src/abstractUtxoCoin.d.ts +36 -48
- package/dist/src/abstractUtxoCoin.d.ts.map +1 -1
- package/dist/src/abstractUtxoCoin.js +18 -159
- package/dist/src/core/descriptor/psbt/assertSatisfiable.js +2 -3
- package/dist/src/core/descriptor/psbt/createPsbt.js +4 -5
- package/dist/src/core/descriptor/psbt/findDescriptors.js +2 -3
- package/dist/src/core/descriptor/psbt/parse.d.ts.map +1 -1
- package/dist/src/core/descriptor/psbt/parse.js +1 -1
- package/dist/src/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -1
- package/dist/src/descriptor/assertDescriptorWalletAddress.js +1 -1
- package/dist/src/descriptor/builder/builder.d.ts +1 -1
- package/dist/src/descriptor/builder/builder.d.ts.map +1 -1
- package/dist/src/descriptor/builder/builder.js +4 -2
- package/dist/src/descriptor/builder/parse.d.ts.map +1 -1
- package/dist/src/descriptor/builder/parse.js +34 -23
- package/dist/src/descriptor/descriptorWallet.d.ts +8 -8
- package/dist/src/descriptor/descriptorWallet.d.ts.map +1 -1
- package/dist/src/descriptor/descriptorWallet.js +4 -8
- package/dist/src/descriptor/index.d.ts +2 -1
- package/dist/src/descriptor/index.d.ts.map +1 -1
- package/dist/src/descriptor/index.js +4 -4
- package/dist/src/descriptor/validatePolicy.d.ts +14 -0
- package/dist/src/descriptor/validatePolicy.d.ts.map +1 -0
- package/dist/src/descriptor/validatePolicy.js +48 -0
- package/dist/src/index.d.ts +1 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -6
- package/dist/src/keychains.d.ts +46 -8
- package/dist/src/keychains.d.ts.map +1 -1
- package/dist/src/keychains.js +89 -5
- package/dist/src/recovery/RecoveryProvider.d.ts.map +1 -1
- package/dist/src/recovery/RecoveryProvider.js +1 -1
- package/dist/src/recovery/backupKeyRecovery.d.ts +4 -4
- package/dist/src/recovery/backupKeyRecovery.d.ts.map +1 -1
- package/dist/src/recovery/backupKeyRecovery.js +6 -7
- package/dist/src/recovery/crossChainRecovery.d.ts +1 -1
- package/dist/src/recovery/crossChainRecovery.d.ts.map +1 -1
- package/dist/src/recovery/crossChainRecovery.js +4 -4
- package/dist/src/sign.d.ts.map +1 -1
- package/dist/src/sign.js +1 -1
- package/dist/src/transaction/common/verifyPayGoAmount.d.ts +1 -0
- package/dist/src/transaction/common/verifyPayGoAmount.d.ts.map +1 -0
- package/dist/src/transaction/common/verifyPayGoAmount.js +1 -0
- package/dist/src/transaction/descriptor/index.d.ts +4 -0
- package/dist/src/transaction/descriptor/index.d.ts.map +1 -1
- package/dist/src/transaction/descriptor/index.js +10 -2
- package/dist/src/transaction/descriptor/parse.d.ts +14 -0
- package/dist/src/transaction/descriptor/parse.d.ts.map +1 -0
- package/dist/src/transaction/descriptor/parse.js +115 -0
- package/dist/src/transaction/descriptor/parseToAmountType.d.ts +13 -0
- package/dist/src/transaction/descriptor/parseToAmountType.d.ts.map +1 -0
- package/dist/src/transaction/descriptor/parseToAmountType.js +60 -0
- package/dist/src/transaction/descriptor/recipient.d.ts +5 -0
- package/dist/src/transaction/descriptor/recipient.d.ts.map +1 -0
- package/dist/src/transaction/descriptor/recipient.js +3 -0
- package/dist/src/transaction/descriptor/signPsbt.d.ts +25 -0
- package/dist/src/transaction/descriptor/signPsbt.d.ts.map +1 -0
- package/dist/src/transaction/descriptor/signPsbt.js +43 -0
- package/dist/src/transaction/descriptor/verifyTransaction.d.ts +33 -0
- package/dist/src/transaction/descriptor/verifyTransaction.d.ts.map +1 -0
- package/dist/src/transaction/descriptor/verifyTransaction.js +105 -0
- package/dist/src/transaction/explainTransaction.d.ts +1 -1
- package/dist/src/transaction/explainTransaction.d.ts.map +1 -1
- package/dist/src/transaction/explainTransaction.js +15 -3
- package/dist/src/transaction/fetchInputs.js +2 -3
- package/dist/src/transaction/fixedScript/explainTransaction.js +7 -11
- package/dist/src/transaction/fixedScript/index.d.ts +2 -1
- package/dist/src/transaction/fixedScript/index.d.ts.map +1 -1
- package/dist/src/transaction/fixedScript/index.js +4 -2
- package/dist/src/transaction/fixedScript/parseOutput.d.ts +8 -4
- package/dist/src/transaction/fixedScript/parseOutput.d.ts.map +1 -1
- package/dist/src/transaction/fixedScript/parseOutput.js +2 -3
- package/dist/src/transaction/fixedScript/parseTransaction.d.ts +5 -7
- package/dist/src/transaction/fixedScript/parseTransaction.d.ts.map +1 -1
- package/dist/src/transaction/fixedScript/parseTransaction.js +34 -38
- package/dist/src/transaction/fixedScript/signTransaction.d.ts +17 -0
- package/dist/src/transaction/fixedScript/signTransaction.d.ts.map +1 -0
- package/dist/src/transaction/fixedScript/signTransaction.js +138 -0
- package/dist/src/transaction/fixedScript/verifyTransaction.js +2 -3
- package/dist/src/transaction/outputDifference.d.ts +40 -0
- package/dist/src/transaction/outputDifference.d.ts.map +1 -0
- package/dist/src/transaction/outputDifference.js +47 -0
- package/dist/src/transaction/parseTransaction.js +3 -2
- package/dist/src/transaction/recipient.d.ts +1 -0
- package/dist/src/transaction/recipient.d.ts.map +1 -1
- package/dist/src/transaction/recipient.js +9 -1
- package/dist/src/transaction/signTransaction.d.ts +6 -0
- package/dist/src/transaction/signTransaction.d.ts.map +1 -0
- package/dist/src/transaction/signTransaction.js +102 -0
- package/dist/src/transaction/verifyTransaction.d.ts.map +1 -1
- package/dist/src/transaction/verifyTransaction.js +5 -2
- package/dist/src/verifyKey.d.ts +3 -2
- package/dist/src/verifyKey.d.ts.map +1 -1
- package/dist/src/verifyKey.js +3 -7
- package/dist/src/wallet.d.ts +12 -0
- package/dist/src/wallet.d.ts.map +1 -0
- package/dist/src/wallet.js +3 -0
- package/dist/test/core/descriptor/descriptor.utils.d.ts +2 -1
- package/dist/test/core/descriptor/descriptor.utils.d.ts.map +1 -1
- package/dist/test/core/descriptor/descriptor.utils.js +1 -1
- package/dist/test/core/descriptor/psbt/mock.utils.js +4 -6
- package/dist/test/core/descriptor/psbt/parse.js +3 -3
- package/dist/test/core/key.utils.d.ts.map +1 -1
- package/dist/test/core/key.utils.js +1 -1
- package/dist/test/core/toPlainObject.utils.d.ts +1 -1
- package/dist/test/core/toPlainObject.utils.d.ts.map +1 -1
- package/dist/test/core/toPlainObject.utils.js +3 -4
- package/dist/test/descriptor/builder.js +3 -1
- package/dist/test/descriptor/descriptorWallet.js +12 -9
- package/dist/test/transaction/descriptor/explainPsbt.js +3 -6
- package/dist/test/transaction/descriptor/fixtures.utils.d.ts +2 -0
- package/dist/test/transaction/descriptor/fixtures.utils.d.ts.map +1 -0
- package/dist/test/transaction/descriptor/fixtures.utils.js +12 -0
- package/dist/test/transaction/descriptor/outputDifference.d.ts +2 -0
- package/dist/test/transaction/descriptor/outputDifference.d.ts.map +1 -0
- package/dist/test/transaction/descriptor/outputDifference.js +76 -0
- package/dist/test/transaction/descriptor/parse.d.ts +2 -0
- package/dist/test/transaction/descriptor/parse.d.ts.map +1 -0
- package/dist/test/transaction/descriptor/parse.js +78 -0
- package/dist/test/transaction/descriptor/sign.d.ts +2 -0
- package/dist/test/transaction/descriptor/sign.d.ts.map +1 -0
- package/dist/test/transaction/descriptor/sign.js +33 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
- package/dist/test/outputDifference.d.ts +0 -2
- package/dist/test/outputDifference.d.ts.map +0 -1
- package/dist/test/outputDifference.js +0 -86
|
@@ -112,7 +112,6 @@ async function fetchAddressDetails({ reqId, disableNetworking, addressDetailsPre
|
|
|
112
112
|
return addressDetails;
|
|
113
113
|
}
|
|
114
114
|
async function parseOutput({ currentOutput, coin, txPrebuild, verification, keychainArray, wallet, txParams, customChange, reqId, }) {
|
|
115
|
-
var _a, _b;
|
|
116
115
|
const disableNetworking = !!verification.disableNetworking;
|
|
117
116
|
const currentAddress = currentOutput.address;
|
|
118
117
|
if (currentAddress === undefined) {
|
|
@@ -126,7 +125,7 @@ async function parseOutput({ currentOutput, coin, txPrebuild, verification, keyc
|
|
|
126
125
|
// attempt to grab the address details from either the prebuilt tx, or the verification params.
|
|
127
126
|
// If both of these are empty, then we will try to get the address details from bitgo instead
|
|
128
127
|
const addressDetailsPrebuild = lodash_1.default.get(txPrebuild, `txInfo.walletAddressDetails.${currentAddress}`, {});
|
|
129
|
-
const addressDetailsVerification =
|
|
128
|
+
const addressDetailsVerification = verification?.addresses?.[currentAddress] ?? {};
|
|
130
129
|
debug('Parsing address details for %s', currentAddress);
|
|
131
130
|
let currentAddressDetails = undefined;
|
|
132
131
|
let currentAddressType = undefined;
|
|
@@ -211,4 +210,4 @@ async function parseOutput({ currentOutput, coin, txPrebuild, verification, keyc
|
|
|
211
210
|
}));
|
|
212
211
|
}
|
|
213
212
|
}
|
|
214
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VPdXRwdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHJhbnNhY3Rpb24vZml4ZWRTY3JpcHQvcGFyc2VPdXRwdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUEyTUEsa0NBeUhDO0FBcFVELGtEQUE2QjtBQUM3QixvREFBdUI7QUFDdkIsbURBVThCO0FBQzlCLDZEQUFrRjtBQUVsRixNQUFNLEtBQUssR0FBRyxJQUFBLGVBQVEsRUFBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBTy9DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQUNILFNBQVMsaUJBQWlCLENBQUMsTUFBZSxFQUFFLGNBQXNCO0lBQ2hFLElBQUksZ0JBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxLQUFLLGNBQWMsRUFBRSxDQUFDO1FBQ2xGLEtBQUssQ0FBQyw2RUFBNkUsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNyRyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFVRDs7OztHQUlHO0FBQ0gsS0FBSyxVQUFVLHlCQUF5QixDQUFDLE1BQXdDO0lBQy9FLE1BQU0sRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFDdkYsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQzdCLGdCQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsV0FBVyxFQUFFLEVBQUUsY0FBYyxFQUFFO1lBQ3hDLFNBQVMsRUFBRSxnQkFBZ0I7WUFDM0IsT0FBTyxFQUFFLGNBQWM7U0FDeEIsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLEtBQUssQ0FBQywy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Q0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBkZWJ1Z0xpYiBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcbiAgQWRkcmVzc1ZlcmlmaWNhdGlvbkRhdGEsXG4gIElSZXF1ZXN0VHJhY2VyLFxuICBJbnZhbGlkQWRkcmVzc0Rlcml2YXRpb25Qcm9wZXJ0eUVycm9yLFxuICBJV2FsbGV0LFxuICBLZXljaGFpbixcbiAgVHJhbnNhY3Rpb25QcmVidWlsZCxcbiAgVW5leHBlY3RlZEFkZHJlc3NFcnJvcixcbiAgVmVyaWZpY2F0aW9uT3B0aW9ucyxcbiAgSVRyYW5zYWN0aW9uUmVjaXBpZW50LFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdFV0eG9Db2luLCBPdXRwdXQsIGlzV2FsbGV0T3V0cHV0IH0gZnJvbSAnLi4vLi4vYWJzdHJhY3RVdHhvQ29pbic7XG5cbmNvbnN0IGRlYnVnID0gZGVidWdMaWIoJ2JpdGdvOnYyOnBhcnNlb3V0cHV0Jyk7XG5cbmludGVyZmFjZSBIYW5kbGVWZXJpZnlBZGRyZXNzRXJyb3JSZXNwb25zZSB7XG4gIGV4dGVybmFsOiBib29sZWFuO1xuICBuZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ2hlY2sgYW4gYWRkcmVzcyB3aGljaCBmYWlsZWQgaW5pdGlhbCB2YWxpZGF0aW9uIHRvIHNlZSBpZiBpdCdzIHRoZSBiYXNlIGFkZHJlc3Mgb2YgYSBtaWdyYXRlZCB2MSBiY2ggd2FsbGV0LlxuICpcbiAqIFRoZSB3YWxsZXQgaW4gcXVlc3Rpb24gY291bGQgYmUgYSBtaWdyYXRlZCBTYWZlSEQgQkNIIHdhbGxldCwgYW5kIHRoZSB0cmFuc2FjdGlvbiB3ZVxuICogYXJlIGN1cnJlbnRseSBwYXJzaW5nIGlzIHRyeWluZyB0byBzcGVuZCBjaGFuZ2UgYmFjayB0byB0aGUgdjEgd2FsbGV0IGJhc2UgYWRkcmVzcy5cbiAqXG4gKiBJdCBkb2VzIHRoaXMgc2luY2Ugd2UgZG9uJ3QgYWxsb3cgbmV3IGFkZHJlc3MgY3JlYXRpb24gZm9yIHRoZXNlIHdhbGxldHMsXG4gKiBhbmQgaW5zdGVhZCByZXR1cm4gdGhlIGJhc2UgYWRkcmVzcyBmcm9tIHRoZSB2MSB3YWxsZXQgd2hlbiBhIG5ldyBhZGRyZXNzIGlzIHJlcXVlc3RlZC5cbiAqIElmIHRoaXMgbmV3IGFkZHJlc3MgaXMgcmVxdWVzdGVkIGZvciB0aGUgcHVycG9zZXMgb2Ygc3BlbmRpbmcgY2hhbmdlIGJhY2sgdG8gdGhlIHdhbGxldCxcbiAqIHRoZSBjaGFuZ2Ugd2lsbCBnbyB0byB0aGUgdjEgd2FsbGV0IGJhc2UgYWRkcmVzcy4gVGhpcyBhZGRyZXNzICppcyogb24gdGhlIHdhbGxldCxcbiAqIGJ1dCBpdCB3aWxsIHN0aWxsIGNhdXNlIGFuIGVycm9yIHRvIGJlIHRocm93biBieSB2ZXJpZnlBZGRyZXNzLCBzaW5jZSB0aGUgZGVyaXZhdGlvbiBwYXRoXG4gKiB1c2VkIGZvciB0aGlzIGFkZHJlc3MgaXMgbm9uLXN0YW5kYXJkLiAoSSBoYXZlIHNlZW4gdGhlc2UgYWRkcmVzc2VzIGRlcml2ZWQgdXNpbmcgcGF0aHMgbS8wLzAgYW5kIG0vMTAxLFxuICogd2hlcmVhcyB0aGUgdjIgYWRkcmVzc2VzIGFyZSBkZXJpdmVkIHVzaW5nIHBhdGggIG0vMC8wLyR7Y2hhaW59LyR7aW5kZXh9KS5cbiAqXG4gKiBUaGlzIG1lYW5zIHdlIG5lZWQgdG8gY2hlY2sgZm9yIHRoaXMgY2FzZSBleHBsaWNpdGx5IGluIHRoaXMgY2F0Y2ggYmxvY2ssIGFuZCBjbGFzc2lmeVxuICogdGhlc2UgdHlwZXMgb2Ygb3V0cHV0cyBhcyBpbnRlcm5hbCBpbnN0ZWFkIG9mIGV4dGVybmFsLiBGYWlsaW5nIHRvIGRvIHNvIHdvdWxkIGNhdXNlIHRoZVxuICogdHJhbnNhY3Rpb24ncyBpbXBsaWNpdCBleHRlcm5hbCBvdXRwdXRzIChpZSwgb3V0cHV0cyB3aGljaCBnbyB0byBhZGRyZXNzZXMgbm90IHNwZWNpZmllZCBpblxuICogdGhlIHJlY2lwaWVudHMgYXJyYXkpIHRvIGFkZCB1cCB0byBtb3JlIHRoYW4gdGhlIDE1MCBiYXNpcyBwb2ludCBsaW1pdCB3aGljaCB3ZSBlbmZvcmNlIG9uXG4gKiBwYXktYXMteW91LWdvIG91dHB1dHMgKHdoaWNoIHNob3VsZCBiZSB0aGUgb25seSBpbXBsaWNpdCBleHRlcm5hbCBvdXRwdXRzIG9uIG91ciB0cmFuc2FjdGlvbnMpLlxuICpcbiAqIFRoZSAxNTAgYmFzaXMgcG9pbnQgbGltaXQgZm9yIGltcGxpY2l0IGV4dGVybmFsIHNlbmRzIGlzIGVuZm9yY2VkIGluIHZlcmlmeVRyYW5zYWN0aW9uLFxuICogd2hpY2ggY2FsbHMgdGhpcyBmdW5jdGlvbiB0byBnZXQgaW5mb3JtYXRpb24gb24gdGhlIHRvdGFsIGV4dGVybmFsL2ludGVybmFsIHNwZW5kIGFtb3VudHNcbiAqIGZvciBhIHRyYW5zYWN0aW9uLiBUaGUgaWRlYSBoZXJlIGlzIHRvIHByb3RlY3QgZnJvbSB0aGUgdHJhbnNhY3Rpb24gYmVpbmcgbWFsaWNpb3VzbHkgbW9kaWZpZWRcbiAqIHRvIGFkZCBtb3JlIGltcGxpY2l0IGV4dGVybmFsIHNwZW5kcyAoZWcsIHRvIGFuIGF0dGFja2VyLWNvbnRyb2xsZWQgd2FsbGV0KS5cbiAqXG4gKiBTZWUgdmVyaWZ5VHJhbnNhY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRyYW5zYWN0aW9uIHByZWJ1aWxkcyBhcmUgdmVyaWZpZWQgYmVmb3JlIHNpZ25pbmcuXG4gKlxuICogQHBhcmFtIHdhbGxldCB7V2FsbGV0fSB3YWxsZXQgd2hpY2ggaXMgbWFraW5nIHRoZSB0cmFuc2FjdGlvblxuICogQHBhcmFtIGN1cnJlbnRBZGRyZXNzIHtzdHJpbmd9IGFkZHJlc3MgdG8gY2hlY2sgZm9yIGV4dGVybmFsaXR5IHJlbGF0aXZlIHRvIHYxIHdhbGxldCBiYXNlIGFkZHJlc3NcbiAqL1xuZnVuY3Rpb24gaXNNaWdyYXRlZEFkZHJlc3Mod2FsbGV0OiBJV2FsbGV0LCBjdXJyZW50QWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChfLmlzU3RyaW5nKHdhbGxldC5taWdyYXRlZEZyb20oKSkgJiYgd2FsbGV0Lm1pZ3JhdGVkRnJvbSgpID09PSBjdXJyZW50QWRkcmVzcykge1xuICAgIGRlYnVnKCdmb3VuZCBhZGRyZXNzICVzIHdoaWNoIHdhcyBtaWdyYXRlZCBmcm9tIHYxIHdhbGxldCwgYWRkcmVzcyBpcyBub3QgZXh0ZXJuYWwnLCBjdXJyZW50QWRkcmVzcyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmludGVyZmFjZSBWZXJpZnlDdXN0b21DaGFuZ2VBZGRyZXNzT3B0aW9ucyB7XG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW47XG4gIGN1c3RvbUNoYW5nZUtleXM6IEhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvck9wdGlvbnNbJ2N1c3RvbUNoYW5nZUtleXMnXTtcbiAgYWRkcmVzc1R5cGU6IEhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvck9wdGlvbnNbJ2FkZHJlc3NUeXBlJ107XG4gIGFkZHJlc3NEZXRhaWxzOiBIYW5kbGVWZXJpZnlBZGRyZXNzRXJyb3JPcHRpb25zWydhZGRyZXNzRGV0YWlscyddO1xuICBjdXJyZW50QWRkcmVzczogSGFuZGxlVmVyaWZ5QWRkcmVzc0Vycm9yT3B0aW9uc1snY3VycmVudEFkZHJlc3MnXTtcbn1cblxuLyoqXG4gKiBDaGVjayB0byBzZWUgaWYgYW4gYWRkcmVzcyBpcyBkZXJpdmVkIGZyb20gdGhlIGdpdmVuIGN1c3RvbSBjaGFuZ2Uga2V5c1xuICogQHBhcmFtIHtWZXJpZnlDdXN0b21DaGFuZ2VBZGRyZXNzT3B0aW9uc30gcGFyYW1zXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlDdXN0b21DaGFuZ2VBZGRyZXNzKHBhcmFtczogVmVyaWZ5Q3VzdG9tQ2hhbmdlQWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgeyBjb2luLCBjdXN0b21DaGFuZ2VLZXlzLCBhZGRyZXNzVHlwZSwgYWRkcmVzc0RldGFpbHMsIGN1cnJlbnRBZGRyZXNzIH0gPSBwYXJhbXM7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGNvaW4udmVyaWZ5QWRkcmVzcyhcbiAgICAgIF8uZXh0ZW5kKHsgYWRkcmVzc1R5cGUgfSwgYWRkcmVzc0RldGFpbHMsIHtcbiAgICAgICAga2V5Y2hhaW5zOiBjdXN0b21DaGFuZ2VLZXlzLFxuICAgICAgICBhZGRyZXNzOiBjdXJyZW50QWRkcmVzcyxcbiAgICAgIH0pXG4gICAgKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGRlYnVnKCdmYWlsZWQgdG8gdmVyaWZ5IGN1c3RvbSBjaGFuZ2UgYWRkcmVzcyAlcycsIGN1cnJlbnRBZGRyZXNzKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuaW50ZXJmYWNlIEhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvck9wdGlvbnMge1xuICBlOiBFcnJvcjtcbiAgY3VycmVudEFkZHJlc3M6IHN0cmluZztcbiAgd2FsbGV0OiBJV2FsbGV0O1xuICB0eFBhcmFtczoge1xuICAgIGNoYW5nZUFkZHJlc3M/OiBzdHJpbmc7XG4gIH07XG4gIGN1c3RvbUNoYW5nZUtleXM/OiBDdXN0b21DaGFuZ2VPcHRpb25zWydrZXlzJ107XG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW47XG4gIGFkZHJlc3NEZXRhaWxzPzogYW55O1xuICBhZGRyZXNzVHlwZT86IHN0cmluZztcbiAgY29uc2lkZXJNaWdyYXRlZEZyb21BZGRyZXNzSW50ZXJuYWw/OiBib29sZWFuO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVWZXJpZnlBZGRyZXNzRXJyb3Ioe1xuICBlLFxuICBjdXJyZW50QWRkcmVzcyxcbiAgd2FsbGV0LFxuICB0eFBhcmFtcyxcbiAgY3VzdG9tQ2hhbmdlS2V5cyxcbiAgY29pbixcbiAgYWRkcmVzc0RldGFpbHMsXG4gIGFkZHJlc3NUeXBlLFxuICBjb25zaWRlck1pZ3JhdGVkRnJvbUFkZHJlc3NJbnRlcm5hbCxcbn06IEhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvck9wdGlvbnMpOiBQcm9taXNlPEhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvclJlc3BvbnNlPiB7XG4gIC8vIFRvZG86IG5hbWUgc2VydmVyLXNpZGUgZXJyb3JzIHRvIGF2b2lkIG1lc3NhZ2UtYmFzZWQgY2hlY2tpbmcgW0JHLTUxMjRdXG4gIGNvbnN0IHdhbGxldEFkZHJlc3NOb3RGb3VuZCA9IGUubWVzc2FnZS5pbmNsdWRlcygnd2FsbGV0IGFkZHJlc3Mgbm90IGZvdW5kJyk7XG4gIGNvbnN0IHVuZXhwZWN0ZWRBZGRyZXNzID0gZSBpbnN0YW5jZW9mIFVuZXhwZWN0ZWRBZGRyZXNzRXJyb3I7XG4gIGlmICh3YWxsZXRBZGRyZXNzTm90Rm91bmQgfHwgdW5leHBlY3RlZEFkZHJlc3MpIHtcbiAgICBpZiAodW5leHBlY3RlZEFkZHJlc3MgJiYgIXdhbGxldEFkZHJlc3NOb3RGb3VuZCkge1xuICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSBtaWdyYXRlZCB2MSBiY2ggYWRkcmVzcyAtIGl0IGNvdWxkIGJlIGludGVybmFsXG4gICAgICBjb25zdCBpc01pZ3JhdGVkID0gaXNNaWdyYXRlZEFkZHJlc3Mod2FsbGV0LCBjdXJyZW50QWRkcmVzcyk7XG4gICAgICBpZiAoaXNNaWdyYXRlZCkge1xuICAgICAgICByZXR1cm4geyBleHRlcm5hbDogY29uc2lkZXJNaWdyYXRlZEZyb21BZGRyZXNzSW50ZXJuYWwgPT09IGZhbHNlIH07XG4gICAgICB9XG5cbiAgICAgIGRlYnVnKCdBZGRyZXNzICVzIHdhcyBmb3VuZCBvbiB3YWxsZXQgYnV0IGNvdWxkIG5vdCBiZSByZWNvbnN0cnVjdGVkJywgY3VycmVudEFkZHJlc3MpO1xuXG4gICAgICAvLyBhdHRlbXB0IHRvIHZlcmlmeSBhZGRyZXNzIHVzaW5nIGN1c3RvbSBjaGFuZ2UgYWRkcmVzcyBrZXlzIGlmIHRoZSB3YWxsZXQgaGFzIHRoYXQgZmVhdHVyZSBlbmFibGVkXG4gICAgICBpZiAoXG4gICAgICAgIGN1c3RvbUNoYW5nZUtleXMgJiZcbiAgICAgICAgKGF3YWl0IHZlcmlmeUN1c3RvbUNoYW5nZUFkZHJlc3MoeyBjb2luLCBhZGRyZXNzRGV0YWlscywgYWRkcmVzc1R5cGUsIGN1cnJlbnRBZGRyZXNzLCBjdXN0b21DaGFuZ2VLZXlzIH0pKVxuICAgICAgKSB7XG4gICAgICAgIC8vIGFkZHJlc3MgaXMgdmFsaWQgYWdhaW5zdCB0aGUgY3VzdG9tIGNoYW5nZSBrZXlzLiBNYXJrIGFkZHJlc3MgYXMgbm90IGV4dGVybmFsXG4gICAgICAgIC8vIGFuZCByZXF1ZXN0IHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZm9yIHRoZSBjdXN0b20gY2hhbmdlIGtleXNcbiAgICAgICAgZGVidWcoJ0FkZHJlc3MgJXMgdmVyaWZpZWQgYXMgZGVyaXZlZCBmcm9tIHRoZSBjdXN0b20gY2hhbmdlIGtleXMnLCBjdXJyZW50QWRkcmVzcyk7XG4gICAgICAgIHJldHVybiB7IGV4dGVybmFsOiBmYWxzZSwgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb246IHRydWUgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB0aGUgYWRkcmVzcyB3YXMgZm91bmQsIGJ1dCBub3Qgb24gdGhlIHdhbGxldCwgd2hpY2ggc2ltcGx5IG1lYW5zIGl0J3MgZXh0ZXJuYWxcbiAgICBkZWJ1ZygnQWRkcmVzcyAlcyBwcmVzdW1lZCBleHRlcm5hbCcsIGN1cnJlbnRBZGRyZXNzKTtcbiAgICByZXR1cm4geyBleHRlcm5hbDogdHJ1ZSB9O1xuICB9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBJbnZhbGlkQWRkcmVzc0Rlcml2YXRpb25Qcm9wZXJ0eUVycm9yICYmIGN1cnJlbnRBZGRyZXNzID09PSB0eFBhcmFtcy5jaGFuZ2VBZGRyZXNzKSB7XG4gICAgLy8gZXhwZWN0IHRvIHNlZSB0aGlzIGVycm9yIHdoZW4gcGFzc2luZyBpbiBhIGN1c3RvbSBjaGFuZ2VBZGRyZXNzIHdpdGggbm8gY2hhaW4gb3IgaW5kZXhcbiAgICByZXR1cm4geyBleHRlcm5hbDogZmFsc2UgfTtcbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoJ0FkZHJlc3MgY2xhc3NpZmljYXRpb24gZmFpbGVkIGZvciBhZGRyZXNzJywgY3VycmVudEFkZHJlc3MpO1xuICBjb25zb2xlLnRyYWNlKGUpO1xuICAvKipcbiAgICogSXQgbWlnaHQgYmUgYSBjb21wbGV0ZWx5IGludmFsaWQgYWRkcmVzcyBvciBhIGJhZCB2YWxpZGF0aW9uIGF0dGVtcHQgb3Igc29tZXRoaW5nIGVsc2UgY29tcGxldGVseSwgaW5cbiAgICogd2hpY2ggY2FzZSB3ZSBkbyBub3QgcHJvY2VlZCBhbmQgcmF0aGVyIHJldGhyb3cgdGhlIGVycm9yLCB3aGljaCBpcyBzYWZlciB0aGFuIGFzc3VtaW5nIHRoYXQgdGhlIGFkZHJlc3NcbiAgICogdmFsaWRhdGlvbiBmYWlsZWQgc2ltcGx5IGJlY2F1c2UgaXQncyBleHRlcm5hbCB0byB0aGUgd2FsbGV0LlxuICAgKi9cbiAgdGhyb3cgZTtcbn1cblxuaW50ZXJmYWNlIEZldGNoQWRkcmVzc0RldGFpbHNPcHRpb25zIHtcbiAgcmVxSWQ/OiBJUmVxdWVzdFRyYWNlcjtcbiAgZGlzYWJsZU5ldHdvcmtpbmc6IGJvb2xlYW47XG4gIGFkZHJlc3NEZXRhaWxzUHJlYnVpbGQ6IGFueTtcbiAgYWRkcmVzc0RldGFpbHNWZXJpZmljYXRpb246IGFueTtcbiAgY3VycmVudEFkZHJlc3M6IHN0cmluZztcbiAgd2FsbGV0OiBJV2FsbGV0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFkZHJlc3NEZXRhaWxzKHtcbiAgcmVxSWQsXG4gIGRpc2FibGVOZXR3b3JraW5nLFxuICBhZGRyZXNzRGV0YWlsc1ByZWJ1aWxkLFxuICBhZGRyZXNzRGV0YWlsc1ZlcmlmaWNhdGlvbixcbiAgY3VycmVudEFkZHJlc3MsXG4gIHdhbGxldCxcbn06IEZldGNoQWRkcmVzc0RldGFpbHNPcHRpb25zKSB7XG4gIGxldCBhZGRyZXNzRGV0YWlscyA9IF8uZXh0ZW5kKHt9LCBhZGRyZXNzRGV0YWlsc1ByZWJ1aWxkLCBhZGRyZXNzRGV0YWlsc1ZlcmlmaWNhdGlvbik7XG4gIGRlYnVnKCdMb2NhbGx5IGF2YWlsYWJsZSBhZGRyZXNzICVzIGRldGFpbHM6ICVPJywgY3VycmVudEFkZHJlc3MsIGFkZHJlc3NEZXRhaWxzKTtcbiAgaWYgKF8uaXNFbXB0eShhZGRyZXNzRGV0YWlscykgJiYgIWRpc2FibGVOZXR3b3JraW5nKSB7XG4gICAgYWRkcmVzc0RldGFpbHMgPSBhd2FpdCB3YWxsZXQuZ2V0QWRkcmVzcyh7IGFkZHJlc3M6IGN1cnJlbnRBZGRyZXNzLCByZXFJZCB9KTtcbiAgICBkZWJ1ZygnRG93bmxvYWRlZCBhZGRyZXNzICVzIGRldGFpbHM6ICVPJywgY3VycmVudEFkZHJlc3MsIGFkZHJlc3NEZXRhaWxzKTtcbiAgfVxuICByZXR1cm4gYWRkcmVzc0RldGFpbHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tQ2hhbmdlT3B0aW9ucyB7XG4gIGtleXM6IFtLZXljaGFpbiwgS2V5Y2hhaW4sIEtleWNoYWluXTtcbiAgc2lnbmF0dXJlczogW3N0cmluZywgc3RyaW5nLCBzdHJpbmddO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlT3V0cHV0T3B0aW9ucyB7XG4gIGN1cnJlbnRPdXRwdXQ6IE91dHB1dDtcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbjtcbiAgdHhQcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZDtcbiAgdmVyaWZpY2F0aW9uOiBWZXJpZmljYXRpb25PcHRpb25zO1xuICBrZXljaGFpbkFycmF5OiBbS2V5Y2hhaW4sIEtleWNoYWluLCBLZXljaGFpbl07XG4gIHdhbGxldDogSVdhbGxldDtcbiAgdHhQYXJhbXM6IHtcbiAgICByZWNpcGllbnRzOiBJVHJhbnNhY3Rpb25SZWNpcGllbnRbXTtcbiAgICBjaGFuZ2VBZGRyZXNzPzogc3RyaW5nO1xuICB9O1xuICBjdXN0b21DaGFuZ2U/OiBDdXN0b21DaGFuZ2VPcHRpb25zO1xuICByZXFJZD86IElSZXF1ZXN0VHJhY2VyO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VPdXRwdXQoe1xuICBjdXJyZW50T3V0cHV0LFxuICBjb2luLFxuICB0eFByZWJ1aWxkLFxuICB2ZXJpZmljYXRpb24sXG4gIGtleWNoYWluQXJyYXksXG4gIHdhbGxldCxcbiAgdHhQYXJhbXMsXG4gIGN1c3RvbUNoYW5nZSxcbiAgcmVxSWQsXG59OiBQYXJzZU91dHB1dE9wdGlvbnMpOiBQcm9taXNlPE91dHB1dD4ge1xuICBjb25zdCBkaXNhYmxlTmV0d29ya2luZyA9ICEhdmVyaWZpY2F0aW9uLmRpc2FibGVOZXR3b3JraW5nO1xuICBjb25zdCBjdXJyZW50QWRkcmVzcyA9IGN1cnJlbnRPdXRwdXQuYWRkcmVzcztcblxuICBpZiAoY3VycmVudEFkZHJlc3MgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdGhlIGFkZHJlc3MgaXMgdW5kZWZpbmVkLCBpdCBtZWFucyB0aGF0IHRoZSBvdXRwdXQgaGFzIGEgbm9uLWVuY29kZWFibGUgc2NyaXB0UHVia2V5XG4gICAgLy8gSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhlbiB3ZSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIGFtb3VudCBpcyAwIGFuZCB3ZSBjYW4gc2tpcCB0aGUgcmVzdC5cbiAgICBpZiAoY3VycmVudE91dHB1dC5hbW91bnQudG9TdHJpbmcoKSAhPT0gJzAnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ291dHB1dCB3aXRoIHVuZGVmaW5lZCBhZGRyZXNzIG11c3QgaGF2ZSBhbW91bnQgb2YgMCcpO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudE91dHB1dDtcbiAgfVxuXG4gIC8vIGF0dGVtcHQgdG8gZ3JhYiB0aGUgYWRkcmVzcyBkZXRhaWxzIGZyb20gZWl0aGVyIHRoZSBwcmVidWlsdCB0eCwgb3IgdGhlIHZlcmlmaWNhdGlvbiBwYXJhbXMuXG4gIC8vIElmIGJvdGggb2YgdGhlc2UgYXJlIGVtcHR5LCB0aGVuIHdlIHdpbGwgdHJ5IHRvIGdldCB0aGUgYWRkcmVzcyBkZXRhaWxzIGZyb20gYml0Z28gaW5zdGVhZFxuICBjb25zdCBhZGRyZXNzRGV0YWlsc1ByZWJ1aWxkID0gXy5nZXQodHhQcmVidWlsZCwgYHR4SW5mby53YWxsZXRBZGRyZXNzRGV0YWlscy4ke2N1cnJlbnRBZGRyZXNzfWAsIHt9KTtcbiAgY29uc3QgYWRkcmVzc0RldGFpbHNWZXJpZmljYXRpb246IEFkZHJlc3NWZXJpZmljYXRpb25EYXRhID0gdmVyaWZpY2F0aW9uPy5hZGRyZXNzZXM/LltjdXJyZW50QWRkcmVzc10gPz8ge307XG4gIGRlYnVnKCdQYXJzaW5nIGFkZHJlc3MgZGV0YWlscyBmb3IgJXMnLCBjdXJyZW50QWRkcmVzcyk7XG4gIGxldCBjdXJyZW50QWRkcmVzc0RldGFpbHMgPSB1bmRlZmluZWQ7XG4gIGxldCBjdXJyZW50QWRkcmVzc1R5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgY29uc3QgUkVDSVBJRU5UX1RIUkVTSE9MRCA9IDEwMDA7XG4gIHRyeSB7XG4gICAgLy8gSW4gdGhlIGNhc2Ugb2YgUFNCVHMsIHdlIGNhbiBhbHJlYWR5IGRldGVybWluZSB0aGUgaW50ZXJuYWwvZXh0ZXJuYWwgc3RhdHVzIG9mIHRoZSBvdXRwdXQgYWRkcmVzc2VzXG4gICAgLy8gYmFzZWQgb24gdGhlIGRlcml2YXRpb24gaW5mb3JtYXRpb24gYmVpbmcgaW5jbHVkZWQgaW4gdGhlIFBTQlQuIFdlIGNhbiBzaG9ydCBjaXJjdWl0IEdFVCB2Mi53YWxsZXQuYWRkcmVzc1xuICAgIC8vIGFuZCBzYXZlIG9uIG5ldHdvcmsgcmVxdWVzdHMuIFNpbmNlIHdlIGhhdmUgdGhlIGRlcml2YXRpb24gaW5mb3JtYXRpb24gYWxyZWFkeSwgd2UgY2FuIHN0aWxsIHZlcmlmeSB0aGUgYWRkcmVzc1xuICAgIGlmIChjdXJyZW50T3V0cHV0LmV4dGVybmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgd2UgaGF2ZSBhIGN1c3RvbSBjaGFuZ2Ugd2FsbGV0LCB3ZSBuZWVkIHRvIHZlcmlmeSB0aGUgYWRkcmVzcyBhZ2FpbnN0IHRoZSBjdXN0b20gY2hhbmdlIGtleXNcbiAgICAgIC8vIGFuZCBub3QgdGhlIHdhbGxldCBrZXlzLiBUaGlzIGNoZWNrIGlzIGRvbmUgaW4gdGhlIGhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvciBmdW5jdGlvbiBpZiB0aGlzIGVycm9yIGlzIHRocm93bi5cbiAgICAgIGlmIChjdXN0b21DaGFuZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEFkZHJlc3NFcnJvcignYGFkZHJlc3MgdmFsaWRhdGlvbiBmYWlsdXJlJyk7XG4gICAgICB9XG4gICAgICAvLyBJZiBpdCBpcyBhbiBpbnRlcm5hbCBhZGRyZXNzLCB3ZSBjYW4gc2tpcCB0aGUgbmV0d29yayByZXF1ZXN0IGFuZCBqdXN0IHZlcmlmeSB0aGUgYWRkcmVzcyBsb2NhbGx5IHdpdGggdGhlXG4gICAgICAvLyBkZXJpdmF0aW9uIGluZm9ybWF0aW9uIHdlIGhhdmUuIE90aGVyd2lzZSwgaWYgdGhlIGFkZHJlc3MgaXMgZXh0ZXJuYWwsIHdoaWNoIGlzIHRoZSBvbmx5IHJlbWFpbmluZyBjYXNlLCB3ZVxuICAgICAgLy8gY2FuIGp1c3QgcmV0dXJuIHRoZSBjdXJyZW50IG91dHB1dCBhcyBpcyB3aXRob3V0IGNvbnRhY3RpbmcgdGhlIHNlcnZlci5cbiAgICAgIGlmIChpc1dhbGxldE91dHB1dChjdXJyZW50T3V0cHV0KSkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjb2luLmlzV2FsbGV0QWRkcmVzcyh7XG4gICAgICAgICAgYWRkcmVzc1R5cGU6IEFic3RyYWN0VXR4b0NvaW4uaW5mZXJBZGRyZXNzVHlwZSh7IGNoYWluOiBjdXJyZW50T3V0cHV0LmNoYWluIH0pIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICBrZXljaGFpbnM6IGtleWNoYWluQXJyYXkgYXMgeyBwdWI6IHN0cmluZzsgY29tbW9uS2V5Y2hhaW4/OiBzdHJpbmcgfCB1bmRlZmluZWQgfVtdLFxuICAgICAgICAgIGFkZHJlc3M6IGN1cnJlbnRBZGRyZXNzLFxuICAgICAgICAgIGNoYWluOiBjdXJyZW50T3V0cHV0LmNoYWluLFxuICAgICAgICAgIGluZGV4OiBjdXJyZW50T3V0cHV0LmluZGV4LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFyZXMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEFkZHJlc3NFcnJvcigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY3VycmVudE91dHB1dDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG9ubHkgd2F5IHRvIGRldGVybWluZSB3aGV0aGVyIGFuIGFkZHJlc3MgaXMga25vd24gb24gdGhlIHdhbGxldCBpcyB0byBpbml0aWF0ZSBhIG5ldHdvcmsgcmVxdWVzdCBhbmRcbiAgICAgKiBmZXRjaCBpdC4gU2hvdWxkIHRoZSByZXF1ZXN0IGZhaWwgYW5kIHJldHVybiBhIDQwNCwgaXQgd2lsbCB0aHJvdyBhbmQgdGhlcmVmb3JlIGhhcyB0byBiZSBjYXVnaHQuIEZvciB0aGF0XG4gICAgICogcmVhc29uLCBhZGRyZXNzIHdhbGxldCBvd25lcnNoaXAgZGV0ZWN0aW9uIGlzIHdyYXBwZWQgaW4gYSB0cnkvY2F0Y2guIEFkZGl0aW9uYWxseSwgb25jZSB0aGUgYWRkcmVzc1xuICAgICAqIGRldGFpbHMgYXJlIGZldGNoZWQgb24gdGhlIHdhbGxldCwgYSBsb2NhbCBhZGRyZXNzIHZhbGlkYXRpb24gaXMgcnVuLCB3aG9zZSBlcnJvcnMgaG93ZXZlciBhcmUgZ2VuZXJhdGVkXG4gICAgICogY2xpZW50LXNpZGUgYW5kIGNhbiB0aGVyZWZvcmUgYmUgYW5hbHl6ZWQgd2l0aCBtb3JlIGdyYW51bGFyaXR5IGFuZCB0eXBlIGNoZWNraW5nLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogSW4gb3JkZXIgdG8gbWluaW1pemUgQVBJIHJlcXVlc3RzLCB3ZSBhc3N1bWUgdGhhdCBleHBsaWNpdCByZWNpcGllbnRzIGFyZSBhbHdheXMgZXh0ZXJuYWwgd2hlbiB0aGVcbiAgICAgKiByZWNpcGllbnQgbGlzdCBpcyA+IDEwMDAgVGhpcyBpcyBub3QgYWx3YXlzIGEgdmFsaWQgYXNzdW1wdGlvbiBhbmQgY291bGQgbGVhZCBncmVhdGVyIGFwcGFyZW50IHNwZW5kIChidXQgbmV2ZXIgbG93ZXIpXG4gICAgICovXG4gICAgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHMgIT09IHVuZGVmaW5lZCAmJiB0eFBhcmFtcy5yZWNpcGllbnRzLmxlbmd0aCA+IFJFQ0lQSUVOVF9USFJFU0hPTEQpIHtcbiAgICAgIGNvbnN0IGlzQ3VycmVudEFkZHJlc3NJblJlY2lwaWVudHMgPSB0eFBhcmFtcy5yZWNpcGllbnRzLnNvbWUoKHJlY2lwaWVudCkgPT5cbiAgICAgICAgcmVjaXBpZW50LmFkZHJlc3MuaW5jbHVkZXMoY3VycmVudEFkZHJlc3MpXG4gICAgICApO1xuXG4gICAgICBpZiAoaXNDdXJyZW50QWRkcmVzc0luUmVjaXBpZW50cykge1xuICAgICAgICByZXR1cm4geyAuLi5jdXJyZW50T3V0cHV0IH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYWRkcmVzc0RldGFpbHMgPSBhd2FpdCBmZXRjaEFkZHJlc3NEZXRhaWxzKHtcbiAgICAgIHJlcUlkLFxuICAgICAgYWRkcmVzc0RldGFpbHNWZXJpZmljYXRpb24sXG4gICAgICBhZGRyZXNzRGV0YWlsc1ByZWJ1aWxkLFxuICAgICAgY3VycmVudEFkZHJlc3MsXG4gICAgICBkaXNhYmxlTmV0d29ya2luZyxcbiAgICAgIHdhbGxldCxcbiAgICB9KTtcbiAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgYWRkcmVzcyBpcyBvbiB0aGUgd2FsbGV0LiB2ZXJpZnlBZGRyZXNzIHRocm93cyBpZlxuICAgIC8vIGl0IGZhaWxzIHRvIGNvcnJlY3RseSByZWRlcml2ZSB0aGUgYWRkcmVzcywgbWVhbmluZyBpdCdzIGV4dGVybmFsXG4gICAgY3VycmVudEFkZHJlc3NUeXBlID0gQWJzdHJhY3RVdHhvQ29pbi5pbmZlckFkZHJlc3NUeXBlKGFkZHJlc3NEZXRhaWxzKSB8fCB1bmRlZmluZWQ7XG4gICAgY3VycmVudEFkZHJlc3NEZXRhaWxzID0gYWRkcmVzc0RldGFpbHM7XG4gICAgYXdhaXQgY29pbi52ZXJpZnlBZGRyZXNzKFxuICAgICAgXy5leHRlbmQoeyBhZGRyZXNzVHlwZTogY3VycmVudEFkZHJlc3NUeXBlIH0sIGFkZHJlc3NEZXRhaWxzLCB7XG4gICAgICAgIGtleWNoYWluczoga2V5Y2hhaW5BcnJheSxcbiAgICAgICAgYWRkcmVzczogY3VycmVudEFkZHJlc3MsXG4gICAgICB9KVxuICAgICk7XG4gICAgZGVidWcoJ0FkZHJlc3MgJXMgdmVyaWZpY2F0aW9uIHBhc3NlZCcsIGN1cnJlbnRBZGRyZXNzKTtcblxuICAgIC8vIHZlcmlmeSBhZGRyZXNzIHN1Y2NlZWRlZCB3aXRob3V0IHRocm93aW5nLCBzbyB0aGUgYWRkcmVzcyB3YXNcbiAgICAvLyBjb3JyZWN0bHkgcmVkZXJpdmVkIGZyb20gdGhlIHdhbGxldCBrZXljaGFpbnMsIG1ha2luZyBpdCBub3QgZXh0ZXJuYWxcbiAgICByZXR1cm4gXy5leHRlbmQoe30sIGN1cnJlbnRPdXRwdXQsIGFkZHJlc3NEZXRhaWxzLCB7IGV4dGVybmFsOiBmYWxzZSB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGRlYnVnKCdBZGRyZXNzICVzIHZlcmlmaWNhdGlvbiB0aHJldyBhbiBlcnJvcjonLCBjdXJyZW50QWRkcmVzcywgZSk7XG4gICAgcmV0dXJuIF8uZXh0ZW5kKFxuICAgICAge30sXG4gICAgICBjdXJyZW50T3V0cHV0LFxuICAgICAgYXdhaXQgaGFuZGxlVmVyaWZ5QWRkcmVzc0Vycm9yKHtcbiAgICAgICAgZSxcbiAgICAgICAgY29pbixcbiAgICAgICAgY3VycmVudEFkZHJlc3MsXG4gICAgICAgIHdhbGxldCxcbiAgICAgICAgdHhQYXJhbXMsXG4gICAgICAgIGN1c3RvbUNoYW5nZUtleXM6IGN1c3RvbUNoYW5nZSAmJiBjdXN0b21DaGFuZ2Uua2V5cyxcbiAgICAgICAgYWRkcmVzc0RldGFpbHM6IGN1cnJlbnRBZGRyZXNzRGV0YWlscyxcbiAgICAgICAgYWRkcmVzc1R5cGU6IGN1cnJlbnRBZGRyZXNzVHlwZSxcbiAgICAgICAgY29uc2lkZXJNaWdyYXRlZEZyb21BZGRyZXNzSW50ZXJuYWw6IHZlcmlmaWNhdGlvbi5jb25zaWRlck1pZ3JhdGVkRnJvbUFkZHJlc3NJbnRlcm5hbCxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIl19
|
|
213
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VPdXRwdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHJhbnNhY3Rpb24vZml4ZWRTY3JpcHQvcGFyc2VPdXRwdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUE0TUEsa0NBeUhDO0FBclVELGtEQUE2QjtBQUM3QixvREFBdUI7QUFDdkIsbURBVThCO0FBRTlCLDZEQUFrRjtBQUVsRixNQUFNLEtBQUssR0FBRyxJQUFBLGVBQVEsRUFBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBTy9DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQUNILFNBQVMsaUJBQWlCLENBQUMsTUFBZSxFQUFFLGNBQXNCO0lBQ2hFLElBQUksZ0JBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxLQUFLLGNBQWMsRUFBRSxDQUFDO1FBQ2xGLEtBQUssQ0FBQyw2RUFBNkUsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNyRyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFVRDs7OztHQUlHO0FBQ0gsS0FBSyxVQUFVLHlCQUF5QixDQUFDLE1BQXdDO0lBQy9FLE1BQU0sRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFDdkYsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQzdCLGdCQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsV0FBVyxFQUFFLEVBQUUsY0FBYyxFQUFFO1lBQ3hDLFNBQVMsRUFBRSxnQkFBZ0I7WUFDM0IsT0FBTyxFQUFFLGNBQWM7U0FDeEIsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLEtBQUssQ0FBQywy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cG9ydCBkZWJ1Z0xpYiBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcbiAgQWRkcmVzc1ZlcmlmaWNhdGlvbkRhdGEsXG4gIElSZXF1ZXN0VHJhY2VyLFxuICBJbnZhbGlkQWRkcmVzc0Rlcml2YXRpb25Qcm9wZXJ0eUVycm9yLFxuICBJV2FsbGV0LFxuICBUcmFuc2FjdGlvblByZWJ1aWxkLFxuICBVbmV4cGVjdGVkQWRkcmVzc0Vycm9yLFxuICBWZXJpZmljYXRpb25PcHRpb25zLFxuICBJVHJhbnNhY3Rpb25SZWNpcGllbnQsXG4gIFRyaXBsZSxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuXG5pbXBvcnQgeyBBYnN0cmFjdFV0eG9Db2luLCBPdXRwdXQsIGlzV2FsbGV0T3V0cHV0IH0gZnJvbSAnLi4vLi4vYWJzdHJhY3RVdHhvQ29pbic7XG5cbmNvbnN0IGRlYnVnID0gZGVidWdMaWIoJ2JpdGdvOnYyOnBhcnNlb3V0cHV0Jyk7XG5cbmludGVyZmFjZSBIYW5kbGVWZXJpZnlBZGRyZXNzRXJyb3JSZXNwb25zZSB7XG4gIGV4dGVybmFsOiBib29sZWFuO1xuICBuZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ2hlY2sgYW4gYWRkcmVzcyB3aGljaCBmYWlsZWQgaW5pdGlhbCB2YWxpZGF0aW9uIHRvIHNlZSBpZiBpdCdzIHRoZSBiYXNlIGFkZHJlc3Mgb2YgYSBtaWdyYXRlZCB2MSBiY2ggd2FsbGV0LlxuICpcbiAqIFRoZSB3YWxsZXQgaW4gcXVlc3Rpb24gY291bGQgYmUgYSBtaWdyYXRlZCBTYWZlSEQgQkNIIHdhbGxldCwgYW5kIHRoZSB0cmFuc2FjdGlvbiB3ZVxuICogYXJlIGN1cnJlbnRseSBwYXJzaW5nIGlzIHRyeWluZyB0byBzcGVuZCBjaGFuZ2UgYmFjayB0byB0aGUgdjEgd2FsbGV0IGJhc2UgYWRkcmVzcy5cbiAqXG4gKiBJdCBkb2VzIHRoaXMgc2luY2Ugd2UgZG9uJ3QgYWxsb3cgbmV3IGFkZHJlc3MgY3JlYXRpb24gZm9yIHRoZXNlIHdhbGxldHMsXG4gKiBhbmQgaW5zdGVhZCByZXR1cm4gdGhlIGJhc2UgYWRkcmVzcyBmcm9tIHRoZSB2MSB3YWxsZXQgd2hlbiBhIG5ldyBhZGRyZXNzIGlzIHJlcXVlc3RlZC5cbiAqIElmIHRoaXMgbmV3IGFkZHJlc3MgaXMgcmVxdWVzdGVkIGZvciB0aGUgcHVycG9zZXMgb2Ygc3BlbmRpbmcgY2hhbmdlIGJhY2sgdG8gdGhlIHdhbGxldCxcbiAqIHRoZSBjaGFuZ2Ugd2lsbCBnbyB0byB0aGUgdjEgd2FsbGV0IGJhc2UgYWRkcmVzcy4gVGhpcyBhZGRyZXNzICppcyogb24gdGhlIHdhbGxldCxcbiAqIGJ1dCBpdCB3aWxsIHN0aWxsIGNhdXNlIGFuIGVycm9yIHRvIGJlIHRocm93biBieSB2ZXJpZnlBZGRyZXNzLCBzaW5jZSB0aGUgZGVyaXZhdGlvbiBwYXRoXG4gKiB1c2VkIGZvciB0aGlzIGFkZHJlc3MgaXMgbm9uLXN0YW5kYXJkLiAoSSBoYXZlIHNlZW4gdGhlc2UgYWRkcmVzc2VzIGRlcml2ZWQgdXNpbmcgcGF0aHMgbS8wLzAgYW5kIG0vMTAxLFxuICogd2hlcmVhcyB0aGUgdjIgYWRkcmVzc2VzIGFyZSBkZXJpdmVkIHVzaW5nIHBhdGggIG0vMC8wLyR7Y2hhaW59LyR7aW5kZXh9KS5cbiAqXG4gKiBUaGlzIG1lYW5zIHdlIG5lZWQgdG8gY2hlY2sgZm9yIHRoaXMgY2FzZSBleHBsaWNpdGx5IGluIHRoaXMgY2F0Y2ggYmxvY2ssIGFuZCBjbGFzc2lmeVxuICogdGhlc2UgdHlwZXMgb2Ygb3V0cHV0cyBhcyBpbnRlcm5hbCBpbnN0ZWFkIG9mIGV4dGVybmFsLiBGYWlsaW5nIHRvIGRvIHNvIHdvdWxkIGNhdXNlIHRoZVxuICogdHJhbnNhY3Rpb24ncyBpbXBsaWNpdCBleHRlcm5hbCBvdXRwdXRzIChpZSwgb3V0cHV0cyB3aGljaCBnbyB0byBhZGRyZXNzZXMgbm90IHNwZWNpZmllZCBpblxuICogdGhlIHJlY2lwaWVudHMgYXJyYXkpIHRvIGFkZCB1cCB0byBtb3JlIHRoYW4gdGhlIDE1MCBiYXNpcyBwb2ludCBsaW1pdCB3aGljaCB3ZSBlbmZvcmNlIG9uXG4gKiBwYXktYXMteW91LWdvIG91dHB1dHMgKHdoaWNoIHNob3VsZCBiZSB0aGUgb25seSBpbXBsaWNpdCBleHRlcm5hbCBvdXRwdXRzIG9uIG91ciB0cmFuc2FjdGlvbnMpLlxuICpcbiAqIFRoZSAxNTAgYmFzaXMgcG9pbnQgbGltaXQgZm9yIGltcGxpY2l0IGV4dGVybmFsIHNlbmRzIGlzIGVuZm9yY2VkIGluIHZlcmlmeVRyYW5zYWN0aW9uLFxuICogd2hpY2ggY2FsbHMgdGhpcyBmdW5jdGlvbiB0byBnZXQgaW5mb3JtYXRpb24gb24gdGhlIHRvdGFsIGV4dGVybmFsL2ludGVybmFsIHNwZW5kIGFtb3VudHNcbiAqIGZvciBhIHRyYW5zYWN0aW9uLiBUaGUgaWRlYSBoZXJlIGlzIHRvIHByb3RlY3QgZnJvbSB0aGUgdHJhbnNhY3Rpb24gYmVpbmcgbWFsaWNpb3VzbHkgbW9kaWZpZWRcbiAqIHRvIGFkZCBtb3JlIGltcGxpY2l0IGV4dGVybmFsIHNwZW5kcyAoZWcsIHRvIGFuIGF0dGFja2VyLWNvbnRyb2xsZWQgd2FsbGV0KS5cbiAqXG4gKiBTZWUgdmVyaWZ5VHJhbnNhY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRyYW5zYWN0aW9uIHByZWJ1aWxkcyBhcmUgdmVyaWZpZWQgYmVmb3JlIHNpZ25pbmcuXG4gKlxuICogQHBhcmFtIHdhbGxldCB7V2FsbGV0fSB3YWxsZXQgd2hpY2ggaXMgbWFraW5nIHRoZSB0cmFuc2FjdGlvblxuICogQHBhcmFtIGN1cnJlbnRBZGRyZXNzIHtzdHJpbmd9IGFkZHJlc3MgdG8gY2hlY2sgZm9yIGV4dGVybmFsaXR5IHJlbGF0aXZlIHRvIHYxIHdhbGxldCBiYXNlIGFkZHJlc3NcbiAqL1xuZnVuY3Rpb24gaXNNaWdyYXRlZEFkZHJlc3Mod2FsbGV0OiBJV2FsbGV0LCBjdXJyZW50QWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChfLmlzU3RyaW5nKHdhbGxldC5taWdyYXRlZEZyb20oKSkgJiYgd2FsbGV0Lm1pZ3JhdGVkRnJvbSgpID09PSBjdXJyZW50QWRkcmVzcykge1xuICAgIGRlYnVnKCdmb3VuZCBhZGRyZXNzICVzIHdoaWNoIHdhcyBtaWdyYXRlZCBmcm9tIHYxIHdhbGxldCwgYWRkcmVzcyBpcyBub3QgZXh0ZXJuYWwnLCBjdXJyZW50QWRkcmVzcyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmludGVyZmFjZSBWZXJpZnlDdXN0b21DaGFuZ2VBZGRyZXNzT3B0aW9ucyB7XG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW47XG4gIGN1c3RvbUNoYW5nZUtleXM6IEhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvck9wdGlvbnNbJ2N1c3RvbUNoYW5nZUtleXMnXTtcbiAgYWRkcmVzc1R5cGU6IEhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvck9wdGlvbnNbJ2FkZHJlc3NUeXBlJ107XG4gIGFkZHJlc3NEZXRhaWxzOiBIYW5kbGVWZXJpZnlBZGRyZXNzRXJyb3JPcHRpb25zWydhZGRyZXNzRGV0YWlscyddO1xuICBjdXJyZW50QWRkcmVzczogSGFuZGxlVmVyaWZ5QWRkcmVzc0Vycm9yT3B0aW9uc1snY3VycmVudEFkZHJlc3MnXTtcbn1cblxuLyoqXG4gKiBDaGVjayB0byBzZWUgaWYgYW4gYWRkcmVzcyBpcyBkZXJpdmVkIGZyb20gdGhlIGdpdmVuIGN1c3RvbSBjaGFuZ2Uga2V5c1xuICogQHBhcmFtIHtWZXJpZnlDdXN0b21DaGFuZ2VBZGRyZXNzT3B0aW9uc30gcGFyYW1zXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlDdXN0b21DaGFuZ2VBZGRyZXNzKHBhcmFtczogVmVyaWZ5Q3VzdG9tQ2hhbmdlQWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgeyBjb2luLCBjdXN0b21DaGFuZ2VLZXlzLCBhZGRyZXNzVHlwZSwgYWRkcmVzc0RldGFpbHMsIGN1cnJlbnRBZGRyZXNzIH0gPSBwYXJhbXM7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGNvaW4udmVyaWZ5QWRkcmVzcyhcbiAgICAgIF8uZXh0ZW5kKHsgYWRkcmVzc1R5cGUgfSwgYWRkcmVzc0RldGFpbHMsIHtcbiAgICAgICAga2V5Y2hhaW5zOiBjdXN0b21DaGFuZ2VLZXlzLFxuICAgICAgICBhZGRyZXNzOiBjdXJyZW50QWRkcmVzcyxcbiAgICAgIH0pXG4gICAgKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGRlYnVnKCdmYWlsZWQgdG8gdmVyaWZ5IGN1c3RvbSBjaGFuZ2UgYWRkcmVzcyAlcycsIGN1cnJlbnRBZGRyZXNzKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuaW50ZXJmYWNlIEhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvck9wdGlvbnMge1xuICBlOiBFcnJvcjtcbiAgY3VycmVudEFkZHJlc3M6IHN0cmluZztcbiAgd2FsbGV0OiBJV2FsbGV0O1xuICB0eFBhcmFtczoge1xuICAgIGNoYW5nZUFkZHJlc3M/OiBzdHJpbmc7XG4gIH07XG4gIGN1c3RvbUNoYW5nZUtleXM/OiBDdXN0b21DaGFuZ2VPcHRpb25zWydrZXlzJ107XG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW47XG4gIGFkZHJlc3NEZXRhaWxzPzogYW55O1xuICBhZGRyZXNzVHlwZT86IHN0cmluZztcbiAgY29uc2lkZXJNaWdyYXRlZEZyb21BZGRyZXNzSW50ZXJuYWw/OiBib29sZWFuO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVWZXJpZnlBZGRyZXNzRXJyb3Ioe1xuICBlLFxuICBjdXJyZW50QWRkcmVzcyxcbiAgd2FsbGV0LFxuICB0eFBhcmFtcyxcbiAgY3VzdG9tQ2hhbmdlS2V5cyxcbiAgY29pbixcbiAgYWRkcmVzc0RldGFpbHMsXG4gIGFkZHJlc3NUeXBlLFxuICBjb25zaWRlck1pZ3JhdGVkRnJvbUFkZHJlc3NJbnRlcm5hbCxcbn06IEhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvck9wdGlvbnMpOiBQcm9taXNlPEhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvclJlc3BvbnNlPiB7XG4gIC8vIFRvZG86IG5hbWUgc2VydmVyLXNpZGUgZXJyb3JzIHRvIGF2b2lkIG1lc3NhZ2UtYmFzZWQgY2hlY2tpbmcgW0JHLTUxMjRdXG4gIGNvbnN0IHdhbGxldEFkZHJlc3NOb3RGb3VuZCA9IGUubWVzc2FnZS5pbmNsdWRlcygnd2FsbGV0IGFkZHJlc3Mgbm90IGZvdW5kJyk7XG4gIGNvbnN0IHVuZXhwZWN0ZWRBZGRyZXNzID0gZSBpbnN0YW5jZW9mIFVuZXhwZWN0ZWRBZGRyZXNzRXJyb3I7XG4gIGlmICh3YWxsZXRBZGRyZXNzTm90Rm91bmQgfHwgdW5leHBlY3RlZEFkZHJlc3MpIHtcbiAgICBpZiAodW5leHBlY3RlZEFkZHJlc3MgJiYgIXdhbGxldEFkZHJlc3NOb3RGb3VuZCkge1xuICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSBtaWdyYXRlZCB2MSBiY2ggYWRkcmVzcyAtIGl0IGNvdWxkIGJlIGludGVybmFsXG4gICAgICBjb25zdCBpc01pZ3JhdGVkID0gaXNNaWdyYXRlZEFkZHJlc3Mod2FsbGV0LCBjdXJyZW50QWRkcmVzcyk7XG4gICAgICBpZiAoaXNNaWdyYXRlZCkge1xuICAgICAgICByZXR1cm4geyBleHRlcm5hbDogY29uc2lkZXJNaWdyYXRlZEZyb21BZGRyZXNzSW50ZXJuYWwgPT09IGZhbHNlIH07XG4gICAgICB9XG5cbiAgICAgIGRlYnVnKCdBZGRyZXNzICVzIHdhcyBmb3VuZCBvbiB3YWxsZXQgYnV0IGNvdWxkIG5vdCBiZSByZWNvbnN0cnVjdGVkJywgY3VycmVudEFkZHJlc3MpO1xuXG4gICAgICAvLyBhdHRlbXB0IHRvIHZlcmlmeSBhZGRyZXNzIHVzaW5nIGN1c3RvbSBjaGFuZ2UgYWRkcmVzcyBrZXlzIGlmIHRoZSB3YWxsZXQgaGFzIHRoYXQgZmVhdHVyZSBlbmFibGVkXG4gICAgICBpZiAoXG4gICAgICAgIGN1c3RvbUNoYW5nZUtleXMgJiZcbiAgICAgICAgKGF3YWl0IHZlcmlmeUN1c3RvbUNoYW5nZUFkZHJlc3MoeyBjb2luLCBhZGRyZXNzRGV0YWlscywgYWRkcmVzc1R5cGUsIGN1cnJlbnRBZGRyZXNzLCBjdXN0b21DaGFuZ2VLZXlzIH0pKVxuICAgICAgKSB7XG4gICAgICAgIC8vIGFkZHJlc3MgaXMgdmFsaWQgYWdhaW5zdCB0aGUgY3VzdG9tIGNoYW5nZSBrZXlzLiBNYXJrIGFkZHJlc3MgYXMgbm90IGV4dGVybmFsXG4gICAgICAgIC8vIGFuZCByZXF1ZXN0IHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZm9yIHRoZSBjdXN0b20gY2hhbmdlIGtleXNcbiAgICAgICAgZGVidWcoJ0FkZHJlc3MgJXMgdmVyaWZpZWQgYXMgZGVyaXZlZCBmcm9tIHRoZSBjdXN0b20gY2hhbmdlIGtleXMnLCBjdXJyZW50QWRkcmVzcyk7XG4gICAgICAgIHJldHVybiB7IGV4dGVybmFsOiBmYWxzZSwgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb246IHRydWUgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB0aGUgYWRkcmVzcyB3YXMgZm91bmQsIGJ1dCBub3Qgb24gdGhlIHdhbGxldCwgd2hpY2ggc2ltcGx5IG1lYW5zIGl0J3MgZXh0ZXJuYWxcbiAgICBkZWJ1ZygnQWRkcmVzcyAlcyBwcmVzdW1lZCBleHRlcm5hbCcsIGN1cnJlbnRBZGRyZXNzKTtcbiAgICByZXR1cm4geyBleHRlcm5hbDogdHJ1ZSB9O1xuICB9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBJbnZhbGlkQWRkcmVzc0Rlcml2YXRpb25Qcm9wZXJ0eUVycm9yICYmIGN1cnJlbnRBZGRyZXNzID09PSB0eFBhcmFtcy5jaGFuZ2VBZGRyZXNzKSB7XG4gICAgLy8gZXhwZWN0IHRvIHNlZSB0aGlzIGVycm9yIHdoZW4gcGFzc2luZyBpbiBhIGN1c3RvbSBjaGFuZ2VBZGRyZXNzIHdpdGggbm8gY2hhaW4gb3IgaW5kZXhcbiAgICByZXR1cm4geyBleHRlcm5hbDogZmFsc2UgfTtcbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoJ0FkZHJlc3MgY2xhc3NpZmljYXRpb24gZmFpbGVkIGZvciBhZGRyZXNzJywgY3VycmVudEFkZHJlc3MpO1xuICBjb25zb2xlLnRyYWNlKGUpO1xuICAvKipcbiAgICogSXQgbWlnaHQgYmUgYSBjb21wbGV0ZWx5IGludmFsaWQgYWRkcmVzcyBvciBhIGJhZCB2YWxpZGF0aW9uIGF0dGVtcHQgb3Igc29tZXRoaW5nIGVsc2UgY29tcGxldGVseSwgaW5cbiAgICogd2hpY2ggY2FzZSB3ZSBkbyBub3QgcHJvY2VlZCBhbmQgcmF0aGVyIHJldGhyb3cgdGhlIGVycm9yLCB3aGljaCBpcyBzYWZlciB0aGFuIGFzc3VtaW5nIHRoYXQgdGhlIGFkZHJlc3NcbiAgICogdmFsaWRhdGlvbiBmYWlsZWQgc2ltcGx5IGJlY2F1c2UgaXQncyBleHRlcm5hbCB0byB0aGUgd2FsbGV0LlxuICAgKi9cbiAgdGhyb3cgZTtcbn1cblxuaW50ZXJmYWNlIEZldGNoQWRkcmVzc0RldGFpbHNPcHRpb25zIHtcbiAgcmVxSWQ/OiBJUmVxdWVzdFRyYWNlcjtcbiAgZGlzYWJsZU5ldHdvcmtpbmc6IGJvb2xlYW47XG4gIGFkZHJlc3NEZXRhaWxzUHJlYnVpbGQ6IGFueTtcbiAgYWRkcmVzc0RldGFpbHNWZXJpZmljYXRpb246IGFueTtcbiAgY3VycmVudEFkZHJlc3M6IHN0cmluZztcbiAgd2FsbGV0OiBJV2FsbGV0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFkZHJlc3NEZXRhaWxzKHtcbiAgcmVxSWQsXG4gIGRpc2FibGVOZXR3b3JraW5nLFxuICBhZGRyZXNzRGV0YWlsc1ByZWJ1aWxkLFxuICBhZGRyZXNzRGV0YWlsc1ZlcmlmaWNhdGlvbixcbiAgY3VycmVudEFkZHJlc3MsXG4gIHdhbGxldCxcbn06IEZldGNoQWRkcmVzc0RldGFpbHNPcHRpb25zKSB7XG4gIGxldCBhZGRyZXNzRGV0YWlscyA9IF8uZXh0ZW5kKHt9LCBhZGRyZXNzRGV0YWlsc1ByZWJ1aWxkLCBhZGRyZXNzRGV0YWlsc1ZlcmlmaWNhdGlvbik7XG4gIGRlYnVnKCdMb2NhbGx5IGF2YWlsYWJsZSBhZGRyZXNzICVzIGRldGFpbHM6ICVPJywgY3VycmVudEFkZHJlc3MsIGFkZHJlc3NEZXRhaWxzKTtcbiAgaWYgKF8uaXNFbXB0eShhZGRyZXNzRGV0YWlscykgJiYgIWRpc2FibGVOZXR3b3JraW5nKSB7XG4gICAgYWRkcmVzc0RldGFpbHMgPSBhd2FpdCB3YWxsZXQuZ2V0QWRkcmVzcyh7IGFkZHJlc3M6IGN1cnJlbnRBZGRyZXNzLCByZXFJZCB9KTtcbiAgICBkZWJ1ZygnRG93bmxvYWRlZCBhZGRyZXNzICVzIGRldGFpbHM6ICVPJywgY3VycmVudEFkZHJlc3MsIGFkZHJlc3NEZXRhaWxzKTtcbiAgfVxuICByZXR1cm4gYWRkcmVzc0RldGFpbHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tQ2hhbmdlT3B0aW9ucyB7XG4gIGtleXM6IFRyaXBsZTx7IHB1Yjogc3RyaW5nIH0+O1xuICBzaWduYXR1cmVzOiBUcmlwbGU8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZU91dHB1dE9wdGlvbnMge1xuICBjdXJyZW50T3V0cHV0OiBPdXRwdXQ7XG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW47XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ7XG4gIHZlcmlmaWNhdGlvbjogVmVyaWZpY2F0aW9uT3B0aW9ucztcbiAga2V5Y2hhaW5BcnJheTogVHJpcGxlPHsgcHViOiBzdHJpbmcgfT47XG4gIHdhbGxldDogSVdhbGxldDtcbiAgdHhQYXJhbXM6IHtcbiAgICByZWNpcGllbnRzOiBJVHJhbnNhY3Rpb25SZWNpcGllbnRbXTtcbiAgICBjaGFuZ2VBZGRyZXNzPzogc3RyaW5nO1xuICB9O1xuICBjdXN0b21DaGFuZ2U/OiBDdXN0b21DaGFuZ2VPcHRpb25zO1xuICByZXFJZD86IElSZXF1ZXN0VHJhY2VyO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VPdXRwdXQoe1xuICBjdXJyZW50T3V0cHV0LFxuICBjb2luLFxuICB0eFByZWJ1aWxkLFxuICB2ZXJpZmljYXRpb24sXG4gIGtleWNoYWluQXJyYXksXG4gIHdhbGxldCxcbiAgdHhQYXJhbXMsXG4gIGN1c3RvbUNoYW5nZSxcbiAgcmVxSWQsXG59OiBQYXJzZU91dHB1dE9wdGlvbnMpOiBQcm9taXNlPE91dHB1dD4ge1xuICBjb25zdCBkaXNhYmxlTmV0d29ya2luZyA9ICEhdmVyaWZpY2F0aW9uLmRpc2FibGVOZXR3b3JraW5nO1xuICBjb25zdCBjdXJyZW50QWRkcmVzcyA9IGN1cnJlbnRPdXRwdXQuYWRkcmVzcztcblxuICBpZiAoY3VycmVudEFkZHJlc3MgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdGhlIGFkZHJlc3MgaXMgdW5kZWZpbmVkLCBpdCBtZWFucyB0aGF0IHRoZSBvdXRwdXQgaGFzIGEgbm9uLWVuY29kZWFibGUgc2NyaXB0UHVia2V5XG4gICAgLy8gSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhlbiB3ZSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIGFtb3VudCBpcyAwIGFuZCB3ZSBjYW4gc2tpcCB0aGUgcmVzdC5cbiAgICBpZiAoY3VycmVudE91dHB1dC5hbW91bnQudG9TdHJpbmcoKSAhPT0gJzAnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ291dHB1dCB3aXRoIHVuZGVmaW5lZCBhZGRyZXNzIG11c3QgaGF2ZSBhbW91bnQgb2YgMCcpO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudE91dHB1dDtcbiAgfVxuXG4gIC8vIGF0dGVtcHQgdG8gZ3JhYiB0aGUgYWRkcmVzcyBkZXRhaWxzIGZyb20gZWl0aGVyIHRoZSBwcmVidWlsdCB0eCwgb3IgdGhlIHZlcmlmaWNhdGlvbiBwYXJhbXMuXG4gIC8vIElmIGJvdGggb2YgdGhlc2UgYXJlIGVtcHR5LCB0aGVuIHdlIHdpbGwgdHJ5IHRvIGdldCB0aGUgYWRkcmVzcyBkZXRhaWxzIGZyb20gYml0Z28gaW5zdGVhZFxuICBjb25zdCBhZGRyZXNzRGV0YWlsc1ByZWJ1aWxkID0gXy5nZXQodHhQcmVidWlsZCwgYHR4SW5mby53YWxsZXRBZGRyZXNzRGV0YWlscy4ke2N1cnJlbnRBZGRyZXNzfWAsIHt9KTtcbiAgY29uc3QgYWRkcmVzc0RldGFpbHNWZXJpZmljYXRpb246IEFkZHJlc3NWZXJpZmljYXRpb25EYXRhID0gdmVyaWZpY2F0aW9uPy5hZGRyZXNzZXM/LltjdXJyZW50QWRkcmVzc10gPz8ge307XG4gIGRlYnVnKCdQYXJzaW5nIGFkZHJlc3MgZGV0YWlscyBmb3IgJXMnLCBjdXJyZW50QWRkcmVzcyk7XG4gIGxldCBjdXJyZW50QWRkcmVzc0RldGFpbHMgPSB1bmRlZmluZWQ7XG4gIGxldCBjdXJyZW50QWRkcmVzc1R5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgY29uc3QgUkVDSVBJRU5UX1RIUkVTSE9MRCA9IDEwMDA7XG4gIHRyeSB7XG4gICAgLy8gSW4gdGhlIGNhc2Ugb2YgUFNCVHMsIHdlIGNhbiBhbHJlYWR5IGRldGVybWluZSB0aGUgaW50ZXJuYWwvZXh0ZXJuYWwgc3RhdHVzIG9mIHRoZSBvdXRwdXQgYWRkcmVzc2VzXG4gICAgLy8gYmFzZWQgb24gdGhlIGRlcml2YXRpb24gaW5mb3JtYXRpb24gYmVpbmcgaW5jbHVkZWQgaW4gdGhlIFBTQlQuIFdlIGNhbiBzaG9ydCBjaXJjdWl0IEdFVCB2Mi53YWxsZXQuYWRkcmVzc1xuICAgIC8vIGFuZCBzYXZlIG9uIG5ldHdvcmsgcmVxdWVzdHMuIFNpbmNlIHdlIGhhdmUgdGhlIGRlcml2YXRpb24gaW5mb3JtYXRpb24gYWxyZWFkeSwgd2UgY2FuIHN0aWxsIHZlcmlmeSB0aGUgYWRkcmVzc1xuICAgIGlmIChjdXJyZW50T3V0cHV0LmV4dGVybmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgd2UgaGF2ZSBhIGN1c3RvbSBjaGFuZ2Ugd2FsbGV0LCB3ZSBuZWVkIHRvIHZlcmlmeSB0aGUgYWRkcmVzcyBhZ2FpbnN0IHRoZSBjdXN0b20gY2hhbmdlIGtleXNcbiAgICAgIC8vIGFuZCBub3QgdGhlIHdhbGxldCBrZXlzLiBUaGlzIGNoZWNrIGlzIGRvbmUgaW4gdGhlIGhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvciBmdW5jdGlvbiBpZiB0aGlzIGVycm9yIGlzIHRocm93bi5cbiAgICAgIGlmIChjdXN0b21DaGFuZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEFkZHJlc3NFcnJvcignYGFkZHJlc3MgdmFsaWRhdGlvbiBmYWlsdXJlJyk7XG4gICAgICB9XG4gICAgICAvLyBJZiBpdCBpcyBhbiBpbnRlcm5hbCBhZGRyZXNzLCB3ZSBjYW4gc2tpcCB0aGUgbmV0d29yayByZXF1ZXN0IGFuZCBqdXN0IHZlcmlmeSB0aGUgYWRkcmVzcyBsb2NhbGx5IHdpdGggdGhlXG4gICAgICAvLyBkZXJpdmF0aW9uIGluZm9ybWF0aW9uIHdlIGhhdmUuIE90aGVyd2lzZSwgaWYgdGhlIGFkZHJlc3MgaXMgZXh0ZXJuYWwsIHdoaWNoIGlzIHRoZSBvbmx5IHJlbWFpbmluZyBjYXNlLCB3ZVxuICAgICAgLy8gY2FuIGp1c3QgcmV0dXJuIHRoZSBjdXJyZW50IG91dHB1dCBhcyBpcyB3aXRob3V0IGNvbnRhY3RpbmcgdGhlIHNlcnZlci5cbiAgICAgIGlmIChpc1dhbGxldE91dHB1dChjdXJyZW50T3V0cHV0KSkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjb2luLmlzV2FsbGV0QWRkcmVzcyh7XG4gICAgICAgICAgYWRkcmVzc1R5cGU6IEFic3RyYWN0VXR4b0NvaW4uaW5mZXJBZGRyZXNzVHlwZSh7IGNoYWluOiBjdXJyZW50T3V0cHV0LmNoYWluIH0pIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICBrZXljaGFpbnM6IGtleWNoYWluQXJyYXksXG4gICAgICAgICAgYWRkcmVzczogY3VycmVudEFkZHJlc3MsXG4gICAgICAgICAgY2hhaW46IGN1cnJlbnRPdXRwdXQuY2hhaW4sXG4gICAgICAgICAgaW5kZXg6IGN1cnJlbnRPdXRwdXQuaW5kZXgsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXJlcykge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkQWRkcmVzc0Vycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjdXJyZW50T3V0cHV0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgb25seSB3YXkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW4gYWRkcmVzcyBpcyBrbm93biBvbiB0aGUgd2FsbGV0IGlzIHRvIGluaXRpYXRlIGEgbmV0d29yayByZXF1ZXN0IGFuZFxuICAgICAqIGZldGNoIGl0LiBTaG91bGQgdGhlIHJlcXVlc3QgZmFpbCBhbmQgcmV0dXJuIGEgNDA0LCBpdCB3aWxsIHRocm93IGFuZCB0aGVyZWZvcmUgaGFzIHRvIGJlIGNhdWdodC4gRm9yIHRoYXRcbiAgICAgKiByZWFzb24sIGFkZHJlc3Mgd2FsbGV0IG93bmVyc2hpcCBkZXRlY3Rpb24gaXMgd3JhcHBlZCBpbiBhIHRyeS9jYXRjaC4gQWRkaXRpb25hbGx5LCBvbmNlIHRoZSBhZGRyZXNzXG4gICAgICogZGV0YWlscyBhcmUgZmV0Y2hlZCBvbiB0aGUgd2FsbGV0LCBhIGxvY2FsIGFkZHJlc3MgdmFsaWRhdGlvbiBpcyBydW4sIHdob3NlIGVycm9ycyBob3dldmVyIGFyZSBnZW5lcmF0ZWRcbiAgICAgKiBjbGllbnQtc2lkZSBhbmQgY2FuIHRoZXJlZm9yZSBiZSBhbmFseXplZCB3aXRoIG1vcmUgZ3JhbnVsYXJpdHkgYW5kIHR5cGUgY2hlY2tpbmcuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBJbiBvcmRlciB0byBtaW5pbWl6ZSBBUEkgcmVxdWVzdHMsIHdlIGFzc3VtZSB0aGF0IGV4cGxpY2l0IHJlY2lwaWVudHMgYXJlIGFsd2F5cyBleHRlcm5hbCB3aGVuIHRoZVxuICAgICAqIHJlY2lwaWVudCBsaXN0IGlzID4gMTAwMCBUaGlzIGlzIG5vdCBhbHdheXMgYSB2YWxpZCBhc3N1bXB0aW9uIGFuZCBjb3VsZCBsZWFkIGdyZWF0ZXIgYXBwYXJlbnQgc3BlbmQgKGJ1dCBuZXZlciBsb3dlcilcbiAgICAgKi9cbiAgICBpZiAodHhQYXJhbXMucmVjaXBpZW50cyAhPT0gdW5kZWZpbmVkICYmIHR4UGFyYW1zLnJlY2lwaWVudHMubGVuZ3RoID4gUkVDSVBJRU5UX1RIUkVTSE9MRCkge1xuICAgICAgY29uc3QgaXNDdXJyZW50QWRkcmVzc0luUmVjaXBpZW50cyA9IHR4UGFyYW1zLnJlY2lwaWVudHMuc29tZSgocmVjaXBpZW50KSA9PlxuICAgICAgICByZWNpcGllbnQuYWRkcmVzcy5pbmNsdWRlcyhjdXJyZW50QWRkcmVzcylcbiAgICAgICk7XG5cbiAgICAgIGlmIChpc0N1cnJlbnRBZGRyZXNzSW5SZWNpcGllbnRzKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmN1cnJlbnRPdXRwdXQgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhZGRyZXNzRGV0YWlscyA9IGF3YWl0IGZldGNoQWRkcmVzc0RldGFpbHMoe1xuICAgICAgcmVxSWQsXG4gICAgICBhZGRyZXNzRGV0YWlsc1ZlcmlmaWNhdGlvbixcbiAgICAgIGFkZHJlc3NEZXRhaWxzUHJlYnVpbGQsXG4gICAgICBjdXJyZW50QWRkcmVzcyxcbiAgICAgIGRpc2FibGVOZXR3b3JraW5nLFxuICAgICAgd2FsbGV0LFxuICAgIH0pO1xuICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBhZGRyZXNzIGlzIG9uIHRoZSB3YWxsZXQuIHZlcmlmeUFkZHJlc3MgdGhyb3dzIGlmXG4gICAgLy8gaXQgZmFpbHMgdG8gY29ycmVjdGx5IHJlZGVyaXZlIHRoZSBhZGRyZXNzLCBtZWFuaW5nIGl0J3MgZXh0ZXJuYWxcbiAgICBjdXJyZW50QWRkcmVzc1R5cGUgPSBBYnN0cmFjdFV0eG9Db2luLmluZmVyQWRkcmVzc1R5cGUoYWRkcmVzc0RldGFpbHMpIHx8IHVuZGVmaW5lZDtcbiAgICBjdXJyZW50QWRkcmVzc0RldGFpbHMgPSBhZGRyZXNzRGV0YWlscztcbiAgICBhd2FpdCBjb2luLnZlcmlmeUFkZHJlc3MoXG4gICAgICBfLmV4dGVuZCh7IGFkZHJlc3NUeXBlOiBjdXJyZW50QWRkcmVzc1R5cGUgfSwgYWRkcmVzc0RldGFpbHMsIHtcbiAgICAgICAga2V5Y2hhaW5zOiBrZXljaGFpbkFycmF5LFxuICAgICAgICBhZGRyZXNzOiBjdXJyZW50QWRkcmVzcyxcbiAgICAgIH0pXG4gICAgKTtcbiAgICBkZWJ1ZygnQWRkcmVzcyAlcyB2ZXJpZmljYXRpb24gcGFzc2VkJywgY3VycmVudEFkZHJlc3MpO1xuXG4gICAgLy8gdmVyaWZ5IGFkZHJlc3Mgc3VjY2VlZGVkIHdpdGhvdXQgdGhyb3dpbmcsIHNvIHRoZSBhZGRyZXNzIHdhc1xuICAgIC8vIGNvcnJlY3RseSByZWRlcml2ZWQgZnJvbSB0aGUgd2FsbGV0IGtleWNoYWlucywgbWFraW5nIGl0IG5vdCBleHRlcm5hbFxuICAgIHJldHVybiBfLmV4dGVuZCh7fSwgY3VycmVudE91dHB1dCwgYWRkcmVzc0RldGFpbHMsIHsgZXh0ZXJuYWw6IGZhbHNlIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZGVidWcoJ0FkZHJlc3MgJXMgdmVyaWZpY2F0aW9uIHRocmV3IGFuIGVycm9yOicsIGN1cnJlbnRBZGRyZXNzLCBlKTtcbiAgICByZXR1cm4gXy5leHRlbmQoXG4gICAgICB7fSxcbiAgICAgIGN1cnJlbnRPdXRwdXQsXG4gICAgICBhd2FpdCBoYW5kbGVWZXJpZnlBZGRyZXNzRXJyb3Ioe1xuICAgICAgICBlLFxuICAgICAgICBjb2luLFxuICAgICAgICBjdXJyZW50QWRkcmVzcyxcbiAgICAgICAgd2FsbGV0LFxuICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgY3VzdG9tQ2hhbmdlS2V5czogY3VzdG9tQ2hhbmdlICYmIGN1c3RvbUNoYW5nZS5rZXlzLFxuICAgICAgICBhZGRyZXNzRGV0YWlsczogY3VycmVudEFkZHJlc3NEZXRhaWxzLFxuICAgICAgICBhZGRyZXNzVHlwZTogY3VycmVudEFkZHJlc3NUeXBlLFxuICAgICAgICBjb25zaWRlck1pZ3JhdGVkRnJvbUFkZHJlc3NJbnRlcm5hbDogdmVyaWZpY2F0aW9uLmNvbnNpZGVyTWlncmF0ZWRGcm9tQWRkcmVzc0ludGVybmFsLFxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iXX0=
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import { AbstractUtxoCoin,
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
*/
|
|
7
|
-
export declare function outputDifference(first: Output[], second: Output[]): Output[];
|
|
1
|
+
import { AbstractUtxoCoin, ParsedTransaction, ParseTransactionOptions } from '../../abstractUtxoCoin';
|
|
2
|
+
import { ComparableOutput } from '../outputDifference';
|
|
3
|
+
export type ComparableOutputWithExternal<TValue> = ComparableOutput<TValue> & {
|
|
4
|
+
external: boolean | undefined;
|
|
5
|
+
};
|
|
8
6
|
export declare function parseTransaction<TNumber extends bigint | number>(coin: AbstractUtxoCoin, params: ParseTransactionOptions<TNumber>): Promise<ParsedTransaction<TNumber>>;
|
|
9
7
|
//# sourceMappingURL=parseTransaction.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseTransaction.d.ts","sourceRoot":"","sources":["../../../../src/transaction/fixedScript/parseTransaction.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parseTransaction.d.ts","sourceRoot":"","sources":["../../../../src/transaction/fixedScript/parseTransaction.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,gBAAgB,EAIhB,iBAAiB,EACjB,uBAAuB,EACxB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,gBAAgB,EAAoB,MAAM,qBAAqB,CAAC;AAKzE,MAAM,MAAM,4BAA4B,CAAC,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC,GAAG;IAC5E,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B,CAAC;AAEF,wBAAsB,gBAAgB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EACpE,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,uBAAuB,CAAC,OAAO,CAAC,GACvC,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAwMrC"}
|
|
@@ -36,31 +36,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
36
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.outputDifference = outputDifference;
|
|
40
39
|
exports.parseTransaction = parseTransaction;
|
|
41
40
|
const assert_1 = __importDefault(require("assert"));
|
|
42
41
|
const lodash_1 = __importDefault(require("lodash"));
|
|
43
|
-
const parseOutput_1 = require("./parseOutput");
|
|
44
42
|
const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
|
|
45
43
|
const keychains_1 = require("../../keychains");
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
* @returns {Array} All outputs that are in the first array but not in the second
|
|
50
|
-
*/
|
|
51
|
-
function outputDifference(first, second) {
|
|
52
|
-
const keyFunc = ({ address, amount }) => `${address}:${amount}`;
|
|
53
|
-
const groupedOutputs = lodash_1.default.groupBy(first, keyFunc);
|
|
54
|
-
second.forEach((output) => {
|
|
55
|
-
const group = groupedOutputs[keyFunc(output)];
|
|
56
|
-
if (group) {
|
|
57
|
-
group.pop();
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
return lodash_1.default.flatten(lodash_1.default.values(groupedOutputs));
|
|
61
|
-
}
|
|
44
|
+
const outputDifference_1 = require("../outputDifference");
|
|
45
|
+
const recipient_1 = require("../recipient");
|
|
46
|
+
const parseOutput_1 = require("./parseOutput");
|
|
62
47
|
async function parseTransaction(coin, params) {
|
|
63
|
-
var _a;
|
|
64
48
|
const { txParams, txPrebuild, wallet, verification = {}, reqId } = params;
|
|
65
49
|
if (!lodash_1.default.isUndefined(verification.disableNetworking) && !lodash_1.default.isBoolean(verification.disableNetworking)) {
|
|
66
50
|
throw new Error('verification.disableNetworking must be a boolean');
|
|
@@ -74,10 +58,10 @@ async function parseTransaction(coin, params) {
|
|
|
74
58
|
}
|
|
75
59
|
keychains = await (0, keychains_1.fetchKeychains)(coin, wallet, reqId);
|
|
76
60
|
}
|
|
77
|
-
if (!
|
|
78
|
-
throw new Error('keychains
|
|
61
|
+
if (!keychains_1.UtxoNamedKeychains.is(keychains)) {
|
|
62
|
+
throw new Error('invalid keychains');
|
|
79
63
|
}
|
|
80
|
-
const keychainArray =
|
|
64
|
+
const keychainArray = (0, keychains_1.toKeychainTriple)(keychains);
|
|
81
65
|
if (lodash_1.default.isUndefined(txPrebuild.txHex)) {
|
|
82
66
|
throw new Error('missing required txPrebuild property txHex');
|
|
83
67
|
}
|
|
@@ -102,7 +86,7 @@ async function parseTransaction(coin, params) {
|
|
|
102
86
|
}
|
|
103
87
|
else {
|
|
104
88
|
// verify that each recipient from txParams has their own output
|
|
105
|
-
expectedOutputs = (
|
|
89
|
+
expectedOutputs = (txParams.recipients ?? []).flatMap((output) => {
|
|
106
90
|
if (output.address === undefined) {
|
|
107
91
|
if (output.amount.toString() !== '0') {
|
|
108
92
|
throw new Error(`Only zero amounts allowed for non-encodeable scriptPubkeys: ${output}`);
|
|
@@ -123,7 +107,6 @@ async function parseTransaction(coin, params) {
|
|
|
123
107
|
}));
|
|
124
108
|
}
|
|
125
109
|
}
|
|
126
|
-
const missingOutputs = outputDifference(expectedOutputs, allOutputs);
|
|
127
110
|
// get the keychains from the custom change wallet if needed
|
|
128
111
|
let customChange;
|
|
129
112
|
const { customChangeWalletId = undefined } = wallet.coinSpecific() || {};
|
|
@@ -168,16 +151,22 @@ async function parseTransaction(coin, params) {
|
|
|
168
151
|
reqId,
|
|
169
152
|
});
|
|
170
153
|
}));
|
|
171
|
-
const needsCustomChangeKeySignatureVerification = allOutputDetails.some((output) => output
|
|
154
|
+
const needsCustomChangeKeySignatureVerification = allOutputDetails.some((output) => output?.needsCustomChangeKeySignatureVerification);
|
|
172
155
|
const changeOutputs = lodash_1.default.filter(allOutputDetails, { external: false });
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
156
|
+
function toComparableOutputsWithExternal(outputs) {
|
|
157
|
+
return outputs.map((output) => ({
|
|
158
|
+
script: (0, recipient_1.fromExtendedAddressFormatToScript)(output.address, coin.network),
|
|
159
|
+
value: output.amount === 'max' ? 'max' : BigInt(output.amount),
|
|
160
|
+
external: output.external,
|
|
161
|
+
}));
|
|
162
|
+
}
|
|
163
|
+
const missingOutputs = (0, outputDifference_1.outputDifference)(toComparableOutputsWithExternal(expectedOutputs), toComparableOutputsWithExternal(allOutputs));
|
|
164
|
+
const implicitOutputs = (0, outputDifference_1.outputDifference)(toComparableOutputsWithExternal(allOutputDetails), toComparableOutputsWithExternal(expectedOutputs));
|
|
165
|
+
const explicitOutputs = (0, outputDifference_1.outputDifference)(toComparableOutputsWithExternal(allOutputDetails), implicitOutputs);
|
|
177
166
|
// these are all the non-wallet outputs that had been originally explicitly specified in recipients
|
|
178
|
-
const explicitExternalOutputs =
|
|
167
|
+
const explicitExternalOutputs = explicitOutputs.filter((output) => output.external);
|
|
179
168
|
// this is the sum of all the originally explicitly specified non-wallet output values
|
|
180
|
-
const explicitExternalSpendAmount = utxolib.bitgo.toTNumber(explicitExternalOutputs.reduce((sum, o) => sum + BigInt(o.
|
|
169
|
+
const explicitExternalSpendAmount = utxolib.bitgo.toTNumber(explicitExternalOutputs.reduce((sum, o) => sum + BigInt(o.value), BigInt(0)), coin.amountType);
|
|
181
170
|
/**
|
|
182
171
|
* The calculation of the implicit external spend amount pertains to verifying the pay-as-you-go-fee BitGo
|
|
183
172
|
* automatically applies to transactions sending money out of the wallet. The logic is fairly straightforward
|
|
@@ -188,15 +177,22 @@ async function parseTransaction(coin, params) {
|
|
|
188
177
|
*/
|
|
189
178
|
// make sure that all the extra addresses are change addresses
|
|
190
179
|
// get all the additional external outputs the server added and calculate their values
|
|
191
|
-
const implicitExternalOutputs =
|
|
192
|
-
const implicitExternalSpendAmount = utxolib.bitgo.toTNumber(implicitExternalOutputs.reduce((sum, o) => sum + BigInt(o.
|
|
180
|
+
const implicitExternalOutputs = implicitOutputs.filter((output) => output.external);
|
|
181
|
+
const implicitExternalSpendAmount = utxolib.bitgo.toTNumber(implicitExternalOutputs.reduce((sum, o) => sum + BigInt(o.value), BigInt(0)), coin.amountType);
|
|
182
|
+
function toOutputs(outputs) {
|
|
183
|
+
return outputs.map((output) => ({
|
|
184
|
+
address: (0, recipient_1.toExtendedAddressFormat)(output.script, coin.network),
|
|
185
|
+
amount: output.value.toString(),
|
|
186
|
+
external: output.external,
|
|
187
|
+
}));
|
|
188
|
+
}
|
|
193
189
|
return {
|
|
194
190
|
keychains,
|
|
195
|
-
keySignatures:
|
|
191
|
+
keySignatures: (0, keychains_1.getKeySignatures)(wallet) ?? {},
|
|
196
192
|
outputs: allOutputDetails,
|
|
197
|
-
missingOutputs,
|
|
198
|
-
explicitExternalOutputs,
|
|
199
|
-
implicitExternalOutputs,
|
|
193
|
+
missingOutputs: toOutputs(missingOutputs),
|
|
194
|
+
explicitExternalOutputs: toOutputs(explicitExternalOutputs),
|
|
195
|
+
implicitExternalOutputs: toOutputs(implicitExternalOutputs),
|
|
200
196
|
changeOutputs,
|
|
201
197
|
explicitExternalSpendAmount,
|
|
202
198
|
implicitExternalSpendAmount,
|
|
@@ -204,4 +200,4 @@ async function parseTransaction(coin, params) {
|
|
|
204
200
|
customChange,
|
|
205
201
|
};
|
|
206
202
|
}
|
|
207
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VUcmFuc2FjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90cmFuc2FjdGlvbi9maXhlZFNjcmlwdC9wYXJzZVRyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBLDRDQVlDO0FBRUQsNENBeUxDO0FBM05ELG9EQUE0QjtBQUM1QixvREFBdUI7QUFFdkIsK0NBQWlFO0FBQ2pFLDhEQUFnRDtBQVNoRCwrQ0FBbUU7QUFFbkU7Ozs7R0FJRztBQUNILFNBQWdCLGdCQUFnQixDQUFDLEtBQWUsRUFBRSxNQUFnQjtJQUNoRSxNQUFNLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBVSxFQUFVLEVBQUUsQ0FBQyxHQUFHLE9BQU8sSUFBSSxNQUFNLEVBQUUsQ0FBQztJQUNoRixNQUFNLGNBQWMsR0FBRyxnQkFBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFakQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQ3hCLE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM5QyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxnQkFBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFFTSxLQUFLLFVBQVUsZ0JBQWdCLENBQ3BDLElBQXNCLEVBQ3RCLE1BQXdDOztJQUV4QyxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsWUFBWSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FB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QUNoQixDQUFDO0lBRUY7Ozs7Ozs7T0FPRztJQUVILDhEQUE4RDtJQUM5RCxzRkFBc0Y7SUFDdEYsTUFBTSx1QkFBdUIsR0FBRyxnQkFBQyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5RSxNQUFNLDJCQUEyQixHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUN6RCx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFXLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQVcsRUFDdkcsSUFBSSxDQUFDLFVBQVUsQ0FDaEIsQ0FBQztJQUVGLE9BQU87UUFDTCxTQUFTO1FBQ1QsYUFBYSxFQUFFLGdCQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSx1QkFBdUIsRUFBRSxFQUFFLENBQUM7UUFDekQsT0FBTyxFQUFFLGdCQUFnQjtRQUN6QixjQUFjO1FBQ2QsdUJBQXVCO1FBQ3ZCLHVCQUF1QjtRQUN2QixhQUFhO1FBQ2IsMkJBQTJCO1FBQzNCLDJCQUEyQjtRQUMzQix5Q0FBeUM7UUFDekMsWUFBWTtLQUNiLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEtleWNoYWluLCBUcmlwbGUsIFZlcmlmaWNhdGlvbk9wdGlvbnMsIFdhbGxldCB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEN1c3RvbUNoYW5nZU9wdGlvbnMsIHBhcnNlT3V0cHV0IH0gZnJvbSAnLi9wYXJzZU91dHB1dCc7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7XG4gIEFic3RyYWN0VXR4b0NvaW4sXG4gIEZpeGVkU2NyaXB0V2FsbGV0T3V0cHV0LFxuICBPdXRwdXQsXG4gIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIFBhcnNlZFRyYW5zYWN0aW9uLFxuICBQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyxcbn0gZnJvbSAnLi4vLi4vYWJzdHJhY3RVdHhvQ29pbic7XG5pbXBvcnQgeyBmZXRjaEtleWNoYWlucywgdG9LZXljaGFpblRyaXBsZSB9IGZyb20gJy4uLy4uL2tleWNoYWlucyc7XG5cbi8qKlxuICogQHBhcmFtIGZpcnN0XG4gKiBAcGFyYW0gc2Vjb25kXG4gKiBAcmV0dXJucyB7QXJyYXl9IEFsbCBvdXRwdXRzIHRoYXQgYXJlIGluIHRoZSBmaXJzdCBhcnJheSBidXQgbm90IGluIHRoZSBzZWNvbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG91dHB1dERpZmZlcmVuY2UoZmlyc3Q6IE91dHB1dFtdLCBzZWNvbmQ6IE91dHB1dFtdKTogT3V0cHV0W10ge1xuICBjb25zdCBrZXlGdW5jID0gKHsgYWRkcmVzcywgYW1vdW50IH06IE91dHB1dCk6IHN0cmluZyA9PiBgJHthZGRyZXNzfToke2Ftb3VudH1gO1xuICBjb25zdCBncm91cGVkT3V0cHV0cyA9IF8uZ3JvdXBCeShmaXJzdCwga2V5RnVuYyk7XG5cbiAgc2Vjb25kLmZvckVhY2goKG91dHB1dCkgPT4ge1xuICAgIGNvbnN0IGdyb3VwID0gZ3JvdXBlZE91dHB1dHNba2V5RnVuYyhvdXRwdXQpXTtcbiAgICBpZiAoZ3JvdXApIHtcbiAgICAgIGdyb3VwLnBvcCgpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIF8uZmxhdHRlbihfLnZhbHVlcyhncm91cGVkT3V0cHV0cykpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VUcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgYmlnaW50IHwgbnVtYmVyPihcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgcGFyYW1zOiBQYXJzZVRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyPlxuKTogUHJvbWlzZTxQYXJzZWRUcmFuc2FjdGlvbjxUTnVtYmVyPj4ge1xuICBjb25zdCB7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQsIHZlcmlmaWNhdGlvbiA9IHt9LCByZXFJZCB9ID0gcGFyYW1zO1xuXG4gIGlmICghXy5pc1VuZGVmaW5lZCh2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcpICYmICFfLmlzQm9vbGVhbih2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcgbXVzdCBiZSBhIGJvb2xlYW4nKTtcbiAgfVxuICBjb25zdCBkaXNhYmxlTmV0d29ya2luZyA9IHZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZztcblxuICAvLyBvYnRhaW4gdGhlIGtleWNoYWlucyBhbmQga2V5IHNpZ25hdHVyZXNcbiAgbGV0IGtleWNoYWluczogVmVyaWZpY2F0aW9uT3B0aW9uc1sna2V5Y2hhaW5zJ10gfCB1bmRlZmluZWQgPSB2ZXJpZmljYXRpb24ua2V5Y2hhaW5zO1xuICBpZiAoIWtleWNoYWlucykge1xuICAgIGlmIChkaXNhYmxlTmV0d29ya2luZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgZmV0Y2gga2V5Y2hhaW5zIHdpdGhvdXQgbmV0d29ya2luZycpO1xuICAgIH1cbiAgICBrZXljaGFpbnMgPSBhd2FpdCBmZXRjaEtleWNoYWlucyhjb2luLCB3YWxsZXQsIHJlcUlkKTtcbiAgfVxuXG4gIGlmICgha2V5Y2hhaW5zIHx8ICFrZXljaGFpbnMudXNlciB8fCAha2V5Y2hhaW5zLmJhY2t1cCB8fCAha2V5Y2hhaW5zLmJpdGdvKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdrZXljaGFpbnMgYXJlIHJlcXVpcmVkLCBidXQgY291bGQgbm90IGJlIGZldGNoZWQnKTtcbiAgfVxuXG4gIGNvbnN0IGtleWNoYWluQXJyYXk6IFRyaXBsZTxLZXljaGFpbj4gPSBba2V5Y2hhaW5zLnVzZXIsIGtleWNoYWlucy5iYWNrdXAsIGtleWNoYWlucy5iaXRnb107XG5cbiAgaWYgKF8uaXNVbmRlZmluZWQodHhQcmVidWlsZC50eEhleCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgdHhQcmVidWlsZCBwcm9wZXJ0eSB0eEhleCcpO1xuICB9XG5cbiAgLy8gb2J0YWluIGFsbCBvdXRwdXRzXG4gIGNvbnN0IGV4cGxhbmF0aW9uOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uID0gYXdhaXQgY29pbi5leHBsYWluVHJhbnNhY3Rpb248VE51bWJlcj4oe1xuICAgIHR4SGV4OiB0eFByZWJ1aWxkLnR4SGV4LFxuICAgIHR4SW5mbzogdHhQcmVidWlsZC50eEluZm8sXG4gICAgcHViczoga2V5Y2hhaW5BcnJheS5tYXAoKGspID0+IGsucHViKSBhcyBUcmlwbGU8c3RyaW5nPixcbiAgfSk7XG5cbiAgY29uc3QgYWxsT3V0cHV0cyA9IFsuLi5leHBsYW5hdGlvbi5vdXRwdXRzLCAuLi5leHBsYW5hdGlvbi5jaGFuZ2VPdXRwdXRzXTtcblxuICBsZXQgZXhwZWN0ZWRPdXRwdXRzO1xuICBpZiAodHhQYXJhbXMucmJmVHhJZHMpIHtcbiAgICBhc3NlcnQodHhQYXJhbXMucmJmVHhJZHMubGVuZ3RoID09PSAxKTtcblxuICAgIGNvbnN0IHR4VG9CZVJlcGxhY2VkID0gYXdhaXQgd2FsbGV0LmdldFRyYW5zYWN0aW9uKHsgdHhIYXNoOiB0eFBhcmFtcy5yYmZUeElkc1swXSwgaW5jbHVkZVJiZjogdHJ1ZSB9KTtcbiAgICBleHBlY3RlZE91dHB1dHMgPSB0eFRvQmVSZXBsYWNlZC5vdXRwdXRzLmZsYXRNYXAoXG4gICAgICAob3V0cHV0OiB7IHZhbHVlU3RyaW5nOiBzdHJpbmc7IGFkZHJlc3M/OiBzdHJpbmc7IHdhbGxldD86IHN0cmluZyB9KSA9PiB7XG4gICAgICAgIC8vIEZvciBzZWxmLXNlbmRzLCB0aGUgd2FsbGV0SWQgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgd2FsbGV0J3MgaWRcbiAgICAgICAgaWYgKG91dHB1dC53YWxsZXQgPT09IHdhbGxldC5pZCgpKSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbY29pbi50b0Nhbm9uaWNhbFRyYW5zYWN0aW9uUmVjaXBpZW50KG91dHB1dCldO1xuICAgICAgfVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gdmVyaWZ5IHRoYXQgZWFjaCByZWNpcGllbnQgZnJvbSB0eFBhcmFtcyBoYXMgdGhlaXIgb3duIG91dHB1dFxuICAgIGV4cGVjdGVkT3V0cHV0cyA9ICh0eFBhcmFtcy5yZWNpcGllbnRzID8/IFtdKS5mbGF0TWFwKChvdXRwdXQpID0+IHtcbiAgICAgIGlmIChvdXRwdXQuYWRkcmVzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChvdXRwdXQuYW1vdW50LnRvU3RyaW5nKCkgIT09ICcwJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT25seSB6ZXJvIGFtb3VudHMgYWxsb3dlZCBmb3Igbm9uLWVuY29kZWFibGUgc2NyaXB0UHVia2V5czogJHtvdXRwdXR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtvdXRwdXRdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFt7IC4uLm91dHB1dCwgYWRkcmVzczogY29pbi5jYW5vbmljYWxBZGRyZXNzKG91dHB1dC5hZGRyZXNzKSB9XTtcbiAgICB9KTtcbiAgICBpZiAodHhQYXJhbXMuYWxsb3dFeHRlcm5hbENoYW5nZUFkZHJlc3MgJiYgdHhQYXJhbXMuY2hhbmdlQWRkcmVzcykge1xuICAgICAgLy8gd2hlbiBhbiBleHRlcm5hbCBjaGFuZ2UgYWRkcmVzcyBpcyBleHBsaWNpdGx5IHNwZWNpZmllZCwgY291bnQgYWxsIG91dHB1dHMgZ29pbmcgdG93YXJkcyB0aGF0XG4gICAgICAvLyBhZGRyZXNzIGluIHRoZSBleHBlY3RlZCBvdXRwdXRzIChyZWdhcmRsZXNzIG9mIHRoZSBvdXRwdXQgYW1vdW50KVxuICAgICAgZXhwZWN0ZWRPdXRwdXRzLnB1c2goXG4gICAgICAgIC4uLmFsbE91dHB1dHMuZmxhdE1hcCgob3V0cHV0KSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgb3V0cHV0LmFkZHJlc3MgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgb3V0cHV0LmFkZHJlc3MgIT09IGNvaW4uY2Fub25pY2FsQWRkcmVzcyh0eFBhcmFtcy5jaGFuZ2VBZGRyZXNzIGFzIHN0cmluZylcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFt7IC4uLm91dHB1dCwgYWRkcmVzczogY29pbi5jYW5vbmljYWxBZGRyZXNzKG91dHB1dC5hZGRyZXNzKSB9XTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWlzc2luZ091dHB1dHMgPSBvdXRwdXREaWZmZXJlbmNlKGV4cGVjdGVkT3V0cHV0cywgYWxsT3V0cHV0cyk7XG5cbiAgLy8gZ2V0IHRoZSBrZXljaGFpbnMgZnJvbSB0aGUgY3VzdG9tIGNoYW5nZSB3YWxsZXQgaWYgbmVlZGVkXG4gIGxldCBjdXN0b21DaGFuZ2U6IEN1c3RvbUNoYW5nZU9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHsgY3VzdG9tQ2hhbmdlV2FsbGV0SWQgPSB1bmRlZmluZWQgfSA9IHdhbGxldC5jb2luU3BlY2lmaWMoKSB8fCB7fTtcbiAgaWYgKGN1c3RvbUNoYW5nZVdhbGxldElkKSB7XG4gICAgLy8gZmV0Y2gga2V5Y2hhaW5zIGZyb20gY3VzdG9tIGNoYW5nZSB3YWxsZXQgZm9yIGRlcml2aW5nIGFkZHJlc3Nlcy5cbiAgICAvLyBUaGVzZSBrZXljaGFpbnMgc2hvdWxkIGJlIHNpZ25lZCBhbmQgdGhpcyBzaG91bGQgYmUgdmVyaWZpZWQgaW4gdmVyaWZ5VHJhbnNhY3Rpb25cbiAgICBjb25zdCBjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzID0gd2FsbGV0Ll93YWxsZXQuY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcztcbiAgICBjb25zdCBjdXN0b21DaGFuZ2VXYWxsZXQ6IFdhbGxldCA9IGF3YWl0IGNvaW4ud2FsbGV0cygpLmdldCh7IGlkOiBjdXN0b21DaGFuZ2VXYWxsZXRJZCB9KTtcbiAgICBjb25zdCBjdXN0b21DaGFuZ2VLZXlzID0gYXdhaXQgZmV0Y2hLZXljaGFpbnMoY29pbiwgY3VzdG9tQ2hhbmdlV2FsbGV0LCByZXFJZCk7XG5cbiAgICBpZiAoIWN1c3RvbUNoYW5nZUtleXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIGZldGNoIGtleWNoYWlucyBmb3IgY3VzdG9tIGNoYW5nZSB3YWxsZXQnKTtcbiAgICB9XG5cbiAgICBpZiAoY3VzdG9tQ2hhbmdlS2V5cy51c2VyICYmIGN1c3RvbUNoYW5nZUtleXMuYmFja3VwICYmIGN1c3RvbUNoYW5nZUtleXMuYml0Z28gJiYgY3VzdG9tQ2hhbmdlV2FsbGV0KSB7XG4gICAgICBjb25zdCBjdXN0b21DaGFuZ2VLZXljaGFpbnM6IFtLZXljaGFpbiwgS2V5Y2hhaW4sIEtleWNoYWluXSA9IFtcbiAgICAgICAgY3VzdG9tQ2hhbmdlS2V5cy51c2VyLFxuICAgICAgICBjdXN0b21DaGFuZ2VLZXlzLmJhY2t1cCxcbiAgICAgICAgY3VzdG9tQ2hhbmdlS2V5cy5iaXRnbyxcbiAgICAgIF07XG5cbiAgICAgIGN1c3RvbUNoYW5nZSA9IHtcbiAgICAgICAga2V5czogY3VzdG9tQ2hhbmdlS2V5Y2hhaW5zLFxuICAgICAgICBzaWduYXR1cmVzOiBbY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcy51c2VyLCBjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzLmJhY2t1cCwgY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcy5iaXRnb10sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb29wIHRocm91Z2ggYWxsIHRoZSBvdXRwdXRzIGFuZCBjbGFzc2lmeSBlYWNoIG9mIHRoZW0gYXMgZWl0aGVyIGludGVybmFsIHNwZW5kc1xuICAgKiBvciBleHRlcm5hbCBzcGVuZHMgYnkgc2V0dGluZyB0aGUgXCJleHRlcm5hbFwiIHByb3BlcnR5IHRvIHRydWUgb3IgZmFsc2Ugb24gdGhlIG91dHB1dCBvYmplY3QuXG4gICAqL1xuICBjb25zdCBhbGxPdXRwdXREZXRhaWxzOiBPdXRwdXRbXSA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGFsbE91dHB1dHMubWFwKChjdXJyZW50T3V0cHV0KSA9PiB7XG4gICAgICByZXR1cm4gcGFyc2VPdXRwdXQoe1xuICAgICAgICBjdXJyZW50T3V0cHV0LFxuICAgICAgICBjb2luLFxuICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICB2ZXJpZmljYXRpb24sXG4gICAgICAgIGtleWNoYWluQXJyYXk6IHRvS2V5Y2hhaW5UcmlwbGUoa2V5Y2hhaW5zKSxcbiAgICAgICAgd2FsbGV0LFxuICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgIHJlY2lwaWVudHM6IGV4cGVjdGVkT3V0cHV0cyxcbiAgICAgICAgICBjaGFuZ2VBZGRyZXNzOiB0eFBhcmFtcy5jaGFuZ2VBZGRyZXNzLFxuICAgICAgICB9LFxuICAgICAgICBjdXN0b21DaGFuZ2UsXG4gICAgICAgIHJlcUlkLFxuICAgICAgfSk7XG4gICAgfSlcbiAgKTtcblxuICBjb25zdCBuZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbiA9IGFsbE91dHB1dERldGFpbHMuc29tZShcbiAgICAob3V0cHV0KSA9PiAob3V0cHV0IGFzIEZpeGVkU2NyaXB0V2FsbGV0T3V0cHV0KT8ubmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb25cbiAgKTtcblxuICBjb25zdCBjaGFuZ2VPdXRwdXRzID0gXy5maWx0ZXIoYWxsT3V0cHV0RGV0YWlscywgeyBleHRlcm5hbDogZmFsc2UgfSk7XG5cbiAgLy8gdGhlc2UgYXJlIGFsbCB0aGUgb3V0cHV0cyB0aGF0IHdlcmUgbm90IG9yaWdpbmFsbHkgZXhwbGljaXRseSBzcGVjaWZpZWQgaW4gcmVjaXBpZW50c1xuICAvLyBpZGVhbGx5IGNoYW5nZSBvdXRwdXRzIG9yIGEgcGF5Z28gb3V0cHV0IHRoYXQgbWlnaHQgaGF2ZSBiZWVuIGFkZGVkXG4gIGNvbnN0IGltcGxpY2l0T3V0cHV0cyA9IG91dHB1dERpZmZlcmVuY2UoYWxsT3V0cHV0RGV0YWlscywgZXhwZWN0ZWRPdXRwdXRzKTtcblxuICBjb25zdCBleHBsaWNpdE91dHB1dHMgPSBvdXRwdXREaWZmZXJlbmNlKGFsbE91dHB1dERldGFpbHMsIGltcGxpY2l0T3V0cHV0cyk7XG5cbiAgLy8gdGhlc2UgYXJlIGFsbCB0aGUgbm9uLXdhbGxldCBvdXRwdXRzIHRoYXQgaGFkIGJlZW4gb3JpZ2luYWxseSBleHBsaWNpdGx5IHNwZWNpZmllZCBpbiByZWNpcGllbnRzXG4gIGNvbnN0IGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzID0gXy5maWx0ZXIoZXhwbGljaXRPdXRwdXRzLCB7IGV4dGVybmFsOiB0cnVlIH0pO1xuXG4gIC8vIHRoaXMgaXMgdGhlIHN1bSBvZiBhbGwgdGhlIG9yaWdpbmFsbHkgZXhwbGljaXRseSBzcGVjaWZpZWQgbm9uLXdhbGxldCBvdXRwdXQgdmFsdWVzXG4gIGNvbnN0IGV4cGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudCA9IHV0eG9saWIuYml0Z28udG9UTnVtYmVyPFROdW1iZXI+KFxuICAgIGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzLnJlZHVjZSgoc3VtOiBiaWdpbnQsIG86IE91dHB1dCkgPT4gc3VtICsgQmlnSW50KG8uYW1vdW50KSwgQmlnSW50KDApKSBhcyBiaWdpbnQsXG4gICAgY29pbi5hbW91bnRUeXBlXG4gICk7XG5cbiAgLyoqXG4gICAqIFRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgaW1wbGljaXQgZXh0ZXJuYWwgc3BlbmQgYW1vdW50IHBlcnRhaW5zIHRvIHZlcmlmeWluZyB0aGUgcGF5LWFzLXlvdS1nby1mZWUgQml0R29cbiAgICogYXV0b21hdGljYWxseSBhcHBsaWVzIHRvIHRyYW5zYWN0aW9ucyBzZW5kaW5nIG1vbmV5IG91dCBvZiB0aGUgd2FsbGV0LiBUaGUgbG9naWMgaXMgZmFpcmx5IHN0cmFpZ2h0Zm9yd2FyZFxuICAgKiBpbiB0aGF0IHdlIGNvbXBhcmUgdGhlIGV4dGVybmFsIHNwZW5kIGFtb3VudCB0aGF0IHdhcyBzcGVjaWZpZWQgZXhwbGljaXRseSBieSB0aGUgdXNlciB0byB0aGUgcG9ydGlvblxuICAgKiB0aGF0IHdhcyBzcGVjaWZpZWQgaW1wbGljaXRseS4gVG8gcHJvdGVjdCBjdXN0b21lcnMgZnJvbSBwZW9wbGUgdGFtcGVyaW5nIHdpdGggdGhlIHRyYW5zYWN0aW9uIG91dHB1dHMsIHdlXG4gICAqIGRlZmluZSBhIHRocmVzaG9sZCBmb3IgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiB0aGUgaW1wbGljaXQgZXh0ZXJuYWwgc3BlbmQgaW4gcmVsYXRpb24gdG8gdGhlIGV4cGxpY2l0XG4gICAqIGV4dGVybmFsIHNwZW5kLlxuICAgKi9cblxuICAvLyBtYWtlIHN1cmUgdGhhdCBhbGwgdGhlIGV4dHJhIGFkZHJlc3NlcyBhcmUgY2hhbmdlIGFkZHJlc3Nlc1xuICAvLyBnZXQgYWxsIHRoZSBhZGRpdGlvbmFsIGV4dGVybmFsIG91dHB1dHMgdGhlIHNlcnZlciBhZGRlZCBhbmQgY2FsY3VsYXRlIHRoZWlyIHZhbHVlc1xuICBjb25zdCBpbXBsaWNpdEV4dGVybmFsT3V0cHV0cyA9IF8uZmlsdGVyKGltcGxpY2l0T3V0cHV0cywgeyBleHRlcm5hbDogdHJ1ZSB9KTtcbiAgY29uc3QgaW1wbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50ID0gdXR4b2xpYi5iaXRnby50b1ROdW1iZXI8VE51bWJlcj4oXG4gICAgaW1wbGljaXRFeHRlcm5hbE91dHB1dHMucmVkdWNlKChzdW06IGJpZ2ludCwgbzogT3V0cHV0KSA9PiBzdW0gKyBCaWdJbnQoby5hbW91bnQpLCBCaWdJbnQoMCkpIGFzIGJpZ2ludCxcbiAgICBjb2luLmFtb3VudFR5cGVcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIGtleWNoYWlucyxcbiAgICBrZXlTaWduYXR1cmVzOiBfLmdldCh3YWxsZXQsICdfd2FsbGV0LmtleVNpZ25hdHVyZXMnLCB7fSksXG4gICAgb3V0cHV0czogYWxsT3V0cHV0RGV0YWlscyxcbiAgICBtaXNzaW5nT3V0cHV0cyxcbiAgICBleHBsaWNpdEV4dGVybmFsT3V0cHV0cyxcbiAgICBpbXBsaWNpdEV4dGVybmFsT3V0cHV0cyxcbiAgICBjaGFuZ2VPdXRwdXRzLFxuICAgIGV4cGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudCxcbiAgICBpbXBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQsXG4gICAgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb24sXG4gICAgY3VzdG9tQ2hhbmdlLFxuICB9O1xufVxuIl19
|
|
203
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VUcmFuc2FjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90cmFuc2FjdGlvbi9maXhlZFNjcmlwdC9wYXJzZVRyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0JBLDRDQTJNQztBQW5PRCxvREFBNEI7QUFFNUIsb0RBQXVCO0FBRXZCLDhEQUFnRDtBQVVoRCwrQ0FBdUg7QUFDdkgsMERBQXlFO0FBQ3pFLDRDQUEwRjtBQUUxRiwrQ0FBaUU7QUFNMUQsS0FBSyxVQUFVLGdCQUFnQixDQUNwQyxJQUFzQixFQUN0QixNQUF3QztJQUV4QyxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsWUFBWSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFMUUsSUFBSSxDQUFDLGdCQUFDLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztRQUNuRyxNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUNELE1BQU0saUJBQWlCLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUFDO0lBRXpELDBDQUEwQztJQUMxQyxJQUFJLFNBQVMsR0FBc0UsWUFBWSxDQUFDLFNBQVMsQ0FBQztJQUMxRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFDRCxTQUFTLEdBQUcsTUFBTSxJQUFBLDBCQUFjLEVBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4RCxD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QUssQ0FBQyxTQUFTLENBQ3pELHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBVyxFQUM5RixJQUFJLENBQUMsVUFBVSxDQUNoQixDQUFDO0lBRUYsU0FBUyxTQUFTLENBQUMsT0FBdUQ7UUFDeEUsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzlCLE9BQU8sRUFBRSxJQUFBLG1DQUF1QixFQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUM3RCxNQUFNLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUU7WUFDL0IsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1NBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVELE9BQU87UUFDTCxTQUFTO1FBQ1QsYUFBYSxFQUFFLElBQUEsNEJBQWdCLEVBQUMsTUFBTSxDQUFDLElBQUksRUFBRTtRQUM3QyxPQUFPLEVBQUUsZ0JBQWdCO1FBQ3pCLGNBQWMsRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDO1FBQ3pDLHVCQUF1QixFQUFFLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQztRQUMzRCx1QkFBdUIsRUFBRSxTQUFTLENBQUMsdUJBQXVCLENBQUM7UUFDM0QsYUFBYTtRQUNiLDJCQUEyQjtRQUMzQiwyQkFBMkI7UUFDM0IseUNBQXlDO1FBQ3pDLFlBQVk7S0FDYixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFRyaXBsZSwgVmVyaWZpY2F0aW9uT3B0aW9ucywgV2FsbGV0IH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5cbmltcG9ydCB7XG4gIEFic3RyYWN0VXR4b0NvaW4sXG4gIEZpeGVkU2NyaXB0V2FsbGV0T3V0cHV0LFxuICBPdXRwdXQsXG4gIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIFBhcnNlZFRyYW5zYWN0aW9uLFxuICBQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyxcbn0gZnJvbSAnLi4vLi4vYWJzdHJhY3RVdHhvQ29pbic7XG5pbXBvcnQgeyBmZXRjaEtleWNoYWlucywgZ2V0S2V5U2lnbmF0dXJlcywgdG9LZXljaGFpblRyaXBsZSwgVXR4b0tleWNoYWluLCBVdHhvTmFtZWRLZXljaGFpbnMgfSBmcm9tICcuLi8uLi9rZXljaGFpbnMnO1xuaW1wb3J0IHsgQ29tcGFyYWJsZU91dHB1dCwgb3V0cHV0RGlmZmVyZW5jZSB9IGZyb20gJy4uL291dHB1dERpZmZlcmVuY2UnO1xuaW1wb3J0IHsgZnJvbUV4dGVuZGVkQWRkcmVzc0Zvcm1hdFRvU2NyaXB0LCB0b0V4dGVuZGVkQWRkcmVzc0Zvcm1hdCB9IGZyb20gJy4uL3JlY2lwaWVudCc7XG5cbmltcG9ydCB7IEN1c3RvbUNoYW5nZU9wdGlvbnMsIHBhcnNlT3V0cHV0IH0gZnJvbSAnLi9wYXJzZU91dHB1dCc7XG5cbmV4cG9ydCB0eXBlIENvbXBhcmFibGVPdXRwdXRXaXRoRXh0ZXJuYWw8VFZhbHVlPiA9IENvbXBhcmFibGVPdXRwdXQ8VFZhbHVlPiAmIHtcbiAgZXh0ZXJuYWw6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VUcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgYmlnaW50IHwgbnVtYmVyPihcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgcGFyYW1zOiBQYXJzZVRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyPlxuKTogUHJvbWlzZTxQYXJzZWRUcmFuc2FjdGlvbjxUTnVtYmVyPj4ge1xuICBjb25zdCB7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQsIHZlcmlmaWNhdGlvbiA9IHt9LCByZXFJZCB9ID0gcGFyYW1zO1xuXG4gIGlmICghXy5pc1VuZGVmaW5lZCh2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcpICYmICFfLmlzQm9vbGVhbih2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcgbXVzdCBiZSBhIGJvb2xlYW4nKTtcbiAgfVxuICBjb25zdCBkaXNhYmxlTmV0d29ya2luZyA9IHZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZztcblxuICAvLyBvYnRhaW4gdGhlIGtleWNoYWlucyBhbmQga2V5IHNpZ25hdHVyZXNcbiAgbGV0IGtleWNoYWluczogVXR4b05hbWVkS2V5Y2hhaW5zIHwgVmVyaWZpY2F0aW9uT3B0aW9uc1sna2V5Y2hhaW5zJ10gfCB1bmRlZmluZWQgPSB2ZXJpZmljYXRpb24ua2V5Y2hhaW5zO1xuICBpZiAoIWtleWNoYWlucykge1xuICAgIGlmIChkaXNhYmxlTmV0d29ya2luZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgZmV0Y2gga2V5Y2hhaW5zIHdpdGhvdXQgbmV0d29ya2luZycpO1xuICAgIH1cbiAgICBrZXljaGFpbnMgPSBhd2FpdCBmZXRjaEtleWNoYWlucyhjb2luLCB3YWxsZXQsIHJlcUlkKTtcbiAgfVxuXG4gIGlmICghVXR4b05hbWVkS2V5Y2hhaW5zLmlzKGtleWNoYWlucykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQga2V5Y2hhaW5zJyk7XG4gIH1cblxuICBjb25zdCBrZXljaGFpbkFycmF5OiBUcmlwbGU8VXR4b0tleWNoYWluPiA9IHRvS2V5Y2hhaW5UcmlwbGUoa2V5Y2hhaW5zKTtcblxuICBpZiAoXy5pc1VuZGVmaW5lZCh0eFByZWJ1aWxkLnR4SGV4KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCB0eFByZWJ1aWxkIHByb3BlcnR5IHR4SGV4Jyk7XG4gIH1cblxuICAvLyBvYnRhaW4gYWxsIG91dHB1dHNcbiAgY29uc3QgZXhwbGFuYXRpb246IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gPSBhd2FpdCBjb2luLmV4cGxhaW5UcmFuc2FjdGlvbjxUTnVtYmVyPih7XG4gICAgdHhIZXg6IHR4UHJlYnVpbGQudHhIZXgsXG4gICAgdHhJbmZvOiB0eFByZWJ1aWxkLnR4SW5mbyxcbiAgICBwdWJzOiBrZXljaGFpbkFycmF5Lm1hcCgoaykgPT4gay5wdWIpIGFzIFRyaXBsZTxzdHJpbmc+LFxuICB9KTtcblxuICBjb25zdCBhbGxPdXRwdXRzID0gWy4uLmV4cGxhbmF0aW9uLm91dHB1dHMsIC4uLmV4cGxhbmF0aW9uLmNoYW5nZU91dHB1dHNdO1xuXG4gIGxldCBleHBlY3RlZE91dHB1dHM7XG4gIGlmICh0eFBhcmFtcy5yYmZUeElkcykge1xuICAgIGFzc2VydCh0eFBhcmFtcy5yYmZUeElkcy5sZW5ndGggPT09IDEpO1xuXG4gICAgY29uc3QgdHhUb0JlUmVwbGFjZWQgPSBhd2FpdCB3YWxsZXQuZ2V0VHJhbnNhY3Rpb24oeyB0eEhhc2g6IHR4UGFyYW1zLnJiZlR4SWRzWzBdLCBpbmNsdWRlUmJmOiB0cnVlIH0pO1xuICAgIGV4cGVjdGVkT3V0cHV0cyA9IHR4VG9CZVJlcGxhY2VkLm91dHB1dHMuZmxhdE1hcChcbiAgICAgIChvdXRwdXQ6IHsgdmFsdWVTdHJpbmc6IHN0cmluZzsgYWRkcmVzcz86IHN0cmluZzsgd2FsbGV0Pzogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgLy8gRm9yIHNlbGYtc2VuZHMsIHRoZSB3YWxsZXRJZCB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSB3YWxsZXQncyBpZFxuICAgICAgICBpZiAob3V0cHV0LndhbGxldCA9PT0gd2FsbGV0LmlkKCkpIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtjb2luLnRvQ2Fub25pY2FsVHJhbnNhY3Rpb25SZWNpcGllbnQob3V0cHV0KV07XG4gICAgICB9XG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB2ZXJpZnkgdGhhdCBlYWNoIHJlY2lwaWVudCBmcm9tIHR4UGFyYW1zIGhhcyB0aGVpciBvd24gb3V0cHV0XG4gICAgZXhwZWN0ZWRPdXRwdXRzID0gKHR4UGFyYW1zLnJlY2lwaWVudHMgPz8gW10pLmZsYXRNYXAoKG91dHB1dCkgPT4ge1xuICAgICAgaWYgKG91dHB1dC5hZGRyZXNzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKG91dHB1dC5hbW91bnQudG9TdHJpbmcoKSAhPT0gJzAnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPbmx5IHplcm8gYW1vdW50cyBhbGxvd2VkIGZvciBub24tZW5jb2RlYWJsZSBzY3JpcHRQdWJrZXlzOiAke291dHB1dH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW291dHB1dF07XG4gICAgICB9XG4gICAgICByZXR1cm4gW3sgLi4ub3V0cHV0LCBhZGRyZXNzOiBjb2luLmNhbm9uaWNhbEFkZHJlc3Mob3V0cHV0LmFkZHJlc3MpIH1dO1xuICAgIH0pO1xuICAgIGlmICh0eFBhcmFtcy5hbGxvd0V4dGVybmFsQ2hhbmdlQWRkcmVzcyAmJiB0eFBhcmFtcy5jaGFuZ2VBZGRyZXNzKSB7XG4gICAgICAvLyB3aGVuIGFuIGV4dGVybmFsIGNoYW5nZSBhZGRyZXNzIGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLCBjb3VudCBhbGwgb3V0cHV0cyBnb2luZyB0b3dhcmRzIHRoYXRcbiAgICAgIC8vIGFkZHJlc3MgaW4gdGhlIGV4cGVjdGVkIG91dHB1dHMgKHJlZ2FyZGxlc3Mgb2YgdGhlIG91dHB1dCBhbW91bnQpXG4gICAgICBleHBlY3RlZE91dHB1dHMucHVzaChcbiAgICAgICAgLi4uYWxsT3V0cHV0cy5mbGF0TWFwKChvdXRwdXQpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBvdXRwdXQuYWRkcmVzcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBvdXRwdXQuYWRkcmVzcyAhPT0gY29pbi5jYW5vbmljYWxBZGRyZXNzKHR4UGFyYW1zLmNoYW5nZUFkZHJlc3MgYXMgc3RyaW5nKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gW3sgLi4ub3V0cHV0LCBhZGRyZXNzOiBjb2luLmNhbm9uaWNhbEFkZHJlc3Mob3V0cHV0LmFkZHJlc3MpIH1dO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBnZXQgdGhlIGtleWNoYWlucyBmcm9tIHRoZSBjdXN0b20gY2hhbmdlIHdhbGxldCBpZiBuZWVkZWRcbiAgbGV0IGN1c3RvbUNoYW5nZTogQ3VzdG9tQ2hhbmdlT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgeyBjdXN0b21DaGFuZ2VXYWxsZXRJZCA9IHVuZGVmaW5lZCB9ID0gd2FsbGV0LmNvaW5TcGVjaWZpYygpIHx8IHt9O1xuICBpZiAoY3VzdG9tQ2hhbmdlV2FsbGV0SWQpIHtcbiAgICAvLyBmZXRjaCBrZXljaGFpbnMgZnJvbSBjdXN0b20gY2hhbmdlIHdhbGxldCBmb3IgZGVyaXZpbmcgYWRkcmVzc2VzLlxuICAgIC8vIFRoZXNlIGtleWNoYWlucyBzaG91bGQgYmUgc2lnbmVkIGFuZCB0aGlzIHNob3VsZCBiZSB2ZXJpZmllZCBpbiB2ZXJpZnlUcmFuc2FjdGlvblxuICAgIGNvbnN0IGN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXMgPSB3YWxsZXQuX3dhbGxldC5jdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzO1xuICAgIGNvbnN0IGN1c3RvbUNoYW5nZVdhbGxldDogV2FsbGV0ID0gYXdhaXQgY29pbi53YWxsZXRzKCkuZ2V0KHsgaWQ6IGN1c3RvbUNoYW5nZVdhbGxldElkIH0pO1xuICAgIGNvbnN0IGN1c3RvbUNoYW5nZUtleXMgPSBhd2FpdCBmZXRjaEtleWNoYWlucyhjb2luLCBjdXN0b21DaGFuZ2VXYWxsZXQsIHJlcUlkKTtcblxuICAgIGlmICghY3VzdG9tQ2hhbmdlS2V5cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gZmV0Y2gga2V5Y2hhaW5zIGZvciBjdXN0b20gY2hhbmdlIHdhbGxldCcpO1xuICAgIH1cblxuICAgIGlmIChjdXN0b21DaGFuZ2VLZXlzLnVzZXIgJiYgY3VzdG9tQ2hhbmdlS2V5cy5iYWNrdXAgJiYgY3VzdG9tQ2hhbmdlS2V5cy5iaXRnbyAmJiBjdXN0b21DaGFuZ2VXYWxsZXQpIHtcbiAgICAgIGNvbnN0IGN1c3RvbUNoYW5nZUtleWNoYWluczogVHJpcGxlPFV0eG9LZXljaGFpbj4gPSBbXG4gICAgICAgIGN1c3RvbUNoYW5nZUtleXMudXNlcixcbiAgICAgICAgY3VzdG9tQ2hhbmdlS2V5cy5iYWNrdXAsXG4gICAgICAgIGN1c3RvbUNoYW5nZUtleXMuYml0Z28sXG4gICAgICBdO1xuXG4gICAgICBjdXN0b21DaGFuZ2UgPSB7XG4gICAgICAgIGtleXM6IGN1c3RvbUNoYW5nZUtleWNoYWlucyxcbiAgICAgICAgc2lnbmF0dXJlczogW2N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXMudXNlciwgY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcy5iYWNrdXAsIGN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXMuYml0Z29dLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9vcCB0aHJvdWdoIGFsbCB0aGUgb3V0cHV0cyBhbmQgY2xhc3NpZnkgZWFjaCBvZiB0aGVtIGFzIGVpdGhlciBpbnRlcm5hbCBzcGVuZHNcbiAgICogb3IgZXh0ZXJuYWwgc3BlbmRzIGJ5IHNldHRpbmcgdGhlIFwiZXh0ZXJuYWxcIiBwcm9wZXJ0eSB0byB0cnVlIG9yIGZhbHNlIG9uIHRoZSBvdXRwdXQgb2JqZWN0LlxuICAgKi9cbiAgY29uc3QgYWxsT3V0cHV0RGV0YWlsczogT3V0cHV0W10gPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBhbGxPdXRwdXRzLm1hcCgoY3VycmVudE91dHB1dCkgPT4ge1xuICAgICAgcmV0dXJuIHBhcnNlT3V0cHV0KHtcbiAgICAgICAgY3VycmVudE91dHB1dCxcbiAgICAgICAgY29pbixcbiAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgdmVyaWZpY2F0aW9uLFxuICAgICAgICBrZXljaGFpbkFycmF5OiB0b0tleWNoYWluVHJpcGxlKGtleWNoYWlucyksXG4gICAgICAgIHdhbGxldCxcbiAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICByZWNpcGllbnRzOiBleHBlY3RlZE91dHB1dHMsXG4gICAgICAgICAgY2hhbmdlQWRkcmVzczogdHhQYXJhbXMuY2hhbmdlQWRkcmVzcyxcbiAgICAgICAgfSxcbiAgICAgICAgY3VzdG9tQ2hhbmdlLFxuICAgICAgICByZXFJZCxcbiAgICAgIH0pO1xuICAgIH0pXG4gICk7XG5cbiAgY29uc3QgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb24gPSBhbGxPdXRwdXREZXRhaWxzLnNvbWUoXG4gICAgKG91dHB1dCkgPT4gKG91dHB1dCBhcyBGaXhlZFNjcmlwdFdhbGxldE91dHB1dCk/Lm5lZWRzQ3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlVmVyaWZpY2F0aW9uXG4gICk7XG5cbiAgY29uc3QgY2hhbmdlT3V0cHV0cyA9IF8uZmlsdGVyKGFsbE91dHB1dERldGFpbHMsIHsgZXh0ZXJuYWw6IGZhbHNlIH0pO1xuXG4gIGZ1bmN0aW9uIHRvQ29tcGFyYWJsZU91dHB1dHNXaXRoRXh0ZXJuYWwob3V0cHV0czogT3V0cHV0W10pOiBDb21wYXJhYmxlT3V0cHV0V2l0aEV4dGVybmFsPGJpZ2ludCB8ICdtYXgnPltdIHtcbiAgICByZXR1cm4gb3V0cHV0cy5tYXAoKG91dHB1dCkgPT4gKHtcbiAgICAgIHNjcmlwdDogZnJvbUV4dGVuZGVkQWRkcmVzc0Zvcm1hdFRvU2NyaXB0KG91dHB1dC5hZGRyZXNzLCBjb2luLm5ldHdvcmspLFxuICAgICAgdmFsdWU6IG91dHB1dC5hbW91bnQgPT09ICdtYXgnID8gJ21heCcgOiAoQmlnSW50KG91dHB1dC5hbW91bnQpIGFzIGJpZ2ludCB8ICdtYXgnKSxcbiAgICAgIGV4dGVybmFsOiBvdXRwdXQuZXh0ZXJuYWwsXG4gICAgfSkpO1xuICB9XG5cbiAgY29uc3QgbWlzc2luZ091dHB1dHMgPSBvdXRwdXREaWZmZXJlbmNlKFxuICAgIHRvQ29tcGFyYWJsZU91dHB1dHNXaXRoRXh0ZXJuYWwoZXhwZWN0ZWRPdXRwdXRzKSxcbiAgICB0b0NvbXBhcmFibGVPdXRwdXRzV2l0aEV4dGVybmFsKGFsbE91dHB1dHMpXG4gICk7XG5cbiAgY29uc3QgaW1wbGljaXRPdXRwdXRzID0gb3V0cHV0RGlmZmVyZW5jZShcbiAgICB0b0NvbXBhcmFibGVPdXRwdXRzV2l0aEV4dGVybmFsKGFsbE91dHB1dERldGFpbHMpLFxuICAgIHRvQ29tcGFyYWJsZU91dHB1dHNXaXRoRXh0ZXJuYWwoZXhwZWN0ZWRPdXRwdXRzKVxuICApO1xuICBjb25zdCBleHBsaWNpdE91dHB1dHMgPSBvdXRwdXREaWZmZXJlbmNlKHRvQ29tcGFyYWJsZU91dHB1dHNXaXRoRXh0ZXJuYWwoYWxsT3V0cHV0RGV0YWlscyksIGltcGxpY2l0T3V0cHV0cyk7XG5cbiAgLy8gdGhlc2UgYXJlIGFsbCB0aGUgbm9uLXdhbGxldCBvdXRwdXRzIHRoYXQgaGFkIGJlZW4gb3JpZ2luYWxseSBleHBsaWNpdGx5IHNwZWNpZmllZCBpbiByZWNpcGllbnRzXG4gIGNvbnN0IGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzID0gZXhwbGljaXRPdXRwdXRzLmZpbHRlcigob3V0cHV0KSA9PiBvdXRwdXQuZXh0ZXJuYWwpO1xuICAvLyB0aGlzIGlzIHRoZSBzdW0gb2YgYWxsIHRoZSBvcmlnaW5hbGx5IGV4cGxpY2l0bHkgc3BlY2lmaWVkIG5vbi13YWxsZXQgb3V0cHV0IHZhbHVlc1xuICBjb25zdCBleHBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQgPSB1dHhvbGliLmJpdGdvLnRvVE51bWJlcjxUTnVtYmVyPihcbiAgICBleHBsaWNpdEV4dGVybmFsT3V0cHV0cy5yZWR1Y2UoKHN1bTogYmlnaW50LCBvKSA9PiBzdW0gKyBCaWdJbnQoby52YWx1ZSksIEJpZ0ludCgwKSkgYXMgYmlnaW50LFxuICAgIGNvaW4uYW1vdW50VHlwZVxuICApO1xuXG4gIC8qKlxuICAgKiBUaGUgY2FsY3VsYXRpb24gb2YgdGhlIGltcGxpY2l0IGV4dGVybmFsIHNwZW5kIGFtb3VudCBwZXJ0YWlucyB0byB2ZXJpZnlpbmcgdGhlIHBheS1hcy15b3UtZ28tZmVlIEJpdEdvXG4gICAqIGF1dG9tYXRpY2FsbHkgYXBwbGllcyB0byB0cmFuc2FjdGlvbnMgc2VuZGluZyBtb25leSBvdXQgb2YgdGhlIHdhbGxldC4gVGhlIGxvZ2ljIGlzIGZhaXJseSBzdHJhaWdodGZvcndhcmRcbiAgICogaW4gdGhhdCB3ZSBjb21wYXJlIHRoZSBleHRlcm5hbCBzcGVuZCBhbW91bnQgdGhhdCB3YXMgc3BlY2lmaWVkIGV4cGxpY2l0bHkgYnkgdGhlIHVzZXIgdG8gdGhlIHBvcnRpb25cbiAgICogdGhhdCB3YXMgc3BlY2lmaWVkIGltcGxpY2l0bHkuIFRvIHByb3RlY3QgY3VzdG9tZXJzIGZyb20gcGVvcGxlIHRhbXBlcmluZyB3aXRoIHRoZSB0cmFuc2FjdGlvbiBvdXRwdXRzLCB3ZVxuICAgKiBkZWZpbmUgYSB0aHJlc2hvbGQgZm9yIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgdGhlIGltcGxpY2l0IGV4dGVybmFsIHNwZW5kIGluIHJlbGF0aW9uIHRvIHRoZSBleHBsaWNpdFxuICAgKiBleHRlcm5hbCBzcGVuZC5cbiAgICovXG5cbiAgLy8gbWFrZSBzdXJlIHRoYXQgYWxsIHRoZSBleHRyYSBhZGRyZXNzZXMgYXJlIGNoYW5nZSBhZGRyZXNzZXNcbiAgLy8gZ2V0IGFsbCB0aGUgYWRkaXRpb25hbCBleHRlcm5hbCBvdXRwdXRzIHRoZSBzZXJ2ZXIgYWRkZWQgYW5kIGNhbGN1bGF0ZSB0aGVpciB2YWx1ZXNcbiAgY29uc3QgaW1wbGljaXRFeHRlcm5hbE91dHB1dHMgPSBpbXBsaWNpdE91dHB1dHMuZmlsdGVyKChvdXRwdXQpID0+IG91dHB1dC5leHRlcm5hbCk7XG4gIGNvbnN0IGltcGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudCA9IHV0eG9saWIuYml0Z28udG9UTnVtYmVyPFROdW1iZXI+KFxuICAgIGltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzLnJlZHVjZSgoc3VtOiBiaWdpbnQsIG8pID0+IHN1bSArIEJpZ0ludChvLnZhbHVlKSwgQmlnSW50KDApKSBhcyBiaWdpbnQsXG4gICAgY29pbi5hbW91bnRUeXBlXG4gICk7XG5cbiAgZnVuY3Rpb24gdG9PdXRwdXRzKG91dHB1dHM6IENvbXBhcmFibGVPdXRwdXRXaXRoRXh0ZXJuYWw8YmlnaW50IHwgJ21heCc+W10pOiBPdXRwdXRbXSB7XG4gICAgcmV0dXJuIG91dHB1dHMubWFwKChvdXRwdXQpID0+ICh7XG4gICAgICBhZGRyZXNzOiB0b0V4dGVuZGVkQWRkcmVzc0Zvcm1hdChvdXRwdXQuc2NyaXB0LCBjb2luLm5ldHdvcmspLFxuICAgICAgYW1vdW50OiBvdXRwdXQudmFsdWUudG9TdHJpbmcoKSxcbiAgICAgIGV4dGVybmFsOiBvdXRwdXQuZXh0ZXJuYWwsXG4gICAgfSkpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBrZXljaGFpbnMsXG4gICAga2V5U2lnbmF0dXJlczogZ2V0S2V5U2lnbmF0dXJlcyh3YWxsZXQpID8/IHt9LFxuICAgIG91dHB1dHM6IGFsbE91dHB1dERldGFpbHMsXG4gICAgbWlzc2luZ091dHB1dHM6IHRvT3V0cHV0cyhtaXNzaW5nT3V0cHV0cyksXG4gICAgZXhwbGljaXRFeHRlcm5hbE91dHB1dHM6IHRvT3V0cHV0cyhleHBsaWNpdEV4dGVybmFsT3V0cHV0cyksXG4gICAgaW1wbGljaXRFeHRlcm5hbE91dHB1dHM6IHRvT3V0cHV0cyhpbXBsaWNpdEV4dGVybmFsT3V0cHV0cyksXG4gICAgY2hhbmdlT3V0cHV0cyxcbiAgICBleHBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQsXG4gICAgaW1wbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50LFxuICAgIG5lZWRzQ3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlVmVyaWZpY2F0aW9uLFxuICAgIGN1c3RvbUNoYW5nZSxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BIP32Interface } from '@bitgo-beta/utxo-lib';
|
|
2
|
+
import * as utxolib from '@bitgo-beta/utxo-lib';
|
|
3
|
+
import { AbstractUtxoCoin, DecodedTransaction } from '../../abstractUtxoCoin';
|
|
4
|
+
export declare function signTransaction<TNumber extends number | bigint>(coin: AbstractUtxoCoin, tx: DecodedTransaction<TNumber>, signerKeychain: BIP32Interface | undefined, params: {
|
|
5
|
+
walletId: string | undefined;
|
|
6
|
+
txInfo: {
|
|
7
|
+
unspents?: utxolib.bitgo.Unspent<TNumber>[];
|
|
8
|
+
} | undefined;
|
|
9
|
+
isLastSignature: boolean;
|
|
10
|
+
signingStep: 'signerNonce' | 'cosignerNonce' | 'signerSignature' | undefined;
|
|
11
|
+
allowNonSegwitSigningWithoutPrevTx: boolean;
|
|
12
|
+
pubs: string[] | undefined;
|
|
13
|
+
cosignerPub: string | undefined;
|
|
14
|
+
}): Promise<{
|
|
15
|
+
txHex: string;
|
|
16
|
+
}>;
|
|
17
|
+
//# sourceMappingURL=signTransaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signTransaction.d.ts","sourceRoot":"","sources":["../../../../src/transaction/fixedScript/signTransaction.ts"],"names":[],"mappings":"AAGA,OAAO,EAAS,cAAc,EAAS,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAIhD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAkB,MAAM,wBAAwB,CAAC;AAY9F,wBAAsB,eAAe,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EACnE,IAAI,EAAE,gBAAgB,EACtB,EAAE,EAAE,kBAAkB,CAAC,OAAO,CAAC,EAC/B,cAAc,EAAE,cAAc,GAAG,SAAS,EAC1C,MAAM,EAAE;IACN,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,MAAM,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAA;KAAE,GAAG,SAAS,CAAC;IACpE,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,aAAa,GAAG,eAAe,GAAG,iBAAiB,GAAG,SAAS,CAAC;IAC7E,kCAAkC,EAAE,OAAO,CAAC;IAC5C,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC,GACA,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAgG5B"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.signTransaction = signTransaction;
|
|
40
|
+
const assert_1 = __importDefault(require("assert"));
|
|
41
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
42
|
+
const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
|
|
43
|
+
const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
|
|
44
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
45
|
+
const sign_1 = require("../../sign");
|
|
46
|
+
/**
|
|
47
|
+
* Key Value: Unsigned tx id => PSBT
|
|
48
|
+
* It is used to cache PSBTs with taproot key path (MuSig2) inputs during external express signer is activated.
|
|
49
|
+
* Reason: MuSig2 signer secure nonce is cached in the UtxoPsbt object. It will be required during the signing step.
|
|
50
|
+
* For more info, check SignTransactionOptions.signingStep
|
|
51
|
+
*
|
|
52
|
+
* TODO BTC-276: This cache may need to be done with LRU like memory safe caching if memory issues comes up.
|
|
53
|
+
*/
|
|
54
|
+
const PSBT_CACHE = new Map();
|
|
55
|
+
async function signTransaction(coin, tx, signerKeychain, params) {
|
|
56
|
+
const isTxWithKeyPathSpendInput = tx instanceof utxo_lib_1.bitgo.UtxoPsbt && utxo_lib_1.bitgo.isTransactionWithKeyPathSpendInput(tx);
|
|
57
|
+
let isLastSignature = false;
|
|
58
|
+
if (lodash_1.default.isBoolean(params.isLastSignature)) {
|
|
59
|
+
// We can only be the first signature on a transaction with taproot key path spend inputs because
|
|
60
|
+
// we require the secret nonce in the cache of the first signer, which is impossible to retrieve if
|
|
61
|
+
// deserialized from a hex.
|
|
62
|
+
if (params.isLastSignature && isTxWithKeyPathSpendInput) {
|
|
63
|
+
throw new Error('Cannot be last signature on a transaction with key path spend inputs');
|
|
64
|
+
}
|
|
65
|
+
// if build is called instead of buildIncomplete, no signature placeholders are left in the sig script
|
|
66
|
+
isLastSignature = params.isLastSignature;
|
|
67
|
+
}
|
|
68
|
+
const setSignerMusigNonceWithOverride = (psbt, signerKeychain, nonSegwitOverride) => {
|
|
69
|
+
utxolib.bitgo.withUnsafeNonSegwit(psbt, () => psbt.setAllInputsMusig2NonceHD(signerKeychain), nonSegwitOverride);
|
|
70
|
+
};
|
|
71
|
+
if (tx instanceof utxo_lib_1.bitgo.UtxoPsbt && isTxWithKeyPathSpendInput) {
|
|
72
|
+
switch (params.signingStep) {
|
|
73
|
+
case 'signerNonce':
|
|
74
|
+
(0, assert_1.default)(signerKeychain);
|
|
75
|
+
setSignerMusigNonceWithOverride(tx, signerKeychain, params.allowNonSegwitSigningWithoutPrevTx);
|
|
76
|
+
PSBT_CACHE.set(tx.getUnsignedTx().getId(), tx);
|
|
77
|
+
return { txHex: tx.toHex() };
|
|
78
|
+
case 'cosignerNonce':
|
|
79
|
+
(0, assert_1.default)(params.walletId, 'walletId is required for MuSig2 bitgo nonce');
|
|
80
|
+
return { txHex: (await coin.signPsbt(tx.toHex(), params.walletId)).psbt };
|
|
81
|
+
case 'signerSignature':
|
|
82
|
+
const txId = tx.getUnsignedTx().getId();
|
|
83
|
+
const psbt = PSBT_CACHE.get(txId);
|
|
84
|
+
(0, assert_1.default)(psbt, `Psbt is missing from txCache (cache size ${PSBT_CACHE.size}).
|
|
85
|
+
This may be due to the request being routed to a different BitGo-Express instance that for signing step 'signerNonce'.`);
|
|
86
|
+
PSBT_CACHE.delete(txId);
|
|
87
|
+
tx = psbt.combine(tx);
|
|
88
|
+
break;
|
|
89
|
+
default:
|
|
90
|
+
// this instance is not an external signer
|
|
91
|
+
(0, assert_1.default)(params.walletId, 'walletId is required for MuSig2 bitgo nonce');
|
|
92
|
+
(0, assert_1.default)(signerKeychain);
|
|
93
|
+
setSignerMusigNonceWithOverride(tx, signerKeychain, params.allowNonSegwitSigningWithoutPrevTx);
|
|
94
|
+
const response = await coin.signPsbt(tx.toHex(), params.walletId);
|
|
95
|
+
tx.combine(utxo_lib_1.bitgo.createPsbtFromHex(response.psbt, coin.network));
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
switch (params.signingStep) {
|
|
101
|
+
case 'signerNonce':
|
|
102
|
+
case 'cosignerNonce':
|
|
103
|
+
/**
|
|
104
|
+
* In certain cases, the caller of this method may not know whether the txHex contains a psbt with taproot key path spend input(s).
|
|
105
|
+
* Instead of throwing error, no-op and return the txHex. So that the caller can call this method in the same sequence.
|
|
106
|
+
*/
|
|
107
|
+
return { txHex: tx.toHex() };
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
let signedTransaction;
|
|
111
|
+
if (tx instanceof utxo_lib_1.bitgo.UtxoPsbt) {
|
|
112
|
+
(0, assert_1.default)(signerKeychain);
|
|
113
|
+
signedTransaction = (0, sign_1.signAndVerifyPsbt)(tx, signerKeychain, {
|
|
114
|
+
isLastSignature,
|
|
115
|
+
allowNonSegwitSigningWithoutPrevTx: params.allowNonSegwitSigningWithoutPrevTx,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
if (tx.ins.length !== params.txInfo?.unspents?.length) {
|
|
120
|
+
throw new Error('length of unspents array should equal to the number of transaction inputs');
|
|
121
|
+
}
|
|
122
|
+
if (!params.pubs || !(0, sdk_core_1.isTriple)(params.pubs)) {
|
|
123
|
+
throw new Error(`must provide xpub array`);
|
|
124
|
+
}
|
|
125
|
+
const keychains = params.pubs.map((pub) => utxo_lib_1.bip32.fromBase58(pub));
|
|
126
|
+
const cosignerPub = params.cosignerPub ?? params.pubs[2];
|
|
127
|
+
const cosignerKeychain = utxo_lib_1.bip32.fromBase58(cosignerPub);
|
|
128
|
+
(0, assert_1.default)(signerKeychain);
|
|
129
|
+
const walletSigner = new utxo_lib_1.bitgo.WalletUnspentSigner(keychains, signerKeychain, cosignerKeychain);
|
|
130
|
+
signedTransaction = (0, sign_1.signAndVerifyWalletTransaction)(tx, params.txInfo.unspents, walletSigner, {
|
|
131
|
+
isLastSignature,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
txHex: signedTransaction.toBuffer().toString('hex'),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnblRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0L3NpZ25UcmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQSwwQ0E2R0M7QUFqSUQsb0RBQTRCO0FBRTVCLG9EQUF1QjtBQUN2QixtREFBb0U7QUFDcEUsOERBQWdEO0FBQ2hELG1EQUF3RDtBQUV4RCxxQ0FBK0U7QUFHL0U7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFrQyxDQUFDO0FBRXRELEtBQUssVUFBVSxlQUFlLENBQ25DLElBQXNCLEVBQ3RCLEVBQStCLEVBQy9CLGNBQTBDLEVBQzFDLE1BUUM7SUFFRCxNQUFNLHlCQUF5QixHQUFHLEVBQUUsWUFBWSxnQkFBSyxDQUFDLFFBQVEsSUFBSSxnQkFBSyxDQUFDLGtDQUFrQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRS9HLElBQUksZUFBZSxHQUFHLEtBQUssQ0FBQztJQUM1QixJQUFJLGdCQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1FBQ3hDLGlHQUFpRztRQUNqRyxtR0FBbUc7UUFDbkcsMkJBQTJCO1FBQzNCLElBQUksTUFBTSxDQUFDLGVBQWUsSUFBSSx5QkFBeUIsRUFBRSxDQUFDO1lBQ3hELE1BQU0sSUFBSSxLQUFLLENBQUMsc0VBQXNFLENBQUMsQ0FBQztRQUMxRixDQUFDO1FBRUQsc0dBQXNHO1FBQ3RHLGVBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDO0lBQzNDLENBQUM7SUFFRCxNQUFNLCtCQUErQixHQUFHLENBQ3RDLElBQTRCLEVBQzVCLGNBQXNDLEVBQ3RDLGlCQUEwQixFQUMxQixFQUFFO1FBQ0YsT0FBTyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxJ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b20gJ2Fzc2VydCc7XG5cbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBiaXAzMiwgQklQMzJJbnRlcmZhY2UsIGJpdGdvIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgeyBpc1RyaXBsZSwgVHJpcGxlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuXG5pbXBvcnQgeyBzaWduQW5kVmVyaWZ5UHNidCwgc2lnbkFuZFZlcmlmeVdhbGxldFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vc2lnbic7XG5pbXBvcnQgeyBBYnN0cmFjdFV0eG9Db2luLCBEZWNvZGVkVHJhbnNhY3Rpb24sIFJvb3RXYWxsZXRLZXlzIH0gZnJvbSAnLi4vLi4vYWJzdHJhY3RVdHhvQ29pbic7XG5cbi8qKlxuICogS2V5IFZhbHVlOiBVbnNpZ25lZCB0eCBpZCA9PiBQU0JUXG4gKiBJdCBpcyB1c2VkIHRvIGNhY2hlIFBTQlRzIHdpdGggdGFwcm9vdCBrZXkgcGF0aCAoTXVTaWcyKSBpbnB1dHMgZHVyaW5nIGV4dGVybmFsIGV4cHJlc3Mgc2lnbmVyIGlzIGFjdGl2YXRlZC5cbiAqIFJlYXNvbjogTXVTaWcyIHNpZ25lciBzZWN1cmUgbm9uY2UgaXMgY2FjaGVkIGluIHRoZSBVdHhvUHNidCBvYmplY3QuIEl0IHdpbGwgYmUgcmVxdWlyZWQgZHVyaW5nIHRoZSBzaWduaW5nIHN0ZXAuXG4gKiBGb3IgbW9yZSBpbmZvLCBjaGVjayBTaWduVHJhbnNhY3Rpb25PcHRpb25zLnNpZ25pbmdTdGVwXG4gKlxuICogVE9ETyBCVEMtMjc2OiBUaGlzIGNhY2hlIG1heSBuZWVkIHRvIGJlIGRvbmUgd2l0aCBMUlUgbGlrZSBtZW1vcnkgc2FmZSBjYWNoaW5nIGlmIG1lbW9yeSBpc3N1ZXMgY29tZXMgdXAuXG4gKi9cbmNvbnN0IFBTQlRfQ0FDSEUgPSBuZXcgTWFwPHN0cmluZywgdXR4b2xpYi5iaXRnby5VdHhvUHNidD4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNpZ25UcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgdHg6IERlY29kZWRUcmFuc2FjdGlvbjxUTnVtYmVyPixcbiAgc2lnbmVyS2V5Y2hhaW46IEJJUDMySW50ZXJmYWNlIHwgdW5kZWZpbmVkLFxuICBwYXJhbXM6IHtcbiAgICB3YWxsZXRJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHR4SW5mbzogeyB1bnNwZW50cz86IHV0eG9saWIuYml0Z28uVW5zcGVudDxUTnVtYmVyPltdIH0gfCB1bmRlZmluZWQ7XG4gICAgaXNMYXN0U2lnbmF0dXJlOiBib29sZWFuO1xuICAgIHNpZ25pbmdTdGVwOiAnc2lnbmVyTm9uY2UnIHwgJ2Nvc2lnbmVyTm9uY2UnIHwgJ3NpZ25lclNpZ25hdHVyZScgfCB1bmRlZmluZWQ7XG4gICAgYWxsb3dOb25TZWd3aXRTaWduaW5nV2l0aG91dFByZXZUeDogYm9vbGVhbjtcbiAgICBwdWJzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICBjb3NpZ25lclB1Yjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB9XG4pOiBQcm9taXNlPHsgdHhIZXg6IHN0cmluZyB9PiB7XG4gIGNvbnN0IGlzVHhXaXRoS2V5UGF0aFNwZW5kSW5wdXQgPSB0eCBpbnN0YW5jZW9mIGJpdGdvLlV0eG9Qc2J0ICYmIGJpdGdvLmlzVHJhbnNhY3Rpb25XaXRoS2V5UGF0aFNwZW5kSW5wdXQodHgpO1xuXG4gIGxldCBpc0xhc3RTaWduYXR1cmUgPSBmYWxzZTtcbiAgaWYgKF8uaXNCb29sZWFuKHBhcmFtcy5pc0xhc3RTaWduYXR1cmUpKSB7XG4gICAgLy8gV2UgY2FuIG9ubHkgYmUgdGhlIGZpcnN0IHNpZ25hdHVyZSBvbiBhIHRyYW5zYWN0aW9uIHdpdGggdGFwcm9vdCBrZXkgcGF0aCBzcGVuZCBpbnB1dHMgYmVjYXVzZVxuICAgIC8vIHdlIHJlcXVpcmUgdGhlIHNlY3JldCBub25jZSBpbiB0aGUgY2FjaGUgb2YgdGhlIGZpcnN0IHNpZ25lciwgd2hpY2ggaXMgaW1wb3NzaWJsZSB0byByZXRyaWV2ZSBpZlxuICAgIC8vIGRlc2VyaWFsaXplZCBmcm9tIGEgaGV4LlxuICAgIGlmIChwYXJhbXMuaXNMYXN0U2lnbmF0dXJlICYmIGlzVHhXaXRoS2V5UGF0aFNwZW5kSW5wdXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGJlIGxhc3Qgc2lnbmF0dXJlIG9uIGEgdHJhbnNhY3Rpb24gd2l0aCBrZXkgcGF0aCBzcGVuZCBpbnB1dHMnKTtcbiAgICB9XG5cbiAgICAvLyBpZiBidWlsZCBpcyBjYWxsZWQgaW5zdGVhZCBvZiBidWlsZEluY29tcGxldGUsIG5vIHNpZ25hdHVyZSBwbGFjZWhvbGRlcnMgYXJlIGxlZnQgaW4gdGhlIHNpZyBzY3JpcHRcbiAgICBpc0xhc3RTaWduYXR1cmUgPSBwYXJhbXMuaXNMYXN0U2lnbmF0dXJlO1xuICB9XG5cbiAgY29uc3Qgc2V0U2lnbmVyTXVzaWdOb25jZVdpdGhPdmVycmlkZSA9IChcbiAgICBwc2J0OiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0LFxuICAgIHNpZ25lcktleWNoYWluOiB1dHhvbGliLkJJUDMySW50ZXJmYWNlLFxuICAgIG5vblNlZ3dpdE92ZXJyaWRlOiBib29sZWFuXG4gICkgPT4ge1xuICAgIHV0eG9saWIuYml0Z28ud2l0aFVuc2FmZU5vblNlZ3dpdChwc2J0LCAoKSA9PiBwc2J0LnNldEFsbElucHV0c011c2lnMk5vbmNlSEQoc2lnbmVyS2V5Y2hhaW4pLCBub25TZWd3aXRPdmVycmlkZSk7XG4gIH07XG5cbiAgaWYgKHR4IGluc3RhbmNlb2YgYml0Z28uVXR4b1BzYnQgJiYgaXNUeFdpdGhLZXlQYXRoU3BlbmRJbnB1dCkge1xuICAgIHN3aXRjaCAocGFyYW1zLnNpZ25pbmdTdGVwKSB7XG4gICAgICBjYXNlICdzaWduZXJOb25jZSc6XG4gICAgICAgIGFzc2VydChzaWduZXJLZXljaGFpbik7XG4gICAgICAgIHNldFNpZ25lck11c2lnTm9uY2VXaXRoT3ZlcnJpZGUodHgsIHNpZ25lcktleWNoYWluLCBwYXJhbXMuYWxsb3dOb25TZWd3aXRTaWduaW5nV2l0aG91dFByZXZUeCk7XG4gICAgICAgIFBTQlRfQ0FDSEUuc2V0KHR4LmdldFVuc2lnbmVkVHgoKS5nZXRJZCgpLCB0eCk7XG4gICAgICAgIHJldHVybiB7IHR4SGV4OiB0eC50b0hleCgpIH07XG4gICAgICBjYXNlICdjb3NpZ25lck5vbmNlJzpcbiAgICAgICAgYXNzZXJ0KHBhcmFtcy53YWxsZXRJZCwgJ3dhbGxldElkIGlzIHJlcXVpcmVkIGZvciBNdVNpZzIgYml0Z28gbm9uY2UnKTtcbiAgICAgICAgcmV0dXJuIHsgdHhIZXg6IChhd2FpdCBjb2luLnNpZ25Qc2J0KHR4LnRvSGV4KCksIHBhcmFtcy53YWxsZXRJZCkpLnBzYnQgfTtcbiAgICAgIGNhc2UgJ3NpZ25lclNpZ25hdHVyZSc6XG4gICAgICAgIGNvbnN0IHR4SWQgPSB0eC5nZXRVbnNpZ25lZFR4KCkuZ2V0SWQoKTtcbiAgICAgICAgY29uc3QgcHNidCA9IFBTQlRfQ0FDSEUuZ2V0KHR4SWQpO1xuICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgcHNidCxcbiAgICAgICAgICBgUHNidCBpcyBtaXNzaW5nIGZyb20gdHhDYWNoZSAoY2FjaGUgc2l6ZSAke1BTQlRfQ0FDSEUuc2l6ZX0pLlxuICAgICAgICAgICAgVGhpcyBtYXkgYmUgZHVlIHRvIHRoZSByZXF1ZXN0IGJlaW5nIHJvdXRlZCB0byBhIGRpZmZlcmVudCBCaXRHby1FeHByZXNzIGluc3RhbmNlIHRoYXQgZm9yIHNpZ25pbmcgc3RlcCAnc2lnbmVyTm9uY2UnLmBcbiAgICAgICAgKTtcbiAgICAgICAgUFNCVF9DQUNIRS5kZWxldGUodHhJZCk7XG4gICAgICAgIHR4ID0gcHNidC5jb21iaW5lKHR4KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyB0aGlzIGluc3RhbmNlIGlzIG5vdCBhbiBleHRlcm5hbCBzaWduZXJcbiAgICAgICAgYXNzZXJ0KHBhcmFtcy53YWxsZXRJZCwgJ3dhbGxldElkIGlzIHJlcXVpcmVkIGZvciBNdVNpZzIgYml0Z28gbm9uY2UnKTtcbiAgICAgICAgYXNzZXJ0KHNpZ25lcktleWNoYWluKTtcbiAgICAgICAgc2V0U2lnbmVyTXVzaWdOb25jZVdpdGhPdmVycmlkZSh0eCwgc2lnbmVyS2V5Y2hhaW4sIHBhcmFtcy5hbGxvd05vblNlZ3dpdFNpZ25pbmdXaXRob3V0UHJldlR4KTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjb2luLnNpZ25Qc2J0KHR4LnRvSGV4KCksIHBhcmFtcy53YWxsZXRJZCk7XG4gICAgICAgIHR4LmNvbWJpbmUoYml0Z28uY3JlYXRlUHNidEZyb21IZXgocmVzcG9uc2UucHNidCwgY29pbi5uZXR3b3JrKSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzd2l0Y2ggKHBhcmFtcy5zaWduaW5nU3RlcCkge1xuICAgICAgY2FzZSAnc2lnbmVyTm9uY2UnOlxuICAgICAgY2FzZSAnY29zaWduZXJOb25jZSc6XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBjZXJ0YWluIGNhc2VzLCB0aGUgY2FsbGVyIG9mIHRoaXMgbWV0aG9kIG1heSBub3Qga25vdyB3aGV0aGVyIHRoZSB0eEhleCBjb250YWlucyBhIHBzYnQgd2l0aCB0YXByb290IGtleSBwYXRoIHNwZW5kIGlucHV0KHMpLlxuICAgICAgICAgKiBJbnN0ZWFkIG9mIHRocm93aW5nIGVycm9yLCBuby1vcCBhbmQgcmV0dXJuIHRoZSB0eEhleC4gU28gdGhhdCB0aGUgY2FsbGVyIGNhbiBjYWxsIHRoaXMgbWV0aG9kIGluIHRoZSBzYW1lIHNlcXVlbmNlLlxuICAgICAgICAgKi9cbiAgICAgICAgcmV0dXJuIHsgdHhIZXg6IHR4LnRvSGV4KCkgfTtcbiAgICB9XG4gIH1cblxuICBsZXQgc2lnbmVkVHJhbnNhY3Rpb246IGJpdGdvLlV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+IHwgYml0Z28uVXR4b1BzYnQ7XG4gIGlmICh0eCBpbnN0YW5jZW9mIGJpdGdvLlV0eG9Qc2J0KSB7XG4gICAgYXNzZXJ0KHNpZ25lcktleWNoYWluKTtcbiAgICBzaWduZWRUcmFuc2FjdGlvbiA9IHNpZ25BbmRWZXJpZnlQc2J0KHR4LCBzaWduZXJLZXljaGFpbiwge1xuICAgICAgaXNMYXN0U2lnbmF0dXJlLFxuICAgICAgYWxsb3dOb25TZWd3aXRTaWduaW5nV2l0aG91dFByZXZUeDogcGFyYW1zLmFsbG93Tm9uU2Vnd2l0U2lnbmluZ1dpdGhvdXRQcmV2VHgsXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR4Lmlucy5sZW5ndGggIT09IHBhcmFtcy50eEluZm8/LnVuc3BlbnRzPy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbGVuZ3RoIG9mIHVuc3BlbnRzIGFycmF5IHNob3VsZCBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9uIGlucHV0cycpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLnB1YnMgfHwgIWlzVHJpcGxlKHBhcmFtcy5wdWJzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBtdXN0IHByb3ZpZGUgeHB1YiBhcnJheWApO1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWlucyA9IHBhcmFtcy5wdWJzLm1hcCgocHViKSA9PiBiaXAzMi5mcm9tQmFzZTU4KHB1YikpIGFzIFRyaXBsZTxCSVAzMkludGVyZmFjZT47XG4gICAgY29uc3QgY29zaWduZXJQdWIgPSBwYXJhbXMuY29zaWduZXJQdWIgPz8gcGFyYW1zLnB1YnNbMl07XG4gICAgY29uc3QgY29zaWduZXJLZXljaGFpbiA9IGJpcDMyLmZyb21CYXNlNTgoY29zaWduZXJQdWIpO1xuXG4gICAgYXNzZXJ0KHNpZ25lcktleWNoYWluKTtcbiAgICBjb25zdCB3YWxsZXRTaWduZXIgPSBuZXcgYml0Z28uV2FsbGV0VW5zcGVudFNpZ25lcjxSb290V2FsbGV0S2V5cz4oa2V5Y2hhaW5zLCBzaWduZXJLZXljaGFpbiwgY29zaWduZXJLZXljaGFpbik7XG4gICAgc2lnbmVkVHJhbnNhY3Rpb24gPSBzaWduQW5kVmVyaWZ5V2FsbGV0VHJhbnNhY3Rpb24odHgsIHBhcmFtcy50eEluZm8udW5zcGVudHMsIHdhbGxldFNpZ25lciwge1xuICAgICAgaXNMYXN0U2lnbmF0dXJlLFxuICAgIH0pIGFzIGJpdGdvLlV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eEhleDogc2lnbmVkVHJhbnNhY3Rpb24udG9CdWZmZXIoKS50b1N0cmluZygnaGV4JyksXG4gIH07XG59XG4iXX0=
|