@pipeline-builder/api-core 5.0.2 → 5.0.4

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.
@@ -14,7 +14,7 @@ export * from './date.js';
14
14
  export { resetSupportAliasesCache, getPrimarySupportAlias, getAllSupportAliases, resolveRecipientAlias, DEFAULT_SUPPORT_ALIAS, } from './alias-resolver.js';
15
15
  export * from './concurrency.js';
16
16
  export * from './audit.js';
17
- export { getDefaultKeyProvider, resetDefaultKeyProvider, setKeyProvider, encryptSecret, decryptSecret, isEncryptedBlob, type EncryptedBlob, type KeyProvider, EnvKeyProvider, KmsKeyProvider, type PerOrgKmsConfig, type PerOrgKmsResolver, PerOrgKmsKeyProvider, } from './secret-encryption.js';
17
+ export { getDefaultKeyProvider, resetDefaultKeyProvider, setKeyProvider, encryptSecret, decryptSecret, isEncryptedBlob, type EncryptedBlob, type KeyProvider, EnvKeyProvider, KmsKeyProvider, createBaseKeyProvider, initSecretEncryption, type PerOrgKmsConfig, type PerOrgKmsResolver, PerOrgKmsKeyProvider, } from './secret-encryption.js';
18
18
  export * from './secret-rotation.js';
19
19
  export { setCounterEmitter, resetCounterEmitter, emitCounter, } from './metric-emitter.js';
20
20
  export * from './aws-scrub.js';
@@ -20,7 +20,7 @@ export * from './date.js';
20
20
  export { resetSupportAliasesCache, getPrimarySupportAlias, getAllSupportAliases, resolveRecipientAlias, DEFAULT_SUPPORT_ALIAS, } from './alias-resolver.js';
21
21
  export * from './concurrency.js';
22
22
  export * from './audit.js';
23
- export { getDefaultKeyProvider, resetDefaultKeyProvider, setKeyProvider, encryptSecret, decryptSecret, isEncryptedBlob, EnvKeyProvider, KmsKeyProvider, PerOrgKmsKeyProvider, } from './secret-encryption.js';
23
+ export { getDefaultKeyProvider, resetDefaultKeyProvider, setKeyProvider, encryptSecret, decryptSecret, isEncryptedBlob, EnvKeyProvider, KmsKeyProvider, createBaseKeyProvider, initSecretEncryption, PerOrgKmsKeyProvider, } from './secret-encryption.js';
24
24
  export * from './secret-rotation.js';
25
25
  export { setCounterEmitter, resetCounterEmitter, emitCounter, } from './metric-emitter.js';
26
26
  export * from './aws-scrub.js';
@@ -32,4 +32,4 @@ export * from './service-registry.js';
32
32
  export * from './retention.js';
33
33
  export * from './compliance-attributes.js';
