UNPKG

aws-cdk

Version:

CDK Toolkit, the command line tool for CDK apps

117 lines 17.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const client_ssm_1 = require("@aws-sdk/client-ssm"); const api_1 = require("../../lib/api"); const context_1 = require("../../lib/api/context"); const environment_resources_1 = require("../../lib/api/environment-resources"); const version = require("../../lib/cli/version"); const notices_1 = require("../../lib/notices"); const mock_sdk_1 = require("../util/mock-sdk"); const mock_toolkitinfo_1 = require("../util/mock-toolkitinfo"); let mockSdk; let envRegistry; let toolkitMock; beforeEach(() => { mockSdk = new mock_sdk_1.MockSdk(); envRegistry = new environment_resources_1.EnvironmentResourcesRegistry(); toolkitMock = mock_toolkitinfo_1.MockToolkitInfo.setup(); }); afterEach(() => { toolkitMock.dispose(); }); function mockToolkitInfo(ti) { api_1.ToolkitInfo.lookup = jest.fn().mockResolvedValue(ti); } function envResources() { return envRegistry.for({ account: '11111111', region: 'us-nowhere', name: 'aws://11111111/us-nowhere', }, mockSdk); } test('failure to read SSM parameter results in upgrade message for existing bootstrap stack under v5', async () => { // GIVEN mockToolkitInfo(api_1.ToolkitInfo.fromStack((0, mock_sdk_1.mockBootstrapStack)({ Outputs: [{ OutputKey: 'BootstrapVersion', OutputValue: '4' }], }))); const error = new Error('Computer says no'); error.name = 'AccessDeniedException'; mock_sdk_1.mockSSMClient.on(client_ssm_1.GetParameterCommand).rejects(error); // THEN await expect(envResources().validateVersion(99, '/abc')).rejects.toThrow(/This CDK deployment requires bootstrap stack version/); }); test('failure to read SSM parameter results in exception passthrough for existing bootstrap stack v5 or higher', async () => { // GIVEN mockToolkitInfo(api_1.ToolkitInfo.fromStack((0, mock_sdk_1.mockBootstrapStack)({ Outputs: [{ OutputKey: 'BootstrapVersion', OutputValue: '5' }], }))); const error = new Error('Computer says no'); error.name = 'AccessDeniedException'; mock_sdk_1.mockSSMClient.on(client_ssm_1.GetParameterCommand).rejects(error); // THEN await expect(envResources().validateVersion(99, '/abc')).rejects.toThrow(/Computer says no/); }); describe('validateversion without bootstrap stack', () => { beforeEach(() => { mockToolkitInfo(api_1.ToolkitInfo.bootstrapStackNotFoundInfo('TestBootstrapStack')); }); afterEach(() => { jest.clearAllMocks(); }); test('validating version with explicit SSM parameter succeeds', async () => { // GIVEN mock_sdk_1.mockSSMClient.on(client_ssm_1.GetParameterCommand).resolves({ Parameter: { Value: '10' }, }); // disable notices caching jest.spyOn(notices_1.CachedDataSource.prototype, 'save').mockImplementation((_) => Promise.resolve()); jest .spyOn(notices_1.CachedDataSource.prototype, 'load') .mockImplementation(() => Promise.resolve({ expiration: 0, notices: [] })); // mock cli version number jest.spyOn(version, 'versionNumber').mockImplementation(() => '1.0.0'); // THEN const notices = notices_1.Notices.create({ context: new context_1.Context() }); await notices.refresh({ dataSource: { fetch: async () => [] } }); await expect(envResources().validateVersion(8, '/abc')).resolves.toBeUndefined(); const filter = jest.spyOn(notices_1.NoticesFilter, 'filter'); notices.display(); expect(filter).toHaveBeenCalledTimes(1); expect(filter).toHaveBeenCalledWith({ bootstrappedEnvironments: [ { bootstrapStackVersion: 10, environment: { account: '11111111', region: 'us-nowhere', name: 'aws://11111111/us-nowhere', }, }, ], cliVersion: '1.0.0', data: [], outDir: 'cdk.out', }); }); test('validating version without explicit SSM parameter fails', async () => { // WHEN await expect(envResources().validateVersion(8, undefined)).rejects.toThrow(/This deployment requires a bootstrap stack with a known name/); }); test('validating version with access denied error gives upgrade hint', async () => { // GIVEN const error = new Error('Computer says no'); error.name = 'AccessDeniedException'; mock_sdk_1.mockSSMClient.on(client_ssm_1.GetParameterCommand).rejects(error); // WHEN await expect(envResources().validateVersion(8, '/abc')).rejects.toThrow(/This CDK deployment requires bootstrap stack version/); }); test('validating version with missing parameter gives bootstrap hint', async () => { // GIVEN const error = new Error('Wut?'); error.name = 'ParameterNotFound'; mock_sdk_1.mockSSMClient.on(client_ssm_1.GetParameterCommand).rejects(error); // WHEN await expect(envResources().validateVersion(8, '/abc')).rejects.toThrow(/Has the environment been bootstrapped?/); }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQtcmVzb3VyY2VzLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJlbnZpcm9ubWVudC1yZXNvdXJjZXMudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLG9EQUEwRDtBQUMxRCx1Q0FBNEM7QUFDNUMsbURBQWdEO0FBQ2hELCtFQUFtRjtBQUNuRixpREFBaUQ7QUFDakQsK0NBQTZFO0FBQzdFLCtDQUE4RTtBQUM5RSwrREFBMkQ7QUFFM0QsSUFBSSxPQUFnQixDQUFDO0FBQ3JCLElBQUksV0FBeUMsQ0FBQztBQUM5QyxJQUFJLFdBQXFELENBQUM7QUFDMUQsVUFBVSxDQUFDLEdBQUcsRUFBRTtJQUNkLE9BQU8sR0FBRyxJQUFJLGtCQUFPLEVBQUUsQ0FBQztJQUN4QixXQUFXLEdBQUcsSUFBSSxvREFBNEIsRUFBRSxDQUFDO0lBQ2pELFdBQVcsR0FBRyxrQ0FBZSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3hDLENBQUMsQ0FBQyxDQUFDO0FBRUgsU0FBUyxDQUFDLEdBQUcsRUFBRTtJQUNiLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUN4QixDQUFDLENBQUMsQ0FBQztBQUVILFNBQVMsZUFBZSxDQUFDLEVBQWU7SUFDdEMsaUJBQVcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZELENBQUM7QUFFRCxTQUFTLFlBQVk7SUFDbkIsT0FBTyxXQUFXLENBQUMsR0FBRyxDQUNwQjtRQUNFLE9BQU8sRUFBRSxVQUFVO1FBQ25CLE1BQU0sRUFBRSxZQUFZO1FBQ3BCLElBQUksRUFBRSwyQkFBMkI7S0FDbEMsRUFDRCxPQUFPLENBQ1IsQ0FBQztBQUNKLENBQUM7QUFFRCxJQUFJLENBQUMsZ0dBQWdHLEVBQUUsS0FBSyxJQUFJLEVBQUU7SUFDaEgsUUFBUTtJQUNSLGVBQWUsQ0FDYixpQkFBVyxDQUFDLFNBQVMsQ0FDbkIsSUFB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SUFBSSxFQUFFO1FBQ2hGLFFBQVE7UUFDUixNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzVDLEtBQUssQ0FBQyxJQUFJLEdBQUcsdUJBQXVCLENBQUM7UUFDckMsd0JBQWEsQ0FBQyxFQUFFLENBQUMsZ0NBQW1CLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckQsT0FBTztRQUNQLE1BQU0sTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUNyRSxzREFBc0QsQ0FDdkQsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLGdFQUFnRSxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2hGLFFBQVE7UUFDUixNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoQyxLQUFLLENBQUMsSUFBSSxHQUFHLG1CQUFtQixDQUFDO1FBQ2pDLHdCQUFhLENBQUMsRUFBRSxDQUFDLGdDQUFtQixDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXJELE9BQU87UUFDUCxNQUFNLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO0lBQ3BILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHZXRQYXJhbWV0ZXJDb21tYW5kIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNzbSc7XG5pbXBvcnQgeyBUb29sa2l0SW5mbyB9IGZyb20gJy4uLy4uL2xpYi9hcGknO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gJy4uLy4uL2xpYi9hcGkvY29udGV4dCc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudFJlc291cmNlc1JlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vbGliL2FwaS9lbnZpcm9ubWVudC1yZXNvdXJjZXMnO1xuaW1wb3J0ICogYXMgdmVyc2lvbiBmcm9tICcuLi8uLi9saWIvY2xpL3ZlcnNpb24nO1xuaW1wb3J0IHsgQ2FjaGVkRGF0YVNvdXJjZSwgTm90aWNlcywgTm90aWNlc0ZpbHRlciB9IGZyb20gJy4uLy4uL2xpYi9ub3RpY2VzJztcbmltcG9ydCB7IE1vY2tTZGssIG1vY2tCb290c3RyYXBTdGFjaywgbW9ja1NTTUNsaWVudCB9IGZyb20gJy4uL3V0aWwvbW9jay1zZGsnO1xuaW1wb3J0IHsgTW9ja1Rvb2xraXRJbmZvIH0gZnJvbSAnLi4vdXRpbC9tb2NrLXRvb2xraXRpbmZvJztcblxubGV0IG1vY2tTZGs6IE1vY2tTZGs7XG5sZXQgZW52UmVnaXN0cnk6IEVudmlyb25tZW50UmVzb3VyY2VzUmVnaXN0cnk7XG5sZXQgdG9vbGtpdE1vY2s6IFJldHVyblR5cGU8dHlwZW9mIE1vY2tUb29sa2l0SW5mby5zZXR1cD47XG5iZWZvcmVFYWNoKCgpID0+IHtcbiAgbW9ja1NkayA9IG5ldyBNb2NrU2RrKCk7XG4gIGVudlJlZ2lzdHJ5ID0gbmV3IEVudmlyb25tZW50UmVzb3VyY2VzUmVnaXN0cnkoKTtcbiAgdG9vbGtpdE1vY2sgPSBNb2NrVG9vbGtpdEluZm8uc2V0dXAoKTtcbn0pO1xuXG5hZnRlckVhY2goKCkgPT4ge1xuICB0b29sa2l0TW9jay5kaXNwb3NlKCk7XG59KTtcblxuZnVuY3Rpb24gbW9ja1Rvb2xraXRJbmZvKHRpOiBUb29sa2l0SW5mbykge1xuICBUb29sa2l0SW5mby5sb29rdXAgPSBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUodGkpO1xufVxuXG5mdW5jdGlvbiBlbnZSZXNvdXJjZXMoKSB7XG4gIHJldHVybiBlbnZSZWdpc3RyeS5mb3IoXG4gICAge1xuICAgICAgYWNjb3VudDogJzExMTExMTExJyxcbiAgICAgIHJlZ2lvbjogJ3VzLW5vd2hlcmUnLFxuICAgICAgbmFtZTogJ2F3czovLzExMTExMTExL3VzLW5vd2hlcmUnLFxuICAgIH0sXG4gICAgbW9ja1NkayxcbiAgKTtcbn1cblxudGVzdCgnZmFpbHVyZSB0byByZWFkIFNTTSBwYXJhbWV0ZXIgcmVzdWx0cyBpbiB1cGdyYWRlIG1lc3NhZ2UgZm9yIGV4aXN0aW5nIGJvb3RzdHJhcCBzdGFjayB1bmRlciB2NScsIGFzeW5jICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgbW9ja1Rvb2xraXRJbmZvKFxuICAgIFRvb2xraXRJbmZvLmZyb21TdGFjayhcbiAgICAgIG1vY2tCb290c3RyYXBTdGFjayh7XG4gICAgICAgIE91dHB1dHM6IFt7IE91dHB1dEtleTogJ0Jvb3RzdHJhcFZlcnNpb24nLCBPdXRwdXRWYWx1ZTogJzQnIH1dLFxuICAgICAgfSksXG4gICAgKSxcbiAgKTtcblxuICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignQ29tcHV0ZXIgc2F5cyBubycpO1xuICBlcnJvci5uYW1lID0gJ0FjY2Vzc0RlbmllZEV4Y2VwdGlvbic7XG4gIG1vY2tTU01DbGllbnQub24oR2V0UGFyYW1ldGVyQ29tbWFuZCkucmVqZWN0cyhlcnJvcik7XG5cbiAgLy8gVEhFTlxuICBhd2FpdCBleHBlY3QoZW52UmVzb3VyY2VzKCkudmFsaWRhdGVWZXJzaW9uKDk5LCAnL2FiYycpKS5yZWplY3RzLnRvVGhyb3coXG4gICAgL1RoaXMgQ0RLIGRlcGxveW1lbnQgcmVxdWlyZXMgYm9vdHN0cmFwIHN0YWNrIHZlcnNpb24vLFxuICApO1xufSk7XG5cbnRlc3QoJ2ZhaWx1cmUgdG8gcmVhZCBTU00gcGFyYW1ldGVyIHJlc3VsdHMgaW4gZXhjZXB0aW9uIHBhc3N0aHJvdWdoIGZvciBleGlzdGluZyBib290c3RyYXAgc3RhY2sgdjUgb3IgaGlnaGVyJywgYXN5bmMgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBtb2NrVG9vbGtpdEluZm8oXG4gICAgVG9vbGtpdEluZm8uZnJvbVN0YWNrKFxuICAgICAgbW9ja0Jvb3RzdHJhcFN0YWNrKHtcbiAgICAgICAgT3V0cHV0czogW3sgT3V0cHV0S2V5OiAnQm9vdHN0cmFwVmVyc2lvbicsIE91dHB1dFZhbHVlOiAnNScgfV0sXG4gICAgICB9KSxcbiAgICApLFxuICApO1xuXG4gIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdDb21wdXRlciBzYXlzIG5vJyk7XG4gIGVycm9yLm5hbWUgPSAnQWNjZXNzRGVuaWVkRXhjZXB0aW9uJztcbiAgbW9ja1NTTUNsaWVudC5vbihHZXRQYXJhbWV0ZXJDb21tYW5kKS5yZWplY3RzKGVycm9yKTtcblxuICAvLyBUSEVOXG4gIGF3YWl0IGV4cGVjdChlbnZSZXNvdXJjZXMoKS52YWxpZGF0ZVZlcnNpb24oOTksICcvYWJjJykpLnJlamVjdHMudG9UaHJvdygvQ29tcHV0ZXIgc2F5cyBuby8pO1xufSk7XG5cbmRlc2NyaWJlKCd2YWxpZGF0ZXZlcnNpb24gd2l0aG91dCBib290c3RyYXAgc3RhY2snLCAoKSA9PiB7XG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIG1vY2tUb29sa2l0SW5mbyhUb29sa2l0SW5mby5ib290c3RyYXBTdGFja05vdEZvdW5kSW5mbygnVGVzdEJvb3RzdHJhcFN0YWNrJykpO1xuICB9KTtcblxuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIGplc3QuY2xlYXJBbGxNb2NrcygpO1xuICB9KTtcblxuICB0ZXN0KCd2YWxpZGF0aW5nIHZlcnNpb24gd2l0aCBleHBsaWNpdCBTU00gcGFyYW1ldGVyIHN1Y2NlZWRzJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIEdJVkVOXG4gICAgbW9ja1NTTUNsaWVudC5vbihHZXRQYXJhbWV0ZXJDb21tYW5kKS5yZXNvbHZlcyh7XG4gICAgICBQYXJhbWV0ZXI6IHsgVmFsdWU6ICcxMCcgfSxcbiAgICB9KTtcblxuICAgIC8vIGRpc2FibGUgbm90aWNlcyBjYWNoaW5nXG4gICAgamVzdC5zcHlPbihDYWNoZWREYXRhU291cmNlLnByb3RvdHlwZSBhcyBhbnksICdzYXZlJykubW9ja0ltcGxlbWVudGF0aW9uKChfOiBhbnkpID0+IFByb21pc2UucmVzb2x2ZSgpKTtcbiAgICBqZXN0XG4gICAgICAuc3B5T24oQ2FjaGVkRGF0YVNvdXJjZS5wcm90b3R5cGUgYXMgYW55LCAnbG9hZCcpXG4gICAgICAubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IFByb21pc2UucmVzb2x2ZSh7IGV4cGlyYXRpb246IDAsIG5vdGljZXM6IFtdIH0pKTtcblxuICAgIC8vIG1vY2sgY2xpIHZlcnNpb24gbnVtYmVyXG4gICAgamVzdC5zcHlPbih2ZXJzaW9uLCAndmVyc2lvbk51bWJlcicpLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiAnMS4wLjAnKTtcblxuICAgIC8vIFRIRU5cbiAgICBjb25zdCBub3RpY2VzID0gTm90aWNlcy5jcmVhdGUoeyBjb250ZXh0OiBuZXcgQ29udGV4dCgpIH0pO1xuICAgIGF3YWl0IG5vdGljZXMucmVmcmVzaCh7IGRhdGFTb3VyY2U6IHsgZmV0Y2g6IGFzeW5jICgpID0+IFtdIH0gfSk7XG4gICAgYXdhaXQgZXhwZWN0KGVudlJlc291cmNlcygpLnZhbGlkYXRlVmVyc2lvbig4LCAnL2FiYycpKS5yZXNvbHZlcy50b0JlVW5kZWZpbmVkKCk7XG5cbiAgICBjb25zdCBmaWx0ZXIgPSBqZXN0LnNweU9uKE5vdGljZXNGaWx0ZXIsICdmaWx0ZXInKTtcbiAgICBub3RpY2VzLmRpc3BsYXkoKTtcblxuICAgIGV4cGVjdChmaWx0ZXIpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICBleHBlY3QoZmlsdGVyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh7XG4gICAgICBib290c3RyYXBwZWRFbnZpcm9ubWVudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGJvb3RzdHJhcFN0YWNrVmVyc2lvbjogMTAsXG4gICAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAgIGFjY291bnQ6ICcxMTExMTExMScsXG4gICAgICAgICAgICByZWdpb246ICd1cy1ub3doZXJlJyxcbiAgICAgICAgICAgIG5hbWU6ICdhd3M6Ly8xMTExMTExMS91cy1ub3doZXJlJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGNsaVZlcnNpb246ICcxLjAuMCcsXG4gICAgICBkYXRhOiBbXSxcbiAgICAgIG91dERpcjogJ2Nkay5vdXQnLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCd2YWxpZGF0aW5nIHZlcnNpb24gd2l0aG91dCBleHBsaWNpdCBTU00gcGFyYW1ldGVyIGZhaWxzJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIFdIRU5cbiAgICBhd2FpdCBleHBlY3QoZW52UmVzb3VyY2VzKCkudmFsaWRhdGVWZXJzaW9uKDgsIHVuZGVmaW5lZCkpLnJlamVjdHMudG9UaHJvdyhcbiAgICAgIC9UaGlzIGRlcGxveW1lbnQgcmVxdWlyZXMgYSBib290c3RyYXAgc3RhY2sgd2l0aCBhIGtub3duIG5hbWUvLFxuICAgICk7XG4gIH0pO1xuXG4gIHRlc3QoJ3ZhbGlkYXRpbmcgdmVyc2lvbiB3aXRoIGFjY2VzcyBkZW5pZWQgZXJyb3IgZ2l2ZXMgdXBncmFkZSBoaW50JywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIEdJVkVOXG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ0NvbXB1dGVyIHNheXMgbm8nKTtcbiAgICBlcnJvci5uYW1lID0gJ0FjY2Vzc0RlbmllZEV4Y2VwdGlvbic7XG4gICAgbW9ja1NTTUNsaWVudC5vbihHZXRQYXJhbWV0ZXJDb21tYW5kKS5yZWplY3RzKGVycm9yKTtcblxuICAgIC8vIFdIRU5cbiAgICBhd2FpdCBleHBlY3QoZW52UmVzb3VyY2VzKCkudmFsaWRhdGVWZXJzaW9uKDgsICcvYWJjJykpLnJlamVjdHMudG9UaHJvdyhcbiAgICAgIC9UaGlzIENESyBkZXBsb3ltZW50IHJlcXVpcmVzIGJvb3RzdHJhcCBzdGFjayB2ZXJzaW9uLyxcbiAgICApO1xuICB9KTtcblxuICB0ZXN0KCd2YWxpZGF0aW5nIHZlcnNpb24gd2l0aCBtaXNzaW5nIHBhcmFtZXRlciBnaXZlcyBib290c3RyYXAgaGludCcsIGFzeW5jICgpID0+IHtcbiAgICAvLyBHSVZFTlxuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdXdXQ/Jyk7XG4gICAgZXJyb3IubmFtZSA9ICdQYXJhbWV0ZXJOb3RGb3VuZCc7XG4gICAgbW9ja1NTTUNsaWVudC5vbihHZXRQYXJhbWV0ZXJDb21tYW5kKS5yZWplY3RzKGVycm9yKTtcblxuICAgIC8vIFdIRU5cbiAgICBhd2FpdCBleHBlY3QoZW52UmVzb3VyY2VzKCkudmFsaWRhdGVWZXJzaW9uKDgsICcvYWJjJykpLnJlamVjdHMudG9UaHJvdygvSGFzIHRoZSBlbnZpcm9ubWVudCBiZWVuIGJvb3RzdHJhcHBlZD8vKTtcbiAgfSk7XG59KTtcbiJdfQ==