@bitgo-beta/sdk-coin-sol 7.6.4-beta.654 → 7.6.4-beta.656
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/src/lib/confidentialTransferBuilder.d.ts +93 -0
- package/dist/cjs/src/lib/confidentialTransferBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/confidentialTransferBuilder.js +212 -0
- package/dist/cjs/src/lib/constants.d.ts +45 -2
- package/dist/cjs/src/lib/constants.d.ts.map +1 -1
- package/dist/cjs/src/lib/constants.js +53 -2
- package/dist/cjs/src/lib/explainTransactionWasm.d.ts.map +1 -1
- package/dist/cjs/src/lib/explainTransactionWasm.js +34 -1
- package/dist/cjs/src/lib/iface.d.ts +205 -2
- package/dist/cjs/src/lib/iface.d.ts.map +1 -1
- package/dist/cjs/src/lib/iface.js +1 -1
- package/dist/cjs/src/lib/index.d.ts +1 -0
- package/dist/cjs/src/lib/index.d.ts.map +1 -1
- package/dist/cjs/src/lib/index.js +4 -2
- package/dist/cjs/src/lib/instructionParamsFactory.d.ts.map +1 -1
- package/dist/cjs/src/lib/instructionParamsFactory.js +70 -1
- package/dist/cjs/src/lib/solInstructionFactory.d.ts +1 -1
- package/dist/cjs/src/lib/solInstructionFactory.d.ts.map +1 -1
- package/dist/cjs/src/lib/solInstructionFactory.js +446 -2
- package/dist/cjs/src/lib/transaction.d.ts.map +1 -1
- package/dist/cjs/src/lib/transaction.js +4 -1
- package/dist/cjs/src/lib/transactionBuilder.d.ts +2 -0
- package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/cjs/src/lib/transactionBuilder.js +2 -2
- package/dist/cjs/src/lib/transactionBuilderFactory.d.ts +9 -0
- package/dist/cjs/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/cjs/src/lib/transactionBuilderFactory.js +14 -1
- package/dist/cjs/src/lib/utils.d.ts.map +1 -1
- package/dist/cjs/src/lib/utils.js +23 -1
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.js +909 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/lib/confidentialTransferBuilder.d.ts +93 -0
- package/dist/esm/lib/confidentialTransferBuilder.d.ts.map +1 -0
- package/dist/esm/lib/confidentialTransferBuilder.js +205 -0
- package/dist/esm/lib/constants.d.ts +45 -2
- package/dist/esm/lib/constants.d.ts.map +1 -1
- package/dist/esm/lib/constants.js +52 -1
- package/dist/esm/lib/explainTransactionWasm.d.ts.map +1 -1
- package/dist/esm/lib/explainTransactionWasm.js +32 -2
- package/dist/esm/lib/iface.d.ts +205 -2
- package/dist/esm/lib/iface.d.ts.map +1 -1
- package/dist/esm/lib/iface.js +1 -1
- package/dist/esm/lib/index.d.ts +1 -0
- package/dist/esm/lib/index.d.ts.map +1 -1
- package/dist/esm/lib/index.js +2 -1
- package/dist/esm/lib/instructionParamsFactory.d.ts.map +1 -1
- package/dist/esm/lib/instructionParamsFactory.js +70 -1
- package/dist/esm/lib/solInstructionFactory.d.ts +1 -1
- package/dist/esm/lib/solInstructionFactory.d.ts.map +1 -1
- package/dist/esm/lib/solInstructionFactory.js +447 -3
- package/dist/esm/lib/transaction.d.ts.map +1 -1
- package/dist/esm/lib/transaction.js +4 -1
- package/dist/esm/lib/transactionBuilder.d.ts +2 -0
- package/dist/esm/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/esm/lib/transactionBuilder.js +2 -2
- package/dist/esm/lib/transactionBuilderFactory.d.ts +9 -0
- package/dist/esm/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/esm/lib/transactionBuilderFactory.js +14 -1
- package/dist/esm/lib/utils.d.ts.map +1 -1
- package/dist/esm/lib/utils.js +24 -2
- package/package.json +8 -7
|
@@ -46,6 +46,8 @@ function instructionParamsFactory(type, instructions, coinName, instructionMetad
|
|
|
46
46
|
return parseStakingDelegateInstructions(instructions);
|
|
47
47
|
case sdk_core_1.TransactionType.CustomTx:
|
|
48
48
|
return parseCustomInstructions(instructions, instructionMetadata);
|
|
49
|
+
case sdk_core_1.TransactionType.ConfidentialTransfer:
|
|
50
|
+
return parseConfidentialTransferInstructions(instructions, instructionMetadata);
|
|
49
51
|
default:
|
|
50
52
|
throw new sdk_core_1.NotSupported('Invalid transaction, transaction type not supported: ' + type);
|
|
51
53
|
}
|
|
@@ -1069,6 +1071,26 @@ function parseStakingAuthorizeRawInstructions(instructions) {
|
|
|
1069
1071
|
});
|
|
1070
1072
|
return instructionData;
|
|
1071
1073
|
}
|
|
1074
|
+
/**
|
|
1075
|
+
* Returns true if the instruction type is a confidential transfer instruction
|
|
1076
|
+
* (Token-2022 CT extension or zk-elgamal-proof program).
|
|
1077
|
+
*/
|
|
1078
|
+
function isConfidentialTransferInstruction(type) {
|
|
1079
|
+
switch (type) {
|
|
1080
|
+
case constants_1.InstructionBuilderTypes.ConfigureConfidentialTransferAccount:
|
|
1081
|
+
case constants_1.InstructionBuilderTypes.ApplyPendingBalance:
|
|
1082
|
+
case constants_1.InstructionBuilderTypes.ConfidentialDeposit:
|
|
1083
|
+
case constants_1.InstructionBuilderTypes.ConfidentialWithdraw:
|
|
1084
|
+
case constants_1.InstructionBuilderTypes.ConfidentialTransfer:
|
|
1085
|
+
case constants_1.InstructionBuilderTypes.VerifyPubkeyValidity:
|
|
1086
|
+
case constants_1.InstructionBuilderTypes.VerifyEqualityProof:
|
|
1087
|
+
case constants_1.InstructionBuilderTypes.VerifyValidityProof:
|
|
1088
|
+
case constants_1.InstructionBuilderTypes.VerifyRangeProof:
|
|
1089
|
+
return true;
|
|
1090
|
+
default:
|
|
1091
|
+
return false;
|
|
1092
|
+
}
|
|
1093
|
+
}
|
|
1072
1094
|
/**
|
|
1073
1095
|
* Parses Solana instructions to custom instruction params
|
|
1074
1096
|
*
|
|
@@ -1105,6 +1127,53 @@ function parseCustomInstructions(instructions, instructionMetadata) {
|
|
|
1105
1127
|
}
|
|
1106
1128
|
return instructionData;
|
|
1107
1129
|
}
|
|
1130
|
+
/**
|
|
1131
|
+
* Parses Solana instructions to confidential transfer instruction params.
|
|
1132
|
+
*
|
|
1133
|
+
* Iterates raw instructions in order, checking metadata at each position:
|
|
1134
|
+
* - CT instruction metadata is preserved as-is (CT instructions cannot be
|
|
1135
|
+
* decoded by @solana/spl-token or @solana/web3.js).
|
|
1136
|
+
* - CustomInstruction metadata is preserved as-is.
|
|
1137
|
+
* - All other instructions fall back to CustomInstruction format with raw
|
|
1138
|
+
* programId/keys/data.
|
|
1139
|
+
*
|
|
1140
|
+
* This single-pass approach preserves original instruction order so that
|
|
1141
|
+
* round-trip reconstruction is faithful.
|
|
1142
|
+
*
|
|
1143
|
+
* @param {TransactionInstruction[]} instructions - containing CT solana instructions
|
|
1144
|
+
* @param {InstructionParams[]} instructionMetadata - the instruction metadata for the transaction
|
|
1145
|
+
* @returns {InstructionParams[]} An array containing instruction params in original order
|
|
1146
|
+
*/
|
|
1147
|
+
function parseConfidentialTransferInstructions(instructions, instructionMetadata) {
|
|
1148
|
+
const instructionData = [];
|
|
1149
|
+
for (let i = 0; i < instructions.length; i++) {
|
|
1150
|
+
const instruction = instructions[i];
|
|
1151
|
+
// Check if we have metadata for this instruction position
|
|
1152
|
+
if (instructionMetadata && instructionMetadata[i]) {
|
|
1153
|
+
const metaType = instructionMetadata[i].type;
|
|
1154
|
+
// Preserve confidential transfer and custom instruction metadata as-is
|
|
1155
|
+
if (isConfidentialTransferInstruction(metaType) || metaType === constants_1.InstructionBuilderTypes.CustomInstruction) {
|
|
1156
|
+
instructionData.push(instructionMetadata[i]);
|
|
1157
|
+
continue;
|
|
1158
|
+
}
|
|
1159
|
+
}
|
|
1160
|
+
// Convert the raw instruction to CustomInstruction format
|
|
1161
|
+
const customInstruction = {
|
|
1162
|
+
type: constants_1.InstructionBuilderTypes.CustomInstruction,
|
|
1163
|
+
params: {
|
|
1164
|
+
programId: instruction.programId.toString(),
|
|
1165
|
+
keys: instruction.keys.map((key) => ({
|
|
1166
|
+
pubkey: key.pubkey.toString(),
|
|
1167
|
+
isSigner: key.isSigner,
|
|
1168
|
+
isWritable: key.isWritable,
|
|
1169
|
+
})),
|
|
1170
|
+
data: instruction.data.toString('base64'),
|
|
1171
|
+
},
|
|
1172
|
+
};
|
|
1173
|
+
instructionData.push(customInstruction);
|
|
1174
|
+
}
|
|
1175
|
+
return instructionData;
|
|
1176
|
+
}
|
|
1108
1177
|
function findTokenName(mintAddress, instructionMetadata, _useTokenAddressTokenName) {
|
|
1109
1178
|
let token;
|
|
1110
1179
|
statics_1.coins.forEach((value, key) => {
|
|
@@ -1142,4 +1211,4 @@ function findTransferHookAccounts(fromAddress, toAddress, tokenAddress, instruct
|
|
|
1142
1211
|
});
|
|
1143
1212
|
return transferHookAccounts;
|
|
1144
1213
|
}
|
|
1145
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9pbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFxRUEsNERBaUNDO0FBeXVDRCxzQ0FvQ0M7QUFFRCw0REFvQkM7QUF6NENELGlEQVkyQjtBQUMzQiw2Q0FjeUI7QUFFekIsc0RBQXlEO0FBQ3pELG1EQUFxRTtBQUNyRSxpREFBcUQ7QUFDckQsb0RBQTRCO0FBQzVCLDJDQUErRztBQXlCL0csbUNBQTZDO0FBRTdDLHVFQUFrRjtBQUVsRjs7Ozs7O0dBTUc7QUFDSCxTQUFnQix3QkFBd0IsQ0FDdEMsSUFBcUIsRUFDckIsWUFBc0MsRUFDdEMsUUFBaUIsRUFDakIsbUJBQXlDLEVBQ3pDLHlCQUFtQztJQUVuQyxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2IsS0FBSywwQkFBZSxDQUFDLG9CQUFvQjtZQUN2QyxPQUFPLDJCQUEyQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ25ELEtBQUssMEJBQWUsQ0FBQyxJQUFJO1lBQ3ZCLE9BQU8scUJBQXFCLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFLHlCQUF5QixDQUFDLENBQUM7UUFDN0YsS0FBSywwQkFBZSxDQUFDLGVBQWU7WUFDbEMsT0FBTyxnQ0FBZ0MsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4RCxLQUFLLDBCQUFlLENBQUMsaUJBQWlCO1lBQ3BDLE9BQU8sa0NBQWtDLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3BFLEtBQUssMEJBQWUsQ0FBQyxlQUFlO1lBQ2xDLE9BQU8sZ0NBQWdDLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEQsS0FBSywwQkFBZSxDQUFDLG9DQUFvQztZQUN2RCxPQUFPLHdCQUF3QixDQUFDLFlBQVksRUFBRSxtQkFBbUIsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1FBQ2hHLEtBQUss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QUFFO1FBQzNDLElBQ0UsV0FBVyxDQUFDLElBQUksS0FBSyxtQ0FBdUIsQ0FBQyxhQUFhO1lBQzFELFdBQVcsQ0FBQyxNQUFNLENBQUMsWUFBWSxLQUFLLFlBQVk7WUFDaEQsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEtBQUssV0FBVztZQUM5QyxXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQzFDLENBQUM7WUFDRCxvQkFBb0IsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDO1FBQ2pFLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sb0JBQW9CLENBQUM7QUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERlY29kZWRUcmFuc2ZlckNoZWNrZWRJbnN0cnVjdGlvbixcbiAgZGVjb2RlVHJhbnNmZXJDaGVja2VkSW5zdHJ1Y3Rpb24sXG4gIGRlY29kZVRyYW5zZmVyQ2hlY2tlZFdpdGhGZWVJbnN0cnVjdGlvbixcbiAgRGVjb2RlZEJ1cm5JbnN0cnVjdGlvbixcbiAgZGVjb2RlQnVybkluc3RydWN0aW9uLFxuICBEZWNvZGVkTWludFRvSW5zdHJ1Y3Rpb24sXG4gIGRlY29kZU1pbnRUb0luc3RydWN0aW9uLFxuICBUT0tFTl8yMDIyX1BST0dSQU1fSUQsXG4gIGRlY29kZUFwcHJvdmVJbnN0cnVjdGlvbixcbiAgVG9rZW5JbnN0cnVjdGlvbixcbiAgVHJhbnNmZXJGZWVJbnN0cnVjdGlvbixcbn0gZnJvbSAnQHNvbGFuYS9zcGwtdG9rZW4nO1xuaW1wb3J0IHtcbiAgQWxsb2NhdGVQYXJhbXMsXG4gIEFzc2lnblBhcmFtcyxcbiAgQ3JlYXRlQWNjb3VudFBhcmFtcyxcbiAgRGVhY3RpdmF0ZVN0YWtlUGFyYW1zLFxuICBEZWNvZGVkVHJhbnNmZXJJbnN0cnVjdGlvbixcbiAgRGVsZWdhdGVTdGFrZVBhcmFtcyxcbiAgSW5pdGlhbGl6ZVN0YWtlUGFyYW1zLFxuICBTcGxpdFN0YWtlUGFyYW1zLFxuICBTdGFrZUluc3RydWN0aW9uLFxuICBTdGFrZVByb2dyYW0sXG4gIFN5c3RlbUluc3RydWN0aW9uLFxuICBUcmFuc2FjdGlvbkluc3RydWN0aW9uLFxuICBDb21wdXRlQnVkZ2V0SW5zdHJ1Y3Rpb24sXG59IGZyb20gJ0Bzb2xhbmEvd2ViMy5qcyc7XG5cbmltcG9ydCB7IFNvbFN0YWtpbmdUeXBlRW51bSB9IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgTm90U3VwcG9ydGVkLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBjb2lucywgU29sQ29pbiB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMsIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0sIHdhbGxldEluaXRJbnN0cnVjdGlvbkluZGV4ZXMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBBdGFDbG9zZSxcbiAgQXRhSW5pdCxcbiAgQXRhUmVjb3Zlck5lc3RlZCxcbiAgQnVybixcbiAgRXh0cmFBY2NvdW50TWV0YSxcbiAgSW5zdHJ1Y3Rpb25QYXJhbXMsXG4gIE1lbW8sXG4gIE1pbnRUbyxcbiAgTm9uY2UsXG4gIFBlcm1pc3Npb25sZXNzVGhhd0lkZW1wb3RlbnQsXG4gIFN0YWtpbmdBY3RpdmF0ZSxcbiAgU3Rha2luZ0F1dGhvcml6ZSxcbiAgU3Rha2luZ0RlYWN0aXZhdGUsXG4gIFN0YWtpbmdEZWxlZ2F0ZSxcbiAgU3Rha2luZ1dpdGhkcmF3LFxuICBUb2tlblRyYW5zZmVyLFxuICBUcmFuc2ZlcixcbiAgV2FsbGV0SW5pdCxcbiAgU2V0Q29tcHV0ZVVuaXRMaW1pdCxcbiAgU2V0UHJpb3JpdHlGZWUsXG4gIEN1c3RvbUluc3RydWN0aW9uLFxuICBBcHByb3ZlLFxufSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IGdldEluc3RydWN0aW9uVHlwZSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgRGVwb3NpdFNvbFBhcmFtcywgV2l0aGRyYXdTdGFrZVBhcmFtcyB9IGZyb20gJ0Bzb2xhbmEvc3BsLXN0YWtlLXBvb2wnO1xuaW1wb3J0IHsgZGVjb2RlRGVwb3NpdFNvbCwgZGVjb2RlV2l0aGRyYXdTdGFrZSB9IGZyb20gJy4vaml0b1N0YWtlUG9vbE9wZXJhdGlvbnMnO1xuXG4vKipcbiAqIENvbnN0cnVjdCBpbnN0cnVjdGlvbnMgcGFyYW1zIGZyb20gU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25UeXBlfSB0eXBlIC0gdGhlIHRyYW5zYWN0aW9uIHR5cGVcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBzb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RydWN0aW9uUGFyYW1zRmFjdG9yeShcbiAgdHlwZTogVHJhbnNhY3Rpb25UeXBlLFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSxcbiAgY29pbk5hbWU/OiBzdHJpbmcsXG4gIGluc3RydWN0aW9uTWV0YWRhdGE/OiBJbnN0cnVjdGlvblBhcmFtc1tdLFxuICBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lPzogYm9vbGVhblxuKTogSW5zdHJ1Y3Rpb25QYXJhbXNbXSB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uOlxuICAgICAgcmV0dXJuIHBhcnNlV2FsbGV0SW5pdEluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlNlbmQ6XG4gICAgICByZXR1cm4gcGFyc2VTZW5kSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucywgaW5zdHJ1Y3Rpb25NZXRhZGF0YSwgX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZSk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlOlxuICAgICAgcmV0dXJuIHBhcnNlU3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGU6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nRGVhY3RpdmF0ZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMsIGNvaW5OYW1lKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXc6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nV2l0aGRyYXdJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5Bc3NvY2lhdGVkVG9rZW5BY2NvdW50SW5pdGlhbGl6YXRpb246XG4gICAgICByZXR1cm4gcGFyc2VBdGFJbml0SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucywgaW5zdHJ1Y3Rpb25NZXRhZGF0YSwgX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZSk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQ2xvc2VBc3NvY2lhdGVkVG9rZW5BY2NvdW50OlxuICAgICAgcmV0dXJuIHBhcnNlQXRhQ2xvc2VJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQXV0aG9yaXplOlxuICAgICAgcmV0dXJuIHBhcnNlU3Rha2luZ0F1dGhvcml6ZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemVSYXc6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nQXV0aG9yaXplUmF3SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlbGVnYXRlOlxuICAgICAgcmV0dXJuIHBhcnNlU3Rha2luZ0RlbGVnYXRlSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHg6XG4gICAgICByZXR1cm4gcGFyc2VDdXN0b21JbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zLCBpbnN0cnVjdGlvbk1ldGFkYXRhKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCB0cmFuc2FjdGlvbiwgdHJhbnNhY3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkOiAnICsgdHlwZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBXYWxsZXQgaW5pdGlhbGl6YXRpb24gdHggaW5zdHJ1Y3Rpb25zIHBhcmFtc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBjb250YWluaW5nIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBub25jZSBzb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIFdhbGxldCBpbml0aWFsaXphdGlvbiB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVdhbGxldEluaXRJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10pOiBBcnJheTxXYWxsZXRJbml0IHwgTWVtbz4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PFdhbGxldEluaXQgfCBNZW1vPiA9IFtdO1xuICBjb25zdCBjcmVhdGVJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUNyZWF0ZUFjY291bnQoaW5zdHJ1Y3Rpb25zW3dhbGxldEluaXRJbnN0cnVjdGlvbkluZGV4ZXMuQ3JlYXRlXSk7XG4gIGNvbnN0IG5vbmNlSW5pdEluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VJbml0aWFsaXplKFxuICAgIGluc3RydWN0aW9uc1t3YWxsZXRJbml0SW5zdHJ1Y3Rpb25JbmRleGVzLkluaXRpYWxpemVOb25jZUFjY291bnRdXG4gICk7XG5cbiAgY29uc3Qgd2FsbGV0SW5pdDogV2FsbGV0SW5pdCA9IHtcbiAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVOb25jZUFjY291bnQsXG4gICAgcGFyYW1zOiB7XG4gICAgICBmcm9tQWRkcmVzczogY3JlYXRlSW5zdHJ1Y3Rpb24uZnJvbVB1YmtleS50b1N0cmluZygpLFxuICAgICAgbm9uY2VBZGRyZXNzOiBub25jZUluaXRJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgYXV0aEFkZHJlc3M6IG5vbmNlSW5pdEluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIGFtb3VudDogY3JlYXRlSW5zdHJ1Y3Rpb24ubGFtcG9ydHMudG9TdHJpbmcoKSxcbiAgICB9LFxuICB9O1xuICBpbnN0cnVjdGlvbkRhdGEucHVzaCh3YWxsZXRJbml0KTtcblxuICBjb25zdCBtZW1vID0gZ2V0TWVtbyhpbnN0cnVjdGlvbnMsIHdhbGxldEluaXRJbnN0cnVjdGlvbkluZGV4ZXMpO1xuICBpZiAobWVtbykge1xuICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG1lbW8pO1xuICB9XG5cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBTZW5kIHR4IGluc3RydWN0aW9ucyBwYXJhbXNcbiAqIE9ubHkgc3VwcG9ydHMgTWVtbywgVHJhbnNmZXIgYW5kIEFkdmFuY2UgTm9uY2UgU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBTZW5kIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU2VuZEluc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10sXG4gIGluc3RydWN0aW9uTWV0YWRhdGE/OiBJbnN0cnVjdGlvblBhcmFtc1tdLFxuICBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lPzogYm9vbGVhblxuKTogQXJyYXk8XG4gIHwgTm9uY2VcbiAgfCBNZW1vXG4gIHwgVHJhbnNmZXJcbiAgfCBUb2tlblRyYW5zZmVyXG4gIHwgQXRhSW5pdFxuICB8IEF0YUNsb3NlXG4gIHwgU2V0Q29tcHV0ZVVuaXRMaW1pdFxuICB8IFNldFByaW9yaXR5RmVlXG4gIHwgTWludFRvXG4gIHwgQnVyblxuICB8IEFwcHJvdmVcbiAgfCBQZXJtaXNzaW9ubGVzc1RoYXdJZGVtcG90ZW50XG4+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxcbiAgICB8IE5vbmNlXG4gICAgfCBNZW1vXG4gICAgfCBUcmFuc2ZlclxuICAgIHwgVG9rZW5UcmFuc2ZlclxuICAgIHwgQXRhSW5pdFxuICAgIHwgQXRhQ2xvc2VcbiAgICB8IFNldENvbXB1dGVVbml0TGltaXRcbiAgICB8IFNldFByaW9yaXR5RmVlXG4gICAgfCBNaW50VG9cbiAgICB8IEJ1cm5cbiAgICB8IEFwcHJvdmVcbiAgICB8IFBlcm1pc3Npb25sZXNzVGhhd0lkZW1wb3RlbnRcbiAgPiA9IFtdO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLk1lbW86XG4gICAgICAgIGNvbnN0IG1lbW86IE1lbW8gPSB7IHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRyYW5zZmVyOlxuICAgICAgICBjb25zdCB0cmFuc2Zlckluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlVHJhbnNmZXIoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCB0cmFuc2ZlcjogVHJhbnNmZXIgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVHJhbnNmZXIsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBmcm9tQWRkcmVzczogdHJhbnNmZXJJbnN0cnVjdGlvbi5mcm9tUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b0FkZHJlc3M6IHRyYW5zZmVySW5zdHJ1Y3Rpb24udG9QdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogdHJhbnNmZXJJbnN0cnVjdGlvbi5sYW1wb3J0cy50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHRyYW5zZmVyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uVG9rZW5UcmFuc2ZlcjpcbiAgICAgICAgY29uc3QgaXNUb2tlbjIwMjJUcmFuc2ZlciA9IGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpID09PSBUT0tFTl8yMDIyX1BST0dSQU1fSUQudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgaXNUcmFuc2ZlcldpdGhGZWUgPVxuICAgICAgICAgIGlzVG9rZW4yMDIyVHJhbnNmZXIgJiZcbiAgICAgICAgICBpbnN0cnVjdGlvbi5kYXRhLmxlbmd0aCA+PSAyICYmXG4gICAgICAgICAgaW5zdHJ1Y3Rpb24uZGF0YVswXSA9PT0gVG9rZW5JbnN0cnVjdGlvbi5UcmFuc2ZlckZlZUV4dGVuc2lvbiAmJlxuICAgICAgICAgIGluc3RydWN0aW9uLmRhdGFbMV0gPT09IFRyYW5zZmVyRmVlSW5zdHJ1Y3Rpb24uVHJhbnNmZXJDaGVja2VkV2l0aEZlZTtcbiAgICAgICAgbGV0IHR0S2V5czogRGVjb2RlZFRyYW5zZmVyQ2hlY2tlZEluc3RydWN0aW9uWydrZXlzJ107XG4gICAgICAgIGxldCB0dEFtb3VudDogYmlnaW50O1xuICAgICAgICBsZXQgdHREZWNpbWFsczogbnVtYmVyO1xuICAgICAgICBsZXQgdHRGZWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGlzVHJhbnNmZXJXaXRoRmVlKSB7XG4gICAgICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZVRyYW5zZmVyQ2hlY2tlZFdpdGhGZWVJbnN0cnVjdGlvbihpbnN0cnVjdGlvbiwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcbiAgICAgICAgICAvLyBXaXRoRmVlIGV4cG9zZXMgYGF1dGhvcml0eWAgd2hlcmUgVHJhbnNmZXJDaGVja2VkIGV4cG9zZXMgYG93bmVyYDsgbm9ybWFsaXplIHRvIG93bmVyLlxuICAgICAgICAgIHR0S2V5cyA9IHtcbiAgICAgICAgICAgIHNvdXJjZTogZGVjb2RlZC5rZXlzLnNvdXJjZSxcbiAgICAgICAgICAgIG1pbnQ6IGRlY29kZWQua2V5cy5taW50LFxuICAgICAgICAgICAgZGVzdGluYXRpb246IGRlY29kZWQua2V5cy5kZXN0aW5hdGlvbixcbiAgICAgICAgICAgIG93bmVyOiBkZWNvZGVkLmtleXMuYXV0aG9yaXR5LFxuICAgICAgICAgIH0gYXMgRGVjb2RlZFRyYW5zZmVyQ2hlY2tlZEluc3RydWN0aW9uWydrZXlzJ107XG4gICAgICAgICAgdHRBbW91bnQgPSBkZWNvZGVkLmRhdGEuYW1vdW50O1xuICAgICAgICAgIHR0RGVjaW1hbHMgPSBkZWNvZGVkLmRhdGEuZGVjaW1hbHM7XG4gICAgICAgICAgdHRGZWUgPSBkZWNvZGVkLmRhdGEuZmVlLnRvU3RyaW5nKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZVRyYW5zZmVyQ2hlY2tlZEluc3RydWN0aW9uKFxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb24sXG4gICAgICAgICAgICBpc1Rva2VuMjAyMlRyYW5zZmVyID8gVE9LRU5fMjAyMl9QUk9HUkFNX0lEIDogdW5kZWZpbmVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0dEtleXMgPSBkZWNvZGVkLmtleXM7XG4gICAgICAgICAgdHRBbW91bnQgPSBkZWNvZGVkLmRhdGEuYW1vdW50O1xuICAgICAgICAgIHR0RGVjaW1hbHMgPSBkZWNvZGVkLmRhdGEuZGVjaW1hbHM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9rZW5BZGRyZXNzID0gdHRLZXlzLm1pbnQucHVia2V5LnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHRva2VuTmFtZSA9IGZpbmRUb2tlbk5hbWUodG9rZW5BZGRyZXNzLCBpbnN0cnVjdGlvbk1ldGFkYXRhLCBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKTtcbiAgICAgICAgbGV0IHByb2dyYW1JREZvclRva2VuVHJhbnNmZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGluc3RydWN0aW9uLnByb2dyYW1JZCkge1xuICAgICAgICAgIHByb2dyYW1JREZvclRva2VuVHJhbnNmZXIgPSBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmFuc2Zlckhvb2tBY2NvdW50cyA9IGZpbmRUcmFuc2Zlckhvb2tBY2NvdW50cyhcbiAgICAgICAgICB0dEtleXMub3duZXIucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgdHRLZXlzLmRlc3RpbmF0aW9uLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgICBpbnN0cnVjdGlvbk1ldGFkYXRhXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHRva2VuVHJhbnNmZXI6IFRva2VuVHJhbnNmZXIgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVG9rZW5UcmFuc2ZlcixcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGZyb21BZGRyZXNzOiB0dEtleXMub3duZXIucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b0FkZHJlc3M6IHR0S2V5cy5kZXN0aW5hdGlvbi5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogdHRBbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuTmFtZSxcbiAgICAgICAgICAgIHNvdXJjZUFkZHJlc3M6IHR0S2V5cy5zb3VyY2UucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlbkFkZHJlc3M6IHRva2VuQWRkcmVzcyxcbiAgICAgICAgICAgIHByb2dyYW1JZDogcHJvZ3JhbUlERm9yVG9rZW5UcmFuc2ZlcixcbiAgICAgICAgICAgIGRlY2ltYWxQbGFjZXM6IHR0RGVjaW1hbHMsXG4gICAgICAgICAgICAuLi4odHRGZWUgIT09IHVuZGVmaW5lZCA/IHsgZmVlOiB0dEZlZSB9IDoge30pLFxuICAgICAgICAgICAgLi4uKHRyYW5zZmVySG9va0FjY291bnRzID8geyB0cmFuc2Zlckhvb2tBY2NvdW50cyB9IDoge30pLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHRva2VuVHJhbnNmZXIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BcHByb3ZlOlxuICAgICAgICBjb25zdCBwcm9ncmFtSWQgPSBpbnN0cnVjdGlvbi5wcm9ncmFtSWQuZXF1YWxzKFRPS0VOXzIwMjJfUFJPR1JBTV9JRCkgPyBUT0tFTl8yMDIyX1BST0dSQU1fSUQgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGFwcHJvdmVJbnN0cnVjdGlvbiA9IGRlY29kZUFwcHJvdmVJbnN0cnVjdGlvbihpbnN0cnVjdGlvbiwgcHJvZ3JhbUlkKTtcbiAgICAgICAgY29uc3QgYXBwcm92ZTogQXBwcm92ZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5BcHByb3ZlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgYWNjb3VudEFkZHJlc3M6IGFwcHJvdmVJbnN0cnVjdGlvbi5rZXlzLmFjY291bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGRlbGVnYXRlQWRkcmVzczogYXBwcm92ZUluc3RydWN0aW9uLmtleXMuZGVsZWdhdGUudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG93bmVyQWRkcmVzczogYXBwcm92ZUluc3RydWN0aW9uLmtleXMub3duZXIudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogYXBwcm92ZUluc3RydWN0aW9uLmRhdGEuYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBwcm9ncmFtSWQ6IHByb2dyYW1JZCAmJiBwcm9ncmFtSWQudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChhcHByb3ZlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uSW5pdGlhbGl6ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICAgIGNvbnN0IG1pbnRBZGRyZXNzID0gaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5NaW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IG1pbnRUb2tlbk5hbWUgPSBmaW5kVG9rZW5OYW1lKG1pbnRBZGRyZXNzLCBpbnN0cnVjdGlvbk1ldGFkYXRhLCBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKTtcbiAgICAgICAgbGV0IHByb2dyYW1JRDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKSB7XG4gICAgICAgICAgcHJvZ3JhbUlEID0gaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhdGFJbml0OiBBdGFJbml0ID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgICAgIGF0YUFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuQVRBQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBvd25lckFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuT3duZXJBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHBheWVyQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5QYXllckFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiBtaW50VG9rZW5OYW1lLFxuICAgICAgICAgICAgcHJvZ3JhbUlkOiBwcm9ncmFtSUQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goYXRhSW5pdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWNjb3VudEFkZHJlc3MgPSBpbnN0cnVjdGlvbi5rZXlzW2Nsb3NlQXRhSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5BY2NvdW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uQWRkcmVzcyA9XG4gICAgICAgICAgaW5zdHJ1Y3Rpb24ua2V5c1tjbG9zZUF0YUluc3RydWN0aW9uS2V5c0luZGV4ZXMuRGVzdGluYXRpb25BZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgYXV0aG9yaXR5QWRkcmVzcyA9IGluc3RydWN0aW9uLmtleXNbY2xvc2VBdGFJbnN0cnVjdGlvbktleXNJbmRleGVzLkF1dGhvcml0eUFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpO1xuXG4gICAgICAgIGNvbnN0IGF0YUNsb3NlOiBBdGFDbG9zZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBhY2NvdW50QWRkcmVzcyxcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uQWRkcmVzcyxcbiAgICAgICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goYXRhQ2xvc2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TZXRDb21wdXRlVW5pdExpbWl0OlxuICAgICAgICBjb25zdCBzZXRDb21wdXRlVW5pdExpbWl0UGFyYW1zID0gQ29tcHV0ZUJ1ZGdldEluc3RydWN0aW9uLmRlY29kZVNldENvbXB1dGVVbml0TGltaXQoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBzZXRDb21wdXRlVW5pdExpbWl0OiBTZXRDb21wdXRlVW5pdExpbWl0ID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlNldENvbXB1dGVVbml0TGltaXQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB1bml0czogc2V0Q29tcHV0ZVVuaXRMaW1pdFBhcmFtcy51bml0cyxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChzZXRDb21wdXRlVW5pdExpbWl0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU2V0UHJpb3JpdHlGZWU6XG4gICAgICAgIGNvbnN0IHNldENvbXB1dGVVbml0UHJpY2VQYXJhbXMgPSBDb21wdXRlQnVkZ2V0SW5zdHJ1Y3Rpb24uZGVjb2RlU2V0Q29tcHV0ZVVuaXRQcmljZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IHNldFByaW9yaXR5RmVlOiBTZXRQcmlvcml0eUZlZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TZXRQcmlvcml0eUZlZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGZlZTogc2V0Q29tcHV0ZVVuaXRQcmljZVBhcmFtcy5taWNyb0xhbXBvcnRzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHNldFByaW9yaXR5RmVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uTWludFRvOlxuICAgICAgICBsZXQgbWludFRvSW5zdHJ1Y3Rpb246IERlY29kZWRNaW50VG9JbnN0cnVjdGlvbjtcbiAgICAgICAgaWYgKGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpICE9PSBUT0tFTl8yMDIyX1BST0dSQU1fSUQudG9TdHJpbmcoKSkge1xuICAgICAgICAgIG1pbnRUb0luc3RydWN0aW9uID0gZGVjb2RlTWludFRvSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1pbnRUb0luc3RydWN0aW9uID0gZGVjb2RlTWludFRvSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24sIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWludEFkZHJlc3NGb3JNaW50ID0gbWludFRvSW5zdHJ1Y3Rpb24ua2V5cy5taW50LnB1YmtleS50b1N0cmluZygpO1xuICAgICAgICBjb25zdCB0b2tlbk5hbWVGb3JNaW50ID0gZmluZFRva2VuTmFtZShtaW50QWRkcmVzc0Zvck1pbnQsIGluc3RydWN0aW9uTWV0YWRhdGEsIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWUpO1xuICAgICAgICBsZXQgcHJvZ3JhbUlERm9yTWludDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKSB7XG4gICAgICAgICAgcHJvZ3JhbUlERm9yTWludCA9IGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1pbnRUbzogTWludFRvID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1pbnRUbyxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIG1pbnRBZGRyZXNzOiBtaW50QWRkcmVzc0Zvck1pbnQsXG4gICAgICAgICAgICBkZXN0aW5hdGlvbkFkZHJlc3M6IG1pbnRUb0luc3RydWN0aW9uLmtleXMuZGVzdGluYXRpb24ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRob3JpdHlBZGRyZXNzOiBtaW50VG9JbnN0cnVjdGlvbi5rZXlzLmF1dGhvcml0eS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogbWludFRvSW5zdHJ1Y3Rpb24uZGF0YS5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuTmFtZTogdG9rZW5OYW1lRm9yTWludCxcbiAgICAgICAgICAgIGRlY2ltYWxQbGFjZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHByb2dyYW1JZDogcHJvZ3JhbUlERm9yTWludCxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtaW50VG8pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5CdXJuOlxuICAgICAgICBsZXQgYnVybkluc3RydWN0aW9uOiBEZWNvZGVkQnVybkluc3RydWN0aW9uO1xuICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCkgIT09IFRPS0VOXzIwMjJfUFJPR1JBTV9JRC50b1N0cmluZygpKSB7XG4gICAgICAgICAgYnVybkluc3RydWN0aW9uID0gZGVjb2RlQnVybkluc3RydWN0aW9uKGluc3RydWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidXJuSW5zdHJ1Y3Rpb24gPSBkZWNvZGVCdXJuSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24sIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWludEFkZHJlc3NGb3JCdXJuID0gYnVybkluc3RydWN0aW9uLmtleXMubWludC5wdWJrZXkudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgdG9rZW5OYW1lRm9yQnVybiA9IGZpbmRUb2tlbk5hbWUobWludEFkZHJlc3NGb3JCdXJuLCBpbnN0cnVjdGlvbk1ldGFkYXRhLCBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKTtcbiAgICAgICAgbGV0IHByb2dyYW1JREZvckJ1cm46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGluc3RydWN0aW9uLnByb2dyYW1JZCkge1xuICAgICAgICAgIHByb2dyYW1JREZvckJ1cm4gPSBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBidXJuOiBCdXJuID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkJ1cm4sXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBtaW50QWRkcmVzczogbWludEFkZHJlc3NGb3JCdXJuLFxuICAgICAgICAgICAgYWNjb3VudEFkZHJlc3M6IGJ1cm5JbnN0cnVjdGlvbi5rZXlzLmFjY291bnQucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRob3JpdHlBZGRyZXNzOiBidXJuSW5zdHJ1Y3Rpb24ua2V5cy5vd25lci5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogYnVybkluc3RydWN0aW9uLmRhdGEuYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlbk5hbWU6IHRva2VuTmFtZUZvckJ1cm4sXG4gICAgICAgICAgICBkZWNpbWFsUGxhY2VzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBwcm9ncmFtSWQ6IHByb2dyYW1JREZvckJ1cm4sXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goYnVybik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlBlcm1pc3Npb25sZXNzVGhhd0lkZW1wb3RlbnQ6XG4gICAgICAgIC8vIEFjY291bnQgb3JkZXIgbWF0Y2hlcyB0aGUgZml4ZWQgbGF5b3V0IGVtaXR0ZWQgYnkgc29sSW5zdHJ1Y3Rpb25GYWN0b3J5OlxuICAgICAgICAvLyBbYXV0aG9yaXR5LCBtaW50LCB0b2tlbkFjY291bnQsIGZsYWdBY2NvdW50LCB0b2tlbkFjY291bnRPd25lciwgbWludENvbmZpZyxcbiAgICAgICAgLy8gIHRva2VuUHJvZ3JhbSwgc3lzdGVtUHJvZ3JhbSwgZ2F0aW5nUHJvZ3JhbSwgLi4uZXh0cmFBY2NvdW50c10uXG4gICAgICAgIGNvbnN0IHRoYXdFeHRyYUFjY291bnRzOiBFeHRyYUFjY291bnRNZXRhW10gPSBpbnN0cnVjdGlvbi5rZXlzLnNsaWNlKDkpLm1hcCgoa2V5KSA9PiAoe1xuICAgICAgICAgIHB1YmtleToga2V5LnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIGlzU2lnbmVyOiBrZXkuaXNTaWduZXIsXG4gICAgICAgICAgaXNXcml0YWJsZToga2V5LmlzV3JpdGFibGUsXG4gICAgICAgIH0pKTtcbiAgICAgICAgY29uc3QgcGVybWlzc2lvbmxlc3NUaGF3OiBQZXJtaXNzaW9ubGVzc1RoYXdJZGVtcG90ZW50ID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlBlcm1pc3Npb25sZXNzVGhhd0lkZW1wb3RlbnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBhdXRob3JpdHk6IGluc3RydWN0aW9uLmtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBtaW50OiBpbnN0cnVjdGlvbi5rZXlzWzFdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5BY2NvdW50OiBpbnN0cnVjdGlvbi5rZXlzWzJdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgZmxhZ0FjY291bnQ6IGluc3RydWN0aW9uLmtleXNbM10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlbkFjY291bnRPd25lcjogaW5zdHJ1Y3Rpb24ua2V5c1s0XS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG1pbnRDb25maWc6IGluc3RydWN0aW9uLmtleXNbNV0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlblByb2dyYW06IGluc3RydWN0aW9uLmtleXNbNl0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBzeXN0ZW1Qcm9ncmFtOiBpbnN0cnVjdGlvbi5rZXlzWzddLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgZ2F0aW5nUHJvZ3JhbTogaW5zdHJ1Y3Rpb24ua2V5c1s4XS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGV4dHJhQWNjb3VudHM6IHRoYXdFeHRyYUFjY291bnRzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHBlcm1pc3Npb25sZXNzVGhhdyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgICAnSW52YWxpZCB0cmFuc2FjdGlvbiwgaW5zdHJ1Y3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkOiAnICsgZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG50eXBlIFN0YWtpbmdJbnN0cnVjdGlvbnMgPSB7XG4gIGRlcG9zaXRTb2w/OiBEZXBvc2l0U29sUGFyYW1zO1xuICBjcmVhdGU/OiBDcmVhdGVBY2NvdW50UGFyYW1zO1xuICBpbml0aWFsaXplPzogSW5pdGlhbGl6ZVN0YWtlUGFyYW1zO1xuICBkZWxlZ2F0ZT86IERlbGVnYXRlU3Rha2VQYXJhbXM7XG4gIGhhc0F0YUluaXQ/OiBib29sZWFuO1xufTtcblxudHlwZSBKaXRvU3Rha2luZ0luc3RydWN0aW9ucyA9IFN0YWtpbmdJbnN0cnVjdGlvbnMgJiB7XG4gIGRlcG9zaXRTb2w6IE5vbk51bGxhYmxlPFN0YWtpbmdJbnN0cnVjdGlvbnNbJ2RlcG9zaXRTb2wnXT47XG59O1xuXG5mdW5jdGlvbiBpc0ppdG9TdGFraW5nSW5zdHJ1Y3Rpb25zKHNpOiBTdGFraW5nSW5zdHJ1Y3Rpb25zKTogc2kgaXMgSml0b1N0YWtpbmdJbnN0cnVjdGlvbnMge1xuICByZXR1cm4gc2kuZGVwb3NpdFNvbCAhPT0gdW5kZWZpbmVkO1xufVxuXG50eXBlIE1hcmluYWRlU3Rha2luZ0luc3RydWN0aW9ucyA9IFN0YWtpbmdJbnN0cnVjdGlvbnMgJiB7XG4gIGNyZWF0ZTogTm9uTnVsbGFibGU8U3Rha2luZ0luc3RydWN0aW9uc1snY3JlYXRlJ10+O1xuICBpbml0aWFsaXplOiBOb25OdWxsYWJsZTxTdGFraW5nSW5zdHJ1Y3Rpb25zWydpbml0aWFsaXplJ10+O1xufTtcblxuZnVuY3Rpb24gaXNNYXJpbmFkZVN0YWtpbmdJbnN0cnVjdGlvbnMoc2k6IFN0YWtpbmdJbnN0cnVjdGlvbnMpOiBzaSBpcyBNYXJpbmFkZVN0YWtpbmdJbnN0cnVjdGlvbnMge1xuICByZXR1cm4gc2kuY3JlYXRlICE9PSB1bmRlZmluZWQgJiYgc2kuaW5pdGlhbGl6ZSAhPT0gdW5kZWZpbmVkICYmIHNpLmRlbGVnYXRlID09PSB1bmRlZmluZWQ7XG59XG5cbnR5cGUgTmF0aXZlU3Rha2luZ0luc3RydWN0aW9ucyA9IFN0YWtpbmdJbnN0cnVjdGlvbnMgJiB7XG4gIGNyZWF0ZTogTm9uTnVsbGFibGU8U3Rha2luZ0luc3RydWN0aW9uc1snY3JlYXRlJ10+O1xuICBpbml0aWFsaXplOiBOb25OdWxsYWJsZTxTdGFraW5nSW5zdHJ1Y3Rpb25zWydpbml0aWFsaXplJ10+O1xuICBkZWxlZ2F0ZTogTm9uTnVsbGFibGU8U3Rha2luZ0luc3RydWN0aW9uc1snZGVsZWdhdGUnXT47XG59O1xuXG5mdW5jdGlvbiBpc05hdGl2ZVN0YWtpbmdJbnN0cnVjdGlvbnMoc2k6IFN0YWtpbmdJbnN0cnVjdGlvbnMpOiBzaSBpcyBOYXRpdmVTdGFraW5nSW5zdHJ1Y3Rpb25zIHtcbiAgcmV0dXJuIHNpLmNyZWF0ZSAhPT0gdW5kZWZpbmVkICYmIHNpLmluaXRpYWxpemUgIT09IHVuZGVmaW5lZCAmJiBzaS5kZWxlZ2F0ZSAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRTdGFraW5nVHlwZUZyb21TdGFraW5nSW5zdHJ1Y3Rpb25zKHNpOiBTdGFraW5nSW5zdHJ1Y3Rpb25zKTogU29sU3Rha2luZ1R5cGVFbnVtIHtcbiAgY29uc3QgaXNKaXRvID0gaXNKaXRvU3Rha2luZ0luc3RydWN0aW9ucyhzaSk7XG4gIGNvbnN0IGlzTWFyaW5hZGUgPSBpc01hcmluYWRlU3Rha2luZ0luc3RydWN0aW9ucyhzaSk7XG4gIGNvbnN0IGlzTmF0aXZlID0gaXNOYXRpdmVTdGFraW5nSW5zdHJ1Y3Rpb25zKHNpKTtcbiAgYXNzZXJ0KFtpc0ppdG8sIGlzTWFyaW5hZGUsIGlzTmF0aXZlXS5maWx0ZXIoKHgpID0+IHgpLmxlbmd0aCA9PT0gMSwgJ1N0YWtpbmdUeXBlIGlzIGFtYmlndW91cycpO1xuICBpZiAoaXNKaXRvKSByZXR1cm4gU29sU3Rha2luZ1R5cGVFbnVtLkpJVE87XG4gIGlmIChpc01hcmluYWRlKSByZXR1cm4gU29sU3Rha2luZ1R5cGVFbnVtLk1BUklOQURFO1xuICBpZiAoaXNOYXRpdmUpIHJldHVybiBTb2xTdGFraW5nVHlwZUVudW0uTkFUSVZFO1xuICBhc3NlcnQoZmFsc2UsICdObyBTdGFraW5nVHlwZSBmb3VuZCcpO1xufVxuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGNyZWF0ZSBzdGFraW5nIHR4IGFuZCBkZWxlZ2F0ZSB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKiBPbmx5IHN1cHBvcnRzIE5vbmNlLCBTdGFraW5nQWN0aXZhdGUgYW5kIE1lbW8gU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBzdGFraW5nIGFjdGl2YXRlIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXVxuKTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nQWN0aXZhdGUgfCBNZW1vIHwgQXRhSW5pdD4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0FjdGl2YXRlIHwgTWVtbyB8IEF0YUluaXQ+ID0gW107XG4gIGNvbnN0IHN0YWtpbmdJbnN0cnVjdGlvbnMgPSB7fSBhcyBTdGFraW5nSW5zdHJ1Y3Rpb25zO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLk1lbW86XG4gICAgICAgIGNvbnN0IG1lbW86IE1lbW8gPSB7IHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5DcmVhdGU6XG4gICAgICAgIHN0YWtpbmdJbnN0cnVjdGlvbnMuY3JlYXRlID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlQ3JlYXRlQWNjb3VudChpbnN0cnVjdGlvbik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU3Rha2luZ0luaXRpYWxpemU6XG4gICAgICAgIHN0YWtpbmdJbnN0cnVjdGlvbnMuaW5pdGlhbGl6ZSA9IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlSW5pdGlhbGl6ZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU3Rha2luZ0RlbGVnYXRlOlxuICAgICAgICBzdGFraW5nSW5zdHJ1Y3Rpb25zLmRlbGVnYXRlID0gU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVEZWxlZ2F0ZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uRGVwb3NpdFNvbDpcbiAgICAgICAgc3Rha2luZ0luc3RydWN0aW9ucy5kZXBvc2l0U29sID0gZGVjb2RlRGVwb3NpdFNvbChpbnN0cnVjdGlvbik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uSW5pdGlhbGl6ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICAgIHN0YWtpbmdJbnN0cnVjdGlvbnMuaGFzQXRhSW5pdCA9IHRydWU7XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgbWludEFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuTWludEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXRhQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5BVEFBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG93bmVyQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5Pd25lckFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgcGF5ZXJBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLlBheWVyQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlbk5hbWU6IGZpbmRUb2tlbk5hbWUoaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5NaW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCkpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZVN0YWtpbmdJbnN0cnVjdGlvbnMoc3Rha2luZ0luc3RydWN0aW9ucyk7XG4gIGNvbnN0IHN0YWtpbmdUeXBlID0gZ2V0U3Rha2luZ1R5cGVGcm9tU3Rha2luZ0luc3RydWN0aW9ucyhzdGFraW5nSW5zdHJ1Y3Rpb25zKTtcblxuICBsZXQgc3Rha2luZ0FjdGl2YXRlOiBTdGFraW5nQWN0aXZhdGUgfCB1bmRlZmluZWQ7XG5cbiAgc3dpdGNoIChzdGFraW5nVHlwZSkge1xuICAgIGNhc2UgU29sU3Rha2luZ1R5cGVFbnVtLkpJVE86IHtcbiAgICAgIGFzc2VydChpc0ppdG9TdGFraW5nSW5zdHJ1Y3Rpb25zKHN0YWtpbmdJbnN0cnVjdGlvbnMpKTtcbiAgICAgIGNvbnN0IHsgZGVwb3NpdFNvbCwgaGFzQXRhSW5pdCB9ID0gc3Rha2luZ0luc3RydWN0aW9ucztcbiAgICAgIHN0YWtpbmdBY3RpdmF0ZSA9IHtcbiAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0FjdGl2YXRlLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBzdGFraW5nVHlwZSxcbiAgICAgICAgICBmcm9tQWRkcmVzczogZGVwb3NpdFNvbC5mdW5kaW5nQWNjb3VudC50b1N0cmluZygpLFxuICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiBkZXBvc2l0U29sLnN0YWtlUG9vbC50b1N0cmluZygpLFxuICAgICAgICAgIGFtb3VudDogZGVwb3NpdFNvbC5sYW1wb3J0cy50b1N0cmluZygpLFxuICAgICAgICAgIHZhbGlkYXRvcjogZGVwb3NpdFNvbC5zdGFrZVBvb2wudG9TdHJpbmcoKSxcbiAgICAgICAgICBleHRyYVBhcmFtczoge1xuICAgICAgICAgICAgc3Rha2VQb29sRGF0YToge1xuICAgICAgICAgICAgICBtYW5hZ2VyRmVlQWNjb3VudDogZGVwb3NpdFNvbC5tYW5hZ2VyRmVlQWNjb3VudC50b1N0cmluZygpLFxuICAgICAgICAgICAgICBwb29sTWludDogZGVwb3NpdFNvbC5wb29sTWludC50b1N0cmluZygpLFxuICAgICAgICAgICAgICByZXNlcnZlU3Rha2U6IGRlcG9zaXRTb2wucmVzZXJ2ZVN0YWtlLnRvU3RyaW5nKCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudDogISFoYXNBdGFJbml0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2FzZSBTb2xTdGFraW5nVHlwZUVudW0uTUFSSU5BREU6IHtcbiAgICAgIGFzc2VydChpc01hcmluYWRlU3Rha2luZ0luc3RydWN0aW9ucyhzdGFraW5nSW5zdHJ1Y3Rpb25zKSk7XG4gICAgICBjb25zdCB7IGNyZWF0ZSwgaW5pdGlhbGl6ZSB9ID0gc3Rha2luZ0luc3RydWN0aW9ucztcbiAgICAgIHN0YWtpbmdBY3RpdmF0ZSA9IHtcbiAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0FjdGl2YXRlLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBzdGFraW5nVHlwZSxcbiAgICAgICAgICBmcm9tQWRkcmVzczogY3JlYXRlLmZyb21QdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICBzdGFraW5nQWRkcmVzczogaW5pdGlhbGl6ZS5zdGFrZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIGFtb3VudDogY3JlYXRlLmxhbXBvcnRzLnRvU3RyaW5nKCksXG4gICAgICAgICAgdmFsaWRhdG9yOiBpbml0aWFsaXplLmF1dGhvcml6ZWQuc3Rha2VyLnRvU3RyaW5nKCksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2FzZSBTb2xTdGFraW5nVHlwZUVudW0uTkFUSVZFOiB7XG4gICAgICBhc3NlcnQoaXNOYXRpdmVTdGFraW5nSW5zdHJ1Y3Rpb25zKHN0YWtpbmdJbnN0cnVjdGlvbnMpKTtcbiAgICAgIGNvbnN0IHsgY3JlYXRlLCBpbml0aWFsaXplLCBkZWxlZ2F0ZSB9ID0gc3Rha2luZ0luc3RydWN0aW9ucztcbiAgICAgIHN0YWtpbmdBY3RpdmF0ZSA9IHtcbiAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0FjdGl2YXRlLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBzdGFraW5nVHlwZSxcbiAgICAgICAgICBmcm9tQWRkcmVzczogY3JlYXRlLmZyb21QdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICBzdGFraW5nQWRkcmVzczogaW5pdGlhbGl6ZS5zdGFrZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIGFtb3VudDogY3JlYXRlLmxhbXBvcnRzLnRvU3RyaW5nKCksXG4gICAgICAgICAgdmFsaWRhdG9yOiBkZWxlZ2F0ZS52b3RlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZGVmYXVsdDoge1xuICAgICAgY29uc3QgdW5yZWFjaGFibGU6IG5ldmVyID0gc3Rha2luZ1R5cGU7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3Rha2luZyB0eXBlICR7dW5yZWFjaGFibGV9YCk7XG4gICAgfVxuICB9XG5cbiAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goc3Rha2luZ0FjdGl2YXRlKTtcblxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBjcmVhdGUgZGVsZWdhdGUgdHhcbiAqIE9ubHkgc3VwcG9ydHMgTm9uY2UsIFN0YWtpbmdEZWxlZ2F0ZVxuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBzdGFraW5nIGRlbGVnYXRlIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3Rha2luZ0RlbGVnYXRlSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nRGVsZWdhdGU+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxOb25jZSB8IFN0YWtpbmdEZWxlZ2F0ZT4gPSBbXTtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BZHZhbmNlTm9uY2VBY2NvdW50OlxuICAgICAgICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TdGFraW5nRGVsZWdhdGU6XG4gICAgICAgIGNvbnN0IHN0YWtpbmdEZWxlZ2F0ZVBhcmFtcyA9IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlRGVsZWdhdGUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBzdGFraW5nRGVsZWdhdGU6IFN0YWtpbmdEZWxlZ2F0ZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nRGVsZWdhdGUsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBmcm9tQWRkcmVzczogc3Rha2luZ0RlbGVnYXRlUGFyYW1zLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiBzdGFraW5nRGVsZWdhdGVQYXJhbXMuc3Rha2VQdWJrZXkudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgIHZhbGlkYXRvcjogc3Rha2luZ0RlbGVnYXRlUGFyYW1zLnZvdGVQdWJrZXkudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChzdGFraW5nRGVsZWdhdGUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdGFraW5nSW5zdHJ1Y3Rpb25zKHN0YWtpbmdJbnN0cnVjdGlvbnM6IFN0YWtpbmdJbnN0cnVjdGlvbnMpIHtcbiAgaWYgKHN0YWtpbmdJbnN0cnVjdGlvbnMuZGVsZWdhdGUgPT09IHVuZGVmaW5lZCAmJiBzdGFraW5nSW5zdHJ1Y3Rpb25zLmRlcG9zaXRTb2wgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghc3Rha2luZ0luc3RydWN0aW9ucy5jcmVhdGUpIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIHN0YWtpbmcgYWN0aXZhdGUgdHJhbnNhY3Rpb24sIG1pc3NpbmcgY3JlYXRlIHN0YWtlIGFjY291bnQgaW5zdHJ1Y3Rpb24nKTtcbiAgfVxuXG4gIGlmICghc3Rha2luZ0luc3RydWN0aW9ucy5kZWxlZ2F0ZSAmJiAhc3Rha2luZ0luc3RydWN0aW9ucy5pbml0aWFsaXplKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICdJbnZhbGlkIHN0YWtpbmcgYWN0aXZhdGUgdHJhbnNhY3Rpb24sIG1pc3NpbmcgaW5pdGlhbGl6ZSBzdGFrZSBhY2NvdW50L2RlbGVnYXRlIGluc3RydWN0aW9uJ1xuICAgICk7XG4gIH1cbn1cblxudHlwZSBVbnN0YWtpbmdJbnN0cnVjdGlvbnMgPSB7XG4gIGFsbG9jYXRlPzogQWxsb2NhdGVQYXJhbXM7XG4gIGFzc2lnbj86IEFzc2lnblBhcmFtcztcbiAgc3BsaXQ/OiBTcGxpdFN0YWtlUGFyYW1zO1xuICBkZWFjdGl2YXRlPzogRGVhY3RpdmF0ZVN0YWtlUGFyYW1zO1xuICB0cmFuc2Zlcj86IERlY29kZWRUcmFuc2Zlckluc3RydWN0aW9uO1xuICB3aXRoZHJhd1N0YWtlPzogV2l0aGRyYXdTdGFrZVBhcmFtcztcbn07XG5cbnR5cGUgSml0b1Vuc3Rha2luZ0luc3RydWN0aW9ucyA9IFVuc3Rha2luZ0luc3RydWN0aW9ucyAmIHtcbiAgd2l0aGRyYXdTdGFrZTogTm9uTnVsbGFibGU8VW5zdGFraW5nSW5zdHJ1Y3Rpb25zWyd3aXRoZHJhd1N0YWtlJ10+O1xufTtcblxuZnVuY3Rpb24gaXNKaXRvVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVpOiBVbnN0YWtpbmdJbnN0cnVjdGlvbnMpOiB1aSBpcyBKaXRvVW5zdGFraW5nSW5zdHJ1Y3Rpb25zIHtcbiAgcmV0dXJuIHVpLndpdGhkcmF3U3Rha2UgIT09IHVuZGVmaW5lZCAmJiB1aS5kZWFjdGl2YXRlICE9PSB1bmRlZmluZWQ7XG59XG5cbnR5cGUgTWFyaW5hZGVVbnN0YWtpbmdJbnN0cnVjdGlvbnMgPSBVbnN0YWtpbmdJbnN0cnVjdGlvbnMgJiB7XG4gIHRyYW5zZmVyOiBOb25OdWxsYWJsZTxVbnN0YWtpbmdJbnN0cnVjdGlvbnNbJ3RyYW5zZmVyJ10+O1xufTtcblxuZnVuY3Rpb24gaXNNYXJpbmFkZVVuc3Rha2luZ0luc3RydWN0aW9ucyh1aTogVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKTogdWkgaXMgTWFyaW5hZGVVbnN0YWtpbmdJbnN0cnVjdGlvbnMge1xuICByZXR1cm4gdWkudHJhbnNmZXIgIT09IHVuZGVmaW5lZCAmJiB1aS5kZWFjdGl2YXRlID09PSB1bmRlZmluZWQ7XG59XG5cbnR5cGUgTmF0aXZlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zID0gVW5zdGFraW5nSW5zdHJ1Y3Rpb25zICYge1xuICBkZWFjdGl2YXRlOiBOb25OdWxsYWJsZTxVbnN0YWtpbmdJbnN0cnVjdGlvbnNbJ2RlYWN0aXZhdGUnXT47XG4gIHNwbGl0OiBVbnN0YWtpbmdJbnN0cnVjdGlvbnNbJ3NwbGl0J107XG59O1xuXG5mdW5jdGlvbiBpc05hdGl2ZVVuc3Rha2luZ0luc3RydWN0aW9ucyh1aTogVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKTogdWkgaXMgTmF0aXZlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zIHtcbiAgcmV0dXJuIHVpLndpdGhkcmF3U3Rha2UgPT09IHVuZGVmaW5lZCAmJiB1aS5kZWFjdGl2YXRlICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFN0YWtpbmdUeXBlRnJvbVVuc3Rha2luZ0luc3RydWN0aW9ucyh1aTogVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKTogU29sU3Rha2luZ1R5cGVFbnVtIHtcbiAgY29uc3QgaXNKaXRvID0gaXNKaXRvVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVpKTtcbiAgY29uc3QgaXNNYXJpbmFkZSA9IGlzTWFyaW5hZGVVbnN0YWtpbmdJbnN0cnVjdGlvbnModWkpO1xuICBjb25zdCBpc05hdGl2ZSA9IGlzTmF0aXZlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVpKTtcbiAgYXNzZXJ0KFtpc0ppdG8sIGlzTWFyaW5hZGUsIGlzTmF0aXZlXS5maWx0ZXIoKHgpID0+IHgpLmxlbmd0aCA9PT0gMSwgJ1N0YWtpbmdUeXBlIGlzIGFtYmlndW91cycpO1xuICBpZiAoaXNKaXRvKSByZXR1cm4gU29sU3Rha2luZ1R5cGVFbnVtLkpJVE87XG4gIGlmIChpc01hcmluYWRlKSByZXR1cm4gU29sU3Rha2luZ1R5cGVFbnVtLk1BUklOQURFO1xuICBpZiAoaXNOYXRpdmUpIHJldHVybiBTb2xTdGFraW5nVHlwZUVudW0uTkFUSVZFO1xuICBhc3NlcnQoZmFsc2UsICdObyBTdGFraW5nVHlwZSBmb3VuZCcpO1xufVxuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGNyZWF0ZSBkZWFjdGl2YXRlIHN0YWtlIHR4IGluc3RydWN0aW9ucyBwYXJhbXMuIFN1cHBvcnRzIGZ1bGwgc3Rha2VcbiAqIGFjY291bnQgZGVhY3RpdmF0aW9uIGFuZCBwYXJ0aWFsIHN0YWtlIGFjY291bnQgZGVhY3RpdmF0aW9uLlxuICpcbiAqIFdoZW4gcGFydGlhbGx5IGRlYWN0aXZhdGluZyBhIHN0YWtlIGFjY291bnQgdGhpcyBtZXRob2QgZXhwZWN0cyB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uczogQWxsb2NhdGUsXG4gKiB0byBhbGxvY2F0ZSBhIG5ldyBzdGFraW5nIGFjY291bnQsIEFzc2lnbiwgdG8gYXNzaWduIHRoZSBuZXdseSBjcmVhdGVkIHN0YWtpbmcgYWNjb3VudCB0byB0aGVcbiAqIFN0YWtlIFByb2dyYW0sIFNwbGl0LCB0byBzcGxpdCB0aGUgY3VycmVudCBzdGFrZSBhY2NvdW50LCBhbmQgU3Rha2luZ0RlYWN0aXZhdGUgdG8gZGVhY3RpdmF0ZSB0aGVcbiAqIG5ld2x5IGNyZWF0ZWQgc3Rha2UgYWNjb3VudC5cbiAqXG4gKiBTdXBwb3J0cyBOb25jZSwgU3Rha2luZ0RlYWN0aXZhdGUsIE1lbW8sIEFsbG9jYXRlLCBBc3NpZ24sIGFuZCBTcGxpdCBTb2xhbmEgaW5zdHJ1Y3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBzdGFraW5nIGRlYWN0aXZhdGUgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGFraW5nRGVhY3RpdmF0ZUluc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10sXG4gIGNvaW5OYW1lPzogc3RyaW5nXG4pOiBBcnJheTxOb25jZSB8IFN0YWtpbmdEZWFjdGl2YXRlIHwgTWVtbz4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0RlYWN0aXZhdGUgfCBNZW1vPiA9IFtdO1xuICBjb25zdCB1bnN0YWtpbmdJbnN0cnVjdGlvbnM6IFVuc3Rha2luZ0luc3RydWN0aW9uc1tdID0gW107XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uTWVtbzpcbiAgICAgICAgY29uc3QgbWVtbzogTWVtbyA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLFxuICAgICAgICAgIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobWVtbyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWxsb2NhdGU6XG4gICAgICAgIGlmIChcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uYWxsb2NhdGUgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmFsbG9jYXRlID1cbiAgICAgICAgICAgIFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUFsbG9jYXRlKGluc3RydWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBhbGxvY2F0ZTogU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlQWxsb2NhdGUoaW5zdHJ1Y3Rpb24pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQXNzaWduOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmFzc2lnbiA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uYXNzaWduID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlQXNzaWduKGluc3RydWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBhc3NpZ246IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUFzc2lnbihpbnN0cnVjdGlvbiksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TcGxpdDpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS5zcGxpdCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uc3BsaXQgPSBTdGFrZUluc3RydWN0aW9uLmRlY29kZVNwbGl0KGluc3RydWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBzcGxpdDogU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVTcGxpdChpbnN0cnVjdGlvbiksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TdGFraW5nRGVhY3RpdmF0ZTpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS5kZWFjdGl2YXRlID09PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS5kZWFjdGl2YXRlID1cbiAgICAgICAgICAgIFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlRGVhY3RpdmF0ZShpbnN0cnVjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgZGVhY3RpdmF0ZTogU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVEZWFjdGl2YXRlKGluc3RydWN0aW9uKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRyYW5zZmVyOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLnRyYW5zZmVyID09PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS50cmFuc2ZlciA9XG4gICAgICAgICAgICBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVUcmFuc2ZlcihpbnN0cnVjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgdHJhbnNmZXI6IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZVRyYW5zZmVyKGluc3RydWN0aW9uKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLldpdGhkcmF3U3Rha2U6XG4gICAgICAgIGlmIChcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0ud2l0aGRyYXdTdGFrZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0ud2l0aGRyYXdTdGFrZSA9IGRlY29kZVdpdGhkcmF3U3Rha2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHdpdGhkcmF3U3Rha2U6IGRlY29kZVdpdGhkcmF3U3Rha2UoaW5zdHJ1Y3Rpb24pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgdW5zdGFraW5nSW5zdHJ1Y3Rpb24gb2YgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zKSB7XG4gICAgdmFsaWRhdGVVbnN0YWtpbmdJbnN0cnVjdGlvbnModW5zdGFraW5nSW5zdHJ1Y3Rpb24pO1xuICAgIGNvbnN0IHN0YWtpbmdUeXBlID0gZ2V0U3Rha2luZ1R5cGVGcm9tVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVuc3Rha2luZ0luc3RydWN0aW9uKTtcblxuICAgIGxldCBzdGFraW5nRGVhY3RpdmF0ZTogU3Rha2luZ0RlYWN0aXZhdGUgfCB1bmRlZmluZWQ7XG5cbiAgICBzd2l0Y2ggKHN0YWtpbmdUeXBlKSB7XG4gICAgICBjYXNlIFNvbFN0YWtpbmdUeXBlRW51bS5KSVRPOiB7XG4gICAgICAgIGFzc2VydChpc0ppdG9VbnN0YWtpbmdJbnN0cnVjdGlvbnModW5zdGFraW5nSW5zdHJ1Y3Rpb24pKTtcbiAgICAgICAgY29uc3QgeyB3aXRoZHJhd1N0YWtlIH0gPSB1bnN0YWtpbmdJbnN0cnVjdGlvbjtcbiAgICAgICAgc3Rha2luZ0RlYWN0aXZhdGUgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0RlYWN0aXZhdGUsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBzdGFraW5nVHlwZSxcbiAgICAgICAgICAgIGZyb21BZGRyZXNzOiB3aXRoZHJhd1N0YWtlLmRlc3RpbmF0aW9uU3Rha2VBdXRob3JpdHkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiB3aXRoZHJhd1N0YWtlLnN0YWtlUG9vbC50b1N0cmluZygpLFxuICAgICAgICAgICAgYW1vdW50OiB3aXRoZHJhd1N0YWtlLnBvb2xUb2tlbnMudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHVuc3Rha2luZ0FkZHJlc3M6IHdpdGhkcmF3U3Rha2UuZGVzdGluYXRpb25TdGFrZS50b1N0cmluZygpLFxuICAgICAgICAgICAgZXh0cmFQYXJhbXM6IHtcbiAgICAgICAgICAgICAgc3Rha2VQb29sRGF0YToge1xuICAgICAgICAgICAgICAgIG1hbmFnZXJGZWVBY2NvdW50OiB3aXRoZHJhd1N0YWtlLm1hbmFnZXJGZWVBY2NvdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgcG9vbE1pbnQ6IHdpdGhkcmF3U3Rha2UucG9vbE1pbnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3JMaXN0QWNjb3VudDogd2l0aGRyYXdTdGFrZS52YWxpZGF0b3JMaXN0LnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHZhbGlkYXRvckFkZHJlc3M6IHdpdGhkcmF3U3Rha2UudmFsaWRhdG9yU3Rha2UudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgdHJhbnNmZXJBdXRob3JpdHlBZGRyZXNzOiB3aXRoZHJhd1N0YWtlLnNvdXJjZVRyYW5zZmVyQXV0aG9yaXR5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFNvbFN0YWtpbmdUeXBlRW51bS5NQVJJTkFERToge1xuICAgICAgICBhc3NlcnQoaXNNYXJpbmFkZVVuc3Rha2luZ0luc3RydWN0aW9ucyh1bnN0YWtpbmdJbnN0cnVjdGlvbikpO1xuICAgICAgICBjb25zdCB7IHRyYW5zZmVyIH0gPSB1bnN0YWtpbmdJbnN0cnVjdGlvbjtcblxuICAgICAgICBzdGFraW5nRGVhY3RpdmF0ZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nRGVhY3RpdmF0ZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHN0YWtpbmdUeXBlLFxuICAgICAgICAgICAgZnJvbUFkZHJlc3M6ICcnLFxuICAgICAgICAgICAgc3Rha2luZ0FkZHJlc3M6ICcnLFxuICAgICAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWRkcmVzczogdHJhbnNmZXIudG9QdWJrZXkudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgICAgICBhbW91bnQ6IHRyYW5zZmVyLmxhbXBvcnRzLnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFNvbFN0YWtpbmdUeXBlRW51bS5OQVRJVkU6IHtcbiAgICAgICAgYXNzZXJ0KGlzTmF0aXZlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVuc3Rha2luZ0luc3RydWN0aW9uKSk7XG4gICAgICAgIGNvbnN0IHsgZGVhY3RpdmF0ZSwgc3BsaXQgfSA9IHVuc3Rha2luZ0luc3RydWN0aW9uO1xuICAgICAgICBzdGFraW5nRGVhY3RpdmF0ZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nRGVhY3RpdmF0ZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHN0YWtpbmdUeXBlLFxuICAgICAgICAgICAgZnJvbUFkZHJlc3M6IGRlYWN0aXZhdGUuYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgICAgc3Rha2luZ0FkZHJlc3M6IHNwbGl0Py5zdGFrZVB1YmtleS50b1N0cmluZygpIHx8IGRlYWN0aXZhdGUuc3Rha2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogc3BsaXQ/LmxhbXBvcnRzLnRvU3RyaW5nKCksXG4gICAgICAgICAgICB1bnN0YWtpbmdBZGRyZXNzOiBzcGxpdD8uc3BsaXRTdGFrZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnN0IHVucmVhY2hhYmxlOiBuZXZlciA9IHN0YWtpbmdUeXBlO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3Rha2luZyB0eXBlICR7dW5yZWFjaGFibGV9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goc3Rha2luZ0RlYWN0aXZhdGUpO1xuICB9XG5cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVVbnN0YWtpbmdJbnN0cnVjdGlvbnModW5zdGFraW5nSW5zdHJ1Y3Rpb25zOiBVbnN0YWtpbmdJbnN0cnVjdGlvbnMpIHtcbiAgLy8gQ2FzZXMgd2hlcmUgZXhhY3RseSBvbmUgZmllbGQgc2hvdWxkIGJlIHByZXNlbnRcbiAgY29uc3QgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zS2V5czogKGtleW9mIFVuc3Rha2luZ0luc3RydWN0aW9ucylbXSA9IFtcbiAgICAnYWxsb2NhdGUnLFxuICAgICdhc3NpZ24nLFxuICAgICdzcGxpdCcsXG4gICAgJ2RlYWN0aXZhdGUnLFxuICAgICd0cmFuc2ZlcicsXG4gIF0gYXMgY29uc3Q7XG4gIGlmICh1bnN0YWtpbmdJbnN0cnVjdGlvbnNLZXlzLmV2ZXJ5KChrKSA9PiAhIXVuc3Rha2luZ0luc3RydWN0aW9uc1trXSA9PT0gKGsgPT09ICd0cmFuc2ZlcicpKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodW5zdGFraW5nSW5zdHJ1Y3Rpb25zS2V5cy5ldmVyeSgoaykgPT4gISF1bnN0YWtpbmdJbnN0cnVjdGlvbnNba10gPT09IChrID09PSAnd2l0aGRyYXdTdGFrZScpKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodW5zdGFraW5nSW5zdHJ1Y3Rpb25zS2V5cy5ldmVyeSgoaykgPT4gISF1bnN0YWtpbmdJbnN0cnVjdGlvbnNba10gPT09IChrID09PSAnZGVhY3RpdmF0ZScpKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIENhc2VzIHdoZXJlIGRlYWN0aXZhdGUgZmllbGQgbXVzdCBiZSBwcmVzZW50IHdpdGggYW5vdGhlciBmaWVsZFxuICBpZiAoIXVuc3Rha2luZ0luc3RydWN0aW9ucy5kZWFjdGl2YXRlKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCBtaXNzaW5nIGRlYWN0aXZhdGUgc3Rha2UgYWNjb3VudCBpbnN0cnVjdGlvbicpO1xuICB9XG5cbiAgLy8gVGhpcyBpcyBhIHN0YWtlIHBvb2wgaW5zdHJ1Y3Rpb24sIG5vdCBhIHBhcnRpYWwgdW5zdGFrZVxuICBpZiAodW5zdGFraW5nSW5zdHJ1Y3Rpb25zLndpdGhkcmF3U3Rha2UpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXVuc3Rha2luZ0luc3RydWN0aW9ucy5hbGxvY2F0ZSkge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG1pc3NpbmcgYWxsb2NhdGUgdW5zdGFrZSBhY2NvdW50IGluc3RydWN0aW9uJ1xuICAgICk7XG4gIH0gZWxzZSBpZiAoIXVuc3Rha2luZ0luc3RydWN0aW9ucy5hc3NpZ24pIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgbWlzc2luZyBhc3NpZ24gdW5zdGFrZSBhY2NvdW50IGluc3RydWN0aW9uJyk7XG4gIH0gZWxzZSBpZiAoIXVuc3Rha2luZ0luc3RydWN0aW9ucy5zcGxpdCkge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCBtaXNzaW5nIHNwbGl0IHN0YWtlIGFjY291bnQgaW5zdHJ1Y3Rpb24nKTtcbiAgfSBlbHNlIGlmIChcbiAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYWxsb2NhdGUuYWNjb3VudFB1YmtleS50b1N0cmluZygpICE9PSB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYXNzaWduLmFjY291bnRQdWJrZXkudG9TdHJpbmcoKVxuICApIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCBtdXN0IGFsbG9jYXRlIGFuZCBhc3NpZ24gdGhlIHNhbWUgcHVibGljIGtleSdcbiAgICApO1xuICB9IGVsc2UgaWYgKHVuc3Rha2luZ0luc3RydWN0aW9ucy5hbGxvY2F0ZS5zcGFjZSAhPT0gU3Rha2VQcm9ncmFtLnNwYWNlKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgIGBJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgdW5zdGFraW5nIGFjY291bnQgbXVzdCBhbGxvY2F0ZSAke1N0YWtlUHJvZ3JhbS5zcGFjZX0gYnl0ZXNgXG4gICAgKTtcbiAgfSBlbHNlIGlmICh1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYXNzaWduLnByb2dyYW1JZC50b1N0cmluZygpICE9PSBTdGFrZVByb2dyYW0ucHJvZ3JhbUlkLnRvU3RyaW5nKCkpIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCB0aGUgdW5zdGFrZSBhY2NvdW50IG11c3QgYmUgYXNzaWduZWQgdG8gdGhlIFN0YWtlIFByb2dyYW0nXG4gICAgKTtcbiAgfSBlbHNlIGlmIChcbiAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYWxsb2NhdGUuYWNjb3VudFB1YmtleS50b1N0cmluZygpICE9PSB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuc3BsaXQuc3BsaXRTdGFrZVB1YmtleS50b1N0cmluZygpXG4gICkge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCBtdXN0IGFsbG9jYXRlIHRoZSB1bnN0YWtpbmcgYWNjb3VudCcpO1xuICB9IGVsc2UgaWYgKFxuICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5zcGxpdC5zdGFrZVB1YmtleS50b1N0cmluZygpID09PSB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuc3BsaXQuc3BsaXRTdGFrZVB1YmtleS50b1N0cmluZygpXG4gICkge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIHRoZSB1bnN0YWtpbmcgYWNjb3VudCBtdXN0IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBTdGFrZSBBY2NvdW50J1xuICAgICk7XG4gIH0gZWxzZSBpZiAoIXVuc3Rha2luZ0luc3RydWN0aW9ucy50cmFuc2Zlcikge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG1pc3NpbmcgZnVuZGluZyBvZiB1bnN0YWtlIGFkZHJlc3MgaW5zdHJ1Y3Rpb24nXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGNyZWF0ZSBzdGFraW5nICB3aXRoZHJhdyB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKiBPbmx5IHN1cHBvcnRzIE5vbmNlLCBTdGFraW5nV2l0aGRyYXcsIGFuZCBNZW1vIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3Igc3Rha2luZyB3aXRoZHJhdyB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW11cbik6IEFycmF5PE5vbmNlIHwgU3Rha2luZ1dpdGhkcmF3IHwgTWVtbz4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PE5vbmNlIHwgU3Rha2luZ1dpdGhkcmF3IHwgTWVtbz4gPSBbXTtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BZHZhbmNlTm9uY2VBY2NvdW50OlxuICAgICAgICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NZW1vOlxuICAgICAgICBjb25zdCBtZW1vOiBNZW1vID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sXG4gICAgICAgICAgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoKSB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TdGFraW5nV2l0aGRyYXc6XG4gICAgICAgIGNvbnN0IHdpdGhkcmF3SW5zdHJ1Y3Rpb24gPSBTdGFrZUluc3RydWN0aW9uLmRlY29kZVdpdGhkcmF3KGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgc3Rha2luZ1dpdGhkcmF3OiBTdGFraW5nV2l0aGRyYXcgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ1dpdGhkcmF3LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZnJvbUFkZHJlc3M6IHdpdGhkcmF3SW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgc3Rha2luZ0FkZHJlc3M6IHdpdGhkcmF3SW5zdHJ1Y3Rpb24uc3Rha2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogd2l0aGRyYXdJbnN0cnVjdGlvbi5sYW1wb3J0cy50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHN0YWtpbmdXaXRoZHJhdyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbi8qKlxuICogR2V0IHRoZSBtZW1vIG9iamVjdCBmcm9tIGluc3RydWN0aW9ucyBpZiBpdCBleGlzdHNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gdGhlIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGJlIHBhcnNlZFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fSBpbnN0cnVjdGlvbkluZGV4ZXMgLSB0aGUgaW5zdHJ1Y3Rpb25zIGluZGV4ZXMgb2YgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb25cbiAqIEByZXR1cm5zIHtNZW1vIHwgdW5kZWZpbmVkfSAtIG1lbW8gb2JqZWN0IG9yIHVuZGVmaW5lZFxuICovXG5mdW5jdGlvbiBnZXRNZW1vKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLCBpbnN0cnVjdGlvbkluZGV4ZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4pOiBNZW1vIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25zTGVuZ3RoID0gT2JqZWN0LmtleXMoaW5zdHJ1Y3Rpb25JbmRleGVzKS5sZW5ndGg7XG4gIGlmIChpbnN0cnVjdGlvbnMubGVuZ3RoID09PSBpbnN0cnVjdGlvbnNMZW5ndGggJiYgaW5zdHJ1Y3Rpb25zW2luc3RydWN0aW9uSW5kZXhlcy5NZW1vXSkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLFxuICAgICAgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uc1tpbnN0cnVjdGlvbkluZGV4ZXMuTWVtb10uZGF0YS50b1N0cmluZygpIH0sXG4gICAgfTtcbiAgfVxufVxuXG5jb25zdCBhdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcyA9IHtcbiAgUGF5ZXJBZGRyZXNzOiAwLFxuICBBVEFBZGRyZXNzOiAxLFxuICBPd25lckFkZHJlc3M6IDIsXG4gIE1pbnRBZGRyZXNzOiAzLFxufTtcblxuY29uc3QgY2xvc2VBdGFJbnN0cnVjdGlvbktleXNJbmRleGVzID0ge1xuICBBY2NvdW50QWRkcmVzczogMCxcbiAgRGVzdGluYXRpb25BZGRyZXNzOiAxLFxuICBBdXRob3JpdHlBZGRyZXNzOiAyLFxufTtcblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBpbml0aWFsaXplIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIFNlbmQgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VBdGFJbml0SW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSxcbiAgaW5zdHJ1Y3Rpb25NZXRhZGF0YT86IEluc3RydWN0aW9uUGFyYW1zW10sXG4gIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWU/OiBib29sZWFuXG4pOiBBcnJheTxBdGFJbml0IHwgUGVybWlzc2lvbmxlc3NUaGF3SWRlbXBvdGVudCB8IE1lbW8gfCBOb25jZT4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PEF0YUluaXQgfCBQZXJtaXNzaW9ubGVzc1RoYXdJZGVtcG90ZW50IHwgTWVtbyB8IE5vbmNlPiA9IFtdO1xuICBsZXQgbWVtbzogTWVtbyB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLk1lbW86XG4gICAgICAgIG1lbW8gPSB7IHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BZHZhbmNlTm9uY2VBY2NvdW50OlxuICAgICAgICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uSW5pdGlhbGl6ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICAgIGNvbnN0IG1pbnRBZGRyZXNzID0gaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5NaW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHRva2VuTmFtZSA9IGZpbmRUb2tlbk5hbWUobWludEFkZHJlc3MsIGluc3RydWN0aW9uTWV0YWRhdGEsIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWUpO1xuICAgICAgICBsZXQgcHJvZ3JhbUlEOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChpbnN0cnVjdGlvbi5wcm9ncmFtSWQpIHtcbiAgICAgICAgICBwcm9ncmFtSUQgPSBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhdGFJbml0OiBBdGFJbml0ID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgICAgIGF0YUFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuQVRBQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBvd25lckFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuT3duZXJBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHBheWVyQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5QYXllckFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5OYW1lLFxuICAgICAgICAgICAgcHJvZ3JhbUlkOiBwcm9ncmFtSUQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goYXRhSW5pdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlBlcm1pc3Npb25sZXNzVGhhd0lkZW1wb3RlbnQ6XG4gICAgICAgIGNvbnN0IHRoYXdFeHRyYUFjY291bnRzOiBFeHRyYUFjY291bnRNZXRhW10gPSBpbnN0cnVjdGlvbi5rZXlzLnNsaWNlKDkpLm1hcCgoa2V5KSA9PiAoe1xuICAgICAgICAgIHB1YmtleToga2V5LnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIGlzU2lnbmVyOiBrZXkuaXNTaWduZXIsXG4gICAgICAgICAgaXNXcml0YWJsZToga2V5LmlzV3JpdGFibGUsXG4gICAgICAgIH0pKTtcbiAgICAgICAgY29uc3QgcGVybWlzc2lvbmxlc3NUaGF3OiBQZXJtaXNzaW9ubGVzc1RoYXdJZGVtcG90ZW50ID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlBlcm1pc3Npb25sZXNzVGhhd0lkZW1wb3RlbnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBhdXRob3JpdHk6IGluc3RydWN0aW9uLmtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBtaW50OiBpbnN0cnVjdGlvbi5rZXlzWzFdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5BY2NvdW50OiBpbnN0cnVjdGlvbi5rZXlzWzJdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgZmxhZ0FjY291bnQ6IGluc3RydWN0aW9uLmtleXNbM10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlbkFjY291bnRPd25lcjogaW5zdHJ1Y3Rpb24ua2V5c1s0XS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG1pbnRDb25maWc6IGluc3RydWN0aW9uLmtleXNbNV0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlblByb2dyYW06IGluc3RydWN0aW9uLmtleXNbNl0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBzeXN0ZW1Qcm9ncmFtOiBpbnN0cnVjdGlvbi5rZXlzWzddLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgZ2F0aW5nUHJvZ3JhbTogaW5zdHJ1Y3Rpb24ua2V5c1s4XS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGV4dHJhQWNjb3VudHM6IHRoYXdFeHRyYUFjY291bnRzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHBlcm1pc3Npb25sZXNzVGhhdyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkRlcG9zaXRTb2w6XG4gICAgICAgIC8vIEF0YUluaXQgaXMgYSBwYXJ0IG9mIHNwbC1zdGFrZS1wb29sJ3MgZGVwb3NpdFNvbCBwcm9jZXNzXG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgICAnSW52YWxpZCB0cmFuc2FjdGlvbiwgaW5zdHJ1Y3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkOiAnICsgZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuICBpZiAobWVtbykge1xuICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG1lbW8pO1xuICB9XG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbmNvbnN0IGF0YUNsb3NlSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcyA9IHtcbiAgQWNjb3VudEFkZHJlc3M6IDAsXG4gIERlc3RpbmF0aW9uQWRkcmVzczogMSxcbiAgQXV0aG9yaXR5QWRkcmVzczogMixcbn07XG5cbmNvbnN0IGF0YVJlY292ZXJOZXN0ZWRJbnN0cnVjdGlvbktleXNJbmRleGVzID0ge1xuICBOZXN0ZWRBY2NvdW50QWRkcmVzczogMCxcbiAgTmVzdGVkTWludEFkZHJlc3M6IDEsXG4gIERlc3RpbmF0aW9uQWNjb3VudEFkZHJlc3M6IDIsXG4gIE93bmVyQWNjb3VudEFkZHJlc3M6IDMsXG4gIE93bmVyTWludEFkZHJlc3M6IDQsXG4gIFdhbGxldEFkZHJlc3M6IDUsXG59O1xuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGNsb3NlIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIFNlbmQgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VBdGFDbG9zZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSk6IEFycmF5PEF0YUNsb3NlIHwgQXRhUmVjb3Zlck5lc3RlZCB8IE5vbmNlPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8QXRhQ2xvc2UgfCBBdGFSZWNvdmVyTmVzdGVkIHwgTm9uY2U+ID0gW107XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgY29uc3QgYXRhQ2xvc2U6IEF0YUNsb3NlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudCxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGFjY291bnRBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUNsb3NlSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5BY2NvdW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBkZXN0aW5hdGlvbkFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhQ2xvc2VJbnN0cnVjdGlvbktleXNJbmRleGVzLkRlc3RpbmF0aW9uQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRob3JpdHlBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUNsb3NlSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5BdXRob3JpdHlBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChhdGFDbG9zZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlJlY292ZXJOZXN0ZWRBc3NvY2lhdGVkVG9rZW5BY2NvdW50OlxuICAgICAgICBjb25zdCBhdGFSZWNvdmVyTmVzdGVkOiBBdGFSZWNvdmVyTmVzdGVkID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlJlY292ZXJOZXN0ZWRBc3NvY2lhdGVkVG9rZW5BY2NvdW50LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgbmVzdGVkQWNjb3VudEFkZHJlc3M6XG4gICAgICAgICAgICAgIGluc3RydWN0aW9uLmtleXNbYXRhUmVjb3Zlck5lc3RlZEluc3RydWN0aW9uS2V5c0luZGV4ZXMuTmVzdGVkQWNjb3VudEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgbmVzdGVkTWludEFkZHJlc3M6XG4gICAgICAgICAgICAgIGluc3RydWN0aW9uLmtleXNbYXRhUmVjb3Zlck5lc3RlZEluc3RydWN0aW9uS2V5c0luZGV4ZXMuTmVzdGVkTWludEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgZGVzdGluYXRpb25BY2NvdW50QWRkcmVzczpcbiAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24ua2V5c1thdGFSZWNvdmVyTmVzdGVkSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5EZXN0aW5hdGlvbkFjY291bnRBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG93bmVyQWNjb3VudEFkZHJlc3M6XG4gICAgICAgICAgICAgIGluc3RydWN0aW9uLmtleXNbYXRhUmVjb3Zlck5lc3RlZEluc3RydWN0aW9uS2V5c0luZGV4ZXMuT3duZXJBY2NvdW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBvd25lck1pbnRBZGRyZXNzOlxuICAgICAgICAgICAgICBpbnN0cnVjdGlvbi5rZXlzW2F0YVJlY292ZXJOZXN0ZWRJbnN0cnVjdGlvbktleXNJbmRleGVzLk93bmVyTWludEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgd2FsbGV0QWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFSZWNvdmVyTmVzdGVkSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5XYWxsZXRBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChhdGFSZWNvdmVyTmVzdGVkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAgICdJbnZhbGlkIHRyYW5zYWN0aW9uLCBpbnN0cnVjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQ6ICcgKyBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gYXV0aG9yaXplZCBzdGFraW5nIGFjY291bnQgcGFyYW1zXG4gKiBPbmx5IHN1cHBvcnRzIE5vbmNlLCBBdXRob3JpemUgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIHN0YWtpbmcgYXV0aG9yaXplIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3Rha2luZ0F1dGhvcml6ZUluc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW11cbik6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0F1dGhvcml6ZSB8IE1lbW8+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxOb25jZSB8IFN0YWtpbmdBdXRob3JpemUgfCBNZW1vPiA9IFtdO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLk1lbW86XG4gICAgICAgIGNvbnN0IG1lbW86IE1lbW8gPSB7IHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BdXRob3JpemU6XG4gICAgICAgIGNvbnN0IGF1dGhvcml6ZSA9IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlQXV0aG9yaXplKGluc3RydWN0aW9uKTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goe1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdBdXRob3JpemUsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBzdGFraW5nQWRkcmVzczogYXV0aG9yaXplLnN0YWtlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBvbGRBdXRob3JpemVBZGRyZXNzOiBhdXRob3JpemUuYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgbmV3QXV0aG9yaXplQWRkcmVzczogYXV0aG9yaXplLm5ld0F1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG5ld1dpdGhkcmF3QWRkcmVzczogYXV0aG9yaXplLmN1c3RvZGlhblB1YmtleT8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBhdXRob3JpemVkIHN0YWtpbmcgYWNjb3VudCBwYXJhbXNcbiAqIE9ubHkgc3VwcG9ydHMgTm9uY2UsIEF1dGhvcml6ZSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3Igc3Rha2luZyBhdXRob3JpemUgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGFraW5nQXV0aG9yaXplUmF3SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nQXV0aG9yaXplPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nQXV0aG9yaXplPiA9IFtdO1xuICBhc3NlcnQoaW5zdHJ1Y3Rpb25zLmxlbmd0aCA9PT0gMiwgJ0ludmFsaWQgbnVtYmVyIG9mIGluc3RydWN0aW9ucycpO1xuICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbnNbMF0pO1xuICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgIHBhcmFtczoge1xuICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICB9LFxuICB9O1xuICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gIGNvbnN0IGF1dGhvcml6ZSA9IGluc3RydWN0aW9uc1sxXTtcbiAgYXNzZXJ0KGF1dGhvcml6ZS5rZXlzLmxlbmd0aCA9PT0gNSwgJ0ludmFsaWQgbnVtYmVyIG9mIGtleXMgaW4gYXV0aG9yaXplIGluc3RydWN0aW9uJyk7XG4gIGluc3RydWN0aW9uRGF0YS5wdXNoKHtcbiAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nQXV0aG9yaXplLFxuICAgIHBhcmFtczoge1xuICAgICAgc3Rha2luZ0FkZHJlc3M6IGF1dGhvcml6ZS5rZXlzWzBdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgb2xkQXV0aG9yaXplQWRkcmVzczogYXV0aG9yaXplLmtleXNbMl0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBuZXdBdXRob3JpemVBZGRyZXNzOiBhdXRob3JpemUua2V5c1szXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIGN1c3RvZGlhbkFkZHJlc3M6IGF1dGhvcml6ZS5rZXlzWzRdLnB1YmtleS50b1N0cmluZygpLFxuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGN1c3RvbSBpbnN0cnVjdGlvbiBwYXJhbXNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gY29udGFpbmluZyBjdXN0b20gc29sYW5hIGluc3RydWN0aW9uc1xuICogQHBhcmFtIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBpbnN0cnVjdGlvbk1ldGFkYXRhIC0gdGhlIGluc3RydWN0aW9uIG1ldGFkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3IgY3VzdG9tIGluc3RydWN0aW9uc1xuICovXG5mdW5jdGlvbiBwYXJzZUN1c3RvbUluc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10sXG4gIGluc3RydWN0aW9uTWV0YWRhdGE/OiBJbnN0cnVjdGlvblBhcmFtc1tdXG4pOiBDdXN0b21JbnN0cnVjdGlvbltdIHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBDdXN0b21JbnN0cnVjdGlvbltdID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnN0cnVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uc1tpXTtcblxuICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbWV0YWRhdGEgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24gcG9zaXRpb25cbiAgICBpZiAoXG4gICAgICBpbnN0cnVjdGlvbk1ldGFkYXRhICYmXG4gICAgICBpbnN0cnVjdGlvbk1ldGFkYXRhW2ldICYmXG4gICAgICBpbnN0cnVjdGlvbk1ldGFkYXRhW2ldLnR5cGUgPT09IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkN1c3RvbUluc3RydWN0aW9uXG4gICAgKSB7XG4gICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChpbnN0cnVjdGlvbk1ldGFkYXRhW2ldIGFzIEN1c3RvbUluc3RydWN0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udmVydCB0aGUgcmF3IGluc3RydWN0aW9uIHRvIEN1c3RvbUluc3RydWN0aW9uIGZvcm1hdFxuICAgICAgY29uc3QgY3VzdG9tSW5zdHJ1Y3Rpb246IEN1c3RvbUluc3RydWN0aW9uID0ge1xuICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DdXN0b21JbnN0cnVjdGlvbixcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgcHJvZ3JhbUlkOiBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKSxcbiAgICAgICAgICBrZXlzOiBpbnN0cnVjdGlvbi5rZXlzLm1hcCgoa2V5KSA9PiAoe1xuICAgICAgICAgICAgcHVia2V5OiBrZXkucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBpc1NpZ25lcjoga2V5LmlzU2lnbmVyLFxuICAgICAgICAgICAgaXNXcml0YWJsZToga2V5LmlzV3JpdGFibGUsXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIGRhdGE6IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKGN1c3RvbUluc3RydWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFRva2VuTmFtZShcbiAgbWludEFkZHJlc3M6IHN0cmluZyxcbiAgaW5zdHJ1Y3Rpb25NZXRhZGF0YT86IEluc3RydWN0aW9uUGFyYW1zW10sXG4gIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWU/OiBib29sZWFuXG4pOiBzdHJpbmcge1xuICBsZXQgdG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBjb2lucy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU29sQ29pbiAmJiB2YWx1ZS50b2tlbkFkZHJlc3MgPT09IG1pbnRBZGRyZXNzKSB7XG4gICAgICB0b2tlbiA9IHZhbHVlLm5hbWU7XG4gICAgfVxuICB9KTtcblxuICBpZiAoIXRva2VuICYmIGluc3RydWN0aW9uTWV0YWRhdGEpIHtcbiAgICBpbnN0cnVjdGlvbk1ldGFkYXRhLmZvckVhY2goKGluc3RydWN0aW9uKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGluc3RydWN0aW9uLnR5cGUgPT09IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQgJiZcbiAgICAgICAgaW5zdHJ1Y3Rpb24ucGFyYW1zLm1pbnRBZGRyZXNzID09PSBtaW50QWRkcmVzc1xuICAgICAgKSB7XG4gICAgICAgIHRva2VuID0gaW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuTmFtZTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGluc3RydWN0aW9uLnR5cGUgPT09IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRva2VuVHJhbnNmZXIgJiZcbiAgICAgICAgaW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuQWRkcmVzcyA9PT0gbWludEFkZHJlc3NcbiAgICAgICkge1xuICAgICAgICB0b2tlbiA9IGluc3RydWN0aW9uLnBhcmFtcy50b2tlbk5hbWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpZiAoIXRva2VuICYmIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWUpIHtcbiAgICB0b2tlbiA9IG1pbnRBZGRyZXNzO1xuICB9XG5cbiAgYXNzZXJ0KHRva2VuKTtcblxuICByZXR1cm4gdG9rZW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kVHJhbnNmZXJIb29rQWNjb3VudHMoXG4gIGZyb21BZGRyZXNzOiBzdHJpbmcsXG4gIHRvQWRkcmVzczogc3RyaW5nLFxuICB0b2tlbkFkZHJlc3M6IHN0cmluZyxcbiAgaW5zdHJ1Y3Rpb25NZXRhZGF0YT86IEluc3RydWN0aW9uUGFyYW1zW11cbik6IEV4dHJhQWNjb3VudE1ldGFbXSB8IHVuZGVmaW5lZCB7XG4gIGxldCB0cmFuc2Zlckhvb2tBY2NvdW50czogRXh0cmFBY2NvdW50TWV0YVtdIHwgdW5kZWZpbmVkO1xuXG4gIGluc3RydWN0aW9uTWV0YWRhdGE/LmZvckVhY2goKGluc3RydWN0aW9uKSA9PiB7XG4gICAgaWYgKFxuICAgICAgaW5zdHJ1Y3Rpb24udHlwZSA9PT0gSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVG9rZW5UcmFuc2ZlciAmJlxuICAgICAgaW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuQWRkcmVzcyA9PT0gdG9rZW5BZGRyZXNzICYmXG4gICAgICBpbnN0cnVjdGlvbi5wYXJhbXMuZnJvbUFkZHJlc3MgPT09IGZyb21BZGRyZXNzICYmXG4gICAgICBpbnN0cnVjdGlvbi5wYXJhbXMudG9BZGRyZXNzID09PSB0b0FkZHJlc3NcbiAgICApIHtcbiAgICAgIHRyYW5zZmVySG9va0FjY291bnRzID0gaW5zdHJ1Y3Rpb24ucGFyYW1zLnRyYW5zZmVySG9va0FjY291bnRzO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHRyYW5zZmVySG9va0FjY291bnRzO1xufVxuIl19
|
|
1214
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9pbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFxRUEsNERBbUNDO0FBcXpDRCxzQ0FvQ0M7QUFFRCw0REFvQkM7QUF2OUNELGlEQVkyQjtBQUMzQiw2Q0FjeUI7QUFFekIsc0RBQXlEO0FBQ3pELG1EQUFxRTtBQUNyRSxpREFBcUQ7QUFDckQsb0RBQTRCO0FBQzVCLDJDQUErRztBQXlCL0csbUNBQTZDO0FBRTdDLHVFQUFrRjtBQUVsRjs7Ozs7O0dBTUc7QUFDSCxTQUFnQix3QkFBd0IsQ0FDdEMsSUFBcUIsRUFDckIsWUFBc0MsRUFDdEMsUUFBaUIsRUFDakIsbUJBQXlDLEVBQ3pDLHlCQUFtQztJQUVuQyxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2IsS0FBSywwQkFBZSxDQUFDLG9CQUFvQjtZQUN2QyxPQUFPLDJCQUEyQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ25ELEtBQUssMEJBQWUsQ0FBQyxJQUFJO1lBQ3ZCLE9BQU8scUJBQXFCLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFLHlCQUF5QixDQUFDLENBQUM7UUFDN0YsS0FBSywwQkFBZSxDQUFDLGVBQWU7WUFDbEMsT0FBTyxnQ0FBZ0MsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4RCxLQUFLLDBCQUFlLENBQUMsaUJBQWlCO1lBQ3BDLE9BQU8sa0NBQWtDLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3BFLEtBQUssMEJBQWUsQ0FBQyxlQUFlO1lBQ2xDLE9BQU8sZ0NBQWdDLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEQsS0FBSywwQkFBZSxDQUFDLG9DQUFvQztZQUN2RCxPQUFPLHdCQUF3QixDQUFDLFlBQVksRUFBRSxtQkFBbUIsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1FBQ2hHLEtBQUss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SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sb0JBQW9CLENBQUM7QUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERlY29kZWRUcmFuc2ZlckNoZWNrZWRJbnN0cnVjdGlvbixcbiAgZGVjb2RlVHJhbnNmZXJDaGVja2VkSW5zdHJ1Y3Rpb24sXG4gIGRlY29kZVRyYW5zZmVyQ2hlY2tlZFdpdGhGZWVJbnN0cnVjdGlvbixcbiAgRGVjb2RlZEJ1cm5JbnN0cnVjdGlvbixcbiAgZGVjb2RlQnVybkluc3RydWN0aW9uLFxuICBEZWNvZGVkTWludFRvSW5zdHJ1Y3Rpb24sXG4gIGRlY29kZU1pbnRUb0luc3RydWN0aW9uLFxuICBUT0tFTl8yMDIyX1BST0dSQU1fSUQsXG4gIGRlY29kZUFwcHJvdmVJbnN0cnVjdGlvbixcbiAgVG9rZW5JbnN0cnVjdGlvbixcbiAgVHJhbnNmZXJGZWVJbnN0cnVjdGlvbixcbn0gZnJvbSAnQHNvbGFuYS9zcGwtdG9rZW4nO1xuaW1wb3J0IHtcbiAgQWxsb2NhdGVQYXJhbXMsXG4gIEFzc2lnblBhcmFtcyxcbiAgQ3JlYXRlQWNjb3VudFBhcmFtcyxcbiAgRGVhY3RpdmF0ZVN0YWtlUGFyYW1zLFxuICBEZWNvZGVkVHJhbnNmZXJJbnN0cnVjdGlvbixcbiAgRGVsZWdhdGVTdGFrZVBhcmFtcyxcbiAgSW5pdGlhbGl6ZVN0YWtlUGFyYW1zLFxuICBTcGxpdFN0YWtlUGFyYW1zLFxuICBTdGFrZUluc3RydWN0aW9uLFxuICBTdGFrZVByb2dyYW0sXG4gIFN5c3RlbUluc3RydWN0aW9uLFxuICBUcmFuc2FjdGlvbkluc3RydWN0aW9uLFxuICBDb21wdXRlQnVkZ2V0SW5zdHJ1Y3Rpb24sXG59IGZyb20gJ0Bzb2xhbmEvd2ViMy5qcyc7XG5cbmltcG9ydCB7IFNvbFN0YWtpbmdUeXBlRW51bSB9IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgTm90U3VwcG9ydGVkLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBjb2lucywgU29sQ29pbiB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMsIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0sIHdhbGxldEluaXRJbnN0cnVjdGlvbkluZGV4ZXMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBBdGFDbG9zZSxcbiAgQXRhSW5pdCxcbiAgQXRhUmVjb3Zlck5lc3RlZCxcbiAgQnVybixcbiAgRXh0cmFBY2NvdW50TWV0YSxcbiAgSW5zdHJ1Y3Rpb25QYXJhbXMsXG4gIE1lbW8sXG4gIE1pbnRUbyxcbiAgTm9uY2UsXG4gIFBlcm1pc3Npb25sZXNzVGhhd0lkZW1wb3RlbnQsXG4gIFN0YWtpbmdBY3RpdmF0ZSxcbiAgU3Rha2luZ0F1dGhvcml6ZSxcbiAgU3Rha2luZ0RlYWN0aXZhdGUsXG4gIFN0YWtpbmdEZWxlZ2F0ZSxcbiAgU3Rha2luZ1dpdGhkcmF3LFxuICBUb2tlblRyYW5zZmVyLFxuICBUcmFuc2ZlcixcbiAgV2FsbGV0SW5pdCxcbiAgU2V0Q29tcHV0ZVVuaXRMaW1pdCxcbiAgU2V0UHJpb3JpdHlGZWUsXG4gIEN1c3RvbUluc3RydWN0aW9uLFxuICBBcHByb3ZlLFxufSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IGdldEluc3RydWN0aW9uVHlwZSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgRGVwb3NpdFNvbFBhcmFtcywgV2l0aGRyYXdTdGFrZVBhcmFtcyB9IGZyb20gJ0Bzb2xhbmEvc3BsLXN0YWtlLXBvb2wnO1xuaW1wb3J0IHsgZGVjb2RlRGVwb3NpdFNvbCwgZGVjb2RlV2l0aGRyYXdTdGFrZSB9IGZyb20gJy4vaml0b1N0YWtlUG9vbE9wZXJhdGlvbnMnO1xuXG4vKipcbiAqIENvbnN0cnVjdCBpbnN0cnVjdGlvbnMgcGFyYW1zIGZyb20gU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25UeXBlfSB0eXBlIC0gdGhlIHRyYW5zYWN0aW9uIHR5cGVcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBzb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RydWN0aW9uUGFyYW1zRmFjdG9yeShcbiAgdHlwZTogVHJhbnNhY3Rpb25UeXBlLFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSxcbiAgY29pbk5hbWU/OiBzdHJpbmcsXG4gIGluc3RydWN0aW9uTWV0YWRhdGE/OiBJbnN0cnVjdGlvblBhcmFtc1tdLFxuICBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lPzogYm9vbGVhblxuKTogSW5zdHJ1Y3Rpb25QYXJhbXNbXSB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uOlxuICAgICAgcmV0dXJuIHBhcnNlV2FsbGV0SW5pdEluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlNlbmQ6XG4gICAgICByZXR1cm4gcGFyc2VTZW5kSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucywgaW5zdHJ1Y3Rpb25NZXRhZGF0YSwgX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZSk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlOlxuICAgICAgcmV0dXJuIHBhcnNlU3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGU6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nRGVhY3RpdmF0ZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMsIGNvaW5OYW1lKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXc6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nV2l0aGRyYXdJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5Bc3NvY2lhdGVkVG9rZW5BY2NvdW50SW5pdGlhbGl6YXRpb246XG4gICAgICByZXR1cm4gcGFyc2VBdGFJbml0SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucywgaW5zdHJ1Y3Rpb25NZXRhZGF0YSwgX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZSk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQ2xvc2VBc3NvY2lhdGVkVG9rZW5BY2NvdW50OlxuICAgICAgcmV0dXJuIHBhcnNlQXRhQ2xvc2VJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQXV0aG9yaXplOlxuICAgICAgcmV0dXJuIHBhcnNlU3Rha2luZ0F1dGhvcml6ZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemVSYXc6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nQXV0aG9yaXplUmF3SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlbGVnYXRlOlxuICAgICAgcmV0dXJuIHBhcnNlU3Rha2luZ0RlbGVnYXRlSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHg6XG4gICAgICByZXR1cm4gcGFyc2VDdXN0b21JbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zLCBpbnN0cnVjdGlvbk1ldGFkYXRhKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5Db25maWRlbnRpYWxUcmFuc2ZlcjpcbiAgICAgIHJldHVybiBwYXJzZUNvbmZpZGVudGlhbFRyYW5zZmVySW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucywgaW5zdHJ1Y3Rpb25NZXRhZGF0YSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgdHJhbnNhY3Rpb24sIHRyYW5zYWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJyArIHR5cGUpO1xuICB9XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gV2FsbGV0IGluaXRpYWxpemF0aW9uIHR4IGluc3RydWN0aW9ucyBwYXJhbXNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gY29udGFpbmluZyBjcmVhdGUgYW5kIGluaXRpYWxpemUgbm9uY2Ugc29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBXYWxsZXQgaW5pdGlhbGl6YXRpb24gdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VXYWxsZXRJbml0SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogQXJyYXk8V2FsbGV0SW5pdCB8IE1lbW8+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxXYWxsZXRJbml0IHwgTWVtbz4gPSBbXTtcbiAgY29uc3QgY3JlYXRlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVDcmVhdGVBY2NvdW50KGluc3RydWN0aW9uc1t3YWxsZXRJbml0SW5zdHJ1Y3Rpb25JbmRleGVzLkNyZWF0ZV0pO1xuICBjb25zdCBub25jZUluaXRJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlSW5pdGlhbGl6ZShcbiAgICBpbnN0cnVjdGlvbnNbd2FsbGV0SW5pdEluc3RydWN0aW9uSW5kZXhlcy5Jbml0aWFsaXplTm9uY2VBY2NvdW50XVxuICApO1xuXG4gIGNvbnN0IHdhbGxldEluaXQ6IFdhbGxldEluaXQgPSB7XG4gICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlTm9uY2VBY2NvdW50LFxuICAgIHBhcmFtczoge1xuICAgICAgZnJvbUFkZHJlc3M6IGNyZWF0ZUluc3RydWN0aW9uLmZyb21QdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIG5vbmNlQWRkcmVzczogbm9uY2VJbml0SW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIGF1dGhBZGRyZXNzOiBub25jZUluaXRJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBhbW91bnQ6IGNyZWF0ZUluc3RydWN0aW9uLmxhbXBvcnRzLnRvU3RyaW5nKCksXG4gICAgfSxcbiAgfTtcbiAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2god2FsbGV0SW5pdCk7XG5cbiAgY29uc3QgbWVtbyA9IGdldE1lbW8oaW5zdHJ1Y3Rpb25zLCB3YWxsZXRJbml0SW5zdHJ1Y3Rpb25JbmRleGVzKTtcbiAgaWYgKG1lbW8pIHtcbiAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgfVxuXG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gU2VuZCB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKiBPbmx5IHN1cHBvcnRzIE1lbW8sIFRyYW5zZmVyIGFuZCBBZHZhbmNlIE5vbmNlIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3IgU2VuZCB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVNlbmRJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLFxuICBpbnN0cnVjdGlvbk1ldGFkYXRhPzogSW5zdHJ1Y3Rpb25QYXJhbXNbXSxcbiAgX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZT86IGJvb2xlYW5cbik6IEFycmF5PFxuICB8IE5vbmNlXG4gIHwgTWVtb1xuICB8IFRyYW5zZmVyXG4gIHwgVG9rZW5UcmFuc2ZlclxuICB8IEF0YUluaXRcbiAgfCBBdGFDbG9zZVxuICB8IFNldENvbXB1dGVVbml0TGltaXRcbiAgfCBTZXRQcmlvcml0eUZlZVxuICB8IE1pbnRUb1xuICB8IEJ1cm5cbiAgfCBBcHByb3ZlXG4gIHwgUGVybWlzc2lvbmxlc3NUaGF3SWRlbXBvdGVudFxuPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8XG4gICAgfCBOb25jZVxuICAgIHwgTWVtb1xuICAgIHwgVHJhbnNmZXJcbiAgICB8IFRva2VuVHJhbnNmZXJcbiAgICB8IEF0YUluaXRcbiAgICB8IEF0YUNsb3NlXG4gICAgfCBTZXRDb21wdXRlVW5pdExpbWl0XG4gICAgfCBTZXRQcmlvcml0eUZlZVxuICAgIHwgTWludFRvXG4gICAgfCBCdXJuXG4gICAgfCBBcHByb3ZlXG4gICAgfCBQZXJtaXNzaW9ubGVzc1RoYXdJZGVtcG90ZW50XG4gID4gPSBbXTtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NZW1vOlxuICAgICAgICBjb25zdCBtZW1vOiBNZW1vID0geyB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLCBwYXJhbXM6IHsgbWVtbzogaW5zdHJ1Y3Rpb24uZGF0YS50b1N0cmluZygpIH0gfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobWVtbyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5UcmFuc2ZlcjpcbiAgICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZVRyYW5zZmVyKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3QgdHJhbnNmZXI6IFRyYW5zZmVyID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRyYW5zZmVyLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZnJvbUFkZHJlc3M6IHRyYW5zZmVySW5zdHJ1Y3Rpb24uZnJvbVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9BZGRyZXNzOiB0cmFuc2Zlckluc3RydWN0aW9uLnRvUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhbW91bnQ6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ubGFtcG9ydHMudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaCh0cmFuc2Zlcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRva2VuVHJhbnNmZXI6XG4gICAgICAgIGNvbnN0IGlzVG9rZW4yMDIyVHJhbnNmZXIgPSBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKSA9PT0gVE9LRU5fMjAyMl9QUk9HUkFNX0lELnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGlzVHJhbnNmZXJXaXRoRmVlID1cbiAgICAgICAgICBpc1Rva2VuMjAyMlRyYW5zZmVyICYmXG4gICAgICAgICAgaW5zdHJ1Y3Rpb24uZGF0YS5sZW5ndGggPj0gMiAmJlxuICAgICAgICAgIGluc3RydWN0aW9uLmRhdGFbMF0gPT09IFRva2VuSW5zdHJ1Y3Rpb24uVHJhbnNmZXJGZWVFeHRlbnNpb24gJiZcbiAgICAgICAgICBpbnN0cnVjdGlvbi5kYXRhWzFdID09PSBUcmFuc2ZlckZlZUluc3RydWN0aW9uLlRyYW5zZmVyQ2hlY2tlZFdpdGhGZWU7XG4gICAgICAgIGxldCB0dEtleXM6IERlY29kZWRUcmFuc2ZlckNoZWNrZWRJbnN0cnVjdGlvblsna2V5cyddO1xuICAgICAgICBsZXQgdHRBbW91bnQ6IGJpZ2ludDtcbiAgICAgICAgbGV0IHR0RGVjaW1hbHM6IG51bWJlcjtcbiAgICAgICAgbGV0IHR0RmVlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChpc1RyYW5zZmVyV2l0aEZlZSkge1xuICAgICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVUcmFuc2ZlckNoZWNrZWRXaXRoRmVlSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24sIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gICAgICAgICAgLy8gV2l0aEZlZSBleHBvc2VzIGBhdXRob3JpdHlgIHdoZXJlIFRyYW5zZmVyQ2hlY2tlZCBleHBvc2VzIGBvd25lcmA7IG5vcm1hbGl6ZSB0byBvd25lci5cbiAgICAgICAgICB0dEtleXMgPSB7XG4gICAgICAgICAgICBzb3VyY2U6IGRlY29kZWQua2V5cy5zb3VyY2UsXG4gICAgICAgICAgICBtaW50OiBkZWNvZGVkLmtleXMubWludCxcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uOiBkZWNvZGVkLmtleXMuZGVzdGluYXRpb24sXG4gICAgICAgICAgICBvd25lcjogZGVjb2RlZC5rZXlzLmF1dGhvcml0eSxcbiAgICAgICAgICB9IGFzIERlY29kZWRUcmFuc2ZlckNoZWNrZWRJbnN0cnVjdGlvblsna2V5cyddO1xuICAgICAgICAgIHR0QW1vdW50ID0gZGVjb2RlZC5kYXRhLmFtb3VudDtcbiAgICAgICAgICB0dERlY2ltYWxzID0gZGVjb2RlZC5kYXRhLmRlY2ltYWxzO1xuICAgICAgICAgIHR0RmVlID0gZGVjb2RlZC5kYXRhLmZlZS50b1N0cmluZygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVUcmFuc2ZlckNoZWNrZWRJbnN0cnVjdGlvbihcbiAgICAgICAgICAgIGluc3RydWN0aW9uLFxuICAgICAgICAgICAgaXNUb2tlbjIwMjJUcmFuc2ZlciA/IFRPS0VOXzIwMjJfUFJPR1JBTV9JRCA6IHVuZGVmaW5lZFxuICAgICAgICAgICk7XG4gICAgICAgICAgdHRLZXlzID0gZGVjb2RlZC5rZXlzO1xuICAgICAgICAgIHR0QW1vdW50ID0gZGVjb2RlZC5kYXRhLmFtb3VudDtcbiAgICAgICAgICB0dERlY2ltYWxzID0gZGVjb2RlZC5kYXRhLmRlY2ltYWxzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9IHR0S2V5cy5taW50LnB1YmtleS50b1N0cmluZygpO1xuICAgICAgICBjb25zdCB0b2tlbk5hbWUgPSBmaW5kVG9rZW5OYW1lKHRva2VuQWRkcmVzcywgaW5zdHJ1Y3Rpb25NZXRhZGF0YSwgX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZSk7XG4gICAgICAgIGxldCBwcm9ncmFtSURGb3JUb2tlblRyYW5zZmVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChpbnN0cnVjdGlvbi5wcm9ncmFtSWQpIHtcbiAgICAgICAgICBwcm9ncmFtSURGb3JUb2tlblRyYW5zZmVyID0gaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHJhbnNmZXJIb29rQWNjb3VudHMgPSBmaW5kVHJhbnNmZXJIb29rQWNjb3VudHMoXG4gICAgICAgICAgdHRLZXlzLm93bmVyLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIHR0S2V5cy5kZXN0aW5hdGlvbi5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgICAgaW5zdHJ1Y3Rpb25NZXRhZGF0YVxuICAgICAgICApO1xuICAgICAgICBjb25zdCB0b2tlblRyYW5zZmVyOiBUb2tlblRyYW5zZmVyID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRva2VuVHJhbnNmZXIsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBmcm9tQWRkcmVzczogdHRLZXlzLm93bmVyLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9BZGRyZXNzOiB0dEtleXMuZGVzdGluYXRpb24ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhbW91bnQ6IHR0QW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlbk5hbWUsXG4gICAgICAgICAgICBzb3VyY2VBZGRyZXNzOiB0dEtleXMuc291cmNlLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5BZGRyZXNzOiB0b2tlbkFkZHJlc3MsXG4gICAgICAgICAgICBwcm9ncmFtSWQ6IHByb2dyYW1JREZvclRva2VuVHJhbnNmZXIsXG4gICAgICAgICAgICBkZWNpbWFsUGxhY2VzOiB0dERlY2ltYWxzLFxuICAgICAgICAgICAgLi4uKHR0RmVlICE9PSB1bmRlZmluZWQgPyB7IGZlZTogdHRGZWUgfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLih0cmFuc2Zlckhvb2tBY2NvdW50cyA/IHsgdHJhbnNmZXJIb29rQWNjb3VudHMgfSA6IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaCh0b2tlblRyYW5zZmVyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQXBwcm92ZTpcbiAgICAgICAgY29uc3QgcHJvZ3JhbUlkID0gaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLmVxdWFscyhUT0tFTl8yMDIyX1BST0dSQU1fSUQpID8gVE9LRU5fMjAyMl9QUk9HUkFNX0lEIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBhcHByb3ZlSW5zdHJ1Y3Rpb24gPSBkZWNvZGVBcHByb3ZlSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24sIHByb2dyYW1JZCk7XG4gICAgICAgIGNvbnN0IGFwcHJvdmU6IEFwcHJvdmUgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQXBwcm92ZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGFjY291bnRBZGRyZXNzOiBhcHByb3ZlSW5zdHJ1Y3Rpb24ua2V5cy5hY2NvdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBkZWxlZ2F0ZUFkZHJlc3M6IGFwcHJvdmVJbnN0cnVjdGlvbi5rZXlzLmRlbGVnYXRlLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBvd25lckFkZHJlc3M6IGFwcHJvdmVJbnN0cnVjdGlvbi5rZXlzLm93bmVyLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhbW91bnQ6IGFwcHJvdmVJbnN0cnVjdGlvbi5kYXRhLmFtb3VudC50b1N0cmluZygpLFxuICAgICAgICAgICAgcHJvZ3JhbUlkOiBwcm9ncmFtSWQgJiYgcHJvZ3JhbUlkLnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goYXBwcm92ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkluaXRpYWxpemVBc3NvY2lhdGVkVG9rZW5BY2NvdW50OlxuICAgICAgICBjb25zdCBtaW50QWRkcmVzcyA9IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuTWludEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpO1xuICAgICAgICBjb25zdCBtaW50VG9rZW5OYW1lID0gZmluZFRva2VuTmFtZShtaW50QWRkcmVzcywgaW5zdHJ1Y3Rpb25NZXRhZGF0YSwgX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZSk7XG4gICAgICAgIGxldCBwcm9ncmFtSUQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGluc3RydWN0aW9uLnByb2dyYW1JZCkge1xuICAgICAgICAgIHByb2dyYW1JRCA9IGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXRhSW5pdDogQXRhSW5pdCA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgICAgICBhdGFBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLkFUQUFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgb3duZXJBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLk93bmVyQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBwYXllckFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuUGF5ZXJBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuTmFtZTogbWludFRva2VuTmFtZSxcbiAgICAgICAgICAgIHByb2dyYW1JZDogcHJvZ3JhbUlELFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKGF0YUluaXQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5DbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFjY291bnRBZGRyZXNzID0gaW5zdHJ1Y3Rpb24ua2V5c1tjbG9zZUF0YUluc3RydWN0aW9uS2V5c0luZGV4ZXMuQWNjb3VudEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpO1xuICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkFkZHJlc3MgPVxuICAgICAgICAgIGluc3RydWN0aW9uLmtleXNbY2xvc2VBdGFJbnN0cnVjdGlvbktleXNJbmRleGVzLkRlc3RpbmF0aW9uQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGF1dGhvcml0eUFkZHJlc3MgPSBpbnN0cnVjdGlvbi5rZXlzW2Nsb3NlQXRhSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5BdXRob3JpdHlBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKTtcblxuICAgICAgICBjb25zdCBhdGFDbG9zZTogQXRhQ2xvc2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ2xvc2VBc3NvY2lhdGVkVG9rZW5BY2NvdW50LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgYWNjb3VudEFkZHJlc3MsXG4gICAgICAgICAgICBkZXN0aW5hdGlvbkFkZHJlc3MsXG4gICAgICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKGF0YUNsb3NlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU2V0Q29tcHV0ZVVuaXRMaW1pdDpcbiAgICAgICAgY29uc3Qgc2V0Q29tcHV0ZVVuaXRMaW1pdFBhcmFtcyA9IENvbXB1dGVCdWRnZXRJbnN0cnVjdGlvbi5kZWNvZGVTZXRDb21wdXRlVW5pdExpbWl0KGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgc2V0Q29tcHV0ZVVuaXRMaW1pdDogU2V0Q29tcHV0ZVVuaXRMaW1pdCA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TZXRDb21wdXRlVW5pdExpbWl0LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgdW5pdHM6IHNldENvbXB1dGVVbml0TGltaXRQYXJhbXMudW5pdHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goc2V0Q29tcHV0ZVVuaXRMaW1pdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlNldFByaW9yaXR5RmVlOlxuICAgICAgICBjb25zdCBzZXRDb21wdXRlVW5pdFByaWNlUGFyYW1zID0gQ29tcHV0ZUJ1ZGdldEluc3RydWN0aW9uLmRlY29kZVNldENvbXB1dGVVbml0UHJpY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBzZXRQcmlvcml0eUZlZTogU2V0UHJpb3JpdHlGZWUgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU2V0UHJpb3JpdHlGZWUsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBmZWU6IHNldENvbXB1dGVVbml0UHJpY2VQYXJhbXMubWljcm9MYW1wb3J0cyxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChzZXRQcmlvcml0eUZlZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLk1pbnRUbzpcbiAgICAgICAgbGV0IG1pbnRUb0luc3RydWN0aW9uOiBEZWNvZGVkTWludFRvSW5zdHJ1Y3Rpb247XG4gICAgICAgIGlmIChpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKSAhPT0gVE9LRU5fMjAyMl9QUk9HUkFNX0lELnRvU3RyaW5nKCkpIHtcbiAgICAgICAgICBtaW50VG9JbnN0cnVjdGlvbiA9IGRlY29kZU1pbnRUb0luc3RydWN0aW9uKGluc3RydWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtaW50VG9JbnN0cnVjdGlvbiA9IGRlY29kZU1pbnRUb0luc3RydWN0aW9uKGluc3RydWN0aW9uLCBUT0tFTl8yMDIyX1BST0dSQU1fSUQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1pbnRBZGRyZXNzRm9yTWludCA9IG1pbnRUb0luc3RydWN0aW9uLmtleXMubWludC5wdWJrZXkudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgdG9rZW5OYW1lRm9yTWludCA9IGZpbmRUb2tlbk5hbWUobWludEFkZHJlc3NGb3JNaW50LCBpbnN0cnVjdGlvbk1ldGFkYXRhLCBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKTtcbiAgICAgICAgbGV0IHByb2dyYW1JREZvck1pbnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGluc3RydWN0aW9uLnByb2dyYW1JZCkge1xuICAgICAgICAgIHByb2dyYW1JREZvck1pbnQgPSBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtaW50VG86IE1pbnRUbyA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NaW50VG8sXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBtaW50QWRkcmVzczogbWludEFkZHJlc3NGb3JNaW50LFxuICAgICAgICAgICAgZGVzdGluYXRpb25BZGRyZXNzOiBtaW50VG9JbnN0cnVjdGlvbi5rZXlzLmRlc3RpbmF0aW9uLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aG9yaXR5QWRkcmVzczogbWludFRvSW5zdHJ1Y3Rpb24ua2V5cy5hdXRob3JpdHkucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhbW91bnQ6IG1pbnRUb0luc3RydWN0aW9uLmRhdGEuYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlbk5hbWU6IHRva2VuTmFtZUZvck1pbnQsXG4gICAgICAgICAgICBkZWNpbWFsUGxhY2VzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBwcm9ncmFtSWQ6IHByb2dyYW1JREZvck1pbnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobWludFRvKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQnVybjpcbiAgICAgICAgbGV0IGJ1cm5JbnN0cnVjdGlvbjogRGVjb2RlZEJ1cm5JbnN0cnVjdGlvbjtcbiAgICAgICAgaWYgKGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpICE9PSBUT0tFTl8yMDIyX1BST0dSQU1fSUQudG9TdHJpbmcoKSkge1xuICAgICAgICAgIGJ1cm5JbnN0cnVjdGlvbiA9IGRlY29kZUJ1cm5JbnN0cnVjdGlvbihpbnN0cnVjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnVybkluc3RydWN0aW9uID0gZGVjb2RlQnVybkluc3RydWN0aW9uKGluc3RydWN0aW9uLCBUT0tFTl8yMDIyX1BST0dSQU1fSUQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1pbnRBZGRyZXNzRm9yQnVybiA9IGJ1cm5JbnN0cnVjdGlvbi5rZXlzLm1pbnQucHVia2V5LnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHRva2VuTmFtZUZvckJ1cm4gPSBmaW5kVG9rZW5OYW1lKG1pbnRBZGRyZXNzRm9yQnVybiwgaW5zdHJ1Y3Rpb25NZXRhZGF0YSwgX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZSk7XG4gICAgICAgIGxldCBwcm9ncmFtSURGb3JCdXJuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChpbnN0cnVjdGlvbi5wcm9ncmFtSWQpIHtcbiAgICAgICAgICBwcm9ncmFtSURGb3JCdXJuID0gaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnVybjogQnVybiA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5CdXJuLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgbWludEFkZHJlc3M6IG1pbnRBZGRyZXNzRm9yQnVybixcbiAgICAgICAgICAgIGFjY291bnRBZGRyZXNzOiBidXJuSW5zdHJ1Y3Rpb24ua2V5cy5hY2NvdW50LnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aG9yaXR5QWRkcmVzczogYnVybkluc3RydWN0aW9uLmtleXMub3duZXIucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhbW91bnQ6IGJ1cm5JbnN0cnVjdGlvbi5kYXRhLmFtb3VudC50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiB0b2tlbk5hbWVGb3JCdXJuLFxuICAgICAgICAgICAgZGVjaW1hbFBsYWNlczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcHJvZ3JhbUlkOiBwcm9ncmFtSURGb3JCdXJuLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKGJ1cm4pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5QZXJtaXNzaW9ubGVzc1RoYXdJZGVtcG90ZW50OlxuICAgICAgICAvLyBBY2NvdW50IG9yZGVyIG1hdGNoZXMgdGhlIGZpeGVkIGxheW91dCBlbWl0dGVkIGJ5IHNvbEluc3RydWN0aW9uRmFjdG9yeTpcbiAgICAgICAgLy8gW2F1dGhvcml0eSwgbWludCwgdG9rZW5BY2NvdW50LCBmbGFnQWNjb3VudCwgdG9rZW5BY2NvdW50T3duZXIsIG1pbnRDb25maWcsXG4gICAgICAgIC8vICB0b2tlblByb2dyYW0sIHN5c3RlbVByb2dyYW0sIGdhdGluZ1Byb2dyYW0sIC4uLmV4dHJhQWNjb3VudHNdLlxuICAgICAgICBjb25zdCB0aGF3RXh0cmFBY2NvdW50czogRXh0cmFBY2NvdW50TWV0YVtdID0gaW5zdHJ1Y3Rpb24ua2V5cy5zbGljZSg5KS5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAgICBwdWJrZXk6IGtleS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICBpc1NpZ25lcjoga2V5LmlzU2lnbmVyLFxuICAgICAgICAgIGlzV3JpdGFibGU6IGtleS5pc1dyaXRhYmxlLFxuICAgICAgICB9KSk7XG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb25sZXNzVGhhdzogUGVybWlzc2lvbmxlc3NUaGF3SWRlbXBvdGVudCA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5QZXJtaXNzaW9ubGVzc1RoYXdJZGVtcG90ZW50LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgYXV0aG9yaXR5OiBpbnN0cnVjdGlvbi5rZXlzWzBdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgbWludDogaW5zdHJ1Y3Rpb24ua2V5c1sxXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuQWNjb3VudDogaW5zdHJ1Y3Rpb24ua2V5c1syXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGZsYWdBY2NvdW50OiBpbnN0cnVjdGlvbi5rZXlzWzNdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5BY2NvdW50T3duZXI6IGluc3RydWN0aW9uLmtleXNbNF0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBtaW50Q29uZmlnOiBpbnN0cnVjdGlvbi5rZXlzWzVdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5Qcm9ncmFtOiBpbnN0cnVjdGlvbi5rZXlzWzZdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgc3lzdGVtUHJvZ3JhbTogaW5zdHJ1Y3Rpb24ua2V5c1s3XS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGdhdGluZ1Byb2dyYW06IGluc3RydWN0aW9uLmtleXNbOF0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBleHRyYUFjY291bnRzOiB0aGF3RXh0cmFBY2NvdW50cyxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChwZXJtaXNzaW9ubGVzc1RoYXcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAgICAgJ0ludmFsaWQgdHJhbnNhY3Rpb24sIGluc3RydWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJyArIGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbilcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxudHlwZSBTdGFraW5nSW5zdHJ1Y3Rpb25zID0ge1xuICBkZXBvc2l0U29sPzogRGVwb3NpdFNvbFBhcmFtcztcbiAgY3JlYXRlPzogQ3JlYXRlQWNjb3VudFBhcmFtcztcbiAgaW5pdGlhbGl6ZT86IEluaXRpYWxpemVTdGFrZVBhcmFtcztcbiAgZGVsZWdhdGU/OiBEZWxlZ2F0ZVN0YWtlUGFyYW1zO1xuICBoYXNBdGFJbml0PzogYm9vbGVhbjtcbn07XG5cbnR5cGUgSml0b1N0YWtpbmdJbnN0cnVjdGlvbnMgPSBTdGFraW5nSW5zdHJ1Y3Rpb25zICYge1xuICBkZXBvc2l0U29sOiBOb25OdWxsYWJsZTxTdGFraW5nSW5zdHJ1Y3Rpb25zWydkZXBvc2l0U29sJ10+O1xufTtcblxuZnVuY3Rpb24gaXNKaXRvU3Rha2luZ0luc3RydWN0aW9ucyhzaTogU3Rha2luZ0luc3RydWN0aW9ucyk6IHNpIGlzIEppdG9TdGFraW5nSW5zdHJ1Y3Rpb25zIHtcbiAgcmV0dXJuIHNpLmRlcG9zaXRTb2wgIT09IHVuZGVmaW5lZDtcbn1cblxudHlwZSBNYXJpbmFkZVN0YWtpbmdJbnN0cnVjdGlvbnMgPSBTdGFraW5nSW5zdHJ1Y3Rpb25zICYge1xuICBjcmVhdGU6IE5vbk51bGxhYmxlPFN0YWtpbmdJbnN0cnVjdGlvbnNbJ2NyZWF0ZSddPjtcbiAgaW5pdGlhbGl6ZTogTm9uTnVsbGFibGU8U3Rha2luZ0luc3RydWN0aW9uc1snaW5pdGlhbGl6ZSddPjtcbn07XG5cbmZ1bmN0aW9uIGlzTWFyaW5hZGVTdGFraW5nSW5zdHJ1Y3Rpb25zKHNpOiBTdGFraW5nSW5zdHJ1Y3Rpb25zKTogc2kgaXMgTWFyaW5hZGVTdGFraW5nSW5zdHJ1Y3Rpb25zIHtcbiAgcmV0dXJuIHNpLmNyZWF0ZSAhPT0gdW5kZWZpbmVkICYmIHNpLmluaXRpYWxpemUgIT09IHVuZGVmaW5lZCAmJiBzaS5kZWxlZ2F0ZSA9PT0gdW5kZWZpbmVkO1xufVxuXG50eXBlIE5hdGl2ZVN0YWtpbmdJbnN0cnVjdGlvbnMgPSBTdGFraW5nSW5zdHJ1Y3Rpb25zICYge1xuICBjcmVhdGU6IE5vbk51bGxhYmxlPFN0YWtpbmdJbnN0cnVjdGlvbnNbJ2NyZWF0ZSddPjtcbiAgaW5pdGlhbGl6ZTogTm9uTnVsbGFibGU8U3Rha2luZ0luc3RydWN0aW9uc1snaW5pdGlhbGl6ZSddPjtcbiAgZGVsZWdhdGU6IE5vbk51bGxhYmxlPFN0YWtpbmdJbnN0cnVjdGlvbnNbJ2RlbGVnYXRlJ10+O1xufTtcblxuZnVuY3Rpb24gaXNOYXRpdmVTdGFraW5nSW5zdHJ1Y3Rpb25zKHNpOiBTdGFraW5nSW5zdHJ1Y3Rpb25zKTogc2kgaXMgTmF0aXZlU3Rha2luZ0luc3RydWN0aW9ucyB7XG4gIHJldHVybiBzaS5jcmVhdGUgIT09IHVuZGVmaW5lZCAmJiBzaS5pbml0aWFsaXplICE9PSB1bmRlZmluZWQgJiYgc2kuZGVsZWdhdGUgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0U3Rha2luZ1R5cGVGcm9tU3Rha2luZ0luc3RydWN0aW9ucyhzaTogU3Rha2luZ0luc3RydWN0aW9ucyk6IFNvbFN0YWtpbmdUeXBlRW51bSB7XG4gIGNvbnN0IGlzSml0byA9IGlzSml0b1N0YWtpbmdJbnN0cnVjdGlvbnMoc2kpO1xuICBjb25zdCBpc01hcmluYWRlID0gaXNNYXJpbmFkZVN0YWtpbmdJbnN0cnVjdGlvbnMoc2kpO1xuICBjb25zdCBpc05hdGl2ZSA9IGlzTmF0aXZlU3Rha2luZ0luc3RydWN0aW9ucyhzaSk7XG4gIGFzc2VydChbaXNKaXRvLCBpc01hcmluYWRlLCBpc05hdGl2ZV0uZmlsdGVyKCh4KSA9PiB4KS5sZW5ndGggPT09IDEsICdTdGFraW5nVHlwZSBpcyBhbWJpZ3VvdXMnKTtcbiAgaWYgKGlzSml0bykgcmV0dXJuIFNvbFN0YWtpbmdUeXBlRW51bS5KSVRPO1xuICBpZiAoaXNNYXJpbmFkZSkgcmV0dXJuIFNvbFN0YWtpbmdUeXBlRW51bS5NQVJJTkFERTtcbiAgaWYgKGlzTmF0aXZlKSByZXR1cm4gU29sU3Rha2luZ1R5cGVFbnVtLk5BVElWRTtcbiAgYXNzZXJ0KGZhbHNlLCAnTm8gU3Rha2luZ1R5cGUgZm91bmQnKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBjcmVhdGUgc3Rha2luZyB0eCBhbmQgZGVsZWdhdGUgdHggaW5zdHJ1Y3Rpb25zIHBhcmFtc1xuICogT25seSBzdXBwb3J0cyBOb25jZSwgU3Rha2luZ0FjdGl2YXRlIGFuZCBNZW1vIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3Igc3Rha2luZyBhY3RpdmF0ZSB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVN0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW11cbik6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0FjdGl2YXRlIHwgTWVtbyB8IEF0YUluaXQ+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxOb25jZSB8IFN0YWtpbmdBY3RpdmF0ZSB8IE1lbW8gfCBBdGFJbml0PiA9IFtdO1xuICBjb25zdCBzdGFraW5nSW5zdHJ1Y3Rpb25zID0ge30gYXMgU3Rha2luZ0luc3RydWN0aW9ucztcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BZHZhbmNlTm9uY2VBY2NvdW50OlxuICAgICAgICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NZW1vOlxuICAgICAgICBjb25zdCBtZW1vOiBNZW1vID0geyB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLCBwYXJhbXM6IHsgbWVtbzogaW5zdHJ1Y3Rpb24uZGF0YS50b1N0cmluZygpIH0gfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobWVtbyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQ3JlYXRlOlxuICAgICAgICBzdGFraW5nSW5zdHJ1Y3Rpb25zLmNyZWF0ZSA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUNyZWF0ZUFjY291bnQoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlN0YWtpbmdJbml0aWFsaXplOlxuICAgICAgICBzdGFraW5nSW5zdHJ1Y3Rpb25zLmluaXRpYWxpemUgPSBTdGFrZUluc3RydWN0aW9uLmRlY29kZUluaXRpYWxpemUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlN0YWtpbmdEZWxlZ2F0ZTpcbiAgICAgICAgc3Rha2luZ0luc3RydWN0aW9ucy5kZWxlZ2F0ZSA9IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlRGVsZWdhdGUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkRlcG9zaXRTb2w6XG4gICAgICAgIHN0YWtpbmdJbnN0cnVjdGlvbnMuZGVwb3NpdFNvbCA9IGRlY29kZURlcG9zaXRTb2woaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkluaXRpYWxpemVBc3NvY2lhdGVkVG9rZW5BY2NvdW50OlxuICAgICAgICBzdGFraW5nSW5zdHJ1Y3Rpb25zLmhhc0F0YUluaXQgPSB0cnVlO1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaCh7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudCxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIG1pbnRBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLk1pbnRBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF0YUFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuQVRBQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBvd25lckFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuT3duZXJBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHBheWVyQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5QYXllckFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiBmaW5kVG9rZW5OYW1lKGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuTWludEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVTdGFraW5nSW5zdHJ1Y3Rpb25zKHN0YWtpbmdJbnN0cnVjdGlvbnMpO1xuICBjb25zdCBzdGFraW5nVHlwZSA9IGdldFN0YWtpbmdUeXBlRnJvbVN0YWtpbmdJbnN0cnVjdGlvbnMoc3Rha2luZ0luc3RydWN0aW9ucyk7XG5cbiAgbGV0IHN0YWtpbmdBY3RpdmF0ZTogU3Rha2luZ0FjdGl2YXRlIHwgdW5kZWZpbmVkO1xuXG4gIHN3aXRjaCAoc3Rha2luZ1R5cGUpIHtcbiAgICBjYXNlIFNvbFN0YWtpbmdUeXBlRW51bS5KSVRPOiB7XG4gICAgICBhc3NlcnQoaXNKaXRvU3Rha2luZ0luc3RydWN0aW9ucyhzdGFraW5nSW5zdHJ1Y3Rpb25zKSk7XG4gICAgICBjb25zdCB7IGRlcG9zaXRTb2wsIGhhc0F0YUluaXQgfSA9IHN0YWtpbmdJbnN0cnVjdGlvbnM7XG4gICAgICBzdGFraW5nQWN0aXZhdGUgPSB7XG4gICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdBY3RpdmF0ZSxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgc3Rha2luZ1R5cGUsXG4gICAgICAgICAgZnJvbUFkZHJlc3M6IGRlcG9zaXRTb2wuZnVuZGluZ0FjY291bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICBzdGFraW5nQWRkcmVzczogZGVwb3NpdFNvbC5zdGFrZVBvb2wudG9TdHJpbmcoKSxcbiAgICAgICAgICBhbW91bnQ6IGRlcG9zaXRTb2wubGFtcG9ydHMudG9TdHJpbmcoKSxcbiAgICAgICAgICB2YWxpZGF0b3I6IGRlcG9zaXRTb2wuc3Rha2VQb29sLnRvU3RyaW5nKCksXG4gICAgICAgICAgZXh0cmFQYXJhbXM6IHtcbiAgICAgICAgICAgIHN0YWtlUG9vbERhdGE6IHtcbiAgICAgICAgICAgICAgbWFuYWdlckZlZUFjY291bnQ6IGRlcG9zaXRTb2wubWFuYWdlckZlZUFjY291bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgcG9vbE1pbnQ6IGRlcG9zaXRTb2wucG9vbE1pbnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgcmVzZXJ2ZVN0YWtlOiBkZXBvc2l0U29sLnJlc2VydmVTdGFrZS50b1N0cmluZygpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6ICEhaGFzQXRhSW5pdCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNhc2UgU29sU3Rha2luZ1R5cGVFbnVtLk1BUklOQURFOiB7XG4gICAgICBhc3NlcnQoaXNNYXJpbmFkZVN0YWtpbmdJbnN0cnVjdGlvbnMoc3Rha2luZ0luc3RydWN0aW9ucykpO1xuICAgICAgY29uc3QgeyBjcmVhdGUsIGluaXRpYWxpemUgfSA9IHN0YWtpbmdJbnN0cnVjdGlvbnM7XG4gICAgICBzdGFraW5nQWN0aXZhdGUgPSB7XG4gICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdBY3RpdmF0ZSxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgc3Rha2luZ1R5cGUsXG4gICAgICAgICAgZnJvbUFkZHJlc3M6IGNyZWF0ZS5mcm9tUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgc3Rha2luZ0FkZHJlc3M6IGluaXRpYWxpemUuc3Rha2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICBhbW91bnQ6IGNyZWF0ZS5sYW1wb3J0cy50b1N0cmluZygpLFxuICAgICAgICAgIHZhbGlkYXRvcjogaW5pdGlhbGl6ZS5hdXRob3JpemVkLnN0YWtlci50b1N0cmluZygpLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNhc2UgU29sU3Rha2luZ1R5cGVFbnVtLk5BVElWRToge1xuICAgICAgYXNzZXJ0KGlzTmF0aXZlU3Rha2luZ0luc3RydWN0aW9ucyhzdGFraW5nSW5zdHJ1Y3Rpb25zKSk7XG4gICAgICBjb25zdCB7IGNyZWF0ZSwgaW5pdGlhbGl6ZSwgZGVsZWdhdGUgfSA9IHN0YWtpbmdJbnN0cnVjdGlvbnM7XG4gICAgICBzdGFraW5nQWN0aXZhdGUgPSB7XG4gICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdBY3RpdmF0ZSxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgc3Rha2luZ1R5cGUsXG4gICAgICAgICAgZnJvbUFkZHJlc3M6IGNyZWF0ZS5mcm9tUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgc3Rha2luZ0FkZHJlc3M6IGluaXRpYWxpemUuc3Rha2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICBhbW91bnQ6IGNyZWF0ZS5sYW1wb3J0cy50b1N0cmluZygpLFxuICAgICAgICAgIHZhbGlkYXRvcjogZGVsZWdhdGUudm90ZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNvbnN0IHVucmVhY2hhYmxlOiBuZXZlciA9IHN0YWtpbmdUeXBlO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YWtpbmcgdHlwZSAke3VucmVhY2hhYmxlfWApO1xuICAgIH1cbiAgfVxuXG4gIGluc3RydWN0aW9uRGF0YS5wdXNoKHN0YWtpbmdBY3RpdmF0ZSk7XG5cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gY3JlYXRlIGRlbGVnYXRlIHR4XG4gKiBPbmx5IHN1cHBvcnRzIE5vbmNlLCBTdGFraW5nRGVsZWdhdGVcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3Igc3Rha2luZyBkZWxlZ2F0ZSB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVN0YWtpbmdEZWxlZ2F0ZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSk6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0RlbGVnYXRlPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nRGVsZWdhdGU+ID0gW107XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU3Rha2luZ0RlbGVnYXRlOlxuICAgICAgICBjb25zdCBzdGFraW5nRGVsZWdhdGVQYXJhbXMgPSBTdGFrZUluc3RydWN0aW9uLmRlY29kZURlbGVnYXRlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgc3Rha2luZ0RlbGVnYXRlOiBTdGFraW5nRGVsZWdhdGUgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0RlbGVnYXRlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZnJvbUFkZHJlc3M6IHN0YWtpbmdEZWxlZ2F0ZVBhcmFtcy5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgICAgICBzdGFraW5nQWRkcmVzczogc3Rha2luZ0RlbGVnYXRlUGFyYW1zLnN0YWtlUHVia2V5LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgICAgICB2YWxpZGF0b3I6IHN0YWtpbmdEZWxlZ2F0ZVBhcmFtcy52b3RlUHVia2V5LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goc3Rha2luZ0RlbGVnYXRlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3Rha2luZ0luc3RydWN0aW9ucyhzdGFraW5nSW5zdHJ1Y3Rpb25zOiBTdGFraW5nSW5zdHJ1Y3Rpb25zKSB7XG4gIGlmIChzdGFraW5nSW5zdHJ1Y3Rpb25zLmRlbGVnYXRlID09PSB1bmRlZmluZWQgJiYgc3Rha2luZ0luc3RydWN0aW9ucy5kZXBvc2l0U29sICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXN0YWtpbmdJbnN0cnVjdGlvbnMuY3JlYXRlKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCBzdGFraW5nIGFjdGl2YXRlIHRyYW5zYWN0aW9uLCBtaXNzaW5nIGNyZWF0ZSBzdGFrZSBhY2NvdW50IGluc3RydWN0aW9uJyk7XG4gIH1cblxuICBpZiAoIXN0YWtpbmdJbnN0cnVjdGlvbnMuZGVsZWdhdGUgJiYgIXN0YWtpbmdJbnN0cnVjdGlvbnMuaW5pdGlhbGl6ZSkge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAnSW52YWxpZCBzdGFraW5nIGFjdGl2YXRlIHRyYW5zYWN0aW9uLCBtaXNzaW5nIGluaXRpYWxpemUgc3Rha2UgYWNjb3VudC9kZWxlZ2F0ZSBpbnN0cnVjdGlvbidcbiAgICApO1xuICB9XG59XG5cbnR5cGUgVW5zdGFraW5nSW5zdHJ1Y3Rpb25zID0ge1xuICBhbGxvY2F0ZT86IEFsbG9jYXRlUGFyYW1zO1xuICBhc3NpZ24/OiBBc3NpZ25QYXJhbXM7XG4gIHNwbGl0PzogU3BsaXRTdGFrZVBhcmFtcztcbiAgZGVhY3RpdmF0ZT86IERlYWN0aXZhdGVTdGFrZVBhcmFtcztcbiAgdHJhbnNmZXI/OiBEZWNvZGVkVHJhbnNmZXJJbnN0cnVjdGlvbjtcbiAgd2l0aGRyYXdTdGFrZT86IFdpdGhkcmF3U3Rha2VQYXJhbXM7XG59O1xuXG50eXBlIEppdG9VbnN0YWtpbmdJbnN0cnVjdGlvbnMgPSBVbnN0YWtpbmdJbnN0cnVjdGlvbnMgJiB7XG4gIHdpdGhkcmF3U3Rha2U6IE5vbk51bGxhYmxlPFVuc3Rha2luZ0luc3RydWN0aW9uc1snd2l0aGRyYXdTdGFrZSddPjtcbn07XG5cbmZ1bmN0aW9uIGlzSml0b1Vuc3Rha2luZ0luc3RydWN0aW9ucyh1aTogVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKTogdWkgaXMgSml0b1Vuc3Rha2luZ0luc3RydWN0aW9ucyB7XG4gIHJldHVybiB1aS53aXRoZHJhd1N0YWtlICE9PSB1bmRlZmluZWQgJiYgdWkuZGVhY3RpdmF0ZSAhPT0gdW5kZWZpbmVkO1xufVxuXG50eXBlIE1hcmluYWRlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zID0gVW5zdGFraW5nSW5zdHJ1Y3Rpb25zICYge1xuICB0cmFuc2ZlcjogTm9uTnVsbGFibGU8VW5zdGFraW5nSW5zdHJ1Y3Rpb25zWyd0cmFuc2ZlciddPjtcbn07XG5cbmZ1bmN0aW9uIGlzTWFyaW5hZGVVbnN0YWtpbmdJbnN0cnVjdGlvbnModWk6IFVuc3Rha2luZ0luc3RydWN0aW9ucyk6IHVpIGlzIE1hcmluYWRlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zIHtcbiAgcmV0dXJuIHVpLnRyYW5zZmVyICE9PSB1bmRlZmluZWQgJiYgdWkuZGVhY3RpdmF0ZSA9PT0gdW5kZWZpbmVkO1xufVxuXG50eXBlIE5hdGl2ZVVuc3Rha2luZ0luc3RydWN0aW9ucyA9IFVuc3Rha2luZ0luc3RydWN0aW9ucyAmIHtcbiAgZGVhY3RpdmF0ZTogTm9uTnVsbGFibGU8VW5zdGFraW5nSW5zdHJ1Y3Rpb25zWydkZWFjdGl2YXRlJ10+O1xuICBzcGxpdDogVW5zdGFraW5nSW5zdHJ1Y3Rpb25zWydzcGxpdCddO1xufTtcblxuZnVuY3Rpb24gaXNOYXRpdmVVbnN0YWtpbmdJbnN0cnVjdGlvbnModWk6IFVuc3Rha2luZ0luc3RydWN0aW9ucyk6IHVpIGlzIE5hdGl2ZVVuc3Rha2luZ0luc3RydWN0aW9ucyB7XG4gIHJldHVybiB1aS53aXRoZHJhd1N0YWtlID09PSB1bmRlZmluZWQgJiYgdWkuZGVhY3RpdmF0ZSAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRTdGFraW5nVHlwZUZyb21VbnN0YWtpbmdJbnN0cnVjdGlvbnModWk6IFVuc3Rha2luZ0luc3RydWN0aW9ucyk6IFNvbFN0YWtpbmdUeXBlRW51bSB7XG4gIGNvbnN0IGlzSml0byA9IGlzSml0b1Vuc3Rha2luZ0luc3RydWN0aW9ucyh1aSk7XG4gIGNvbnN0IGlzTWFyaW5hZGUgPSBpc01hcmluYWRlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVpKTtcbiAgY29uc3QgaXNOYXRpdmUgPSBpc05hdGl2ZVVuc3Rha2luZ0luc3RydWN0aW9ucyh1aSk7XG4gIGFzc2VydChbaXNKaXRvLCBpc01hcmluYWRlLCBpc05hdGl2ZV0uZmlsdGVyKCh4KSA9PiB4KS5sZW5ndGggPT09IDEsICdTdGFraW5nVHlwZSBpcyBhbWJpZ3VvdXMnKTtcbiAgaWYgKGlzSml0bykgcmV0dXJuIFNvbFN0YWtpbmdUeXBlRW51bS5KSVRPO1xuICBpZiAoaXNNYXJpbmFkZSkgcmV0dXJuIFNvbFN0YWtpbmdUeXBlRW51bS5NQVJJTkFERTtcbiAgaWYgKGlzTmF0aXZlKSByZXR1cm4gU29sU3Rha2luZ1R5cGVFbnVtLk5BVElWRTtcbiAgYXNzZXJ0KGZhbHNlLCAnTm8gU3Rha2luZ1R5cGUgZm91bmQnKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBjcmVhdGUgZGVhY3RpdmF0ZSBzdGFrZSB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zLiBTdXBwb3J0cyBmdWxsIHN0YWtlXG4gKiBhY2NvdW50IGRlYWN0aXZhdGlvbiBhbmQgcGFydGlhbCBzdGFrZSBhY2NvdW50IGRlYWN0aXZhdGlvbi5cbiAqXG4gKiBXaGVuIHBhcnRpYWxseSBkZWFjdGl2YXRpbmcgYSBzdGFrZSBhY2NvdW50IHRoaXMgbWV0aG9kIGV4cGVjdHMgdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnM6IEFsbG9jYXRlLFxuICogdG8gYWxsb2NhdGUgYSBuZXcgc3Rha2luZyBhY2NvdW50LCBBc3NpZ24sIHRvIGFzc2lnbiB0aGUgbmV3bHkgY3JlYXRlZCBzdGFraW5nIGFjY291bnQgdG8gdGhlXG4gKiBTdGFrZSBQcm9ncmFtLCBTcGxpdCwgdG8gc3BsaXQgdGhlIGN1cnJlbnQgc3Rha2UgYWNjb3VudCwgYW5kIFN0YWtpbmdEZWFjdGl2YXRlIHRvIGRlYWN0aXZhdGUgdGhlXG4gKiBuZXdseSBjcmVhdGVkIHN0YWtlIGFjY291bnQuXG4gKlxuICogU3VwcG9ydHMgTm9uY2UsIFN0YWtpbmdEZWFjdGl2YXRlLCBNZW1vLCBBbGxvY2F0ZSwgQXNzaWduLCBhbmQgU3BsaXQgU29sYW5hIGluc3RydWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3Igc3Rha2luZyBkZWFjdGl2YXRlIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLFxuICBjb2luTmFtZT86IHN0cmluZ1xuKTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nRGVhY3RpdmF0ZSB8IE1lbW8+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxOb25jZSB8IFN0YWtpbmdEZWFjdGl2YXRlIHwgTWVtbz4gPSBbXTtcbiAgY29uc3QgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zOiBVbnN0YWtpbmdJbnN0cnVjdGlvbnNbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLk1lbW86XG4gICAgICAgIGNvbnN0IG1lbW86IE1lbW8gPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWVtbyxcbiAgICAgICAgICBwYXJhbXM6IHsgbWVtbzogaW5zdHJ1Y3Rpb24uZGF0YS50b1N0cmluZygpIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG1lbW8pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFsbG9jYXRlOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmFsbG9jYXRlID09PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS5hbGxvY2F0ZSA9XG4gICAgICAgICAgICBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVBbGxvY2F0ZShpbnN0cnVjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgYWxsb2NhdGU6IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUFsbG9jYXRlKGluc3RydWN0aW9uKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFzc2lnbjpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS5hc3NpZ24gPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmFzc2lnbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUFzc2lnbihpbnN0cnVjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgYXNzaWduOiBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVBc3NpZ24oaW5zdHJ1Y3Rpb24pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU3BsaXQ6XG4gICAgICAgIGlmIChcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uc3BsaXQgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLnNwbGl0ID0gU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVTcGxpdChpbnN0cnVjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgc3BsaXQ6IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlU3BsaXQoaW5zdHJ1Y3Rpb24pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU3Rha2luZ0RlYWN0aXZhdGU6XG4gICAgICAgIGlmIChcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uZGVhY3RpdmF0ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uZGVhY3RpdmF0ZSA9XG4gICAgICAgICAgICBTdGFrZUluc3RydWN0aW9uLmRlY29kZURlYWN0aXZhdGUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIGRlYWN0aXZhdGU6IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlRGVhY3RpdmF0ZShpbnN0cnVjdGlvbiksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5UcmFuc2ZlcjpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS50cmFuc2ZlciA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0udHJhbnNmZXIgPVxuICAgICAgICAgICAgU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlVHJhbnNmZXIoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHRyYW5zZmVyOiBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVUcmFuc2ZlcihpbnN0cnVjdGlvbiksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5XaXRoZHJhd1N0YWtlOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLndpdGhkcmF3U3Rha2UgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLndpdGhkcmF3U3Rha2UgPSBkZWNvZGVXaXRoZHJhd1N0YWtlKGluc3RydWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICB3aXRoZHJhd1N0YWtlOiBkZWNvZGVXaXRoZHJhd1N0YWtlKGluc3RydWN0aW9uKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHVuc3Rha2luZ0luc3RydWN0aW9uIG9mIHVuc3Rha2luZ0luc3RydWN0aW9ucykge1xuICAgIHZhbGlkYXRlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVuc3Rha2luZ0luc3RydWN0aW9uKTtcbiAgICBjb25zdCBzdGFraW5nVHlwZSA9IGdldFN0YWtpbmdUeXBlRnJvbVVuc3Rha2luZ0luc3RydWN0aW9ucyh1bnN0YWtpbmdJbnN0cnVjdGlvbik7XG5cbiAgICBsZXQgc3Rha2luZ0RlYWN0aXZhdGU6IFN0YWtpbmdEZWFjdGl2YXRlIHwgdW5kZWZpbmVkO1xuXG4gICAgc3dpdGNoIChzdGFraW5nVHlwZSkge1xuICAgICAgY2FzZSBTb2xTdGFraW5nVHlwZUVudW0uSklUTzoge1xuICAgICAgICBhc3NlcnQoaXNKaXRvVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVuc3Rha2luZ0luc3RydWN0aW9uKSk7XG4gICAgICAgIGNvbnN0IHsgd2l0aGRyYXdTdGFrZSB9ID0gdW5zdGFraW5nSW5zdHJ1Y3Rpb247XG4gICAgICAgIHN0YWtpbmdEZWFjdGl2YXRlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdEZWFjdGl2YXRlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgc3Rha2luZ1R5cGUsXG4gICAgICAgICAgICBmcm9tQWRkcmVzczogd2l0aGRyYXdTdGFrZS5kZXN0aW5hdGlvblN0YWtlQXV0aG9yaXR5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBzdGFraW5nQWRkcmVzczogd2l0aGRyYXdTdGFrZS5zdGFrZVBvb2wudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogd2l0aGRyYXdTdGFrZS5wb29sVG9rZW5zLnRvU3RyaW5nKCksXG4gICAgICAgICAgICB1bnN0YWtpbmdBZGRyZXNzOiB3aXRoZHJhd1N0YWtlLmRlc3RpbmF0aW9uU3Rha2UudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGV4dHJhUGFyYW1zOiB7XG4gICAgICAgICAgICAgIHN0YWtlUG9vbERhdGE6IHtcbiAgICAgICAgICAgICAgICBtYW5hZ2VyRmVlQWNjb3VudDogd2l0aGRyYXdTdGFrZS5tYW5hZ2VyRmVlQWNjb3VudC50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIHBvb2xNaW50OiB3aXRoZHJhd1N0YWtlLnBvb2xNaW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgdmFsaWRhdG9yTGlzdEFjY291bnQ6IHdpdGhkcmF3U3Rha2UudmFsaWRhdG9yTGlzdC50b1N0cmluZygpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB2YWxpZGF0b3JBZGRyZXNzOiB3aXRoZHJhd1N0YWtlLnZhbGlkYXRvclN0YWtlLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgIHRyYW5zZmVyQXV0aG9yaXR5QWRkcmVzczogd2l0aGRyYXdTdGFrZS5zb3VyY2VUcmFuc2ZlckF1dGhvcml0eS50b1N0cmluZygpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBTb2xTdGFraW5nVHlwZUVudW0uTUFSSU5BREU6IHtcbiAgICAgICAgYXNzZXJ0KGlzTWFyaW5hZGVVbnN0YWtpbmdJbnN0cnVjdGlvbnModW5zdGFraW5nSW5zdHJ1Y3Rpb24pKTtcbiAgICAgICAgY29uc3QgeyB0cmFuc2ZlciB9ID0gdW5zdGFraW5nSW5zdHJ1Y3Rpb247XG5cbiAgICAgICAgc3Rha2luZ0RlYWN0aXZhdGUgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0RlYWN0aXZhdGUsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBzdGFraW5nVHlwZSxcbiAgICAgICAgICAgIGZyb21BZGRyZXNzOiAnJyxcbiAgICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiAnJyxcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFkZHJlc3M6IHRyYW5zZmVyLnRvUHVia2V5LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgICAgICAgICAgYW1vdW50OiB0cmFuc2Zlci5sYW1wb3J0cy50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBTb2xTdGFraW5nVHlwZUVudW0uTkFUSVZFOiB7XG4gICAgICAgIGFzc2VydChpc05hdGl2ZVVuc3Rha2luZ0luc3RydWN0aW9ucyh1bnN0YWtpbmdJbnN0cnVjdGlvbikpO1xuICAgICAgICBjb25zdCB7IGRlYWN0aXZhdGUsIHNwbGl0IH0gPSB1bnN0YWtpbmdJbnN0cnVjdGlvbjtcbiAgICAgICAgc3Rha2luZ0RlYWN0aXZhdGUgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0RlYWN0aXZhdGUsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBzdGFraW5nVHlwZSxcbiAgICAgICAgICAgIGZyb21BZGRyZXNzOiBkZWFjdGl2YXRlLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiBzcGxpdD8uc3Rha2VQdWJrZXkudG9TdHJpbmcoKSB8fCBkZWFjdGl2YXRlLnN0YWtlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhbW91bnQ6IHNwbGl0Py5sYW1wb3J0cy50b1N0cmluZygpLFxuICAgICAgICAgICAgdW5zdGFraW5nQWRkcmVzczogc3BsaXQ/LnNwbGl0U3Rha2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCB1bnJlYWNoYWJsZTogbmV2ZXIgPSBzdGFraW5nVHlwZTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YWtpbmcgdHlwZSAke3VucmVhY2hhYmxlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHN0YWtpbmdEZWFjdGl2YXRlKTtcbiAgfVxuXG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVuc3Rha2luZ0luc3RydWN0aW9uczogVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKSB7XG4gIC8vIENhc2VzIHdoZXJlIGV4YWN0bHkgb25lIGZpZWxkIHNob3VsZCBiZSBwcmVzZW50XG4gIGNvbnN0IHVuc3Rha2luZ0luc3RydWN0aW9uc0tleXM6IChrZXlvZiBVbnN0YWtpbmdJbnN0cnVjdGlvbnMpW10gPSBbXG4gICAgJ2FsbG9jYXRlJyxcbiAgICAnYXNzaWduJyxcbiAgICAnc3BsaXQnLFxuICAgICdkZWFjdGl2YXRlJyxcbiAgICAndHJhbnNmZXInLFxuICBdIGFzIGNvbnN0O1xuICBpZiAodW5zdGFraW5nSW5zdHJ1Y3Rpb25zS2V5cy5ldmVyeSgoaykgPT4gISF1bnN0YWtpbmdJbnN0cnVjdGlvbnNba10gPT09IChrID09PSAndHJhbnNmZXInKSkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHVuc3Rha2luZ0luc3RydWN0aW9uc0tleXMuZXZlcnkoKGspID0+ICEhdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW2tdID09PSAoayA9PT0gJ3dpdGhkcmF3U3Rha2UnKSkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHVuc3Rha2luZ0luc3RydWN0aW9uc0tleXMuZXZlcnkoKGspID0+ICEhdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW2tdID09PSAoayA9PT0gJ2RlYWN0aXZhdGUnKSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBDYXNlcyB3aGVyZSBkZWFjdGl2YXRlIGZpZWxkIG11c3QgYmUgcHJlc2VudCB3aXRoIGFub3RoZXIgZmllbGRcbiAgaWYgKCF1bnN0YWtpbmdJbnN0cnVjdGlvbnMuZGVhY3RpdmF0ZSkge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgbWlzc2luZyBkZWFjdGl2YXRlIHN0YWtlIGFjY291bnQgaW5zdHJ1Y3Rpb24nKTtcbiAgfVxuXG4gIC8vIFRoaXMgaXMgYSBzdGFrZSBwb29sIGluc3RydWN0aW9uLCBub3QgYSBwYXJ0aWFsIHVuc3Rha2VcbiAgaWYgKHVuc3Rha2luZ0luc3RydWN0aW9ucy53aXRoZHJhd1N0YWtlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCF1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYWxsb2NhdGUpIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCBtaXNzaW5nIGFsbG9jYXRlIHVuc3Rha2UgYWNjb3VudCBpbnN0cnVjdGlvbidcbiAgICApO1xuICB9IGVsc2UgaWYgKCF1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYXNzaWduKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG1pc3NpbmcgYXNzaWduIHVuc3Rha2UgYWNjb3VudCBpbnN0cnVjdGlvbicpO1xuICB9IGVsc2UgaWYgKCF1bnN0YWtpbmdJbnN0cnVjdGlvbnMuc3BsaXQpIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgbWlzc2luZyBzcGxpdCBzdGFrZSBhY2NvdW50IGluc3RydWN0aW9uJyk7XG4gIH0gZWxzZSBpZiAoXG4gICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFsbG9jYXRlLmFjY291bnRQdWJrZXkudG9TdHJpbmcoKSAhPT0gdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFzc2lnbi5hY2NvdW50UHVia2V5LnRvU3RyaW5nKClcbiAgKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgbXVzdCBhbGxvY2F0ZSBhbmQgYXNzaWduIHRoZSBzYW1lIHB1YmxpYyBrZXknXG4gICAgKTtcbiAgfSBlbHNlIGlmICh1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYWxsb2NhdGUuc3BhY2UgIT09IFN0YWtlUHJvZ3JhbS5zcGFjZSkge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICBgSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIHVuc3Rha2luZyBhY2NvdW50IG11c3QgYWxsb2NhdGUgJHtTdGFrZVByb2dyYW0uc3BhY2V9IGJ5dGVzYFxuICAgICk7XG4gIH0gZWxzZSBpZiAodW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFzc2lnbi5wcm9ncmFtSWQudG9TdHJpbmcoKSAhPT0gU3Rha2VQcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgdGhlIHVuc3Rha2UgYWNjb3VudCBtdXN0IGJlIGFzc2lnbmVkIHRvIHRoZSBTdGFrZSBQcm9ncmFtJ1xuICAgICk7XG4gIH0gZWxzZSBpZiAoXG4gICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFsbG9jYXRlLmFjY291bnRQdWJrZXkudG9TdHJpbmcoKSAhPT0gdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnNwbGl0LnNwbGl0U3Rha2VQdWJrZXkudG9TdHJpbmcoKVxuICApIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgbXVzdCBhbGxvY2F0ZSB0aGUgdW5zdGFraW5nIGFjY291bnQnKTtcbiAgfSBlbHNlIGlmIChcbiAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuc3BsaXQuc3Rha2VQdWJrZXkudG9TdHJpbmcoKSA9PT0gdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnNwbGl0LnNwbGl0U3Rha2VQdWJrZXkudG9TdHJpbmcoKVxuICApIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCB0aGUgdW5zdGFraW5nIGFjY291bnQgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgU3Rha2UgQWNjb3VudCdcbiAgICApO1xuICB9IGVsc2UgaWYgKCF1bnN0YWtpbmdJbnN0cnVjdGlvbnMudHJhbnNmZXIpIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCBtaXNzaW5nIGZ1bmRpbmcgb2YgdW5zdGFrZSBhZGRyZXNzIGluc3RydWN0aW9uJ1xuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBjcmVhdGUgc3Rha2luZyAgd2l0aGRyYXcgdHggaW5zdHJ1Y3Rpb25zIHBhcmFtc1xuICogT25seSBzdXBwb3J0cyBOb25jZSwgU3Rha2luZ1dpdGhkcmF3LCBhbmQgTWVtbyBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIHN0YWtpbmcgd2l0aGRyYXcgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGFraW5nV2l0aGRyYXdJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdXG4pOiBBcnJheTxOb25jZSB8IFN0YWtpbmdXaXRoZHJhdyB8IE1lbW8+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxOb25jZSB8IFN0YWtpbmdXaXRoZHJhdyB8IE1lbW8+ID0gW107XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uTWVtbzpcbiAgICAgICAgY29uc3QgbWVtbzogTWVtbyA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLFxuICAgICAgICAgIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobWVtbyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU3Rha2luZ1dpdGhkcmF3OlxuICAgICAgICBjb25zdCB3aXRoZHJhd0luc3RydWN0aW9uID0gU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVXaXRoZHJhdyhpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IHN0YWtpbmdXaXRoZHJhdzogU3Rha2luZ1dpdGhkcmF3ID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdXaXRoZHJhdyxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGZyb21BZGRyZXNzOiB3aXRoZHJhd0luc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiB3aXRoZHJhd0luc3RydWN0aW9uLnN0YWtlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhbW91bnQ6IHdpdGhkcmF3SW5zdHJ1Y3Rpb24ubGFtcG9ydHMudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChzdGFraW5nV2l0aGRyYXcpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG4vKipcbiAqIEdldCB0aGUgbWVtbyBvYmplY3QgZnJvbSBpbnN0cnVjdGlvbnMgaWYgaXQgZXhpc3RzXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIHRoZSBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9ucyB0byBiZSBwYXJzZWRcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgbnVtYmVyPn0gaW5zdHJ1Y3Rpb25JbmRleGVzIC0gdGhlIGluc3RydWN0aW9ucyBpbmRleGVzIG9mIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uXG4gKiBAcmV0dXJucyB7TWVtbyB8IHVuZGVmaW5lZH0gLSBtZW1vIG9iamVjdCBvciB1bmRlZmluZWRcbiAqL1xuZnVuY3Rpb24gZ2V0TWVtbyhpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSwgaW5zdHJ1Y3Rpb25JbmRleGVzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+KTogTWVtbyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGluc3RydWN0aW9uc0xlbmd0aCA9IE9iamVjdC5rZXlzKGluc3RydWN0aW9uSW5kZXhlcykubGVuZ3RoO1xuICBpZiAoaW5zdHJ1Y3Rpb25zLmxlbmd0aCA9PT0gaW5zdHJ1Y3Rpb25zTGVuZ3RoICYmIGluc3RydWN0aW9uc1tpbnN0cnVjdGlvbkluZGV4ZXMuTWVtb10pIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWVtbyxcbiAgICAgIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbnNbaW5zdHJ1Y3Rpb25JbmRleGVzLk1lbW9dLmRhdGEudG9TdHJpbmcoKSB9LFxuICAgIH07XG4gIH1cbn1cblxuY29uc3QgYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMgPSB7XG4gIFBheWVyQWRkcmVzczogMCxcbiAgQVRBQWRkcmVzczogMSxcbiAgT3duZXJBZGRyZXNzOiAyLFxuICBNaW50QWRkcmVzczogMyxcbn07XG5cbmNvbnN0IGNsb3NlQXRhSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcyA9IHtcbiAgQWNjb3VudEFkZHJlc3M6IDAsXG4gIERlc3RpbmF0aW9uQWRkcmVzczogMSxcbiAgQXV0aG9yaXR5QWRkcmVzczogMixcbn07XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gaW5pdGlhbGl6ZSBhc3NvY2lhdGVkIHRva2VuIGFjY291bnQgdHggaW5zdHJ1Y3Rpb25zIHBhcmFtc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBTZW5kIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlQXRhSW5pdEluc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10sXG4gIGluc3RydWN0aW9uTWV0YWRhdGE/OiBJbnN0cnVjdGlvblBhcmFtc1tdLFxuICBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lPzogYm9vbGVhblxuKTogQXJyYXk8QXRhSW5pdCB8IFBlcm1pc3Npb25sZXNzVGhhd0lkZW1wb3RlbnQgfCBNZW1vIHwgTm9uY2U+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxBdGFJbml0IHwgUGVybWlzc2lvbmxlc3NUaGF3SWRlbXBvdGVudCB8IE1lbW8gfCBOb25jZT4gPSBbXTtcbiAgbGV0IG1lbW86IE1lbW8gfCB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NZW1vOlxuICAgICAgICBtZW1vID0geyB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLCBwYXJhbXM6IHsgbWVtbzogaW5zdHJ1Y3Rpb24uZGF0YS50b1N0cmluZygpIH0gfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkluaXRpYWxpemVBc3NvY2lhdGVkVG9rZW5BY2NvdW50OlxuICAgICAgICBjb25zdCBtaW50QWRkcmVzcyA9IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuTWludEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpO1xuICAgICAgICBjb25zdCB0b2tlbk5hbWUgPSBmaW5kVG9rZW5OYW1lKG1pbnRBZGRyZXNzLCBpbnN0cnVjdGlvbk1ldGFkYXRhLCBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKTtcbiAgICAgICAgbGV0IHByb2dyYW1JRDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKSB7XG4gICAgICAgICAgcHJvZ3JhbUlEID0gaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXRhSW5pdDogQXRhSW5pdCA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgICAgICBhdGFBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLkFUQUFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgb3duZXJBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLk93bmVyQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBwYXllckFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuUGF5ZXJBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuTmFtZSxcbiAgICAgICAgICAgIHByb2dyYW1JZDogcHJvZ3JhbUlELFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKGF0YUluaXQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5QZXJtaXNzaW9ubGVzc1RoYXdJZGVtcG90ZW50OlxuICAgICAgICBjb25zdCB0aGF3RXh0cmFBY2NvdW50czogRXh0cmFBY2NvdW50TWV0YVtdID0gaW5zdHJ1Y3Rpb24ua2V5cy5zbGljZSg5KS5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAgICBwdWJrZXk6IGtleS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICBpc1NpZ25lcjoga2V5LmlzU2lnbmVyLFxuICAgICAgICAgIGlzV3JpdGFibGU6IGtleS5pc1dyaXRhYmxlLFxuICAgICAgICB9KSk7XG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb25sZXNzVGhhdzogUGVybWlzc2lvbmxlc3NUaGF3SWRlbXBvdGVudCA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5QZXJtaXNzaW9ubGVzc1RoYXdJZGVtcG90ZW50LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgYXV0aG9yaXR5OiBpbnN0cnVjdGlvbi5rZXlzWzBdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgbWludDogaW5zdHJ1Y3Rpb24ua2V5c1sxXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuQWNjb3VudDogaW5zdHJ1Y3Rpb24ua2V5c1syXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGZsYWdBY2NvdW50OiBpbnN0cnVjdGlvbi5rZXlzWzNdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5BY2NvdW50T3duZXI6IGluc3RydWN0aW9uLmtleXNbNF0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBtaW50Q29uZmlnOiBpbnN0cnVjdGlvbi5rZXlzWzVdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5Qcm9ncmFtOiBpbnN0cnVjdGlvbi5rZXlzWzZdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgc3lzdGVtUHJvZ3JhbTogaW5zdHJ1Y3Rpb24ua2V5c1s3XS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGdhdGluZ1Byb2dyYW06IGluc3RydWN0aW9uLmtleXNbOF0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBleHRyYUFjY291bnRzOiB0aGF3RXh0cmFBY2NvdW50cyxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChwZXJtaXNzaW9ubGVzc1RoYXcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5EZXBvc2l0U29sOlxuICAgICAgICAvLyBBdGFJbml0IGlzIGEgcGFydCBvZiBzcGwtc3Rha2UtcG9vbCdzIGRlcG9zaXRTb2wgcHJvY2Vzc1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAgICAgJ0ludmFsaWQgdHJhbnNhY3Rpb24sIGluc3RydWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJyArIGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbilcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cbiAgaWYgKG1lbW8pIHtcbiAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgfVxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG5jb25zdCBhdGFDbG9zZUluc3RydWN0aW9uS2V5c0luZGV4ZXMgPSB7XG4gIEFjY291bnRBZGRyZXNzOiAwLFxuICBEZXN0aW5hdGlvbkFkZHJlc3M6IDEsXG4gIEF1dGhvcml0eUFkZHJlc3M6IDIsXG59O1xuXG5jb25zdCBhdGFSZWNvdmVyTmVzdGVkSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcyA9IHtcbiAgTmVzdGVkQWNjb3VudEFkZHJlc3M6IDAsXG4gIE5lc3RlZE1pbnRBZGRyZXNzOiAxLFxuICBEZXN0aW5hdGlvbkFjY291bnRBZGRyZXNzOiAyLFxuICBPd25lckFjY291bnRBZGRyZXNzOiAzLFxuICBPd25lck1pbnRBZGRyZXNzOiA0LFxuICBXYWxsZXRBZGRyZXNzOiA1LFxufTtcblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBjbG9zZSBhc3NvY2lhdGVkIHRva2VuIGFjY291bnQgdHggaW5zdHJ1Y3Rpb25zIHBhcmFtc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBTZW5kIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlQXRhQ2xvc2VJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10pOiBBcnJheTxBdGFDbG9zZSB8IEF0YVJlY292ZXJOZXN0ZWQgfCBOb25jZT4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PEF0YUNsb3NlIHwgQXRhUmVjb3Zlck5lc3RlZCB8IE5vbmNlPiA9IFtdO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5DbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICAgIGNvbnN0IGF0YUNsb3NlOiBBdGFDbG9zZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBhY2NvdW50QWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFDbG9zZUluc3RydWN0aW9uS2V5c0luZGV4ZXMuQWNjb3VudEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgZGVzdGluYXRpb25BZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUNsb3NlSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5EZXN0aW5hdGlvbkFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aG9yaXR5QWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFDbG9zZUluc3RydWN0aW9uS2V5c0luZGV4ZXMuQXV0aG9yaXR5QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goYXRhQ2xvc2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5SZWNvdmVyTmVzdGVkQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgY29uc3QgYXRhUmVjb3Zlck5lc3RlZDogQXRhUmVjb3Zlck5lc3RlZCA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5SZWNvdmVyTmVzdGVkQXNzb2NpYXRlZFRva2VuQWNjb3VudCxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIG5lc3RlZEFjY291bnRBZGRyZXNzOlxuICAgICAgICAgICAgICBpbnN0cnVjdGlvbi5rZXlzW2F0YVJlY292ZXJOZXN0ZWRJbnN0cnVjdGlvbktleXNJbmRleGVzLk5lc3RlZEFjY291bnRBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG5lc3RlZE1pbnRBZGRyZXNzOlxuICAgICAgICAgICAgICBpbnN0cnVjdGlvbi5rZXlzW2F0YVJlY292ZXJOZXN0ZWRJbnN0cnVjdGlvbktleXNJbmRleGVzLk5lc3RlZE1pbnRBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uQWNjb3VudEFkZHJlc3M6XG4gICAgICAgICAgICAgIGluc3RydWN0aW9uLmtleXNbYXRhUmVjb3Zlck5lc3RlZEluc3RydWN0aW9uS2V5c0luZGV4ZXMuRGVzdGluYXRpb25BY2NvdW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBvd25lckFjY291bnRBZGRyZXNzOlxuICAgICAgICAgICAgICBpbnN0cnVjdGlvbi5rZXlzW2F0YVJlY292ZXJOZXN0ZWRJbnN0cnVjdGlvbktleXNJbmRleGVzLk93bmVyQWNjb3VudEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgb3duZXJNaW50QWRkcmVzczpcbiAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24ua2V5c1thdGFSZWNvdmVyTmVzdGVkSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5Pd25lck1pbnRBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHdhbGxldEFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhUmVjb3Zlck5lc3RlZEluc3RydWN0aW9uS2V5c0luZGV4ZXMuV2FsbGV0QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goYXRhUmVjb3Zlck5lc3RlZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgICAnSW52YWxpZCB0cmFuc2FjdGlvbiwgaW5zdHJ1Y3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkOiAnICsgZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGF1dGhvcml6ZWQgc3Rha2luZyBhY2NvdW50IHBhcmFtc1xuICogT25seSBzdXBwb3J0cyBOb25jZSwgQXV0aG9yaXplIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBzdGFraW5nIGF1dGhvcml6ZSB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVN0YWtpbmdBdXRob3JpemVJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdXG4pOiBBcnJheTxOb25jZSB8IFN0YWtpbmdBdXRob3JpemUgfCBNZW1vPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nQXV0aG9yaXplIHwgTWVtbz4gPSBbXTtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BZHZhbmNlTm9uY2VBY2NvdW50OlxuICAgICAgICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NZW1vOlxuICAgICAgICBjb25zdCBtZW1vOiBNZW1vID0geyB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLCBwYXJhbXM6IHsgbWVtbzogaW5zdHJ1Y3Rpb24uZGF0YS50b1N0cmluZygpIH0gfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobWVtbyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQXV0aG9yaXplOlxuICAgICAgICBjb25zdCBhdXRob3JpemUgPSBTdGFrZUluc3RydWN0aW9uLmRlY29kZUF1dGhvcml6ZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nQXV0aG9yaXplLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgc3Rha2luZ0FkZHJlc3M6IGF1dGhvcml6ZS5zdGFrZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgb2xkQXV0aG9yaXplQWRkcmVzczogYXV0aG9yaXplLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG5ld0F1dGhvcml6ZUFkZHJlc3M6IGF1dGhvcml6ZS5uZXdBdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBuZXdXaXRoZHJhd0FkZHJlc3M6IGF1dGhvcml6ZS5jdXN0b2RpYW5QdWJrZXk/LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gYXV0aG9yaXplZCBzdGFraW5nIGFjY291bnQgcGFyYW1zXG4gKiBPbmx5IHN1cHBvcnRzIE5vbmNlLCBBdXRob3JpemUgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIHN0YWtpbmcgYXV0aG9yaXplIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3Rha2luZ0F1dGhvcml6ZVJhd0luc3RydWN0aW9ucyhpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSk6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0F1dGhvcml6ZT4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0F1dGhvcml6ZT4gPSBbXTtcbiAgYXNzZXJ0KGluc3RydWN0aW9ucy5sZW5ndGggPT09IDIsICdJbnZhbGlkIG51bWJlciBvZiBpbnN0cnVjdGlvbnMnKTtcbiAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb25zWzBdKTtcbiAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICBwYXJhbXM6IHtcbiAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgfSxcbiAgfTtcbiAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICBjb25zdCBhdXRob3JpemUgPSBpbnN0cnVjdGlvbnNbMV07XG4gIGFzc2VydChhdXRob3JpemUua2V5cy5sZW5ndGggPT09IDUsICdJbnZhbGlkIG51bWJlciBvZiBrZXlzIGluIGF1dGhvcml6ZSBpbnN0cnVjdGlvbicpO1xuICBpbnN0cnVjdGlvbkRhdGEucHVzaCh7XG4gICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0F1dGhvcml6ZSxcbiAgICBwYXJhbXM6IHtcbiAgICAgIHN0YWtpbmdBZGRyZXNzOiBhdXRob3JpemUua2V5c1swXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIG9sZEF1dGhvcml6ZUFkZHJlc3M6IGF1dGhvcml6ZS5rZXlzWzJdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgbmV3QXV0aG9yaXplQWRkcmVzczogYXV0aG9yaXplLmtleXNbM10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBjdXN0b2RpYW5BZGRyZXNzOiBhdXRob3JpemUua2V5c1s0XS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIHR5cGUgaXMgYSBjb25maWRlbnRpYWwgdHJhbnNmZXIgaW5zdHJ1Y3Rpb25cbiAqIChUb2tlbi0yMDIyIENUIGV4dGVuc2lvbiBvciB6ay1lbGdhbWFsLXByb29mIHByb2dyYW0pLlxuICovXG5mdW5jdGlvbiBpc0NvbmZpZGVudGlhbFRyYW5zZmVySW5zdHJ1Y3Rpb24odHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMpOiBib29sZWFuIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Db25maWd1cmVDb25maWRlbnRpYWxUcmFuc2ZlckFjY291bnQ6XG4gICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5BcHBseVBlbmRpbmdCYWxhbmNlOlxuICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ29uZmlkZW50aWFsRGVwb3NpdDpcbiAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNvbmZpZGVudGlhbFdpdGhkcmF3OlxuICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ29uZmlkZW50aWFsVHJhbnNmZXI6XG4gICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5WZXJpZnlQdWJrZXlWYWxpZGl0eTpcbiAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlZlcmlmeUVxdWFsaXR5UHJvb2Y6XG4gICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5WZXJpZnlWYWxpZGl0eVByb29mOlxuICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVmVyaWZ5UmFuZ2VQcm9vZjpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBjdXN0b20gaW5zdHJ1Y3Rpb24gcGFyYW1zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGNvbnRhaW5pbmcgY3VzdG9tIHNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEBwYXJhbSB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gaW5zdHJ1Y3Rpb25NZXRhZGF0YSAtIHRoZSBpbnN0cnVjdGlvbiBtZXRhZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIGN1c3RvbSBpbnN0cnVjdGlvbnNcbiAqL1xuZnVuY3Rpb24gcGFyc2VDdXN0b21JbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLFxuICBpbnN0cnVjdGlvbk1ldGFkYXRhPzogSW5zdHJ1Y3Rpb25QYXJhbXNbXVxuKTogQ3VzdG9tSW5zdHJ1Y3Rpb25bXSB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQ3VzdG9tSW5zdHJ1Y3Rpb25bXSA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5zdHJ1Y3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbnNbaV07XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIG1ldGFkYXRhIGZvciB0aGlzIGluc3RydWN0aW9uIHBvc2l0aW9uXG4gICAgaWYgKFxuICAgICAgaW5zdHJ1Y3Rpb25NZXRhZGF0YSAmJlxuICAgICAgaW5zdHJ1Y3Rpb25NZXRhZGF0YVtpXSAmJlxuICAgICAgaW5zdHJ1Y3Rpb25NZXRhZGF0YVtpXS50eXBlID09PSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DdXN0b21JbnN0cnVjdGlvblxuICAgICkge1xuICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goaW5zdHJ1Y3Rpb25NZXRhZGF0YVtpXSBhcyBDdXN0b21JbnN0cnVjdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENvbnZlcnQgdGhlIHJhdyBpbnN0cnVjdGlvbiB0byBDdXN0b21JbnN0cnVjdGlvbiBmb3JtYXRcbiAgICAgIGNvbnN0IGN1c3RvbUluc3RydWN0aW9uOiBDdXN0b21JbnN0cnVjdGlvbiA9IHtcbiAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3VzdG9tSW5zdHJ1Y3Rpb24sXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHByb2dyYW1JZDogaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCksXG4gICAgICAgICAga2V5czogaW5zdHJ1Y3Rpb24ua2V5cy5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAgICAgIHB1YmtleToga2V5LnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgaXNTaWduZXI6IGtleS5pc1NpZ25lcixcbiAgICAgICAgICAgIGlzV3JpdGFibGU6IGtleS5pc1dyaXRhYmxlLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBkYXRhOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChjdXN0b21JbnN0cnVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBjb25maWRlbnRpYWwgdHJhbnNmZXIgaW5zdHJ1Y3Rpb24gcGFyYW1zLlxuICpcbiAqIEl0ZXJhdGVzIHJhdyBpbnN0cnVjdGlvbnMgaW4gb3JkZXIsIGNoZWNraW5nIG1ldGFkYXRhIGF0IGVhY2ggcG9zaXRpb246XG4gKiAtIENUIGluc3RydWN0aW9uIG1ldGFkYXRhIGlzIHByZXNlcnZlZCBhcy1pcyAoQ1QgaW5zdHJ1Y3Rpb25zIGNhbm5vdCBiZVxuICogICBkZWNvZGVkIGJ5IEBzb2xhbmEvc3BsLXRva2VuIG9yIEBzb2xhbmEvd2ViMy5qcykuXG4gKiAtIEN1c3RvbUluc3RydWN0aW9uIG1ldGFkYXRhIGlzIHByZXNlcnZlZCBhcy1pcy5cbiAqIC0gQWxsIG90aGVyIGluc3RydWN0aW9ucyBmYWxsIGJhY2sgdG8gQ3VzdG9tSW5zdHJ1Y3Rpb24gZm9ybWF0IHdpdGggcmF3XG4gKiAgIHByb2dyYW1JZC9rZXlzL2RhdGEuXG4gKlxuICogVGhpcyBzaW5nbGUtcGFzcyBhcHByb2FjaCBwcmVzZXJ2ZXMgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gb3JkZXIgc28gdGhhdFxuICogcm91bmQtdHJpcCByZWNvbnN0cnVjdGlvbiBpcyBmYWl0aGZ1bC5cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gY29udGFpbmluZyBDVCBzb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcGFyYW0ge0luc3RydWN0aW9uUGFyYW1zW119IGluc3RydWN0aW9uTWV0YWRhdGEgLSB0aGUgaW5zdHJ1Y3Rpb24gbWV0YWRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGluIG9yaWdpbmFsIG9yZGVyXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ29uZmlkZW50aWFsVHJhbnNmZXJJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLFxuICBpbnN0cnVjdGlvbk1ldGFkYXRhPzogSW5zdHJ1Y3Rpb25QYXJhbXNbXVxuKTogSW5zdHJ1Y3Rpb25QYXJhbXNbXSB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogSW5zdHJ1Y3Rpb25QYXJhbXNbXSA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5zdHJ1Y3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbnNbaV07XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIG1ldGFkYXRhIGZvciB0aGlzIGluc3RydWN0aW9uIHBvc2l0aW9uXG4gICAgaWYgKGluc3RydWN0aW9uTWV0YWRhdGEgJiYgaW5zdHJ1Y3Rpb25NZXRhZGF0YVtpXSkge1xuICAgICAgY29uc3QgbWV0YVR5cGUgPSBpbnN0cnVjdGlvbk1ldGFkYXRhW2ldLnR5cGU7XG4gICAgICAvLyBQcmVzZXJ2ZSBjb25maWRlbnRpYWwgdHJhbnNmZXIgYW5kIGN1c3RvbSBpbnN0cnVjdGlvbiBtZXRhZGF0YSBhcy1pc1xuICAgICAgaWYgKGlzQ29uZmlkZW50aWFsVHJhbnNmZXJJbnN0cnVjdGlvbihtZXRhVHlwZSkgfHwgbWV0YVR5cGUgPT09IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkN1c3RvbUluc3RydWN0aW9uKSB7XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKGluc3RydWN0aW9uTWV0YWRhdGFbaV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IHRoZSByYXcgaW5zdHJ1Y3Rpb24gdG8gQ3VzdG9tSW5zdHJ1Y3Rpb24gZm9ybWF0XG4gICAgY29uc3QgY3VzdG9tSW5zdHJ1Y3Rpb246IEN1c3RvbUluc3RydWN0aW9uID0ge1xuICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3VzdG9tSW5zdHJ1Y3Rpb24sXG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgcHJvZ3JhbUlkOiBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKSxcbiAgICAgICAga2V5czogaW5zdHJ1Y3Rpb24ua2V5cy5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAgICBwdWJrZXk6IGtleS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICBpc1NpZ25lcjoga2V5LmlzU2lnbmVyLFxuICAgICAgICAgIGlzV3JpdGFibGU6IGtleS5pc1dyaXRhYmxlLFxuICAgICAgICB9KSksXG4gICAgICAgIGRhdGE6IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKGN1c3RvbUluc3RydWN0aW9uKTtcbiAgfVxuXG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kVG9rZW5OYW1lKFxuICBtaW50QWRkcmVzczogc3RyaW5nLFxuICBpbnN0cnVjdGlvbk1ldGFkYXRhPzogSW5zdHJ1Y3Rpb25QYXJhbXNbXSxcbiAgX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZT86IGJvb2xlYW5cbik6IHN0cmluZyB7XG4gIGxldCB0b2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvaW5zLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTb2xDb2luICYmIHZhbHVlLnRva2VuQWRkcmVzcyA9PT0gbWludEFkZHJlc3MpIHtcbiAgICAgIHRva2VuID0gdmFsdWUubmFtZTtcbiAgICB9XG4gIH0pO1xuXG4gIGlmICghdG9rZW4gJiYgaW5zdHJ1Y3Rpb25NZXRhZGF0YSkge1xuICAgIGluc3RydWN0aW9uTWV0YWRhdGEuZm9yRWFjaCgoaW5zdHJ1Y3Rpb24pID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaW5zdHJ1Y3Rpb24udHlwZSA9PT0gSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudCAmJlxuICAgICAgICBpbnN0cnVjdGlvbi5wYXJhbXMubWludEFkZHJlc3MgPT09IG1pbnRBZGRyZXNzXG4gICAgICApIHtcbiAgICAgICAgdG9rZW4gPSBpbnN0cnVjdGlvbi5wYXJhbXMudG9rZW5OYW1lO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgaW5zdHJ1Y3Rpb24udHlwZSA9PT0gSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVG9rZW5UcmFuc2ZlciAmJlxuICAgICAgICBpbnN0cnVjdGlvbi5wYXJhbXMudG9rZW5BZGRyZXNzID09PSBtaW50QWRkcmVzc1xuICAgICAgKSB7XG4gICAgICAgIHRva2VuID0gaW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuTmFtZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGlmICghdG9rZW4gJiYgX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZSkge1xuICAgIHRva2VuID0gbWludEFkZHJlc3M7XG4gIH1cblxuICBhc3NlcnQodG9rZW4pO1xuXG4gIHJldHVybiB0b2tlbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRUcmFuc2Zlckhvb2tBY2NvdW50cyhcbiAgZnJvbUFkZHJlc3M6IHN0cmluZyxcbiAgdG9BZGRyZXNzOiBzdHJpbmcsXG4gIHRva2VuQWRkcmVzczogc3RyaW5nLFxuICBpbnN0cnVjdGlvbk1ldGFkYXRhPzogSW5zdHJ1Y3Rpb25QYXJhbXNbXVxuKTogRXh0cmFBY2NvdW50TWV0YVtdIHwgdW5kZWZpbmVkIHtcbiAgbGV0IHRyYW5zZmVySG9va0FjY291bnRzOiBFeHRyYUFjY291bnRNZXRhW10gfCB1bmRlZmluZWQ7XG5cbiAgaW5zdHJ1Y3Rpb25NZXRhZGF0YT8uZm9yRWFjaCgoaW5zdHJ1Y3Rpb24pID0+IHtcbiAgICBpZiAoXG4gICAgICBpbnN0cnVjdGlvbi50eXBlID09PSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ub2tlblRyYW5zZmVyICYmXG4gICAgICBpbnN0cnVjdGlvbi5wYXJhbXMudG9rZW5BZGRyZXNzID09PSB0b2tlbkFkZHJlc3MgJiZcbiAgICAgIGluc3RydWN0aW9uLnBhcmFtcy5mcm9tQWRkcmVzcyA9PT0gZnJvbUFkZHJlc3MgJiZcbiAgICAgIGluc3RydWN0aW9uLnBhcmFtcy50b0FkZHJlc3MgPT09IHRvQWRkcmVzc1xuICAgICkge1xuICAgICAgdHJhbnNmZXJIb29rQWNjb3VudHMgPSBpbnN0cnVjdGlvbi5wYXJhbXMudHJhbnNmZXJIb29rQWNjb3VudHM7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gdHJhbnNmZXJIb29rQWNjb3VudHM7XG59XG4iXX0=
|