UNPKG

aws-cdk

Version:

AWS CDK Toolkit CLI, the command line tool for CDK apps

153 lines • 18.6 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.ProxyAgentProvider = void 0; exports.validateProxyAddress = validateProxyAddress; exports.normalizeNetworkSetting = normalizeNetworkSetting; const path = __importStar(require("node:path")); const fs = __importStar(require("fs-extra")); const proxy_agent_1 = require("proxy-agent"); const api_private_error_1 = require("../api-private-error"); /** * Validate a proxy address up front. * * `proxy-agent` only rejects an address with a missing or unsupported protocol * lazily, on the first request, so without `-vvv` the CLI appears to hang or * fails later with a misleading error (e.g. missing credentials). Fail fast * here with an actionable message instead. */ function validateProxyAddress(proxyAddress) { let protocol; try { protocol = new URL(proxyAddress).protocol.replace(/:$/, ''); } catch { throw new api_private_error_1.ToolkitError('InvalidProxyAddress', `Invalid proxy address '${proxyAddress}': it must be a URL that includes a protocol, e.g. 'http://${proxyAddress}'.`); } if (!(protocol in proxy_agent_1.proxies)) { throw new api_private_error_1.ToolkitError('InvalidProxyAddress', `Unsupported protocol '${protocol}' in proxy address '${proxyAddress}'. Supported protocols are: ${Object.keys(proxy_agent_1.proxies).join(', ')}.`); } } /** * Coerce a raw network setting into a value the rest of the CLI can rely on. * * `Settings.get()` is untyped and surfaces an unset `--proxy` or `--ca-bundle-path` as either * `undefined` or an empty array, depending on how it was parsed. An empty STRING is a different * thing: `--proxy ''` means "go direct, ignore the proxy environment variables", so it has to survive * normalization. Anything that is not a string counts as unconfigured, which is what makes the * environment the fallback. * * Applied at the point these settings enter typed code, for two reasons. An empty array is truthy, so * it slips past every `if (value)` guard downstream and then fails somewhere unhelpful -- * `path.resolve([])` throws a `TypeError` that the CA-bundle resolver swallows, silently discarding * the bundle. And both values now cross a process boundary into the detached telemetry sender, which * has no access to the settings to re-derive them. */ function normalizeNetworkSetting(raw) { return typeof raw === 'string' ? raw : undefined; } class ProxyAgentProvider { ioHelper; constructor(ioHelper) { this.ioHelper = ioHelper; } async create(options) { const proxyAddress = normalizeNetworkSetting(options.proxyAddress); // Only a non-empty address is a proxy to validate. An empty one is a configured "go direct". if (proxyAddress) { validateProxyAddress(proxyAddress); } // Force it to use the proxy provided through the command line -- including an empty one, which // `proxy-agent` reads as "no proxy for this URL". Only an unconfigured proxy falls through to // ProxyAgent's own environment-variable detection. const getProxyForUrl = proxyAddress !== undefined ? () => Promise.resolve(proxyAddress) : undefined; const caBundlePath = await this.resolveCABundlePath(normalizeNetworkSetting(options.caBundlePath)); return { agent: new proxy_agent_1.ProxyAgent({ ca: await this.tryReadCABundle(caBundlePath), getProxyForUrl, }), caBundlePath, }; } /** * Resolve the configured CA bundle to an absolute path, or undefined if there isn't a usable one. * * Absolute because the path is handed to the detached sender, which runs from a different cwd. */ async resolveCABundlePath(bundlePath) { const configured = bundlePath || this.caBundlePathFromEnvironment(); if (!configured) { return undefined; } try { const resolved = path.resolve(configured); await this.ioHelper.defaults.debug(`Using CA bundle path: ${resolved}`); return fs.pathExistsSync(resolved) ? resolved : undefined; } catch (e) { await this.ioHelper.defaults.debug(String(e)); return undefined; } } async tryReadCABundle(bundlePath) { if (!bundlePath) { return undefined; } try { return fs.readFileSync(bundlePath, { encoding: 'utf-8' }); } catch (e) { await this.ioHelper.defaults.debug(String(e)); return undefined; } } /** * Find and return a CA certificate bundle path to be passed into the SDK. */ caBundlePathFromEnvironment() { if (process.env.aws_ca_bundle) { return process.env.aws_ca_bundle; } if (process.env.AWS_CA_BUNDLE) { return process.env.AWS_CA_BUNDLE; } return undefined; } } exports.ProxyAgentProvider = ProxyAgentProvider; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHktYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwcm94eS1hZ2VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFhQSxvREFpQkM7QUFpQkQsMERBRUM7QUFqREQsZ0RBQWtDO0FBQ2xDLDZDQUErQjtBQUMvQiw2Q0FBa0Q7QUFDbEQsNERBQW9EO0FBRXBEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixvQkFBb0IsQ0FBQyxZQUFvQjtJQUN2RCxJQUFJLFFBQWdCLENBQUM7SUFDckIsSUFBSSxDQUFDO1FBQ0gsUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxNQUFNLElBQUksZ0NBQVksQ0FDcEIscUJBQXFCLEVBQ3JCLDBCQUEwQixZQUFZLDhEQUE4RCxZQUFZLElBQUksQ0FDckgsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLENBQUMsQ0FBQyxRQUFRLElBQUkscUJBQU8sQ0FBQyxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLGdDQUFZLENBQ3BCLHFCQUFxQixFQUNyQix5QkFBeUIsUUFBUSx1QkFBdUIsWUFBWSwrQkFBK0IsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ3RJLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQUMsR0FBWTtJQUNsRCxPQUFPLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDbkQsQ0FBQztBQXNERCxNQUFhLGtCQUFrQjtJQUNaLFFBQVEsQ0FBd0I7SUFFakQs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b3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBQcm94eUFnZW50LCBwcm94aWVzIH0gZnJvbSAncHJveHktYWdlbnQnO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnLi4vYXBpLXByaXZhdGUtZXJyb3InO1xuXG4vKipcbiAqIFZhbGlkYXRlIGEgcHJveHkgYWRkcmVzcyB1cCBmcm9udC5cbiAqXG4gKiBgcHJveHktYWdlbnRgIG9ubHkgcmVqZWN0cyBhbiBhZGRyZXNzIHdpdGggYSBtaXNzaW5nIG9yIHVuc3VwcG9ydGVkIHByb3RvY29sXG4gKiBsYXppbHksIG9uIHRoZSBmaXJzdCByZXF1ZXN0LCBzbyB3aXRob3V0IGAtdnZ2YCB0aGUgQ0xJIGFwcGVhcnMgdG8gaGFuZyBvclxuICogZmFpbHMgbGF0ZXIgd2l0aCBhIG1pc2xlYWRpbmcgZXJyb3IgKGUuZy4gbWlzc2luZyBjcmVkZW50aWFscykuIEZhaWwgZmFzdFxuICogaGVyZSB3aXRoIGFuIGFjdGlvbmFibGUgbWVzc2FnZSBpbnN0ZWFkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVQcm94eUFkZHJlc3MocHJveHlBZGRyZXNzOiBzdHJpbmcpOiB2b2lkIHtcbiAgbGV0IHByb3RvY29sOiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgcHJvdG9jb2wgPSBuZXcgVVJMKHByb3h5QWRkcmVzcykucHJvdG9jb2wucmVwbGFjZSgvOiQvLCAnJyk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoXG4gICAgICAnSW52YWxpZFByb3h5QWRkcmVzcycsXG4gICAgICBgSW52YWxpZCBwcm94eSBhZGRyZXNzICcke3Byb3h5QWRkcmVzc30nOiBpdCBtdXN0IGJlIGEgVVJMIHRoYXQgaW5jbHVkZXMgYSBwcm90b2NvbCwgZS5nLiAnaHR0cDovLyR7cHJveHlBZGRyZXNzfScuYCxcbiAgICApO1xuICB9XG5cbiAgaWYgKCEocHJvdG9jb2wgaW4gcHJveGllcykpIHtcbiAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKFxuICAgICAgJ0ludmFsaWRQcm94eUFkZHJlc3MnLFxuICAgICAgYFVuc3VwcG9ydGVkIHByb3RvY29sICcke3Byb3RvY29sfScgaW4gcHJveHkgYWRkcmVzcyAnJHtwcm94eUFkZHJlc3N9Jy4gU3VwcG9ydGVkIHByb3RvY29scyBhcmU6ICR7T2JqZWN0LmtleXMocHJveGllcykuam9pbignLCAnKX0uYCxcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogQ29lcmNlIGEgcmF3IG5ldHdvcmsgc2V0dGluZyBpbnRvIGEgdmFsdWUgdGhlIHJlc3Qgb2YgdGhlIENMSSBjYW4gcmVseSBvbi5cbiAqXG4gKiBgU2V0dGluZ3MuZ2V0KClgIGlzIHVudHlwZWQgYW5kIHN1cmZhY2VzIGFuIHVuc2V0IGAtLXByb3h5YCBvciBgLS1jYS1idW5kbGUtcGF0aGAgYXMgZWl0aGVyXG4gKiBgdW5kZWZpbmVkYCBvciBhbiBlbXB0eSBhcnJheSwgZGVwZW5kaW5nIG9uIGhvdyBpdCB3YXMgcGFyc2VkLiBBbiBlbXB0eSBTVFJJTkcgaXMgYSBkaWZmZXJlbnRcbiAqIHRoaW5nOiBgLS1wcm94eSAnJ2AgbWVhbnMgXCJnbyBkaXJlY3QsIGlnbm9yZSB0aGUgcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGVzXCIsIHNvIGl0IGhhcyB0byBzdXJ2aXZlXG4gKiBub3JtYWxpemF0aW9uLiBBbnl0aGluZyB0aGF0IGlzIG5vdCBhIHN0cmluZyBjb3VudHMgYXMgdW5jb25maWd1cmVkLCB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZVxuICogZW52aXJvbm1lbnQgdGhlIGZhbGxiYWNrLlxuICpcbiAqIEFwcGxpZWQgYXQgdGhlIHBvaW50IHRoZXNlIHNldHRpbmdzIGVudGVyIHR5cGVkIGNvZGUsIGZvciB0d28gcmVhc29ucy4gQW4gZW1wdHkgYXJyYXkgaXMgdHJ1dGh5LCBzb1xuICogaXQgc2xpcHMgcGFzdCBldmVyeSBgaWYgKHZhbHVlKWAgZ3VhcmQgZG93bnN0cmVhbSBhbmQgdGhlbiBmYWlscyBzb21ld2hlcmUgdW5oZWxwZnVsIC0tXG4gKiBgcGF0aC5yZXNvbHZlKFtdKWAgdGhyb3dzIGEgYFR5cGVFcnJvcmAgdGhhdCB0aGUgQ0EtYnVuZGxlIHJlc29sdmVyIHN3YWxsb3dzLCBzaWxlbnRseSBkaXNjYXJkaW5nXG4gKiB0aGUgYnVuZGxlLiBBbmQgYm90aCB2YWx1ZXMgbm93IGNyb3NzIGEgcHJvY2VzcyBib3VuZGFyeSBpbnRvIHRoZSBkZXRhY2hlZCB0ZWxlbWV0cnkgc2VuZGVyLCB3aGljaFxuICogaGFzIG5vIGFjY2VzcyB0byB0aGUgc2V0dGluZ3MgdG8gcmUtZGVyaXZlIHRoZW0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVOZXR3b3JrU2V0dGluZyhyYXc6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHJhdyA9PT0gJ3N0cmluZycgPyByYXcgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgcHJveHktYWdlbnQgU0RLc1xuICovXG5pbnRlcmZhY2UgUHJveHlBZ2VudE9wdGlvbnMge1xuICAvKipcbiAgICogUHJveHkgYWRkcmVzcyB0byB1c2VcbiAgICpcbiAgICogQGRlZmF1bHQgTm8gcHJveHlcbiAgICovXG4gIHJlYWRvbmx5IHByb3h5QWRkcmVzcz86IHN0cmluZztcblxuICAvKipcbiAgICogQSBwYXRoIHRvIGEgY2VydGlmaWNhdGUgYnVuZGxlIHRoYXQgY29udGFpbnMgYSBjZXJ0IHRvIGJlIHRydXN0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vIGNlcnRpZmljYXRlIGJ1bmRsZVxuICAgKi9cbiAgcmVhZG9ubHkgY2FCdW5kbGVQYXRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwcm94eSBjb25maWd1cmF0aW9uIHJlc29sdmVkIGZvciB0aGlzIGludm9jYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRQcm94eUFnZW50IHtcbiAgLyoqXG4gICAqIFRoZSBhZ2VudCB0byBwYXNzIHRvIGFueXRoaW5nIG1ha2luZyBIVFRQUyByZXF1ZXN0cyBpbiB0aGlzIHByb2Nlc3MuXG4gICAqL1xuICByZWFkb25seSBhZ2VudDogUHJveHlBZ2VudDtcblxuICAvKipcbiAgICogQWJzb2x1dGUgcGF0aCB0byB0aGUgcmVzb2x2ZWQgQ0EgYnVuZGxlLCBpZiBvbmUgd2FzIGNvbmZpZ3VyZWQgYW5kIGV4aXN0cyBvbiBkaXNrLlxuICAgKlxuICAgKiBFeHBvc2VkIGJlY2F1c2UgYGFnZW50YCBjYW5ub3QgY3Jvc3MgYSBwcm9jZXNzIGJvdW5kYXJ5OiB0aGUgZGV0YWNoZWQgdGVsZW1ldHJ5IHNlbmRlciBidWlsZHMgaXRzXG4gICAqIG93biBhbmQgbmVlZHMgdG8gYmUgdG9sZCB3aGljaCBidW5kbGUgdG8gdHJ1c3QuIFRoZSBwYXRoIHRyYXZlbHMgcmF0aGVyIHRoYW4gdGhlIGJ5dGVzLCBiZWNhdXNlIGFcbiAgICogc3lzdGVtIGJ1bmRsZSBpcyByb3V0aW5lbHkgfjE5MEtCLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIENBIGJ1bmRsZSB3YXMgY29uZmlndXJlZCwgb3IgdGhlIGNvbmZpZ3VyZWQgb25lIGRvZXMgbm90IGV4aXN0XG4gICAqL1xuICByZWFkb25seSBjYUJ1bmRsZVBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcnQgb2YgYElvSGVscGVyYCB0aGF0IHByb3h5IHJlc29sdXRpb24gbmVlZHMuXG4gKlxuICogU3RydWN0dXJhbCBzbyB0aGUgZGV0YWNoZWQgdGVsZW1ldHJ5IHNlbmRlciwgd2hpY2ggaGFzIG5vIElvSG9zdCwgY2FuIHBhc3MgYSB3cml0ZXIgdGhhdCBnb2VzIHRvXG4gKiBzdGRlcnIgaW5zdGVhZC4gQSBmdWxsIGBJb0hlbHBlcmAgc2F0aXNmaWVzIHRoaXMgYXMtaXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJveHlBZ2VudERpYWdub3N0aWNzIHtcbiAgcmVhZG9ubHkgZGVmYXVsdHM6IHtcbiAgICBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgUHJveHlBZ2VudFByb3ZpZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBpb0hlbHBlcjogUHJveHlBZ2VudERpYWdub3N0aWNzO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihpb0hlbHBlcjogUHJveHlBZ2VudERpYWdub3N0aWNzKSB7XG4gICAgdGhpcy5pb0hlbHBlciA9IGlvSGVscGVyO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNyZWF0ZShvcHRpb25zOiBQcm94eUFnZW50T3B0aW9ucyk6IFByb21pc2U8UmVzb2x2ZWRQcm94eUFnZW50PiB7XG4gICAgY29uc3QgcHJveHlBZGRyZXNzID0gbm9ybWFsaXplTmV0d29ya1NldHRpbmcob3B0aW9ucy5wcm94eUFkZHJlc3MpO1xuXG4gICAgLy8gT25seSBhIG5vbi1lbXB0eSBhZGRyZXNzIGlzIGEgcHJveHkgdG8gdmFsaWRhdGUuIEFuIGVtcHR5IG9uZSBpcyBhIGNvbmZpZ3VyZWQgXCJnbyBkaXJlY3RcIi5cbiAgICBpZiAocHJveHlBZGRyZXNzKSB7XG4gICAgICB2YWxpZGF0ZVByb3h5QWRkcmVzcyhwcm94eUFkZHJlc3MpO1xuICAgIH1cblxuICAgIC8vIEZvcmNlIGl0IHRvIHVzZSB0aGUgcHJveHkgcHJvdmlkZWQgdGhyb3VnaCB0aGUgY29tbWFuZCBsaW5lIC0tIGluY2x1ZGluZyBhbiBlbXB0eSBvbmUsIHdoaWNoXG4gICAgLy8gYHByb3h5LWFnZW50YCByZWFkcyBhcyBcIm5vIHByb3h5IGZvciB0aGlzIFVSTFwiLiBPbmx5IGFuIHVuY29uZmlndXJlZCBwcm94eSBmYWxscyB0aHJvdWdoIHRvXG4gICAgLy8gUHJveHlBZ2VudCdzIG93biBlbnZpcm9ubWVudC12YXJpYWJsZSBkZXRlY3Rpb24uXG4gICAgY29uc3QgZ2V0UHJveHlGb3JVcmwgPSBwcm94eUFkZHJlc3MgIT09IHVuZGVmaW5lZFxuICAgICAgPyAoKSA9PiBQcm9taXNlLnJlc29sdmUocHJveHlBZGRyZXNzKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBjYUJ1bmRsZVBhdGggPSBhd2FpdCB0aGlzLnJlc29sdmVDQUJ1bmRsZVBhdGgobm9ybWFsaXplTmV0d29ya1NldHRpbmcob3B0aW9ucy5jYUJ1bmRsZVBhdGgpKTtcblxuICAgIHJldHVybiB7XG4gICAgICBhZ2VudDogbmV3IFByb3h5QWdlbnQoe1xuICAgICAgICBjYTogYXdhaXQgdGhpcy50cnlSZWFkQ0FCdW5kbGUoY2FCdW5kbGVQYXRoKSxcbiAgICAgICAgZ2V0UHJveHlGb3JVcmwsXG4gICAgICB9KSxcbiAgICAgIGNhQnVuZGxlUGF0aCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIGNvbmZpZ3VyZWQgQ0EgYnVuZGxlIHRvIGFuIGFic29sdXRlIHBhdGgsIG9yIHVuZGVmaW5lZCBpZiB0aGVyZSBpc24ndCBhIHVzYWJsZSBvbmUuXG4gICAqXG4gICAqIEFic29sdXRlIGJlY2F1c2UgdGhlIHBhdGggaXMgaGFuZGVkIHRvIHRoZSBkZXRhY2hlZCBzZW5kZXIsIHdoaWNoIHJ1bnMgZnJvbSBhIGRpZmZlcmVudCBjd2QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc29sdmVDQUJ1bmRsZVBhdGgoYnVuZGxlUGF0aD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgY29uZmlndXJlZCA9IGJ1bmRsZVBhdGggfHwgdGhpcy5jYUJ1bmRsZVBhdGhGcm9tRW52aXJvbm1lbnQoKTtcbiAgICBpZiAoIWNvbmZpZ3VyZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gcGF0aC5yZXNvbHZlKGNvbmZpZ3VyZWQpO1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5kZWJ1ZyhgVXNpbmcgQ0EgYnVuZGxlIHBhdGg6ICR7cmVzb2x2ZWR9YCk7XG4gICAgICByZXR1cm4gZnMucGF0aEV4aXN0c1N5bmMocmVzb2x2ZWQpID8gcmVzb2x2ZWQgOiB1bmRlZmluZWQ7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmRlYnVnKFN0cmluZyhlKSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdHJ5UmVhZENBQnVuZGxlKGJ1bmRsZVBhdGg/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghYnVuZGxlUGF0aCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmMoYnVuZGxlUGF0aCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuZGVidWcoU3RyaW5nKGUpKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW5kIHJldHVybiBhIENBIGNlcnRpZmljYXRlIGJ1bmRsZSBwYXRoIHRvIGJlIHBhc3NlZCBpbnRvIHRoZSBTREsuXG4gICAqL1xuICBwcml2YXRlIGNhQnVuZGxlUGF0aEZyb21FbnZpcm9ubWVudCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmIChwcm9jZXNzLmVudi5hd3NfY2FfYnVuZGxlKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuYXdzX2NhX2J1bmRsZTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52LkFXU19DQV9CVU5ETEUpIHtcbiAgICAgIHJldHVybiBwcm9jZXNzLmVudi5BV1NfQ0FfQlVORExFO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=