@financialforcedev/orizuru-auth
Version:
Salesforce authentication for Heroku Node applications.
84 lines • 14.6 kB
JavaScript
;
/*
* Copyright (c) 2019, FinancialForce.com, inc
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of the FinancialForce.com, inc nor the names of its contributors
* may be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
Object.defineProperty(exports, "__esModule", { value: true });
const openid_1 = require("./openid");
const identity_1 = require("./salesforce/identity");
/**
* A Salesforce Client that implements the [Salesforce OAuth 2.0](https://help.salesforce.com/articleView?id=remoteaccess_authenticate_overview.htm) specification.
*/
class SalesforceClient extends openid_1.OpenIdClient {
/**
* Creates a new OpenID client with the given environment.
*
* @param env The OAuth2 environment parameters.
*/
constructor(env) {
super(env);
this.clientType = 'Salesforce';
}
/**
* @inheritdoc
* @returns The Salesforce Access Token Response.
*/
async grant(params, opts) {
return super.grant(params, opts);
}
/**
* @inheritdoc
*/
handleAccessTokenResponse(accessTokenResponse, internalOpts) {
super.handleAccessTokenResponse(accessTokenResponse, internalOpts);
try {
if (internalOpts.verifySignature) {
if (internalOpts && internalOpts.clientSecret) {
identity_1.verifySignature(internalOpts.clientSecret, accessTokenResponse);
}
else {
throw new Error('Missing required string parameter: clientSecret');
}
}
if (internalOpts.parseUserInfo) {
identity_1.parseUserInfo(accessTokenResponse);
}
}
catch (error) {
throw new Error(`Failed to obtain grant: ${error.message}.`);
}
return accessTokenResponse;
}
/**
* @inheritdoc
*/
handleIntrospectionResponse(introspectionResponse, internalOpts) {
if (internalOpts.parseUserInfo) {
identity_1.parseUserInfo(introspectionResponse);
}
return introspectionResponse;
}
}
exports.SalesforceClient = SalesforceClient;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FsZXNmb3JjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9pbmRleC9jbGllbnQvc2FsZXNmb3JjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRzs7QUFTSCxxQ0FBdUY7QUFDdkYsb0RBQXlGO0FBd0h6Rjs7R0FFRztBQUNILE1BQWEsZ0JBQWlCLFNBQVEscUJBQVk7SUFFakQ7Ozs7T0FJRztJQUNILFlBQVksR0FBZ0I7UUFDM0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsSUFBSSxDQUFDLFVBQVUsR0FBRyxZQUFZLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBbUIsRUFBRSxJQUE2QjtRQUNwRSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBcUIsRUFBRSxJQUFJLENBQTJDLENBQUM7SUFDM0YsQ0FBQztJQUVEOztPQUVHO0lBQ08seUJBQXlCLENBQUMsbUJBQWtELEVBQUUsWUFBb0M7UUFFM0gsS0FBSyxDQUFDLHlCQUF5QixDQUFDLG1CQUFtQixFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRW5FLElBQUk7WUFFSCxJQUFJLFlBQVksQ0FBQyxlQUFlLEVBQUU7Z0JBRWpDLElBQUksWUFBWSxJQUFJLFlBQVksQ0FBQyxZQUFZLEVBQUU7b0JBQzlDLDBCQUFlLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO2lCQUNoRTtxQkFBTTtvQkFDTixNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7aUJBQ25FO2FBRUQ7WUFFRCxJQUFJLFlBQVksQ0FBQyxhQUFhLEVBQUU7Z0JBQy9CLHdCQUFhLENBQUMsbUJBQW1CLENBQUMsQ0FBQzthQUNuQztTQUVEO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixLQUFLLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztTQUM3RDtRQUVELE9BQU8sbUJBQW1CLENBQUM7SUFFNUIsQ0FBQztJQUVEOztPQUVHO0lBQ08sMkJBQTJCLENBQUMscUJBQXNELEVBQUUsWUFBNEM7UUFFekksSUFBSSxZQUFZLENBQUMsYUFBYSxFQUFFO1lBQy9CLHdCQUFhLENBQUMscUJBQXFCLENBQUMsQ0FBQztTQUNyQztRQUVELE9BQU8scUJBQXFCLENBQUM7SUFDOUIsQ0FBQztDQUVEO0FBL0RELDRDQStEQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTksIEZpbmFuY2lhbEZvcmNlLmNvbSwgaW5jXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sXG4gKiAgIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBGaW5hbmNpYWxGb3JjZS5jb20sIGluYyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXRcbiAqICAgICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORFxuICogIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVNcbiAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTFxuICogIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLFxuICogIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EU1xuICogIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWVxuICogIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuICogIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbi8qKlxuICogQG1vZHVsZSBjbGllbnQvc2FsZXNmb3JjZVxuICovXG5cbmltcG9ydCB7IEVudmlyb25tZW50IH0gZnJvbSAnLi9jYWNoZSc7XG5pbXBvcnQgeyBHcmFudFBhcmFtcywgSW50cm9zcGVjdGlvbk9wdGlvbnMsIEludHJvc3BlY3Rpb25SZXNwb25zZSB9IGZyb20gJy4vb2F1dGgyJztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuL29hdXRoMkp3dCc7XG5pbXBvcnQgeyBPcGVuSURBY2Nlc3NUb2tlblJlc3BvbnNlLCBPcGVuSWRDbGllbnQsIE9wZW5JZEdyYW50T3B0aW9ucyB9IGZyb20gJy4vb3BlbmlkJztcbmltcG9ydCB7IHBhcnNlVXNlckluZm8sIFVzZXJJbmZvUmVzcG9uc2UsIHZlcmlmeVNpZ25hdHVyZSB9IGZyb20gJy4vc2FsZXNmb3JjZS9pZGVudGl0eSc7XG5cbi8qKlxuICogVGhlIFNhbGVzZm9yY2UgQWNjZXNzIFRva2VuIFJlc3BvbnNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqc29uXG4gKlxuICoge1xuICogXHRcImlkXCI6IFwiaHR0cHM6Ly9sb2dpbi5zYWxlc2ZvcmNlLmNvbS9pZC8wMER4MDAwMDAwMEJWN3ovMDA1eDAwMDAwMDEyUTlQXCIsXG4gKiBcdFwiaXNzdWVkX2F0XCI6IFwiMTI3ODQ0ODEwMTQxNlwiLFxuICogXHRcInJlZnJlc2hfdG9rZW5cIjogXCI1QWVwODYxNGlMTS5EcTY2MWVQRG1QRWdhQVc5T2hfTDNKS2tEcEI0eFJlYjU0X3BaZWJuVUcwaDZTYjRLVVZEcE50V0VvZldNMzl5Zz09XCIsXG4gKiBcdFwiaW5zdGFuY2VfdXJsXCI6IFwiaHR0cHM6Ly95b3VySW5zdGFuY2Uuc2FsZXNmb3JjZS5jb20vXCIsXG4gKiBcdFwic2lnbmF0dXJlXCI6IFwiQ01KNGwrQ0NhUFFpS2pvT0V3RWlnOUg0d3FocHVMU2s0SjJ1ckFlK2ZWZz1cIixcbiAqIFx0XCJhY2Nlc3NfdG9rZW5cIjogXCIwMER4MDAwMDAwMEJWN3ohQVI4QVFQMGpJVE44MEVTRXNqNUViYVpURkcwUk5CYVQxY3lXazdUcnFvRGpvTklXUTJNRV9zVFp6QmpmbU9FNnpNSHE2eThQSVc0ZVd6ZTlKa3NORWtXVWwuQ2p1N200XCIsXG4gKiBcdFwidG9rZW5fdHlwZVwiOiBcIkJlYXJlclwiLFxuICogXHRcInNjb3BlXCI6IFwiaWQgYXBpIHJlZnJlc2hfdG9rZW5cIlxuICogfVxuICpcbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbGVzZm9yY2VBY2Nlc3NUb2tlblJlc3BvbnNlIGV4dGVuZHMgT3BlbklEQWNjZXNzVG9rZW5SZXNwb25zZSwgVXNlckluZm9SZXNwb25zZSB7XG5cblx0LyoqXG5cdCAqIEEgVVJMIGluZGljYXRpbmcgdGhlIGluc3RhbmNlIG9mIHRoZSB1c2Vy4oCZcyBvcmcuIEZvciBleGFtcGxlOiBodHRwczovL3lvdXJJbnN0YW5jZS5zYWxlc2ZvcmNlLmNvbS8uXG5cdCAqL1xuXHRpbnN0YW5jZV91cmw/OiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIElmIHRoZSB1c2VyIGlzIGEgbWVtYmVyIG9mIGEgU2FsZXNmb3JjZSBjb21tdW5pdHksIHRoZSBjb21tdW5pdHkgVVJMIGlzIHByb3ZpZGVkLlxuXHQgKi9cblx0c2ZkY19jb21tdW5pdHlfdXJsPzogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBJZiB0aGUgdXNlciBpcyBhIG1lbWJlciBvZiBhIFNhbGVzZm9yY2UgY29tbXVuaXR5LCB0aGUgdXNlcuKAmXMgY29tbXVuaXR5IElEIGlzIHByb3ZpZGVkLlxuXHQgKi9cblx0c2ZkY19jb21tdW5pdHlfaWQ/OiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIEJhc2U2NC1lbmNvZGVkIEhNQUMtU0hBMjU2IHNpZ25hdHVyZSBzaWduZWQgd2l0aCB0aGUgY2xpZW50IHNlY3JldCAocHJpdmF0ZSBrZXkpIGNvbnRhaW5pbmcgdGhlXG5cdCAqIGNvbmNhdGVuYXRlZCBJRCBhbmQgaXNzdWVkX2F0LiBVc2VkIHRvIHZlcmlmeSB0aGF0IHRoZSBpZGVudGl0eSBVUkwgaGFzbuKAmXQgY2hhbmdlZCBzaW5jZSB0aGVcblx0ICogc2VydmVyIHNlbnQgaXQuXG5cdCAqL1xuXHRzaWduYXR1cmU6IHN0cmluZztcblxuXHQvKipcblx0ICogV2hlbiB0aGUgc2lnbmF0dXJlIHdhcyBjcmVhdGVkLlxuXHQgKi9cblx0aXNzdWVkX2F0OiBzdHJpbmc7XG5cbn1cblxuLyoqXG4gKiBPcHRpb25hbCBwYXJhbWV0ZXJzIHVzZWQgd2hlbiByZXF1ZXN0aW5nIGdyYW50cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYWxlc2ZvcmNlR3JhbnRPcHRpb25zIGV4dGVuZHMgT3BlbklkR3JhbnRPcHRpb25zIHtcblxuXHQvKipcblx0ICogSWYgdHJ1ZSwgcGFyc2VzIHRoZSB1c2VyIGluZm9ybWF0aW9uIGZyb20gdGhlIGlkIGZpZWxkIGluIHRoZSBhY2Nlc3MgdG9rZW4gcmVzcG9uc2UuXG5cdCAqXG5cdCAqIFRoaXMgcmV0dXJucyB0aGUgdXNlciBJRCwgb3JnYW5pemF0aW9uIElEIGFuZCB0aGUgSUQgdXJsLlxuXHQgKi9cblx0cGFyc2VVc2VySW5mbz86IGJvb2xlYW47XG5cblx0LyoqXG5cdCAqIElmIHRydWUsIHRoZSBzaWduYXR1cmUgb24gdGhlIGFjY2VzcyB0b2tlbiByZXNwb25zZSBpcyB2ZXJpZmllZC5cblx0ICovXG5cdHZlcmlmeVNpZ25hdHVyZT86IGJvb2xlYW47XG5cbn1cblxuLyoqXG4gKiBUaGUgU2FsZXNmb3JjZSBJbnRyb3NwZWN0aW9uIE9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FsZXNmb3JjZUludHJvc3BlY3Rpb25PcHRpb25zIGV4dGVuZHMgSW50cm9zcGVjdGlvbk9wdGlvbnMge1xuXG5cdC8qKlxuXHQgKiBJZiB0cnVlLCBwYXJzZXMgdGhlIHVzZXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgaWQgZmllbGQgaW4gdGhlIGFjY2VzcyB0b2tlbiByZXNwb25zZS5cblx0ICpcblx0ICogVGhpcyByZXR1cm5zIHRoZSB1c2VyIElELCBvcmdhbml6YXRpb24gSUQgYW5kIHRoZSBJRCB1cmwuXG5cdCAqL1xuXHRwYXJzZVVzZXJJbmZvPzogYm9vbGVhbjtcblxufVxuXG4vKipcbiAqIFRoZSBTYWxlc2ZvcmNlIEludHJvc3BlY3Rpb24gUmVzcG9uc2UuXG4gKlxuICogQWRkcyB0aGUgdXNlciBpbmZvIGluZm9ybWF0aW9uIHRvIHRoZSBzdGFuZGFyZCBpbnRyb3NwZWN0aW9uIHJlc3BvbnNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqc29uXG4gKiB7XG4gKiBcdFwiYWN0aXZlXCI6IHRydWUsXG4gKiBcdFwiY2xpZW50X2lkXCI6IFwiT0F1dGhTcFwiLFxuICogXHRcImV4cFwiOiAxNTI4NTAyMTA5LFxuICogXHRcImlhdFwiOiAxNTI4NDk0OTA5LFxuICogXHRcIm5iZlwiOiAxNTI4NDk0OTA5LFxuICogXHRcInNjb3BlXCI6IFwiaWQgYXBpIHdlYiBmdWxsIHJlZnJlc2hfdG9rZW4gb3BlbmlkXCIsXG4gKiBcdFwic3ViXCI6IFwiaHR0cHM6Ly9sb2dpbi5zYWxlc2ZvcmNlLmNvbS9pZC8wMER4eDAwMDAwMDFnRVJFQVkvMDA1eHgwMDAwMDFTdjZBQUFTXCIsXG4gKiBcdFwidG9rZW5fdHlwZVwiOiBcImFjY2Vzc190b2tlblwiLFxuICogXHRcInVzZXJuYW1lXCI6IFwidGVzdEB0ZXN0LmNvbVwiXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYWxlc2ZvcmNlSW50cm9zcGVjdGlvblJlc3BvbnNlIGV4dGVuZHMgSW50cm9zcGVjdGlvblJlc3BvbnNlLCBVc2VySW5mb1Jlc3BvbnNlIHtcbn1cblxuLyoqXG4gKiBUaGUgVXNlciBjcmVkZW50aWFscyByZXF1aXJlZCB0byBpbml0aWFsaXNlIHRoZSBKV1QgZmxvdy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYWxlc2ZvcmNlVXNlciBleHRlbmRzIFVzZXIge1xuXG5cdC8qKlxuXHQgKiBUaGUgb3JnYW5pemF0aW9uIElELlxuXHQgKi9cblx0b3JnYW5pemF0aW9uSWQ/OiBzdHJpbmc7XG5cbn1cblxuLyoqXG4gKiBBIFNhbGVzZm9yY2UgQ2xpZW50IHRoYXQgaW1wbGVtZW50cyB0aGUgW1NhbGVzZm9yY2UgT0F1dGggMi4wXShodHRwczovL2hlbHAuc2FsZXNmb3JjZS5jb20vYXJ0aWNsZVZpZXc/aWQ9cmVtb3RlYWNjZXNzX2F1dGhlbnRpY2F0ZV9vdmVydmlldy5odG0pIHNwZWNpZmljYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBTYWxlc2ZvcmNlQ2xpZW50IGV4dGVuZHMgT3BlbklkQ2xpZW50IHtcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBPcGVuSUQgY2xpZW50IHdpdGggdGhlIGdpdmVuIGVudmlyb25tZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gZW52IFRoZSBPQXV0aDIgZW52aXJvbm1lbnQgcGFyYW1ldGVycy5cblx0ICovXG5cdGNvbnN0cnVjdG9yKGVudjogRW52aXJvbm1lbnQpIHtcblx0XHRzdXBlcihlbnYpO1xuXHRcdHRoaXMuY2xpZW50VHlwZSA9ICdTYWxlc2ZvcmNlJztcblx0fVxuXG5cdC8qKlxuXHQgKiBAaW5oZXJpdGRvY1xuXHQgKiBAcmV0dXJucyBUaGUgU2FsZXNmb3JjZSBBY2Nlc3MgVG9rZW4gUmVzcG9uc2UuXG5cdCAqL1xuXHRwdWJsaWMgYXN5bmMgZ3JhbnQocGFyYW1zOiBHcmFudFBhcmFtcywgb3B0cz86IFNhbGVzZm9yY2VHcmFudE9wdGlvbnMpOiBQcm9taXNlPFNhbGVzZm9yY2VBY2Nlc3NUb2tlblJlc3BvbnNlPiB7XG5cdFx0cmV0dXJuIHN1cGVyLmdyYW50KHBhcmFtcyBhcyBHcmFudFBhcmFtcywgb3B0cykgYXMgUHJvbWlzZTxTYWxlc2ZvcmNlQWNjZXNzVG9rZW5SZXNwb25zZT47XG5cdH1cblxuXHQvKipcblx0ICogQGluaGVyaXRkb2Ncblx0ICovXG5cdHByb3RlY3RlZCBoYW5kbGVBY2Nlc3NUb2tlblJlc3BvbnNlKGFjY2Vzc1Rva2VuUmVzcG9uc2U6IFNhbGVzZm9yY2VBY2Nlc3NUb2tlblJlc3BvbnNlLCBpbnRlcm5hbE9wdHM6IFNhbGVzZm9yY2VHcmFudE9wdGlvbnMpIHtcblxuXHRcdHN1cGVyLmhhbmRsZUFjY2Vzc1Rva2VuUmVzcG9uc2UoYWNjZXNzVG9rZW5SZXNwb25zZSwgaW50ZXJuYWxPcHRzKTtcblxuXHRcdHRyeSB7XG5cblx0XHRcdGlmIChpbnRlcm5hbE9wdHMudmVyaWZ5U2lnbmF0dXJlKSB7XG5cblx0XHRcdFx0aWYgKGludGVybmFsT3B0cyAmJiBpbnRlcm5hbE9wdHMuY2xpZW50U2VjcmV0KSB7XG5cdFx0XHRcdFx0dmVyaWZ5U2lnbmF0dXJlKGludGVybmFsT3B0cy5jbGllbnRTZWNyZXQsIGFjY2Vzc1Rva2VuUmVzcG9uc2UpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcignTWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyOiBjbGllbnRTZWNyZXQnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmIChpbnRlcm5hbE9wdHMucGFyc2VVc2VySW5mbykge1xuXHRcdFx0XHRwYXJzZVVzZXJJbmZvKGFjY2Vzc1Rva2VuUmVzcG9uc2UpO1xuXHRcdFx0fVxuXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIG9idGFpbiBncmFudDogJHtlcnJvci5tZXNzYWdlfS5gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYWNjZXNzVG9rZW5SZXNwb25zZTtcblxuXHR9XG5cblx0LyoqXG5cdCAqIEBpbmhlcml0ZG9jXG5cdCAqL1xuXHRwcm90ZWN0ZWQgaGFuZGxlSW50cm9zcGVjdGlvblJlc3BvbnNlKGludHJvc3BlY3Rpb25SZXNwb25zZTogU2FsZXNmb3JjZUludHJvc3BlY3Rpb25SZXNwb25zZSwgaW50ZXJuYWxPcHRzOiBTYWxlc2ZvcmNlSW50cm9zcGVjdGlvbk9wdGlvbnMpIHtcblxuXHRcdGlmIChpbnRlcm5hbE9wdHMucGFyc2VVc2VySW5mbykge1xuXHRcdFx0cGFyc2VVc2VySW5mbyhpbnRyb3NwZWN0aW9uUmVzcG9uc2UpO1xuXHRcdH1cblxuXHRcdHJldHVybiBpbnRyb3NwZWN0aW9uUmVzcG9uc2U7XG5cdH1cblxufVxuIl19