34
34
  export { leadingZeroBits, proofOfWorkHash, challengeKey, clampDifficulty, createProofOfWorkChallenge, parseProofOfWorkChallenge, verifyProofOfWork, solveProofOfWork, POW_DEFAULT_DIFFICULTY, POW_MAX_DIFFICULTY, POW_CHALLENGE_TTL_MS, } from './proof-of-work.js';
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLGVBQWUsRUFDZixZQUFZLEVBRVosTUFBTSxFQUNOLE9BQU8sR0FDUixNQUFNLGFBQWEsQ0FBQztBQUNyQixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxPQUFPLEVBQ0wsV0FBVyxFQUNYLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsbUJBQW1CLEVBQ25CLGNBQWMsRUFFZCxjQUFjLEVBQ2QsWUFBWSxFQUNaLGNBQWMsRUFDZCxpQkFBaUIsRUFDakIscUJBQXFCLEdBR3RCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxRQUFRLEVBQ1IsYUFBYSxFQUNiLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2hCLG9CQUFvQixFQUNwQixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsY0FBYyxFQUNkLGVBQWUsRUFDZixjQUFjLEVBSWQsZ0JBQWdCLEVBQ2hCLFdBQVcsR0FDWixNQUFNLGFBQWEsQ0FBQztBQUNyQixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGVBQWUsQ0FBQztBQUM5Qix5RUFBeUU7QUFDekUsbUVBQW1FO0FBQ25FLHlFQUF5RTtBQUN6RSw4RUFBOEU7QUFDOUUsaUNBQWlDO0FBQ2pDLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsZ0JBQWdCLEVBQ2hCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsY0FBYyxFQUNkLGFBQWEsRUFDYixrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLFVBQVUsR0FDWCxNQUFNLFVBQVUsQ0FBQztBQUtsQixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLFdBQVcsQ0FBQztBQUMxQixPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLHNCQUFzQixFQUN0QixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLHFCQUFxQixHQUN0QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxZQUFZLENBQUM7QUFDM0IsT0FBTyxFQUNMLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsY0FBYyxFQUNkLGFBQWEsRUFDYixhQUFhLEVBQ2IsZUFBZSxFQUdmLGNBQWMsRUFDZCxjQUFjLEVBR2Qsb0JBQW9CLEdBQ3JCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUNuQixXQUFXLEdBQ1osTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsbUJBQW1CLEdBQ3BCLE1BQU0sV0FBVyxDQUFDO0FBQ25CLE9BQU8sRUFDTCxRQUFRLEVBQ1IsY0FBYyxFQUNkLFFBQVEsRUFDUix3QkFBd0IsR0FDekIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixTQUFTLEdBRVYsTUFBTSxXQUFXLENBQUM7QUFDbkIsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsT0FBTyxFQUNMLGVBQWUsRUFDZixlQUFlLEVBQ2YsWUFBWSxFQUNaLGVBQWUsRUFDZiwwQkFBMEIsRUFDMUIseUJBQXlCLEVBQ3pCLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsc0JBQXNCLEVBQ3RCLGtCQUFrQixFQUNsQixvQkFBb0IsR0FHckIsTUFBTSxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5leHBvcnQge1xuICBzZXRMb2dDb250ZXh0UHJvdmlkZXIsXG4gIHJlZGFjdFNlbnNpdGl2ZSxcbiAgY3JlYXRlTG9nZ2VyLFxuICB0eXBlIExvZ2dlcixcbiAgbG9nZ2VyLFxuICBkZWZhdWx0LFxufSBmcm9tICcuL2xvZ2dlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2FwaS1rZXkuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zYWZlLXJlcXVpcmUuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zZWN1cmUtY29tcGFyZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NyYXNoLWhhbmRsZXJzLmpzJztcbmV4cG9ydCB7XG4gIHNlbmRTdWNjZXNzLFxuICBzZW5kRXJyb3IsXG4gIHNlbmRRdW90YUV4Y2VlZGVkLFxuICBzZW5kUGFnaW5hdGVkTmVzdGVkLFxuICBwYWdpbmF0aW9uTWV0YSxcbiAgdHlwZSBQYWdpbmF0aW9uTWV0YSxcbiAgZXh0cmFjdERiRXJyb3IsXG4gIGVycm9yTWVzc2FnZSxcbiAgc2VuZEJhZFJlcXVlc3QsXG4gIHNlbmRJbnRlcm5hbEVycm9yLFxuICBwYXJzZVBhZ2luYXRpb25QYXJhbXMsXG4gIHR5cGUgUGFnaW5hdGlvblBhcmFtcyxcbiAgdHlwZSBTb3J0UGFyYW1zLFxufSBmcm9tICcuL3Jlc3BvbnNlLmpzJztcbmV4cG9ydCB7XG4gIGdldFBhcmFtLFxuICBwYXJzZVF1ZXJ5SW50LFxuICBwYXJzZVF1ZXJ5U3RyaW5nLFxuICBwYXJzZU9wdGlvbmFsRGF0ZSxcbiAgcGFyc2VQb3NpdGl2ZUludCxcbiAgcGFyc2VRdWVyeUludENsYW1wZWQsXG4gIHBhcnNlUGFnZSxcbiAgdmFsaWRhdGVCdWxrQXJyYXksXG4gIHBhcnNlUmVwb3J0SW50ZXJ2YWwsXG4gIHBhcnNlUmVwb3J0VGltZXpvbmUsXG4gIHBhcnNlV2Vla1N0YXJ0LFxuICBpc1ZhbGlkVGltZXpvbmUsXG4gIHBhcnNlRGF0ZVJhbmdlLFxuICB0eXBlIFBhZ2UsXG4gIHR5cGUgUmVwb3J0SW50ZXJ2YWwsXG4gIHR5cGUgV2Vla1N0YXJ0LFxuICBSRVBPUlRfSU5URVJWQUxTLFxuICBXRUVLX1NUQVJUUyxcbn0gZnJvbSAnLi9wYXJhbXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9oZWFkZXJzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vaWRlbnRpdHkuanMnO1xuLy8gSldLIHByaW1pdGl2ZXMuIFBsYXRmb3JtIElTIHRoZSB0b2tlbiBzaWduZXIsIHNvIGl0IGxlZ2l0aW1hdGVseSBuZWVkc1xuLy8gYHB1YmxpY0p3a0Zyb21gICsgYGRlclRvSm9zZVNpZ25hdHVyZWAgZnJvbSB0aGUgcGFja2FnZSBzdXJmYWNlLlxuLy8gYGp3a1RodW1icHJpbnRgIGFuZCBgcHVibGljS2V5RnJvbUp3a2AgYXJlIGtpZC1kZXJpdmF0aW9uL3ZlcmlmaWNhdGlvblxuLy8gcGx1bWJpbmcgdXNlZCBvbmx5IGluc2lkZSBhcGktY29yZSDigJQgZGVlcC1pbXBvcnQgdGhlbSBmcm9tIHRoZXJlIGluc3RlYWQgb2Zcbi8vIGxlYWtpbmcgdGhlbSB0byBldmVyeSBzZXJ2aWNlLlxuZXhwb3J0IHtcbiAgVVNFUl9UT0tFTl9BTEdPUklUSE0sXG4gIFVTRVJfVE9LRU5fQ1VSVkUsXG4gIEpXS1NfUEFUSCxcbiAgZGVjb2RlSnd0SGVhZGVyLFxuICBpc0p3a3NEb2N1bWVudCxcbiAgcHVibGljSndrRnJvbSxcbiAgZGVyVG9Kb3NlU2lnbmF0dXJlLFxuICBlbmNvZGVKd3NTaWduaW5nSW5wdXQsXG4gIGNvbXBhY3RKd3MsXG59IGZyb20gJy4vandrLmpzJztcbmV4cG9ydCB0eXBlIHtcbiAgUHVibGljSndrLFxuICBKd2tzRG9jdW1lbnQsXG59IGZyb20gJy4vandrLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vb2JqZWN0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZGF0ZS5qcyc7XG5leHBvcnQge1xuICByZXNldFN1cHBvcnRBbGlhc2VzQ2FjaGUsXG4gIGdldFByaW1hcnlTdXBwb3J0QWxpYXMsXG4gIGdldEFsbFN1cHBvcnRBbGlhc2VzLFxuICByZXNvbHZlUmVjaXBpZW50QWxpYXMsXG4gIERFRkFVTFRfU1VQUE9SVF9BTElBUyxcbn0gZnJvbSAnLi9hbGlhcy1yZXNvbHZlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbmN1cnJlbmN5LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYXVkaXQuanMnO1xuZXhwb3J0IHtcbiAgZ2V0RGVmYXVsdEtleVByb3ZpZGVyLFxuICByZXNldERlZmF1bHRLZXlQcm92aWRlcixcbiAgc2V0S2V5UHJvdmlkZXIsXG4gIGVuY3J5cHRTZWNyZXQsXG4gIGRlY3J5cHRTZWNyZXQsXG4gIGlzRW5jcnlwdGVkQmxvYixcbiAgdHlwZSBFbmNyeXB0ZWRCbG9iLFxuICB0eXBlIEtleVByb3ZpZGVyLFxuICBFbnZLZXlQcm92aWRlcixcbiAgS21zS2V5UHJvdmlkZXIsXG4gIHR5cGUgUGVyT3JnS21zQ29uZmlnLFxuICB0eXBlIFBlck9yZ0ttc1Jlc29sdmVyLFxuICBQZXJPcmdLbXNLZXlQcm92aWRlcixcbn0gZnJvbSAnLi9zZWNyZXQtZW5jcnlwdGlvbi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NlY3JldC1yb3RhdGlvbi5qcyc7XG5leHBvcnQge1xuICBzZXRDb3VudGVyRW1pdHRlcixcbiAgcmVzZXRDb3VudGVyRW1pdHRlcixcbiAgZW1pdENvdW50ZXIsXG59IGZyb20gJy4vbWV0cmljLWVtaXR0ZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9hd3Mtc2NydWIuanMnO1xuZXhwb3J0IHtcbiAgZXh0cmFjdFByZWRpY2F0ZSxcbiAgU1BEWF9QUkVESUNBVEVfVFlQRSxcbn0gZnJvbSAnLi9kc3NlLmpzJztcbmV4cG9ydCB7XG4gIG1hc2tMaW5lLFxuICBsb29rc1NlbnNpdGl2ZSxcbiAgUkVEQUNURUQsXG4gIFNFTlNJVElWRV9WQUxVRV9QQVRURVJOUyxcbn0gZnJvbSAnLi9zZW5zaXRpdmUtcGF0dGVybnMuanMnO1xuZXhwb3J0IHtcbiAgaXNQcml2YXRlQWRkcmVzcyxcbiAgYXNzZXJ0U2FmZVVybCxcbiAgc2FmZUZldGNoLFxuICB0eXBlIFNhZmVGZXRjaFJlc3BvbnNlLFxufSBmcm9tICcuL3NzcmYuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9lbnYuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlLXJlZ2lzdHJ5LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcmV0ZW50aW9uLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcGxpYW5jZS1hdHRyaWJ1dGVzLmpzJztcbmV4cG9ydCB7XG4gIGxlYWRpbmdaZXJvQml0cyxcbiAgcHJvb2ZPZldvcmtIYXNoLFxuICBjaGFsbGVuZ2VLZXksXG4gIGNsYW1wRGlmZmljdWx0eSxcbiAgY3JlYXRlUHJvb2ZPZldvcmtDaGFsbGVuZ2UsXG4gIHBhcnNlUHJvb2ZPZldvcmtDaGFsbGVuZ2UsXG4gIHZlcmlmeVByb29mT2ZXb3JrLFxuICBzb2x2ZVByb29mT2ZXb3JrLFxuICBQT1dfREVGQVVMVF9ESUZGSUNVTFRZLFxuICBQT1dfTUFYX0RJRkZJQ1VMVFksXG4gIFBPV19DSEFMTEVOR0VfVFRMX01TLFxuICB0eXBlIFByb29mT2ZXb3JrQ2hhbGxlbmdlLFxuICB0eXBlIFByb29mT2ZXb3JrU29sdXRpb24sXG59IGZyb20gJy4vcHJvb2Ytb2Ytd29yay5qcyc7XG4iXX0=
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLGVBQWUsRUFDZixZQUFZLEVBRVosTUFBTSxFQUNOLE9BQU8sR0FDUixNQUFNLGFBQWEsQ0FBQztBQUNyQixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxPQUFPLEVBQ0wsV0FBVyxFQUNYLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsbUJBQW1CLEVBQ25CLGNBQWMsRUFFZCxjQUFjLEVBQ2QsWUFBWSxFQUNaLGNBQWMsRUFDZCxpQkFBaUIsRUFDakIscUJBQXFCLEdBR3RCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxRQUFRLEVBQ1IsYUFBYSxFQUNiLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2hCLG9CQUFvQixFQUNwQixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsY0FBYyxFQUNkLGVBQWUsRUFDZixjQUFjLEVBSWQsZ0JBQWdCLEVBQ2hCLFdBQVcsR0FDWixNQUFNLGFBQWEsQ0FBQztBQUNyQixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGVBQWUsQ0FBQztBQUM5Qix5RUFBeUU7QUFDekUsbUVBQW1FO0FBQ25FLHlFQUF5RTtBQUN6RSw4RUFBOEU7QUFDOUUsaUNBQWlDO0FBQ2pDLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsZ0JBQWdCLEVBQ2hCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsY0FBYyxFQUNkLGFBQWEsRUFDYixrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLFVBQVUsR0FDWCxNQUFNLFVBQVUsQ0FBQztBQUtsQixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLFdBQVcsQ0FBQztBQUMxQixPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLHNCQUFzQixFQUN0QixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLHFCQUFxQixHQUN0QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxZQUFZLENBQUM7QUFDM0IsT0FBTyxFQUNMLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsY0FBYyxFQUNkLGFBQWEsRUFDYixhQUFhLEVBQ2IsZUFBZSxFQUdmLGNBQWMsRUFDZCxjQUFjLEVBQ2QscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUdwQixvQkFBb0IsR0FDckIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsbUJBQW1CLEVBQ25CLFdBQVcsR0FDWixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixtQkFBbUIsR0FDcEIsTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUNMLFFBQVEsRUFDUixjQUFjLEVBQ2QsUUFBUSxFQUNSLHdCQUF3QixHQUN6QixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLFNBQVMsR0FFVixNQUFNLFdBQVcsQ0FBQztBQUNuQixjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLGVBQWUsRUFDZixZQUFZLEVBQ1osZUFBZSxFQUNmLDBCQUEwQixFQUMxQix5QkFBeUIsRUFDekIsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQixzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ2xCLG9CQUFvQixHQUdyQixNQUFNLG9CQUFvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmV4cG9ydCB7XG4gIHNldExvZ0NvbnRleHRQcm92aWRlcixcbiAgcmVkYWN0U2Vuc2l0aXZlLFxuICBjcmVhdGVMb2dnZXIsXG4gIHR5cGUgTG9nZ2VyLFxuICBsb2dnZXIsXG4gIGRlZmF1bHQsXG59IGZyb20gJy4vbG9nZ2VyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYXBpLWtleS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NhZmUtcmVxdWlyZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NlY3VyZS1jb21wYXJlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY3Jhc2gtaGFuZGxlcnMuanMnO1xuZXhwb3J0IHtcbiAgc2VuZFN1Y2Nlc3MsXG4gIHNlbmRFcnJvcixcbiAgc2VuZFF1b3RhRXhjZWVkZWQsXG4gIHNlbmRQYWdpbmF0ZWROZXN0ZWQsXG4gIHBhZ2luYXRpb25NZXRhLFxuICB0eXBlIFBhZ2luYXRpb25NZXRhLFxuICBleHRyYWN0RGJFcnJvcixcbiAgZXJyb3JNZXNzYWdlLFxuICBzZW5kQmFkUmVxdWVzdCxcbiAgc2VuZEludGVybmFsRXJyb3IsXG4gIHBhcnNlUGFnaW5hdGlvblBhcmFtcyxcbiAgdHlwZSBQYWdpbmF0aW9uUGFyYW1zLFxuICB0eXBlIFNvcnRQYXJhbXMsXG59IGZyb20gJy4vcmVzcG9uc2UuanMnO1xuZXhwb3J0IHtcbiAgZ2V0UGFyYW0sXG4gIHBhcnNlUXVlcnlJbnQsXG4gIHBhcnNlUXVlcnlTdHJpbmcsXG4gIHBhcnNlT3B0aW9uYWxEYXRlLFxuICBwYXJzZVBvc2l0aXZlSW50LFxuICBwYXJzZVF1ZXJ5SW50Q2xhbXBlZCxcbiAgcGFyc2VQYWdlLFxuICB2YWxpZGF0ZUJ1bGtBcnJheSxcbiAgcGFyc2VSZXBvcnRJbnRlcnZhbCxcbiAgcGFyc2VSZXBvcnRUaW1lem9uZSxcbiAgcGFyc2VXZWVrU3RhcnQsXG4gIGlzVmFsaWRUaW1lem9uZSxcbiAgcGFyc2VEYXRlUmFuZ2UsXG4gIHR5cGUgUGFnZSxcbiAgdHlwZSBSZXBvcnRJbnRlcnZhbCxcbiAgdHlwZSBXZWVrU3RhcnQsXG4gIFJFUE9SVF9JTlRFUlZBTFMsXG4gIFdFRUtfU1RBUlRTLFxufSBmcm9tICcuL3BhcmFtcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2hlYWRlcnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9pZGVudGl0eS5qcyc7XG4vLyBKV0sgcHJpbWl0aXZlcy4gUGxhdGZvcm0gSVMgdGhlIHRva2VuIHNpZ25lciwgc28gaXQgbGVnaXRpbWF0ZWx5IG5lZWRzXG4vLyBgcHVibGljSndrRnJvbWAgKyBgZGVyVG9Kb3NlU2lnbmF0dXJlYCBmcm9tIHRoZSBwYWNrYWdlIHN1cmZhY2UuXG4vLyBgandrVGh1bWJwcmludGAgYW5kIGBwdWJsaWNLZXlGcm9tSndrYCBhcmUga2lkLWRlcml2YXRpb24vdmVyaWZpY2F0aW9uXG4vLyBwbHVtYmluZyB1c2VkIG9ubHkgaW5zaWRlIGFwaS1jb3JlIOKAlCBkZWVwLWltcG9ydCB0aGVtIGZyb20gdGhlcmUgaW5zdGVhZCBvZlxuLy8gbGVha2luZyB0aGVtIHRvIGV2ZXJ5IHNlcnZpY2UuXG5leHBvcnQge1xuICBVU0VSX1RPS0VOX0FMR09SSVRITSxcbiAgVVNFUl9UT0tFTl9DVVJWRSxcbiAgSldLU19QQVRILFxuICBkZWNvZGVKd3RIZWFkZXIsXG4gIGlzSndrc0RvY3VtZW50LFxuICBwdWJsaWNKd2tGcm9tLFxuICBkZXJUb0pvc2VTaWduYXR1cmUsXG4gIGVuY29kZUp3c1NpZ25pbmdJbnB1dCxcbiAgY29tcGFjdEp3cyxcbn0gZnJvbSAnLi9qd2suanMnO1xuZXhwb3J0IHR5cGUge1xuICBQdWJsaWNKd2ssXG4gIEp3a3NEb2N1bWVudCxcbn0gZnJvbSAnLi9qd2suanMnO1xuZXhwb3J0ICogZnJvbSAnLi9vYmplY3QuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9kYXRlLmpzJztcbmV4cG9ydCB7XG4gIHJlc2V0U3VwcG9ydEFsaWFzZXNDYWNoZSxcbiAgZ2V0UHJpbWFyeVN1cHBvcnRBbGlhcyxcbiAgZ2V0QWxsU3VwcG9ydEFsaWFzZXMsXG4gIHJlc29sdmVSZWNpcGllbnRBbGlhcyxcbiAgREVGQVVMVF9TVVBQT1JUX0FMSUFTLFxufSBmcm9tICcuL2FsaWFzLXJlc29sdmVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29uY3VycmVuY3kuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9hdWRpdC5qcyc7XG5leHBvcnQge1xuICBnZXREZWZhdWx0S2V5UHJvdmlkZXIsXG4gIHJlc2V0RGVmYXVsdEtleVByb3ZpZGVyLFxuICBzZXRLZXlQcm92aWRlcixcbiAgZW5jcnlwdFNlY3JldCxcbiAgZGVjcnlwdFNlY3JldCxcbiAgaXNFbmNyeXB0ZWRCbG9iLFxuICB0eXBlIEVuY3J5cHRlZEJsb2IsXG4gIHR5cGUgS2V5UHJvdmlkZXIsXG4gIEVudktleVByb3ZpZGVyLFxuICBLbXNLZXlQcm92aWRlcixcbiAgY3JlYXRlQmFzZUtleVByb3ZpZGVyLFxuICBpbml0U2VjcmV0RW5jcnlwdGlvbixcbiAgdHlwZSBQZXJPcmdLbXNDb25maWcsXG4gIHR5cGUgUGVyT3JnS21zUmVzb2x2ZXIsXG4gIFBlck9yZ0ttc0tleVByb3ZpZGVyLFxufSBmcm9tICcuL3NlY3JldC1lbmNyeXB0aW9uLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vc2VjcmV0LXJvdGF0aW9uLmpzJztcbmV4cG9ydCB7XG4gIHNldENvdW50ZXJFbWl0dGVyLFxuICByZXNldENvdW50ZXJFbWl0dGVyLFxuICBlbWl0Q291bnRlcixcbn0gZnJvbSAnLi9tZXRyaWMtZW1pdHRlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2F3cy1zY3J1Yi5qcyc7XG5leHBvcnQge1xuICBleHRyYWN0UHJlZGljYXRlLFxuICBTUERYX1BSRURJQ0FURV9UWVBFLFxufSBmcm9tICcuL2Rzc2UuanMnO1xuZXhwb3J0IHtcbiAgbWFza0xpbmUsXG4gIGxvb2tzU2Vuc2l0aXZlLFxuICBSRURBQ1RFRCxcbiAgU0VOU0lUSVZFX1ZBTFVFX1BBVFRFUk5TLFxufSBmcm9tICcuL3NlbnNpdGl2ZS1wYXR0ZXJucy5qcyc7XG5leHBvcnQge1xuICBpc1ByaXZhdGVBZGRyZXNzLFxuICBhc3NlcnRTYWZlVXJsLFxuICBzYWZlRmV0Y2gsXG4gIHR5cGUgU2FmZUZldGNoUmVzcG9uc2UsXG59IGZyb20gJy4vc3NyZi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2Vudi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2UtcmVnaXN0cnkuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9yZXRlbnRpb24uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wbGlhbmNlLWF0dHJpYnV0ZXMuanMnO1xuZXhwb3J0IHtcbiAgbGVhZGluZ1plcm9CaXRzLFxuICBwcm9vZk9mV29ya0hhc2gsXG4gIGNoYWxsZW5nZUtleSxcbiAgY2xhbXBEaWZmaWN1bHR5LFxuICBjcmVhdGVQcm9vZk9mV29ya0NoYWxsZW5nZSxcbiAgcGFyc2VQcm9vZk9mV29ya0NoYWxsZW5nZSxcbiAgdmVyaWZ5UHJvb2ZPZldvcmssXG4gIHNvbHZlUHJvb2ZPZldvcmssXG4gIFBPV19ERUZBVUxUX0RJRkZJQ1VMVFksXG4gIFBPV19NQVhfRElGRklDVUxUWSxcbiAgUE9XX0NIQUxMRU5HRV9UVExfTVMsXG4gIHR5cGUgUHJvb2ZPZldvcmtDaGFsbGVuZ2UsXG4gIHR5cGUgUHJvb2ZPZldvcmtTb2x1dGlvbixcbn0gZnJvbSAnLi9wcm9vZi1vZi13b3JrLmpzJztcbiJdfQ==
@@ -67,6 +67,33 @@ export declare class KmsKeyProvider implements KeyProvider {
67
67
  * one. Triggers lazy initialization on first access, same as the internal
68
68
  * callers below. */
69
69
  export declare function getDefaultKeyProvider(): KeyProvider;
70
+ /**
71
+ * The base (non-per-org) provider this environment asks for: the KMS-wrapped
72
+ * master when both of its vars are set, otherwise the plaintext env master.
73
+ *
74
+ * Constructs eagerly, so it throws when the env master is required and missing.
75
+ * `initSecretEncryption()` is the boot entry point and deliberately does NOT
76
+ * call this for the env case; use it only where an instance is needed right
77
+ * away — e.g. the per-org fallback, which is already past that check.
78
+ */
79
+ export declare function createBaseKeyProvider(): KeyProvider;
80
+ /**
81
+ * Select, WARM and install the base key provider. Call once at startup, before
82
+ * the service serves traffic.
83
+ *
84
+ * Warming matters: `KmsKeyProvider.deriveKey` is synchronous and refuses to work
85
+ * cold, so without this every secret read/write would throw until something
86
+ * happened to call `warmup()`. Doing it at boot also turns a bad CMK, a bad
87
+ * wrapped master or a missing `kms:Decrypt` grant into a startup failure rather
88
+ * than a 500 on the first request that touches a secret.
89
+ *
90
+ * Returns the warmed provider so a caller can layer `PerOrgKmsKeyProvider` over
91
+ * it without constructing (and re-warming) a second one.
92
+ */
93
+ export declare function initSecretEncryption(): Promise<{
94
+ provider: KeyProvider | null;
95
+ mode: 'env' | 'kms';
96
+ }>;
70
97
  /** Reset the cached default (and previous) provider for tests that mutate `process.env`. */
71
98
  export declare function resetDefaultKeyProvider(): void;
72
99
  /** Replace the default provider services that opt into KMS call this
@@ -1,31 +1,40 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  /**
4
- * Per-org envelope encryption for secret columns.
4
+ * Envelope encryption for org-scoped secret columns (AI provider keys, IdP
5
+ * client secrets, webhook URLs/secrets, registry credentials).
5
6
  *
6
- * Today's posture for org-scoped secrets (aiProviderKeys, webhook URLs,
7
- * registry credentials) is clear-text in Mongo / Postgres with app-layer
8
- * masking on output. This module is the encryption primitive that lets the
9
- * model layer swap clear-text strings for `EncryptedBlob` values at write
10
- * time and decrypt at read time.
7
+ * Cryptography — the same for every provider below:
8
+ * - AES-256-GCM (authenticated encryption).
9
+ * - Per-org key via HKDF-SHA256(master, salt=orgId, info='secrets-v1'), so two
10
+ * orgs encrypting the same plaintext produce different ciphertexts and a
11
+ * stolen database cannot tell which orgs share a secret by comparison.
12
+ * - 12-byte IV per encryption from `crypto.randomBytes`.
13
+ * - 16-byte GCM auth tag concatenated onto the ciphertext.
11
14
  *
12
- * Cryptography * - AES-256-GCM (authenticated encryption).
13
- * - Per-org key derived via HKDF-SHA256(masterKey, salt=orgId, info='secrets-v1').
14
- * Each org gets a unique key without operator key-management ceremony.
15
- * - 12-byte IV generated per encryption with `crypto.randomBytes`.
16
- * - 16-byte authentication tag concatenated with ciphertext (standard GCM).
15
+ * WHERE THE MASTER COMES FROM is the only axis that varies, and all three
16
+ * providers are implemented — pick one per deployment:
17
17
  *
18
- * Operator configuration * - `SECRET_ENCRYPTION_KEY` env: hex- or base64-encoded 32-byte master key.
19
- * Required when `encryptSecret`/`decryptSecret` are called. Missing key
20
- * throws encryption is fail-closed; we never silently round-trip a
21
- * secret as plaintext.
18
+ * | provider | master | blast radius |
19
+ * |------------------------|-------------------------------------|--------------------|
20
+ * | `EnvKeyProvider` | `SECRET_ENCRYPTION_KEY`, plaintext | every org |
21
+ * | `KmsKeyProvider` | KMS-wrapped, unwrapped once at boot | every org |
22
+ * | `PerOrgKmsKeyProvider` | one KMS-wrapped master PER ORG | one org |
22
23
  *
23
- * KMS migration path * - The two exported functions take a `provider` parameter. The default
24
- * `EnvKeyProvider` implements HKDF derivation. A future `AwsKmsProvider`
25
- * plugs in here: it can call KMS `Encrypt` / `Decrypt` to wrap a DEK
26
- * rather than holding a master key in env. The on-disk blob shape
27
- * (`{ alg, iv, ciphertext, kid? }`) is forward-compatible `kid`
28
- * carries the KMS key id when the provider needs it.
24
+ * `initSecretEncryption()` selects between the first two from env and warms the
25
+ * result; platform layers `PerOrgKmsKeyProvider` over it (orgs with no per-org
26
+ * CMK fall through to the base provider), so a deployment can run mixed-mode.
27
+ * Call it once at startup — before that, the lazy default is `EnvKeyProvider`,
28
+ * which is correct for dev and self-hosted installs with no KMS.
29
+ *
30
+ * Fail-closed throughout: a missing or wrong-length master throws rather than
31
+ * round-tripping a secret as plaintext, and an unresolved per-org config throws
32
+ * rather than guessing the shared master.
33
+ *
34
+ * The on-disk shape (`{ alg, iv, ciphertext, kid? }`) is provider-independent;
35
+ * `kid` carries the KMS key id for the providers that have one, which is what
36
+ * lets `decryptSecret` refuse a blob written under a since-rotated CMK instead
37
+ * of surfacing an opaque auth-tag failure.
29
38
  */
30
39
  import { createCipheriv, createDecipheriv, hkdfSync, randomBytes } from 'crypto';
31
40
  /**
@@ -78,18 +87,29 @@ export class EnvKeyProvider {
78
87
  * operator can move to per-record envelope encryption (call
79
88
  * GenerateDataKey on every write); that's a follow-on.
80
89
  *
81
- * Operator setup * 1. Create a KMS CMK with key policy allowing the platform service's
82
- * IAM role kms:Decrypt.
83
- * 2. Generate a random 32-byte master * head -c 32 /dev/urandom | base64
84
- * 3. Wrap it with KMS * aws kms encrypt --key-id <KEY_ID> \
85
- * --plaintext <base64-from-step-2> --output text \
86
- * --query CiphertextBlob
87
- * 4. Set on the service * SECRET_ENCRYPTION_KMS_KEY_ID=<KEY_ID>
88
- * SECRET_ENCRYPTION_KMS_CIPHERTEXT=<base64-output-of-step-3>
89
- * 5. Pick this provider via `setKeyProvider(new KmsKeyProvider())`.
90
+ * Operator setup:
91
+ * 1. Create a KMS CMK whose key policy allows the service role `kms:Decrypt`.
92
+ * On the AWS targets `bin/setup.sh` / `template.yaml` grant that to the
93
+ * platform and plugin task roles when these vars are set.
94
+ * 2. Generate a 32-byte master: head -c 32 /dev/urandom | base64
95
+ * 3. Wrap it: aws kms encrypt --key-id <KEY_ID> --plaintext <base64-from-2> \
96
+ * --output text --query CiphertextBlob
97
+ * 4. Set on the service:
98
+ * SECRET_ENCRYPTION_KMS_KEY_ID=<KEY_ID> (alias/<name> or key UUID)
99
+ * SECRET_ENCRYPTION_KMS_CIPHERTEXT=<base64-from-3>
100
+ *
101
+ * NO MANUAL WIRING: `initSecretEncryption()` picks this provider whenever both
102
+ * vars are set and warms it before the service accepts traffic. (It used to
103
+ * require a hand-written `setKeyProvider(new KmsKeyProvider())` that no service
104
+ * ever called, so the mode was documented but unreachable.)
90
105
  *
91
- * Construct lazily importing the AWS SDK has a non-trivial cold-start
92
- * cost so envs that stay on EnvKeyProvider never load it.
106
+ * Migrating env -> KMS: set the two vars above to the NEW wrapped master and
107
+ * leave the old plaintext master in `SECRET_ENCRYPTION_KEY_PREVIOUS`. Reads
108
+ * fall back to it for kid-less blobs until `reencrypt-secrets` has rewritten
109
+ * them; see docs/runbooks/secret-rotation.md.
110
+ *
111
+ * The AWS SDK is imported lazily, so installs that stay on `EnvKeyProvider`
112
+ * never pay its cold-start cost.
93
113
  */
94
114
  /**
95
115
  * KMS-decrypt a base64 ciphertext into a 32-byte key. Shared by both KMS key
@@ -197,6 +217,81 @@ function getPreviousProvider() {
197
217
  }
198
218
  return previousProvider;
199
219
  }
220
+ /**
221
+ * Resolve (and WARM) the rotation fallback.
222
+ *
223
+ * Two rotation shapes, and the order matters:
224
+ * - KMS master rotation: `SECRET_ENCRYPTION_KMS_CIPHERTEXT_PREVIOUS` holds the
225
+ * outgoing master wrapped under `SECRET_ENCRYPTION_KMS_KEY_ID_PREVIOUS` (or
226
+ * the current CMK, when only the master changed and not the key).
227
+ * - Migration FROM the env master TO KMS: the primary is the new KMS-wrapped
228
+ * master and the outgoing PLAINTEXT master stays in
229
+ * `SECRET_ENCRYPTION_KEY_PREVIOUS`. That is why the env form is still read
230
+ * when no KMS previous is configured, rather than being mutually exclusive.
231
+ *
232
+ * Warmed here because `decryptSecret` takes the previous provider as a SYNC
233
+ * default parameter — a cold `KmsKeyProvider` would throw out of `deriveKey`
234
+ * on the retry path and mask the original decryption error.
235
+ */
236
+ async function initPreviousProvider() {
237
+ const wrappedPrevious = process.env.SECRET_ENCRYPTION_KMS_CIPHERTEXT_PREVIOUS;
238
+ const previousKeyId = process.env.SECRET_ENCRYPTION_KMS_KEY_ID_PREVIOUS ?? process.env.SECRET_ENCRYPTION_KMS_KEY_ID;
239
+ if (wrappedPrevious && previousKeyId) {
240
+ const provider = new KmsKeyProvider({ keyId: previousKeyId, ciphertextBase64: wrappedPrevious });
241
+ await provider.warmup();
242
+ previousProvider = provider;
243
+ return;
244
+ }
245
+ const plaintextPrevious = process.env.SECRET_ENCRYPTION_KEY_PREVIOUS;
246
+ previousProvider = plaintextPrevious ? new EnvKeyProvider(plaintextPrevious) : null;
247
+ }
248
+ /**
249
+ * The base (non-per-org) provider this environment asks for: the KMS-wrapped
250
+ * master when both of its vars are set, otherwise the plaintext env master.
251
+ *
252
+ * Constructs eagerly, so it throws when the env master is required and missing.
253
+ * `initSecretEncryption()` is the boot entry point and deliberately does NOT
254
+ * call this for the env case; use it only where an instance is needed right
255
+ * away — e.g. the per-org fallback, which is already past that check.
256
+ */
257
+ export function createBaseKeyProvider() {
258
+ const keyId = process.env.SECRET_ENCRYPTION_KMS_KEY_ID;
259
+ const ciphertext = process.env.SECRET_ENCRYPTION_KMS_CIPHERTEXT;
260
+ return keyId && ciphertext ? new KmsKeyProvider({ keyId, ciphertextBase64: ciphertext }) : new EnvKeyProvider();
261
+ }
262
+ /**
263
+ * Select, WARM and install the base key provider. Call once at startup, before
264
+ * the service serves traffic.
265
+ *
266
+ * Warming matters: `KmsKeyProvider.deriveKey` is synchronous and refuses to work
267
+ * cold, so without this every secret read/write would throw until something
268
+ * happened to call `warmup()`. Doing it at boot also turns a bad CMK, a bad
269
+ * wrapped master or a missing `kms:Decrypt` grant into a startup failure rather
270
+ * than a 500 on the first request that touches a secret.
271
+ *
272
+ * Returns the warmed provider so a caller can layer `PerOrgKmsKeyProvider` over
273
+ * it without constructing (and re-warming) a second one.
274
+ */
275
+ export async function initSecretEncryption() {
276
+ const keyId = process.env.SECRET_ENCRYPTION_KMS_KEY_ID;
277
+ const ciphertext = process.env.SECRET_ENCRYPTION_KMS_CIPHERTEXT;
278
+ // NO KMS CONFIGURED: deliberately touch nothing and report `null`.
279
+ //
280
+ // `EnvKeyProvider` needs no warming, so there is nothing to gain here — and
281
+ // constructing one eagerly would make `SECRET_ENCRYPTION_KEY` a hard BOOT
282
+ // requirement for every service that calls this, including dev and test runs
283
+ // that never encrypt a secret. The lazy default stays exactly as it was: the
284
+ // first `encryptSecret`/`decryptSecret` builds it, and a missing master throws
285
+ // there. Callers that need an instance (the per-org fallback) construct their
286
+ // own `EnvKeyProvider` when this returns null.
287
+ if (!keyId || !ciphertext)
288
+ return { provider: null, mode: 'env' };
289
+ const provider = new KmsKeyProvider({ keyId, ciphertextBase64: ciphertext });
290
+ await provider.warmup();
291
+ setKeyProvider(provider);
292
+ await initPreviousProvider();
293
+ return { provider, mode: 'kms' };
294
+ }
200
295
  /** Reset the cached default (and previous) provider for tests that mutate `process.env`. */
201
296
  export function resetDefaultKeyProvider() { defaultProvider = null; previousProvider = undefined; }
202
297
  /** Replace the default provider services that opt into KMS call this
@@ -459,4 +554,4 @@ export function isEncryptedBlob(value) {
459
554
  && typeof value.iv === 'string'
460
555
  && typeof value.ciphertext === 'string');
461
556
  }
462
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjcmV0LWVuY3J5cHRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvc2VjcmV0LWVuY3J5cHRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFFSCxPQUFPLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxRQUFRLENBQUM7QUE2QmpGOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLE9BQU8sY0FBYztJQUNSLFNBQVMsQ0FBUztJQUVuQyxZQUFZLGlCQUEwQjtRQUNwQyxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDO1FBQ25FLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztRQUNqRixDQUFDO1FBQ0QsMEVBQTBFO1FBQzFFLHNEQUFzRDtRQUN0RCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsTUFBTSxLQUFLLEVBQUUsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUMzRCxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMvQixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDM0YsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO0lBQzNCLENBQUM7SUFFRCxTQUFTLENBQUMsS0FBYTtRQUNy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QUcsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDN0MsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMxRCxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEUsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBYztJQUM1QyxPQUFPLENBQUUsT0FBTyxLQUFLLEtBQUssUUFBUTtXQUM3QixLQUFLLEtBQUssSUFBSTtXQUNiLEtBQTJCLENBQUMsR0FBRyxLQUFLLGdCQUFnQjtXQUNyRCxPQUFRLEtBQTBCLENBQUMsRUFBRSxLQUFLLFFBQVE7V0FDbEQsT0FBUSxLQUFrQyxDQUFDLFVBQVUsS0FBSyxRQUFRLENBQ3RFLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogIFBlci1vcmcgZW52ZWxvcGUgZW5jcnlwdGlvbiBmb3Igc2VjcmV0IGNvbHVtbnMuXG4gKlxuICogVG9kYXkncyBwb3N0dXJlIGZvciBvcmctc2NvcGVkIHNlY3JldHMgKGFpUHJvdmlkZXJLZXlzLCB3ZWJob29rIFVSTHMsXG4gKiByZWdpc3RyeSBjcmVkZW50aWFscykgaXMgY2xlYXItdGV4dCBpbiBNb25nbyAvIFBvc3RncmVzIHdpdGggYXBwLWxheWVyXG4gKiBtYXNraW5nIG9uIG91dHB1dC4gVGhpcyBtb2R1bGUgaXMgdGhlIGVuY3J5cHRpb24gcHJpbWl0aXZlIHRoYXQgbGV0cyB0aGVcbiAqIG1vZGVsIGxheWVyIHN3YXAgY2xlYXItdGV4dCBzdHJpbmdzIGZvciBgRW5jcnlwdGVkQmxvYmAgdmFsdWVzIGF0IHdyaXRlXG4gKiB0aW1lIGFuZCBkZWNyeXB0IGF0IHJlYWQgdGltZS5cbiAqXG4gKiBDcnlwdG9ncmFwaHkgKiAtIEFFUy0yNTYtR0NNIChhdXRoZW50aWNhdGVkIGVuY3J5cHRpb24pLlxuICogLSBQZXItb3JnIGtleSBkZXJpdmVkIHZpYSBIS0RGLVNIQTI1NihtYXN0ZXJLZXksIHNhbHQ9b3JnSWQsIGluZm89J3NlY3JldHMtdjEnKS5cbiAqIEVhY2ggb3JnIGdldHMgYSB1bmlxdWUga2V5IHdpdGhvdXQgb3BlcmF0b3Iga2V5LW1hbmFnZW1lbnQgY2VyZW1vbnkuXG4gKiAtIDEyLWJ5dGUgSVYgZ2VuZXJhdGVkIHBlciBlbmNyeXB0aW9uIHdpdGggYGNyeXB0by5yYW5kb21CeXRlc2AuXG4gKiAtIDE2LWJ5dGUgYXV0aGVudGljYXRpb24gdGFnIGNvbmNhdGVuYXRlZCB3aXRoIGNpcGhlcnRleHQgKHN0YW5kYXJkIEdDTSkuXG4gKlxuICogT3BlcmF0b3IgY29uZmlndXJhdGlvbiAqIC0gYFNFQ1JFVF9FTkNSWVBUSU9OX0tFWWAgZW52OiBoZXgtIG9yIGJhc2U2NC1lbmNvZGVkIDMyLWJ5dGUgbWFzdGVyIGtleS5cbiAqIFJlcXVpcmVkIHdoZW4gYGVuY3J5cHRTZWNyZXRgL2BkZWNyeXB0U2VjcmV0YCBhcmUgY2FsbGVkLiBNaXNzaW5nIGtleVxuICogdGhyb3dzICBlbmNyeXB0aW9uIGlzIGZhaWwtY2xvc2VkOyB3ZSBuZXZlciBzaWxlbnRseSByb3VuZC10cmlwIGFcbiAqIHNlY3JldCBhcyBwbGFpbnRleHQuXG4gKlxuICogS01TIG1pZ3JhdGlvbiBwYXRoICogLSBUaGUgdHdvIGV4cG9ydGVkIGZ1bmN0aW9ucyB0YWtlIGEgYHByb3ZpZGVyYCBwYXJhbWV0ZXIuIFRoZSBkZWZhdWx0XG4gKiBgRW52S2V5UHJvdmlkZXJgIGltcGxlbWVudHMgSEtERiBkZXJpdmF0aW9uLiBBIGZ1dHVyZSBgQXdzS21zUHJvdmlkZXJgXG4gKiBwbHVncyBpbiBoZXJlOiBpdCBjYW4gY2FsbCBLTVMgYEVuY3J5cHRgIC8gYERlY3J5cHRgIHRvIHdyYXAgYSBERUtcbiAqIHJhdGhlciB0aGFuIGhvbGRpbmcgYSBtYXN0ZXIga2V5IGluIGVudi4gVGhlIG9uLWRpc2sgYmxvYiBzaGFwZVxuICogKGB7IGFsZywgaXYsIGNpcGhlcnRleHQsIGtpZD8gfWApIGlzIGZvcndhcmQtY29tcGF0aWJsZSAgYGtpZGBcbiAqIGNhcnJpZXMgdGhlIEtNUyBrZXkgaWQgd2hlbiB0aGUgcHJvdmlkZXIgbmVlZHMgaXQuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlQ2lwaGVyaXYsIGNyZWF0ZURlY2lwaGVyaXYsIGhrZGZTeW5jLCByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5cbi8qKiBPbi1kaXNrIHNoYXBlIG9mIGFuIGVuY3J5cHRlZCBzZWNyZXQuIEpTT04tc2VyaWFsaXphYmxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmNyeXB0ZWRCbG9iIHtcbiAgLyoqIEFsZ29yaXRobSB0YWcuIEJ1bXAgb24gZm9ybWF0IGNoYW5nZSBzbyBhIGZ1dHVyZSBtaWdyYXRpb24gY2FuIGRldGVjdCBvbGQgYmxvYnMuICovXG4gIGFsZzogJ2Flcy0yNTYtZ2NtLXYxJztcbiAgLyoqIEJhc2U2NC1lbmNvZGVkIDEyLWJ5dGUgSVYuICovXG4gIGl2OiBzdHJpbmc7XG4gIC8qKiBCYXNlNjQtZW5jb2RlZCBjaXBoZXJ0ZXh0ICsgMTYtYnl0ZSBhdXRoZW50aWNhdGlvbiB0YWcgY29uY2F0ZW5hdGVkLiAqL1xuICBjaXBoZXJ0ZXh0OiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBrZXkgaWQgIHBvcHVsYXRlZCBieSBLTVMtYmFja2VkIHByb3ZpZGVycywgaWdub3JlZCBieSB0aGUgZW52IHByb3ZpZGVyLiAqL1xuICBraWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBQbHVnZ2FibGUga2V5IHNvdXJjZS4gRW52LWJhY2tlZCBieSBkZWZhdWx0OyBLTVMtYmFja2VkIGF2YWlsYWJsZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2V5UHJvdmlkZXIge1xuICAvKiogRGVyaXZlIGEgMzItYnl0ZSBzeW1tZXRyaWMga2V5IGJvdW5kIHRvIGBvcmdJZGAuICovXG4gIGRlcml2ZUtleShvcmdJZDogc3RyaW5nKTogQnVmZmVyO1xuICAvKiogT3B0aW9uYWwgYXN5bmMgdmFyaWFudCBmb3IgcHJvdmlkZXJzIHRoYXQgbmVlZCB0byBkbyBJL08gKGUuZy5cbiAgICogIHBlci1vcmcgS01TIGxvb2t1cCB0aGUgZmlyc3QgdGltZSBhbiBvcmcgaXMgc2VlbikuIERlZmF1bHRcbiAgICogIGltcGxlbWVudGF0aW9uIGZvcndhcmRzIHRvIHRoZSBzeW5jIGBkZXJpdmVLZXlgLiAqL1xuICBkZXJpdmVLZXlBc3luYz8ob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPjtcbiAgLyoqIE9wdGlvbmFsIEtNUy1rZXktaWQgdGhpcyBwcm92aWRlciB1c2VkIGZvciBgb3JnSWRgLiBFbWJlZGRlZCBpbiB0aGVcbiAgICogIGBFbmNyeXB0ZWRCbG9iLmtpZGAgZmllbGQgb24gd3JpdGUgc28gZGVjcnlwdCBjYW4gdmVyaWZ5IHRoZSByaWdodFxuICAgKiAgS01TIENNSyBpcyBiZWluZyB1c2VkIChkZWZlbnNlIGFnYWluc3QgYW4gYXR0YWNrZXIgd2hvIHN3YXBzIGEgYmxvYlxuICAgKiAgYmV0d2VlbiBvcmdzKS4gRGVmYXVsdCByZXR1cm5zIHVuZGVmaW5lZCAoZW52IHByb3ZpZGVyKS4gKi9cbiAga2lkRm9yPyhvcmdJZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIERlZmF1bHQgcHJvdmlkZXIgIGRlcml2ZXMgYSBwZXItb3JnIGtleSBmcm9tIGBTRUNSRVRfRU5DUllQVElPTl9LRVlgIHZpYVxuICogSEtERi1TSEEyNTYuIFN1aXRhYmxlIGZvciBzZWxmLWhvc3RlZCAvIGRldiB3aGVyZSBvcGVyYXRvcnMgZG9uJ3QgaGF2ZSBLTVMuXG4gKlxuICogRmFpbHMgZmFzdCBpZiB0aGUgZW52IGlzIG1pc3Npbmcgb3IgdGhlIGtleSBpcyB0aGUgd3JvbmcgbGVuZ3RoIHNvIG1pc2NvbmZpZ1xuICogc3VyZmFjZXMgYXQgZmlyc3QgdXNlIHJhdGhlciB0aGFuIHNpbGVudGx5IGZpbmdlcnByaW50aW5nIGFsbCB3cml0ZXMgd2l0aFxuICogYSBkZWZhdWx0IHplcm8ga2V5LlxuICovXG5leHBvcnQgY2xhc3MgRW52S2V5UHJvdmlkZXIgaW1wbGVtZW50cyBLZXlQcm92aWRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFzdGVyS2V5OiBCdWZmZXI7XG5cbiAgY29uc3RydWN0b3IobWFzdGVyS2V5T3ZlcnJpZGU/OiBzdHJpbmcpIHtcbiAgICBjb25zdCByYXcgPSBtYXN0ZXJLZXlPdmVycmlkZSA/PyBwcm9jZXNzLmVudi5TRUNSRVRfRU5DUllQVElPTl9LRVk7XG4gICAgaWYgKCFyYXcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU0VDUkVUX0VOQ1JZUFRJT05fS0VZIGVudiBpcyByZXF1aXJlZCBmb3Igc2VjcmV0IGVuY3J5cHRpb24nKTtcbiAgICB9XG4gICAgLy8gQWNjZXB0IGVpdGhlciBoZXggKDY0IGNoYXJzKSBvciBiYXNlNjQgKDQ0IGNoYXJzIGluY2x1ZGluZyBwYWRkaW5nKSBmb3JcbiAgICAvLyBvcGVyYXRvciBjb252ZW5pZW5jZSAgYm90aCBkZWNvZGUgdG8gYSAzMi1ieXRlIGtleS5cbiAgICBjb25zdCBkZWNvZGVkID0gcmF3Lmxlbmd0aCA9PT0gNjQgJiYgL15bMC05YS1mXSskL2kudGVzdChyYXcpXG4gICAgICA/IEJ1ZmZlci5mcm9tKHJhdywgJ2hleCcpXG4gICAgICA6IEJ1ZmZlci5mcm9tKHJhdywgJ2Jhc2U2NCcpO1xuICAgIGlmIChkZWNvZGVkLmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU0VDUkVUX0VOQ1JZUFRJT05fS0VZIG11c3QgZGVjb2RlIHRvIDMyIGJ5dGVzIChnb3QgJHtkZWNvZGVkLmxlbmd0aH0pYCk7XG4gICAgfVxuICAgIHRoaXMubWFzdGVyS2V5ID0gZGVjb2RlZDtcbiAgfVxuXG4gIGRlcml2ZUtleShvcmdJZDogc3RyaW5nKTogQnVmZmVyIHtcbiAgICAvLyBIS0RGIGJpbmRzIHRoZSBtYXN0ZXIga2V5IHRvIHRoZSBvcmcgc28gdHdvIG9yZ3MgZW5jcnlwdGluZyB0aGUgc2FtZVxuICAgIC8vIHBsYWludGV4dCBwcm9kdWNlIGRpZmZlcmVudCBjaXBoZXJ0ZXh0cyAga2VlcHMgYSBzdG9sZW4gREIgdW5hYmxlIHRvXG4gICAgLy8gdGVsbCB3aGljaCBvcmdzIHNoYXJlIHNlY3JldHMgdmlhIGNpcGhlcnRleHQgY29tcGFyaXNvbi5cbiAgICBjb25zdCBkZXJpdmVkID0gaGtkZlN5bmMoICdzaGEyNTYnLFxuICAgICAgdGhpcy5tYXN0ZXJLZXksXG4gICAgICBCdWZmZXIuZnJvbShvcmdJZCwgJ3V0ZjgnKSxcbiAgICAgICdzZWNyZXRzLXYxJyxcbiAgICAgIDMyLFxuICAgICk7XG4gICAgLy8gaGtkZlN5bmMgcmV0dXJucyBBcnJheUJ1ZmZlciBpbiBvbGRlciBOb2RlIHR5cGluZ3M7IG5vcm1hbGl6ZSB0byBCdWZmZXIuXG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRlcml2ZWQpO1xuICB9XG59XG5cbi8qKlxuICogIEFXUy1LTVMtYmFja2VkIEtleVByb3ZpZGVyLlxuICpcbiAqIFRyYWRlLW9mZiBwaWNrZWQ6IHN0b3JlIE9ORSBtYXN0ZXIga2V5IGVuY3J5cHRlZCB1bmRlciBhIEtNUyBDTUs7IG9uXG4gKiBmaXJzdCB1c2UsIGNhbGwgYGttczpEZWNyeXB0YCB0byByZWNvdmVyIHRoZSBtYXN0ZXIga2V5IGJ5dGVzOyBIS0RGLVxuICogZGVyaXZlIHBlci1vcmcgZnJvbSBpdCAoc2FtZSBhcyBFbnZLZXlQcm92aWRlcikuIFRoZSBwcm9jZXNzIHRoZW4gaG9sZHNcbiAqIHRoZSBwbGFpbnRleHQgbWFzdGVyIGtleSBpbiBtZW1vcnkgdW50aWwgcmVzdGFydC5cbiAqXG4gKiBQUk9TOiBvbmUgS01TIGNhbGwgcGVyIHByb2Nlc3MgbGlmZXRpbWUgKGNoZWFwLCBsb3cgcDk5IGltcGFjdCksXG4gKiB0aGUgZW5jcnlwdGVkLW1hc3Rlci1rZXkgYmxvYiBpcyBzYWZlIHRvIGNvbW1pdC9sb2cvY2hlY2tpbixcbiAqIEtNUyBhdWRpdCBsb2cgcmVjb3JkcyB3aGVuIHRoZSBtYXN0ZXIgaXMgcmVjb3ZlcmVkLlxuICogQ09OUzogcHJvY2VzcyBtZW1vcnkgc3RpbGwgaG9sZHMgdGhlIG1hc3RlciBrZXkgIHNhbWUgcG9zdHVyZSBhc1xuICogRW52S2V5UHJvdmlkZXIgb25jZSB3YXJtZWQgdXAuIEZvciBzdHJvbmdlciBpc29sYXRpb24gYW5cbiAqIG9wZXJhdG9yIGNhbiBtb3ZlIHRvIHBlci1yZWNvcmQgZW52ZWxvcGUgZW5jcnlwdGlvbiAoY2FsbFxuICogR2VuZXJhdGVEYXRhS2V5IG9uIGV2ZXJ5IHdyaXRlKTsgdGhhdCdzIGEgZm9sbG93LW9uLlxuICpcbiAqIE9wZXJhdG9yIHNldHVwICogMS4gQ3JlYXRlIGEgS01TIENNSyB3aXRoIGtleSBwb2xpY3kgYWxsb3dpbmcgdGhlIHBsYXRmb3JtIHNlcnZpY2Unc1xuICogSUFNIHJvbGUga21zOkRlY3J5cHQuXG4gKiAyLiBHZW5lcmF0ZSBhIHJhbmRvbSAzMi1ieXRlIG1hc3RlciAqIGhlYWQgLWMgMzIgL2Rldi91cmFuZG9tIHwgYmFzZTY0XG4gKiAzLiBXcmFwIGl0IHdpdGggS01TICogYXdzIGttcyBlbmNyeXB0IC0ta2V5LWlkIDxLRVlfSUQ+IFxcXG4gKiAtLXBsYWludGV4dCA8YmFzZTY0LWZyb20tc3RlcC0yPiAtLW91dHB1dCB0ZXh0IFxcXG4gKiAtLXF1ZXJ5IENpcGhlcnRleHRCbG9iXG4gKiA0LiBTZXQgb24gdGhlIHNlcnZpY2UgKiBTRUNSRVRfRU5DUllQVElPTl9LTVNfS0VZX0lEPTxLRVlfSUQ+XG4gKiBTRUNSRVRfRU5DUllQVElPTl9LTVNfQ0lQSEVSVEVYVD08YmFzZTY0LW91dHB1dC1vZi1zdGVwLTM+XG4gKiA1LiBQaWNrIHRoaXMgcHJvdmlkZXIgdmlhIGBzZXRLZXlQcm92aWRlcihuZXcgS21zS2V5UHJvdmlkZXIoKSlgLlxuICpcbiAqIENvbnN0cnVjdCBsYXppbHkgIGltcG9ydGluZyB0aGUgQVdTIFNESyBoYXMgYSBub24tdHJpdmlhbCBjb2xkLXN0YXJ0XG4gKiBjb3N0IHNvIGVudnMgdGhhdCBzdGF5IG9uIEVudktleVByb3ZpZGVyIG5ldmVyIGxvYWQgaXQuXG4gKi9cbi8qKlxuICogS01TLWRlY3J5cHQgYSBiYXNlNjQgY2lwaGVydGV4dCBpbnRvIGEgMzItYnl0ZSBrZXkuIFNoYXJlZCBieSBib3RoIEtNUyBrZXlcbiAqIHByb3ZpZGVycyAoc2luZ2xlLW1hc3RlciArIHBlci1vcmcpLiBgQGF3cy1zZGsvY2xpZW50LWttc2AgaXNcbiAqIGR5bmFtaWNhbGx5IGltcG9ydGVkIHNvIEVudktleVByb3ZpZGVyLW9ubHkgZW52cyBuZXZlciBsb2FkIHRoZSBTREsuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGttc0RlY3J5cHQzMihrZXlJZDogc3RyaW5nLCBjaXBoZXJ0ZXh0QjY0OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgZW5kcG9pbnQ/OiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICBjb25zdCB7IEtNU0NsaWVudCwgRGVjcnlwdENvbW1hbmQgfSA9IGF3YWl0IGltcG9ydCgnQGF3cy1zZGsvY2xpZW50LWttcycpO1xuICBjb25zdCBjbGllbnQgPSBuZXcgS01TQ2xpZW50KHsgcmVnaW9uLCAuLi4oZW5kcG9pbnQgPyB7IGVuZHBvaW50IH0gOiB7fSkgfSk7XG4gIGNvbnN0IHJlc3AgPSBhd2FpdCBjbGllbnQuc2VuZChuZXcgRGVjcnlwdENvbW1hbmQoe1xuICAgIEtleUlkOiBrZXlJZCxcbiAgICBDaXBoZXJ0ZXh0QmxvYjogQnVmZmVyLmZyb20oY2lwaGVydGV4dEI2NCwgJ2Jhc2U2NCcpLFxuICB9KSk7XG4gIGlmICghcmVzcC5QbGFpbnRleHQpIHRocm93IG5ldyBFcnJvcihgS01TIERlY3J5cHQgcmV0dXJuZWQgYW4gZW1wdHkgUGxhaW50ZXh0IGZvciBrZXkgJHtrZXlJZH1gKTtcbiAgY29uc3QgYnVmID0gQnVmZmVyLmZyb20ocmVzcC5QbGFpbnRleHQpO1xuICBpZiAoYnVmLmxlbmd0aCAhPT0gMzIpIHRocm93IG5ldyBFcnJvcihgS01TIERlY3J5cHQgcmV0dXJuZWQgJHtidWYubGVuZ3RofS1ieXRlIGtleSBmb3IgJHtrZXlJZH07IGV4cGVjdGVkIDMyYCk7XG4gIHJldHVybiBidWY7XG59XG5cbmV4cG9ydCBjbGFzcyBLbXNLZXlQcm92aWRlciBpbXBsZW1lbnRzIEtleVByb3ZpZGVyIHtcbiAgcHJpdmF0ZSBtYXN0ZXJLZXlDYWNoZTogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkga2V5SWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBjaXBoZXJ0ZXh0QjY0OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaW9uPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGVuZHBvaW50Pzogc3RyaW5nO1xuICBwcml2YXRlIGRlY3J5cHRJbkZsaWdodDogUHJvbWlzZTxCdWZmZXI+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3Iob3B0cz86IHsga2V5SWQ/OiBzdHJpbmc7IGNpcGhlcnRleHRCYXNlNjQ/OiBzdHJpbmc7IHJlZ2lvbj86IHN0cmluZzsgZW5kcG9pbnQ/OiBzdHJpbmcgfSkge1xuICAgIGNvbnN0IGtleUlkID0gb3B0cz8ua2V5SWQgPz8gcHJvY2Vzcy5lbnYuU0VDUkVUX0VOQ1JZUFRJT05fS01TX0tFWV9JRDtcbiAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gb3B0cz8uY2lwaGVydGV4dEJhc2U2NCA/PyBwcm9jZXNzLmVudi5TRUNSRVRfRU5DUllQVElPTl9LTVNfQ0lQSEVSVEVYVDtcbiAgICBpZiAoIWtleUlkKSB0aHJvdyBuZXcgRXJyb3IoJ1NFQ1JFVF9FTkNSWVBUSU9OX0tNU19LRVlfSUQgZW52IGlzIHJlcXVpcmVkIGZvciBLbXNLZXlQcm92aWRlcicpO1xuICAgIGlmICghY2lwaGVydGV4dCkgdGhyb3cgbmV3IEVycm9yKCdTRUNSRVRfRU5DUllQVElPTl9LTVNfQ0lQSEVSVEVYVCBlbnYgaXMgcmVxdWlyZWQgZm9yIEttc0tleVByb3ZpZGVyJyk7XG4gICAgdGhpcy5rZXlJZCA9IGtleUlkO1xuICAgIHRoaXMuY2lwaGVydGV4dEI2NCA9IGNpcGhlcnRleHQ7XG4gICAgdGhpcy5yZWdpb24gPSBvcHRzPy5yZWdpb24gPz8gcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiA/PyBwcm9jZXNzLmVudi5BV1NfREVGQVVMVF9SRUdJT047XG4gICAgdGhpcy5lbmRwb2ludCA9IG9wdHM/LmVuZHBvaW50ID8/IHByb2Nlc3MuZW52LkFXU19LTVNfRU5EUE9JTlQ7XG4gIH1cblxuICBkZXJpdmVLZXkob3JnSWQ6IHN0cmluZyk6IEJ1ZmZlciB7XG4gICAgaWYgKCF0aGlzLm1hc3RlcktleUNhY2hlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoICdLbXNLZXlQcm92aWRlciBpcyBub3Qgd2FybWVkIHVwLiBDYWxsIGBhd2FpdCBwcm92aWRlci53YXJtdXAoKWAgb25jZSBhdCBzZXJ2aWNlIHN0YXJ0dXAgYmVmb3JlIGFueSBlbmNyeXB0L2RlY3J5cHQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGRlcml2ZWQgPSBoa2RmU3luYygnc2hhMjU2JywgdGhpcy5tYXN0ZXJLZXlDYWNoZSwgQnVmZmVyLmZyb20ob3JnSWQsICd1dGY4JyksICdzZWNyZXRzLXYxJywgMzIpO1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShkZXJpdmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFYWdlcmx5IHJlY292ZXIgdGhlIG1hc3RlciBrZXkgZnJvbSBLTVMgc28gc3Vic2VxdWVudCBgZGVyaXZlS2V5YFxuICAgKiBjYWxscyBhcmUgc3luYy4gSWRlbXBvdGVudCAgY29uY3VycmVudCBjYWxsZXJzIHNoYXJlIHRoZSBzYW1lIGluLVxuICAgKiBmbGlnaHQgcHJvbWlzZSBzbyB3ZSBkb24ndCBzcGF3biBtdWx0aXBsZSBLTVMgRGVjcnlwdCByZXF1ZXN0cyBhdFxuICAgKiBib290LiBUaHJvd3Mgb24gYW55IEtNUyBmYWlsdXJlOyB0aGUgY2FsbGVyICh0eXBpY2FsbHkgdGhlIHNlcnZpY2Unc1xuICAgKiBvbkJlZm9yZVN0YXJ0IGhvb2spIGRlY2lkZXMgd2hldGhlciB0byBmYWxsIGJhY2sgdG8gYSBkaWZmZXJlbnRcbiAgICogcHJvdmlkZXIgb3IgZmFpbC1zdGFydHVwLlxuICAgKi9cbiAgYXN5bmMgd2FybXVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm1hc3RlcktleUNhY2hlKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmRlY3J5cHRJbkZsaWdodCkge1xuICAgICAgdGhpcy5kZWNyeXB0SW5GbGlnaHQgPSB0aGlzLmZldGNoQW5kRGVjcnlwdCgpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy5tYXN0ZXJLZXlDYWNoZSA9IGF3YWl0IHRoaXMuZGVjcnlwdEluRmxpZ2h0O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gQSB0cmFuc2llbnQgS01TIGZhaWx1cmUgbXVzdCBub3QgcGVybWFuZW50bHkgcG9pc29uIHRoZSBwcm92aWRlcjogY2xlYXJcbiAgICAgIC8vIHRoZSByZWplY3RlZCBpbi1mbGlnaHQgcHJvbWlzZSBzbyBhIGxhdGVyIHdhcm11cCgpIHJldHJpZXMgaW5zdGVhZCBvZlxuICAgICAgLy8gcmUtYXdhaXRpbmcgdGhlIHNhbWUgcmVqZWN0aW9uIGZvcmV2ZXIgKG1hdGNoZXMgUGVyT3JnS21zS2V5UHJvdmlkZXIpLlxuICAgICAgdGhpcy5kZWNyeXB0SW5GbGlnaHQgPSBudWxsO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmV0Y2hBbmREZWNyeXB0KCk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgcmV0dXJuIGttc0RlY3J5cHQzMih0aGlzLmtleUlkLCB0aGlzLmNpcGhlcnRleHRCNjQsIHRoaXMucmVnaW9uLCB0aGlzLmVuZHBvaW50KTtcbiAgfVxufVxuXG4vLyBMYXp5IHNpbmdsZXRvbiAgb3BlcmF0b3IgY29kZSBpbiBsb25nLWxpdmVkIHNlcnZpY2VzIHBheXMgdGhlIGVudi1wYXJzZVxuLy8gY29zdCBvbmNlLCBhbmQgdGVzdHMgY2FuIG1pbnQgdGhlaXIgb3duIHByb3ZpZGVyIHdpdGggYSBsaXRlcmFsIGtleS5cbmxldCBkZWZhdWx0UHJvdmlkZXI6IEtleVByb3ZpZGVyIHwgbnVsbCA9IG51bGw7XG5mdW5jdGlvbiBnZXREZWZhdWx0UHJvdmlkZXIoKTogS2V5UHJvdmlkZXIge1xuICBpZiAoIWRlZmF1bHRQcm92aWRlcikgZGVmYXVsdFByb3ZpZGVyID0gbmV3IEVudktleVByb3ZpZGVyKCk7XG4gIHJldHVybiBkZWZhdWx0UHJvdmlkZXI7XG59XG5cbi8qKiBSZWFkIHRoZSBhY3RpdmUgZGVmYXVsdCBwcm92aWRlci4gRXhwb3NlZCBzbyBzZXJ2aWNlIGNvZGUgKGUuZy4gYW5cbiAqICBhZG1pbiBlbmRwb2ludCB0aGF0IGp1c3Qgcm90YXRlZCBhbiBvcmcncyBLTVMgY29uZmlnKSBjYW4gY2FsbFxuICogIGBwcm92aWRlci5ldmljdChvcmdJZClgIG9uIHRoZSBsaXZlIHByb3ZpZGVyIHJhdGhlciB0aGFuIHJlY29uc3RydWN0aW5nXG4gKiAgb25lLiBUcmlnZ2VycyBsYXp5IGluaXRpYWxpemF0aW9uIG9uIGZpcnN0IGFjY2Vzcywgc2FtZSBhcyB0aGUgaW50ZXJuYWxcbiAqICBjYWxsZXJzIGJlbG93LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRLZXlQcm92aWRlcigpOiBLZXlQcm92aWRlciB7XG4gIHJldHVybiBnZXREZWZhdWx0UHJvdmlkZXIoKTtcbn1cblxuLyoqXG4gKiBSb3RhdGlvbiBmYWxsYmFjazogYW4gYEVudktleVByb3ZpZGVyYCBvdmVyIGBTRUNSRVRfRU5DUllQVElPTl9LRVlfUFJFVklPVVNgLFxuICogb3IgbnVsbCB3aGVuIHRoYXQgZW52IGlzIHVuc2V0LiBgdW5kZWZpbmVkYCA9IG5vdCB5ZXQgcmVzb2x2ZWQuIFdoaWxlIGFcbiAqIG1hc3Rlci1rZXkgcm90YXRpb24gaXMgaW4gcHJvZ3Jlc3MsIGBkZWNyeXB0U2VjcmV0YCByZXRyaWVzIGEgZmFpbGVkIGRlY3J5cHRcbiAqIHVuZGVyIHRoaXMga2V5LCBzbyByb3dzIHdyaXR0ZW4gdW5kZXIgdGhlIG9sZCBtYXN0ZXIgc3RheSByZWFkYWJsZSB1bnRpbCB0aGVcbiAqIHJlLWVuY3J5cHRpb24gdG9vbCAocGxhdGZvcm0gYHNjcmlwdHMvcmVlbmNyeXB0LXNlY3JldHMuanNgKSBoYXMgcmV3cml0dGVuXG4gKiB0aGVtIHVuZGVyIHRoZSBuZXcgb25lLiBFbmNyeXB0aW9uIE5FVkVSIHVzZXMgaXQuXG4gKi9cbmxldCBwcmV2aW91c1Byb3ZpZGVyOiBLZXlQcm92aWRlciB8IG51bGwgfCB1bmRlZmluZWQ7XG5mdW5jdGlvbiBnZXRQcmV2aW91c1Byb3ZpZGVyKCk6IEtleVByb3ZpZGVyIHwgbnVsbCB7XG4gIGlmIChwcmV2aW91c1Byb3ZpZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCByYXcgPSBwcm9jZXNzLmVudi5TRUNSRVRfRU5DUllQVElPTl9LRVlfUFJFVklPVVM7XG4gICAgcHJldmlvdXNQcm92aWRlciA9IHJhdyA/IG5ldyBFbnZLZXlQcm92aWRlcihyYXcpIDogbnVsbDtcbiAgfVxuICByZXR1cm4gcHJldmlvdXNQcm92aWRlcjtcbn1cblxuLyoqIFJlc2V0IHRoZSBjYWNoZWQgZGVmYXVsdCAoYW5kIHByZXZpb3VzKSBwcm92aWRlciAgZm9yIHRlc3RzIHRoYXQgbXV0YXRlIGBwcm9jZXNzLmVudmAuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXREZWZhdWx0S2V5UHJvdmlkZXIoKTogdm9pZCB7IGRlZmF1bHRQcm92aWRlciA9IG51bGw7IHByZXZpb3VzUHJvdmlkZXIgPSB1bmRlZmluZWQ7IH1cblxuLyoqIFJlcGxhY2UgdGhlIGRlZmF1bHQgcHJvdmlkZXIgIHNlcnZpY2VzIHRoYXQgb3B0IGludG8gS01TIGNhbGwgdGhpc1xuICogb25jZSBhdCBzdGFydHVwIHdpdGggYSB3YXJtZWQtdXAgYEttc0tleVByb3ZpZGVyYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRLZXlQcm92aWRlcihwcm92aWRlcjogS2V5UHJvdmlkZXIpOiB2b2lkIHsgZGVmYXVsdFByb3ZpZGVyID0gcHJvdmlkZXI7IH1cblxuLyoqIFBlci1vcmcgS01TIGNvbmZpZyB0aGUgb3BlcmF0b3Igc3VwcGxpZXMuIFRoZSBga2V5SWRgIGlkZW50aWZpZXMgdGhlXG4gKiAgS01TIENNSyB0byBjYWxsIERlY3J5cHQgb247IGBjaXBoZXJ0ZXh0QmFzZTY0YCBpcyB0aGUgd3JhcHBlZCAzMi1ieXRlXG4gKiAgbWFzdGVyIGdlbmVyYXRlZCBieSBgYXdzIGttcyBlbmNyeXB0YCBhZ2FpbnN0IHRoYXQga2V5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZXJPcmdLbXNDb25maWcge1xuICBrZXlJZDogc3RyaW5nO1xuICBjaXBoZXJ0ZXh0QmFzZTY0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQXN5bmMgcmVzb2x2ZXIgdGhhdCBtYXBzIGFuIG9yZyBpZCB0byBpdHMgS01TIGNvbmZpZy4gUmV0dXJucyBgbnVsbGAgd2hlblxuICogdGhlIG9yZyBoYXMgbm8gcGVyLW9yZyBjb25maWcg4oCUIHRoZSBwcm92aWRlciB0aGVuIGZhbGxzIGJhY2sgdG8gdGhlXG4gKiBgZmFsbGJhY2tgIHByb3ZpZGVyIHN1cHBsaWVkIGF0IGNvbnN0cnVjdGlvbiAodXN1YWxseSBhbiBFbnZLZXlQcm92aWRlclxuICogb3IgYSBkZWZhdWx0IEttc0tleVByb3ZpZGVyKS5cbiAqL1xuZXhwb3J0IHR5cGUgUGVyT3JnS21zUmVzb2x2ZXIgPSAob3JnSWQ6IHN0cmluZykgPT4gUHJvbWlzZTxQZXJPcmdLbXNDb25maWcgfCBudWxsPjtcblxuLyoqXG4gKiBQZXItb3JnIEtNUy1iYWNrZWQgS2V5UHJvdmlkZXIuIFRoZSBibGFzdCByYWRpdXMgb2YgYSBLTVMga2V5IGNvbXByb21pc2VcbiAqIGlzIG9uZSBvcmcgaW5zdGVhZCBvZiBldmVyeSBvcmcgdW5kZXIgYSBzaGFyZWQgbWFzdGVyLlxuICpcbiAqIEVhY2ggb3JnIGhhcyBpdHMgb3duIEtNUyBDTUsgKyBpdHMgb3duIHdyYXBwZWQgbWFzdGVyIChzdG9yZWQgaW4gTW9uZ29cbiAqIHZpYSB0aGUgb3BlcmF0b3IncyBzZXR1cCBzY3JpcHQpLiBPbiBmaXJzdCBlbmNyeXB0L2RlY3J5cHQgZm9yIGFuIG9yZyxcbiAqIHRoZSBwcm92aWRlcjpcbiAqICAgMS4gQ2FsbHMgdGhlIHJlc29sdmVyIHRvIGZldGNoIHRoZSBvcmcncyBLTVMgY29uZmlnLlxuICogICAyLiBDYWxscyBga21zOkRlY3J5cHRgIHRvIHJlY292ZXIgdGhlIDMyLWJ5dGUgbWFzdGVyLlxuICogICAzLiBDYWNoZXMgdGhlIHJlY292ZXJlZCBtYXN0ZXIgaW4tbWVtb3J5IGZvciB0aGUgcHJvY2VzcyBsaWZldGltZS5cbiAqICAgNC4gSEtERi1kZXJpdmVzIHBlci1jYWxsIGZyb20gdGhhdCBtYXN0ZXIgKyB0aGUgb3JnIGlkIHNhbHQuXG4gKlxuICogQmxvYnMgZW5jcnlwdGVkIGJ5IHRoaXMgcHJvdmlkZXIgY2FycnkgYGtpZCA9IDxrbXMta2V5LWlkPmAgc28gdGhlXG4gKiBkZWNyeXB0IHBhdGggZGV0ZWN0cyBhIHN0YWxlIGNvbmZpZyAob3BlcmF0b3Igcm90YXRlZCB0aGUga2V5IGJ1dFxuICogZXhpc3Rpbmcgcm93cyB3ZXJlbid0IHJlLWVuY3J5cHRlZCkgQkVGT1JFIEFFUy1HQ00gdGhyb3dzIGFuIG9wYXF1ZVxuICogYXV0aGVudGljYXRpb24tdGFnIGVycm9yLlxuICpcbiAqIE9yZ3Mgd2l0aG91dCBwZXItb3JnIGNvbmZpZyBmYWxsIHRocm91Z2ggdG8gdGhlIGBmYWxsYmFja2AgcHJvdmlkZXIg4oCUXG4gKiBtaXhlZC1tb2RlIGRlcGxveW1lbnRzIHdoZXJlIHNvbWUgb3JncyBoYXZlIEtNUyBpc29sYXRpb24gYW5kIG90aGVyc1xuICogc3RheSBvbiB0aGUgc2hhcmVkIG1hc3RlciBhcmUgZXhwbGljaXRseSBzdXBwb3J0ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBQZXJPcmdLbXNLZXlQcm92aWRlciBpbXBsZW1lbnRzIEtleVByb3ZpZGVyIHtcbiAgLyoqIENhY2hlZCBwZXItb3JnIG1hc3RlciBrZXlzLCBrZXllZCBieSBvcmdJZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBtYXN0ZXJzID0gbmV3IE1hcDxzdHJpbmcsIHsga2V5OiBCdWZmZXI7IGtpZDogc3RyaW5nIH0+KCk7XG4gIC8qKiBSZXNvbHZlZCBwZXItb3JnIGNvbmZpZ3MgY2FjaGVkIGZvciB0aGUgcHJvY2VzcyBsaWZldGltZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWdzID0gbmV3IE1hcDxzdHJpbmcsIFBlck9yZ0ttc0NvbmZpZz4oKTtcbiAgLyoqIEluLWZsaWdodCByZXNvbHZlciBwcm9taXNlcyBzbyBjb25jdXJyZW50IGZpcnN0LXRvdWNoIGNhbGxlcnMgc2hhcmUgb25lIEtNUyBEZWNyeXB0LlxuICAgKiAgUmVzb2x2ZXMgdG8gYG51bGxgIGZvciBvcmdzIHdpdGggbm8gcGVyLW9yZyBjb25maWcg4oCUIGNhbGxlciB0cmVhdHMgbnVsbCBhc1xuICAgKiAgXCJmYWxsIHRocm91Z2ggdG8gdGhlIGZhbGxiYWNrIHByb3ZpZGVyXCIsIHNhbWUgYXMgYSBjb2xkIGNhY2hlIG1pc3MuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5GbGlnaHQgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx7IGtleTogQnVmZmVyOyBraWQ6IHN0cmluZyB9IHwgbnVsbD4+KCk7XG4gIC8qKiBPcmdzIHRoZSByZXNvbHZlciBoYXMgUFJPVkVOIGhhdmUgbm8gcGVyLW9yZyBjb25maWcg4oCUIHRoZSBmYWxsYmFjayBwcm92aWRlclxuICAgKiAgaXMgdGhlIGNvcnJlY3QgYW5zd2VyIGZvciB0aGVzZSwgYW5kIGBkZXJpdmVLZXlgIG1heSBzZXJ2ZSB0aGVtXG4gICAqICBzeW5jaHJvbm91c2x5LiBEaXN0aW5jdCBmcm9tIFwibm90IHlldCByZXNvbHZlZFwiLCB3aGljaCBtdXN0IG5vdCBndWVzcy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZXNvbHZlZE5vUGVyT3JnQ29uZmlnID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8qKiBQcm92aWRlciB1c2VkIGZvciBvcmdzIHRoYXQgaGF2ZSBubyBwZXItb3JnIGNvbmZpZy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBmYWxsYmFjazogS2V5UHJvdmlkZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZXI6IFBlck9yZ0ttc1Jlc29sdmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvbj86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBlbmRwb2ludD86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRzOiB7XG4gICAgcmVzb2x2ZXI6IFBlck9yZ0ttc1Jlc29sdmVyO1xuICAgIGZhbGxiYWNrOiBLZXlQcm92aWRlcjtcbiAgICByZWdpb24/OiBzdHJpbmc7XG4gICAgZW5kcG9pbnQ/OiBzdHJpbmc7XG4gIH0pIHtcbiAgICB0aGlzLnJlc29sdmVyID0gb3B0cy5yZXNvbHZlcjtcbiAgICB0aGlzLmZhbGxiYWNrID0gb3B0cy5mYWxsYmFjaztcbiAgICB0aGlzLnJlZ2lvbiA9IG9wdHMucmVnaW9uID8/IHByb2Nlc3MuZW52LkFXU19SRUdJT04gPz8gcHJvY2Vzcy5lbnYuQVdTX0RFRkFVTFRfUkVHSU9OO1xuICAgIHRoaXMuZW5kcG9pbnQgPSBvcHRzLmVuZHBvaW50ID8/IHByb2Nlc3MuZW52LkFXU19LTVNfRU5EUE9JTlQ7XG4gIH1cblxuICAvKipcbiAgICogU3luYyBkZXJpdmUuIE9ubHkgY29ycmVjdCBmb3IgYW4gb3JnIHdob3NlIGNvbmZpZyBoYXMgYWxyZWFkeSBiZWVuXG4gICAqIFJFU09MVkVEIOKAlCBlaXRoZXIgaXQgaGFzIGEgcGVyLW9yZyBtYXN0ZXIgKHVzZSBpdCkgb3IgaXQgcHJvdmFibHkgaGFzIG5vXG4gICAqIHBlci1vcmcgY29uZmlnICh0aGUgZmFsbGJhY2sgaXMgdGhlbiB0aGUgcmlnaHQgYW5zd2VyKS5cbiAgICpcbiAgICogRm9yIGFuIFVOUkVTT0xWRUQgb3JnIHRoaXMgVEhST1dTIHJhdGhlciB0aGFuIGd1ZXNzaW5nLiBGYWxsaW5nIHRocm91Z2ggdG9cbiAgICogdGhlIGZhbGxiYWNrIHdvdWxkIHNpbGVudGx5IGVuY3J5cHQgdGhhdCBvcmcncyBzZWNyZXRzIHVuZGVyIHRoZSBTSEFSRURcbiAgICogbWFzdGVyIGFuZCDigJQgYmVjYXVzZSBga2lkRm9yYCBhbHNvIHJldHVybnMgdW5kZWZpbmVkLCBzbyB0aGVcbiAgICogYm90aC1raWRzLXByZXNlbnQgbWlzbWF0Y2ggZ3VhcmQgY291bGQgbmV2ZXIgZmlyZSDigJQgbGVhdmUgdGhlbSBwZXJtYW5lbnRseVxuICAgKiB1bmRlY3J5cHRhYmxlIG9uY2UgdGhlIG9yZyB3YXJtZWQgKGBkZWNpcGhlci5maW5hbCgpYCB0aHJvd3MgYW4gb3BhcXVlXG4gICAqIGF1dGgtdGFnIGVycm9yIHdpdGggbm8gZGlhZ25vc3RpYykuIEZhaWxpbmcgbG91ZCBoZXJlIG1hdGNoZXNcbiAgICogYEttc0tleVByb3ZpZGVyLmRlcml2ZUtleWAsIHdoaWNoIHJlZnVzZXMgdG8gd29yayBjb2xkLlxuICAgKlxuICAgKiBgZW5jcnlwdFNlY3JldGAvYGRlY3J5cHRTZWNyZXRgIGFyZSBhc3luYyBhbmQgYXdhaXQgYGRlcml2ZUtleUFzeW5jYCwgc29cbiAgICogdGhleSByZXNvbHZlIHRoZSBvcmcgZmlyc3QgYW5kIG5ldmVyIGhpdCB0aGlzIHBhdGg7IGl0IGlzIHRoZSBiYWNrc3RvcCBmb3JcbiAgICogYSBjYWxsZXIgdGhhdCByZWFjaGVzIGZvciB0aGUgc3luYyBBUEkgZGlyZWN0bHkuXG4gICAqL1xuICBkZXJpdmVLZXkob3JnSWQ6IHN0cmluZyk6IEJ1ZmZlciB7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5tYXN0ZXJzLmdldChvcmdJZCk7XG4gICAgaWYgKCFjYWNoZWQpIHtcbiAgICAgIGlmICh0aGlzLnJlc29sdmVkTm9QZXJPcmdDb25maWcuaGFzKG9yZ0lkKSkgcmV0dXJuIHRoaXMuZmFsbGJhY2suZGVyaXZlS2V5KG9yZ0lkKTtcbiAgICAgIHRocm93IG5ldyBFcnJvciggYFBlck9yZ0ttc0tleVByb3ZpZGVyIGhhcyBub3QgcmVzb2x2ZWQgb3JnICR7b3JnSWR9LiBgXG4gICAgICAgICsgJ0NhbGwgYGF3YWl0IHByb3ZpZGVyLmVuc3VyZVdhcm1lZChvcmdJZClgIChvciB1c2UgdGhlIGFzeW5jIGVuY3J5cHRTZWNyZXQvZGVjcnlwdFNlY3JldCkgJ1xuICAgICAgICArICdiZWZvcmUgZGVyaXZpbmcgYSBrZXkg4oCUIGd1ZXNzaW5nIHRoZSBzaGFyZWQgbWFzdGVyIHdvdWxkIHdyaXRlIHNlY3JldHMgdGhhdCBjYW5ub3QgYmUgZGVjcnlwdGVkIGxhdGVyLicsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBkZXJpdmVkID0gaGtkZlN5bmMoJ3NoYTI1NicsIGNhY2hlZC5rZXksIEJ1ZmZlci5mcm9tKG9yZ0lkLCAndXRmOCcpLCAnc2VjcmV0cy12MScsIDMyKTtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oZGVyaXZlZCk7XG4gIH1cblxuICBhc3luYyBkZXJpdmVLZXlBc3luYyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVdhcm1lZChvcmdJZCk7XG4gICAgcmV0dXJuIHRoaXMuZGVyaXZlS2V5KG9yZ0lkKTtcbiAgfVxuXG4gIGtpZEZvcihvcmdJZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLm1hc3RlcnMuZ2V0KG9yZ0lkKTtcbiAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkLmtpZDtcbiAgICAvLyBPbmx5IHNwZWFrIGZvciBhbiBvcmcgd2hvc2UgY29uZmlnIGlzIHJlc29sdmVkOyBhbiB1bnJlc29sdmVkIG9yZyBoYXMgbm9cbiAgICAvLyBtZWFuaW5nZnVsIGtpZCwgYW5kIGNsYWltaW5nIG9uZSB3b3VsZCBkZWZlYXQgdGhlIG1pc21hdGNoIGd1YXJkLlxuICAgIGlmICh0aGlzLnJlc29sdmVkTm9QZXJPcmdDb25maWcuaGFzKG9yZ0lkKSkgcmV0dXJuIHRoaXMuZmFsbGJhY2sua2lkRm9yPy4ob3JnSWQpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgb3JnJ3MgS01TIGNvbmZpZywgY2FsbCBEZWNyeXB0LCBjYWNoZSB0aGUgbWFzdGVyLiBTdWJzZXF1ZW50XG4gICAqIGNhbGxzIGZvciB0aGUgc2FtZSBvcmcgYXJlIG5vLW9wcy4gQ29uY3VycmVudCBjYWxsZXJzIHNoYXJlIHRoZSBpbi1mbGlnaHRcbiAgICogRGVjcnlwdCBwcm9taXNlLlxuICAgKlxuICAgKiBSZXR1cm5zIHNpbGVudGx5IHdoZW4gdGhlIG9yZyBoYXMgbm8gcGVyLW9yZyBjb25maWcg4oCUIHRoZSBmYWxsYmFja1xuICAgKiBwcm92aWRlciBoYW5kbGVzIHRob3NlIG9yZ3MuXG4gICAqL1xuICBhc3luYyBlbnN1cmVXYXJtZWQob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm1hc3RlcnMuaGFzKG9yZ0lkKSkgcmV0dXJuO1xuICAgIC8vIEluc3RhbGwgdGhlIGluLWZsaWdodCBwcm9taXNlIFNZTkNIUk9OT1VTTFkgYmVmb3JlIHlpZWxkaW5nIHNvIGNvbmN1cnJlbnRcbiAgICAvLyBjYWxsZXJzIGZpbmQgaXQgb24gdGhlIHNlY29uZC1hbmQtbGF0ZXIgcGFzc2VzLiBBd2FpdGluZyB0aGUgcmVzb2x2ZXJcbiAgICAvLyBiZWZvcmUgcG9wdWxhdGluZyB0aGUgbWFwIGlzIHRoZSBidWcgdGhhdCBsZXRzIGEgUHJvbWlzZS5hbGwgb2YgM1xuICAgIC8vIGNhbGxlcnMgZmlyZSAzIEtNUyBEZWNyeXB0cy5cbiAgICBsZXQgcHJvbWlzZSA9IHRoaXMuaW5GbGlnaHQuZ2V0KG9yZ0lkKTtcbiAgICBpZiAoIXByb21pc2UpIHtcbiAgICAgIHByb21pc2UgPSB0aGlzLnJlc29sdmVBbmREZWNyeXB0KG9yZ0lkKTtcbiAgICAgIHRoaXMuaW5GbGlnaHQuc2V0KG9yZ0lkLCBwcm9taXNlKTtcbiAgICAgIHZvaWQgcHJvbWlzZS5maW5hbGx5KCgpID0+IHsgaWYgKHRoaXMuaW5GbGlnaHQuZ2V0KG9yZ0lkKSA9PT0gcHJvbWlzZSkgdGhpcy5pbkZsaWdodC5kZWxldGUob3JnSWQpOyB9KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvbWlzZTtcbiAgICBpZiAocmVzdWx0KSB0aGlzLm1hc3RlcnMuc2V0KG9yZ0lkLCByZXN1bHQpO1xuICAgIC8vIFJlbWVtYmVyIHRoZSBORUdBVElWRSBvdXRjb21lIHRvbywgc28gdGhlIHN5bmMgYGRlcml2ZUtleWAgY2FuIHRlbGxcbiAgICAvLyBcIm5vIHBlci1vcmcgY29uZmlnLCBmYWxsYmFjayBpcyBjb3JyZWN0XCIgZnJvbSBcIm5vdCByZXNvbHZlZCB5ZXRcIi5cbiAgICBlbHNlIHRoaXMucmVzb2x2ZWROb1Blck9yZ0NvbmZpZy5hZGQob3JnSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlQW5kRGVjcnlwdChvcmdJZDogc3RyaW5nKTogUHJvbWlzZTx7IGtleTogQnVmZmVyOyBraWQ6IHN0cmluZyB9IHwgbnVsbD4ge1xuICAgIGxldCBjZmcgPSB0aGlzLmNvbmZpZ3MuZ2V0KG9yZ0lkKTtcbiAgICBpZiAoIWNmZykge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCB0aGlzLnJlc29sdmVyKG9yZ0lkKTtcbiAgICAgIGlmICghcmVzb2x2ZWQpIHJldHVybiBudWxsOyAvLyBubyBwZXItb3JnIGNvbmZpZyDihpIgY2FsbGVyIHVzZXMgZmFsbGJhY2tcbiAgICAgIGNmZyA9IHJlc29sdmVkO1xuICAgICAgdGhpcy5jb25maWdzLnNldChvcmdJZCwgY2ZnKTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy5mZXRjaEFuZERlY3J5cHQoY2ZnKTtcbiAgICByZXR1cm4geyBrZXksIGtpZDogY2ZnLmtleUlkIH07XG4gIH1cblxuICBwcml2YXRlIGZldGNoQW5kRGVjcnlwdChjZmc6IFBlck9yZ0ttc0NvbmZpZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgcmV0dXJuIGttc0RlY3J5cHQzMihjZmcua2V5SWQsIGNmZy5jaXBoZXJ0ZXh0QmFzZTY0LCB0aGlzLnJlZ2lvbiwgdGhpcy5lbmRwb2ludCk7XG4gIH1cblxuICAvKiogRXZpY3QgYSBjYWNoZWQgcGVyLW9yZyBtYXN0ZXIuIFVzZSBhZnRlciBhIGtleSByb3RhdGlvbiBzbyB0aGUgbmV4dFxuICAgKiAgdG91Y2ggcmUtZmV0Y2hlcyB0aGUgbmV3IHdyYXBwZWQgbWFzdGVyIGZyb20gdGhlIHJlc29sdmVyLiAqL1xuICBldmljdChvcmdJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXN0ZXJzLmRlbGV0ZShvcmdJZCk7XG4gICAgdGhpcy5jb25maWdzLmRlbGV0ZShvcmdJZCk7XG4gICAgLy8gQWxzbyBmb3JnZXQgYSBORUdBVElWRSByZXNvbHV0aW9uLCBvciBhbiBvcmcgdGhhdCBnYWlucyBhIHBlci1vcmcgY29uZmlnXG4gICAgLy8gYWZ0ZXIgYmVpbmcgcmVzb2x2ZWQgYXMgXCJubyBjb25maWdcIiB3b3VsZCBrZWVwIHVzaW5nIHRoZSBzaGFyZWQgbWFzdGVyLlxuICAgIHRoaXMucmVzb2x2ZWROb1Blck9yZ0NvbmZpZy5kZWxldGUob3JnSWQpO1xuICB9XG59XG5cbi8qKlxuICogRGVyaXZlIHRoZSBrZXkgZm9yIGBvcmdJZGAsIGdpdmluZyB0aGUgcHJvdmlkZXIgYSBjaGFuY2UgdG8gZG8gSS9PIGZpcnN0LlxuICpcbiAqIFRoaXMgaXMgd2h5IGBlbmNyeXB0U2VjcmV0YC9gZGVjcnlwdFNlY3JldGAgYXJlIGFzeW5jOiBgUGVyT3JnS21zS2V5UHJvdmlkZXJgXG4gKiBuZWVkcyBvbmUgS01TIERlY3J5cHQgdGhlIGZpcnN0IHRpbWUgaXQgc2VlcyBhbiBvcmcsIGFuZCBkZXJpdmluZ1xuICogc3luY2hyb25vdXNseSBiZWZvcmUgdGhhdCByZXNvbHZlcyB3b3VsZCBzaWxlbnRseSBmYWxsIGJhY2sgdG8gdGhlIHNoYXJlZFxuICogbWFzdGVyIGFuZCBwcm9kdWNlIHNlY3JldHMgdGhhdCBjYW5ub3QgYmUgZGVjcnlwdGVkIGFmdGVyd2FyZHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlcml2ZUtleUZvcihwcm92aWRlcjogS2V5UHJvdmlkZXIsIG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICByZXR1cm4gcHJvdmlkZXIuZGVyaXZlS2V5QXN5bmMgPyBwcm92aWRlci5kZXJpdmVLZXlBc3luYyhvcmdJZCkgOiBwcm92aWRlci5kZXJpdmVLZXkob3JnSWQpO1xufVxuXG4vKipcbiAqIEVuY3J5cHQgYSBwbGFpbnRleHQgc3RyaW5nIGZvciBzdG9yYWdlLiBSZXR1cm5zIGFuIGBFbmNyeXB0ZWRCbG9iYCB0aGF0XG4gKiBjYW4gYmUgSlNPTi1zZXJpYWxpemVkIGludG8gdGhlIHVuZGVybHlpbmcgY29sdW1uIC8gTW9uZ28gZG9jdW1lbnQuXG4gKlxuICogRW1wdHkgc3RyaW5ncyByb3VuZC10cmlwIGFzIGBudWxsYCBzbyB0aGUgY2FsbGluZyBtb2RlbCBsYXllciBjYW4gdHJlYXRcbiAqIFwibm8gc2VjcmV0IHNldFwiIGlkZW50aWNhbGx5IHRvIFwiZmllbGQgYWJzZW50XCIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmNyeXB0U2VjcmV0KCBwbGFpbnRleHQ6IHN0cmluZyxcbiAgb3JnSWQ6IHN0cmluZyxcbiAgcHJvdmlkZXI6IEtleVByb3ZpZGVyID0gZ2V0RGVmYXVsdFByb3ZpZGVyKCksXG4pOiBQcm9taXNlPEVuY3J5cHRlZEJsb2I+IHtcbiAgaWYgKCFwbGFpbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZnVzaW5nIHRvIGVuY3J5cHQgZW1wdHkgc3RyaW5nOyBjYWxsZXIgc2hvdWxkIHN0b3JlIG51bGwgaW5zdGVhZCcpO1xuICB9XG4gIC8vIFJlc29sdmUgKGFuZCB3YXJtKSB0aGUgb3JnIEJFRk9SRSByZWFkaW5nIGBraWRGb3JgIGJlbG93LCBzbyBhIHBlci1vcmcgS01TXG4gIC8vIGJsb2IgaXMgYWx3YXlzIHN0YW1wZWQgd2l0aCB0aGUga2V5IGl0IHdhcyBhY3R1YWxseSBlbmNyeXB0ZWQgdW5kZXIuXG4gIGNvbnN0IGtleSA9IGF3YWl0IGRlcml2ZUtleUZvcihwcm92aWRlciwgb3JnSWQpO1xuICBjb25zdCBpdiA9IHJhbmRvbUJ5dGVzKDEyKTtcbiAgY29uc3QgY2lwaGVyID0gY3JlYXRlQ2lwaGVyaXYoJ2Flcy0yNTYtZ2NtJywga2V5LCBpdik7XG4gIGNvbnN0IGVuYyA9IEJ1ZmZlci5jb25jYXQoW2NpcGhlci51cGRhdGUocGxhaW50ZXh0LCAndXRmOCcpLCBjaXBoZXIuZmluYWwoKV0pO1xuICBjb25zdCB0YWcgPSBjaXBoZXIuZ2V0QXV0aFRhZygpO1xuICAvLyBQZXJPcmdLbXNLZXlQcm92aWRlciB0YWdzIGJsb2JzIHdpdGggdGhlIEtNUyBrZXkgaWQgdXNlZCBzbyB0aGVcbiAgLy8gZGVjcnlwdCBwYXRoIGNhbiByZWZ1c2UgdG8gb3BlcmF0ZSBpZiB0aGUgb3BlcmF0b3IgbGF0ZXIgc3dhcHMgaW4gYVxuICAvLyBkaWZmZXJlbnQgcGVyLW9yZyBjb25maWcgKGEgbWlzY29uZmlndXJlZCBzd2FwIHNob3VsZG4ndCBzaWxlbnRseVxuICAvLyBhY2NlcHQgYSBzdGFsZSBibG9iIGl0IGNhbid0IHZlcmlmeSBhZ2FpbnN0IHRoZSByaWdodCBDTUspLlxuICBjb25zdCBraWQgPSBwcm92aWRlci5raWRGb3I/LihvcmdJZCk7XG4gIHJldHVybiB7XG4gICAgYWxnOiAnYWVzLTI1Ni1nY20tdjEnLFxuICAgIGl2OiBpdi50b1N0cmluZygnYmFzZTY0JyksXG4gICAgLy8gR0NNIHRhZyBNVVNUIHRyYXZlbCB3aXRoIHRoZSBjaXBoZXJ0ZXh0IG9yIGBkZWNyeXB0U2VjcmV0YCBjYW4ndFxuICAgIC8vIHZlcmlmeSBpbnRlZ3JpdHkgIGNvbmNhdGVuYXRlIHNvIHRoZSBvbi1kaXNrIHNoYXBlIGlzIG9uZSBmaWVsZC5cbiAgICBjaXBoZXJ0ZXh0OiBCdWZmZXIuY29uY2F0KFtlbmMsIHRhZ10pLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAuLi4oa2lkICE9PSB1bmRlZmluZWQgPyB7IGtpZCB9IDoge30pLFxuICB9O1xufVxuXG4vKipcbiAqIERlY3J5cHQgYW4gYEVuY3J5cHRlZEJsb2JgIHdyaXR0ZW4gYnkgYGVuY3J5cHRTZWNyZXRgLiBUaHJvd3Mgb24gKiAtIHVua25vd24gYGFsZ2AgKGZvcmNlcyBhbiBleHBsaWNpdCBtaWdyYXRpb24gd2hlbiB0aGUgZm9ybWF0IGNoYW5nZXMpXG4gKiAtIHdyb25nIG9yZ0lkIChIS0RGIGJpbmRpbmcgbWlzbWF0Y2ggZmFpbHMgdGhlIGF1dGggdGFnKVxuICogLSB0YW1wZXJlZCBjaXBoZXJ0ZXh0IChHQ00gYXV0aCB0YWcgY2hlY2sgZmFpbHMpXG4gKlxuICogQ2FsbGVycyBoYW5kbGUgdGhlIHRocm93ICBtYXNraW5nIHRoZSBmYWlsdXJlIGFzIGBudWxsYCB3b3VsZCBoaWRlXG4gKiBzaWxlbnQgY29ycnVwdGlvbiAvIHdyb25nLW9yZyByZWFkcy5cbiAqXG4gKiBgcHJldmlvdXNgIChkZWZhdWx0OiBgU0VDUkVUX0VOQ1JZUFRJT05fS0VZX1BSRVZJT1VTYCwgd2hlbiBzZXQpIGlzIHRyaWVkXG4gKiBvbmx5IGFmdGVyIHRoZSBwcmltYXJ5IGtleSBmYWlscywgYW5kIG9ubHkgZm9yIGtpZC1sZXNzIGJsb2JzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVjcnlwdFNlY3JldCggYmxvYjogRW5jcnlwdGVkQmxvYixcbiAgb3JnSWQ6IHN0cmluZyxcbiAgcHJvdmlkZXI6IEtleVByb3ZpZGVyID0gZ2V0RGVmYXVsdFByb3ZpZGVyKCksXG4gIHByZXZpb3VzOiBLZXlQcm92aWRlciB8IG51bGwgPSBnZXRQcmV2aW91c1Byb3ZpZGVyKCksXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoYmxvYi5hbGcgIT09ICdhZXMtMjU2LWdjbS12MScpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGVuY3J5cHRpb24gYWxnOiAke2Jsb2IuYWxnfWApO1xuICB9XG4gIC8vIFdhcm0gZmlyc3Q6IGBraWRGb3JgIGFuZCBgZGVyaXZlS2V5YCBiZWxvdyBtdXN0IGJvdGggc3BlYWsgZm9yIHRoZSBvcmcnc1xuICAvLyByZWFsIGNvbmZpZywgb3IgdGhlIG1pc21hdGNoIGd1YXJkIHNpbGVudGx5IG5vLW9wcy5cbiAgY29uc3Qga2V5ID0gYXdhaXQgZGVyaXZlS2V5Rm9yKHByb3ZpZGVyLCBvcmdJZCk7XG4gIC8vIElmIGJvdGggdGhlIHByb3ZpZGVyIEFORCB0aGUgYmxvYiByZXBvcnQgYSBraWQsIHRoZXkgbXVzdCBtYXRjaC5cbiAgLy8gTWlzbWF0Y2ggdXN1YWxseSBtZWFucyBhbiBvcGVyYXRvciByb3RhdGVkL3JlcGxhY2VkIGFuIG9yZydzIEtNU1xuICAvLyBjb25maWcgYW5kIGlzIG5vdyByZWFkaW5nIGEgYmxvYiBlbmNyeXB0ZWQgdW5kZXIgdGhlIE9MRCBrZXkg4oCUXG4gIC8vIGZhaWxpbmcgbG91ZCBoZXJlIGJlYXRzIGxldHRpbmcgQUVTLUdDTSB0aHJvdyBhbiBvcGFxdWUgYXV0aC10YWcgZXJyb3IuXG4gIGNvbnN0IHByb3ZpZGVyS2lkID0gcHJvdmlkZXIua2lkRm9yPy4ob3JnSWQpO1xuICBpZiAocHJvdmlkZXJLaWQgIT09IHVuZGVmaW5lZCAmJiBibG9iLmtpZCAhPT0gdW5kZWZpbmVkICYmIHByb3ZpZGVyS2lkICE9PSBibG9iLmtpZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgS01TIGtleSBpZCBtaXNtYXRjaDogYmxvYiB3YXMgZW5jcnlwdGVkIHVuZGVyICR7YmxvYi5raWR9LCBjdXJyZW50IHByb3ZpZGVyIHVzZXMgJHtwcm92aWRlcktpZH0gZm9yIG9yZyAke29yZ0lkfWApO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRlY3J5cHRXaXRoS2V5KGJsb2IsIGtleSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIE1hc3Rlci1rZXkgcm90YXRpb24gd2luZG93OiByZXRyeSB1bmRlciBTRUNSRVRfRU5DUllQVElPTl9LRVlfUFJFVklPVVMuXG4gICAgLy8gT25seSBmb3IgYSBraWQtbGVzcyBibG9iICh0aGUgZW52LWtleWVkIHNoYXBlKSDigJQgYSBwZXItb3JnIEtNUyBibG9iIGlzXG4gICAgLy8gYm91bmQgdG8gaXRzIENNSyBhbmQgdGhlIHNoYXJlZCBwcmV2aW91cyBtYXN0ZXIgY2FuIG5ldmVyIG9wZW4gaXQuIFRoZVxuICAgIC8vIE9SSUdJTkFMIGVycm9yIHN1cmZhY2VzIHdoZW4gdGhlIHByZXZpb3VzIGtleSBmYWlscyB0b28sIHNvIGEgdGFtcGVyZWQgb3JcbiAgICAvLyB3cm9uZy1vcmcgYmxvYiBzdGlsbCBmYWlscyBsb3VkIGV4YWN0bHkgYXMgYmVmb3JlLlxuICAgIGlmIChwcmV2aW91cyAmJiBibG9iLmtpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZGVjcnlwdFdpdGhLZXkoYmxvYiwgYXdhaXQgZGVyaXZlS2V5Rm9yKHByZXZpb3VzLCBvcmdJZCkpO1xuICAgICAgfSBjYXRjaCB7IC8qIGZhbGwgdGhyb3VnaCB0byB0aGUgcHJpbWFyeSBlcnJvciAqLyB9XG4gICAgfVxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG4vKiogQUVTLTI1Ni1HQ00gb3BlbiBvZiBhIGJsb2IgdW5kZXIgb25lIGRlcml2ZWQga2V5LiBUaHJvd3Mgb24gYW55IGF1dGgtdGFnIGZhaWx1cmUuICovXG5mdW5jdGlvbiBkZWNyeXB0V2l0aEtleShibG9iOiBFbmNyeXB0ZWRCbG9iLCBrZXk6IEJ1ZmZlcik6IHN0cmluZyB7XG4gIGNvbnN0IGl2ID0gQnVmZmVyLmZyb20oYmxvYi5pdiwgJ2Jhc2U2NCcpO1xuICBjb25zdCBhbGwgPSBCdWZmZXIuZnJvbShibG9iLmNpcGhlcnRleHQsICdiYXNlNjQnKTtcbiAgLy8gU3BsaXQgb2ZmIHRoZSAxNi1ieXRlIGF1dGggdGFnIGFwcGVuZGVkIGluIGVuY3J5cHRTZWNyZXQuIEFueSB0YW1wZXJpbmdcbiAgLy8gIHRvIGVpdGhlciB0aGUgY2lwaGVydGV4dCBPUiB0aGUgdGFnICBjYXVzZXMgdGhlIG5leHQgYGZpbmFsKClgIHRvXG4gIC8vIHRocm93IHdpdGggXCJVbnN1cHBvcnRlZCBzdGF0ZSBvciB1bmFibGUgdG8gYXV0aGVudGljYXRlIGRhdGFcIi5cbiAgY29uc3QgdGFnID0gYWxsLnN1YmFycmF5KGFsbC5sZW5ndGggLSAxNik7XG4gIGNvbnN0IGVuYyA9IGFsbC5zdWJhcnJheSgwLCBhbGwubGVuZ3RoIC0gMTYpO1xuICBjb25zdCBkZWNpcGhlciA9IGNyZWF0ZURlY2lwaGVyaXYoJ2Flcy0yNTYtZ2NtJywga2V5LCBpdik7XG4gIGRlY2lwaGVyLnNldEF1dGhUYWcodGFnKTtcbiAgY29uc3QgZGVjID0gQnVmZmVyLmNvbmNhdChbZGVjaXBoZXIudXBkYXRlKGVuYyksIGRlY2lwaGVyLmZpbmFsKCldKTtcbiAgcmV0dXJuIGRlYy50b1N0cmluZygndXRmOCcpO1xufVxuXG4vKipcbiAqIFNoYXBlIGd1YXJkIGZvciBhIHBhcnNlZCBgRW5jcnlwdGVkQmxvYmAuIENhbGxlcnMgaG9sZCBhIHZhbHVlIHRoYXQgd2FzIEpTT04tXG4gKiBkZWNvZGVkIGZyb20gYSBzZWNyZXQgY29sdW1uIGFuZCBtdXN0IG5vdCBoYW5kIGFueXRoaW5nIGVsc2UgdG9cbiAqIGBkZWNyeXB0U2VjcmV0YDsgdGhpcyBuYXJyb3dzIGl0IChvciB0aGUgY2FsbGVyIHJlamVjdHMgdGhlIHZhbHVlKS4gQ2xlYXIgdGV4dFxuICogaXMgTk9UIGEgc3VwcG9ydGVkIHN0b3JlZCBmb3JtIOKAlCB0aGUgb25seSBjb25zdW1lciB0aHJvd3Mgb24gYSBub24tYmxvYi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW5jcnlwdGVkQmxvYih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEVuY3J5cHRlZEJsb2Ige1xuICByZXR1cm4gKCB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG4gICAgJiYgdmFsdWUgIT09IG51bGxcbiAgICAmJiAodmFsdWUgYXMgeyBhbGc/OiB1bmtub3duIH0pLmFsZyA9PT0gJ2Flcy0yNTYtZ2NtLXYxJ1xuICAgICYmIHR5cGVvZiAodmFsdWUgYXMgeyBpdj86IHVua25vd24gfSkuaXYgPT09ICdzdHJpbmcnXG4gICAgJiYgdHlwZW9mICh2YWx1ZSBhcyB7IGNpcGhlcnRleHQ/OiB1bmtub3duIH0pLmNpcGhlcnRleHQgPT09ICdzdHJpbmcnXG4gICk7XG59XG4iXX0=
557
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjcmV0LWVuY3J5cHRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvc2VjcmV0LWVuY3J5cHRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQ0c7QUFFSCxPQUFPLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxRQUFRLENBQUM7QUE2QmpGOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLE9BQU8sY0FBYztJQUNSLFNBQVMsQ0FBUztJQUVuQyxZQUFZLGlCQUEwQjtRQUNwQyxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDO1FBQ25FLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztRQUNqRixDQUFDO1FBQ0QsMEVBQTBFO1FBQzFFLHNEQUFzRDtRQUN0RCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsTUFBTSxLQUFLLEVBQUUsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUMzRCxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMvQixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDM0YsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO0lBQzNCLENBQUM7SUFFRCxTQUFTLENBQUMs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RztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBYztJQUM1QyxPQUFPLENBQUUsT0FBTyxLQUFLLEtBQUssUUFBUTtXQUM3QixLQUFLLEtBQUssSUFBSTtXQUNiLEtBQTJCLENBQUMsR0FBRyxLQUFLLGdCQUFnQjtXQUNyRCxPQUFRLEtBQTBCLENBQUMsRUFBRSxLQUFLLFFBQVE7V0FDbEQsT0FBUSxLQUFrQyxDQUFDLFVBQVUsS0FBSyxRQUFRLENBQ3RFLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogRW52ZWxvcGUgZW5jcnlwdGlvbiBmb3Igb3JnLXNjb3BlZCBzZWNyZXQgY29sdW1ucyAoQUkgcHJvdmlkZXIga2V5cywgSWRQXG4gKiBjbGllbnQgc2VjcmV0cywgd2ViaG9vayBVUkxzL3NlY3JldHMsIHJlZ2lzdHJ5IGNyZWRlbnRpYWxzKS5cbiAqXG4gKiBDcnlwdG9ncmFwaHkg4oCUIHRoZSBzYW1lIGZvciBldmVyeSBwcm92aWRlciBiZWxvdzpcbiAqIC0gQUVTLTI1Ni1HQ00gKGF1dGhlbnRpY2F0ZWQgZW5jcnlwdGlvbikuXG4gKiAtIFBlci1vcmcga2V5IHZpYSBIS0RGLVNIQTI1NihtYXN0ZXIsIHNhbHQ9b3JnSWQsIGluZm89J3NlY3JldHMtdjEnKSwgc28gdHdvXG4gKiAgIG9yZ3MgZW5jcnlwdGluZyB0aGUgc2FtZSBwbGFpbnRleHQgcHJvZHVjZSBkaWZmZXJlbnQgY2lwaGVydGV4dHMgYW5kIGFcbiAqICAgc3RvbGVuIGRhdGFiYXNlIGNhbm5vdCB0ZWxsIHdoaWNoIG9yZ3Mgc2hhcmUgYSBzZWNyZXQgYnkgY29tcGFyaXNvbi5cbiAqIC0gMTItYnl0ZSBJViBwZXIgZW5jcnlwdGlvbiBmcm9tIGBjcnlwdG8ucmFuZG9tQnl0ZXNgLlxuICogLSAxNi1ieXRlIEdDTSBhdXRoIHRhZyBjb25jYXRlbmF0ZWQgb250byB0aGUgY2lwaGVydGV4dC5cbiAqXG4gKiBXSEVSRSBUSEUgTUFTVEVSIENPTUVTIEZST00gaXMgdGhlIG9ubHkgYXhpcyB0aGF0IHZhcmllcywgYW5kIGFsbCB0aHJlZVxuICogcHJvdmlkZXJzIGFyZSBpbXBsZW1lbnRlZCDigJQgcGljayBvbmUgcGVyIGRlcGxveW1lbnQ6XG4gKlxuICogfCBwcm92aWRlciAgICAgICAgICAgICAgIHwgbWFzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBibGFzdCByYWRpdXMgICAgICAgfFxuICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogfCBgRW52S2V5UHJvdmlkZXJgICAgICAgIHwgYFNFQ1JFVF9FTkNSWVBUSU9OX0tFWWAsIHBsYWludGV4dCAgfCBldmVyeSBvcmcgICAgICAgICAgfFxuICogfCBgS21zS2V5UHJvdmlkZXJgICAgICAgIHwgS01TLXdyYXBwZWQsIHVud3JhcHBlZCBvbmNlIGF0IGJvb3QgfCBldmVyeSBvcmcgICAgICAgICAgfFxuICogfCBgUGVyT3JnS21zS2V5UHJvdmlkZXJgIHwgb25lIEtNUy13cmFwcGVkIG1hc3RlciBQRVIgT1JHICAgICAgfCBvbmUgb3JnICAgICAgICAgICAgfFxuICpcbiAqIGBpbml0U2VjcmV0RW5jcnlwdGlvbigpYCBzZWxlY3RzIGJldHdlZW4gdGhlIGZpcnN0IHR3byBmcm9tIGVudiBhbmQgd2FybXMgdGhlXG4gKiByZXN1bHQ7IHBsYXRmb3JtIGxheWVycyBgUGVyT3JnS21zS2V5UHJvdmlkZXJgIG92ZXIgaXQgKG9yZ3Mgd2l0aCBubyBwZXItb3JnXG4gKiBDTUsgZmFsbCB0aHJvdWdoIHRvIHRoZSBiYXNlIHByb3ZpZGVyKSwgc28gYSBkZXBsb3ltZW50IGNhbiBydW4gbWl4ZWQtbW9kZS5cbiAqIENhbGwgaXQgb25jZSBhdCBzdGFydHVwIOKAlCBiZWZvcmUgdGhhdCwgdGhlIGxhenkgZGVmYXVsdCBpcyBgRW52S2V5UHJvdmlkZXJgLFxuICogd2hpY2ggaXMgY29ycmVjdCBmb3IgZGV2IGFuZCBzZWxmLWhvc3RlZCBpbnN0YWxscyB3aXRoIG5vIEtNUy5cbiAqXG4gKiBGYWlsLWNsb3NlZCB0aHJvdWdob3V0OiBhIG1pc3Npbmcgb3Igd3JvbmctbGVuZ3RoIG1hc3RlciB0aHJvd3MgcmF0aGVyIHRoYW5cbiAqIHJvdW5kLXRyaXBwaW5nIGEgc2VjcmV0IGFzIHBsYWludGV4dCwgYW5kIGFuIHVucmVzb2x2ZWQgcGVyLW9yZyBjb25maWcgdGhyb3dzXG4gKiByYXRoZXIgdGhhbiBndWVzc2luZyB0aGUgc2hhcmVkIG1hc3Rlci5cbiAqXG4gKiBUaGUgb24tZGlzayBzaGFwZSAoYHsgYWxnLCBpdiwgY2lwaGVydGV4dCwga2lkPyB9YCkgaXMgcHJvdmlkZXItaW5kZXBlbmRlbnQ7XG4gKiBga2lkYCBjYXJyaWVzIHRoZSBLTVMga2V5IGlkIGZvciB0aGUgcHJvdmlkZXJzIHRoYXQgaGF2ZSBvbmUsIHdoaWNoIGlzIHdoYXRcbiAqIGxldHMgYGRlY3J5cHRTZWNyZXRgIHJlZnVzZSBhIGJsb2Igd3JpdHRlbiB1bmRlciBhIHNpbmNlLXJvdGF0ZWQgQ01LIGluc3RlYWRcbiAqIG9mIHN1cmZhY2luZyBhbiBvcGFxdWUgYXV0aC10YWcgZmFpbHVyZS5cbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVDaXBoZXJpdiwgY3JlYXRlRGVjaXBoZXJpdiwgaGtkZlN5bmMsIHJhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcblxuLyoqIE9uLWRpc2sgc2hhcGUgb2YgYW4gZW5jcnlwdGVkIHNlY3JldC4gSlNPTi1zZXJpYWxpemFibGUuICovXG5leHBvcnQgaW50ZXJmYWNlIEVuY3J5cHRlZEJsb2Ige1xuICAvKiogQWxnb3JpdGhtIHRhZy4gQnVtcCBvbiBmb3JtYXQgY2hhbmdlIHNvIGEgZnV0dXJlIG1pZ3JhdGlvbiBjYW4gZGV0ZWN0IG9sZCBibG9icy4gKi9cbiAgYWxnOiAnYWVzLTI1Ni1nY20tdjEnO1xuICAvKiogQmFzZTY0LWVuY29kZWQgMTItYnl0ZSBJVi4gKi9cbiAgaXY6IHN0cmluZztcbiAgLyoqIEJhc2U2NC1lbmNvZGVkIGNpcGhlcnRleHQgKyAxNi1ieXRlIGF1dGhlbnRpY2F0aW9uIHRhZyBjb25jYXRlbmF0ZWQuICovXG4gIGNpcGhlcnRleHQ6IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIGtleSBpZCAgcG9wdWxhdGVkIGJ5IEtNUy1iYWNrZWQgcHJvdmlkZXJzLCBpZ25vcmVkIGJ5IHRoZSBlbnYgcHJvdmlkZXIuICovXG4gIGtpZD86IHN0cmluZztcbn1cblxuLyoqIFBsdWdnYWJsZSBrZXkgc291cmNlLiBFbnYtYmFja2VkIGJ5IGRlZmF1bHQ7IEtNUy1iYWNrZWQgYXZhaWxhYmxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBLZXlQcm92aWRlciB7XG4gIC8qKiBEZXJpdmUgYSAzMi1ieXRlIHN5bW1ldHJpYyBrZXkgYm91bmQgdG8gYG9yZ0lkYC4gKi9cbiAgZGVyaXZlS2V5KG9yZ0lkOiBzdHJpbmcpOiBCdWZmZXI7XG4gIC8qKiBPcHRpb25hbCBhc3luYyB2YXJpYW50IGZvciBwcm92aWRlcnMgdGhhdCBuZWVkIHRvIGRvIEkvTyAoZS5nLlxuICAgKiAgcGVyLW9yZyBLTVMgbG9va3VwIHRoZSBmaXJzdCB0aW1lIGFuIG9yZyBpcyBzZWVuKS4gRGVmYXVsdFxuICAgKiAgaW1wbGVtZW50YXRpb24gZm9yd2FyZHMgdG8gdGhlIHN5bmMgYGRlcml2ZUtleWAuICovXG4gIGRlcml2ZUtleUFzeW5jPyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+O1xuICAvKiogT3B0aW9uYWwgS01TLWtleS1pZCB0aGlzIHByb3ZpZGVyIHVzZWQgZm9yIGBvcmdJZGAuIEVtYmVkZGVkIGluIHRoZVxuICAgKiAgYEVuY3J5cHRlZEJsb2Iua2lkYCBmaWVsZCBvbiB3cml0ZSBzbyBkZWNyeXB0IGNhbiB2ZXJpZnkgdGhlIHJpZ2h0XG4gICAqICBLTVMgQ01LIGlzIGJlaW5nIHVzZWQgKGRlZmVuc2UgYWdhaW5zdCBhbiBhdHRhY2tlciB3aG8gc3dhcHMgYSBibG9iXG4gICAqICBiZXR3ZWVuIG9yZ3MpLiBEZWZhdWx0IHJldHVybnMgdW5kZWZpbmVkIChlbnYgcHJvdmlkZXIpLiAqL1xuICBraWRGb3I/KG9yZ0lkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRGVmYXVsdCBwcm92aWRlciAgZGVyaXZlcyBhIHBlci1vcmcga2V5IGZyb20gYFNFQ1JFVF9FTkNSWVBUSU9OX0tFWWAgdmlhXG4gKiBIS0RGLVNIQTI1Ni4gU3VpdGFibGUgZm9yIHNlbGYtaG9zdGVkIC8gZGV2IHdoZXJlIG9wZXJhdG9ycyBkb24ndCBoYXZlIEtNUy5cbiAqXG4gKiBGYWlscyBmYXN0IGlmIHRoZSBlbnYgaXMgbWlzc2luZyBvciB0aGUga2V5IGlzIHRoZSB3cm9uZyBsZW5ndGggc28gbWlzY29uZmlnXG4gKiBzdXJmYWNlcyBhdCBmaXJzdCB1c2UgcmF0aGVyIHRoYW4gc2lsZW50bHkgZmluZ2VycHJpbnRpbmcgYWxsIHdyaXRlcyB3aXRoXG4gKiBhIGRlZmF1bHQgemVybyBrZXkuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnZLZXlQcm92aWRlciBpbXBsZW1lbnRzIEtleVByb3ZpZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXN0ZXJLZXk6IEJ1ZmZlcjtcblxuICBjb25zdHJ1Y3RvcihtYXN0ZXJLZXlPdmVycmlkZT86IHN0cmluZykge1xuICAgIGNvbnN0IHJhdyA9IG1hc3RlcktleU92ZXJyaWRlID8/IHByb2Nlc3MuZW52LlNFQ1JFVF9FTkNSWVBUSU9OX0tFWTtcbiAgICBpZiAoIXJhdykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTRUNSRVRfRU5DUllQVElPTl9LRVkgZW52IGlzIHJlcXVpcmVkIGZvciBzZWNyZXQgZW5jcnlwdGlvbicpO1xuICAgIH1cbiAgICAvLyBBY2NlcHQgZWl0aGVyIGhleCAoNjQgY2hhcnMpIG9yIGJhc2U2NCAoNDQgY2hhcnMgaW5jbHVkaW5nIHBhZGRpbmcpIGZvclxuICAgIC8vIG9wZXJhdG9yIGNvbnZlbmllbmNlICBib3RoIGRlY29kZSB0byBhIDMyLWJ5dGUga2V5LlxuICAgIGNvbnN0IGRlY29kZWQgPSByYXcubGVuZ3RoID09PSA2NCAmJiAvXlswLTlhLWZdKyQvaS50ZXN0KHJhdylcbiAgICAgID8gQnVmZmVyLmZyb20ocmF3LCAnaGV4JylcbiAgICAgIDogQnVmZmVyLmZyb20ocmF3LCAnYmFzZTY0Jyk7XG4gICAgaWYgKGRlY29kZWQubGVuZ3RoICE9PSAzMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTRUNSRVRfRU5DUllQVElPTl9LRVkgbXVzdCBkZWNvZGUgdG8gMzIgYnl0ZXMgKGdvdCAke2RlY29kZWQubGVuZ3RofSlgKTtcbiAgICB9XG4gICAgdGhpcy5tYXN0ZXJLZXkgPSBkZWNvZGVkO1xuICB9XG5cbiAgZGVyaXZlS2V5KG9yZ0lkOiBzdHJpbmcpOiBCdWZmZXIge1xuICAgIC8vIEhLREYgYmluZHMgdGhlIG1hc3RlciBrZXkgdG8gdGhlIG9yZyBzbyB0d28gb3JncyBlbmNyeXB0aW5nIHRoZSBzYW1lXG4gICAgLy8gcGxhaW50ZXh0IHByb2R1Y2UgZGlmZmVyZW50IGNpcGhlcnRleHRzICBrZWVwcyBhIHN0b2xlbiBEQiB1bmFibGUgdG9cbiAgICAvLyB0ZWxsIHdoaWNoIG9yZ3Mgc2hhcmUgc2VjcmV0cyB2aWEgY2lwaGVydGV4dCBjb21wYXJpc29uLlxuICAgIGNvbnN0IGRlcml2ZWQgPSBoa2RmU3luYyggJ3NoYTI1NicsXG4gICAgICB0aGlzLm1hc3RlcktleSxcbiAgICAgIEJ1ZmZlci5mcm9tKG9yZ0lkLCAndXRmOCcpLFxuICAgICAgJ3NlY3JldHMtdjEnLFxuICAgICAgMzIsXG4gICAgKTtcbiAgICAvLyBoa2RmU3luYyByZXR1cm5zIEFycmF5QnVmZmVyIGluIG9sZGVyIE5vZGUgdHlwaW5nczsgbm9ybWFsaXplIHRvIEJ1ZmZlci5cbiAgICByZXR1cm4gQnVmZmVyLmZyb20oZGVyaXZlZCk7XG4gIH1cbn1cblxuLyoqXG4gKiAgQVdTLUtNUy1iYWNrZWQgS2V5UHJvdmlkZXIuXG4gKlxuICogVHJhZGUtb2ZmIHBpY2tlZDogc3RvcmUgT05FIG1hc3RlciBrZXkgZW5jcnlwdGVkIHVuZGVyIGEgS01TIENNSzsgb25cbiAqIGZpcnN0IHVzZSwgY2FsbCBga21zOkRlY3J5cHRgIHRvIHJlY292ZXIgdGhlIG1hc3RlciBrZXkgYnl0ZXM7IEhLREYtXG4gKiBkZXJpdmUgcGVyLW9yZyBmcm9tIGl0IChzYW1lIGFzIEVudktleVByb3ZpZGVyKS4gVGhlIHByb2Nlc3MgdGhlbiBob2xkc1xuICogdGhlIHBsYWludGV4dCBtYXN0ZXIga2V5IGluIG1lbW9yeSB1bnRpbCByZXN0YXJ0LlxuICpcbiAqIFBST1M6IG9uZSBLTVMgY2FsbCBwZXIgcHJvY2VzcyBsaWZldGltZSAoY2hlYXAsIGxvdyBwOTkgaW1wYWN0KSxcbiAqIHRoZSBlbmNyeXB0ZWQtbWFzdGVyLWtleSBibG9iIGlzIHNhZmUgdG8gY29tbWl0L2xvZy9jaGVja2luLFxuICogS01TIGF1ZGl0IGxvZyByZWNvcmRzIHdoZW4gdGhlIG1hc3RlciBpcyByZWNvdmVyZWQuXG4gKiBDT05TOiBwcm9jZXNzIG1lbW9yeSBzdGlsbCBob2xkcyB0aGUgbWFzdGVyIGtleSAgc2FtZSBwb3N0dXJlIGFzXG4gKiBFbnZLZXlQcm92aWRlciBvbmNlIHdhcm1lZCB1cC4gRm9yIHN0cm9uZ2VyIGlzb2xhdGlvbiBhblxuICogb3BlcmF0b3IgY2FuIG1vdmUgdG8gcGVyLXJlY29yZCBlbnZlbG9wZSBlbmNyeXB0aW9uIChjYWxsXG4gKiBHZW5lcmF0ZURhdGFLZXkgb24gZXZlcnkgd3JpdGUpOyB0aGF0J3MgYSBmb2xsb3ctb24uXG4gKlxuICogT3BlcmF0b3Igc2V0dXA6XG4gKiAgIDEuIENyZWF0ZSBhIEtNUyBDTUsgd2hvc2Uga2V5IHBvbGljeSBhbGxvd3MgdGhlIHNlcnZpY2Ugcm9sZSBga21zOkRlY3J5cHRgLlxuICogICAgICBPbiB0aGUgQVdTIHRhcmdldHMgYGJpbi9zZXR1cC5zaGAgLyBgdGVtcGxhdGUueWFtbGAgZ3JhbnQgdGhhdCB0byB0aGVcbiAqICAgICAgcGxhdGZvcm0gYW5kIHBsdWdpbiB0YXNrIHJvbGVzIHdoZW4gdGhlc2UgdmFycyBhcmUgc2V0LlxuICogICAyLiBHZW5lcmF0ZSBhIDMyLWJ5dGUgbWFzdGVyOiAgaGVhZCAtYyAzMiAvZGV2L3VyYW5kb20gfCBiYXNlNjRcbiAqICAgMy4gV3JhcCBpdDogIGF3cyBrbXMgZW5jcnlwdCAtLWtleS1pZCA8S0VZX0lEPiAtLXBsYWludGV4dCA8YmFzZTY0LWZyb20tMj4gXFxcbiAqICAgICAgICAgICAgICAgICAgLS1vdXRwdXQgdGV4dCAtLXF1ZXJ5IENpcGhlcnRleHRCbG9iXG4gKiAgIDQuIFNldCBvbiB0aGUgc2VydmljZTpcbiAqICAgICAgICBTRUNSRVRfRU5DUllQVElPTl9LTVNfS0VZX0lEPTxLRVlfSUQ+ICAgICAgICAoYWxpYXMvPG5hbWU+IG9yIGtleSBVVUlEKVxuICogICAgICAgIFNFQ1JFVF9FTkNSWVBUSU9OX0tNU19DSVBIRVJURVhUPTxiYXNlNjQtZnJvbS0zPlxuICpcbiAqIE5PIE1BTlVBTCBXSVJJTkc6IGBpbml0U2VjcmV0RW5jcnlwdGlvbigpYCBwaWNrcyB0aGlzIHByb3ZpZGVyIHdoZW5ldmVyIGJvdGhcbiAqIHZhcnMgYXJlIHNldCBhbmQgd2FybXMgaXQgYmVmb3JlIHRoZSBzZXJ2aWNlIGFjY2VwdHMgdHJhZmZpYy4gKEl0IHVzZWQgdG9cbiAqIHJlcXVpcmUgYSBoYW5kLXdyaXR0ZW4gYHNldEtleVByb3ZpZGVyKG5ldyBLbXNLZXlQcm92aWRlcigpKWAgdGhhdCBubyBzZXJ2aWNlXG4gKiBldmVyIGNhbGxlZCwgc28gdGhlIG1vZGUgd2FzIGRvY3VtZW50ZWQgYnV0IHVucmVhY2hhYmxlLilcbiAqXG4gKiBNaWdyYXRpbmcgZW52IC0+IEtNUzogc2V0IHRoZSB0d28gdmFycyBhYm92ZSB0byB0aGUgTkVXIHdyYXBwZWQgbWFzdGVyIGFuZFxuICogbGVhdmUgdGhlIG9sZCBwbGFpbnRleHQgbWFzdGVyIGluIGBTRUNSRVRfRU5DUllQVElPTl9LRVlfUFJFVklPVVNgLiBSZWFkc1xuICogZmFsbCBiYWNrIHRvIGl0IGZvciBraWQtbGVzcyBibG9icyB1bnRpbCBgcmVlbmNyeXB0LXNlY3JldHNgIGhhcyByZXdyaXR0ZW5cbiAqIHRoZW07IHNlZSBkb2NzL3J1bmJvb2tzL3NlY3JldC1yb3RhdGlvbi5tZC5cbiAqXG4gKiBUaGUgQVdTIFNESyBpcyBpbXBvcnRlZCBsYXppbHksIHNvIGluc3RhbGxzIHRoYXQgc3RheSBvbiBgRW52S2V5UHJvdmlkZXJgXG4gKiBuZXZlciBwYXkgaXRzIGNvbGQtc3RhcnQgY29zdC5cbiAqL1xuLyoqXG4gKiBLTVMtZGVjcnlwdCBhIGJhc2U2NCBjaXBoZXJ0ZXh0IGludG8gYSAzMi1ieXRlIGtleS4gU2hhcmVkIGJ5IGJvdGggS01TIGtleVxuICogcHJvdmlkZXJzIChzaW5nbGUtbWFzdGVyICsgcGVyLW9yZykuIGBAYXdzLXNkay9jbGllbnQta21zYCBpc1xuICogZHluYW1pY2FsbHkgaW1wb3J0ZWQgc28gRW52S2V5UHJvdmlkZXItb25seSBlbnZzIG5ldmVyIGxvYWQgdGhlIFNESy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24ga21zRGVjcnlwdDMyKGtleUlkOiBzdHJpbmcsIGNpcGhlcnRleHRCNjQ6IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBlbmRwb2ludD86IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gIGNvbnN0IHsgS01TQ2xpZW50LCBEZWNyeXB0Q29tbWFuZCB9ID0gYXdhaXQgaW1wb3J0KCdAYXdzLXNkay9jbGllbnQta21zJyk7XG4gIGNvbnN0IGNsaWVudCA9IG5ldyBLTVNDbGllbnQoeyByZWdpb24sIC4uLihlbmRwb2ludCA/IHsgZW5kcG9pbnQgfSA6IHt9KSB9KTtcbiAgY29uc3QgcmVzcCA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBEZWNyeXB0Q29tbWFuZCh7XG4gICAgS2V5SWQ6IGtleUlkLFxuICAgIENpcGhlcnRleHRCbG9iOiBCdWZmZXIuZnJvbShjaXBoZXJ0ZXh0QjY0LCAnYmFzZTY0JyksXG4gIH0pKTtcbiAgaWYgKCFyZXNwLlBsYWludGV4dCkgdGhyb3cgbmV3IEVycm9yKGBLTVMgRGVjcnlwdCByZXR1cm5lZCBhbiBlbXB0eSBQbGFpbnRleHQgZm9yIGtleSAke2tleUlkfWApO1xuICBjb25zdCBidWYgPSBCdWZmZXIuZnJvbShyZXNwLlBsYWludGV4dCk7XG4gIGlmIChidWYubGVuZ3RoICE9PSAzMikgdGhyb3cgbmV3IEVycm9yKGBLTVMgRGVjcnlwdCByZXR1cm5lZCAke2J1Zi5sZW5ndGh9LWJ5dGUga2V5IGZvciAke2tleUlkfTsgZXhwZWN0ZWQgMzJgKTtcbiAgcmV0dXJuIGJ1Zjtcbn1cblxuZXhwb3J0IGNsYXNzIEttc0tleVByb3ZpZGVyIGltcGxlbWVudHMgS2V5UHJvdmlkZXIge1xuICBwcml2YXRlIG1hc3RlcktleUNhY2hlOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBrZXlJZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGNpcGhlcnRleHRCNjQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpb24/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW5kcG9pbnQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgZGVjcnlwdEluRmxpZ2h0OiBQcm9taXNlPEJ1ZmZlcj4gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihvcHRzPzogeyBrZXlJZD86IHN0cmluZzsgY2lwaGVydGV4dEJhc2U2ND86IHN0cmluZzsgcmVnaW9uPzogc3RyaW5nOyBlbmRwb2ludD86IHN0cmluZyB9KSB7XG4gICAgY29uc3Qga2V5SWQgPSBvcHRzPy5rZXlJZCA/PyBwcm9jZXNzLmVudi5TRUNSRVRfRU5DUllQVElPTl9LTVNfS0VZX0lEO1xuICAgIGNvbnN0IGNpcGhlcnRleHQgPSBvcHRzPy5jaXBoZXJ0ZXh0QmFzZTY0ID8/IHByb2Nlc3MuZW52LlNFQ1JFVF9FTkNSWVBUSU9OX0tNU19DSVBIRVJURVhUO1xuICAgIGlmICgha2V5SWQpIHRocm93IG5ldyBFcnJvcignU0VDUkVUX0VOQ1JZUFRJT05fS01TX0tFWV9JRCBlbnYgaXMgcmVxdWlyZWQgZm9yIEttc0tleVByb3ZpZGVyJyk7XG4gICAgaWYgKCFjaXBoZXJ0ZXh0KSB0aHJvdyBuZXcgRXJyb3IoJ1NFQ1JFVF9FTkNSWVBUSU9OX0tNU19DSVBIRVJURVhUIGVudiBpcyByZXF1aXJlZCBmb3IgS21zS2V5UHJvdmlkZXInKTtcbiAgICB0aGlzLmtleUlkID0ga2V5SWQ7XG4gICAgdGhpcy5jaXBoZXJ0ZXh0QjY0ID0gY2lwaGVydGV4dDtcbiAgICB0aGlzLnJlZ2lvbiA9IG9wdHM/LnJlZ2lvbiA/PyBwcm9jZXNzLmVudi5BV1NfUkVHSU9OID8/IHByb2Nlc3MuZW52LkFXU19ERUZBVUxUX1JFR0lPTjtcbiAgICB0aGlzLmVuZHBvaW50ID0gb3B0cz8uZW5kcG9pbnQgPz8gcHJvY2Vzcy5lbnYuQVdTX0tNU19FTkRQT0lOVDtcbiAgfVxuXG4gIGRlcml2ZUtleShvcmdJZDogc3RyaW5nKTogQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMubWFzdGVyS2V5Q2FjaGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvciggJ0ttc0tleVByb3ZpZGVyIGlzIG5vdCB3YXJtZWQgdXAuIENhbGwgYGF3YWl0IHByb3ZpZGVyLndhcm11cCgpYCBvbmNlIGF0IHNlcnZpY2Ugc3RhcnR1cCBiZWZvcmUgYW55IGVuY3J5cHQvZGVjcnlwdC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZGVyaXZlZCA9IGhrZGZTeW5jKCdzaGEyNTYnLCB0aGlzLm1hc3RlcktleUNhY2hlLCBCdWZmZXIuZnJvbShvcmdJZCwgJ3V0ZjgnKSwgJ3NlY3JldHMtdjEnLCAzMik7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRlcml2ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVhZ2VybHkgcmVjb3ZlciB0aGUgbWFzdGVyIGtleSBmcm9tIEtNUyBzbyBzdWJzZXF1ZW50IGBkZXJpdmVLZXlgXG4gICAqIGNhbGxzIGFyZSBzeW5jLiBJZGVtcG90ZW50ICBjb25jdXJyZW50IGNhbGxlcnMgc2hhcmUgdGhlIHNhbWUgaW4tXG4gICAqIGZsaWdodCBwcm9taXNlIHNvIHdlIGRvbid0IHNwYXduIG11bHRpcGxlIEtNUyBEZWNyeXB0IHJlcXVlc3RzIGF0XG4gICAqIGJvb3QuIFRocm93cyBvbiBhbnkgS01TIGZhaWx1cmU7IHRoZSBjYWxsZXIgKHR5cGljYWxseSB0aGUgc2VydmljZSdzXG4gICAqIG9uQmVmb3JlU3RhcnQgaG9vaykgZGVjaWRlcyB3aGV0aGVyIHRvIGZhbGwgYmFjayB0byBhIGRpZmZlcmVudFxuICAgKiBwcm92aWRlciBvciBmYWlsLXN0YXJ0dXAuXG4gICAqL1xuICBhc3luYyB3YXJtdXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMubWFzdGVyS2V5Q2FjaGUpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuZGVjcnlwdEluRmxpZ2h0KSB7XG4gICAgICB0aGlzLmRlY3J5cHRJbkZsaWdodCA9IHRoaXMuZmV0Y2hBbmREZWNyeXB0KCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0aGlzLm1hc3RlcktleUNhY2hlID0gYXdhaXQgdGhpcy5kZWNyeXB0SW5GbGlnaHQ7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBBIHRyYW5zaWVudCBLTVMgZmFpbHVyZSBtdXN0IG5vdCBwZXJtYW5lbnRseSBwb2lzb24gdGhlIHByb3ZpZGVyOiBjbGVhclxuICAgICAgLy8gdGhlIHJlamVjdGVkIGluLWZsaWdodCBwcm9taXNlIHNvIGEgbGF0ZXIgd2FybXVwKCkgcmV0cmllcyBpbnN0ZWFkIG9mXG4gICAgICAvLyByZS1hd2FpdGluZyB0aGUgc2FtZSByZWplY3Rpb24gZm9yZXZlciAobWF0Y2hlcyBQZXJPcmdLbXNLZXlQcm92aWRlcikuXG4gICAgICB0aGlzLmRlY3J5cHRJbkZsaWdodCA9IG51bGw7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmZXRjaEFuZERlY3J5cHQoKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICByZXR1cm4ga21zRGVjcnlwdDMyKHRoaXMua2V5SWQsIHRoaXMuY2lwaGVydGV4dEI2NCwgdGhpcy5yZWdpb24sIHRoaXMuZW5kcG9pbnQpO1xuICB9XG59XG5cbi8vIExhenkgc2luZ2xldG9uICBvcGVyYXRvciBjb2RlIGluIGxvbmctbGl2ZWQgc2VydmljZXMgcGF5cyB0aGUgZW52LXBhcnNlXG4vLyBjb3N0IG9uY2UsIGFuZCB0ZXN0cyBjYW4gbWludCB0aGVpciBvd24gcHJvdmlkZXIgd2l0aCBhIGxpdGVyYWwga2V5LlxubGV0IGRlZmF1bHRQcm92aWRlcjogS2V5UHJvdmlkZXIgfCBudWxsID0gbnVsbDtcbmZ1bmN0aW9uIGdldERlZmF1bHRQcm92aWRlcigpOiBLZXlQcm92aWRlciB7XG4gIGlmICghZGVmYXVsdFByb3ZpZGVyKSBkZWZhdWx0UHJvdmlkZXIgPSBuZXcgRW52S2V5UHJvdmlkZXIoKTtcbiAgcmV0dXJuIGRlZmF1bHRQcm92aWRlcjtcbn1cblxuLyoqIFJlYWQgdGhlIGFjdGl2ZSBkZWZhdWx0IHByb3ZpZGVyLiBFeHBvc2VkIHNvIHNlcnZpY2UgY29kZSAoZS5nLiBhblxuICogIGFkbWluIGVuZHBvaW50IHRoYXQganVzdCByb3RhdGVkIGFuIG9yZydzIEtNUyBjb25maWcpIGNhbiBjYWxsXG4gKiAgYHByb3ZpZGVyLmV2aWN0KG9yZ0lkKWAgb24gdGhlIGxpdmUgcHJvdmlkZXIgcmF0aGVyIHRoYW4gcmVjb25zdHJ1Y3RpbmdcbiAqICBvbmUuIFRyaWdnZXJzIGxhenkgaW5pdGlhbGl6YXRpb24gb24gZmlyc3QgYWNjZXNzLCBzYW1lIGFzIHRoZSBpbnRlcm5hbFxuICogIGNhbGxlcnMgYmVsb3cuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdEtleVByb3ZpZGVyKCk6IEtleVByb3ZpZGVyIHtcbiAgcmV0dXJuIGdldERlZmF1bHRQcm92aWRlcigpO1xufVxuXG4vKipcbiAqIFJvdGF0aW9uIGZhbGxiYWNrOiBhbiBgRW52S2V5UHJvdmlkZXJgIG92ZXIgYFNFQ1JFVF9FTkNSWVBUSU9OX0tFWV9QUkVWSU9VU2AsXG4gKiBvciBudWxsIHdoZW4gdGhhdCBlbnYgaXMgdW5zZXQuIGB1bmRlZmluZWRgID0gbm90IHlldCByZXNvbHZlZC4gV2hpbGUgYVxuICogbWFzdGVyLWtleSByb3RhdGlvbiBpcyBpbiBwcm9ncmVzcywgYGRlY3J5cHRTZWNyZXRgIHJldHJpZXMgYSBmYWlsZWQgZGVjcnlwdFxuICogdW5kZXIgdGhpcyBrZXksIHNvIHJvd3Mgd3JpdHRlbiB1bmRlciB0aGUgb2xkIG1hc3RlciBzdGF5IHJlYWRhYmxlIHVudGlsIHRoZVxuICogcmUtZW5jcnlwdGlvbiB0b29sIChwbGF0Zm9ybSBgc2NyaXB0cy9yZWVuY3J5cHQtc2VjcmV0cy5qc2ApIGhhcyByZXdyaXR0ZW5cbiAqIHRoZW0gdW5kZXIgdGhlIG5ldyBvbmUuIEVuY3J5cHRpb24gTkVWRVIgdXNlcyBpdC5cbiAqL1xubGV0IHByZXZpb3VzUHJvdmlkZXI6IEtleVByb3ZpZGVyIHwgbnVsbCB8IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIGdldFByZXZpb3VzUHJvdmlkZXIoKTogS2V5UHJvdmlkZXIgfCBudWxsIHtcbiAgaWYgKHByZXZpb3VzUHJvdmlkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LlNFQ1JFVF9FTkNSWVBUSU9OX0tFWV9QUkVWSU9VUztcbiAgICBwcmV2aW91c1Byb3ZpZGVyID0gcmF3ID8gbmV3IEVudktleVByb3ZpZGVyKHJhdykgOiBudWxsO1xuICB9XG4gIHJldHVybiBwcmV2aW91c1Byb3ZpZGVyO1xufVxuXG4vKipcbiAqIFJlc29sdmUgKGFuZCBXQVJNKSB0aGUgcm90YXRpb24gZmFsbGJhY2suXG4gKlxuICogVHdvIHJvdGF0aW9uIHNoYXBlcywgYW5kIHRoZSBvcmRlciBtYXR0ZXJzOlxuICogIC0gS01TIG1hc3RlciByb3RhdGlvbjogYFNFQ1JFVF9FTkNSWVBUSU9OX0tNU19DSVBIRVJURVhUX1BSRVZJT1VTYCBob2xkcyB0aGVcbiAqICAgIG91dGdvaW5nIG1hc3RlciB3cmFwcGVkIHVuZGVyIGBTRUNSRVRfRU5DUllQVElPTl9LTVNfS0VZX0lEX1BSRVZJT1VTYCAob3JcbiAqICAgIHRoZSBjdXJyZW50IENNSywgd2hlbiBvbmx5IHRoZSBtYXN0ZXIgY2hhbmdlZCBhbmQgbm90IHRoZSBrZXkpLlxuICogIC0gTWlncmF0aW9uIEZST00gdGhlIGVudiBtYXN0ZXIgVE8gS01TOiB0aGUgcHJpbWFyeSBpcyB0aGUgbmV3IEtNUy13cmFwcGVkXG4gKiAgICBtYXN0ZXIgYW5kIHRoZSBvdXRnb2luZyBQTEFJTlRFWFQgbWFzdGVyIHN0YXlzIGluXG4gKiAgICBgU0VDUkVUX0VOQ1JZUFRJT05fS0VZX1BSRVZJT1VTYC4gVGhhdCBpcyB3aHkgdGhlIGVudiBmb3JtIGlzIHN0aWxsIHJlYWRcbiAqICAgIHdoZW4gbm8gS01TIHByZXZpb3VzIGlzIGNvbmZpZ3VyZWQsIHJhdGhlciB0aGFuIGJlaW5nIG11dHVhbGx5IGV4Y2x1c2l2ZS5cbiAqXG4gKiBXYXJtZWQgaGVyZSBiZWNhdXNlIGBkZWNyeXB0U2VjcmV0YCB0YWtlcyB0aGUgcHJldmlvdXMgcHJvdmlkZXIgYXMgYSBTWU5DXG4gKiBkZWZhdWx0IHBhcmFtZXRlciDigJQgYSBjb2xkIGBLbXNLZXlQcm92aWRlcmAgd291bGQgdGhyb3cgb3V0IG9mIGBkZXJpdmVLZXlgXG4gKiBvbiB0aGUgcmV0cnkgcGF0aCBhbmQgbWFzayB0aGUgb3JpZ2luYWwgZGVjcnlwdGlvbiBlcnJvci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5pdFByZXZpb3VzUHJvdmlkZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHdyYXBwZWRQcmV2aW91cyA9IHByb2Nlc3MuZW52LlNFQ1JFVF9FTkNSWVBUSU9OX0tNU19DSVBIRVJURVhUX1BSRVZJT1VTO1xuICBjb25zdCBwcmV2aW91c0tleUlkID0gcHJvY2Vzcy5lbnYuU0VDUkVUX0VOQ1JZUFRJT05fS01TX0tFWV9JRF9QUkVWSU9VUyA/PyBwcm9jZXNzLmVudi5TRUNSRVRfRU5DUllQVElPTl9LTVNfS0VZX0lEO1xuICBpZiAod3JhcHBlZFByZXZpb3VzICYmIHByZXZpb3VzS2V5SWQpIHtcbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBLbXNLZXlQcm92aWRlcih7IGtleUlkOiBwcmV2aW91c0tleUlkLCBjaXBoZXJ0ZXh0QmFzZTY0OiB3cmFwcGVkUHJldmlvdXMgfSk7XG4gICAgYXdhaXQgcHJvdmlkZXIud2FybXVwKCk7XG4gICAgcHJldmlvdXNQcm92aWRlciA9IHByb3ZpZGVyO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBwbGFpbnRleHRQcmV2aW91cyA9IHByb2Nlc3MuZW52LlNFQ1JFVF9FTkNSWVBUSU9OX0tFWV9QUkVWSU9VUztcbiAgcHJldmlvdXNQcm92aWRlciA9IHBsYWludGV4dFByZXZpb3VzID8gbmV3IEVudktleVByb3ZpZGVyKHBsYWludGV4dFByZXZpb3VzKSA6IG51bGw7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgKG5vbi1wZXItb3JnKSBwcm92aWRlciB0aGlzIGVudmlyb25tZW50IGFza3MgZm9yOiB0aGUgS01TLXdyYXBwZWRcbiAqIG1hc3RlciB3aGVuIGJvdGggb2YgaXRzIHZhcnMgYXJlIHNldCwgb3RoZXJ3aXNlIHRoZSBwbGFpbnRleHQgZW52IG1hc3Rlci5cbiAqXG4gKiBDb25zdHJ1Y3RzIGVhZ2VybHksIHNvIGl0IHRocm93cyB3aGVuIHRoZSBlbnYgbWFzdGVyIGlzIHJlcXVpcmVkIGFuZCBtaXNzaW5nLlxuICogYGluaXRTZWNyZXRFbmNyeXB0aW9uKClgIGlzIHRoZSBib290IGVudHJ5IHBvaW50IGFuZCBkZWxpYmVyYXRlbHkgZG9lcyBOT1RcbiAqIGNhbGwgdGhpcyBmb3IgdGhlIGVudiBjYXNlOyB1c2UgaXQgb25seSB3aGVyZSBhbiBpbnN0YW5jZSBpcyBuZWVkZWQgcmlnaHRcbiAqIGF3YXkg4oCUIGUuZy4gdGhlIHBlci1vcmcgZmFsbGJhY2ssIHdoaWNoIGlzIGFscmVhZHkgcGFzdCB0aGF0IGNoZWNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQmFzZUtleVByb3ZpZGVyKCk6IEtleVByb3ZpZGVyIHtcbiAgY29uc3Qga2V5SWQgPSBwcm9jZXNzLmVudi5TRUNSRVRfRU5DUllQVElPTl9LTVNfS0VZX0lEO1xuICBjb25zdCBjaXBoZXJ0ZXh0ID0gcHJvY2Vzcy5lbnYuU0VDUkVUX0VOQ1JZUFRJT05fS01TX0NJUEhFUlRFWFQ7XG4gIHJldHVybiBrZXlJZCAmJiBjaXBoZXJ0ZXh0ID8gbmV3IEttc0tleVByb3ZpZGVyKHsga2V5SWQsIGNpcGhlcnRleHRCYXNlNjQ6IGNpcGhlcnRleHQgfSkgOiBuZXcgRW52S2V5UHJvdmlkZXIoKTtcbn1cblxuLyoqXG4gKiBTZWxlY3QsIFdBUk0gYW5kIGluc3RhbGwgdGhlIGJhc2Uga2V5IHByb3ZpZGVyLiBDYWxsIG9uY2UgYXQgc3RhcnR1cCwgYmVmb3JlXG4gKiB0aGUgc2VydmljZSBzZXJ2ZXMgdHJhZmZpYy5cbiAqXG4gKiBXYXJtaW5nIG1hdHRlcnM6IGBLbXNLZXlQcm92aWRlci5kZXJpdmVLZXlgIGlzIHN5bmNocm9ub3VzIGFuZCByZWZ1c2VzIHRvIHdvcmtcbiAqIGNvbGQsIHNvIHdpdGhvdXQgdGhpcyBldmVyeSBzZWNyZXQgcmVhZC93cml0ZSB3b3VsZCB0aHJvdyB1bnRpbCBzb21ldGhpbmdcbiAqIGhhcHBlbmVkIHRvIGNhbGwgYHdhcm11cCgpYC4gRG9pbmcgaXQgYXQgYm9vdCBhbHNvIHR1cm5zIGEgYmFkIENNSywgYSBiYWRcbiAqIHdyYXBwZWQgbWFzdGVyIG9yIGEgbWlzc2luZyBga21zOkRlY3J5cHRgIGdyYW50IGludG8gYSBzdGFydHVwIGZhaWx1cmUgcmF0aGVyXG4gKiB0aGFuIGEgNTAwIG9uIHRoZSBmaXJzdCByZXF1ZXN0IHRoYXQgdG91Y2hlcyBhIHNlY3JldC5cbiAqXG4gKiBSZXR1cm5zIHRoZSB3YXJtZWQgcHJvdmlkZXIgc28gYSBjYWxsZXIgY2FuIGxheWVyIGBQZXJPcmdLbXNLZXlQcm92aWRlcmAgb3ZlclxuICogaXQgd2l0aG91dCBjb25zdHJ1Y3RpbmcgKGFuZCByZS13YXJtaW5nKSBhIHNlY29uZCBvbmUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0U2VjcmV0RW5jcnlwdGlvbigpOiBQcm9taXNlPHsgcHJvdmlkZXI6IEtleVByb3ZpZGVyIHwgbnVsbDsgbW9kZTogJ2VudicgfCAna21zJyB9PiB7XG4gIGNvbnN0IGtleUlkID0gcHJvY2Vzcy5lbnYuU0VDUkVUX0VOQ1JZUFRJT05fS01TX0tFWV9JRDtcbiAgY29uc3QgY2lwaGVydGV4dCA9IHByb2Nlc3MuZW52LlNFQ1JFVF9FTkNSWVBUSU9OX0tNU19DSVBIRVJURVhUO1xuXG4gIC8vIE5PIEtNUyBDT05GSUdVUkVEOiBkZWxpYmVyYXRlbHkgdG91Y2ggbm90aGluZyBhbmQgcmVwb3J0IGBudWxsYC5cbiAgLy9cbiAgLy8gYEVudktleVByb3ZpZGVyYCBuZWVkcyBubyB3YXJtaW5nLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGdhaW4gaGVyZSDigJQgYW5kXG4gIC8vIGNvbnN0cnVjdGluZyBvbmUgZWFnZXJseSB3b3VsZCBtYWtlIGBTRUNSRVRfRU5DUllQVElPTl9LRVlgIGEgaGFyZCBCT09UXG4gIC8vIHJlcXVpcmVtZW50IGZvciBldmVyeSBzZXJ2aWNlIHRoYXQgY2FsbHMgdGhpcywgaW5jbHVkaW5nIGRldiBhbmQgdGVzdCBydW5zXG4gIC8vIHRoYXQgbmV2ZXIgZW5jcnlwdCBhIHNlY3JldC4gVGhlIGxhenkgZGVmYXVsdCBzdGF5cyBleGFjdGx5IGFzIGl0IHdhczogdGhlXG4gIC8vIGZpcnN0IGBlbmNyeXB0U2VjcmV0YC9gZGVjcnlwdFNlY3JldGAgYnVpbGRzIGl0LCBhbmQgYSBtaXNzaW5nIG1hc3RlciB0aHJvd3NcbiAgLy8gdGhlcmUuIENhbGxlcnMgdGhhdCBuZWVkIGFuIGluc3RhbmNlICh0aGUgcGVyLW9yZyBmYWxsYmFjaykgY29uc3RydWN0IHRoZWlyXG4gIC8vIG93biBgRW52S2V5UHJvdmlkZXJgIHdoZW4gdGhpcyByZXR1cm5zIG51bGwuXG4gIGlmICgha2V5SWQgfHwgIWNpcGhlcnRleHQpIHJldHVybiB7IHByb3ZpZGVyOiBudWxsLCBtb2RlOiAnZW52JyB9O1xuXG4gIGNvbnN0IHByb3ZpZGVyID0gbmV3IEttc0tleVByb3ZpZGVyKHsga2V5SWQsIGNpcGhlcnRleHRCYXNlNjQ6IGNpcGhlcnRleHQgfSk7XG4gIGF3YWl0IHByb3ZpZGVyLndhcm11cCgpO1xuICBzZXRLZXlQcm92aWRlcihwcm92aWRlcik7XG4gIGF3YWl0IGluaXRQcmV2aW91c1Byb3ZpZGVyKCk7XG4gIHJldHVybiB7IHByb3ZpZGVyLCBtb2RlOiAna21zJyB9O1xufVxuXG4vKiogUmVzZXQgdGhlIGNhY2hlZCBkZWZhdWx0IChhbmQgcHJldmlvdXMpIHByb3ZpZGVyICBmb3IgdGVzdHMgdGhhdCBtdXRhdGUgYHByb2Nlc3MuZW52YC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldERlZmF1bHRLZXlQcm92aWRlcigpOiB2b2lkIHsgZGVmYXVsdFByb3ZpZGVyID0gbnVsbDsgcHJldmlvdXNQcm92aWRlciA9IHVuZGVmaW5lZDsgfVxuXG4vKiogUmVwbGFjZSB0aGUgZGVmYXVsdCBwcm92aWRlciAgc2VydmljZXMgdGhhdCBvcHQgaW50byBLTVMgY2FsbCB0aGlzXG4gKiBvbmNlIGF0IHN0YXJ0dXAgd2l0aCBhIHdhcm1lZC11cCBgS21zS2V5UHJvdmlkZXJgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEtleVByb3ZpZGVyKHByb3ZpZGVyOiBLZXlQcm92aWRlcik6IHZvaWQgeyBkZWZhdWx0UHJvdmlkZXIgPSBwcm92aWRlcjsgfVxuXG4vKiogUGVyLW9yZyBLTVMgY29uZmlnIHRoZSBvcGVyYXRvciBzdXBwbGllcy4gVGhlIGBrZXlJZGAgaWRlbnRpZmllcyB0aGVcbiAqICBLTVMgQ01LIHRvIGNhbGwgRGVjcnlwdCBvbjsgYGNpcGhlcnRleHRCYXNlNjRgIGlzIHRoZSB3cmFwcGVkIDMyLWJ5dGVcbiAqICBtYXN0ZXIgZ2VuZXJhdGVkIGJ5IGBhd3Mga21zIGVuY3J5cHRgIGFnYWluc3QgdGhhdCBrZXkuICovXG5leHBvcnQgaW50ZXJmYWNlIFBlck9yZ0ttc0NvbmZpZyB7XG4gIGtleUlkOiBzdHJpbmc7XG4gIGNpcGhlcnRleHRCYXNlNjQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBc3luYyByZXNvbHZlciB0aGF0IG1hcHMgYW4gb3JnIGlkIHRvIGl0cyBLTVMgY29uZmlnLiBSZXR1cm5zIGBudWxsYCB3aGVuXG4gKiB0aGUgb3JnIGhhcyBubyBwZXItb3JnIGNvbmZpZyDigJQgdGhlIHByb3ZpZGVyIHRoZW4gZmFsbHMgYmFjayB0byB0aGVcbiAqIGBmYWxsYmFja2AgcHJvdmlkZXIgc3VwcGxpZWQgYXQgY29uc3RydWN0aW9uICh1c3VhbGx5IGFuIEVudktleVByb3ZpZGVyXG4gKiBvciBhIGRlZmF1bHQgS21zS2V5UHJvdmlkZXIpLlxuICovXG5leHBvcnQgdHlwZSBQZXJPcmdLbXNSZXNvbHZlciA9IChvcmdJZDogc3RyaW5nKSA9PiBQcm9taXNlPFBlck9yZ0ttc0NvbmZpZyB8IG51bGw+O1xuXG4vKipcbiAqIFBlci1vcmcgS01TLWJhY2tlZCBLZXlQcm92aWRlci4gVGhlIGJsYXN0IHJhZGl1cyBvZiBhIEtNUyBrZXkgY29tcHJvbWlzZVxuICogaXMgb25lIG9yZyBpbnN0ZWFkIG9mIGV2ZXJ5IG9yZyB1bmRlciBhIHNoYXJlZCBtYXN0ZXIuXG4gKlxuICogRWFjaCBvcmcgaGFzIGl0cyBvd24gS01TIENNSyArIGl0cyBvd24gd3JhcHBlZCBtYXN0ZXIgKHN0b3JlZCBpbiBNb25nb1xuICogdmlhIHRoZSBvcGVyYXRvcidzIHNldHVwIHNjcmlwdCkuIE9uIGZpcnN0IGVuY3J5cHQvZGVjcnlwdCBmb3IgYW4gb3JnLFxuICogdGhlIHByb3ZpZGVyOlxuICogICAxLiBDYWxscyB0aGUgcmVzb2x2ZXIgdG8gZmV0Y2ggdGhlIG9yZydzIEtNUyBjb25maWcuXG4gKiAgIDIuIENhbGxzIGBrbXM6RGVjcnlwdGAgdG8gcmVjb3ZlciB0aGUgMzItYnl0ZSBtYXN0ZXIuXG4gKiAgIDMuIENhY2hlcyB0aGUgcmVjb3ZlcmVkIG1hc3RlciBpbi1tZW1vcnkgZm9yIHRoZSBwcm9jZXNzIGxpZmV0aW1lLlxuICogICA0LiBIS0RGLWRlcml2ZXMgcGVyLWNhbGwgZnJvbSB0aGF0IG1hc3RlciArIHRoZSBvcmcgaWQgc2FsdC5cbiAqXG4gKiBCbG9icyBlbmNyeXB0ZWQgYnkgdGhpcyBwcm92aWRlciBjYXJyeSBga2lkID0gPGttcy1rZXktaWQ+YCBzbyB0aGVcbiAqIGRlY3J5cHQgcGF0aCBkZXRlY3RzIGEgc3RhbGUgY29uZmlnIChvcGVyYXRvciByb3RhdGVkIHRoZSBrZXkgYnV0XG4gKiBleGlzdGluZyByb3dzIHdlcmVuJ3QgcmUtZW5jcnlwdGVkKSBCRUZPUkUgQUVTLUdDTSB0aHJvd3MgYW4gb3BhcXVlXG4gKiBhdXRoZW50aWNhdGlvbi10YWcgZXJyb3IuXG4gKlxuICogT3JncyB3aXRob3V0IHBlci1vcmcgY29uZmlnIGZhbGwgdGhyb3VnaCB0byB0aGUgYGZhbGxiYWNrYCBwcm92aWRlciDigJRcbiAqIG1peGVkLW1vZGUgZGVwbG95bWVudHMgd2hlcmUgc29tZSBvcmdzIGhhdmUgS01TIGlzb2xhdGlvbiBhbmQgb3RoZXJzXG4gKiBzdGF5IG9uIHRoZSBzaGFyZWQgbWFzdGVyIGFyZSBleHBsaWNpdGx5IHN1cHBvcnRlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFBlck9yZ0ttc0tleVByb3ZpZGVyIGltcGxlbWVudHMgS2V5UHJvdmlkZXIge1xuICAvKiogQ2FjaGVkIHBlci1vcmcgbWFzdGVyIGtleXMsIGtleWVkIGJ5IG9yZ0lkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG1hc3RlcnMgPSBuZXcgTWFwPHN0cmluZywgeyBrZXk6IEJ1ZmZlcjsga2lkOiBzdHJpbmcgfT4oKTtcbiAgLyoqIFJlc29sdmVkIHBlci1vcmcgY29uZmlncyBjYWNoZWQgZm9yIHRoZSBwcm9jZXNzIGxpZmV0aW1lLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ3MgPSBuZXcgTWFwPHN0cmluZywgUGVyT3JnS21zQ29uZmlnPigpO1xuICAvKiogSW4tZmxpZ2h0IHJlc29sdmVyIHByb21pc2VzIHNvIGNvbmN1cnJlbnQgZmlyc3QtdG91Y2ggY2FsbGVycyBzaGFyZSBvbmUgS01TIERlY3J5cHQuXG4gICAqICBSZXNvbHZlcyB0byBgbnVsbGAgZm9yIG9yZ3Mgd2l0aCBubyBwZXItb3JnIGNvbmZpZyDigJQgY2FsbGVyIHRyZWF0cyBudWxsIGFzXG4gICAqICBcImZhbGwgdGhyb3VnaCB0byB0aGUgZmFsbGJhY2sgcHJvdmlkZXJcIiwgc2FtZSBhcyBhIGNvbGQgY2FjaGUgbWlzcy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBpbkZsaWdodCA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHsga2V5OiBCdWZmZXI7IGtpZDogc3RyaW5nIH0gfCBudWxsPj4oKTtcbiAgLyoqIE9yZ3MgdGhlIHJlc29sdmVyIGhhcyBQUk9WRU4gaGF2ZSBubyBwZXItb3JnIGNvbmZpZyDigJQgdGhlIGZhbGxiYWNrIHByb3ZpZGVyXG4gICAqICBpcyB0aGUgY29ycmVjdCBhbnN3ZXIgZm9yIHRoZXNlLCBhbmQgYGRlcml2ZUtleWAgbWF5IHNlcnZlIHRoZW1cbiAgICogIHN5bmNocm9ub3VzbHkuIERpc3RpbmN0IGZyb20gXCJub3QgeWV0IHJlc29sdmVkXCIsIHdoaWNoIG11c3Qgbm90IGd1ZXNzLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc29sdmVkTm9QZXJPcmdDb25maWcgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLyoqIFByb3ZpZGVyIHVzZWQgZm9yIG9yZ3MgdGhhdCBoYXZlIG5vIHBlci1vcmcgY29uZmlnLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGZhbGxiYWNrOiBLZXlQcm92aWRlcjtcbiAgcHJpdmF0ZSByZWFkb25seSByZXNvbHZlcjogUGVyT3JnS21zUmVzb2x2ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaW9uPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGVuZHBvaW50Pzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wdHM6IHtcbiAgICByZXNvbHZlcjogUGVyT3JnS21zUmVzb2x2ZXI7XG4gICAgZmFsbGJhY2s6IEtleVByb3ZpZGVyO1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICBlbmRwb2ludD86IHN0cmluZztcbiAgfSkge1xuICAgIHRoaXMucmVzb2x2ZXIgPSBvcHRzLnJlc29sdmVyO1xuICAgIHRoaXMuZmFsbGJhY2sgPSBvcHRzLmZhbGxiYWNrO1xuICAgIHRoaXMucmVnaW9uID0gb3B0cy5yZWdpb24gPz8gcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiA/PyBwcm9jZXNzLmVudi5BV1NfREVGQVVMVF9SRUdJT047XG4gICAgdGhpcy5lbmRwb2ludCA9IG9wdHMuZW5kcG9pbnQgPz8gcHJvY2Vzcy5lbnYuQVdTX0tNU19FTkRQT0lOVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jIGRlcml2ZS4gT25seSBjb3JyZWN0IGZvciBhbiBvcmcgd2hvc2UgY29uZmlnIGhhcyBhbHJlYWR5IGJlZW5cbiAgICogUkVTT0xWRUQg4oCUIGVpdGhlciBpdCBoYXMgYSBwZXItb3JnIG1hc3RlciAodXNlIGl0KSBvciBpdCBwcm92YWJseSBoYXMgbm9cbiAgICogcGVyLW9yZyBjb25maWcgKHRoZSBmYWxsYmFjayBpcyB0aGVuIHRoZSByaWdodCBhbnN3ZXIpLlxuICAgKlxuICAgKiBGb3IgYW4gVU5SRVNPTFZFRCBvcmcgdGhpcyBUSFJPV1MgcmF0aGVyIHRoYW4gZ3Vlc3NpbmcuIEZhbGxpbmcgdGhyb3VnaCB0b1xuICAgKiB0aGUgZmFsbGJhY2sgd291bGQgc2lsZW50bHkgZW5jcnlwdCB0aGF0IG9yZydzIHNlY3JldHMgdW5kZXIgdGhlIFNIQVJFRFxuICAgKiBtYXN0ZXIgYW5kIOKAlCBiZWNhdXNlIGBraWRGb3JgIGFsc28gcmV0dXJucyB1bmRlZmluZWQsIHNvIHRoZVxuICAgKiBib3RoLWtpZHMtcHJlc2VudCBtaXNtYXRjaCBndWFyZCBjb3VsZCBuZXZlciBmaXJlIOKAlCBsZWF2ZSB0aGVtIHBlcm1hbmVudGx5XG4gICAqIHVuZGVjcnlwdGFibGUgb25jZSB0aGUgb3JnIHdhcm1lZCAoYGRlY2lwaGVyLmZpbmFsKClgIHRocm93cyBhbiBvcGFxdWVcbiAgICogYXV0aC10YWcgZXJyb3Igd2l0aCBubyBkaWFnbm9zdGljKS4gRmFpbGluZyBsb3VkIGhlcmUgbWF0Y2hlc1xuICAgKiBgS21zS2V5UHJvdmlkZXIuZGVyaXZlS2V5YCwgd2hpY2ggcmVmdXNlcyB0byB3b3JrIGNvbGQuXG4gICAqXG4gICAqIGBlbmNyeXB0U2VjcmV0YC9gZGVjcnlwdFNlY3JldGAgYXJlIGFzeW5jIGFuZCBhd2FpdCBgZGVyaXZlS2V5QXN5bmNgLCBzb1xuICAgKiB0aGV5IHJlc29sdmUgdGhlIG9yZyBmaXJzdCBhbmQgbmV2ZXIgaGl0IHRoaXMgcGF0aDsgaXQgaXMgdGhlIGJhY2tzdG9wIGZvclxuICAgKiBhIGNhbGxlciB0aGF0IHJlYWNoZXMgZm9yIHRoZSBzeW5jIEFQSSBkaXJlY3RseS5cbiAgICovXG4gIGRlcml2ZUtleShvcmdJZDogc3RyaW5nKTogQnVmZmVyIHtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLm1hc3RlcnMuZ2V0KG9yZ0lkKTtcbiAgICBpZiAoIWNhY2hlZCkge1xuICAgICAgaWYgKHRoaXMucmVzb2x2ZWROb1Blck9yZ0NvbmZpZy5oYXMob3JnSWQpKSByZXR1cm4gdGhpcy5mYWxsYmFjay5kZXJpdmVLZXkob3JnSWQpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCBgUGVyT3JnS21zS2V5UHJvdmlkZXIgaGFzIG5vdCByZXNvbHZlZCBvcmcgJHtvcmdJZH0uIGBcbiAgICAgICAgKyAnQ2FsbCBgYXdhaXQgcHJvdmlkZXIuZW5zdXJlV2FybWVkKG9yZ0lkKWAgKG9yIHVzZSB0aGUgYXN5bmMgZW5jcnlwdFNlY3JldC9kZWNyeXB0U2VjcmV0KSAnXG4gICAgICAgICsgJ2JlZm9yZSBkZXJpdmluZyBhIGtleSDigJQgZ3Vlc3NpbmcgdGhlIHNoYXJlZCBtYXN0ZXIgd291bGQgd3JpdGUgc2VjcmV0cyB0aGF0IGNhbm5vdCBiZSBkZWNyeXB0ZWQgbGF0ZXIuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGRlcml2ZWQgPSBoa2RmU3luYygnc2hhMjU2JywgY2FjaGVkLmtleSwgQnVmZmVyLmZyb20ob3JnSWQsICd1dGY4JyksICdzZWNyZXRzLXYxJywgMzIpO1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShkZXJpdmVkKTtcbiAgfVxuXG4gIGFzeW5jIGRlcml2ZUtleUFzeW5jKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlV2FybWVkKG9yZ0lkKTtcbiAgICByZXR1cm4gdGhpcy5kZXJpdmVLZXkob3JnSWQpO1xuICB9XG5cbiAga2lkRm9yKG9yZ0lkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMubWFzdGVycy5nZXQob3JnSWQpO1xuICAgIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQua2lkO1xuICAgIC8vIE9ubHkgc3BlYWsgZm9yIGFuIG9yZyB3aG9zZSBjb25maWcgaXMgcmVzb2x2ZWQ7IGFuIHVucmVzb2x2ZWQgb3JnIGhhcyBub1xuICAgIC8vIG1lYW5pbmdmdWwga2lkLCBhbmQgY2xhaW1pbmcgb25lIHdvdWxkIGRlZmVhdCB0aGUgbWlzbWF0Y2ggZ3VhcmQuXG4gICAgaWYgKHRoaXMucmVzb2x2ZWROb1Blck9yZ0NvbmZpZy5oYXMob3JnSWQpKSByZXR1cm4gdGhpcy5mYWxsYmFjay5raWRGb3I/LihvcmdJZCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSBvcmcncyBLTVMgY29uZmlnLCBjYWxsIERlY3J5cHQsIGNhY2hlIHRoZSBtYXN0ZXIuIFN1YnNlcXVlbnRcbiAgICogY2FsbHMgZm9yIHRoZSBzYW1lIG9yZyBhcmUgbm8tb3BzLiBDb25jdXJyZW50IGNhbGxlcnMgc2hhcmUgdGhlIGluLWZsaWdodFxuICAgKiBEZWNyeXB0IHByb21pc2UuXG4gICAqXG4gICAqIFJldHVybnMgc2lsZW50bHkgd2hlbiB0aGUgb3JnIGhhcyBubyBwZXItb3JnIGNvbmZpZyDigJQgdGhlIGZhbGxiYWNrXG4gICAqIHByb3ZpZGVyIGhhbmRsZXMgdGhvc2Ugb3Jncy5cbiAgICovXG4gIGFzeW5jIGVuc3VyZVdhcm1lZChvcmdJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMubWFzdGVycy5oYXMob3JnSWQpKSByZXR1cm47XG4gICAgLy8gSW5zdGFsbCB0aGUgaW4tZmxpZ2h0IHByb21pc2UgU1lOQ0hST05PVVNMWSBiZWZvcmUgeWllbGRpbmcgc28gY29uY3VycmVudFxuICAgIC8vIGNhbGxlcnMgZmluZCBpdCBvbiB0aGUgc2Vjb25kLWFuZC1sYXRlciBwYXNzZXMuIEF3YWl0aW5nIHRoZSByZXNvbHZlclxuICAgIC8vIGJlZm9yZSBwb3B1bGF0aW5nIHRoZSBtYXAgaXMgdGhlIGJ1ZyB0aGF0IGxldHMgYSBQcm9taXNlLmFsbCBvZiAzXG4gICAgLy8gY2FsbGVycyBmaXJlIDMgS01TIERlY3J5cHRzLlxuICAgIGxldCBwcm9taXNlID0gdGhpcy5pbkZsaWdodC5nZXQob3JnSWQpO1xuICAgIGlmICghcHJvbWlzZSkge1xuICAgICAgcHJvbWlzZSA9IHRoaXMucmVzb2x2ZUFuZERlY3J5cHQob3JnSWQpO1xuICAgICAgdGhpcy5pbkZsaWdodC5zZXQob3JnSWQsIHByb21pc2UpO1xuICAgICAgdm9pZCBwcm9taXNlLmZpbmFsbHkoKCkgPT4geyBpZiAodGhpcy5pbkZsaWdodC5nZXQob3JnSWQpID09PSBwcm9taXNlKSB0aGlzLmluRmxpZ2h0LmRlbGV0ZShvcmdJZCk7IH0pO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9taXNlO1xuICAgIGlmIChyZXN1bHQpIHRoaXMubWFzdGVycy5zZXQob3JnSWQsIHJlc3VsdCk7XG4gICAgLy8gUmVtZW1iZXIgdGhlIE5FR0FUSVZFIG91dGNvbWUgdG9vLCBzbyB0aGUgc3luYyBgZGVyaXZlS2V5YCBjYW4gdGVsbFxuICAgIC8vIFwibm8gcGVyLW9yZyBjb25maWcsIGZhbGxiYWNrIGlzIGNvcnJlY3RcIiBmcm9tIFwibm90IHJlc29sdmVkIHlldFwiLlxuICAgIGVsc2UgdGhpcy5yZXNvbHZlZE5vUGVyT3JnQ29uZmlnLmFkZChvcmdJZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc29sdmVBbmREZWNyeXB0KG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPHsga2V5OiBCdWZmZXI7IGtpZDogc3RyaW5nIH0gfCBudWxsPiB7XG4gICAgbGV0IGNmZyA9IHRoaXMuY29uZmlncy5nZXQob3JnSWQpO1xuICAgIGlmICghY2ZnKSB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHRoaXMucmVzb2x2ZXIob3JnSWQpO1xuICAgICAgaWYgKCFyZXNvbHZlZCkgcmV0dXJuIG51bGw7IC8vIG5vIHBlci1vcmcgY29uZmlnIOKGkiBjYWxsZXIgdXNlcyBmYWxsYmFja1xuICAgICAgY2ZnID0gcmVzb2x2ZWQ7XG4gICAgICB0aGlzLmNvbmZpZ3Muc2V0KG9yZ0lkLCBjZmcpO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmZldGNoQW5kRGVjcnlwdChjZmcpO1xuICAgIHJldHVybiB7IGtleSwga2lkOiBjZmcua2V5SWQgfTtcbiAgfVxuXG4gIHByaXZhdGUgZmV0Y2hBbmREZWNyeXB0KGNmZzogUGVyT3JnS21zQ29uZmlnKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICByZXR1cm4ga21zRGVjcnlwdDMyKGNmZy5rZXlJZCwgY2ZnLmNpcGhlcnRleHRCYXNlNjQsIHRoaXMucmVnaW9uLCB0aGlzLmVuZHBvaW50KTtcbiAgfVxuXG4gIC8qKiBFdmljdCBhIGNhY2hlZCBwZXItb3JnIG1hc3Rlci4gVXNlIGFmdGVyIGEga2V5IHJvdGF0aW9uIHNvIHRoZSBuZXh0XG4gICAqICB0b3VjaCByZS1mZXRjaGVzIHRoZSBuZXcgd3JhcHBlZCBtYXN0ZXIgZnJvbSB0aGUgcmVzb2x2ZXIuICovXG4gIGV2aWN0KG9yZ0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hc3RlcnMuZGVsZXRlKG9yZ0lkKTtcbiAgICB0aGlzLmNvbmZpZ3MuZGVsZXRlKG9yZ0lkKTtcbiAgICAvLyBBbHNvIGZvcmdldCBhIE5FR0FUSVZFIHJlc29sdXRpb24sIG9yIGFuIG9yZyB0aGF0IGdhaW5zIGEgcGVyLW9yZyBjb25maWdcbiAgICAvLyBhZnRlciBiZWluZyByZXNvbHZlZCBhcyBcIm5vIGNvbmZpZ1wiIHdvdWxkIGtlZXAgdXNpbmcgdGhlIHNoYXJlZCBtYXN0ZXIuXG4gICAgdGhpcy5yZXNvbHZlZE5vUGVyT3JnQ29uZmlnLmRlbGV0ZShvcmdJZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXJpdmUgdGhlIGtleSBmb3IgYG9yZ0lkYCwgZ2l2aW5nIHRoZSBwcm92aWRlciBhIGNoYW5jZSB0byBkbyBJL08gZmlyc3QuXG4gKlxuICogVGhpcyBpcyB3aHkgYGVuY3J5cHRTZWNyZXRgL2BkZWNyeXB0U2VjcmV0YCBhcmUgYXN5bmM6IGBQZXJPcmdLbXNLZXlQcm92aWRlcmBcbiAqIG5lZWRzIG9uZSBLTVMgRGVjcnlwdCB0aGUgZmlyc3QgdGltZSBpdCBzZWVzIGFuIG9yZywgYW5kIGRlcml2aW5nXG4gKiBzeW5jaHJvbm91c2x5IGJlZm9yZSB0aGF0IHJlc29sdmVzIHdvdWxkIHNpbGVudGx5IGZhbGwgYmFjayB0byB0aGUgc2hhcmVkXG4gKiBtYXN0ZXIgYW5kIHByb2R1Y2Ugc2VjcmV0cyB0aGF0IGNhbm5vdCBiZSBkZWNyeXB0ZWQgYWZ0ZXJ3YXJkcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVyaXZlS2V5Rm9yKHByb3ZpZGVyOiBLZXlQcm92aWRlciwgb3JnSWQ6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gIHJldHVybiBwcm92aWRlci5kZXJpdmVLZXlBc3luYyA/IHByb3ZpZGVyLmRlcml2ZUtleUFzeW5jKG9yZ0lkKSA6IHByb3ZpZGVyLmRlcml2ZUtleShvcmdJZCk7XG59XG5cbi8qKlxuICogRW5jcnlwdCBhIHBsYWludGV4dCBzdHJpbmcgZm9yIHN0b3JhZ2UuIFJldHVybnMgYW4gYEVuY3J5cHRlZEJsb2JgIHRoYXRcbiAqIGNhbiBiZSBKU09OLXNlcmlhbGl6ZWQgaW50byB0aGUgdW5kZXJseWluZyBjb2x1bW4gLyBNb25nbyBkb2N1bWVudC5cbiAqXG4gKiBFbXB0eSBzdHJpbmdzIHJvdW5kLXRyaXAgYXMgYG51bGxgIHNvIHRoZSBjYWxsaW5nIG1vZGVsIGxheWVyIGNhbiB0cmVhdFxuICogXCJubyBzZWNyZXQgc2V0XCIgaWRlbnRpY2FsbHkgdG8gXCJmaWVsZCBhYnNlbnRcIi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuY3J5cHRTZWNyZXQoIHBsYWludGV4dDogc3RyaW5nLFxuICBvcmdJZDogc3RyaW5nLFxuICBwcm92aWRlcjogS2V5UHJvdmlkZXIgPSBnZXREZWZhdWx0UHJvdmlkZXIoKSxcbik6IFByb21pc2U8RW5jcnlwdGVkQmxvYj4ge1xuICBpZiAoIXBsYWludGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVmdXNpbmcgdG8gZW5jcnlwdCBlbXB0eSBzdHJpbmc7IGNhbGxlciBzaG91bGQgc3RvcmUgbnVsbCBpbnN0ZWFkJyk7XG4gIH1cbiAgLy8gUmVzb2x2ZSAoYW5kIHdhcm0pIHRoZSBvcmcgQkVGT1JFIHJlYWRpbmcgYGtpZEZvcmAgYmVsb3csIHNvIGEgcGVyLW9yZyBLTVNcbiAgLy8gYmxvYiBpcyBhbHdheXMgc3RhbXBlZCB3aXRoIHRoZSBrZXkgaXQgd2FzIGFjdHVhbGx5IGVuY3J5cHRlZCB1bmRlci5cbiAgY29uc3Qga2V5ID0gYXdhaXQgZGVyaXZlS2V5Rm9yKHByb3ZpZGVyLCBvcmdJZCk7XG4gIGNvbnN0IGl2ID0gcmFuZG9tQnl0ZXMoMTIpO1xuICBjb25zdCBjaXBoZXIgPSBjcmVhdGVDaXBoZXJpdignYWVzLTI1Ni1nY20nLCBrZXksIGl2KTtcbiAgY29uc3QgZW5jID0gQnVmZmVyLmNvbmNhdChbY2lwaGVyLnVwZGF0ZShwbGFpbnRleHQsICd1dGY4JyksIGNpcGhlci5maW5hbCgpXSk7XG4gIGNvbnN0IHRhZyA9IGNpcGhlci5nZXRBdXRoVGFnKCk7XG4gIC8vIFBlck9yZ0ttc0tleVByb3ZpZGVyIHRhZ3MgYmxvYnMgd2l0aCB0aGUgS01TIGtleSBpZCB1c2VkIHNvIHRoZVxuICAvLyBkZWNyeXB0IHBhdGggY2FuIHJlZnVzZSB0byBvcGVyYXRlIGlmIHRoZSBvcGVyYXRvciBsYXRlciBzd2FwcyBpbiBhXG4gIC8vIGRpZmZlcmVudCBwZXItb3JnIGNvbmZpZyAoYSBtaXNjb25maWd1cmVkIHN3YXAgc2hvdWxkbid0IHNpbGVudGx5XG4gIC8vIGFjY2VwdCBhIHN0YWxlIGJsb2IgaXQgY2FuJ3QgdmVyaWZ5IGFnYWluc3QgdGhlIHJpZ2h0IENNSykuXG4gIGNvbnN0IGtpZCA9IHByb3ZpZGVyLmtpZEZvcj8uKG9yZ0lkKTtcbiAgcmV0dXJuIHtcbiAgICBhbGc6ICdhZXMtMjU2LWdjbS12MScsXG4gICAgaXY6IGl2LnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAvLyBHQ00gdGFnIE1VU1QgdHJhdmVsIHdpdGggdGhlIGNpcGhlcnRleHQgb3IgYGRlY3J5cHRTZWNyZXRgIGNhbid0XG4gICAgLy8gdmVyaWZ5IGludGVncml0eSAgY29uY2F0ZW5hdGUgc28gdGhlIG9uLWRpc2sgc2hhcGUgaXMgb25lIGZpZWxkLlxuICAgIGNpcGhlcnRleHQ6IEJ1ZmZlci5jb25jYXQoW2VuYywgdGFnXSkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIC4uLihraWQgIT09IHVuZGVmaW5lZCA/IHsga2lkIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKlxuICogRGVjcnlwdCBhbiBgRW5jcnlwdGVkQmxvYmAgd3JpdHRlbiBieSBgZW5jcnlwdFNlY3JldGAuIFRocm93cyBvbiAqIC0gdW5rbm93biBgYWxnYCAoZm9yY2VzIGFuIGV4cGxpY2l0IG1pZ3JhdGlvbiB3aGVuIHRoZSBmb3JtYXQgY2hhbmdlcylcbiAqIC0gd3Jvbmcgb3JnSWQgKEhLREYgYmluZGluZyBtaXNtYXRjaCBmYWlscyB0aGUgYXV0aCB0YWcpXG4gKiAtIHRhbXBlcmVkIGNpcGhlcnRleHQgKEdDTSBhdXRoIHRhZyBjaGVjayBmYWlscylcbiAqXG4gKiBDYWxsZXJzIGhhbmRsZSB0aGUgdGhyb3cgIG1hc2tpbmcgdGhlIGZhaWx1cmUgYXMgYG51bGxgIHdvdWxkIGhpZGVcbiAqIHNpbGVudCBjb3JydXB0aW9uIC8gd3Jvbmctb3JnIHJlYWRzLlxuICpcbiAqIGBwcmV2aW91c2AgKGRlZmF1bHQ6IGBTRUNSRVRfRU5DUllQVElPTl9LRVlfUFJFVklPVVNgLCB3aGVuIHNldCkgaXMgdHJpZWRcbiAqIG9ubHkgYWZ0ZXIgdGhlIHByaW1hcnkga2V5IGZhaWxzLCBhbmQgb25seSBmb3Iga2lkLWxlc3MgYmxvYnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0U2VjcmV0KCBibG9iOiBFbmNyeXB0ZWRCbG9iLFxuICBvcmdJZDogc3RyaW5nLFxuICBwcm92aWRlcjogS2V5UHJvdmlkZXIgPSBnZXREZWZhdWx0UHJvdmlkZXIoKSxcbiAgcHJldmlvdXM6IEtleVByb3ZpZGVyIHwgbnVsbCA9IGdldFByZXZpb3VzUHJvdmlkZXIoKSxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmIChibG9iLmFsZyAhPT0gJ2Flcy0yNTYtZ2NtLXYxJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZW5jcnlwdGlvbiBhbGc6ICR7YmxvYi5hbGd9YCk7XG4gIH1cbiAgLy8gV2FybSBmaXJzdDogYGtpZEZvcmAgYW5kIGBkZXJpdmVLZXlgIGJlbG93IG11c3QgYm90aCBzcGVhayBmb3IgdGhlIG9yZydzXG4gIC8vIHJlYWwgY29uZmlnLCBvciB0aGUgbWlzbWF0Y2ggZ3VhcmQgc2lsZW50bHkgbm8tb3BzLlxuICBjb25zdCBrZXkgPSBhd2FpdCBkZXJpdmVLZXlGb3IocHJvdmlkZXIsIG9yZ0lkKTtcbiAgLy8gSWYgYm90aCB0aGUgcHJvdmlkZXIgQU5EIHRoZSBibG9iIHJlcG9ydCBhIGtpZCwgdGhleSBtdXN0IG1hdGNoLlxuICAvLyBNaXNtYXRjaCB1c3VhbGx5IG1lYW5zIGFuIG9wZXJhdG9yIHJvdGF0ZWQvcmVwbGFjZWQgYW4gb3JnJ3MgS01TXG4gIC8vIGNvbmZpZyBhbmQgaXMgbm93IHJlYWRpbmcgYSBibG9iIGVuY3J5cHRlZCB1bmRlciB0aGUgT0xEIGtleSDigJRcbiAgLy8gZmFpbGluZyBsb3VkIGhlcmUgYmVhdHMgbGV0dGluZyBBRVMtR0NNIHRocm93IGFuIG9wYXF1ZSBhdXRoLXRhZyBlcnJvci5cbiAgY29uc3QgcHJvdmlkZXJLaWQgPSBwcm92aWRlci5raWRGb3I/LihvcmdJZCk7XG4gIGlmIChwcm92aWRlcktpZCAhPT0gdW5kZWZpbmVkICYmIGJsb2Iua2lkICE9PSB1bmRlZmluZWQgJiYgcHJvdmlkZXJLaWQgIT09IGJsb2Iua2lkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBLTVMga2V5IGlkIG1pc21hdGNoOiBibG9iIHdhcyBlbmNyeXB0ZWQgdW5kZXIgJHtibG9iLmtpZH0sIGN1cnJlbnQgcHJvdmlkZXIgdXNlcyAke3Byb3ZpZGVyS2lkfSBmb3Igb3JnICR7b3JnSWR9YCk7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjcnlwdFdpdGhLZXkoYmxvYiwga2V5KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gTWFzdGVyLWtleSByb3RhdGlvbiB3aW5kb3c6IHJldHJ5IHVuZGVyIFNFQ1JFVF9FTkNSWVBUSU9OX0tFWV9QUkVWSU9VUy5cbiAgICAvLyBPbmx5IGZvciBhIGtpZC1sZXNzIGJsb2IgKHRoZSBlbnYta2V5ZWQgc2hhcGUpIOKAlCBhIHBlci1vcmcgS01TIGJsb2IgaXNcbiAgICAvLyBib3VuZCB0byBpdHMgQ01LIGFuZCB0aGUgc2hhcmVkIHByZXZpb3VzIG1hc3RlciBjYW4gbmV2ZXIgb3BlbiBpdC4gVGhlXG4gICAgLy8gT1JJR0lOQUwgZXJyb3Igc3VyZmFjZXMgd2hlbiB0aGUgcHJldmlvdXMga2V5IGZhaWxzIHRvbywgc28gYSB0YW1wZXJlZCBvclxuICAgIC8vIHdyb25nLW9yZyBibG9iIHN0aWxsIGZhaWxzIGxvdWQgZXhhY3RseSBhcyBiZWZvcmUuXG4gICAgaWYgKHByZXZpb3VzICYmIGJsb2Iua2lkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkZWNyeXB0V2l0aEtleShibG9iLCBhd2FpdCBkZXJpdmVLZXlGb3IocHJldmlvdXMsIG9yZ0lkKSk7XG4gICAgICB9IGNhdGNoIHsgLyogZmFsbCB0aHJvdWdoIHRvIHRoZSBwcmltYXJ5IGVycm9yICovIH1cbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbi8qKiBBRVMtMjU2LUdDTSBvcGVuIG9mIGEgYmxvYiB1bmRlciBvbmUgZGVyaXZlZCBrZXkuIFRocm93cyBvbiBhbnkgYXV0aC10YWcgZmFpbHVyZS4gKi9cbmZ1bmN0aW9uIGRlY3J5cHRXaXRoS2V5KGJsb2I6IEVuY3J5cHRlZEJsb2IsIGtleTogQnVmZmVyKTogc3RyaW5nIHtcbiAgY29uc3QgaXYgPSBCdWZmZXIuZnJvbShibG9iLml2LCAnYmFzZTY0Jyk7XG4gIGNvbnN0IGFsbCA9IEJ1ZmZlci5mcm9tKGJsb2IuY2lwaGVydGV4dCwgJ2Jhc2U2NCcpO1xuICAvLyBTcGxpdCBvZmYgdGhlIDE2LWJ5dGUgYXV0aCB0YWcgYXBwZW5kZWQgaW4gZW5jcnlwdFNlY3JldC4gQW55IHRhbXBlcmluZ1xuICAvLyAgdG8gZWl0aGVyIHRoZSBjaXBoZXJ0ZXh0IE9SIHRoZSB0YWcgIGNhdXNlcyB0aGUgbmV4dCBgZmluYWwoKWAgdG9cbiAgLy8gdGhyb3cgd2l0aCBcIlVuc3VwcG9ydGVkIHN0YXRlIG9yIHVuYWJsZSB0byBhdXRoZW50aWNhdGUgZGF0YVwiLlxuICBjb25zdCB0YWcgPSBhbGwuc3ViYXJyYXkoYWxsLmxlbmd0aCAtIDE2KTtcbiAgY29uc3QgZW5jID0gYWxsLnN1YmFycmF5KDAsIGFsbC5sZW5ndGggLSAxNik7XG4gIGNvbnN0IGRlY2lwaGVyID0gY3JlYXRlRGVjaXBoZXJpdignYWVzLTI1Ni1nY20nLCBrZXksIGl2KTtcbiAgZGVjaXBoZXIuc2V0QXV0aFRhZyh0YWcpO1xuICBjb25zdCBkZWMgPSBCdWZmZXIuY29uY2F0KFtkZWNpcGhlci51cGRhdGUoZW5jKSwgZGVjaXBoZXIuZmluYWwoKV0pO1xuICByZXR1cm4gZGVjLnRvU3RyaW5nKCd1dGY4Jyk7XG59XG5cbi8qKlxuICogU2hhcGUgZ3VhcmQgZm9yIGEgcGFyc2VkIGBFbmNyeXB0ZWRCbG9iYC4gQ2FsbGVycyBob2xkIGEgdmFsdWUgdGhhdCB3YXMgSlNPTi1cbiAqIGRlY29kZWQgZnJvbSBhIHNlY3JldCBjb2x1bW4gYW5kIG11c3Qgbm90IGhhbmQgYW55dGhpbmcgZWxzZSB0b1xuICogYGRlY3J5cHRTZWNyZXRgOyB0aGlzIG5hcnJvd3MgaXQgKG9yIHRoZSBjYWxsZXIgcmVqZWN0cyB0aGUgdmFsdWUpLiBDbGVhciB0ZXh0XG4gKiBpcyBOT1QgYSBzdXBwb3J0ZWQgc3RvcmVkIGZvcm0g4oCUIHRoZSBvbmx5IGNvbnN1bWVyIHRocm93cyBvbiBhIG5vbi1ibG9iLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbmNyeXB0ZWRCbG9iKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgRW5jcnlwdGVkQmxvYiB7XG4gIHJldHVybiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCdcbiAgICAmJiB2YWx1ZSAhPT0gbnVsbFxuICAgICYmICh2YWx1ZSBhcyB7IGFsZz86IHVua25vd24gfSkuYWxnID09PSAnYWVzLTI1Ni1nY20tdjEnXG4gICAgJiYgdHlwZW9mICh2YWx1ZSBhcyB7IGl2PzogdW5rbm93biB9KS5pdiA9PT0gJ3N0cmluZydcbiAgICAmJiB0eXBlb2YgKHZhbHVlIGFzIHsgY2lwaGVydGV4dD86IHVua25vd24gfSkuY2lwaGVydGV4dCA9PT0gJ3N0cmluZydcbiAgKTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -105,7 +105,7 @@
105
105
  ]
106
106
  }
107
107
  },
108
- "version": "5.0.2",
108
+ "version": "5.0.4",
109
109
  "bugs": {
110
110
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
111
111
  },