UNPKG

@ariyana/appauth

Version:

A general purpose OAuth client.

124 lines 18.3 kB
"use strict"; /* * Copyright 2017 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing permissions and * limitations under the License. */ Object.defineProperty(exports, "__esModule", { value: true }); var query_string_utils_1 = require("./query_string_utils"); var MOCK_LOCATION_UNDEFINED = 'undefined'; /** * Useful in the context of writing tests. */ var MockLocationLike = /** @class */ (function () { function MockLocationLike() { this.hash = MOCK_LOCATION_UNDEFINED; this.host = MOCK_LOCATION_UNDEFINED; this.origin = MOCK_LOCATION_UNDEFINED; this.hostname = MOCK_LOCATION_UNDEFINED; this.pathname = MOCK_LOCATION_UNDEFINED; this.port = MOCK_LOCATION_UNDEFINED; this.protocol = MOCK_LOCATION_UNDEFINED; this.search = MOCK_LOCATION_UNDEFINED; this.assign = function () { }; } MockLocationLike.prototype.setHash = function (hash) { this.hash = hash; return this; }; MockLocationLike.prototype.setHost = function (host) { this.host = host; return this; }; MockLocationLike.prototype.setOrigin = function (origin) { this.origin = origin; return this; }; MockLocationLike.prototype.setHostname = function (hostname) { this.hostname = hostname; return this; }; MockLocationLike.prototype.setPathname = function (pathname) { this.pathname = pathname; return this; }; MockLocationLike.prototype.setPort = function (port) { this.port = port; return this; }; MockLocationLike.prototype.setProtocol = function (protocol) { this.protocol = protocol; return this; }; MockLocationLike.prototype.setSearch = function (search) { this.search = search; return this; }; MockLocationLike.prototype.setAssign = function (assign) { this.assign = assign; return this; }; return MockLocationLike; }()); describe('Query String Parser Tests', function () { var locationLike = new MockLocationLike(); var parser = new query_string_utils_1.BasicQueryStringUtils(); it('Empty query string should not blow up.', function () { locationLike.setSearch('?'); var result = parser.parse(locationLike); var keys = Object.keys(result); expect(result).toBeTruthy(); expect(keys.length).toBe(0, 'No query parameters provided'); }); it('Should parse simple query strings.', function () { locationLike.setSearch(encodeURI('key1=value1&key2=value 2& key3= value 3')); var result = parser.parse(locationLike); var keys = Object.keys(result); expect(result).toBeTruthy(); expect(keys.length).toBe(3, '3 Query parameters should be present'); expect(keys[0]).toBe('key1'); expect(keys[1]).toBe('key2'); expect(keys[2]).toBe(' key3'); expect(result[keys[0]]).toBe('value1', 'Expected value is "value1"'); expect(result[keys[1]]).toBe('value 2', 'Expected value is "value 2"'); expect(result[keys[2]]).toBe(' value 3', 'Expected value is " value 3"'); }); it('Should handle params with no values', function () { locationLike.setSearch(encodeURI('key1=value1&key2=')); var result = parser.parse(locationLike); var keys = Object.keys(result); expect(result).toBeTruthy(); expect(keys.length).toBe(1, '1 Query parameter should be present'); expect(keys[0]).toBe('key1'); expect(result[keys[0]]).toBe('value1', 'Expected value is "value1"'); }); it('Should handle duplicate parameter values', function () { locationLike.setSearch(encodeURI('key1=value1&key1=value2')); var result = parser.parse(locationLike); var keys = Object.keys(result); expect(result).toBeTruthy(); expect(keys.length).toBe(1, '1 Query parameter should be present'); expect(keys[0]).toBe('key1'); expect(result[keys[0]]).toBe('value2', 'Expected value is "value2"'); }); it('Should be able to deal with escaped # or ? characters', function () { locationLike.setSearch(encodeURI('key1=value1?&key2=value2 #')); var result = parser.parse(locationLike); var keys = Object.keys(result); expect(result).toBeTruthy(); expect(keys.length).toBe(2, '2 Query parameters should be present'); expect(keys[0]).toBe('key1'); expect(keys[1]).toBe('key2'); expect(result[keys[0]]).toBe('value1?', 'Expected value is "value1?"'); expect(result[keys[1]]).toBe('value2 #', 'Expected value is "value2 #"'); }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnlfc3RyaW5nX3V0aWxzX3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcXVlcnlfc3RyaW5nX3V0aWxzX3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7R0FZRzs7QUFFSCwyREFBMkQ7QUFHM0QsSUFBTSx1QkFBdUIsR0FBRyxXQUFXLENBQUM7QUFFNUM7O0dBRUc7QUFDSDtJQVdFO1FBQ0UsSUFBSSxDQUFDLElBQUksR0FBRyx1QkFBdUIsQ0FBQztRQUNwQyxJQUFJLENBQUMsSUFBSSxHQUFHLHVCQUF1QixDQUFDO1FBQ3BDLElBQUksQ0FBQyxNQUFNLEdBQUcsdUJBQXVCLENBQUM7UUFDdEMsSUFBSSxDQUFDLFFBQVEsR0FBRyx1QkFBdUIsQ0FBQztRQUN4QyxJQUFJLENBQUMsUUFBUSxHQUFHLHVCQUF1QixDQUFDO1FBQ3hDLElBQUksQ0FBQyxJQUFJLEdBQUcsdUJBQXVCLENBQUM7UUFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyx1QkFBdUIsQ0FBQztRQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLHVCQUF1QixDQUFDO1FBQ3RDLElBQUksQ0FBQyxNQUFNLEdBQUcsY0FBTyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELGtDQUFPLEdBQVAsVUFBUSxJQUFZO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGtDQUFPLEdBQVAsVUFBUSxJQUFZO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELG9DQUFTLEdBQVQsVUFBVSxNQUFjO1FBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELHNDQUFXLEdBQVgsVUFBWSxRQUFnQjtRQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxzQ0FBVyxHQUFYLFVBQVksUUFBZ0I7UUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsa0NBQU8sR0FBUCxVQUFRLElBQVk7UUFDbEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsc0NBQVcsR0FBWCxVQUFZLFFBQWdCO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELG9DQUFTLEdBQVQsVUFBVSxNQUFjO1FBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELG9DQUFTLEdBQVQsVUFBVSxNQUFrQjtRQUMxQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDSCx1QkFBQztBQUFELENBQUMsQUFuRUQsSUFtRUM7QUFFRCxRQUFRLENBQUMsMkJBQTJCLEVBQUU7SUFDcEMsSUFBTSxZQUFZLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO0lBQzVDLElBQU0sTUFBTSxHQUFHLElBQUksMENBQXFCLEVBQUUsQ0FBQztJQUUzQyxFQUFFLENBQUMsd0NBQXdDLEVBQUU7UUFDM0MsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QixJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3hDLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO0lBQzlELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO1FBQ3ZDLFlBQVksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLHlDQUF5QyxDQUFDLENBQUMsQ0FBQztRQUM3RSxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3hDLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxzQ0FBc0MsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLDRCQUE0QixDQUFDLENBQUM7UUFDckUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztRQUN2RSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO0lBQzNFLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHFDQUFxQyxFQUFFO1FBQ3hDLFlBQVksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztRQUN2RCxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3hDLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsNEJBQTRCLENBQUMsQ0FBQztJQUN2RSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywwQ0FBMEMsRUFBRTtRQUM3QyxZQUFZLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUM7UUFDN0QsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4QyxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM1QixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUscUNBQXFDLENBQUMsQ0FBQztRQUNuRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLDRCQUE0QixDQUFDLENBQUM7SUFDdkUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsdURBQXVELEVBQUU7UUFDMUQsWUFBWSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEMsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLHNDQUFzQyxDQUFDLENBQUM7UUFDcEUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLDZCQUE2QixDQUFDLENBQUM7UUFDdkUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsOEJBQThCLENBQUMsQ0FBQztJQUMzRSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHRcclxuICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlXHJcbiAqIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyXHJcbiAqIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcblxyXG5pbXBvcnQge0Jhc2ljUXVlcnlTdHJpbmdVdGlsc30gZnJvbSAnLi9xdWVyeV9zdHJpbmdfdXRpbHMnO1xyXG5pbXBvcnQge0xvY2F0aW9uTGlrZX0gZnJvbSAnLi90eXBlcyc7XHJcblxyXG5jb25zdCBNT0NLX0xPQ0FUSU9OX1VOREVGSU5FRCA9ICd1bmRlZmluZWQnO1xyXG5cclxuLyoqXHJcbiAqIFVzZWZ1bCBpbiB0aGUgY29udGV4dCBvZiB3cml0aW5nIHRlc3RzLlxyXG4gKi9cclxuY2xhc3MgTW9ja0xvY2F0aW9uTGlrZSBpbXBsZW1lbnRzIExvY2F0aW9uTGlrZSB7XHJcbiAgcHVibGljIGhhc2g6IHN0cmluZztcclxuICBwdWJsaWMgaG9zdDogc3RyaW5nO1xyXG4gIHB1YmxpYyBvcmlnaW46IHN0cmluZztcclxuICBwdWJsaWMgaG9zdG5hbWU6IHN0cmluZztcclxuICBwdWJsaWMgcGF0aG5hbWU6IHN0cmluZztcclxuICBwdWJsaWMgcG9ydDogc3RyaW5nO1xyXG4gIHB1YmxpYyBwcm90b2NvbDogc3RyaW5nO1xyXG4gIHB1YmxpYyBzZWFyY2g6IHN0cmluZztcclxuICBwdWJsaWMgYXNzaWduOiAodXJsOiBzdHJpbmcpID0+IHZvaWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5oYXNoID0gTU9DS19MT0NBVElPTl9VTkRFRklORUQ7XHJcbiAgICB0aGlzLmhvc3QgPSBNT0NLX0xPQ0FUSU9OX1VOREVGSU5FRDtcclxuICAgIHRoaXMub3JpZ2luID0gTU9DS19MT0NBVElPTl9VTkRFRklORUQ7XHJcbiAgICB0aGlzLmhvc3RuYW1lID0gTU9DS19MT0NBVElPTl9VTkRFRklORUQ7XHJcbiAgICB0aGlzLnBhdGhuYW1lID0gTU9DS19MT0NBVElPTl9VTkRFRklORUQ7XHJcbiAgICB0aGlzLnBvcnQgPSBNT0NLX0xPQ0FUSU9OX1VOREVGSU5FRDtcclxuICAgIHRoaXMucHJvdG9jb2wgPSBNT0NLX0xPQ0FUSU9OX1VOREVGSU5FRDtcclxuICAgIHRoaXMuc2VhcmNoID0gTU9DS19MT0NBVElPTl9VTkRFRklORUQ7XHJcbiAgICB0aGlzLmFzc2lnbiA9ICgpID0+IHt9O1xyXG4gIH1cclxuXHJcbiAgc2V0SGFzaChoYXNoOiBzdHJpbmcpOiBNb2NrTG9jYXRpb25MaWtlIHtcclxuICAgIHRoaXMuaGFzaCA9IGhhc2g7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIHNldEhvc3QoaG9zdDogc3RyaW5nKTogTW9ja0xvY2F0aW9uTGlrZSB7XHJcbiAgICB0aGlzLmhvc3QgPSBob3N0O1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBzZXRPcmlnaW4ob3JpZ2luOiBzdHJpbmcpOiBNb2NrTG9jYXRpb25MaWtlIHtcclxuICAgIHRoaXMub3JpZ2luID0gb3JpZ2luO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBzZXRIb3N0bmFtZShob3N0bmFtZTogc3RyaW5nKTogTW9ja0xvY2F0aW9uTGlrZSB7XHJcbiAgICB0aGlzLmhvc3RuYW1lID0gaG9zdG5hbWU7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIHNldFBhdGhuYW1lKHBhdGhuYW1lOiBzdHJpbmcpOiBNb2NrTG9jYXRpb25MaWtlIHtcclxuICAgIHRoaXMucGF0aG5hbWUgPSBwYXRobmFtZTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgc2V0UG9ydChwb3J0OiBzdHJpbmcpOiBNb2NrTG9jYXRpb25MaWtlIHtcclxuICAgIHRoaXMucG9ydCA9IHBvcnQ7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIHNldFByb3RvY29sKHByb3RvY29sOiBzdHJpbmcpOiBNb2NrTG9jYXRpb25MaWtlIHtcclxuICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbDtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgc2V0U2VhcmNoKHNlYXJjaDogc3RyaW5nKTogTW9ja0xvY2F0aW9uTGlrZSB7XHJcbiAgICB0aGlzLnNlYXJjaCA9IHNlYXJjaDtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgc2V0QXNzaWduKGFzc2lnbjogKCkgPT4gdm9pZCkge1xyXG4gICAgdGhpcy5hc3NpZ24gPSBhc3NpZ247XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcbn1cclxuXHJcbmRlc2NyaWJlKCdRdWVyeSBTdHJpbmcgUGFyc2VyIFRlc3RzJywgKCkgPT4ge1xyXG4gIGNvbnN0IGxvY2F0aW9uTGlrZSA9IG5ldyBNb2NrTG9jYXRpb25MaWtlKCk7XHJcbiAgY29uc3QgcGFyc2VyID0gbmV3IEJhc2ljUXVlcnlTdHJpbmdVdGlscygpO1xyXG5cclxuICBpdCgnRW1wdHkgcXVlcnkgc3RyaW5nIHNob3VsZCBub3QgYmxvdyB1cC4nLCAoKSA9PiB7XHJcbiAgICBsb2NhdGlvbkxpa2Uuc2V0U2VhcmNoKCc/Jyk7XHJcbiAgICBsZXQgcmVzdWx0ID0gcGFyc2VyLnBhcnNlKGxvY2F0aW9uTGlrZSk7XHJcbiAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHJlc3VsdCk7XHJcbiAgICBleHBlY3QocmVzdWx0KS50b0JlVHJ1dGh5KCk7XHJcbiAgICBleHBlY3Qoa2V5cy5sZW5ndGgpLnRvQmUoMCwgJ05vIHF1ZXJ5IHBhcmFtZXRlcnMgcHJvdmlkZWQnKTtcclxuICB9KTtcclxuXHJcbiAgaXQoJ1Nob3VsZCBwYXJzZSBzaW1wbGUgcXVlcnkgc3RyaW5ncy4nLCAoKSA9PiB7XHJcbiAgICBsb2NhdGlvbkxpa2Uuc2V0U2VhcmNoKGVuY29kZVVSSSgna2V5MT12YWx1ZTEma2V5Mj12YWx1ZSAyJiBrZXkzPSB2YWx1ZSAzJykpO1xyXG4gICAgbGV0IHJlc3VsdCA9IHBhcnNlci5wYXJzZShsb2NhdGlvbkxpa2UpO1xyXG4gICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhyZXN1bHQpO1xyXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZVRydXRoeSgpO1xyXG4gICAgZXhwZWN0KGtleXMubGVuZ3RoKS50b0JlKDMsICczIFF1ZXJ5IHBhcmFtZXRlcnMgc2hvdWxkIGJlIHByZXNlbnQnKTtcclxuICAgIGV4cGVjdChrZXlzWzBdKS50b0JlKCdrZXkxJyk7XHJcbiAgICBleHBlY3Qoa2V5c1sxXSkudG9CZSgna2V5MicpO1xyXG4gICAgZXhwZWN0KGtleXNbMl0pLnRvQmUoJyBrZXkzJyk7XHJcbiAgICBleHBlY3QocmVzdWx0W2tleXNbMF1dKS50b0JlKCd2YWx1ZTEnLCAnRXhwZWN0ZWQgdmFsdWUgaXMgXCJ2YWx1ZTFcIicpO1xyXG4gICAgZXhwZWN0KHJlc3VsdFtrZXlzWzFdXSkudG9CZSgndmFsdWUgMicsICdFeHBlY3RlZCB2YWx1ZSBpcyBcInZhbHVlIDJcIicpO1xyXG4gICAgZXhwZWN0KHJlc3VsdFtrZXlzWzJdXSkudG9CZSgnIHZhbHVlIDMnLCAnRXhwZWN0ZWQgdmFsdWUgaXMgXCIgdmFsdWUgM1wiJyk7XHJcbiAgfSk7XHJcblxyXG4gIGl0KCdTaG91bGQgaGFuZGxlIHBhcmFtcyB3aXRoIG5vIHZhbHVlcycsICgpID0+IHtcclxuICAgIGxvY2F0aW9uTGlrZS5zZXRTZWFyY2goZW5jb2RlVVJJKCdrZXkxPXZhbHVlMSZrZXkyPScpKTtcclxuICAgIGxldCByZXN1bHQgPSBwYXJzZXIucGFyc2UobG9jYXRpb25MaWtlKTtcclxuICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMocmVzdWx0KTtcclxuICAgIGV4cGVjdChyZXN1bHQpLnRvQmVUcnV0aHkoKTtcclxuICAgIGV4cGVjdChrZXlzLmxlbmd0aCkudG9CZSgxLCAnMSBRdWVyeSBwYXJhbWV0ZXIgc2hvdWxkIGJlIHByZXNlbnQnKTtcclxuICAgIGV4cGVjdChrZXlzWzBdKS50b0JlKCdrZXkxJyk7XHJcbiAgICBleHBlY3QocmVzdWx0W2tleXNbMF1dKS50b0JlKCd2YWx1ZTEnLCAnRXhwZWN0ZWQgdmFsdWUgaXMgXCJ2YWx1ZTFcIicpO1xyXG4gIH0pO1xyXG5cclxuICBpdCgnU2hvdWxkIGhhbmRsZSBkdXBsaWNhdGUgcGFyYW1ldGVyIHZhbHVlcycsICgpID0+IHtcclxuICAgIGxvY2F0aW9uTGlrZS5zZXRTZWFyY2goZW5jb2RlVVJJKCdrZXkxPXZhbHVlMSZrZXkxPXZhbHVlMicpKTtcclxuICAgIGxldCByZXN1bHQgPSBwYXJzZXIucGFyc2UobG9jYXRpb25MaWtlKTtcclxuICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMocmVzdWx0KTtcclxuICAgIGV4cGVjdChyZXN1bHQpLnRvQmVUcnV0aHkoKTtcclxuICAgIGV4cGVjdChrZXlzLmxlbmd0aCkudG9CZSgxLCAnMSBRdWVyeSBwYXJhbWV0ZXIgc2hvdWxkIGJlIHByZXNlbnQnKTtcclxuICAgIGV4cGVjdChrZXlzWzBdKS50b0JlKCdrZXkxJyk7XHJcbiAgICBleHBlY3QocmVzdWx0W2tleXNbMF1dKS50b0JlKCd2YWx1ZTInLCAnRXhwZWN0ZWQgdmFsdWUgaXMgXCJ2YWx1ZTJcIicpO1xyXG4gIH0pO1xyXG5cclxuICBpdCgnU2hvdWxkIGJlIGFibGUgdG8gZGVhbCB3aXRoIGVzY2FwZWQgIyBvciA/IGNoYXJhY3RlcnMnLCAoKSA9PiB7XHJcbiAgICBsb2NhdGlvbkxpa2Uuc2V0U2VhcmNoKGVuY29kZVVSSSgna2V5MT12YWx1ZTE/JmtleTI9dmFsdWUyICMnKSk7XHJcbiAgICBsZXQgcmVzdWx0ID0gcGFyc2VyLnBhcnNlKGxvY2F0aW9uTGlrZSk7XHJcbiAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHJlc3VsdCk7XHJcbiAgICBleHBlY3QocmVzdWx0KS50b0JlVHJ1dGh5KCk7XHJcbiAgICBleHBlY3Qoa2V5cy5sZW5ndGgpLnRvQmUoMiwgJzIgUXVlcnkgcGFyYW1ldGVycyBzaG91bGQgYmUgcHJlc2VudCcpO1xyXG4gICAgZXhwZWN0KGtleXNbMF0pLnRvQmUoJ2tleTEnKTtcclxuICAgIGV4cGVjdChrZXlzWzFdKS50b0JlKCdrZXkyJyk7XHJcbiAgICBleHBlY3QocmVzdWx0W2tleXNbMF1dKS50b0JlKCd2YWx1ZTE/JywgJ0V4cGVjdGVkIHZhbHVlIGlzIFwidmFsdWUxP1wiJyk7XHJcbiAgICBleHBlY3QocmVzdWx0W2tleXNbMV1dKS50b0JlKCd2YWx1ZTIgIycsICdFeHBlY3RlZCB2YWx1ZSBpcyBcInZhbHVlMiAjXCInKTtcclxuICB9KTtcclxufSk7XHJcbiJdfQ==