mirror of https://github.com/actions/cache.git
				
				
				
			
		
			
				
	
	
		
			5140 lines
		
	
	
		
			182 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			5140 lines
		
	
	
		
			182 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| module.exports =
 | ||
| /******/ (function(modules, runtime) { // webpackBootstrap
 | ||
| /******/ 	"use strict";
 | ||
| /******/ 	// The module cache
 | ||
| /******/ 	var installedModules = {};
 | ||
| /******/
 | ||
| /******/ 	// The require function
 | ||
| /******/ 	function __webpack_require__(moduleId) {
 | ||
| /******/
 | ||
| /******/ 		// Check if module is in cache
 | ||
| /******/ 		if(installedModules[moduleId]) {
 | ||
| /******/ 			return installedModules[moduleId].exports;
 | ||
| /******/ 		}
 | ||
| /******/ 		// Create a new module (and put it into the cache)
 | ||
| /******/ 		var module = installedModules[moduleId] = {
 | ||
| /******/ 			i: moduleId,
 | ||
| /******/ 			l: false,
 | ||
| /******/ 			exports: {}
 | ||
| /******/ 		};
 | ||
| /******/
 | ||
| /******/ 		// Execute the module function
 | ||
| /******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
 | ||
| /******/
 | ||
| /******/ 		// Flag the module as loaded
 | ||
| /******/ 		module.l = true;
 | ||
| /******/
 | ||
| /******/ 		// Return the exports of the module
 | ||
| /******/ 		return module.exports;
 | ||
| /******/ 	}
 | ||
| /******/
 | ||
| /******/
 | ||
| /******/ 	__webpack_require__.ab = __dirname + "/";
 | ||
| /******/
 | ||
| /******/ 	// the startup function
 | ||
| /******/ 	function startup() {
 | ||
| /******/ 		// Load entry module and return exports
 | ||
| /******/ 		return __webpack_require__(681);
 | ||
| /******/ 	};
 | ||
| /******/
 | ||
| /******/ 	// run startup
 | ||
| /******/ 	return startup();
 | ||
| /******/ })
 | ||
| /************************************************************************/
 | ||
| /******/ ({
 | ||
| 
 | ||
| /***/ 1:
 | ||
| /***/ (function(__unusedmodule, exports, __webpack_require__) {
 | ||
| 
 | ||
| "use strict";
 | ||
| 
 | ||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
 | ||
|     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
 | ||
|     return new (P || (P = Promise))(function (resolve, reject) {
 | ||
|         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
 | ||
|         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
 | ||
|         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
 | ||
|         step((generator = generator.apply(thisArg, _arguments || [])).next());
 | ||
|     });
 | ||
| };
 | ||
| Object.defineProperty(exports, "__esModule", { value: true });
 | ||
| const childProcess = __webpack_require__(129);
 | ||
| const path = __webpack_require__(622);
 | ||
| const util_1 = __webpack_require__(669);
 | ||
| const ioUtil = __webpack_require__(672);
 | ||
| const exec = util_1.promisify(childProcess.exec);
 | ||
| /**
 | ||
|  * Copies a file or folder.
 | ||
|  * Based off of shelljs - https://github.com/shelljs/shelljs/blob/9237f66c52e5daa40458f94f9565e18e8132f5a6/src/cp.js
 | ||
|  *
 | ||
|  * @param     source    source path
 | ||
|  * @param     dest      destination path
 | ||
|  * @param     options   optional. See CopyOptions.
 | ||
|  */
 | ||
| function cp(source, dest, options = {}) {
 | ||
|     return __awaiter(this, void 0, void 0, function* () {
 | ||
|         const { force, recursive } = readCopyOptions(options);
 | ||
|         const destStat = (yield ioUtil.exists(dest)) ? yield ioUtil.stat(dest) : null;
 | ||
|         // Dest is an existing file, but not forcing
 | ||
|         if (destStat && destStat.isFile() && !force) {
 | ||
|             return;
 | ||
|         }
 | ||
|         // If dest is an existing directory, should copy inside.
 | ||
|         const newDest = destStat && destStat.isDirectory()
 | ||
|             ? path.join(dest, path.basename(source))
 | ||
|             : dest;
 | ||
|         if (!(yield ioUtil.exists(source))) {
 | ||
|             throw new Error(`no such file or directory: ${source}`);
 | ||
|         }
 | ||
|         const sourceStat = yield ioUtil.stat(source);
 | ||
|         if (sourceStat.isDirectory()) {
 | ||
|             if (!recursive) {
 | ||
|                 throw new Error(`Failed to copy. ${source} is a directory, but tried to copy without recursive flag.`);
 | ||
|             }
 | ||
|             else {
 | ||
|                 yield cpDirRecursive(source, newDest, 0, force);
 | ||
|             }
 | ||
|         }
 | ||
|         else {
 | ||
|             if (path.relative(source, newDest) === '') {
 | ||
|                 // a file cannot be copied to itself
 | ||
|                 throw new Error(`'${newDest}' and '${source}' are the same file`);
 | ||
|             }
 | ||
|             yield copyFile(source, newDest, force);
 | ||
|         }
 | ||
|     });
 | ||
| }
 | ||
| exports.cp = cp;
 | ||
| /**
 | ||
|  * Moves a path.
 | ||
|  *
 | ||
|  * @param     source    source path
 | ||
|  * @param     dest      destination path
 | ||
|  * @param     options   optional. See MoveOptions.
 | ||
|  */
 | ||
| function mv(source, dest, options = {}) {
 | ||
|     return __awaiter(this, void 0, void 0, function* () {
 | ||
|         if (yield ioUtil.exists(dest)) {
 | ||
|             let destExists = true;
 | ||
|             if (yield ioUtil.isDirectory(dest)) {
 | ||
|                 // If dest is directory copy src into dest
 | ||
|                 dest = path.join(dest, path.basename(source));
 | ||
|                 destExists = yield ioUtil.exists(dest);
 | ||
|             }
 | ||
|             if (destExists) {
 | ||
|                 if (options.force == null || options.force) {
 | ||
|                     yield rmRF(dest);
 | ||
|                 }
 | ||
|                 else {
 | ||
|                     throw new Error('Destination already exists');
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
|         yield mkdirP(path.dirname(dest));
 | ||
|         yield ioUtil.rename(source, dest);
 | ||
|     });
 | ||
| }
 | ||
| exports.mv = mv;
 | ||
| /**
 | ||
|  * Remove a path recursively with force
 | ||
|  *
 | ||
|  * @param inputPath path to remove
 | ||
|  */
 | ||
| function rmRF(inputPath) {
 | ||
|     return __awaiter(this, void 0, void 0, function* () {
 | ||
|         if (ioUtil.IS_WINDOWS) {
 | ||
|             // Node doesn't provide a delete operation, only an unlink function. This means that if the file is being used by another
 | ||
|             // program (e.g. antivirus), it won't be deleted. To address this, we shell out the work to rd/del.
 | ||
|             try {
 | ||
|                 if (yield ioUtil.isDirectory(inputPath, true)) {
 | ||
|                     yield exec(`rd /s /q "${inputPath}"`);
 | ||
|                 }
 | ||
|                 else {
 | ||
|                     yield exec(`del /f /a "${inputPath}"`);
 | ||
|                 }
 | ||
|             }
 | ||
|             catch (err) {
 | ||
|                 // if you try to delete a file that doesn't exist, desired result is achieved
 | ||
|                 // other errors are valid
 | ||
|                 if (err.code !== 'ENOENT')
 | ||
|                     throw err;
 | ||
|             }
 | ||
|             // Shelling out fails to remove a symlink folder with missing source, this unlink catches that
 | ||
|             try {
 | ||
|                 yield ioUtil.unlink(inputPath);
 | ||
|             }
 | ||
|             catch (err) {
 | ||
|                 // if you try to delete a file that doesn't exist, desired result is achieved
 | ||
|                 // other errors are valid
 | ||
|                 if (err.code !== 'ENOENT')
 | ||
|                     throw err;
 | ||
|             }
 | ||
|         }
 | ||
|         else {
 | ||
|             let isDir = false;
 | ||
|             try {
 | ||
|                 isDir = yield ioUtil.isDirectory(inputPath);
 | ||
|             }
 | ||
|             catch (err) {
 | ||
|                 // if you try to delete a file that doesn't exist, desired result is achieved
 | ||
|                 // other errors are valid
 | ||
|                 if (err.code !== 'ENOENT')
 | ||
|                     throw err;
 | ||
|                 return;
 | ||
|             }
 | ||
|             if (isDir) {
 | ||
|                 yield exec(`rm -rf "${inputPath}"`);
 | ||
|             }
 | ||
|             else {
 | ||
|                 yield ioUtil.unlink(inputPath);
 | ||
|             }
 | ||
|         }
 | ||
|     });
 | ||
| }
 | ||
| exports.rmRF = rmRF;
 | ||
| /**
 | ||
|  * Make a directory.  Creates the full path with folders in between
 | ||
|  * Will throw if it fails
 | ||
|  *
 | ||
|  * @param   fsPath        path to create
 | ||
|  * @returns Promise<void>
 | ||
|  */
 | ||
| function mkdirP(fsPath) {
 | ||
|     return __awaiter(this, void 0, void 0, function* () {
 | ||
|         yield ioUtil.mkdirP(fsPath);
 | ||
|     });
 | ||
| }
 | ||
| exports.mkdirP = mkdirP;
 | ||
| /**
 | ||
|  * Returns path of a tool had the tool actually been invoked.  Resolves via paths.
 | ||
|  * If you check and the tool does not exist, it will throw.
 | ||
|  *
 | ||
|  * @param     tool              name of the tool
 | ||
|  * @param     check             whether to check if tool exists
 | ||
|  * @returns   Promise<string>   path to tool
 | ||
|  */
 | ||
| function which(tool, check) {
 | ||
|     return __awaiter(this, void 0, void 0, function* () {
 | ||
|         if (!tool) {
 | ||
|             throw new Error("parameter 'tool' is required");
 | ||
|         }
 | ||
|         // recursive when check=true
 | ||
|         if (check) {
 | ||
|             const result = yield which(tool, false);
 | ||
|             if (!result) {
 | ||
|                 if (ioUtil.IS_WINDOWS) {
 | ||
|                     throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`);
 | ||
|                 }
 | ||
|                 else {
 | ||
|                     throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.`);
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
|         try {
 | ||
|             // build the list of extensions to try
 | ||
|             const extensions = [];
 | ||
|             if (ioUtil.IS_WINDOWS && process.env.PATHEXT) {
 | ||
|                 for (const extension of process.env.PATHEXT.split(path.delimiter)) {
 | ||
|                     if (extension) {
 | ||
|                         extensions.push(extension);
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
|             // if it's rooted, return it if exists. otherwise return empty.
 | ||
|             if (ioUtil.isRooted(tool)) {
 | ||
|                 const filePath = yield ioUtil.tryGetExecutablePath(tool, extensions);
 | ||
|                 if (filePath) {
 | ||
|                     return filePath;
 | ||
|                 }
 | ||
|                 return '';
 | ||
|             }
 | ||
|             // if any path separators, return empty
 | ||
|             if (tool.includes('/') || (ioUtil.IS_WINDOWS && tool.includes('\\'))) {
 | ||
|                 return '';
 | ||
|             }
 | ||
|             // build the list of directories
 | ||
|             //
 | ||
|             // Note, technically "where" checks the current directory on Windows. From a toolkit perspective,
 | ||
|             // it feels like we should not do this. Checking the current directory seems like more of a use
 | ||
|             // case of a shell, and the which() function exposed by the toolkit should strive for consistency
 | ||
|             // across platforms.
 | ||
|             const directories = [];
 | ||
|             if (process.env.PATH) {
 | ||
|                 for (const p of process.env.PATH.split(path.delimiter)) {
 | ||
|                     if (p) {
 | ||
|                         directories.push(p);
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
|             // return the first match
 | ||
|             for (const directory of directories) {
 | ||
|                 const filePath = yield ioUtil.tryGetExecutablePath(directory + path.sep + tool, extensions);
 | ||
|                 if (filePath) {
 | ||
|                     return filePath;
 | ||
|                 }
 | ||
|             }
 | ||
|             return '';
 | ||
|         }
 | ||
|         catch (err) {
 | ||
|             throw new Error(`which failed with message ${err.message}`);
 | ||
|         }
 | ||
|     });
 | ||
| }
 | ||
| exports.which = which;
 | ||
| function readCopyOptions(options) {
 | ||
|     const force = options.force == null ? true : options.force;
 | ||
|     const recursive = Boolean(options.recursive);
 | ||
|     return { force, recursive };
 | ||
| }
 | ||
| function cpDirRecursive(sourceDir, destDir, currentDepth, force) {
 | ||
|     return __awaiter(this, void 0, void 0, function* () {
 | ||
|         // Ensure there is not a run away recursive copy
 | ||
|         if (currentDepth >= 255)
 | ||
|             return;
 | ||
|         currentDepth++;
 | ||
|         yield mkdirP(destDir);
 | ||
|         const files = yield ioUtil.readdir(sourceDir);
 | ||
|         for (const fileName of files) {
 | ||
|             const srcFile = `${sourceDir}/${fileName}`;
 | ||
|             const destFile = `${destDir}/${fileName}`;
 | ||
|             const srcFileStat = yield ioUtil.lstat(srcFile);
 | ||
|             if (srcFileStat.isDirectory()) {
 | ||
|                 // Recurse
 | ||
|                 yield cpDirRecursive(srcFile, destFile, currentDepth, force);
 | ||
|             }
 | ||
|             else {
 | ||
|                 yield copyFile(srcFile, destFile, force);
 | ||
|             }
 | ||
|         }
 | ||
|         // Change the mode for the newly created directory
 | ||
|         yield ioUtil.chmod(destDir, (yield ioUtil.stat(sourceDir)).mode);
 | ||
|     });
 | ||
| }
 | ||
| // Buffered file copy
 | ||
| function copyFile(srcFile, destFile, force) {
 | ||
|     return __awaiter(this, void 0, void 0, function* () {
 | ||
|         if ((yield ioUtil.lstat(srcFile)).isSymbolicLink()) {
 | ||
|             // unlink/re-link it
 | ||
|             try {
 | ||
|                 yield ioUtil.lstat(destFile);
 | ||
|                 yield ioUtil.unlink(destFile);
 | ||
|             }
 | ||
|             catch (e) {
 | ||
|                 // Try to override file permission
 | ||
|                 if (e.code === 'EPERM') {
 | ||
|                     yield ioUtil.chmod(destFile, '0666');
 | ||
|                     yield ioUtil.unlink(destFile);
 | ||
|                 }
 | ||
|                 // other errors = it doesn't exist, no work to do
 | ||
|             }
 | ||
|             // Copy over symlink
 | ||
|             const symlinkFull = yield ioUtil.readlink(srcFile);
 | ||
|             yield ioUtil.symlink(symlinkFull, destFile, ioUtil.IS_WINDOWS ? 'junction' : null);
 | ||
|         }
 | ||
|         else if (!(yield ioUtil.exists(destFile)) || force) {
 | ||
|             yield ioUtil.copyFile(srcFile, destFile);
 | ||
|         }
 | ||
|     });
 | ||
| }
 | ||
| //# sourceMappingURL=io.js.map
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 9:
 | ||
| /***/ (function(__unusedmodule, exports, __webpack_require__) {
 | ||
| 
 | ||
| "use strict";
 | ||
| 
 | ||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
 | ||
|     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
 | ||
|     return new (P || (P = Promise))(function (resolve, reject) {
 | ||
|         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
 | ||
|         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
 | ||
|         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
 | ||
|         step((generator = generator.apply(thisArg, _arguments || [])).next());
 | ||
|     });
 | ||
| };
 | ||
| Object.defineProperty(exports, "__esModule", { value: true });
 | ||
| const os = __webpack_require__(87);
 | ||
| const events = __webpack_require__(614);
 | ||
| const child = __webpack_require__(129);
 | ||
| /* eslint-disable @typescript-eslint/unbound-method */
 | ||
| const IS_WINDOWS = process.platform === 'win32';
 | ||
| /*
 | ||
|  * Class for running command line tools. Handles quoting and arg parsing in a platform agnostic way.
 | ||
|  */
 | ||
| class ToolRunner extends events.EventEmitter {
 | ||
|     constructor(toolPath, args, options) {
 | ||
|         super();
 | ||
|         if (!toolPath) {
 | ||
|             throw new Error("Parameter 'toolPath' cannot be null or empty.");
 | ||
|         }
 | ||
|         this.toolPath = toolPath;
 | ||
|         this.args = args || [];
 | ||
|         this.options = options || {};
 | ||
|     }
 | ||
|     _debug(message) {
 | ||
|         if (this.options.listeners && this.options.listeners.debug) {
 | ||
|             this.options.listeners.debug(message);
 | ||
|         }
 | ||
|     }
 | ||
|     _getCommandString(options, noPrefix) {
 | ||
|         const toolPath = this._getSpawnFileName();
 | ||
|         const args = this._getSpawnArgs(options);
 | ||
|         let cmd = noPrefix ? '' : '[command]'; // omit prefix when piped to a second tool
 | ||
|         if (IS_WINDOWS) {
 | ||
|             // Windows + cmd file
 | ||
|             if (this._isCmdFile()) {
 | ||
|                 cmd += toolPath;
 | ||
|                 for (const a of args) {
 | ||
|                     cmd += ` ${a}`;
 | ||
|                 }
 | ||
|             }
 | ||
|             // Windows + verbatim
 | ||
|             else if (options.windowsVerbatimArguments) {
 | ||
|                 cmd += `"${toolPath}"`;
 | ||
|                 for (const a of args) {
 | ||
|                     cmd += ` ${a}`;
 | ||
|                 }
 | ||
|             }
 | ||
|             // Windows (regular)
 | ||
|             else {
 | ||
|                 cmd += this._windowsQuoteCmdArg(toolPath);
 | ||
|                 for (const a of args) {
 | ||
|                     cmd += ` ${this._windowsQuoteCmdArg(a)}`;
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
|         else {
 | ||
|             // OSX/Linux - this can likely be improved with some form of quoting.
 | ||
|             // creating processes on Unix is fundamentally different than Windows.
 | ||
|             // on Unix, execvp() takes an arg array.
 | ||
|             cmd += toolPath;
 | ||
|             for (const a of args) {
 | ||
|                 cmd += ` ${a}`;
 | ||
|             }
 | ||
|         }
 | ||
|         return cmd;
 | ||
|     }
 | ||
|     _processLineBuffer(data, strBuffer, onLine) {
 | ||
|         try {
 | ||
|             let s = strBuffer + data.toString();
 | ||
|             let n = s.indexOf(os.EOL);
 | ||
|             while (n > -1) {
 | ||
|                 const line = s.substring(0, n);
 | ||
|                 onLine(line);
 | ||
|                 // the rest of the string ...
 | ||
|                 s = s.substring(n + os.EOL.length);
 | ||
|                 n = s.indexOf(os.EOL);
 | ||
|             }
 | ||
|             strBuffer = s;
 | ||
|         }
 | ||
|         catch (err) {
 | ||
|             // streaming lines to console is best effort.  Don't fail a build.
 | ||
|             this._debug(`error processing line. Failed with error ${err}`);
 | ||
|         }
 | ||
|     }
 | ||
|     _getSpawnFileName() {
 | ||
|         if (IS_WINDOWS) {
 | ||
|             if (this._isCmdFile()) {
 | ||
|                 return process.env['COMSPEC'] || 'cmd.exe';
 | ||
|             }
 | ||
|         }
 | ||
|         return this.toolPath;
 | ||
|     }
 | ||
|     _getSpawnArgs(options) {
 | ||
|         if (IS_WINDOWS) {
 | ||
|             if (this._isCmdFile()) {
 | ||
|                 let argline = `/D /S /C "${this._windowsQuoteCmdArg(this.toolPath)}`;
 | ||
|                 for (const a of this.args) {
 | ||
|                     argline += ' ';
 | ||
|                     argline += options.windowsVerbatimArguments
 | ||
|                         ? a
 | ||
|                         : this._windowsQuoteCmdArg(a);
 | ||
|                 }
 | ||
|                 argline += '"';
 | ||
|                 return [argline];
 | ||
|             }
 | ||
|         }
 | ||
|         return this.args;
 | ||
|     }
 | ||
|     _endsWith(str, end) {
 | ||
|         return str.endsWith(end);
 | ||
|     }
 | ||
|     _isCmdFile() {
 | ||
|         const upperToolPath = this.toolPath.toUpperCase();
 | ||
|         return (this._endsWith(upperToolPath, '.CMD') ||
 | ||
|             this._endsWith(upperToolPath, '.BAT'));
 | ||
|     }
 | ||
|     _windowsQuoteCmdArg(arg) {
 | ||
|         // for .exe, apply the normal quoting rules that libuv applies
 | ||
|         if (!this._isCmdFile()) {
 | ||
|             return this._uvQuoteCmdArg(arg);
 | ||
|         }
 | ||
|         // otherwise apply quoting rules specific to the cmd.exe command line parser.
 | ||
|         // the libuv rules are generic and are not designed specifically for cmd.exe
 | ||
|         // command line parser.
 | ||
|         //
 | ||
|         // for a detailed description of the cmd.exe command line parser, refer to
 | ||
|         // http://stackoverflow.com/questions/4094699/how-does-the-windows-command-interpreter-cmd-exe-parse-scripts/7970912#7970912
 | ||
|         // need quotes for empty arg
 | ||
|         if (!arg) {
 | ||
|             return '""';
 | ||
|         }
 | ||
|         // determine whether the arg needs to be quoted
 | ||
|         const cmdSpecialChars = [
 | ||
|             ' ',
 | ||
|             '\t',
 | ||
|             '&',
 | ||
|             '(',
 | ||
|             ')',
 | ||
|             '[',
 | ||
|             ']',
 | ||
|             '{',
 | ||
|             '}',
 | ||
|             '^',
 | ||
|             '=',
 | ||
|             ';',
 | ||
|             '!',
 | ||
|             "'",
 | ||
|             '+',
 | ||
|             ',',
 | ||
|             '`',
 | ||
|             '~',
 | ||
|             '|',
 | ||
|             '<',
 | ||
|             '>',
 | ||
|             '"'
 | ||
|         ];
 | ||
|         let needsQuotes = false;
 | ||
|         for (const char of arg) {
 | ||
|             if (cmdSpecialChars.some(x => x === char)) {
 | ||
|                 needsQuotes = true;
 | ||
|                 break;
 | ||
|             }
 | ||
|         }
 | ||
|         // short-circuit if quotes not needed
 | ||
|         if (!needsQuotes) {
 | ||
|             return arg;
 | ||
|         }
 | ||
|         // the following quoting rules are very similar to the rules that by libuv applies.
 | ||
|         //
 | ||
|         // 1) wrap the string in quotes
 | ||
|         //
 | ||
|         // 2) double-up quotes - i.e. " => ""
 | ||
|         //
 | ||
|         //    this is different from the libuv quoting rules. libuv replaces " with \", which unfortunately
 | ||
|         //    doesn't work well with a cmd.exe command line.
 | ||
|         //
 | ||
|         //    note, replacing " with "" also works well if the arg is passed to a downstream .NET console app.
 | ||
|         //    for example, the command line:
 | ||
|         //          foo.exe "myarg:""my val"""
 | ||
|         //    is parsed by a .NET console app into an arg array:
 | ||
|         //          [ "myarg:\"my val\"" ]
 | ||
|         //    which is the same end result when applying libuv quoting rules. although the actual
 | ||
|         //    command line from libuv quoting rules would look like:
 | ||
|         //          foo.exe "myarg:\"my val\""
 | ||
|         //
 | ||
|         // 3) double-up slashes that precede a quote,
 | ||
|         //    e.g.  hello \world    => "hello \world"
 | ||
|         //          hello\"world    => "hello\\""world"
 | ||
|         //          hello\\"world   => "hello\\\\""world"
 | ||
|         //          hello world\    => "hello world\\"
 | ||
|         //
 | ||
|         //    technically this is not required for a cmd.exe command line, or the batch argument parser.
 | ||
|         //    the reasons for including this as a .cmd quoting rule are:
 | ||
|         //
 | ||
|         //    a) this is optimized for the scenario where the argument is passed from the .cmd file to an
 | ||
|         //       external program. many programs (e.g. .NET console apps) rely on the slash-doubling rule.
 | ||
|         //
 | ||
|         //    b) it's what we've been doing previously (by deferring to node default behavior) and we
 | ||
|         //       haven't heard any complaints about that aspect.
 | ||
|         //
 | ||
|         // note, a weakness of the quoting rules chosen here, is that % is not escaped. in fact, % cannot be
 | ||
|         // escaped when used on the command line directly - even though within a .cmd file % can be escaped
 | ||
|         // by using %%.
 | ||
|         //
 | ||
|         // the saving grace is, on the command line, %var% is left as-is if var is not defined. this contrasts
 | ||
|         // the line parsing rules within a .cmd file, where if var is not defined it is replaced with nothing.
 | ||
|         //
 | ||
|         // one option that was explored was replacing % with ^% - i.e. %var% => ^%var^%. this hack would
 | ||
|         // often work, since it is unlikely that var^ would exist, and the ^ character is removed when the
 | ||
|         // variable is used. the problem, however, is that ^ is not removed when %* is used to pass the args
 | ||
|         // to an external program.
 | ||
|         //
 | ||
|         // an unexplored potential solution for the % escaping problem, is to create a wrapper .cmd file.
 | ||
|         // % can be escaped within a .cmd file.
 | ||
|         let reverse = '"';
 | ||
|         let quoteHit = true;
 | ||
|         for (let i = arg.length; i > 0; i--) {
 | ||
|             // walk the string in reverse
 | ||
|             reverse += arg[i - 1];
 | ||
|             if (quoteHit && arg[i - 1] === '\\') {
 | ||
|                 reverse += '\\'; // double the slash
 | ||
|             }
 | ||
|             else if (arg[i - 1] === '"') {
 | ||
|                 quoteHit = true;
 | ||
|                 reverse += '"'; // double the quote
 | ||
|             }
 | ||
|             else {
 | ||
|                 quoteHit = false;
 | ||
|             }
 | ||
|         }
 | ||
|         reverse += '"';
 | ||
|         return reverse
 | ||
|             .split('')
 | ||
|             .reverse()
 | ||
|             .join('');
 | ||
|     }
 | ||
|     _uvQuoteCmdArg(arg) {
 | ||
|         // Tool runner wraps child_process.spawn() and needs to apply the same quoting as
 | ||
|         // Node in certain cases where the undocumented spawn option windowsVerbatimArguments
 | ||
|         // is used.
 | ||
|         //
 | ||
|         // Since this function is a port of quote_cmd_arg from Node 4.x (technically, lib UV,
 | ||
|         // see https://github.com/nodejs/node/blob/v4.x/deps/uv/src/win/process.c for details),
 | ||
|         // pasting copyright notice from Node within this function:
 | ||
|         //
 | ||
|         //      Copyright Joyent, Inc. and other Node contributors. All rights reserved.
 | ||
|         //
 | ||
|         //      Permission is hereby granted, free of charge, to any person obtaining a copy
 | ||
|         //      of this software and associated documentation files (the "Software"), to
 | ||
|         //      deal in the Software without restriction, including without limitation the
 | ||
|         //      rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 | ||
|         //      sell copies of the Software, and to permit persons to whom the Software is
 | ||
|         //      furnished to do so, subject to the following conditions:
 | ||
|         //
 | ||
|         //      The above copyright notice and this permission notice shall be included in
 | ||
|         //      all copies or substantial portions of the Software.
 | ||
|         //
 | ||
|         //      THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | ||
|         //      IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | ||
|         //      FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | ||
|         //      AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | ||
|         //      LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | ||
|         //      FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 | ||
|         //      IN THE SOFTWARE.
 | ||
|         if (!arg) {
 | ||
|             // Need double quotation for empty argument
 | ||
|             return '""';
 | ||
|         }
 | ||
|         if (!arg.includes(' ') && !arg.includes('\t') && !arg.includes('"')) {
 | ||
|             // No quotation needed
 | ||
|             return arg;
 | ||
|         }
 | ||
|         if (!arg.includes('"') && !arg.includes('\\')) {
 | ||
|             // No embedded double quotes or backslashes, so I can just wrap
 | ||
|             // quote marks around the whole thing.
 | ||
|             return `"${arg}"`;
 | ||
|         }
 | ||
|         // Expected input/output:
 | ||
|         //   input : hello"world
 | ||
|         //   output: "hello\"world"
 | ||
|         //   input : hello""world
 | ||
|         //   output: "hello\"\"world"
 | ||
|         //   input : hello\world
 | ||
|         //   output: hello\world
 | ||
|         //   input : hello\\world
 | ||
|         //   output: hello\\world
 | ||
|         //   input : hello\"world
 | ||
|         //   output: "hello\\\"world"
 | ||
|         //   input : hello\\"world
 | ||
|         //   output: "hello\\\\\"world"
 | ||
|         //   input : hello world\
 | ||
|         //   output: "hello world\\" - note the comment in libuv actually reads "hello world\"
 | ||
|         //                             but it appears the comment is wrong, it should be "hello world\\"
 | ||
|         let reverse = '"';
 | ||
|         let quoteHit = true;
 | ||
|         for (let i = arg.length; i > 0; i--) {
 | ||
|             // walk the string in reverse
 | ||
|             reverse += arg[i - 1];
 | ||
|             if (quoteHit && arg[i - 1] === '\\') {
 | ||
|                 reverse += '\\';
 | ||
|             }
 | ||
|             else if (arg[i - 1] === '"') {
 | ||
|                 quoteHit = true;
 | ||
|                 reverse += '\\';
 | ||
|             }
 | ||
|             else {
 | ||
|                 quoteHit = false;
 | ||
|             }
 | ||
|         }
 | ||
|         reverse += '"';
 | ||
|         return reverse
 | ||
|             .split('')
 | ||
|             .reverse()
 | ||
|             .join('');
 | ||
|     }
 | ||
|     _cloneExecOptions(options) {
 | ||
|         options = options || {};
 | ||
|         const result = {
 | ||
|             cwd: options.cwd || process.cwd(),
 | ||
|             env: options.env || process.env,
 | ||
|             silent: options.silent || false,
 | ||
|             windowsVerbatimArguments: options.windowsVerbatimArguments || false,
 | ||
|             failOnStdErr: options.failOnStdErr || false,
 | ||
|             ignoreReturnCode: options.ignoreReturnCode || false,
 | ||
|             delay: options.delay || 10000
 | ||
|         };
 | ||
|         result.outStream = options.outStream || process.stdout;
 | ||
|         result.errStream = options.errStream || process.stderr;
 | ||
|         return result;
 | ||
|     }
 | ||
|     _getSpawnOptions(options, toolPath) {
 | ||
|         options = options || {};
 | ||
|         const result = {};
 | ||
|         result.cwd = options.cwd;
 | ||
|         result.env = options.env;
 | ||
|         result['windowsVerbatimArguments'] =
 | ||
|             options.windowsVerbatimArguments || this._isCmdFile();
 | ||
|         if (options.windowsVerbatimArguments) {
 | ||
|             result.argv0 = `"${toolPath}"`;
 | ||
|         }
 | ||
|         return result;
 | ||
|     }
 | ||
|     /**
 | ||
|      * Exec a tool.
 | ||
|      * Output will be streamed to the live console.
 | ||
|      * Returns promise with return code
 | ||
|      *
 | ||
|      * @param     tool     path to tool to exec
 | ||
|      * @param     options  optional exec options.  See ExecOptions
 | ||
|      * @returns   number
 | ||
|      */
 | ||
|     exec() {
 | ||
|         return __awaiter(this, void 0, void 0, function* () {
 | ||
|             return new Promise((resolve, reject) => {
 | ||
|                 this._debug(`exec tool: ${this.toolPath}`);
 | ||
|                 this._debug('arguments:');
 | ||
|                 for (const arg of this.args) {
 | ||
|                     this._debug(`   ${arg}`);
 | ||
|                 }
 | ||
|                 const optionsNonNull = this._cloneExecOptions(this.options);
 | ||
|                 if (!optionsNonNull.silent && optionsNonNull.outStream) {
 | ||
|                     optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os.EOL);
 | ||
|                 }
 | ||
|                 const state = new ExecState(optionsNonNull, this.toolPath);
 | ||
|                 state.on('debug', (message) => {
 | ||
|                     this._debug(message);
 | ||
|                 });
 | ||
|                 const fileName = this._getSpawnFileName();
 | ||
|                 const cp = child.spawn(fileName, this._getSpawnArgs(optionsNonNull), this._getSpawnOptions(this.options, fileName));
 | ||
|                 const stdbuffer = '';
 | ||
|                 if (cp.stdout) {
 | ||
|                     cp.stdout.on('data', (data) => {
 | ||
|                         if (this.options.listeners && this.options.listeners.stdout) {
 | ||
|                             this.options.listeners.stdout(data);
 | ||
|                         }
 | ||
|                         if (!optionsNonNull.silent && optionsNonNull.outStream) {
 | ||
|                             optionsNonNull.outStream.write(data);
 | ||
|                         }
 | ||
|                         this._processLineBuffer(data, stdbuffer, (line) => {
 | ||
|                             if (this.options.listeners && this.options.listeners.stdline) {
 | ||
|                                 this.options.listeners.stdline(line);
 | ||
|                             }
 | ||
|                         });
 | ||
|                     });
 | ||
|                 }
 | ||
|                 const errbuffer = '';
 | ||
|                 if (cp.stderr) {
 | ||
|                     cp.stderr.on('data', (data) => {
 | ||
|                         state.processStderr = true;
 | ||
|                         if (this.options.listeners && this.options.listeners.stderr) {
 | ||
|                             this.options.listeners.stderr(data);
 | ||
|                         }
 | ||
|                         if (!optionsNonNull.silent &&
 | ||
|                             optionsNonNull.errStream &&
 | ||
|                             optionsNonNull.outStream) {
 | ||
|                             const s = optionsNonNull.failOnStdErr
 | ||
|                                 ? optionsNonNull.errStream
 | ||
|                                 : optionsNonNull.outStream;
 | ||
|                             s.write(data);
 | ||
|                         }
 | ||
|                         this._processLineBuffer(data, errbuffer, (line) => {
 | ||
|                             if (this.options.listeners && this.options.listeners.errline) {
 | ||
|                                 this.options.listeners.errline(line);
 | ||
|                             }
 | ||
|                         });
 | ||
|                     });
 | ||
|                 }
 | ||
|                 cp.on('error', (err) => {
 | ||
|                     state.processError = err.message;
 | ||
|                     state.processExited = true;
 | ||
|                     state.processClosed = true;
 | ||
|                     state.CheckComplete();
 | ||
|                 });
 | ||
|                 cp.on('exit', (code) => {
 | ||
|                     state.processExitCode = code;
 | ||
|                     state.processExited = true;
 | ||
|                     this._debug(`Exit code ${code} received from tool '${this.toolPath}'`);
 | ||
|                     state.CheckComplete();
 | ||
|                 });
 | ||
|                 cp.on('close', (code) => {
 | ||
|                     state.processExitCode = code;
 | ||
|                     state.processExited = true;
 | ||
|                     state.processClosed = true;
 | ||
|                     this._debug(`STDIO streams have closed for tool '${this.toolPath}'`);
 | ||
|                     state.CheckComplete();
 | ||
|                 });
 | ||
|                 state.on('done', (error, exitCode) => {
 | ||
|                     if (stdbuffer.length > 0) {
 | ||
|                         this.emit('stdline', stdbuffer);
 | ||
|                     }
 | ||
|                     if (errbuffer.length > 0) {
 | ||
|                         this.emit('errline', errbuffer);
 | ||
|                     }
 | ||
|                     cp.removeAllListeners();
 | ||
|                     if (error) {
 | ||
|                         reject(error);
 | ||
|                     }
 | ||
|                     else {
 | ||
|                         resolve(exitCode);
 | ||
|                     }
 | ||
|                 });
 | ||
|             });
 | ||
|         });
 | ||
|     }
 | ||
| }
 | ||
| exports.ToolRunner = ToolRunner;
 | ||
| /**
 | ||
|  * Convert an arg string to an array of args. Handles escaping
 | ||
|  *
 | ||
|  * @param    argString   string of arguments
 | ||
|  * @returns  string[]    array of arguments
 | ||
|  */
 | ||
| function argStringToArray(argString) {
 | ||
|     const args = [];
 | ||
|     let inQuotes = false;
 | ||
|     let escaped = false;
 | ||
|     let arg = '';
 | ||
|     function append(c) {
 | ||
|         // we only escape double quotes.
 | ||
|         if (escaped && c !== '"') {
 | ||
|             arg += '\\';
 | ||
|         }
 | ||
|         arg += c;
 | ||
|         escaped = false;
 | ||
|     }
 | ||
|     for (let i = 0; i < argString.length; i++) {
 | ||
|         const c = argString.charAt(i);
 | ||
|         if (c === '"') {
 | ||
|             if (!escaped) {
 | ||
|                 inQuotes = !inQuotes;
 | ||
|             }
 | ||
|             else {
 | ||
|                 append(c);
 | ||
|             }
 | ||
|             continue;
 | ||
|         }
 | ||
|         if (c === '\\' && escaped) {
 | ||
|             append(c);
 | ||
|             continue;
 | ||
|         }
 | ||
|         if (c === '\\' && inQuotes) {
 | ||
|             escaped = true;
 | ||
|             continue;
 | ||
|         }
 | ||
|         if (c === ' ' && !inQuotes) {
 | ||
|             if (arg.length > 0) {
 | ||
|                 args.push(arg);
 | ||
|                 arg = '';
 | ||
|             }
 | ||
|             continue;
 | ||
|         }
 | ||
|         append(c);
 | ||
|     }
 | ||
|     if (arg.length > 0) {
 | ||
|         args.push(arg.trim());
 | ||
|     }
 | ||
|     return args;
 | ||
| }
 | ||
| exports.argStringToArray = argStringToArray;
 | ||
| class ExecState extends events.EventEmitter {
 | ||
|     constructor(options, toolPath) {
 | ||
|         super();
 | ||
|         this.processClosed = false; // tracks whether the process has exited and stdio is closed
 | ||
|         this.processError = '';
 | ||
|         this.processExitCode = 0;
 | ||
|         this.processExited = false; // tracks whether the process has exited
 | ||
|         this.processStderr = false; // tracks whether stderr was written to
 | ||
|         this.delay = 10000; // 10 seconds
 | ||
|         this.done = false;
 | ||
|         this.timeout = null;
 | ||
|         if (!toolPath) {
 | ||
|             throw new Error('toolPath must not be empty');
 | ||
|         }
 | ||
|         this.options = options;
 | ||
|         this.toolPath = toolPath;
 | ||
|         if (options.delay) {
 | ||
|             this.delay = options.delay;
 | ||
|         }
 | ||
|     }
 | ||
|     CheckComplete() {
 | ||
|         if (this.done) {
 | ||
|             return;
 | ||
|         }
 | ||
|         if (this.processClosed) {
 | ||
|             this._setResult();
 | ||
|         }
 | ||
|         else if (this.processExited) {
 | ||
|             this.timeout = setTimeout(ExecState.HandleTimeout, this.delay, this);
 | ||
|         }
 | ||
|     }
 | ||
|     _debug(message) {
 | ||
|         this.emit('debug', message);
 | ||
|     }
 | ||
|     _setResult() {
 | ||
|         // determine whether there is an error
 | ||
|         let error;
 | ||
|         if (this.processExited) {
 | ||
|             if (this.processError) {
 | ||
|                 error = new Error(`There was an error when attempting to execute the process '${this.toolPath}'. This may indicate the process failed to start. Error: ${this.processError}`);
 | ||
|             }
 | ||
|             else if (this.processExitCode !== 0 && !this.options.ignoreReturnCode) {
 | ||
|                 error = new Error(`The process '${this.toolPath}' failed with exit code ${this.processExitCode}`);
 | ||
|             }
 | ||
|             else if (this.processStderr && this.options.failOnStdErr) {
 | ||
|                 error = new Error(`The process '${this.toolPath}' failed because one or more lines were written to the STDERR stream`);
 | ||
|             }
 | ||
|         }
 | ||
|         // clear the timeout
 | ||
|         if (this.timeout) {
 | ||
|             clearTimeout(this.timeout);
 | ||
|             this.timeout = null;
 | ||
|         }
 | ||
|         this.done = true;
 | ||
|         this.emit('done', error, this.processExitCode);
 | ||
|     }
 | ||
|     static HandleTimeout(state) {
 | ||
|         if (state.done) {
 | ||
|             return;
 | ||
|         }
 | ||
|         if (!state.processClosed && state.processExited) {
 | ||
|             const message = `The STDIO streams did not close within ${state.delay /
 | ||
|                 1000} seconds of the exit event from process '${state.toolPath}'. This may indicate a child process inherited the STDIO streams and has not yet exited.`;
 | ||
|             state._debug(message);
 | ||
|         }
 | ||
|         state._setResult();
 | ||
|     }
 | ||
| }
 | ||
| //# sourceMappingURL=toolrunner.js.map
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 12:
 | ||
| /***/ (function(__unusedmodule, exports) {
 | ||
| 
 | ||
| "use strict";
 | ||
| 
 | ||
| // Copyright (c) Microsoft. All rights reserved.
 | ||
| // Licensed under the MIT license. See LICENSE file in the project root for full license information.
 | ||
| Object.defineProperty(exports, "__esModule", { value: true });
 | ||
| class BasicCredentialHandler {
 | ||
|     constructor(username, password) {
 | ||
|         this.username = username;
 | ||
|         this.password = password;
 | ||
|     }
 | ||
|     // currently implements pre-authorization
 | ||
|     // TODO: support preAuth = false where it hooks on 401
 | ||
|     prepareRequest(options) {
 | ||
|         options.headers['Authorization'] = 'Basic ' + new Buffer(this.username + ':' + this.password).toString('base64');
 | ||
|         options.headers['X-TFS-FedAuthRedirect'] = 'Suppress';
 | ||
|     }
 | ||
|     // This handler cannot handle 401
 | ||
|     canHandleAuthentication(response) {
 | ||
|         return false;
 | ||
|     }
 | ||
|     handleAuthentication(httpClient, requestInfo, objs) {
 | ||
|         return null;
 | ||
|     }
 | ||
| }
 | ||
| exports.BasicCredentialHandler = BasicCredentialHandler;
 | ||
| 
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 16:
 | ||
| /***/ (function(module) {
 | ||
| 
 | ||
| module.exports = require("tls");
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 87:
 | ||
| /***/ (function(module) {
 | ||
| 
 | ||
| module.exports = require("os");
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 105:
 | ||
| /***/ (function(__unusedmodule, exports, __webpack_require__) {
 | ||
| 
 | ||
| "use strict";
 | ||
| 
 | ||
| // Copyright (c) Microsoft. All rights reserved.
 | ||
| // Licensed under the MIT license. See LICENSE file in the project root for full license information.
 | ||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
 | ||
|     return new (P || (P = Promise))(function (resolve, reject) {
 | ||
|         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
 | ||
|         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
 | ||
|         function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
 | ||
|         step((generator = generator.apply(thisArg, _arguments || [])).next());
 | ||
|     });
 | ||
| };
 | ||
| Object.defineProperty(exports, "__esModule", { value: true });
 | ||
| const httpm = __webpack_require__(874);
 | ||
| const util = __webpack_require__(729);
 | ||
| class RestClient {
 | ||
|     /**
 | ||
|      * Creates an instance of the RestClient
 | ||
|      * @constructor
 | ||
|      * @param {string} userAgent - userAgent for requests
 | ||
|      * @param {string} baseUrl - (Optional) If not specified, use full urls per request.  If supplied and a function passes a relative url, it will be appended to this
 | ||
|      * @param {ifm.IRequestHandler[]} handlers - handlers are typically auth handlers (basic, bearer, ntlm supplied)
 | ||
|      * @param {ifm.IRequestOptions} requestOptions - options for each http requests (http proxy setting, socket timeout)
 | ||
|      */
 | ||
|     constructor(userAgent, baseUrl, handlers, requestOptions) {
 | ||
|         this.client = new httpm.HttpClient(userAgent, handlers, requestOptions);
 | ||
|         if (baseUrl) {
 | ||
|             this._baseUrl = baseUrl;
 | ||
|         }
 | ||
|     }
 | ||
|     /**
 | ||
|      * Gets a resource from an endpoint
 | ||
|      * Be aware that not found returns a null.  Other error conditions reject the promise
 | ||
|      * @param {string} requestUrl - fully qualified or relative url
 | ||
|      * @param {IRequestOptions} requestOptions - (optional) requestOptions object
 | ||
|      */
 | ||
|     options(requestUrl, options) {
 | ||
|         return __awaiter(this, void 0, void 0, function* () {
 | ||
|             let url = util.getUrl(requestUrl, this._baseUrl);
 | ||
|             let res = yield this.client.options(url, this._headersFromOptions(options));
 | ||
|             return this._processResponse(res, options);
 | ||
|         });
 | ||
|     }
 | ||
|     /**
 | ||
|      * Gets a resource from an endpoint
 | ||
|      * Be aware that not found returns a null.  Other error conditions reject the promise
 | ||
|      * @param {string} resource - fully qualified url or relative path
 | ||
|      * @param {IRequestOptions} requestOptions - (optional) requestOptions object
 | ||
|      */
 | ||
|     get(resource, options) {
 | ||
|         return __awaiter(this, void 0, void 0, function* () {
 | ||
|             let url = util.getUrl(resource, this._baseUrl);
 | ||
|             let res = yield this.client.get(url, this._headersFromOptions(options));
 | ||
|             return this._processResponse(res, options);
 | ||
|         });
 | ||
|     }
 | ||
|     /**
 | ||
|      * Deletes a resource from an endpoint
 | ||
|      * Be aware that not found returns a null.  Other error conditions reject the promise
 | ||
|      * @param {string} resource - fully qualified or relative url
 | ||
|      * @param {IRequestOptions} requestOptions - (optional) requestOptions object
 | ||
|      */
 | ||
|     del(resource, options) {
 | ||
|         return __awaiter(this, void 0, void 0, function* () {
 | ||
|             let url = util.getUrl(resource, this._baseUrl);
 | ||
|             let res = yield this.client.del(url, this._headersFromOptions(options));
 | ||
|             return this._processResponse(res, options);
 | ||
|         });
 | ||
|     }
 | ||
|     /**
 | ||
|      * Creates resource(s) from an endpoint
 | ||
|      * T type of object returned.
 | ||
|      * Be aware that not found returns a null.  Other error conditions reject the promise
 | ||
|      * @param {string} resource - fully qualified or relative url
 | ||
|      * @param {IRequestOptions} requestOptions - (optional) requestOptions object
 | ||
|      */
 | ||
|     create(resource, resources, options) {
 | ||
|         return __awaiter(this, void 0, void 0, function* () {
 | ||
|             let url = util.getUrl(resource, this._baseUrl);
 | ||
|             let headers = this._headersFromOptions(options, true);
 | ||
|             let data = JSON.stringify(resources, null, 2);
 | ||
|             let res = yield this.client.post(url, data, headers);
 | ||
|             return this._processResponse(res, options);
 | ||
|         });
 | ||
|     }
 | ||
|     /**
 | ||
|      * Updates resource(s) from an endpoint
 | ||
|      * T type of object returned.
 | ||
|      * Be aware that not found returns a null.  Other error conditions reject the promise
 | ||
|      * @param {string} resource - fully qualified or relative url
 | ||
|      * @param {IRequestOptions} requestOptions - (optional) requestOptions object
 | ||
|      */
 | ||
|     update(resource, resources, options) {
 | ||
|         return __awaiter(this, void 0, void 0, function* () {
 | ||
|             let url = util.getUrl(resource, this._baseUrl);
 | ||
|             let headers = this._headersFromOptions(options, true);
 | ||
|             let data = JSON.stringify(resources, null, 2);
 | ||
|             let res = yield this.client.patch(url, data, headers);
 | ||
|             return this._processResponse(res, options);
 | ||
|         });
 | ||
|     }
 | ||
|     /**
 | ||
|      * Replaces resource(s) from an endpoint
 | ||
|      * T type of object returned.
 | ||
|      * Be aware that not found returns a null.  Other error conditions reject the promise
 | ||
|      * @param {string} resource - fully qualified or relative url
 | ||
|      * @param {IRequestOptions} requestOptions - (optional) requestOptions object
 | ||
|      */
 | ||
|     replace(resource, resources, options) {
 | ||
|         return __awaiter(this, void 0, void 0, function* () {
 | ||
|             let url = util.getUrl(resource, this._baseUrl);
 | ||
|             let headers = this._headersFromOptions(options, true);
 | ||
|             let data = JSON.stringify(resources, null, 2);
 | ||
|             let res = yield this.client.put(url, data, headers);
 | ||
|             return this._processResponse(res, options);
 | ||
|         });
 | ||
|     }
 | ||
|     uploadStream(verb, requestUrl, stream, options) {
 | ||
|         return __awaiter(this, void 0, void 0, function* () {
 | ||
|             let url = util.getUrl(requestUrl, this._baseUrl);
 | ||
|             let headers = this._headersFromOptions(options, true);
 | ||
|             let res = yield this.client.sendStream(verb, url, stream, headers);
 | ||
|             return this._processResponse(res, options);
 | ||
|         });
 | ||
|     }
 | ||
|     _headersFromOptions(options, contentType) {
 | ||
|         options = options || {};
 | ||
|         let headers = options.additionalHeaders || {};
 | ||
|         headers["Accept"] = options.acceptHeader || "application/json";
 | ||
|         if (contentType) {
 | ||
|             let found = false;
 | ||
|             for (let header in headers) {
 | ||
|                 if (header.toLowerCase() == "content-type") {
 | ||
|                     found = true;
 | ||
|                 }
 | ||
|             }
 | ||
|             if (!found) {
 | ||
|                 headers["Content-Type"] = 'application/json; charset=utf-8';
 | ||
|             }
 | ||
|         }
 | ||
|         return headers;
 | ||
|     }
 | ||
|     static dateTimeDeserializer(key, value) {
 | ||
|         if (typeof value === 'string') {
 | ||
|             let a = new Date(value);
 | ||
|             if (!isNaN(a.valueOf())) {
 | ||
|                 return a;
 | ||
|             }
 | ||
|         }
 | ||
|         return value;
 | ||
|     }
 | ||
|     _processResponse(res, options) {
 | ||
|         return __awaiter(this, void 0, void 0, function* () {
 | ||
|             return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
 | ||
|                 const statusCode = res.message.statusCode;
 | ||
|                 const response = {
 | ||
|                     statusCode: statusCode,
 | ||
|                     result: null,
 | ||
|                     headers: {}
 | ||
|                 };
 | ||
|                 // not found leads to null obj returned
 | ||
|                 if (statusCode == httpm.HttpCodes.NotFound) {
 | ||
|                     resolve(response);
 | ||
|                 }
 | ||
|                 let obj;
 | ||
|                 let contents;
 | ||
|                 // get the result from the body
 | ||
|                 try {
 | ||
|                     contents = yield res.readBody();
 | ||
|                     if (contents && contents.length > 0) {
 | ||
|                         if (options && options.deserializeDates) {
 | ||
|                             obj = JSON.parse(contents, RestClient.dateTimeDeserializer);
 | ||
|                         }
 | ||
|                         else {
 | ||
|                             obj = JSON.parse(contents);
 | ||
|                         }
 | ||
|                         if (options && options.responseProcessor) {
 | ||
|                             response.result = options.responseProcessor(obj);
 | ||
|                         }
 | ||
|                         else {
 | ||
|                             response.result = obj;
 | ||
|                         }
 | ||
|                     }
 | ||
|                     response.headers = res.message.headers;
 | ||
|                 }
 | ||
|                 catch (err) {
 | ||
|                     // Invalid resource (contents not json);  leaving result obj null
 | ||
|                 }
 | ||
|                 // note that 3xx redirects are handled by the http layer.
 | ||
|                 if (statusCode > 299) {
 | ||
|                     let msg;
 | ||
|                     // if exception/error in body, attempt to get better error
 | ||
|                     if (obj && obj.message) {
 | ||
|                         msg = obj.message;
 | ||
|                     }
 | ||
|                     else if (contents && contents.length > 0) {
 | ||
|                         // it may be the case that the exception is in the body message as string
 | ||
|                         msg = contents;
 | ||
|                     }
 | ||
|                     else {
 | ||
|                         msg = "Failed request: (" + statusCode + ")";
 | ||
|                     }
 | ||
|                     let err = new Error(msg);
 | ||
|                     // attach statusCode and body obj (if available) to the error object
 | ||
|                     err['statusCode'] = statusCode;
 | ||
|                     if (response.result) {
 | ||
|                         err['result'] = response.result;
 | ||
|                     }
 | ||
|                     reject(err);
 | ||
|                 }
 | ||
|                 else {
 | ||
|                     resolve(response);
 | ||
|                 }
 | ||
|             }));
 | ||
|         });
 | ||
|     }
 | ||
| }
 | ||
| exports.RestClient = RestClient;
 | ||
| 
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 129:
 | ||
| /***/ (function(module) {
 | ||
| 
 | ||
| module.exports = require("child_process");
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 139:
 | ||
| /***/ (function(module, __unusedexports, __webpack_require__) {
 | ||
| 
 | ||
| // Unique ID creation requires a high quality random # generator.  In node.js
 | ||
| // this is pretty straight-forward - we use the crypto API.
 | ||
| 
 | ||
| var crypto = __webpack_require__(417);
 | ||
| 
 | ||
| module.exports = function nodeRNG() {
 | ||
|   return crypto.randomBytes(16);
 | ||
| };
 | ||
| 
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 141:
 | ||
| /***/ (function(__unusedmodule, exports, __webpack_require__) {
 | ||
| 
 | ||
| "use strict";
 | ||
| 
 | ||
| 
 | ||
| var net = __webpack_require__(631);
 | ||
| var tls = __webpack_require__(16);
 | ||
| var http = __webpack_require__(605);
 | ||
| var https = __webpack_require__(211);
 | ||
| var events = __webpack_require__(614);
 | ||
| var assert = __webpack_require__(357);
 | ||
| var util = __webpack_require__(669);
 | ||
| 
 | ||
| 
 | ||
| exports.httpOverHttp = httpOverHttp;
 | ||
| exports.httpsOverHttp = httpsOverHttp;
 | ||
| exports.httpOverHttps = httpOverHttps;
 | ||
| exports.httpsOverHttps = httpsOverHttps;
 | ||
| 
 | ||
| 
 | ||
| function httpOverHttp(options) {
 | ||
|   var agent = new TunnelingAgent(options);
 | ||
|   agent.request = http.request;
 | ||
|   return agent;
 | ||
| }
 | ||
| 
 | ||
| function httpsOverHttp(options) {
 | ||
|   var agent = new TunnelingAgent(options);
 | ||
|   agent.request = http.request;
 | ||
|   agent.createSocket = createSecureSocket;
 | ||
|   return agent;
 | ||
| }
 | ||
| 
 | ||
| function httpOverHttps(options) {
 | ||
|   var agent = new TunnelingAgent(options);
 | ||
|   agent.request = https.request;
 | ||
|   return agent;
 | ||
| }
 | ||
| 
 | ||
| function httpsOverHttps(options) {
 | ||
|   var agent = new TunnelingAgent(options);
 | ||
|   agent.request = https.request;
 | ||
|   agent.createSocket = createSecureSocket;
 | ||
|   return agent;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| function TunnelingAgent(options) {
 | ||
|   var self = this;
 | ||
|   self.options = options || {};
 | ||
|   self.proxyOptions = self.options.proxy || {};
 | ||
|   self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets;
 | ||
|   self.requests = [];
 | ||
|   self.sockets = [];
 | ||
| 
 | ||
|   self.on('free', function onFree(socket, host, port, localAddress) {
 | ||
|     var options = toOptions(host, port, localAddress);
 | ||
|     for (var i = 0, len = self.requests.length; i < len; ++i) {
 | ||
|       var pending = self.requests[i];
 | ||
|       if (pending.host === options.host && pending.port === options.port) {
 | ||
|         // Detect the request to connect same origin server,
 | ||
|         // reuse the connection.
 | ||
|         self.requests.splice(i, 1);
 | ||
|         pending.request.onSocket(socket);
 | ||
|         return;
 | ||
|       }
 | ||
|     }
 | ||
|     socket.destroy();
 | ||
|     self.removeSocket(socket);
 | ||
|   });
 | ||
| }
 | ||
| util.inherits(TunnelingAgent, events.EventEmitter);
 | ||
| 
 | ||
| TunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) {
 | ||
|   var self = this;
 | ||
|   var options = mergeOptions({request: req}, self.options, toOptions(host, port, localAddress));
 | ||
| 
 | ||
|   if (self.sockets.length >= this.maxSockets) {
 | ||
|     // We are over limit so we'll add it to the queue.
 | ||
|     self.requests.push(options);
 | ||
|     return;
 | ||
|   }
 | ||
| 
 | ||
|   // If we are under maxSockets create a new one.
 | ||
|   self.createSocket(options, function(socket) {
 | ||
|     socket.on('free', onFree);
 | ||
|     socket.on('close', onCloseOrRemove);
 | ||
|     socket.on('agentRemove', onCloseOrRemove);
 | ||
|     req.onSocket(socket);
 | ||
| 
 | ||
|     function onFree() {
 | ||
|       self.emit('free', socket, options);
 | ||
|     }
 | ||
| 
 | ||
|     function onCloseOrRemove(err) {
 | ||
|       self.removeSocket(socket);
 | ||
|       socket.removeListener('free', onFree);
 | ||
|       socket.removeListener('close', onCloseOrRemove);
 | ||
|       socket.removeListener('agentRemove', onCloseOrRemove);
 | ||
|     }
 | ||
|   });
 | ||
| };
 | ||
| 
 | ||
| TunnelingAgent.prototype.createSocket = function createSocket(options, cb) {
 | ||
|   var self = this;
 | ||
|   var placeholder = {};
 | ||
|   self.sockets.push(placeholder);
 | ||
| 
 | ||
|   var connectOptions = mergeOptions({}, self.proxyOptions, {
 | ||
|     method: 'CONNECT',
 | ||
|     path: options.host + ':' + options.port,
 | ||
|     agent: false
 | ||
|   });
 | ||
|   if (connectOptions.proxyAuth) {
 | ||
|     connectOptions.headers = connectOptions.headers || {};
 | ||
|     connectOptions.headers['Proxy-Authorization'] = 'Basic ' +
 | ||
|         new Buffer(connectOptions.proxyAuth).toString('base64');
 | ||
|   }
 | ||
| 
 | ||
|   debug('making CONNECT request');
 | ||
|   var connectReq = self.request(connectOptions);
 | ||
|   connectReq.useChunkedEncodingByDefault = false; // for v0.6
 | ||
|   connectReq.once('response', onResponse); // for v0.6
 | ||
|   connectReq.once('upgrade', onUpgrade);   // for v0.6
 | ||
|   connectReq.once('connect', onConnect);   // for v0.7 or later
 | ||
|   connectReq.once('error', onError);
 | ||
|   connectReq.end();
 | ||
| 
 | ||
|   function onResponse(res) {
 | ||
|     // Very hacky. This is necessary to avoid http-parser leaks.
 | ||
|     res.upgrade = true;
 | ||
|   }
 | ||
| 
 | ||
|   function onUpgrade(res, socket, head) {
 | ||
|     // Hacky.
 | ||
|     process.nextTick(function() {
 | ||
|       onConnect(res, socket, head);
 | ||
|     });
 | ||
|   }
 | ||
| 
 | ||
|   function onConnect(res, socket, head) {
 | ||
|     connectReq.removeAllListeners();
 | ||
|     socket.removeAllListeners();
 | ||
| 
 | ||
|     if (res.statusCode === 200) {
 | ||
|       assert.equal(head.length, 0);
 | ||
|       debug('tunneling connection has established');
 | ||
|       self.sockets[self.sockets.indexOf(placeholder)] = socket;
 | ||
|       cb(socket);
 | ||
|     } else {
 | ||
|       debug('tunneling socket could not be established, statusCode=%d',
 | ||
|             res.statusCode);
 | ||
|       var error = new Error('tunneling socket could not be established, ' +
 | ||
|                             'statusCode=' + res.statusCode);
 | ||
|       error.code = 'ECONNRESET';
 | ||
|       options.request.emit('error', error);
 | ||
|       self.removeSocket(placeholder);
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   function onError(cause) {
 | ||
|     connectReq.removeAllListeners();
 | ||
| 
 | ||
|     debug('tunneling socket could not be established, cause=%s\n',
 | ||
|           cause.message, cause.stack);
 | ||
|     var error = new Error('tunneling socket could not be established, ' +
 | ||
|                           'cause=' + cause.message);
 | ||
|     error.code = 'ECONNRESET';
 | ||
|     options.request.emit('error', error);
 | ||
|     self.removeSocket(placeholder);
 | ||
|   }
 | ||
| };
 | ||
| 
 | ||
| TunnelingAgent.prototype.removeSocket = function removeSocket(socket) {
 | ||
|   var pos = this.sockets.indexOf(socket)
 | ||
|   if (pos === -1) {
 | ||
|     return;
 | ||
|   }
 | ||
|   this.sockets.splice(pos, 1);
 | ||
| 
 | ||
|   var pending = this.requests.shift();
 | ||
|   if (pending) {
 | ||
|     // If we have pending requests and a socket gets closed a new one
 | ||
|     // needs to be created to take over in the pool for the one that closed.
 | ||
|     this.createSocket(pending, function(socket) {
 | ||
|       pending.request.onSocket(socket);
 | ||
|     });
 | ||
|   }
 | ||
| };
 | ||
| 
 | ||
| function createSecureSocket(options, cb) {
 | ||
|   var self = this;
 | ||
|   TunnelingAgent.prototype.createSocket.call(self, options, function(socket) {
 | ||
|     var hostHeader = options.request.getHeader('host');
 | ||
|     var tlsOptions = mergeOptions({}, self.options, {
 | ||
|       socket: socket,
 | ||
|       servername: hostHeader ? hostHeader.replace(/:.*$/, '') : options.host
 | ||
|     });
 | ||
| 
 | ||
|     // 0 is dummy port for v0.6
 | ||
|     var secureSocket = tls.connect(0, tlsOptions);
 | ||
|     self.sockets[self.sockets.indexOf(socket)] = secureSocket;
 | ||
|     cb(secureSocket);
 | ||
|   });
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| function toOptions(host, port, localAddress) {
 | ||
|   if (typeof host === 'string') { // since v0.10
 | ||
|     return {
 | ||
|       host: host,
 | ||
|       port: port,
 | ||
|       localAddress: localAddress
 | ||
|     };
 | ||
|   }
 | ||
|   return host; // for v0.11 or later
 | ||
| }
 | ||
| 
 | ||
| function mergeOptions(target) {
 | ||
|   for (var i = 1, len = arguments.length; i < len; ++i) {
 | ||
|     var overrides = arguments[i];
 | ||
|     if (typeof overrides === 'object') {
 | ||
|       var keys = Object.keys(overrides);
 | ||
|       for (var j = 0, keyLen = keys.length; j < keyLen; ++j) {
 | ||
|         var k = keys[j];
 | ||
|         if (overrides[k] !== undefined) {
 | ||
|           target[k] = overrides[k];
 | ||
|         }
 | ||
|       }
 | ||
|     }
 | ||
|   }
 | ||
|   return target;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| var debug;
 | ||
| if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) {
 | ||
|   debug = function() {
 | ||
|     var args = Array.prototype.slice.call(arguments);
 | ||
|     if (typeof args[0] === 'string') {
 | ||
|       args[0] = 'TUNNEL: ' + args[0];
 | ||
|     } else {
 | ||
|       args.unshift('TUNNEL:');
 | ||
|     }
 | ||
|     console.error.apply(console, args);
 | ||
|   }
 | ||
| } else {
 | ||
|   debug = function() {};
 | ||
| }
 | ||
| exports.debug = debug; // for test
 | ||
| 
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 154:
 | ||
| /***/ (function(__unusedmodule, exports, __webpack_require__) {
 | ||
| 
 | ||
| "use strict";
 | ||
| 
 | ||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
 | ||
|     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
 | ||
|     return new (P || (P = Promise))(function (resolve, reject) {
 | ||
|         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
 | ||
|         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
 | ||
|         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
 | ||
|         step((generator = generator.apply(thisArg, _arguments || [])).next());
 | ||
|     });
 | ||
| };
 | ||
| var __importStar = (this && this.__importStar) || function (mod) {
 | ||
|     if (mod && mod.__esModule) return mod;
 | ||
|     var result = {};
 | ||
|     if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
 | ||
|     result["default"] = mod;
 | ||
|     return result;
 | ||
| };
 | ||
| Object.defineProperty(exports, "__esModule", { value: true });
 | ||
| const core = __importStar(__webpack_require__(470));
 | ||
| const fs = __importStar(__webpack_require__(747));
 | ||
| const Handlers_1 = __webpack_require__(941);
 | ||
| const HttpClient_1 = __webpack_require__(874);
 | ||
| const RestClient_1 = __webpack_require__(105);
 | ||
| function getCacheEntry(keys) {
 | ||
|     return __awaiter(this, void 0, void 0, function* () {
 | ||
|         const cacheUrl = getCacheUrl();
 | ||
|         const token = process.env["ACTIONS_RUNTIME_TOKEN"] || "";
 | ||
|         const bearerCredentialHandler = new Handlers_1.BearerCredentialHandler(token);
 | ||
|         const resource = `_apis/artifactcache/cache?keys=${encodeURIComponent(keys.join(","))}`;
 | ||
|         const restClient = new RestClient_1.RestClient("actions/cache", cacheUrl, [
 | ||
|             bearerCredentialHandler
 | ||
|         ]);
 | ||
|         const response = yield restClient.get(resource, getRequestOptions());
 | ||
|         if (response.statusCode === 204) {
 | ||
|             return null;
 | ||
|         }
 | ||
|         if (response.statusCode !== 200) {
 | ||
|             throw new Error(`Cache service responded with ${response.statusCode}`);
 | ||
|         }
 | ||
|         const cacheResult = response.result;
 | ||
|         core.debug(`Cache Result:`);
 | ||
|         core.debug(JSON.stringify(cacheResult));
 | ||
|         if (!cacheResult || !cacheResult.archiveLocation) {
 | ||
|             throw new Error("Cache not found.");
 | ||
|         }
 | ||
|         return cacheResult;
 | ||
|     });
 | ||
| }
 | ||
| exports.getCacheEntry = getCacheEntry;
 | ||
| function downloadCache(cacheEntry, archivePath) {
 | ||
|     return __awaiter(this, void 0, void 0, function* () {
 | ||
|         const stream = fs.createWriteStream(archivePath);
 | ||
|         const httpClient = new HttpClient_1.HttpClient("actions/cache");
 | ||
|         const downloadResponse = yield httpClient.get(cacheEntry.archiveLocation);
 | ||
|         yield pipeResponseToStream(downloadResponse, stream);
 | ||
|     });
 | ||
| }
 | ||
| exports.downloadCache = downloadCache;
 | ||
| function pipeResponseToStream(response, stream) {
 | ||
|     return __awaiter(this, void 0, void 0, function* () {
 | ||
|         return new Promise(resolve => {
 | ||
|             response.message.pipe(stream).on("close", () => {
 | ||
|                 resolve();
 | ||
|             });
 | ||
|         });
 | ||
|     });
 | ||
| }
 | ||
| function saveCache(stream, key) {
 | ||
|     return __awaiter(this, void 0, void 0, function* () {
 | ||
|         const cacheUrl = getCacheUrl();
 | ||
|         const token = process.env["ACTIONS_RUNTIME_TOKEN"] || "";
 | ||
|         const bearerCredentialHandler = new Handlers_1.BearerCredentialHandler(token);
 | ||
|         const resource = `_apis/artifactcache/cache/${encodeURIComponent(key)}`;
 | ||
|         const postUrl = cacheUrl + resource;
 | ||
|         const restClient = new RestClient_1.RestClient("actions/cache", undefined, [
 | ||
|             bearerCredentialHandler
 | ||
|         ]);
 | ||
|         const requestOptions = getRequestOptions();
 | ||
|         requestOptions.additionalHeaders = {
 | ||
|             "Content-Type": "application/octet-stream"
 | ||
|         };
 | ||
|         const response = yield restClient.uploadStream("POST", postUrl, stream, requestOptions);
 | ||
|         if (response.statusCode !== 200) {
 | ||
|             throw new Error(`Cache service responded with ${response.statusCode}`);
 | ||
|         }
 | ||
|         core.info("Cache saved successfully");
 | ||
|     });
 | ||
| }
 | ||
| exports.saveCache = saveCache;
 | ||
| function getRequestOptions() {
 | ||
|     const requestOptions = {
 | ||
|         acceptHeader: createAcceptHeader("application/json", "5.2-preview.1")
 | ||
|     };
 | ||
|     return requestOptions;
 | ||
| }
 | ||
| function createAcceptHeader(type, apiVersion) {
 | ||
|     return `${type};api-version=${apiVersion}`;
 | ||
| }
 | ||
| function getCacheUrl() {
 | ||
|     // Ideally we just use ACTIONS_CACHE_URL
 | ||
|     let cacheUrl = (process.env["ACTIONS_CACHE_URL"] ||
 | ||
|         process.env["ACTIONS_RUNTIME_URL"] ||
 | ||
|         "").replace("pipelines", "artifactcache");
 | ||
|     if (!cacheUrl) {
 | ||
|         throw new Error("Cache Service Url not found, unable to restore cache.");
 | ||
|     }
 | ||
|     core.debug(`Cache Url: ${cacheUrl}`);
 | ||
|     return cacheUrl;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 211:
 | ||
| /***/ (function(module) {
 | ||
| 
 | ||
| module.exports = require("https");
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 327:
 | ||
| /***/ (function(__unusedmodule, exports) {
 | ||
| 
 | ||
| "use strict";
 | ||
| 
 | ||
| // Copyright (c) Microsoft. All rights reserved.
 | ||
| // Licensed under the MIT license. See LICENSE file in the project root for full license information.
 | ||
| Object.defineProperty(exports, "__esModule", { value: true });
 | ||
| class PersonalAccessTokenCredentialHandler {
 | ||
|     constructor(token) {
 | ||
|         this.token = token;
 | ||
|     }
 | ||
|     // currently implements pre-authorization
 | ||
|     // TODO: support preAuth = false where it hooks on 401
 | ||
|     prepareRequest(options) {
 | ||
|         options.headers['Authorization'] = 'Basic ' + new Buffer('PAT:' + this.token).toString('base64');
 | ||
|         options.headers['X-TFS-FedAuthRedirect'] = 'Suppress';
 | ||
|     }
 | ||
|     // This handler cannot handle 401
 | ||
|     canHandleAuthentication(response) {
 | ||
|         return false;
 | ||
|     }
 | ||
|     handleAuthentication(httpClient, requestInfo, objs) {
 | ||
|         return null;
 | ||
|     }
 | ||
| }
 | ||
| exports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler;
 | ||
| 
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 357:
 | ||
| /***/ (function(module) {
 | ||
| 
 | ||
| module.exports = require("assert");
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 413:
 | ||
| /***/ (function(module, __unusedexports, __webpack_require__) {
 | ||
| 
 | ||
| module.exports = __webpack_require__(141);
 | ||
| 
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 417:
 | ||
| /***/ (function(module) {
 | ||
| 
 | ||
| module.exports = require("crypto");
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 431:
 | ||
| /***/ (function(__unusedmodule, exports, __webpack_require__) {
 | ||
| 
 | ||
| "use strict";
 | ||
| 
 | ||
| Object.defineProperty(exports, "__esModule", { value: true });
 | ||
| const os = __webpack_require__(87);
 | ||
| /**
 | ||
|  * Commands
 | ||
|  *
 | ||
|  * Command Format:
 | ||
|  *   ##[name key=value;key=value]message
 | ||
|  *
 | ||
|  * Examples:
 | ||
|  *   ##[warning]This is the user warning message
 | ||
|  *   ##[set-secret name=mypassword]definitelyNotAPassword!
 | ||
|  */
 | ||
| function issueCommand(command, properties, message) {
 | ||
|     const cmd = new Command(command, properties, message);
 | ||
|     process.stdout.write(cmd.toString() + os.EOL);
 | ||
| }
 | ||
| exports.issueCommand = issueCommand;
 | ||
| function issue(name, message = '') {
 | ||
|     issueCommand(name, {}, message);
 | ||
| }
 | ||
| exports.issue = issue;
 | ||
| const CMD_STRING = '::';
 | ||
| class Command {
 | ||
|     constructor(command, properties, message) {
 | ||
|         if (!command) {
 | ||
|             command = 'missing.command';
 | ||
|         }
 | ||
|         this.command = command;
 | ||
|         this.properties = properties;
 | ||
|         this.message = message;
 | ||
|     }
 | ||
|     toString() {
 | ||
|         let cmdStr = CMD_STRING + this.command;
 | ||
|         if (this.properties && Object.keys(this.properties).length > 0) {
 | ||
|             cmdStr += ' ';
 | ||
|             for (const key in this.properties) {
 | ||
|                 if (this.properties.hasOwnProperty(key)) {
 | ||
|                     const val = this.properties[key];
 | ||
|                     if (val) {
 | ||
|                         // safely append the val - avoid blowing up when attempting to
 | ||
|                         // call .replace() if message is not a string for some reason
 | ||
|                         cmdStr += `${key}=${escape(`${val || ''}`)},`;
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
|         cmdStr += CMD_STRING;
 | ||
|         // safely append the message - avoid blowing up when attempting to
 | ||
|         // call .replace() if message is not a string for some reason
 | ||
|         const message = `${this.message || ''}`;
 | ||
|         cmdStr += escapeData(message);
 | ||
|         return cmdStr;
 | ||
|     }
 | ||
| }
 | ||
| function escapeData(s) {
 | ||
|     return s.replace(/\r/g, '%0D').replace(/\n/g, '%0A');
 | ||
| }
 | ||
| function escape(s) {
 | ||
|     return s
 | ||
|         .replace(/\r/g, '%0D')
 | ||
|         .replace(/\n/g, '%0A')
 | ||
|         .replace(/]/g, '%5D')
 | ||
|         .replace(/;/g, '%3B');
 | ||
| }
 | ||
| //# sourceMappingURL=command.js.map
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 432:
 | ||
| /***/ (function(__unusedmodule, exports, __webpack_require__) {
 | ||
| 
 | ||
| var crypto = __webpack_require__(417);
 | ||
| 
 | ||
| var flags = {
 | ||
| 	NTLM_NegotiateUnicode                :  0x00000001,
 | ||
| 	NTLM_NegotiateOEM                    :  0x00000002,
 | ||
| 	NTLM_RequestTarget                   :  0x00000004,
 | ||
| 	NTLM_Unknown9                        :  0x00000008,
 | ||
| 	NTLM_NegotiateSign                   :  0x00000010,
 | ||
| 	NTLM_NegotiateSeal                   :  0x00000020,
 | ||
| 	NTLM_NegotiateDatagram               :  0x00000040,
 | ||
| 	NTLM_NegotiateLanManagerKey          :  0x00000080,
 | ||
| 	NTLM_Unknown8                        :  0x00000100,
 | ||
| 	NTLM_NegotiateNTLM                   :  0x00000200,
 | ||
| 	NTLM_NegotiateNTOnly                 :  0x00000400,
 | ||
| 	NTLM_Anonymous                       :  0x00000800,
 | ||
| 	NTLM_NegotiateOemDomainSupplied      :  0x00001000,
 | ||
| 	NTLM_NegotiateOemWorkstationSupplied :  0x00002000,
 | ||
| 	NTLM_Unknown6                        :  0x00004000,
 | ||
| 	NTLM_NegotiateAlwaysSign             :  0x00008000,
 | ||
| 	NTLM_TargetTypeDomain                :  0x00010000,
 | ||
| 	NTLM_TargetTypeServer                :  0x00020000,
 | ||
| 	NTLM_TargetTypeShare                 :  0x00040000,
 | ||
| 	NTLM_NegotiateExtendedSecurity       :  0x00080000,
 | ||
| 	NTLM_NegotiateIdentify               :  0x00100000,
 | ||
| 	NTLM_Unknown5                        :  0x00200000,
 | ||
| 	NTLM_RequestNonNTSessionKey          :  0x00400000,
 | ||
| 	NTLM_NegotiateTargetInfo             :  0x00800000,
 | ||
| 	NTLM_Unknown4                        :  0x01000000,
 | ||
| 	NTLM_NegotiateVersion                :  0x02000000,
 | ||
| 	NTLM_Unknown3                        :  0x04000000,
 | ||
| 	NTLM_Unknown2                        :  0x08000000,
 | ||
| 	NTLM_Unknown1                        :  0x10000000,
 | ||
| 	NTLM_Negotiate128                    :  0x20000000,
 | ||
| 	NTLM_NegotiateKeyExchange            :  0x40000000,
 | ||
| 	NTLM_Negotiate56                     :  0x80000000
 | ||
| };
 | ||
| var typeflags = {
 | ||
| 	NTLM_TYPE1_FLAGS : 	  flags.NTLM_NegotiateUnicode
 | ||
| 						+ flags.NTLM_NegotiateOEM
 | ||
| 						+ flags.NTLM_RequestTarget
 | ||
| 						+ flags.NTLM_NegotiateNTLM
 | ||
| 						+ flags.NTLM_NegotiateOemDomainSupplied
 | ||
| 						+ flags.NTLM_NegotiateOemWorkstationSupplied
 | ||
| 						+ flags.NTLM_NegotiateAlwaysSign
 | ||
| 						+ flags.NTLM_NegotiateExtendedSecurity
 | ||
| 						+ flags.NTLM_NegotiateVersion
 | ||
| 						+ flags.NTLM_Negotiate128
 | ||
| 						+ flags.NTLM_Negotiate56,
 | ||
| 
 | ||
| 	NTLM_TYPE2_FLAGS :    flags.NTLM_NegotiateUnicode
 | ||
| 						+ flags.NTLM_RequestTarget
 | ||
| 						+ flags.NTLM_NegotiateNTLM
 | ||
| 						+ flags.NTLM_NegotiateAlwaysSign
 | ||
| 						+ flags.NTLM_NegotiateExtendedSecurity
 | ||
| 						+ flags.NTLM_NegotiateTargetInfo
 | ||
| 						+ flags.NTLM_NegotiateVersion
 | ||
| 						+ flags.NTLM_Negotiate128
 | ||
| 						+ flags.NTLM_Negotiate56
 | ||
| };
 | ||
| 
 | ||
| function createType1Message(options){
 | ||
| 	var domain = escape(options.domain.toUpperCase());
 | ||
| 	var workstation = escape(options.workstation.toUpperCase());
 | ||
| 	var protocol = 'NTLMSSP\0';
 | ||
| 
 | ||
| 	var BODY_LENGTH = 40;
 | ||
| 
 | ||
| 	var type1flags = typeflags.NTLM_TYPE1_FLAGS;
 | ||
| 	if(!domain || domain === '')
 | ||
| 		type1flags = type1flags - flags.NTLM_NegotiateOemDomainSupplied;
 | ||
| 
 | ||
| 	var pos = 0;
 | ||
| 	var buf = new Buffer(BODY_LENGTH + domain.length + workstation.length);
 | ||
| 
 | ||
| 
 | ||
| 	buf.write(protocol, pos, protocol.length); pos += protocol.length; // protocol
 | ||
| 	buf.writeUInt32LE(1, pos); pos += 4;          // type 1
 | ||
| 	buf.writeUInt32LE(type1flags, pos); pos += 4; // TYPE1 flag
 | ||
| 
 | ||
| 	buf.writeUInt16LE(domain.length, pos); pos += 2; // domain length
 | ||
| 	buf.writeUInt16LE(domain.length, pos); pos += 2; // domain max length
 | ||
| 	buf.writeUInt32LE(BODY_LENGTH + workstation.length, pos); pos += 4; // domain buffer offset
 | ||
| 
 | ||
| 	buf.writeUInt16LE(workstation.length, pos); pos += 2; // workstation length
 | ||
| 	buf.writeUInt16LE(workstation.length, pos); pos += 2; // workstation max length
 | ||
| 	buf.writeUInt32LE(BODY_LENGTH, pos); pos += 4; // workstation buffer offset
 | ||
| 
 | ||
| 	buf.writeUInt8(5, pos); pos += 1;      //ProductMajorVersion
 | ||
| 	buf.writeUInt8(1, pos); pos += 1;      //ProductMinorVersion
 | ||
| 	buf.writeUInt16LE(2600, pos); pos += 2; //ProductBuild
 | ||
| 
 | ||
| 	buf.writeUInt8(0 , pos); pos += 1; //VersionReserved1
 | ||
| 	buf.writeUInt8(0 , pos); pos += 1; //VersionReserved2
 | ||
| 	buf.writeUInt8(0 , pos); pos += 1; //VersionReserved3
 | ||
| 	buf.writeUInt8(15, pos); pos += 1; //NTLMRevisionCurrent
 | ||
| 
 | ||
| 	buf.write(workstation, pos, workstation.length, 'ascii'); pos += workstation.length; // workstation string
 | ||
| 	buf.write(domain     , pos, domain.length     , 'ascii'); pos += domain.length;
 | ||
| 
 | ||
| 	return 'NTLM ' + buf.toString('base64');
 | ||
| }
 | ||
| 
 | ||
| function parseType2Message(rawmsg, callback){
 | ||
| 	var match = rawmsg.match(/NTLM (.+)?/);
 | ||
| 	if(!match || !match[1])
 | ||
| 		return callback(new Error("Couldn't find NTLM in the message type2 comming from the server"));
 | ||
| 
 | ||
| 	var buf = new Buffer(match[1], 'base64');
 | ||
| 
 | ||
| 	var msg = {};
 | ||
| 
 | ||
| 	msg.signature = buf.slice(0, 8);
 | ||
| 	msg.type = buf.readInt16LE(8);
 | ||
| 
 | ||
| 	if(msg.type != 2)
 | ||
| 		return callback(new Error("Server didn't return a type 2 message"));
 | ||
| 
 | ||
| 	msg.targetNameLen = buf.readInt16LE(12);
 | ||
| 	msg.targetNameMaxLen = buf.readInt16LE(14);
 | ||
| 	msg.targetNameOffset = buf.readInt32LE(16);
 | ||
| 	msg.targetName  = buf.slice(msg.targetNameOffset, msg.targetNameOffset + msg.targetNameMaxLen);
 | ||
| 
 | ||
|     msg.negotiateFlags = buf.readInt32LE(20);
 | ||
|     msg.serverChallenge = buf.slice(24, 32);
 | ||
|     msg.reserved = buf.slice(32, 40);
 | ||
| 
 | ||
|     if(msg.negotiateFlags & flags.NTLM_NegotiateTargetInfo){
 | ||
|     	msg.targetInfoLen = buf.readInt16LE(40);
 | ||
|     	msg.targetInfoMaxLen = buf.readInt16LE(42);
 | ||
|     	msg.targetInfoOffset = buf.readInt32LE(44);
 | ||
|     	msg.targetInfo = buf.slice(msg.targetInfoOffset, msg.targetInfoOffset + msg.targetInfoLen);
 | ||
|     }
 | ||
| 	return msg;
 | ||
| }
 | ||
| 
 | ||
| function createType3Message(msg2, options){
 | ||
| 	var nonce = msg2.serverChallenge;
 | ||
| 	var username = options.username;
 | ||
| 	var password = options.password;
 | ||
| 	var negotiateFlags = msg2.negotiateFlags;
 | ||
| 
 | ||
| 	var isUnicode = negotiateFlags & flags.NTLM_NegotiateUnicode;
 | ||
| 	var isNegotiateExtendedSecurity = negotiateFlags & flags.NTLM_NegotiateExtendedSecurity;
 | ||
| 
 | ||
| 	var BODY_LENGTH = 72;
 | ||
| 
 | ||
| 	var domainName = escape(options.domain.toUpperCase());
 | ||
| 	var workstation = escape(options.workstation.toUpperCase());
 | ||
| 
 | ||
| 	var workstationBytes, domainNameBytes, usernameBytes, encryptedRandomSessionKeyBytes;
 | ||
| 
 | ||
| 	var encryptedRandomSessionKey = "";
 | ||
| 	if(isUnicode){
 | ||
| 		workstationBytes = new Buffer(workstation, 'utf16le');
 | ||
| 		domainNameBytes = new Buffer(domainName, 'utf16le');
 | ||
| 		usernameBytes = new Buffer(username, 'utf16le');
 | ||
| 		encryptedRandomSessionKeyBytes = new Buffer(encryptedRandomSessionKey, 'utf16le');
 | ||
| 	}else{
 | ||
| 		workstationBytes = new Buffer(workstation, 'ascii');
 | ||
| 		domainNameBytes = new Buffer(domainName, 'ascii');
 | ||
| 		usernameBytes = new Buffer(username, 'ascii');
 | ||
| 		encryptedRandomSessionKeyBytes = new Buffer(encryptedRandomSessionKey, 'ascii');
 | ||
| 	}
 | ||
| 
 | ||
| 	var lmChallengeResponse = calc_resp(create_LM_hashed_password_v1(password), nonce);
 | ||
| 	var ntChallengeResponse = calc_resp(create_NT_hashed_password_v1(password), nonce);
 | ||
| 
 | ||
| 	if(isNegotiateExtendedSecurity){
 | ||
| 		var pwhash = create_NT_hashed_password_v1(password);
 | ||
| 	 	var clientChallenge = "";
 | ||
| 	 	for(var i=0; i < 8; i++){
 | ||
| 	 		clientChallenge += String.fromCharCode( Math.floor(Math.random()*256) );
 | ||
| 	   	}
 | ||
| 	   	var clientChallengeBytes = new Buffer(clientChallenge, 'ascii');
 | ||
| 	    var challenges = ntlm2sr_calc_resp(pwhash, nonce, clientChallengeBytes);
 | ||
| 	    lmChallengeResponse = challenges.lmChallengeResponse;
 | ||
| 	    ntChallengeResponse = challenges.ntChallengeResponse;
 | ||
| 	}
 | ||
| 
 | ||
| 	var signature = 'NTLMSSP\0';
 | ||
| 
 | ||
| 	var pos = 0;
 | ||
| 	var buf = new Buffer(BODY_LENGTH + domainNameBytes.length + usernameBytes.length + workstationBytes.length + lmChallengeResponse.length + ntChallengeResponse.length + encryptedRandomSessionKeyBytes.length);
 | ||
| 
 | ||
| 	buf.write(signature, pos, signature.length); pos += signature.length;
 | ||
| 	buf.writeUInt32LE(3, pos); pos += 4;          // type 1
 | ||
| 
 | ||
| 	buf.writeUInt16LE(lmChallengeResponse.length, pos); pos += 2; // LmChallengeResponseLen
 | ||
| 	buf.writeUInt16LE(lmChallengeResponse.length, pos); pos += 2; // LmChallengeResponseMaxLen
 | ||
| 	buf.writeUInt32LE(BODY_LENGTH + domainNameBytes.length + usernameBytes.length + workstationBytes.length, pos); pos += 4; // LmChallengeResponseOffset
 | ||
| 
 | ||
| 	buf.writeUInt16LE(ntChallengeResponse.length, pos); pos += 2; // NtChallengeResponseLen
 | ||
| 	buf.writeUInt16LE(ntChallengeResponse.length, pos); pos += 2; // NtChallengeResponseMaxLen
 | ||
| 	buf.writeUInt32LE(BODY_LENGTH + domainNameBytes.length + usernameBytes.length + workstationBytes.length + lmChallengeResponse.length, pos); pos += 4; // NtChallengeResponseOffset
 | ||
| 
 | ||
| 	buf.writeUInt16LE(domainNameBytes.length, pos); pos += 2; // DomainNameLen
 | ||
| 	buf.writeUInt16LE(domainNameBytes.length, pos); pos += 2; // DomainNameMaxLen
 | ||
| 	buf.writeUInt32LE(BODY_LENGTH, pos); pos += 4; 			  // DomainNameOffset
 | ||
| 
 | ||
| 	buf.writeUInt16LE(usernameBytes.length, pos); pos += 2; // UserNameLen
 | ||
| 	buf.writeUInt16LE(usernameBytes.length, pos); pos += 2; // UserNameMaxLen
 | ||
| 	buf.writeUInt32LE(BODY_LENGTH + domainNameBytes.length, pos); pos += 4; // UserNameOffset
 | ||
| 
 | ||
| 	buf.writeUInt16LE(workstationBytes.length, pos); pos += 2; // WorkstationLen
 | ||
| 	buf.writeUInt16LE(workstationBytes.length, pos); pos += 2; // WorkstationMaxLen
 | ||
| 	buf.writeUInt32LE(BODY_LENGTH + domainNameBytes.length + usernameBytes.length, pos); pos += 4; // WorkstationOffset
 | ||
| 
 | ||
| 	buf.writeUInt16LE(encryptedRandomSessionKeyBytes.length, pos); pos += 2; // EncryptedRandomSessionKeyLen
 | ||
| 	buf.writeUInt16LE(encryptedRandomSessionKeyBytes.length, pos); pos += 2; // EncryptedRandomSessionKeyMaxLen
 | ||
| 	buf.writeUInt32LE(BODY_LENGTH + domainNameBytes.length + usernameBytes.length + workstationBytes.length + lmChallengeResponse.length + ntChallengeResponse.length, pos); pos += 4; // EncryptedRandomSessionKeyOffset
 | ||
| 
 | ||
| 	buf.writeUInt32LE(typeflags.NTLM_TYPE2_FLAGS, pos); pos += 4; // NegotiateFlags
 | ||
| 
 | ||
| 	buf.writeUInt8(5, pos); pos++; // ProductMajorVersion
 | ||
| 	buf.writeUInt8(1, pos); pos++; // ProductMinorVersion
 | ||
| 	buf.writeUInt16LE(2600, pos); pos += 2; // ProductBuild
 | ||
| 	buf.writeUInt8(0, pos); pos++; // VersionReserved1
 | ||
| 	buf.writeUInt8(0, pos); pos++; // VersionReserved2
 | ||
| 	buf.writeUInt8(0, pos); pos++; // VersionReserved3
 | ||
| 	buf.writeUInt8(15, pos); pos++; // NTLMRevisionCurrent
 | ||
| 
 | ||
| 	domainNameBytes.copy(buf, pos); pos += domainNameBytes.length;
 | ||
| 	usernameBytes.copy(buf, pos); pos += usernameBytes.length;
 | ||
| 	workstationBytes.copy(buf, pos); pos += workstationBytes.length;
 | ||
| 	lmChallengeResponse.copy(buf, pos); pos += lmChallengeResponse.length;
 | ||
| 	ntChallengeResponse.copy(buf, pos); pos += ntChallengeResponse.length;
 | ||
| 	encryptedRandomSessionKeyBytes.copy(buf, pos); pos += encryptedRandomSessionKeyBytes.length;
 | ||
| 
 | ||
| 	return 'NTLM ' + buf.toString('base64');
 | ||
| }
 | ||
| 
 | ||
| function create_LM_hashed_password_v1(password){
 | ||
| 	// fix the password length to 14 bytes
 | ||
| 	password = password.toUpperCase();
 | ||
| 	var passwordBytes = new Buffer(password, 'ascii');
 | ||
| 
 | ||
| 	var passwordBytesPadded = new Buffer(14);
 | ||
| 	passwordBytesPadded.fill("\0");
 | ||
| 	var sourceEnd = 14;
 | ||
| 	if(passwordBytes.length < 14) sourceEnd = passwordBytes.length;
 | ||
| 	passwordBytes.copy(passwordBytesPadded, 0, 0, sourceEnd);
 | ||
| 
 | ||
| 	// split into 2 parts of 7 bytes:
 | ||
| 	var firstPart = passwordBytesPadded.slice(0,7);
 | ||
| 	var secondPart = passwordBytesPadded.slice(7);
 | ||
| 
 | ||
| 	function encrypt(buf){
 | ||
| 		var key = insertZerosEvery7Bits(buf);
 | ||
| 		var des = crypto.createCipheriv('DES-ECB', key, '');
 | ||
| 		return des.update("KGS!@#$%"); // page 57 in [MS-NLMP]);
 | ||
| 	}
 | ||
| 
 | ||
| 	var firstPartEncrypted = encrypt(firstPart);
 | ||
| 	var secondPartEncrypted = encrypt(secondPart);
 | ||
| 
 | ||
| 	return Buffer.concat([firstPartEncrypted, secondPartEncrypted]);
 | ||
| }
 | ||
| 
 | ||
| function insertZerosEvery7Bits(buf){
 | ||
| 	var binaryArray = bytes2binaryArray(buf);
 | ||
| 	var newBinaryArray = [];
 | ||
| 	for(var i=0; i<binaryArray.length; i++){
 | ||
| 		newBinaryArray.push(binaryArray[i]);
 | ||
| 
 | ||
| 		if((i+1)%7 === 0){
 | ||
| 			newBinaryArray.push(0);
 | ||
| 		}
 | ||
| 	}
 | ||
| 	return binaryArray2bytes(newBinaryArray);
 | ||
| }
 | ||
| 
 | ||
| function bytes2binaryArray(buf){
 | ||
| 	var hex2binary = {
 | ||
| 		0: [0,0,0,0],
 | ||
| 		1: [0,0,0,1],
 | ||
| 		2: [0,0,1,0],
 | ||
| 		3: [0,0,1,1],
 | ||
| 		4: [0,1,0,0],
 | ||
| 		5: [0,1,0,1],
 | ||
| 		6: [0,1,1,0],
 | ||
| 		7: [0,1,1,1],
 | ||
| 		8: [1,0,0,0],
 | ||
| 		9: [1,0,0,1],
 | ||
| 		A: [1,0,1,0],
 | ||
| 		B: [1,0,1,1],
 | ||
| 		C: [1,1,0,0],
 | ||
| 		D: [1,1,0,1],
 | ||
| 		E: [1,1,1,0],
 | ||
| 		F: [1,1,1,1]
 | ||
| 	};
 | ||
| 
 | ||
| 	var hexString = buf.toString('hex').toUpperCase();
 | ||
| 	var array = [];
 | ||
| 	for(var i=0; i<hexString.length; i++){
 | ||
|    		var hexchar = hexString.charAt(i);
 | ||
|    		array = array.concat(hex2binary[hexchar]);
 | ||
|    	}
 | ||
|    	return array;
 | ||
| }
 | ||
| 
 | ||
| function binaryArray2bytes(array){
 | ||
| 	var binary2hex = {
 | ||
| 		'0000': 0,
 | ||
| 		'0001': 1,
 | ||
| 		'0010': 2,
 | ||
| 		'0011': 3,
 | ||
| 		'0100': 4,
 | ||
| 		'0101': 5,
 | ||
| 		'0110': 6,
 | ||
| 		'0111': 7,
 | ||
| 		'1000': 8,
 | ||
| 		'1001': 9,
 | ||
| 		'1010': 'A',
 | ||
| 		'1011': 'B',
 | ||
| 		'1100': 'C',
 | ||
| 		'1101': 'D',
 | ||
| 		'1110': 'E',
 | ||
| 		'1111': 'F'
 | ||
| 	};
 | ||
| 
 | ||
|  	var bufArray = [];
 | ||
| 
 | ||
| 	for(var i=0; i<array.length; i +=8 ){
 | ||
| 		if((i+7) > array.length)
 | ||
| 			break;
 | ||
| 
 | ||
| 		var binString1 = '' + array[i] + '' + array[i+1] + '' + array[i+2] + '' + array[i+3];
 | ||
| 		var binString2 = '' + array[i+4] + '' + array[i+5] + '' + array[i+6] + '' + array[i+7];
 | ||
|    		var hexchar1 = binary2hex[binString1];
 | ||
|    		var hexchar2 = binary2hex[binString2];
 | ||
| 
 | ||
|    		var buf = new Buffer(hexchar1 + '' + hexchar2, 'hex');
 | ||
|    		bufArray.push(buf);
 | ||
|    	}
 | ||
| 
 | ||
|    	return Buffer.concat(bufArray);
 | ||
| }
 | ||
| 
 | ||
| function create_NT_hashed_password_v1(password){
 | ||
| 	var buf = new Buffer(password, 'utf16le');
 | ||
| 	var md4 = crypto.createHash('md4');
 | ||
| 	md4.update(buf);
 | ||
| 	return new Buffer(md4.digest());
 | ||
| }
 | ||
| 
 | ||
| function calc_resp(password_hash, server_challenge){
 | ||
|     // padding with zeros to make the hash 21 bytes long
 | ||
|     var passHashPadded = new Buffer(21);
 | ||
|     passHashPadded.fill("\0");
 | ||
|     password_hash.copy(passHashPadded, 0, 0, password_hash.length);
 | ||
| 
 | ||
|     var resArray = [];
 | ||
| 
 | ||
|     var des = crypto.createCipheriv('DES-ECB', insertZerosEvery7Bits(passHashPadded.slice(0,7)), '');
 | ||
|     resArray.push( des.update(server_challenge.slice(0,8)) );
 | ||
| 
 | ||
|     des = crypto.createCipheriv('DES-ECB', insertZerosEvery7Bits(passHashPadded.slice(7,14)), '');
 | ||
|     resArray.push( des.update(server_challenge.slice(0,8)) );
 | ||
| 
 | ||
|     des = crypto.createCipheriv('DES-ECB', insertZerosEvery7Bits(passHashPadded.slice(14,21)), '');
 | ||
|     resArray.push( des.update(server_challenge.slice(0,8)) );
 | ||
| 
 | ||
|    	return Buffer.concat(resArray);
 | ||
| }
 | ||
| 
 | ||
| function ntlm2sr_calc_resp(responseKeyNT, serverChallenge, clientChallenge){
 | ||
| 	// padding with zeros to make the hash 16 bytes longer
 | ||
|     var lmChallengeResponse = new Buffer(clientChallenge.length + 16);
 | ||
|     lmChallengeResponse.fill("\0");
 | ||
|     clientChallenge.copy(lmChallengeResponse, 0, 0, clientChallenge.length);
 | ||
| 
 | ||
|     var buf = Buffer.concat([serverChallenge, clientChallenge]);
 | ||
|     var md5 = crypto.createHash('md5');
 | ||
|     md5.update(buf);
 | ||
|     var sess = md5.digest();
 | ||
|     var ntChallengeResponse = calc_resp(responseKeyNT, sess.slice(0,8));
 | ||
| 
 | ||
|     return {
 | ||
|     	lmChallengeResponse: lmChallengeResponse,
 | ||
|     	ntChallengeResponse: ntChallengeResponse
 | ||
|     };
 | ||
| }
 | ||
| 
 | ||
| exports.createType1Message = createType1Message;
 | ||
| exports.parseType2Message = parseType2Message;
 | ||
| exports.createType3Message = createType3Message;
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 443:
 | ||
| /***/ (function(__unusedmodule, exports, __webpack_require__) {
 | ||
| 
 | ||
| "use strict";
 | ||
| 
 | ||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
 | ||
|     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
 | ||
|     return new (P || (P = Promise))(function (resolve, reject) {
 | ||
|         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
 | ||
|         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
 | ||
|         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
 | ||
|         step((generator = generator.apply(thisArg, _arguments || [])).next());
 | ||
|     });
 | ||
| };
 | ||
| var __importStar = (this && this.__importStar) || function (mod) {
 | ||
|     if (mod && mod.__esModule) return mod;
 | ||
|     var result = {};
 | ||
|     if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
 | ||
|     result["default"] = mod;
 | ||
|     return result;
 | ||
| };
 | ||
| Object.defineProperty(exports, "__esModule", { value: true });
 | ||
| const core = __importStar(__webpack_require__(470));
 | ||
| const io = __importStar(__webpack_require__(1));
 | ||
| const os = __importStar(__webpack_require__(87));
 | ||
| const path = __importStar(__webpack_require__(622));
 | ||
| const uuidV4 = __importStar(__webpack_require__(826));
 | ||
| const constants_1 = __webpack_require__(694);
 | ||
| // From https://github.com/actions/toolkit/blob/master/packages/tool-cache/src/tool-cache.ts#L23
 | ||
| function createTempDirectory() {
 | ||
|     return __awaiter(this, void 0, void 0, function* () {
 | ||
|         const IS_WINDOWS = process.platform === "win32";
 | ||
|         let tempDirectory = process.env["RUNNER_TEMP"] || "";
 | ||
|         if (!tempDirectory) {
 | ||
|             let baseLocation;
 | ||
|             if (IS_WINDOWS) {
 | ||
|                 // On Windows use the USERPROFILE env variable
 | ||
|                 baseLocation = process.env["USERPROFILE"] || "C:\\";
 | ||
|             }
 | ||
|             else {
 | ||
|                 if (process.platform === "darwin") {
 | ||
|                     baseLocation = "/Users";
 | ||
|                 }
 | ||
|                 else {
 | ||
|                     baseLocation = "/home";
 | ||
|                 }
 | ||
|             }
 | ||
|             tempDirectory = path.join(baseLocation, "actions", "temp");
 | ||
|         }
 | ||
|         const dest = path.join(tempDirectory, uuidV4.default());
 | ||
|         yield io.mkdirP(dest);
 | ||
|         return dest;
 | ||
|     });
 | ||
| }
 | ||
| exports.createTempDirectory = createTempDirectory;
 | ||
| function isExactKeyMatch(key, cacheResult) {
 | ||
|     return !!(cacheResult &&
 | ||
|         cacheResult.cacheKey &&
 | ||
|         cacheResult.cacheKey.localeCompare(key, undefined, {
 | ||
|             sensitivity: "accent"
 | ||
|         }) === 0);
 | ||
| }
 | ||
| exports.isExactKeyMatch = isExactKeyMatch;
 | ||
| function setOutputAndState(key, cacheResult) {
 | ||
|     setCacheHitOutput(isExactKeyMatch(key, cacheResult));
 | ||
|     // Store the cache result if it exists
 | ||
|     cacheResult && setCacheState(cacheResult);
 | ||
| }
 | ||
| exports.setOutputAndState = setOutputAndState;
 | ||
| function getCacheState() {
 | ||
|     const stateData = core.getState(constants_1.State.CacheResult);
 | ||
|     core.debug(`State: ${stateData}`);
 | ||
|     return (stateData && JSON.parse(stateData));
 | ||
| }
 | ||
| exports.getCacheState = getCacheState;
 | ||
| function setCacheState(state) {
 | ||
|     core.saveState(constants_1.State.CacheResult, JSON.stringify(state));
 | ||
| }
 | ||
| exports.setCacheState = setCacheState;
 | ||
| function setCacheHitOutput(isCacheHit) {
 | ||
|     core.setOutput(constants_1.Outputs.CacheHit, isCacheHit.toString());
 | ||
| }
 | ||
| exports.setCacheHitOutput = setCacheHitOutput;
 | ||
| function resolvePath(filePath) {
 | ||
|     if (filePath[0] === "~") {
 | ||
|         const home = os.homedir();
 | ||
|         if (!home) {
 | ||
|             throw new Error("Unable to resolve `~` to HOME");
 | ||
|         }
 | ||
|         return path.join(home, filePath.slice(1));
 | ||
|     }
 | ||
|     return path.resolve(filePath);
 | ||
| }
 | ||
| exports.resolvePath = resolvePath;
 | ||
| 
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 470:
 | ||
| /***/ (function(__unusedmodule, exports, __webpack_require__) {
 | ||
| 
 | ||
| "use strict";
 | ||
| 
 | ||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
 | ||
|     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
 | ||
|     return new (P || (P = Promise))(function (resolve, reject) {
 | ||
|         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
 | ||
|         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
 | ||
|         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
 | ||
|         step((generator = generator.apply(thisArg, _arguments || [])).next());
 | ||
|     });
 | ||
| };
 | ||
| Object.defineProperty(exports, "__esModule", { value: true });
 | ||
| const command_1 = __webpack_require__(431);
 | ||
| const os = __webpack_require__(87);
 | ||
| const path = __webpack_require__(622);
 | ||
| /**
 | ||
|  * The code to exit an action
 | ||
|  */
 | ||
| var ExitCode;
 | ||
| (function (ExitCode) {
 | ||
|     /**
 | ||
|      * A code indicating that the action was successful
 | ||
|      */
 | ||
|     ExitCode[ExitCode["Success"] = 0] = "Success";
 | ||
|     /**
 | ||
|      * A code indicating that the action was a failure
 | ||
|      */
 | ||
|     ExitCode[ExitCode["Failure"] = 1] = "Failure";
 | ||
| })(ExitCode = exports.ExitCode || (exports.ExitCode = {}));
 | ||
| //-----------------------------------------------------------------------
 | ||
| // Variables
 | ||
| //-----------------------------------------------------------------------
 | ||
| /**
 | ||
|  * Sets env variable for this action and future actions in the job
 | ||
|  * @param name the name of the variable to set
 | ||
|  * @param val the value of the variable
 | ||
|  */
 | ||
| function exportVariable(name, val) {
 | ||
|     process.env[name] = val;
 | ||
|     command_1.issueCommand('set-env', { name }, val);
 | ||
| }
 | ||
| exports.exportVariable = exportVariable;
 | ||
| /**
 | ||
|  * Registers a secret which will get masked from logs
 | ||
|  * @param secret value of the secret
 | ||
|  */
 | ||
| function setSecret(secret) {
 | ||
|     command_1.issueCommand('add-mask', {}, secret);
 | ||
| }
 | ||
| exports.setSecret = setSecret;
 | ||
| /**
 | ||
|  * Prepends inputPath to the PATH (for this action and future actions)
 | ||
|  * @param inputPath
 | ||
|  */
 | ||
| function addPath(inputPath) {
 | ||
|     command_1.issueCommand('add-path', {}, inputPath);
 | ||
|     process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`;
 | ||
| }
 | ||
| exports.addPath = addPath;
 | ||
| /**
 | ||
|  * Gets the value of an input.  The value is also trimmed.
 | ||
|  *
 | ||
|  * @param     name     name of the input to get
 | ||
|  * @param     options  optional. See InputOptions.
 | ||
|  * @returns   string
 | ||
|  */
 | ||
| function getInput(name, options) {
 | ||
|     const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || '';
 | ||
|     if (options && options.required && !val) {
 | ||
|         throw new Error(`Input required and not supplied: ${name}`);
 | ||
|     }
 | ||
|     return val.trim();
 | ||
| }
 | ||
| exports.getInput = getInput;
 | ||
| /**
 | ||
|  * Sets the value of an output.
 | ||
|  *
 | ||
|  * @param     name     name of the output to set
 | ||
|  * @param     value    value to store
 | ||
|  */
 | ||
| function setOutput(name, value) {
 | ||
|     command_1.issueCommand('set-output', { name }, value);
 | ||
| }
 | ||
| exports.setOutput = setOutput;
 | ||
| //-----------------------------------------------------------------------
 | ||
| // Results
 | ||
| //-----------------------------------------------------------------------
 | ||
| /**
 | ||
|  * Sets the action status to failed.
 | ||
|  * When the action exits it will be with an exit code of 1
 | ||
|  * @param message add error issue message
 | ||
|  */
 | ||
| function setFailed(message) {
 | ||
|     process.exitCode = ExitCode.Failure;
 | ||
|     error(message);
 | ||
| }
 | ||
| exports.setFailed = setFailed;
 | ||
| //-----------------------------------------------------------------------
 | ||
| // Logging Commands
 | ||
| //-----------------------------------------------------------------------
 | ||
| /**
 | ||
|  * Writes debug message to user log
 | ||
|  * @param message debug message
 | ||
|  */
 | ||
| function debug(message) {
 | ||
|     command_1.issueCommand('debug', {}, message);
 | ||
| }
 | ||
| exports.debug = debug;
 | ||
| /**
 | ||
|  * Adds an error issue
 | ||
|  * @param message error issue message
 | ||
|  */
 | ||
| function error(message) {
 | ||
|     command_1.issue('error', message);
 | ||
| }
 | ||
| exports.error = error;
 | ||
| /**
 | ||
|  * Adds an warning issue
 | ||
|  * @param message warning issue message
 | ||
|  */
 | ||
| function warning(message) {
 | ||
|     command_1.issue('warning', message);
 | ||
| }
 | ||
| exports.warning = warning;
 | ||
| /**
 | ||
|  * Writes info to log with console.log.
 | ||
|  * @param message info message
 | ||
|  */
 | ||
| function info(message) {
 | ||
|     process.stdout.write(message + os.EOL);
 | ||
| }
 | ||
| exports.info = info;
 | ||
| /**
 | ||
|  * Begin an output group.
 | ||
|  *
 | ||
|  * Output until the next `groupEnd` will be foldable in this group
 | ||
|  *
 | ||
|  * @param name The name of the output group
 | ||
|  */
 | ||
| function startGroup(name) {
 | ||
|     command_1.issue('group', name);
 | ||
| }
 | ||
| exports.startGroup = startGroup;
 | ||
| /**
 | ||
|  * End an output group.
 | ||
|  */
 | ||
| function endGroup() {
 | ||
|     command_1.issue('endgroup');
 | ||
| }
 | ||
| exports.endGroup = endGroup;
 | ||
| /**
 | ||
|  * Wrap an asynchronous function call in a group.
 | ||
|  *
 | ||
|  * Returns the same type as the function itself.
 | ||
|  *
 | ||
|  * @param name The name of the group
 | ||
|  * @param fn The function to wrap in the group
 | ||
|  */
 | ||
| function group(name, fn) {
 | ||
|     return __awaiter(this, void 0, void 0, function* () {
 | ||
|         startGroup(name);
 | ||
|         let result;
 | ||
|         try {
 | ||
|             result = yield fn();
 | ||
|         }
 | ||
|         finally {
 | ||
|             endGroup();
 | ||
|         }
 | ||
|         return result;
 | ||
|     });
 | ||
| }
 | ||
| exports.group = group;
 | ||
| //-----------------------------------------------------------------------
 | ||
| // Wrapper action state
 | ||
| //-----------------------------------------------------------------------
 | ||
| /**
 | ||
|  * Saves state for current action, the state can only be retrieved by this action's post job execution.
 | ||
|  *
 | ||
|  * @param     name     name of the state to store
 | ||
|  * @param     value    value to store
 | ||
|  */
 | ||
| function saveState(name, value) {
 | ||
|     command_1.issueCommand('save-state', { name }, value);
 | ||
| }
 | ||
| exports.saveState = saveState;
 | ||
| /**
 | ||
|  * Gets the value of an state set by this action's main execution.
 | ||
|  *
 | ||
|  * @param     name     name of the state to get
 | ||
|  * @returns   string
 | ||
|  */
 | ||
| function getState(name) {
 | ||
|     return process.env[`STATE_${name}`] || '';
 | ||
| }
 | ||
| exports.getState = getState;
 | ||
| //# sourceMappingURL=core.js.map
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 525:
 | ||
| /***/ (function(__unusedmodule, exports, __webpack_require__) {
 | ||
| 
 | ||
| "use strict";
 | ||
| 
 | ||
| // Copyright (c) Microsoft. All rights reserved.
 | ||
| // Licensed under the MIT license. See LICENSE file in the project root for full license information.
 | ||
| Object.defineProperty(exports, "__esModule", { value: true });
 | ||
| const http = __webpack_require__(605);
 | ||
| const https = __webpack_require__(211);
 | ||
| const _ = __webpack_require__(891);
 | ||
| const ntlm = __webpack_require__(432);
 | ||
| class NtlmCredentialHandler {
 | ||
|     constructor(username, password, workstation, domain) {
 | ||
|         this._ntlmOptions = {};
 | ||
|         this._ntlmOptions.username = username;
 | ||
|         this._ntlmOptions.password = password;
 | ||
|         if (domain !== undefined) {
 | ||
|             this._ntlmOptions.domain = domain;
 | ||
|         }
 | ||
|         else {
 | ||
|             this._ntlmOptions.domain = '';
 | ||
|         }
 | ||
|         if (workstation !== undefined) {
 | ||
|             this._ntlmOptions.workstation = workstation;
 | ||
|         }
 | ||
|         else {
 | ||
|             this._ntlmOptions.workstation = '';
 | ||
|         }
 | ||
|     }
 | ||
|     prepareRequest(options) {
 | ||
|         // No headers or options need to be set.  We keep the credentials on the handler itself.
 | ||
|         // If a (proxy) agent is set, remove it as we don't support proxy for NTLM at this time
 | ||
|         if (options.agent) {
 | ||
|             delete options.agent;
 | ||
|         }
 | ||
|     }
 | ||
|     canHandleAuthentication(response) {
 | ||
|         if (response && response.message && response.message.statusCode === 401) {
 | ||
|             // Ensure that we're talking NTLM here
 | ||
|             // Once we have the www-authenticate header, split it so we can ensure we can talk NTLM
 | ||
|             const wwwAuthenticate = response.message.headers['www-authenticate'];
 | ||
|             if (wwwAuthenticate) {
 | ||
|                 const mechanisms = wwwAuthenticate.split(', ');
 | ||
|                 const index = mechanisms.indexOf("NTLM");
 | ||
|                 if (index >= 0) {
 | ||
|                     return true;
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
|         return false;
 | ||
|     }
 | ||
|     handleAuthentication(httpClient, requestInfo, objs) {
 | ||
|         return new Promise((resolve, reject) => {
 | ||
|             const callbackForResult = function (err, res) {
 | ||
|                 if (err) {
 | ||
|                     reject(err);
 | ||
|                 }
 | ||
|                 // We have to readbody on the response before continuing otherwise there is a hang.
 | ||
|                 res.readBody().then(() => {
 | ||
|                     resolve(res);
 | ||
|                 });
 | ||
|             };
 | ||
|             this.handleAuthenticationPrivate(httpClient, requestInfo, objs, callbackForResult);
 | ||
|         });
 | ||
|     }
 | ||
|     handleAuthenticationPrivate(httpClient, requestInfo, objs, finalCallback) {
 | ||
|         // Set up the headers for NTLM authentication
 | ||
|         requestInfo.options = _.extend(requestInfo.options, {
 | ||
|             username: this._ntlmOptions.username,
 | ||
|             password: this._ntlmOptions.password,
 | ||
|             domain: this._ntlmOptions.domain,
 | ||
|             workstation: this._ntlmOptions.workstation
 | ||
|         });
 | ||
|         if (httpClient.isSsl === true) {
 | ||
|             requestInfo.options.agent = new https.Agent({ keepAlive: true });
 | ||
|         }
 | ||
|         else {
 | ||
|             requestInfo.options.agent = new http.Agent({ keepAlive: true });
 | ||
|         }
 | ||
|         let self = this;
 | ||
|         // The following pattern of sending the type1 message following immediately (in a setImmediate) is
 | ||
|         // critical for the NTLM exchange to happen.  If we removed setImmediate (or call in a different manner)
 | ||
|         // the NTLM exchange will always fail with a 401.
 | ||
|         this.sendType1Message(httpClient, requestInfo, objs, function (err, res) {
 | ||
|             if (err) {
 | ||
|                 return finalCallback(err, null, null);
 | ||
|             }
 | ||
|             /// We have to readbody on the response before continuing otherwise there is a hang.
 | ||
|             res.readBody().then(() => {
 | ||
|                 // It is critical that we have setImmediate here due to how connection requests are queued.
 | ||
|                 // If setImmediate is removed then the NTLM handshake will not work.
 | ||
|                 // setImmediate allows us to queue a second request on the same connection. If this second 
 | ||
|                 // request is not queued on the connection when the first request finishes then node closes
 | ||
|                 // the connection. NTLM requires both requests to be on the same connection so we need this.
 | ||
|                 setImmediate(function () {
 | ||
|                     self.sendType3Message(httpClient, requestInfo, objs, res, finalCallback);
 | ||
|                 });
 | ||
|             });
 | ||
|         });
 | ||
|     }
 | ||
|     // The following method is an adaptation of code found at https://github.com/SamDecrock/node-http-ntlm/blob/master/httpntlm.js
 | ||
|     sendType1Message(httpClient, requestInfo, objs, finalCallback) {
 | ||
|         const type1msg = ntlm.createType1Message(this._ntlmOptions);
 | ||
|         const type1options = {
 | ||
|             headers: {
 | ||
|                 'Connection': 'keep-alive',
 | ||
|                 'Authorization': type1msg
 | ||
|             },
 | ||
|             timeout: requestInfo.options.timeout || 0,
 | ||
|             agent: requestInfo.httpModule,
 | ||
|         };
 | ||
|         const type1info = {};
 | ||
|         type1info.httpModule = requestInfo.httpModule;
 | ||
|         type1info.parsedUrl = requestInfo.parsedUrl;
 | ||
|         type1info.options = _.extend(type1options, _.omit(requestInfo.options, 'headers'));
 | ||
|         return httpClient.requestRawWithCallback(type1info, objs, finalCallback);
 | ||
|     }
 | ||
|     // The following method is an adaptation of code found at https://github.com/SamDecrock/node-http-ntlm/blob/master/httpntlm.js
 | ||
|     sendType3Message(httpClient, requestInfo, objs, res, callback) {
 | ||
|         if (!res.message.headers && !res.message.headers['www-authenticate']) {
 | ||
|             throw new Error('www-authenticate not found on response of second request');
 | ||
|         }
 | ||
|         const type2msg = ntlm.parseType2Message(res.message.headers['www-authenticate']);
 | ||
|         const type3msg = ntlm.createType3Message(type2msg, this._ntlmOptions);
 | ||
|         const type3options = {
 | ||
|             headers: {
 | ||
|                 'Authorization': type3msg,
 | ||
|                 'Connection': 'Close'
 | ||
|             },
 | ||
|             agent: requestInfo.httpModule,
 | ||
|         };
 | ||
|         const type3info = {};
 | ||
|         type3info.httpModule = requestInfo.httpModule;
 | ||
|         type3info.parsedUrl = requestInfo.parsedUrl;
 | ||
|         type3options.headers = _.extend(type3options.headers, requestInfo.options.headers);
 | ||
|         type3info.options = _.extend(type3options, _.omit(requestInfo.options, 'headers'));
 | ||
|         return httpClient.requestRawWithCallback(type3info, objs, callback);
 | ||
|     }
 | ||
| }
 | ||
| exports.NtlmCredentialHandler = NtlmCredentialHandler;
 | ||
| 
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 571:
 | ||
| /***/ (function(__unusedmodule, exports) {
 | ||
| 
 | ||
| "use strict";
 | ||
| 
 | ||
| // Copyright (c) Microsoft. All rights reserved.
 | ||
| // Licensed under the MIT license. See LICENSE file in the project root for full license information.
 | ||
| Object.defineProperty(exports, "__esModule", { value: true });
 | ||
| class BearerCredentialHandler {
 | ||
|     constructor(token) {
 | ||
|         this.token = token;
 | ||
|     }
 | ||
|     // currently implements pre-authorization
 | ||
|     // TODO: support preAuth = false where it hooks on 401
 | ||
|     prepareRequest(options) {
 | ||
|         options.headers['Authorization'] = 'Bearer ' + this.token;
 | ||
|         options.headers['X-TFS-FedAuthRedirect'] = 'Suppress';
 | ||
|     }
 | ||
|     // This handler cannot handle 401
 | ||
|     canHandleAuthentication(response) {
 | ||
|         return false;
 | ||
|     }
 | ||
|     handleAuthentication(httpClient, requestInfo, objs) {
 | ||
|         return null;
 | ||
|     }
 | ||
| }
 | ||
| exports.BearerCredentialHandler = BearerCredentialHandler;
 | ||
| 
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 605:
 | ||
| /***/ (function(module) {
 | ||
| 
 | ||
| module.exports = require("http");
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 614:
 | ||
| /***/ (function(module) {
 | ||
| 
 | ||
| module.exports = require("events");
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 622:
 | ||
| /***/ (function(module) {
 | ||
| 
 | ||
| module.exports = require("path");
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 631:
 | ||
| /***/ (function(module) {
 | ||
| 
 | ||
| module.exports = require("net");
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 669:
 | ||
| /***/ (function(module) {
 | ||
| 
 | ||
| module.exports = require("util");
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 672:
 | ||
| /***/ (function(__unusedmodule, exports, __webpack_require__) {
 | ||
| 
 | ||
| "use strict";
 | ||
| 
 | ||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
 | ||
|     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
 | ||
|     return new (P || (P = Promise))(function (resolve, reject) {
 | ||
|         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
 | ||
|         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
 | ||
|         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
 | ||
|         step((generator = generator.apply(thisArg, _arguments || [])).next());
 | ||
|     });
 | ||
| };
 | ||
| var _a;
 | ||
| Object.defineProperty(exports, "__esModule", { value: true });
 | ||
| const assert_1 = __webpack_require__(357);
 | ||
| const fs = __webpack_require__(747);
 | ||
| const path = __webpack_require__(622);
 | ||
| _a = fs.promises, exports.chmod = _a.chmod, exports.copyFile = _a.copyFile, exports.lstat = _a.lstat, exports.mkdir = _a.mkdir, exports.readdir = _a.readdir, exports.readlink = _a.readlink, exports.rename = _a.rename, exports.rmdir = _a.rmdir, exports.stat = _a.stat, exports.symlink = _a.symlink, exports.unlink = _a.unlink;
 | ||
| exports.IS_WINDOWS = process.platform === 'win32';
 | ||
| function exists(fsPath) {
 | ||
|     return __awaiter(this, void 0, void 0, function* () {
 | ||
|         try {
 | ||
|             yield exports.stat(fsPath);
 | ||
|         }
 | ||
|         catch (err) {
 | ||
|             if (err.code === 'ENOENT') {
 | ||
|                 return false;
 | ||
|             }
 | ||
|             throw err;
 | ||
|         }
 | ||
|         return true;
 | ||
|     });
 | ||
| }
 | ||
| exports.exists = exists;
 | ||
| function isDirectory(fsPath, useStat = false) {
 | ||
|     return __awaiter(this, void 0, void 0, function* () {
 | ||
|         const stats = useStat ? yield exports.stat(fsPath) : yield exports.lstat(fsPath);
 | ||
|         return stats.isDirectory();
 | ||
|     });
 | ||
| }
 | ||
| exports.isDirectory = isDirectory;
 | ||
| /**
 | ||
|  * On OSX/Linux, true if path starts with '/'. On Windows, true for paths like:
 | ||
|  * \, \hello, \\hello\share, C:, and C:\hello (and corresponding alternate separator cases).
 | ||
|  */
 | ||
| function isRooted(p) {
 | ||
|     p = normalizeSeparators(p);
 | ||
|     if (!p) {
 | ||
|         throw new Error('isRooted() parameter "p" cannot be empty');
 | ||
|     }
 | ||
|     if (exports.IS_WINDOWS) {
 | ||
|         return (p.startsWith('\\') || /^[A-Z]:/i.test(p) // e.g. \ or \hello or \\hello
 | ||
|         ); // e.g. C: or C:\hello
 | ||
|     }
 | ||
|     return p.startsWith('/');
 | ||
| }
 | ||
| exports.isRooted = isRooted;
 | ||
| /**
 | ||
|  * Recursively create a directory at `fsPath`.
 | ||
|  *
 | ||
|  * This implementation is optimistic, meaning it attempts to create the full
 | ||
|  * path first, and backs up the path stack from there.
 | ||
|  *
 | ||
|  * @param fsPath The path to create
 | ||
|  * @param maxDepth The maximum recursion depth
 | ||
|  * @param depth The current recursion depth
 | ||
|  */
 | ||
| function mkdirP(fsPath, maxDepth = 1000, depth = 1) {
 | ||
|     return __awaiter(this, void 0, void 0, function* () {
 | ||
|         assert_1.ok(fsPath, 'a path argument must be provided');
 | ||
|         fsPath = path.resolve(fsPath);
 | ||
|         if (depth >= maxDepth)
 | ||
|             return exports.mkdir(fsPath);
 | ||
|         try {
 | ||
|             yield exports.mkdir(fsPath);
 | ||
|             return;
 | ||
|         }
 | ||
|         catch (err) {
 | ||
|             switch (err.code) {
 | ||
|                 case 'ENOENT': {
 | ||
|                     yield mkdirP(path.dirname(fsPath), maxDepth, depth + 1);
 | ||
|                     yield exports.mkdir(fsPath);
 | ||
|                     return;
 | ||
|                 }
 | ||
|                 default: {
 | ||
|                     let stats;
 | ||
|                     try {
 | ||
|                         stats = yield exports.stat(fsPath);
 | ||
|                     }
 | ||
|                     catch (err2) {
 | ||
|                         throw err;
 | ||
|                     }
 | ||
|                     if (!stats.isDirectory())
 | ||
|                         throw err;
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
|     });
 | ||
| }
 | ||
| exports.mkdirP = mkdirP;
 | ||
| /**
 | ||
|  * Best effort attempt to determine whether a file exists and is executable.
 | ||
|  * @param filePath    file path to check
 | ||
|  * @param extensions  additional file extensions to try
 | ||
|  * @return if file exists and is executable, returns the file path. otherwise empty string.
 | ||
|  */
 | ||
| function tryGetExecutablePath(filePath, extensions) {
 | ||
|     return __awaiter(this, void 0, void 0, function* () {
 | ||
|         let stats = undefined;
 | ||
|         try {
 | ||
|             // test file exists
 | ||
|             stats = yield exports.stat(filePath);
 | ||
|         }
 | ||
|         catch (err) {
 | ||
|             if (err.code !== 'ENOENT') {
 | ||
|                 // eslint-disable-next-line no-console
 | ||
|                 console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`);
 | ||
|             }
 | ||
|         }
 | ||
|         if (stats && stats.isFile()) {
 | ||
|             if (exports.IS_WINDOWS) {
 | ||
|                 // on Windows, test for valid extension
 | ||
|                 const upperExt = path.extname(filePath).toUpperCase();
 | ||
|                 if (extensions.some(validExt => validExt.toUpperCase() === upperExt)) {
 | ||
|                     return filePath;
 | ||
|                 }
 | ||
|             }
 | ||
|             else {
 | ||
|                 if (isUnixExecutable(stats)) {
 | ||
|                     return filePath;
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
|         // try each extension
 | ||
|         const originalFilePath = filePath;
 | ||
|         for (const extension of extensions) {
 | ||
|             filePath = originalFilePath + extension;
 | ||
|             stats = undefined;
 | ||
|             try {
 | ||
|                 stats = yield exports.stat(filePath);
 | ||
|             }
 | ||
|             catch (err) {
 | ||
|                 if (err.code !== 'ENOENT') {
 | ||
|                     // eslint-disable-next-line no-console
 | ||
|                     console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`);
 | ||
|                 }
 | ||
|             }
 | ||
|             if (stats && stats.isFile()) {
 | ||
|                 if (exports.IS_WINDOWS) {
 | ||
|                     // preserve the case of the actual file (since an extension was appended)
 | ||
|                     try {
 | ||
|                         const directory = path.dirname(filePath);
 | ||
|                         const upperName = path.basename(filePath).toUpperCase();
 | ||
|                         for (const actualName of yield exports.readdir(directory)) {
 | ||
|                             if (upperName === actualName.toUpperCase()) {
 | ||
|                                 filePath = path.join(directory, actualName);
 | ||
|                                 break;
 | ||
|                             }
 | ||
|                         }
 | ||
|                     }
 | ||
|                     catch (err) {
 | ||
|                         // eslint-disable-next-line no-console
 | ||
|                         console.log(`Unexpected error attempting to determine the actual case of the file '${filePath}': ${err}`);
 | ||
|                     }
 | ||
|                     return filePath;
 | ||
|                 }
 | ||
|                 else {
 | ||
|                     if (isUnixExecutable(stats)) {
 | ||
|                         return filePath;
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
|         return '';
 | ||
|     });
 | ||
| }
 | ||
| exports.tryGetExecutablePath = tryGetExecutablePath;
 | ||
| function normalizeSeparators(p) {
 | ||
|     p = p || '';
 | ||
|     if (exports.IS_WINDOWS) {
 | ||
|         // convert slashes on Windows
 | ||
|         p = p.replace(/\//g, '\\');
 | ||
|         // remove redundant slashes
 | ||
|         return p.replace(/\\\\+/g, '\\');
 | ||
|     }
 | ||
|     // remove redundant slashes
 | ||
|     return p.replace(/\/\/+/g, '/');
 | ||
| }
 | ||
| // on Mac/Linux, test the execute bit
 | ||
| //     R   W  X  R  W X R W X
 | ||
| //   256 128 64 32 16 8 4 2 1
 | ||
| function isUnixExecutable(stats) {
 | ||
|     return ((stats.mode & 1) > 0 ||
 | ||
|         ((stats.mode & 8) > 0 && stats.gid === process.getgid()) ||
 | ||
|         ((stats.mode & 64) > 0 && stats.uid === process.getuid()));
 | ||
| }
 | ||
| //# sourceMappingURL=io-util.js.map
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 681:
 | ||
| /***/ (function(__unusedmodule, exports, __webpack_require__) {
 | ||
| 
 | ||
| "use strict";
 | ||
| 
 | ||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
 | ||
|     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
 | ||
|     return new (P || (P = Promise))(function (resolve, reject) {
 | ||
|         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
 | ||
|         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
 | ||
|         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
 | ||
|         step((generator = generator.apply(thisArg, _arguments || [])).next());
 | ||
|     });
 | ||
| };
 | ||
| var __importStar = (this && this.__importStar) || function (mod) {
 | ||
|     if (mod && mod.__esModule) return mod;
 | ||
|     var result = {};
 | ||
|     if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
 | ||
|     result["default"] = mod;
 | ||
|     return result;
 | ||
| };
 | ||
| Object.defineProperty(exports, "__esModule", { value: true });
 | ||
| const core = __importStar(__webpack_require__(470));
 | ||
| const exec_1 = __webpack_require__(986);
 | ||
| const io = __importStar(__webpack_require__(1));
 | ||
| const fs = __importStar(__webpack_require__(747));
 | ||
| const path = __importStar(__webpack_require__(622));
 | ||
| const cacheHttpClient = __importStar(__webpack_require__(154));
 | ||
| const constants_1 = __webpack_require__(694);
 | ||
| const utils = __importStar(__webpack_require__(443));
 | ||
| function run() {
 | ||
|     return __awaiter(this, void 0, void 0, function* () {
 | ||
|         try {
 | ||
|             const state = utils.getCacheState();
 | ||
|             // Inputs are re-evaluted before the post action, so we want the original key used for restore
 | ||
|             const primaryKey = core.getState(constants_1.State.CacheKey);
 | ||
|             if (!primaryKey) {
 | ||
|                 core.warning(`Error retrieving key from state.`);
 | ||
|                 return;
 | ||
|             }
 | ||
|             if (utils.isExactKeyMatch(primaryKey, state)) {
 | ||
|                 core.info(`Cache hit occurred on the primary key ${primaryKey}, not saving cache.`);
 | ||
|                 return;
 | ||
|             }
 | ||
|             let cachePath = utils.resolvePath(core.getInput(constants_1.Inputs.Path, { required: true }));
 | ||
|             core.debug(`Cache Path: ${cachePath}`);
 | ||
|             let archivePath = path.join(yield utils.createTempDirectory(), "cache.tgz");
 | ||
|             core.debug(`Archive Path: ${archivePath}`);
 | ||
|             // http://man7.org/linux/man-pages/man1/tar.1.html
 | ||
|             // tar [-options] <name of the tar archive> [files or directories which to add into archive]
 | ||
|             const args = ["-cz"];
 | ||
|             const IS_WINDOWS = process.platform === "win32";
 | ||
|             if (IS_WINDOWS) {
 | ||
|                 args.push("--force-local");
 | ||
|                 archivePath = archivePath.replace(/\\/g, "/");
 | ||
|                 cachePath = cachePath.replace(/\\/g, "/");
 | ||
|             }
 | ||
|             args.push(...["-f", archivePath, "-C", cachePath, "."]);
 | ||
|             const tarPath = yield io.which("tar", true);
 | ||
|             core.debug(`Tar Path: ${tarPath}`);
 | ||
|             yield exec_1.exec(`"${tarPath}"`, args);
 | ||
|             const fileSizeLimit = 200 * 1024 * 1024; // 200MB
 | ||
|             const archiveFileSize = fs.statSync(archivePath).size;
 | ||
|             core.debug(`File Size: ${archiveFileSize}`);
 | ||
|             if (archiveFileSize > fileSizeLimit) {
 | ||
|                 core.warning(`Cache size of ${archiveFileSize} bytes is over the 200MB limit, not saving cache.`);
 | ||
|                 return;
 | ||
|             }
 | ||
|             const stream = fs.createReadStream(archivePath);
 | ||
|             yield cacheHttpClient.saveCache(stream, primaryKey);
 | ||
|         }
 | ||
|         catch (error) {
 | ||
|             core.warning(error.message);
 | ||
|         }
 | ||
|     });
 | ||
| }
 | ||
| run();
 | ||
| exports.default = run;
 | ||
| 
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 694:
 | ||
| /***/ (function(__unusedmodule, exports) {
 | ||
| 
 | ||
| "use strict";
 | ||
| 
 | ||
| Object.defineProperty(exports, "__esModule", { value: true });
 | ||
| var Inputs;
 | ||
| (function (Inputs) {
 | ||
|     Inputs.Key = "key";
 | ||
|     Inputs.Path = "path";
 | ||
|     Inputs.RestoreKeys = "restore-keys";
 | ||
| })(Inputs = exports.Inputs || (exports.Inputs = {}));
 | ||
| var Outputs;
 | ||
| (function (Outputs) {
 | ||
|     Outputs.CacheHit = "cache-hit";
 | ||
| })(Outputs = exports.Outputs || (exports.Outputs = {}));
 | ||
| var State;
 | ||
| (function (State) {
 | ||
|     State.CacheKey = "CACHE_KEY";
 | ||
|     State.CacheResult = "CACHE_RESULT";
 | ||
| })(State = exports.State || (exports.State = {}));
 | ||
| 
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 722:
 | ||
| /***/ (function(module) {
 | ||
| 
 | ||
| /**
 | ||
|  * Convert array of 16 byte values to UUID string format of the form:
 | ||
|  * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
 | ||
|  */
 | ||
| var byteToHex = [];
 | ||
| for (var i = 0; i < 256; ++i) {
 | ||
|   byteToHex[i] = (i + 0x100).toString(16).substr(1);
 | ||
| }
 | ||
| 
 | ||
| function bytesToUuid(buf, offset) {
 | ||
|   var i = offset || 0;
 | ||
|   var bth = byteToHex;
 | ||
|   // join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4
 | ||
|   return ([bth[buf[i++]], bth[buf[i++]], 
 | ||
| 	bth[buf[i++]], bth[buf[i++]], '-',
 | ||
| 	bth[buf[i++]], bth[buf[i++]], '-',
 | ||
| 	bth[buf[i++]], bth[buf[i++]], '-',
 | ||
| 	bth[buf[i++]], bth[buf[i++]], '-',
 | ||
| 	bth[buf[i++]], bth[buf[i++]],
 | ||
| 	bth[buf[i++]], bth[buf[i++]],
 | ||
| 	bth[buf[i++]], bth[buf[i++]]]).join('');
 | ||
| }
 | ||
| 
 | ||
| module.exports = bytesToUuid;
 | ||
| 
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 729:
 | ||
| /***/ (function(__unusedmodule, exports, __webpack_require__) {
 | ||
| 
 | ||
| "use strict";
 | ||
| 
 | ||
| // Copyright (c) Microsoft. All rights reserved.
 | ||
| // Licensed under the MIT license. See LICENSE file in the project root for full license information.
 | ||
| Object.defineProperty(exports, "__esModule", { value: true });
 | ||
| const url = __webpack_require__(835);
 | ||
| const path = __webpack_require__(622);
 | ||
| /**
 | ||
|  * creates an url from a request url and optional base url (http://server:8080)
 | ||
|  * @param {string} resource - a fully qualified url or relative path
 | ||
|  * @param {string} baseUrl - an optional baseUrl (http://server:8080)
 | ||
|  * @return {string} - resultant url
 | ||
|  */
 | ||
| function getUrl(resource, baseUrl) {
 | ||
|     const pathApi = path.posix || path;
 | ||
|     if (!baseUrl) {
 | ||
|         return resource;
 | ||
|     }
 | ||
|     else if (!resource) {
 | ||
|         return baseUrl;
 | ||
|     }
 | ||
|     else {
 | ||
|         const base = url.parse(baseUrl);
 | ||
|         const resultantUrl = url.parse(resource);
 | ||
|         // resource (specific per request) elements take priority
 | ||
|         resultantUrl.protocol = resultantUrl.protocol || base.protocol;
 | ||
|         resultantUrl.auth = resultantUrl.auth || base.auth;
 | ||
|         resultantUrl.host = resultantUrl.host || base.host;
 | ||
|         resultantUrl.pathname = pathApi.resolve(base.pathname, resultantUrl.pathname);
 | ||
|         if (!resultantUrl.pathname.endsWith('/') && resource.endsWith('/')) {
 | ||
|             resultantUrl.pathname += '/';
 | ||
|         }
 | ||
|         return url.format(resultantUrl);
 | ||
|     }
 | ||
| }
 | ||
| exports.getUrl = getUrl;
 | ||
| 
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 747:
 | ||
| /***/ (function(module) {
 | ||
| 
 | ||
| module.exports = require("fs");
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 826:
 | ||
| /***/ (function(module, __unusedexports, __webpack_require__) {
 | ||
| 
 | ||
| var rng = __webpack_require__(139);
 | ||
| var bytesToUuid = __webpack_require__(722);
 | ||
| 
 | ||
| function v4(options, buf, offset) {
 | ||
|   var i = buf && offset || 0;
 | ||
| 
 | ||
|   if (typeof(options) == 'string') {
 | ||
|     buf = options === 'binary' ? new Array(16) : null;
 | ||
|     options = null;
 | ||
|   }
 | ||
|   options = options || {};
 | ||
| 
 | ||
|   var rnds = options.random || (options.rng || rng)();
 | ||
| 
 | ||
|   // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
 | ||
|   rnds[6] = (rnds[6] & 0x0f) | 0x40;
 | ||
|   rnds[8] = (rnds[8] & 0x3f) | 0x80;
 | ||
| 
 | ||
|   // Copy bytes to buffer, if provided
 | ||
|   if (buf) {
 | ||
|     for (var ii = 0; ii < 16; ++ii) {
 | ||
|       buf[i + ii] = rnds[ii];
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   return buf || bytesToUuid(rnds);
 | ||
| }
 | ||
| 
 | ||
| module.exports = v4;
 | ||
| 
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 835:
 | ||
| /***/ (function(module) {
 | ||
| 
 | ||
| module.exports = require("url");
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 874:
 | ||
| /***/ (function(__unusedmodule, exports, __webpack_require__) {
 | ||
| 
 | ||
| "use strict";
 | ||
| 
 | ||
| // Copyright (c) Microsoft. All rights reserved.
 | ||
| // Licensed under the MIT license. See LICENSE file in the project root for full license information.
 | ||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
 | ||
|     return new (P || (P = Promise))(function (resolve, reject) {
 | ||
|         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
 | ||
|         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
 | ||
|         function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
 | ||
|         step((generator = generator.apply(thisArg, _arguments || [])).next());
 | ||
|     });
 | ||
| };
 | ||
| Object.defineProperty(exports, "__esModule", { value: true });
 | ||
| const url = __webpack_require__(835);
 | ||
| const http = __webpack_require__(605);
 | ||
| const https = __webpack_require__(211);
 | ||
| let fs;
 | ||
| let tunnel;
 | ||
| var HttpCodes;
 | ||
| (function (HttpCodes) {
 | ||
|     HttpCodes[HttpCodes["OK"] = 200] = "OK";
 | ||
|     HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices";
 | ||
|     HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently";
 | ||
|     HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved";
 | ||
|     HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther";
 | ||
|     HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified";
 | ||
|     HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy";
 | ||
|     HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy";
 | ||
|     HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect";
 | ||
|     HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect";
 | ||
|     HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest";
 | ||
|     HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized";
 | ||
|     HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired";
 | ||
|     HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden";
 | ||
|     HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound";
 | ||
|     HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed";
 | ||
|     HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable";
 | ||
|     HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired";
 | ||
|     HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout";
 | ||
|     HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict";
 | ||
|     HttpCodes[HttpCodes["Gone"] = 410] = "Gone";
 | ||
|     HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError";
 | ||
|     HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented";
 | ||
|     HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway";
 | ||
|     HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable";
 | ||
|     HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout";
 | ||
| })(HttpCodes = exports.HttpCodes || (exports.HttpCodes = {}));
 | ||
| const HttpRedirectCodes = [HttpCodes.MovedPermanently, HttpCodes.ResourceMoved, HttpCodes.SeeOther, HttpCodes.TemporaryRedirect, HttpCodes.PermanentRedirect];
 | ||
| const HttpResponseRetryCodes = [HttpCodes.BadGateway, HttpCodes.ServiceUnavailable, HttpCodes.GatewayTimeout];
 | ||
| const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD'];
 | ||
| const ExponentialBackoffCeiling = 10;
 | ||
| const ExponentialBackoffTimeSlice = 5;
 | ||
| class HttpClientResponse {
 | ||
|     constructor(message) {
 | ||
|         this.message = message;
 | ||
|     }
 | ||
|     readBody() {
 | ||
|         return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
 | ||
|             let output = '';
 | ||
|             this.message.on('data', (chunk) => {
 | ||
|                 output += chunk;
 | ||
|             });
 | ||
|             this.message.on('end', () => {
 | ||
|                 resolve(output);
 | ||
|             });
 | ||
|         }));
 | ||
|     }
 | ||
| }
 | ||
| exports.HttpClientResponse = HttpClientResponse;
 | ||
| function isHttps(requestUrl) {
 | ||
|     let parsedUrl = url.parse(requestUrl);
 | ||
|     return parsedUrl.protocol === 'https:';
 | ||
| }
 | ||
| exports.isHttps = isHttps;
 | ||
| var EnvironmentVariables;
 | ||
| (function (EnvironmentVariables) {
 | ||
|     EnvironmentVariables["HTTP_PROXY"] = "HTTP_PROXY";
 | ||
|     EnvironmentVariables["HTTPS_PROXY"] = "HTTPS_PROXY";
 | ||
| })(EnvironmentVariables || (EnvironmentVariables = {}));
 | ||
| class HttpClient {
 | ||
|     constructor(userAgent, handlers, requestOptions) {
 | ||
|         this._ignoreSslError = false;
 | ||
|         this._allowRedirects = true;
 | ||
|         this._maxRedirects = 50;
 | ||
|         this._allowRetries = false;
 | ||
|         this._maxRetries = 1;
 | ||
|         this._keepAlive = false;
 | ||
|         this._disposed = false;
 | ||
|         this.userAgent = userAgent;
 | ||
|         this.handlers = handlers || [];
 | ||
|         this.requestOptions = requestOptions;
 | ||
|         if (requestOptions) {
 | ||
|             if (requestOptions.ignoreSslError != null) {
 | ||
|                 this._ignoreSslError = requestOptions.ignoreSslError;
 | ||
|             }
 | ||
|             this._socketTimeout = requestOptions.socketTimeout;
 | ||
|             this._httpProxy = requestOptions.proxy;
 | ||
|             if (requestOptions.proxy && requestOptions.proxy.proxyBypassHosts) {
 | ||
|                 this._httpProxyBypassHosts = [];
 | ||
|                 requestOptions.proxy.proxyBypassHosts.forEach(bypass => {
 | ||
|                     this._httpProxyBypassHosts.push(new RegExp(bypass, 'i'));
 | ||
|                 });
 | ||
|             }
 | ||
|             this._certConfig = requestOptions.cert;
 | ||
|             if (this._certConfig) {
 | ||
|                 // If using cert, need fs
 | ||
|                 fs = __webpack_require__(747);
 | ||
|                 // cache the cert content into memory, so we don't have to read it from disk every time 
 | ||
|                 if (this._certConfig.caFile && fs.existsSync(this._certConfig.caFile)) {
 | ||
|                     this._ca = fs.readFileSync(this._certConfig.caFile, 'utf8');
 | ||
|                 }
 | ||
|                 if (this._certConfig.certFile && fs.existsSync(this._certConfig.certFile)) {
 | ||
|                     this._cert = fs.readFileSync(this._certConfig.certFile, 'utf8');
 | ||
|                 }
 | ||
|                 if (this._certConfig.keyFile && fs.existsSync(this._certConfig.keyFile)) {
 | ||
|                     this._key = fs.readFileSync(this._certConfig.keyFile, 'utf8');
 | ||
|                 }
 | ||
|             }
 | ||
|             if (requestOptions.allowRedirects != null) {
 | ||
|                 this._allowRedirects = requestOptions.allowRedirects;
 | ||
|             }
 | ||
|             if (requestOptions.maxRedirects != null) {
 | ||
|                 this._maxRedirects = Math.max(requestOptions.maxRedirects, 0);
 | ||
|             }
 | ||
|             if (requestOptions.keepAlive != null) {
 | ||
|                 this._keepAlive = requestOptions.keepAlive;
 | ||
|             }
 | ||
|             if (requestOptions.allowRetries != null) {
 | ||
|                 this._allowRetries = requestOptions.allowRetries;
 | ||
|             }
 | ||
|             if (requestOptions.maxRetries != null) {
 | ||
|                 this._maxRetries = requestOptions.maxRetries;
 | ||
|             }
 | ||
|         }
 | ||
|     }
 | ||
|     options(requestUrl, additionalHeaders) {
 | ||
|         return this.request('OPTIONS', requestUrl, null, additionalHeaders || {});
 | ||
|     }
 | ||
|     get(requestUrl, additionalHeaders) {
 | ||
|         return this.request('GET', requestUrl, null, additionalHeaders || {});
 | ||
|     }
 | ||
|     del(requestUrl, additionalHeaders) {
 | ||
|         return this.request('DELETE', requestUrl, null, additionalHeaders || {});
 | ||
|     }
 | ||
|     post(requestUrl, data, additionalHeaders) {
 | ||
|         return this.request('POST', requestUrl, data, additionalHeaders || {});
 | ||
|     }
 | ||
|     patch(requestUrl, data, additionalHeaders) {
 | ||
|         return this.request('PATCH', requestUrl, data, additionalHeaders || {});
 | ||
|     }
 | ||
|     put(requestUrl, data, additionalHeaders) {
 | ||
|         return this.request('PUT', requestUrl, data, additionalHeaders || {});
 | ||
|     }
 | ||
|     head(requestUrl, additionalHeaders) {
 | ||
|         return this.request('HEAD', requestUrl, null, additionalHeaders || {});
 | ||
|     }
 | ||
|     sendStream(verb, requestUrl, stream, additionalHeaders) {
 | ||
|         return this.request(verb, requestUrl, stream, additionalHeaders);
 | ||
|     }
 | ||
|     /**
 | ||
|      * Makes a raw http request.
 | ||
|      * All other methods such as get, post, patch, and request ultimately call this.
 | ||
|      * Prefer get, del, post and patch
 | ||
|      */
 | ||
|     request(verb, requestUrl, data, headers) {
 | ||
|         return __awaiter(this, void 0, void 0, function* () {
 | ||
|             if (this._disposed) {
 | ||
|                 throw new Error("Client has already been disposed.");
 | ||
|             }
 | ||
|             let info = this._prepareRequest(verb, requestUrl, headers);
 | ||
|             // Only perform retries on reads since writes may not be idempotent.
 | ||
|             let maxTries = (this._allowRetries && RetryableHttpVerbs.indexOf(verb) != -1) ? this._maxRetries + 1 : 1;
 | ||
|             let numTries = 0;
 | ||
|             let response;
 | ||
|             while (numTries < maxTries) {
 | ||
|                 response = yield this.requestRaw(info, data);
 | ||
|                 // Check if it's an authentication challenge
 | ||
|                 if (response && response.message && response.message.statusCode === HttpCodes.Unauthorized) {
 | ||
|                     let authenticationHandler;
 | ||
|                     for (let i = 0; i < this.handlers.length; i++) {
 | ||
|                         if (this.handlers[i].canHandleAuthentication(response)) {
 | ||
|                             authenticationHandler = this.handlers[i];
 | ||
|                             break;
 | ||
|                         }
 | ||
|                     }
 | ||
|                     if (authenticationHandler) {
 | ||
|                         return authenticationHandler.handleAuthentication(this, info, data);
 | ||
|                     }
 | ||
|                     else {
 | ||
|                         // We have received an unauthorized response but have no handlers to handle it.
 | ||
|                         // Let the response return to the caller.
 | ||
|                         return response;
 | ||
|                     }
 | ||
|                 }
 | ||
|                 let redirectsRemaining = this._maxRedirects;
 | ||
|                 while (HttpRedirectCodes.indexOf(response.message.statusCode) != -1
 | ||
|                     && this._allowRedirects
 | ||
|                     && redirectsRemaining > 0) {
 | ||
|                     const redirectUrl = response.message.headers["location"];
 | ||
|                     if (!redirectUrl) {
 | ||
|                         // if there's no location to redirect to, we won't
 | ||
|                         break;
 | ||
|                     }
 | ||
|                     // we need to finish reading the response before reassigning response
 | ||
|                     // which will leak the open socket.
 | ||
|                     yield response.readBody();
 | ||
|                     // let's make the request with the new redirectUrl
 | ||
|                     info = this._prepareRequest(verb, redirectUrl, headers);
 | ||
|                     response = yield this.requestRaw(info, data);
 | ||
|                     redirectsRemaining--;
 | ||
|                 }
 | ||
|                 if (HttpResponseRetryCodes.indexOf(response.message.statusCode) == -1) {
 | ||
|                     // If not a retry code, return immediately instead of retrying
 | ||
|                     return response;
 | ||
|                 }
 | ||
|                 numTries += 1;
 | ||
|                 if (numTries < maxTries) {
 | ||
|                     yield response.readBody();
 | ||
|                     yield this._performExponentialBackoff(numTries);
 | ||
|                 }
 | ||
|             }
 | ||
|             return response;
 | ||
|         });
 | ||
|     }
 | ||
|     /**
 | ||
|      * Needs to be called if keepAlive is set to true in request options.
 | ||
|      */
 | ||
|     dispose() {
 | ||
|         if (this._agent) {
 | ||
|             this._agent.destroy();
 | ||
|         }
 | ||
|         this._disposed = true;
 | ||
|     }
 | ||
|     /**
 | ||
|      * Raw request.
 | ||
|      * @param info
 | ||
|      * @param data
 | ||
|      */
 | ||
|     requestRaw(info, data) {
 | ||
|         return new Promise((resolve, reject) => {
 | ||
|             let callbackForResult = function (err, res) {
 | ||
|                 if (err) {
 | ||
|                     reject(err);
 | ||
|                 }
 | ||
|                 resolve(res);
 | ||
|             };
 | ||
|             this.requestRawWithCallback(info, data, callbackForResult);
 | ||
|         });
 | ||
|     }
 | ||
|     /**
 | ||
|      * Raw request with callback.
 | ||
|      * @param info
 | ||
|      * @param data
 | ||
|      * @param onResult
 | ||
|      */
 | ||
|     requestRawWithCallback(info, data, onResult) {
 | ||
|         let socket;
 | ||
|         let isDataString = typeof (data) === 'string';
 | ||
|         if (typeof (data) === 'string') {
 | ||
|             info.options.headers["Content-Length"] = Buffer.byteLength(data, 'utf8');
 | ||
|         }
 | ||
|         let callbackCalled = false;
 | ||
|         let handleResult = (err, res) => {
 | ||
|             if (!callbackCalled) {
 | ||
|                 callbackCalled = true;
 | ||
|                 onResult(err, res);
 | ||
|             }
 | ||
|         };
 | ||
|         let req = info.httpModule.request(info.options, (msg) => {
 | ||
|             let res = new HttpClientResponse(msg);
 | ||
|             handleResult(null, res);
 | ||
|         });
 | ||
|         req.on('socket', (sock) => {
 | ||
|             socket = sock;
 | ||
|         });
 | ||
|         // If we ever get disconnected, we want the socket to timeout eventually
 | ||
|         req.setTimeout(this._socketTimeout || 3 * 60000, () => {
 | ||
|             if (socket) {
 | ||
|                 socket.end();
 | ||
|             }
 | ||
|             handleResult(new Error('Request timeout: ' + info.options.path), null);
 | ||
|         });
 | ||
|         req.on('error', function (err) {
 | ||
|             // err has statusCode property
 | ||
|             // res should have headers
 | ||
|             handleResult(err, null);
 | ||
|         });
 | ||
|         if (data && typeof (data) === 'string') {
 | ||
|             req.write(data, 'utf8');
 | ||
|         }
 | ||
|         if (data && typeof (data) !== 'string') {
 | ||
|             data.on('close', function () {
 | ||
|                 req.end();
 | ||
|             });
 | ||
|             data.pipe(req);
 | ||
|         }
 | ||
|         else {
 | ||
|             req.end();
 | ||
|         }
 | ||
|     }
 | ||
|     _prepareRequest(method, requestUrl, headers) {
 | ||
|         const info = {};
 | ||
|         info.parsedUrl = url.parse(requestUrl);
 | ||
|         const usingSsl = info.parsedUrl.protocol === 'https:';
 | ||
|         info.httpModule = usingSsl ? https : http;
 | ||
|         const defaultPort = usingSsl ? 443 : 80;
 | ||
|         info.options = {};
 | ||
|         info.options.host = info.parsedUrl.hostname;
 | ||
|         info.options.port = info.parsedUrl.port ? parseInt(info.parsedUrl.port) : defaultPort;
 | ||
|         info.options.path = (info.parsedUrl.pathname || '') + (info.parsedUrl.search || '');
 | ||
|         info.options.method = method;
 | ||
|         info.options.headers = this._mergeHeaders(headers);
 | ||
|         info.options.headers["user-agent"] = this.userAgent;
 | ||
|         info.options.agent = this._getAgent(requestUrl);
 | ||
|         // gives handlers an opportunity to participate
 | ||
|         if (this.handlers && !this._isPresigned(requestUrl)) {
 | ||
|             this.handlers.forEach((handler) => {
 | ||
|                 handler.prepareRequest(info.options);
 | ||
|             });
 | ||
|         }
 | ||
|         return info;
 | ||
|     }
 | ||
|     _isPresigned(requestUrl) {
 | ||
|         if (this.requestOptions && this.requestOptions.presignedUrlPatterns) {
 | ||
|             const patterns = this.requestOptions.presignedUrlPatterns;
 | ||
|             for (let i = 0; i < patterns.length; i++) {
 | ||
|                 if (requestUrl.match(patterns[i])) {
 | ||
|                     return true;
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
|         return false;
 | ||
|     }
 | ||
|     _mergeHeaders(headers) {
 | ||
|         const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => (c[k.toLowerCase()] = obj[k], c), {});
 | ||
|         if (this.requestOptions && this.requestOptions.headers) {
 | ||
|             return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers));
 | ||
|         }
 | ||
|         return lowercaseKeys(headers || {});
 | ||
|     }
 | ||
|     _getAgent(requestUrl) {
 | ||
|         let agent;
 | ||
|         let proxy = this._getProxy(requestUrl);
 | ||
|         let useProxy = proxy.proxyUrl && proxy.proxyUrl.hostname && !this._isBypassProxy(requestUrl);
 | ||
|         if (this._keepAlive && useProxy) {
 | ||
|             agent = this._proxyAgent;
 | ||
|         }
 | ||
|         if (this._keepAlive && !useProxy) {
 | ||
|             agent = this._agent;
 | ||
|         }
 | ||
|         // if agent is already assigned use that agent.
 | ||
|         if (!!agent) {
 | ||
|             return agent;
 | ||
|         }
 | ||
|         let parsedUrl = url.parse(requestUrl);
 | ||
|         const usingSsl = parsedUrl.protocol === 'https:';
 | ||
|         let maxSockets = 100;
 | ||
|         if (!!this.requestOptions) {
 | ||
|             maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets;
 | ||
|         }
 | ||
|         if (useProxy) {
 | ||
|             // If using proxy, need tunnel
 | ||
|             if (!tunnel) {
 | ||
|                 tunnel = __webpack_require__(413);
 | ||
|             }
 | ||
|             const agentOptions = {
 | ||
|                 maxSockets: maxSockets,
 | ||
|                 keepAlive: this._keepAlive,
 | ||
|                 proxy: {
 | ||
|                     proxyAuth: proxy.proxyAuth,
 | ||
|                     host: proxy.proxyUrl.hostname,
 | ||
|                     port: proxy.proxyUrl.port
 | ||
|                 },
 | ||
|             };
 | ||
|             let tunnelAgent;
 | ||
|             const overHttps = proxy.proxyUrl.protocol === 'https:';
 | ||
|             if (usingSsl) {
 | ||
|                 tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp;
 | ||
|             }
 | ||
|             else {
 | ||
|                 tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp;
 | ||
|             }
 | ||
|             agent = tunnelAgent(agentOptions);
 | ||
|             this._proxyAgent = agent;
 | ||
|         }
 | ||
|         // if reusing agent across request and tunneling agent isn't assigned create a new agent
 | ||
|         if (this._keepAlive && !agent) {
 | ||
|             const options = { keepAlive: this._keepAlive, maxSockets: maxSockets };
 | ||
|             agent = usingSsl ? new https.Agent(options) : new http.Agent(options);
 | ||
|             this._agent = agent;
 | ||
|         }
 | ||
|         // if not using private agent and tunnel agent isn't setup then use global agent
 | ||
|         if (!agent) {
 | ||
|             agent = usingSsl ? https.globalAgent : http.globalAgent;
 | ||
|         }
 | ||
|         if (usingSsl && this._ignoreSslError) {
 | ||
|             // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process
 | ||
|             // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options
 | ||
|             // we have to cast it to any and change it directly
 | ||
|             agent.options = Object.assign(agent.options || {}, { rejectUnauthorized: false });
 | ||
|         }
 | ||
|         if (usingSsl && this._certConfig) {
 | ||
|             agent.options = Object.assign(agent.options || {}, { ca: this._ca, cert: this._cert, key: this._key, passphrase: this._certConfig.passphrase });
 | ||
|         }
 | ||
|         return agent;
 | ||
|     }
 | ||
|     _getProxy(requestUrl) {
 | ||
|         const parsedUrl = url.parse(requestUrl);
 | ||
|         let usingSsl = parsedUrl.protocol === 'https:';
 | ||
|         let proxyConfig = this._httpProxy;
 | ||
|         // fallback to http_proxy and https_proxy env
 | ||
|         let https_proxy = process.env[EnvironmentVariables.HTTPS_PROXY];
 | ||
|         let http_proxy = process.env[EnvironmentVariables.HTTP_PROXY];
 | ||
|         if (!proxyConfig) {
 | ||
|             if (https_proxy && usingSsl) {
 | ||
|                 proxyConfig = {
 | ||
|                     proxyUrl: https_proxy
 | ||
|                 };
 | ||
|             }
 | ||
|             else if (http_proxy) {
 | ||
|                 proxyConfig = {
 | ||
|                     proxyUrl: http_proxy
 | ||
|                 };
 | ||
|             }
 | ||
|         }
 | ||
|         let proxyUrl;
 | ||
|         let proxyAuth;
 | ||
|         if (proxyConfig) {
 | ||
|             if (proxyConfig.proxyUrl.length > 0) {
 | ||
|                 proxyUrl = url.parse(proxyConfig.proxyUrl);
 | ||
|             }
 | ||
|             if (proxyConfig.proxyUsername || proxyConfig.proxyPassword) {
 | ||
|                 proxyAuth = proxyConfig.proxyUsername + ":" + proxyConfig.proxyPassword;
 | ||
|             }
 | ||
|         }
 | ||
|         return { proxyUrl: proxyUrl, proxyAuth: proxyAuth };
 | ||
|     }
 | ||
|     _isBypassProxy(requestUrl) {
 | ||
|         if (!this._httpProxyBypassHosts) {
 | ||
|             return false;
 | ||
|         }
 | ||
|         let bypass = false;
 | ||
|         this._httpProxyBypassHosts.forEach(bypassHost => {
 | ||
|             if (bypassHost.test(requestUrl)) {
 | ||
|                 bypass = true;
 | ||
|             }
 | ||
|         });
 | ||
|         return bypass;
 | ||
|     }
 | ||
|     _performExponentialBackoff(retryNumber) {
 | ||
|         retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber);
 | ||
|         const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber);
 | ||
|         return new Promise(resolve => setTimeout(() => resolve(), ms));
 | ||
|     }
 | ||
| }
 | ||
| exports.HttpClient = HttpClient;
 | ||
| 
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 891:
 | ||
| /***/ (function(module, exports) {
 | ||
| 
 | ||
| //     Underscore.js 1.8.3
 | ||
| //     http://underscorejs.org
 | ||
| //     (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
 | ||
| //     Underscore may be freely distributed under the MIT license.
 | ||
| 
 | ||
| (function() {
 | ||
| 
 | ||
|   // Baseline setup
 | ||
|   // --------------
 | ||
| 
 | ||
|   // Establish the root object, `window` in the browser, or `exports` on the server.
 | ||
|   var root = this;
 | ||
| 
 | ||
|   // Save the previous value of the `_` variable.
 | ||
|   var previousUnderscore = root._;
 | ||
| 
 | ||
|   // Save bytes in the minified (but not gzipped) version:
 | ||
|   var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
 | ||
| 
 | ||
|   // Create quick reference variables for speed access to core prototypes.
 | ||
|   var
 | ||
|     push             = ArrayProto.push,
 | ||
|     slice            = ArrayProto.slice,
 | ||
|     toString         = ObjProto.toString,
 | ||
|     hasOwnProperty   = ObjProto.hasOwnProperty;
 | ||
| 
 | ||
|   // All **ECMAScript 5** native function implementations that we hope to use
 | ||
|   // are declared here.
 | ||
|   var
 | ||
|     nativeIsArray      = Array.isArray,
 | ||
|     nativeKeys         = Object.keys,
 | ||
|     nativeBind         = FuncProto.bind,
 | ||
|     nativeCreate       = Object.create;
 | ||
| 
 | ||
|   // Naked function reference for surrogate-prototype-swapping.
 | ||
|   var Ctor = function(){};
 | ||
| 
 | ||
|   // Create a safe reference to the Underscore object for use below.
 | ||
|   var _ = function(obj) {
 | ||
|     if (obj instanceof _) return obj;
 | ||
|     if (!(this instanceof _)) return new _(obj);
 | ||
|     this._wrapped = obj;
 | ||
|   };
 | ||
| 
 | ||
|   // Export the Underscore object for **Node.js**, with
 | ||
|   // backwards-compatibility for the old `require()` API. If we're in
 | ||
|   // the browser, add `_` as a global object.
 | ||
|   if (true) {
 | ||
|     if ( true && module.exports) {
 | ||
|       exports = module.exports = _;
 | ||
|     }
 | ||
|     exports._ = _;
 | ||
|   } else {}
 | ||
| 
 | ||
|   // Current version.
 | ||
|   _.VERSION = '1.8.3';
 | ||
| 
 | ||
|   // Internal function that returns an efficient (for current engines) version
 | ||
|   // of the passed-in callback, to be repeatedly applied in other Underscore
 | ||
|   // functions.
 | ||
|   var optimizeCb = function(func, context, argCount) {
 | ||
|     if (context === void 0) return func;
 | ||
|     switch (argCount == null ? 3 : argCount) {
 | ||
|       case 1: return function(value) {
 | ||
|         return func.call(context, value);
 | ||
|       };
 | ||
|       case 2: return function(value, other) {
 | ||
|         return func.call(context, value, other);
 | ||
|       };
 | ||
|       case 3: return function(value, index, collection) {
 | ||
|         return func.call(context, value, index, collection);
 | ||
|       };
 | ||
|       case 4: return function(accumulator, value, index, collection) {
 | ||
|         return func.call(context, accumulator, value, index, collection);
 | ||
|       };
 | ||
|     }
 | ||
|     return function() {
 | ||
|       return func.apply(context, arguments);
 | ||
|     };
 | ||
|   };
 | ||
| 
 | ||
|   // A mostly-internal function to generate callbacks that can be applied
 | ||
|   // to each element in a collection, returning the desired result — either
 | ||
|   // identity, an arbitrary callback, a property matcher, or a property accessor.
 | ||
|   var cb = function(value, context, argCount) {
 | ||
|     if (value == null) return _.identity;
 | ||
|     if (_.isFunction(value)) return optimizeCb(value, context, argCount);
 | ||
|     if (_.isObject(value)) return _.matcher(value);
 | ||
|     return _.property(value);
 | ||
|   };
 | ||
|   _.iteratee = function(value, context) {
 | ||
|     return cb(value, context, Infinity);
 | ||
|   };
 | ||
| 
 | ||
|   // An internal function for creating assigner functions.
 | ||
|   var createAssigner = function(keysFunc, undefinedOnly) {
 | ||
|     return function(obj) {
 | ||
|       var length = arguments.length;
 | ||
|       if (length < 2 || obj == null) return obj;
 | ||
|       for (var index = 1; index < length; index++) {
 | ||
|         var source = arguments[index],
 | ||
|             keys = keysFunc(source),
 | ||
|             l = keys.length;
 | ||
|         for (var i = 0; i < l; i++) {
 | ||
|           var key = keys[i];
 | ||
|           if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];
 | ||
|         }
 | ||
|       }
 | ||
|       return obj;
 | ||
|     };
 | ||
|   };
 | ||
| 
 | ||
|   // An internal function for creating a new object that inherits from another.
 | ||
|   var baseCreate = function(prototype) {
 | ||
|     if (!_.isObject(prototype)) return {};
 | ||
|     if (nativeCreate) return nativeCreate(prototype);
 | ||
|     Ctor.prototype = prototype;
 | ||
|     var result = new Ctor;
 | ||
|     Ctor.prototype = null;
 | ||
|     return result;
 | ||
|   };
 | ||
| 
 | ||
|   var property = function(key) {
 | ||
|     return function(obj) {
 | ||
|       return obj == null ? void 0 : obj[key];
 | ||
|     };
 | ||
|   };
 | ||
| 
 | ||
|   // Helper for collection methods to determine whether a collection
 | ||
|   // should be iterated as an array or as an object
 | ||
|   // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
 | ||
|   // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
 | ||
|   var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
 | ||
|   var getLength = property('length');
 | ||
|   var isArrayLike = function(collection) {
 | ||
|     var length = getLength(collection);
 | ||
|     return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;
 | ||
|   };
 | ||
| 
 | ||
|   // Collection Functions
 | ||
|   // --------------------
 | ||
| 
 | ||
|   // The cornerstone, an `each` implementation, aka `forEach`.
 | ||
|   // Handles raw objects in addition to array-likes. Treats all
 | ||
|   // sparse array-likes as if they were dense.
 | ||
|   _.each = _.forEach = function(obj, iteratee, context) {
 | ||
|     iteratee = optimizeCb(iteratee, context);
 | ||
|     var i, length;
 | ||
|     if (isArrayLike(obj)) {
 | ||
|       for (i = 0, length = obj.length; i < length; i++) {
 | ||
|         iteratee(obj[i], i, obj);
 | ||
|       }
 | ||
|     } else {
 | ||
|       var keys = _.keys(obj);
 | ||
|       for (i = 0, length = keys.length; i < length; i++) {
 | ||
|         iteratee(obj[keys[i]], keys[i], obj);
 | ||
|       }
 | ||
|     }
 | ||
|     return obj;
 | ||
|   };
 | ||
| 
 | ||
|   // Return the results of applying the iteratee to each element.
 | ||
|   _.map = _.collect = function(obj, iteratee, context) {
 | ||
|     iteratee = cb(iteratee, context);
 | ||
|     var keys = !isArrayLike(obj) && _.keys(obj),
 | ||
|         length = (keys || obj).length,
 | ||
|         results = Array(length);
 | ||
|     for (var index = 0; index < length; index++) {
 | ||
|       var currentKey = keys ? keys[index] : index;
 | ||
|       results[index] = iteratee(obj[currentKey], currentKey, obj);
 | ||
|     }
 | ||
|     return results;
 | ||
|   };
 | ||
| 
 | ||
|   // Create a reducing function iterating left or right.
 | ||
|   function createReduce(dir) {
 | ||
|     // Optimized iterator function as using arguments.length
 | ||
|     // in the main function will deoptimize the, see #1991.
 | ||
|     function iterator(obj, iteratee, memo, keys, index, length) {
 | ||
|       for (; index >= 0 && index < length; index += dir) {
 | ||
|         var currentKey = keys ? keys[index] : index;
 | ||
|         memo = iteratee(memo, obj[currentKey], currentKey, obj);
 | ||
|       }
 | ||
|       return memo;
 | ||
|     }
 | ||
| 
 | ||
|     return function(obj, iteratee, memo, context) {
 | ||
|       iteratee = optimizeCb(iteratee, context, 4);
 | ||
|       var keys = !isArrayLike(obj) && _.keys(obj),
 | ||
|           length = (keys || obj).length,
 | ||
|           index = dir > 0 ? 0 : length - 1;
 | ||
|       // Determine the initial value if none is provided.
 | ||
|       if (arguments.length < 3) {
 | ||
|         memo = obj[keys ? keys[index] : index];
 | ||
|         index += dir;
 | ||
|       }
 | ||
|       return iterator(obj, iteratee, memo, keys, index, length);
 | ||
|     };
 | ||
|   }
 | ||
| 
 | ||
|   // **Reduce** builds up a single result from a list of values, aka `inject`,
 | ||
|   // or `foldl`.
 | ||
|   _.reduce = _.foldl = _.inject = createReduce(1);
 | ||
| 
 | ||
|   // The right-associative version of reduce, also known as `foldr`.
 | ||
|   _.reduceRight = _.foldr = createReduce(-1);
 | ||
| 
 | ||
|   // Return the first value which passes a truth test. Aliased as `detect`.
 | ||
|   _.find = _.detect = function(obj, predicate, context) {
 | ||
|     var key;
 | ||
|     if (isArrayLike(obj)) {
 | ||
|       key = _.findIndex(obj, predicate, context);
 | ||
|     } else {
 | ||
|       key = _.findKey(obj, predicate, context);
 | ||
|     }
 | ||
|     if (key !== void 0 && key !== -1) return obj[key];
 | ||
|   };
 | ||
| 
 | ||
|   // Return all the elements that pass a truth test.
 | ||
|   // Aliased as `select`.
 | ||
|   _.filter = _.select = function(obj, predicate, context) {
 | ||
|     var results = [];
 | ||
|     predicate = cb(predicate, context);
 | ||
|     _.each(obj, function(value, index, list) {
 | ||
|       if (predicate(value, index, list)) results.push(value);
 | ||
|     });
 | ||
|     return results;
 | ||
|   };
 | ||
| 
 | ||
|   // Return all the elements for which a truth test fails.
 | ||
|   _.reject = function(obj, predicate, context) {
 | ||
|     return _.filter(obj, _.negate(cb(predicate)), context);
 | ||
|   };
 | ||
| 
 | ||
|   // Determine whether all of the elements match a truth test.
 | ||
|   // Aliased as `all`.
 | ||
|   _.every = _.all = function(obj, predicate, context) {
 | ||
|     predicate = cb(predicate, context);
 | ||
|     var keys = !isArrayLike(obj) && _.keys(obj),
 | ||
|         length = (keys || obj).length;
 | ||
|     for (var index = 0; index < length; index++) {
 | ||
|       var currentKey = keys ? keys[index] : index;
 | ||
|       if (!predicate(obj[currentKey], currentKey, obj)) return false;
 | ||
|     }
 | ||
|     return true;
 | ||
|   };
 | ||
| 
 | ||
|   // Determine if at least one element in the object matches a truth test.
 | ||
|   // Aliased as `any`.
 | ||
|   _.some = _.any = function(obj, predicate, context) {
 | ||
|     predicate = cb(predicate, context);
 | ||
|     var keys = !isArrayLike(obj) && _.keys(obj),
 | ||
|         length = (keys || obj).length;
 | ||
|     for (var index = 0; index < length; index++) {
 | ||
|       var currentKey = keys ? keys[index] : index;
 | ||
|       if (predicate(obj[currentKey], currentKey, obj)) return true;
 | ||
|     }
 | ||
|     return false;
 | ||
|   };
 | ||
| 
 | ||
|   // Determine if the array or object contains a given item (using `===`).
 | ||
|   // Aliased as `includes` and `include`.
 | ||
|   _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {
 | ||
|     if (!isArrayLike(obj)) obj = _.values(obj);
 | ||
|     if (typeof fromIndex != 'number' || guard) fromIndex = 0;
 | ||
|     return _.indexOf(obj, item, fromIndex) >= 0;
 | ||
|   };
 | ||
| 
 | ||
|   // Invoke a method (with arguments) on every item in a collection.
 | ||
|   _.invoke = function(obj, method) {
 | ||
|     var args = slice.call(arguments, 2);
 | ||
|     var isFunc = _.isFunction(method);
 | ||
|     return _.map(obj, function(value) {
 | ||
|       var func = isFunc ? method : value[method];
 | ||
|       return func == null ? func : func.apply(value, args);
 | ||
|     });
 | ||
|   };
 | ||
| 
 | ||
|   // Convenience version of a common use case of `map`: fetching a property.
 | ||
|   _.pluck = function(obj, key) {
 | ||
|     return _.map(obj, _.property(key));
 | ||
|   };
 | ||
| 
 | ||
|   // Convenience version of a common use case of `filter`: selecting only objects
 | ||
|   // containing specific `key:value` pairs.
 | ||
|   _.where = function(obj, attrs) {
 | ||
|     return _.filter(obj, _.matcher(attrs));
 | ||
|   };
 | ||
| 
 | ||
|   // Convenience version of a common use case of `find`: getting the first object
 | ||
|   // containing specific `key:value` pairs.
 | ||
|   _.findWhere = function(obj, attrs) {
 | ||
|     return _.find(obj, _.matcher(attrs));
 | ||
|   };
 | ||
| 
 | ||
|   // Return the maximum element (or element-based computation).
 | ||
|   _.max = function(obj, iteratee, context) {
 | ||
|     var result = -Infinity, lastComputed = -Infinity,
 | ||
|         value, computed;
 | ||
|     if (iteratee == null && obj != null) {
 | ||
|       obj = isArrayLike(obj) ? obj : _.values(obj);
 | ||
|       for (var i = 0, length = obj.length; i < length; i++) {
 | ||
|         value = obj[i];
 | ||
|         if (value > result) {
 | ||
|           result = value;
 | ||
|         }
 | ||
|       }
 | ||
|     } else {
 | ||
|       iteratee = cb(iteratee, context);
 | ||
|       _.each(obj, function(value, index, list) {
 | ||
|         computed = iteratee(value, index, list);
 | ||
|         if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
 | ||
|           result = value;
 | ||
|           lastComputed = computed;
 | ||
|         }
 | ||
|       });
 | ||
|     }
 | ||
|     return result;
 | ||
|   };
 | ||
| 
 | ||
|   // Return the minimum element (or element-based computation).
 | ||
|   _.min = function(obj, iteratee, context) {
 | ||
|     var result = Infinity, lastComputed = Infinity,
 | ||
|         value, computed;
 | ||
|     if (iteratee == null && obj != null) {
 | ||
|       obj = isArrayLike(obj) ? obj : _.values(obj);
 | ||
|       for (var i = 0, length = obj.length; i < length; i++) {
 | ||
|         value = obj[i];
 | ||
|         if (value < result) {
 | ||
|           result = value;
 | ||
|         }
 | ||
|       }
 | ||
|     } else {
 | ||
|       iteratee = cb(iteratee, context);
 | ||
|       _.each(obj, function(value, index, list) {
 | ||
|         computed = iteratee(value, index, list);
 | ||
|         if (computed < lastComputed || computed === Infinity && result === Infinity) {
 | ||
|           result = value;
 | ||
|           lastComputed = computed;
 | ||
|         }
 | ||
|       });
 | ||
|     }
 | ||
|     return result;
 | ||
|   };
 | ||
| 
 | ||
|   // Shuffle a collection, using the modern version of the
 | ||
|   // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
 | ||
|   _.shuffle = function(obj) {
 | ||
|     var set = isArrayLike(obj) ? obj : _.values(obj);
 | ||
|     var length = set.length;
 | ||
|     var shuffled = Array(length);
 | ||
|     for (var index = 0, rand; index < length; index++) {
 | ||
|       rand = _.random(0, index);
 | ||
|       if (rand !== index) shuffled[index] = shuffled[rand];
 | ||
|       shuffled[rand] = set[index];
 | ||
|     }
 | ||
|     return shuffled;
 | ||
|   };
 | ||
| 
 | ||
|   // Sample **n** random values from a collection.
 | ||
|   // If **n** is not specified, returns a single random element.
 | ||
|   // The internal `guard` argument allows it to work with `map`.
 | ||
|   _.sample = function(obj, n, guard) {
 | ||
|     if (n == null || guard) {
 | ||
|       if (!isArrayLike(obj)) obj = _.values(obj);
 | ||
|       return obj[_.random(obj.length - 1)];
 | ||
|     }
 | ||
|     return _.shuffle(obj).slice(0, Math.max(0, n));
 | ||
|   };
 | ||
| 
 | ||
|   // Sort the object's values by a criterion produced by an iteratee.
 | ||
|   _.sortBy = function(obj, iteratee, context) {
 | ||
|     iteratee = cb(iteratee, context);
 | ||
|     return _.pluck(_.map(obj, function(value, index, list) {
 | ||
|       return {
 | ||
|         value: value,
 | ||
|         index: index,
 | ||
|         criteria: iteratee(value, index, list)
 | ||
|       };
 | ||
|     }).sort(function(left, right) {
 | ||
|       var a = left.criteria;
 | ||
|       var b = right.criteria;
 | ||
|       if (a !== b) {
 | ||
|         if (a > b || a === void 0) return 1;
 | ||
|         if (a < b || b === void 0) return -1;
 | ||
|       }
 | ||
|       return left.index - right.index;
 | ||
|     }), 'value');
 | ||
|   };
 | ||
| 
 | ||
|   // An internal function used for aggregate "group by" operations.
 | ||
|   var group = function(behavior) {
 | ||
|     return function(obj, iteratee, context) {
 | ||
|       var result = {};
 | ||
|       iteratee = cb(iteratee, context);
 | ||
|       _.each(obj, function(value, index) {
 | ||
|         var key = iteratee(value, index, obj);
 | ||
|         behavior(result, value, key);
 | ||
|       });
 | ||
|       return result;
 | ||
|     };
 | ||
|   };
 | ||
| 
 | ||
|   // Groups the object's values by a criterion. Pass either a string attribute
 | ||
|   // to group by, or a function that returns the criterion.
 | ||
|   _.groupBy = group(function(result, value, key) {
 | ||
|     if (_.has(result, key)) result[key].push(value); else result[key] = [value];
 | ||
|   });
 | ||
| 
 | ||
|   // Indexes the object's values by a criterion, similar to `groupBy`, but for
 | ||
|   // when you know that your index values will be unique.
 | ||
|   _.indexBy = group(function(result, value, key) {
 | ||
|     result[key] = value;
 | ||
|   });
 | ||
| 
 | ||
|   // Counts instances of an object that group by a certain criterion. Pass
 | ||
|   // either a string attribute to count by, or a function that returns the
 | ||
|   // criterion.
 | ||
|   _.countBy = group(function(result, value, key) {
 | ||
|     if (_.has(result, key)) result[key]++; else result[key] = 1;
 | ||
|   });
 | ||
| 
 | ||
|   // Safely create a real, live array from anything iterable.
 | ||
|   _.toArray = function(obj) {
 | ||
|     if (!obj) return [];
 | ||
|     if (_.isArray(obj)) return slice.call(obj);
 | ||
|     if (isArrayLike(obj)) return _.map(obj, _.identity);
 | ||
|     return _.values(obj);
 | ||
|   };
 | ||
| 
 | ||
|   // Return the number of elements in an object.
 | ||
|   _.size = function(obj) {
 | ||
|     if (obj == null) return 0;
 | ||
|     return isArrayLike(obj) ? obj.length : _.keys(obj).length;
 | ||
|   };
 | ||
| 
 | ||
|   // Split a collection into two arrays: one whose elements all satisfy the given
 | ||
|   // predicate, and one whose elements all do not satisfy the predicate.
 | ||
|   _.partition = function(obj, predicate, context) {
 | ||
|     predicate = cb(predicate, context);
 | ||
|     var pass = [], fail = [];
 | ||
|     _.each(obj, function(value, key, obj) {
 | ||
|       (predicate(value, key, obj) ? pass : fail).push(value);
 | ||
|     });
 | ||
|     return [pass, fail];
 | ||
|   };
 | ||
| 
 | ||
|   // Array Functions
 | ||
|   // ---------------
 | ||
| 
 | ||
|   // Get the first element of an array. Passing **n** will return the first N
 | ||
|   // values in the array. Aliased as `head` and `take`. The **guard** check
 | ||
|   // allows it to work with `_.map`.
 | ||
|   _.first = _.head = _.take = function(array, n, guard) {
 | ||
|     if (array == null) return void 0;
 | ||
|     if (n == null || guard) return array[0];
 | ||
|     return _.initial(array, array.length - n);
 | ||
|   };
 | ||
| 
 | ||
|   // Returns everything but the last entry of the array. Especially useful on
 | ||
|   // the arguments object. Passing **n** will return all the values in
 | ||
|   // the array, excluding the last N.
 | ||
|   _.initial = function(array, n, guard) {
 | ||
|     return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
 | ||
|   };
 | ||
| 
 | ||
|   // Get the last element of an array. Passing **n** will return the last N
 | ||
|   // values in the array.
 | ||
|   _.last = function(array, n, guard) {
 | ||
|     if (array == null) return void 0;
 | ||
|     if (n == null || guard) return array[array.length - 1];
 | ||
|     return _.rest(array, Math.max(0, array.length - n));
 | ||
|   };
 | ||
| 
 | ||
|   // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
 | ||
|   // Especially useful on the arguments object. Passing an **n** will return
 | ||
|   // the rest N values in the array.
 | ||
|   _.rest = _.tail = _.drop = function(array, n, guard) {
 | ||
|     return slice.call(array, n == null || guard ? 1 : n);
 | ||
|   };
 | ||
| 
 | ||
|   // Trim out all falsy values from an array.
 | ||
|   _.compact = function(array) {
 | ||
|     return _.filter(array, _.identity);
 | ||
|   };
 | ||
| 
 | ||
|   // Internal implementation of a recursive `flatten` function.
 | ||
|   var flatten = function(input, shallow, strict, startIndex) {
 | ||
|     var output = [], idx = 0;
 | ||
|     for (var i = startIndex || 0, length = getLength(input); i < length; i++) {
 | ||
|       var value = input[i];
 | ||
|       if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
 | ||
|         //flatten current level of array or arguments object
 | ||
|         if (!shallow) value = flatten(value, shallow, strict);
 | ||
|         var j = 0, len = value.length;
 | ||
|         output.length += len;
 | ||
|         while (j < len) {
 | ||
|           output[idx++] = value[j++];
 | ||
|         }
 | ||
|       } else if (!strict) {
 | ||
|         output[idx++] = value;
 | ||
|       }
 | ||
|     }
 | ||
|     return output;
 | ||
|   };
 | ||
| 
 | ||
|   // Flatten out an array, either recursively (by default), or just one level.
 | ||
|   _.flatten = function(array, shallow) {
 | ||
|     return flatten(array, shallow, false);
 | ||
|   };
 | ||
| 
 | ||
|   // Return a version of the array that does not contain the specified value(s).
 | ||
|   _.without = function(array) {
 | ||
|     return _.difference(array, slice.call(arguments, 1));
 | ||
|   };
 | ||
| 
 | ||
|   // Produce a duplicate-free version of the array. If the array has already
 | ||
|   // been sorted, you have the option of using a faster algorithm.
 | ||
|   // Aliased as `unique`.
 | ||
|   _.uniq = _.unique = function(array, isSorted, iteratee, context) {
 | ||
|     if (!_.isBoolean(isSorted)) {
 | ||
|       context = iteratee;
 | ||
|       iteratee = isSorted;
 | ||
|       isSorted = false;
 | ||
|     }
 | ||
|     if (iteratee != null) iteratee = cb(iteratee, context);
 | ||
|     var result = [];
 | ||
|     var seen = [];
 | ||
|     for (var i = 0, length = getLength(array); i < length; i++) {
 | ||
|       var value = array[i],
 | ||
|           computed = iteratee ? iteratee(value, i, array) : value;
 | ||
|       if (isSorted) {
 | ||
|         if (!i || seen !== computed) result.push(value);
 | ||
|         seen = computed;
 | ||
|       } else if (iteratee) {
 | ||
|         if (!_.contains(seen, computed)) {
 | ||
|           seen.push(computed);
 | ||
|           result.push(value);
 | ||
|         }
 | ||
|       } else if (!_.contains(result, value)) {
 | ||
|         result.push(value);
 | ||
|       }
 | ||
|     }
 | ||
|     return result;
 | ||
|   };
 | ||
| 
 | ||
|   // Produce an array that contains the union: each distinct element from all of
 | ||
|   // the passed-in arrays.
 | ||
|   _.union = function() {
 | ||
|     return _.uniq(flatten(arguments, true, true));
 | ||
|   };
 | ||
| 
 | ||
|   // Produce an array that contains every item shared between all the
 | ||
|   // passed-in arrays.
 | ||
|   _.intersection = function(array) {
 | ||
|     var result = [];
 | ||
|     var argsLength = arguments.length;
 | ||
|     for (var i = 0, length = getLength(array); i < length; i++) {
 | ||
|       var item = array[i];
 | ||
|       if (_.contains(result, item)) continue;
 | ||
|       for (var j = 1; j < argsLength; j++) {
 | ||
|         if (!_.contains(arguments[j], item)) break;
 | ||
|       }
 | ||
|       if (j === argsLength) result.push(item);
 | ||
|     }
 | ||
|     return result;
 | ||
|   };
 | ||
| 
 | ||
|   // Take the difference between one array and a number of other arrays.
 | ||
|   // Only the elements present in just the first array will remain.
 | ||
|   _.difference = function(array) {
 | ||
|     var rest = flatten(arguments, true, true, 1);
 | ||
|     return _.filter(array, function(value){
 | ||
|       return !_.contains(rest, value);
 | ||
|     });
 | ||
|   };
 | ||
| 
 | ||
|   // Zip together multiple lists into a single array -- elements that share
 | ||
|   // an index go together.
 | ||
|   _.zip = function() {
 | ||
|     return _.unzip(arguments);
 | ||
|   };
 | ||
| 
 | ||
|   // Complement of _.zip. Unzip accepts an array of arrays and groups
 | ||
|   // each array's elements on shared indices
 | ||
|   _.unzip = function(array) {
 | ||
|     var length = array && _.max(array, getLength).length || 0;
 | ||
|     var result = Array(length);
 | ||
| 
 | ||
|     for (var index = 0; index < length; index++) {
 | ||
|       result[index] = _.pluck(array, index);
 | ||
|     }
 | ||
|     return result;
 | ||
|   };
 | ||
| 
 | ||
|   // Converts lists into objects. Pass either a single array of `[key, value]`
 | ||
|   // pairs, or two parallel arrays of the same length -- one of keys, and one of
 | ||
|   // the corresponding values.
 | ||
|   _.object = function(list, values) {
 | ||
|     var result = {};
 | ||
|     for (var i = 0, length = getLength(list); i < length; i++) {
 | ||
|       if (values) {
 | ||
|         result[list[i]] = values[i];
 | ||
|       } else {
 | ||
|         result[list[i][0]] = list[i][1];
 | ||
|       }
 | ||
|     }
 | ||
|     return result;
 | ||
|   };
 | ||
| 
 | ||
|   // Generator function to create the findIndex and findLastIndex functions
 | ||
|   function createPredicateIndexFinder(dir) {
 | ||
|     return function(array, predicate, context) {
 | ||
|       predicate = cb(predicate, context);
 | ||
|       var length = getLength(array);
 | ||
|       var index = dir > 0 ? 0 : length - 1;
 | ||
|       for (; index >= 0 && index < length; index += dir) {
 | ||
|         if (predicate(array[index], index, array)) return index;
 | ||
|       }
 | ||
|       return -1;
 | ||
|     };
 | ||
|   }
 | ||
| 
 | ||
|   // Returns the first index on an array-like that passes a predicate test
 | ||
|   _.findIndex = createPredicateIndexFinder(1);
 | ||
|   _.findLastIndex = createPredicateIndexFinder(-1);
 | ||
| 
 | ||
|   // Use a comparator function to figure out the smallest index at which
 | ||
|   // an object should be inserted so as to maintain order. Uses binary search.
 | ||
|   _.sortedIndex = function(array, obj, iteratee, context) {
 | ||
|     iteratee = cb(iteratee, context, 1);
 | ||
|     var value = iteratee(obj);
 | ||
|     var low = 0, high = getLength(array);
 | ||
|     while (low < high) {
 | ||
|       var mid = Math.floor((low + high) / 2);
 | ||
|       if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
 | ||
|     }
 | ||
|     return low;
 | ||
|   };
 | ||
| 
 | ||
|   // Generator function to create the indexOf and lastIndexOf functions
 | ||
|   function createIndexFinder(dir, predicateFind, sortedIndex) {
 | ||
|     return function(array, item, idx) {
 | ||
|       var i = 0, length = getLength(array);
 | ||
|       if (typeof idx == 'number') {
 | ||
|         if (dir > 0) {
 | ||
|             i = idx >= 0 ? idx : Math.max(idx + length, i);
 | ||
|         } else {
 | ||
|             length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
 | ||
|         }
 | ||
|       } else if (sortedIndex && idx && length) {
 | ||
|         idx = sortedIndex(array, item);
 | ||
|         return array[idx] === item ? idx : -1;
 | ||
|       }
 | ||
|       if (item !== item) {
 | ||
|         idx = predicateFind(slice.call(array, i, length), _.isNaN);
 | ||
|         return idx >= 0 ? idx + i : -1;
 | ||
|       }
 | ||
|       for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
 | ||
|         if (array[idx] === item) return idx;
 | ||
|       }
 | ||
|       return -1;
 | ||
|     };
 | ||
|   }
 | ||
| 
 | ||
|   // Return the position of the first occurrence of an item in an array,
 | ||
|   // or -1 if the item is not included in the array.
 | ||
|   // If the array is large and already in sort order, pass `true`
 | ||
|   // for **isSorted** to use binary search.
 | ||
|   _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex);
 | ||
|   _.lastIndexOf = createIndexFinder(-1, _.findLastIndex);
 | ||
| 
 | ||
|   // Generate an integer Array containing an arithmetic progression. A port of
 | ||
|   // the native Python `range()` function. See
 | ||
|   // [the Python documentation](http://docs.python.org/library/functions.html#range).
 | ||
|   _.range = function(start, stop, step) {
 | ||
|     if (stop == null) {
 | ||
|       stop = start || 0;
 | ||
|       start = 0;
 | ||
|     }
 | ||
|     step = step || 1;
 | ||
| 
 | ||
|     var length = Math.max(Math.ceil((stop - start) / step), 0);
 | ||
|     var range = Array(length);
 | ||
| 
 | ||
|     for (var idx = 0; idx < length; idx++, start += step) {
 | ||
|       range[idx] = start;
 | ||
|     }
 | ||
| 
 | ||
|     return range;
 | ||
|   };
 | ||
| 
 | ||
|   // Function (ahem) Functions
 | ||
|   // ------------------
 | ||
| 
 | ||
|   // Determines whether to execute a function as a constructor
 | ||
|   // or a normal function with the provided arguments
 | ||
|   var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {
 | ||
|     if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
 | ||
|     var self = baseCreate(sourceFunc.prototype);
 | ||
|     var result = sourceFunc.apply(self, args);
 | ||
|     if (_.isObject(result)) return result;
 | ||
|     return self;
 | ||
|   };
 | ||
| 
 | ||
|   // Create a function bound to a given object (assigning `this`, and arguments,
 | ||
|   // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
 | ||
|   // available.
 | ||
|   _.bind = function(func, context) {
 | ||
|     if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
 | ||
|     if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
 | ||
|     var args = slice.call(arguments, 2);
 | ||
|     var bound = function() {
 | ||
|       return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));
 | ||
|     };
 | ||
|     return bound;
 | ||
|   };
 | ||
| 
 | ||
|   // Partially apply a function by creating a version that has had some of its
 | ||
|   // arguments pre-filled, without changing its dynamic `this` context. _ acts
 | ||
|   // as a placeholder, allowing any combination of arguments to be pre-filled.
 | ||
|   _.partial = function(func) {
 | ||
|     var boundArgs = slice.call(arguments, 1);
 | ||
|     var bound = function() {
 | ||
|       var position = 0, length = boundArgs.length;
 | ||
|       var args = Array(length);
 | ||
|       for (var i = 0; i < length; i++) {
 | ||
|         args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i];
 | ||
|       }
 | ||
|       while (position < arguments.length) args.push(arguments[position++]);
 | ||
|       return executeBound(func, bound, this, this, args);
 | ||
|     };
 | ||
|     return bound;
 | ||
|   };
 | ||
| 
 | ||
|   // Bind a number of an object's methods to that object. Remaining arguments
 | ||
|   // are the method names to be bound. Useful for ensuring that all callbacks
 | ||
|   // defined on an object belong to it.
 | ||
|   _.bindAll = function(obj) {
 | ||
|     var i, length = arguments.length, key;
 | ||
|     if (length <= 1) throw new Error('bindAll must be passed function names');
 | ||
|     for (i = 1; i < length; i++) {
 | ||
|       key = arguments[i];
 | ||
|       obj[key] = _.bind(obj[key], obj);
 | ||
|     }
 | ||
|     return obj;
 | ||
|   };
 | ||
| 
 | ||
|   // Memoize an expensive function by storing its results.
 | ||
|   _.memoize = function(func, hasher) {
 | ||
|     var memoize = function(key) {
 | ||
|       var cache = memoize.cache;
 | ||
|       var address = '' + (hasher ? hasher.apply(this, arguments) : key);
 | ||
|       if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
 | ||
|       return cache[address];
 | ||
|     };
 | ||
|     memoize.cache = {};
 | ||
|     return memoize;
 | ||
|   };
 | ||
| 
 | ||
|   // Delays a function for the given number of milliseconds, and then calls
 | ||
|   // it with the arguments supplied.
 | ||
|   _.delay = function(func, wait) {
 | ||
|     var args = slice.call(arguments, 2);
 | ||
|     return setTimeout(function(){
 | ||
|       return func.apply(null, args);
 | ||
|     }, wait);
 | ||
|   };
 | ||
| 
 | ||
|   // Defers a function, scheduling it to run after the current call stack has
 | ||
|   // cleared.
 | ||
|   _.defer = _.partial(_.delay, _, 1);
 | ||
| 
 | ||
|   // Returns a function, that, when invoked, will only be triggered at most once
 | ||
|   // during a given window of time. Normally, the throttled function will run
 | ||
|   // as much as it can, without ever going more than once per `wait` duration;
 | ||
|   // but if you'd like to disable the execution on the leading edge, pass
 | ||
|   // `{leading: false}`. To disable execution on the trailing edge, ditto.
 | ||
|   _.throttle = function(func, wait, options) {
 | ||
|     var context, args, result;
 | ||
|     var timeout = null;
 | ||
|     var previous = 0;
 | ||
|     if (!options) options = {};
 | ||
|     var later = function() {
 | ||
|       previous = options.leading === false ? 0 : _.now();
 | ||
|       timeout = null;
 | ||
|       result = func.apply(context, args);
 | ||
|       if (!timeout) context = args = null;
 | ||
|     };
 | ||
|     return function() {
 | ||
|       var now = _.now();
 | ||
|       if (!previous && options.leading === false) previous = now;
 | ||
|       var remaining = wait - (now - previous);
 | ||
|       context = this;
 | ||
|       args = arguments;
 | ||
|       if (remaining <= 0 || remaining > wait) {
 | ||
|         if (timeout) {
 | ||
|           clearTimeout(timeout);
 | ||
|           timeout = null;
 | ||
|         }
 | ||
|         previous = now;
 | ||
|         result = func.apply(context, args);
 | ||
|         if (!timeout) context = args = null;
 | ||
|       } else if (!timeout && options.trailing !== false) {
 | ||
|         timeout = setTimeout(later, remaining);
 | ||
|       }
 | ||
|       return result;
 | ||
|     };
 | ||
|   };
 | ||
| 
 | ||
|   // Returns a function, that, as long as it continues to be invoked, will not
 | ||
|   // be triggered. The function will be called after it stops being called for
 | ||
|   // N milliseconds. If `immediate` is passed, trigger the function on the
 | ||
|   // leading edge, instead of the trailing.
 | ||
|   _.debounce = function(func, wait, immediate) {
 | ||
|     var timeout, args, context, timestamp, result;
 | ||
| 
 | ||
|     var later = function() {
 | ||
|       var last = _.now() - timestamp;
 | ||
| 
 | ||
|       if (last < wait && last >= 0) {
 | ||
|         timeout = setTimeout(later, wait - last);
 | ||
|       } else {
 | ||
|         timeout = null;
 | ||
|         if (!immediate) {
 | ||
|           result = func.apply(context, args);
 | ||
|           if (!timeout) context = args = null;
 | ||
|         }
 | ||
|       }
 | ||
|     };
 | ||
| 
 | ||
|     return function() {
 | ||
|       context = this;
 | ||
|       args = arguments;
 | ||
|       timestamp = _.now();
 | ||
|       var callNow = immediate && !timeout;
 | ||
|       if (!timeout) timeout = setTimeout(later, wait);
 | ||
|       if (callNow) {
 | ||
|         result = func.apply(context, args);
 | ||
|         context = args = null;
 | ||
|       }
 | ||
| 
 | ||
|       return result;
 | ||
|     };
 | ||
|   };
 | ||
| 
 | ||
|   // Returns the first function passed as an argument to the second,
 | ||
|   // allowing you to adjust arguments, run code before and after, and
 | ||
|   // conditionally execute the original function.
 | ||
|   _.wrap = function(func, wrapper) {
 | ||
|     return _.partial(wrapper, func);
 | ||
|   };
 | ||
| 
 | ||
|   // Returns a negated version of the passed-in predicate.
 | ||
|   _.negate = function(predicate) {
 | ||
|     return function() {
 | ||
|       return !predicate.apply(this, arguments);
 | ||
|     };
 | ||
|   };
 | ||
| 
 | ||
|   // Returns a function that is the composition of a list of functions, each
 | ||
|   // consuming the return value of the function that follows.
 | ||
|   _.compose = function() {
 | ||
|     var args = arguments;
 | ||
|     var start = args.length - 1;
 | ||
|     return function() {
 | ||
|       var i = start;
 | ||
|       var result = args[start].apply(this, arguments);
 | ||
|       while (i--) result = args[i].call(this, result);
 | ||
|       return result;
 | ||
|     };
 | ||
|   };
 | ||
| 
 | ||
|   // Returns a function that will only be executed on and after the Nth call.
 | ||
|   _.after = function(times, func) {
 | ||
|     return function() {
 | ||
|       if (--times < 1) {
 | ||
|         return func.apply(this, arguments);
 | ||
|       }
 | ||
|     };
 | ||
|   };
 | ||
| 
 | ||
|   // Returns a function that will only be executed up to (but not including) the Nth call.
 | ||
|   _.before = function(times, func) {
 | ||
|     var memo;
 | ||
|     return function() {
 | ||
|       if (--times > 0) {
 | ||
|         memo = func.apply(this, arguments);
 | ||
|       }
 | ||
|       if (times <= 1) func = null;
 | ||
|       return memo;
 | ||
|     };
 | ||
|   };
 | ||
| 
 | ||
|   // Returns a function that will be executed at most one time, no matter how
 | ||
|   // often you call it. Useful for lazy initialization.
 | ||
|   _.once = _.partial(_.before, 2);
 | ||
| 
 | ||
|   // Object Functions
 | ||
|   // ----------------
 | ||
| 
 | ||
|   // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
 | ||
|   var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
 | ||
|   var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
 | ||
|                       'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
 | ||
| 
 | ||
|   function collectNonEnumProps(obj, keys) {
 | ||
|     var nonEnumIdx = nonEnumerableProps.length;
 | ||
|     var constructor = obj.constructor;
 | ||
|     var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;
 | ||
| 
 | ||
|     // Constructor is a special case.
 | ||
|     var prop = 'constructor';
 | ||
|     if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);
 | ||
| 
 | ||
|     while (nonEnumIdx--) {
 | ||
|       prop = nonEnumerableProps[nonEnumIdx];
 | ||
|       if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {
 | ||
|         keys.push(prop);
 | ||
|       }
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   // Retrieve the names of an object's own properties.
 | ||
|   // Delegates to **ECMAScript 5**'s native `Object.keys`
 | ||
|   _.keys = function(obj) {
 | ||
|     if (!_.isObject(obj)) return [];
 | ||
|     if (nativeKeys) return nativeKeys(obj);
 | ||
|     var keys = [];
 | ||
|     for (var key in obj) if (_.has(obj, key)) keys.push(key);
 | ||
|     // Ahem, IE < 9.
 | ||
|     if (hasEnumBug) collectNonEnumProps(obj, keys);
 | ||
|     return keys;
 | ||
|   };
 | ||
| 
 | ||
|   // Retrieve all the property names of an object.
 | ||
|   _.allKeys = function(obj) {
 | ||
|     if (!_.isObject(obj)) return [];
 | ||
|     var keys = [];
 | ||
|     for (var key in obj) keys.push(key);
 | ||
|     // Ahem, IE < 9.
 | ||
|     if (hasEnumBug) collectNonEnumProps(obj, keys);
 | ||
|     return keys;
 | ||
|   };
 | ||
| 
 | ||
|   // Retrieve the values of an object's properties.
 | ||
|   _.values = function(obj) {
 | ||
|     var keys = _.keys(obj);
 | ||
|     var length = keys.length;
 | ||
|     var values = Array(length);
 | ||
|     for (var i = 0; i < length; i++) {
 | ||
|       values[i] = obj[keys[i]];
 | ||
|     }
 | ||
|     return values;
 | ||
|   };
 | ||
| 
 | ||
|   // Returns the results of applying the iteratee to each element of the object
 | ||
|   // In contrast to _.map it returns an object
 | ||
|   _.mapObject = function(obj, iteratee, context) {
 | ||
|     iteratee = cb(iteratee, context);
 | ||
|     var keys =  _.keys(obj),
 | ||
|           length = keys.length,
 | ||
|           results = {},
 | ||
|           currentKey;
 | ||
|       for (var index = 0; index < length; index++) {
 | ||
|         currentKey = keys[index];
 | ||
|         results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
 | ||
|       }
 | ||
|       return results;
 | ||
|   };
 | ||
| 
 | ||
|   // Convert an object into a list of `[key, value]` pairs.
 | ||
|   _.pairs = function(obj) {
 | ||
|     var keys = _.keys(obj);
 | ||
|     var length = keys.length;
 | ||
|     var pairs = Array(length);
 | ||
|     for (var i = 0; i < length; i++) {
 | ||
|       pairs[i] = [keys[i], obj[keys[i]]];
 | ||
|     }
 | ||
|     return pairs;
 | ||
|   };
 | ||
| 
 | ||
|   // Invert the keys and values of an object. The values must be serializable.
 | ||
|   _.invert = function(obj) {
 | ||
|     var result = {};
 | ||
|     var keys = _.keys(obj);
 | ||
|     for (var i = 0, length = keys.length; i < length; i++) {
 | ||
|       result[obj[keys[i]]] = keys[i];
 | ||
|     }
 | ||
|     return result;
 | ||
|   };
 | ||
| 
 | ||
|   // Return a sorted list of the function names available on the object.
 | ||
|   // Aliased as `methods`
 | ||
|   _.functions = _.methods = function(obj) {
 | ||
|     var names = [];
 | ||
|     for (var key in obj) {
 | ||
|       if (_.isFunction(obj[key])) names.push(key);
 | ||
|     }
 | ||
|     return names.sort();
 | ||
|   };
 | ||
| 
 | ||
|   // Extend a given object with all the properties in passed-in object(s).
 | ||
|   _.extend = createAssigner(_.allKeys);
 | ||
| 
 | ||
|   // Assigns a given object with all the own properties in the passed-in object(s)
 | ||
|   // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
 | ||
|   _.extendOwn = _.assign = createAssigner(_.keys);
 | ||
| 
 | ||
|   // Returns the first key on an object that passes a predicate test
 | ||
|   _.findKey = function(obj, predicate, context) {
 | ||
|     predicate = cb(predicate, context);
 | ||
|     var keys = _.keys(obj), key;
 | ||
|     for (var i = 0, length = keys.length; i < length; i++) {
 | ||
|       key = keys[i];
 | ||
|       if (predicate(obj[key], key, obj)) return key;
 | ||
|     }
 | ||
|   };
 | ||
| 
 | ||
|   // Return a copy of the object only containing the whitelisted properties.
 | ||
|   _.pick = function(object, oiteratee, context) {
 | ||
|     var result = {}, obj = object, iteratee, keys;
 | ||
|     if (obj == null) return result;
 | ||
|     if (_.isFunction(oiteratee)) {
 | ||
|       keys = _.allKeys(obj);
 | ||
|       iteratee = optimizeCb(oiteratee, context);
 | ||
|     } else {
 | ||
|       keys = flatten(arguments, false, false, 1);
 | ||
|       iteratee = function(value, key, obj) { return key in obj; };
 | ||
|       obj = Object(obj);
 | ||
|     }
 | ||
|     for (var i = 0, length = keys.length; i < length; i++) {
 | ||
|       var key = keys[i];
 | ||
|       var value = obj[key];
 | ||
|       if (iteratee(value, key, obj)) result[key] = value;
 | ||
|     }
 | ||
|     return result;
 | ||
|   };
 | ||
| 
 | ||
|    // Return a copy of the object without the blacklisted properties.
 | ||
|   _.omit = function(obj, iteratee, context) {
 | ||
|     if (_.isFunction(iteratee)) {
 | ||
|       iteratee = _.negate(iteratee);
 | ||
|     } else {
 | ||
|       var keys = _.map(flatten(arguments, false, false, 1), String);
 | ||
|       iteratee = function(value, key) {
 | ||
|         return !_.contains(keys, key);
 | ||
|       };
 | ||
|     }
 | ||
|     return _.pick(obj, iteratee, context);
 | ||
|   };
 | ||
| 
 | ||
|   // Fill in a given object with default properties.
 | ||
|   _.defaults = createAssigner(_.allKeys, true);
 | ||
| 
 | ||
|   // Creates an object that inherits from the given prototype object.
 | ||
|   // If additional properties are provided then they will be added to the
 | ||
|   // created object.
 | ||
|   _.create = function(prototype, props) {
 | ||
|     var result = baseCreate(prototype);
 | ||
|     if (props) _.extendOwn(result, props);
 | ||
|     return result;
 | ||
|   };
 | ||
| 
 | ||
|   // Create a (shallow-cloned) duplicate of an object.
 | ||
|   _.clone = function(obj) {
 | ||
|     if (!_.isObject(obj)) return obj;
 | ||
|     return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
 | ||
|   };
 | ||
| 
 | ||
|   // Invokes interceptor with the obj, and then returns obj.
 | ||
|   // The primary purpose of this method is to "tap into" a method chain, in
 | ||
|   // order to perform operations on intermediate results within the chain.
 | ||
|   _.tap = function(obj, interceptor) {
 | ||
|     interceptor(obj);
 | ||
|     return obj;
 | ||
|   };
 | ||
| 
 | ||
|   // Returns whether an object has a given set of `key:value` pairs.
 | ||
|   _.isMatch = function(object, attrs) {
 | ||
|     var keys = _.keys(attrs), length = keys.length;
 | ||
|     if (object == null) return !length;
 | ||
|     var obj = Object(object);
 | ||
|     for (var i = 0; i < length; i++) {
 | ||
|       var key = keys[i];
 | ||
|       if (attrs[key] !== obj[key] || !(key in obj)) return false;
 | ||
|     }
 | ||
|     return true;
 | ||
|   };
 | ||
| 
 | ||
| 
 | ||
|   // Internal recursive comparison function for `isEqual`.
 | ||
|   var eq = function(a, b, aStack, bStack) {
 | ||
|     // Identical objects are equal. `0 === -0`, but they aren't identical.
 | ||
|     // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
 | ||
|     if (a === b) return a !== 0 || 1 / a === 1 / b;
 | ||
|     // A strict comparison is necessary because `null == undefined`.
 | ||
|     if (a == null || b == null) return a === b;
 | ||
|     // Unwrap any wrapped objects.
 | ||
|     if (a instanceof _) a = a._wrapped;
 | ||
|     if (b instanceof _) b = b._wrapped;
 | ||
|     // Compare `[[Class]]` names.
 | ||
|     var className = toString.call(a);
 | ||
|     if (className !== toString.call(b)) return false;
 | ||
|     switch (className) {
 | ||
|       // Strings, numbers, regular expressions, dates, and booleans are compared by value.
 | ||
|       case '[object RegExp]':
 | ||
|       // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
 | ||
|       case '[object String]':
 | ||
|         // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
 | ||
|         // equivalent to `new String("5")`.
 | ||
|         return '' + a === '' + b;
 | ||
|       case '[object Number]':
 | ||
|         // `NaN`s are equivalent, but non-reflexive.
 | ||
|         // Object(NaN) is equivalent to NaN
 | ||
|         if (+a !== +a) return +b !== +b;
 | ||
|         // An `egal` comparison is performed for other numeric values.
 | ||
|         return +a === 0 ? 1 / +a === 1 / b : +a === +b;
 | ||
|       case '[object Date]':
 | ||
|       case '[object Boolean]':
 | ||
|         // Coerce dates and booleans to numeric primitive values. Dates are compared by their
 | ||
|         // millisecond representations. Note that invalid dates with millisecond representations
 | ||
|         // of `NaN` are not equivalent.
 | ||
|         return +a === +b;
 | ||
|     }
 | ||
| 
 | ||
|     var areArrays = className === '[object Array]';
 | ||
|     if (!areArrays) {
 | ||
|       if (typeof a != 'object' || typeof b != 'object') return false;
 | ||
| 
 | ||
|       // Objects with different constructors are not equivalent, but `Object`s or `Array`s
 | ||
|       // from different frames are.
 | ||
|       var aCtor = a.constructor, bCtor = b.constructor;
 | ||
|       if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
 | ||
|                                _.isFunction(bCtor) && bCtor instanceof bCtor)
 | ||
|                           && ('constructor' in a && 'constructor' in b)) {
 | ||
|         return false;
 | ||
|       }
 | ||
|     }
 | ||
|     // Assume equality for cyclic structures. The algorithm for detecting cyclic
 | ||
|     // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
 | ||
| 
 | ||
|     // Initializing stack of traversed objects.
 | ||
|     // It's done here since we only need them for objects and arrays comparison.
 | ||
|     aStack = aStack || [];
 | ||
|     bStack = bStack || [];
 | ||
|     var length = aStack.length;
 | ||
|     while (length--) {
 | ||
|       // Linear search. Performance is inversely proportional to the number of
 | ||
|       // unique nested structures.
 | ||
|       if (aStack[length] === a) return bStack[length] === b;
 | ||
|     }
 | ||
| 
 | ||
|     // Add the first object to the stack of traversed objects.
 | ||
|     aStack.push(a);
 | ||
|     bStack.push(b);
 | ||
| 
 | ||
|     // Recursively compare objects and arrays.
 | ||
|     if (areArrays) {
 | ||
|       // Compare array lengths to determine if a deep comparison is necessary.
 | ||
|       length = a.length;
 | ||
|       if (length !== b.length) return false;
 | ||
|       // Deep compare the contents, ignoring non-numeric properties.
 | ||
|       while (length--) {
 | ||
|         if (!eq(a[length], b[length], aStack, bStack)) return false;
 | ||
|       }
 | ||
|     } else {
 | ||
|       // Deep compare objects.
 | ||
|       var keys = _.keys(a), key;
 | ||
|       length = keys.length;
 | ||
|       // Ensure that both objects contain the same number of properties before comparing deep equality.
 | ||
|       if (_.keys(b).length !== length) return false;
 | ||
|       while (length--) {
 | ||
|         // Deep compare each member
 | ||
|         key = keys[length];
 | ||
|         if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
 | ||
|       }
 | ||
|     }
 | ||
|     // Remove the first object from the stack of traversed objects.
 | ||
|     aStack.pop();
 | ||
|     bStack.pop();
 | ||
|     return true;
 | ||
|   };
 | ||
| 
 | ||
|   // Perform a deep comparison to check if two objects are equal.
 | ||
|   _.isEqual = function(a, b) {
 | ||
|     return eq(a, b);
 | ||
|   };
 | ||
| 
 | ||
|   // Is a given array, string, or object empty?
 | ||
|   // An "empty" object has no enumerable own-properties.
 | ||
|   _.isEmpty = function(obj) {
 | ||
|     if (obj == null) return true;
 | ||
|     if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;
 | ||
|     return _.keys(obj).length === 0;
 | ||
|   };
 | ||
| 
 | ||
|   // Is a given value a DOM element?
 | ||
|   _.isElement = function(obj) {
 | ||
|     return !!(obj && obj.nodeType === 1);
 | ||
|   };
 | ||
| 
 | ||
|   // Is a given value an array?
 | ||
|   // Delegates to ECMA5's native Array.isArray
 | ||
|   _.isArray = nativeIsArray || function(obj) {
 | ||
|     return toString.call(obj) === '[object Array]';
 | ||
|   };
 | ||
| 
 | ||
|   // Is a given variable an object?
 | ||
|   _.isObject = function(obj) {
 | ||
|     var type = typeof obj;
 | ||
|     return type === 'function' || type === 'object' && !!obj;
 | ||
|   };
 | ||
| 
 | ||
|   // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.
 | ||
|   _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {
 | ||
|     _['is' + name] = function(obj) {
 | ||
|       return toString.call(obj) === '[object ' + name + ']';
 | ||
|     };
 | ||
|   });
 | ||
| 
 | ||
|   // Define a fallback version of the method in browsers (ahem, IE < 9), where
 | ||
|   // there isn't any inspectable "Arguments" type.
 | ||
|   if (!_.isArguments(arguments)) {
 | ||
|     _.isArguments = function(obj) {
 | ||
|       return _.has(obj, 'callee');
 | ||
|     };
 | ||
|   }
 | ||
| 
 | ||
|   // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,
 | ||
|   // IE 11 (#1621), and in Safari 8 (#1929).
 | ||
|   if ( true && typeof Int8Array != 'object') {
 | ||
|     _.isFunction = function(obj) {
 | ||
|       return typeof obj == 'function' || false;
 | ||
|     };
 | ||
|   }
 | ||
| 
 | ||
|   // Is a given object a finite number?
 | ||
|   _.isFinite = function(obj) {
 | ||
|     return isFinite(obj) && !isNaN(parseFloat(obj));
 | ||
|   };
 | ||
| 
 | ||
|   // Is the given value `NaN`? (NaN is the only number which does not equal itself).
 | ||
|   _.isNaN = function(obj) {
 | ||
|     return _.isNumber(obj) && obj !== +obj;
 | ||
|   };
 | ||
| 
 | ||
|   // Is a given value a boolean?
 | ||
|   _.isBoolean = function(obj) {
 | ||
|     return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
 | ||
|   };
 | ||
| 
 | ||
|   // Is a given value equal to null?
 | ||
|   _.isNull = function(obj) {
 | ||
|     return obj === null;
 | ||
|   };
 | ||
| 
 | ||
|   // Is a given variable undefined?
 | ||
|   _.isUndefined = function(obj) {
 | ||
|     return obj === void 0;
 | ||
|   };
 | ||
| 
 | ||
|   // Shortcut function for checking if an object has a given property directly
 | ||
|   // on itself (in other words, not on a prototype).
 | ||
|   _.has = function(obj, key) {
 | ||
|     return obj != null && hasOwnProperty.call(obj, key);
 | ||
|   };
 | ||
| 
 | ||
|   // Utility Functions
 | ||
|   // -----------------
 | ||
| 
 | ||
|   // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
 | ||
|   // previous owner. Returns a reference to the Underscore object.
 | ||
|   _.noConflict = function() {
 | ||
|     root._ = previousUnderscore;
 | ||
|     return this;
 | ||
|   };
 | ||
| 
 | ||
|   // Keep the identity function around for default iteratees.
 | ||
|   _.identity = function(value) {
 | ||
|     return value;
 | ||
|   };
 | ||
| 
 | ||
|   // Predicate-generating functions. Often useful outside of Underscore.
 | ||
|   _.constant = function(value) {
 | ||
|     return function() {
 | ||
|       return value;
 | ||
|     };
 | ||
|   };
 | ||
| 
 | ||
|   _.noop = function(){};
 | ||
| 
 | ||
|   _.property = property;
 | ||
| 
 | ||
|   // Generates a function for a given object that returns a given property.
 | ||
|   _.propertyOf = function(obj) {
 | ||
|     return obj == null ? function(){} : function(key) {
 | ||
|       return obj[key];
 | ||
|     };
 | ||
|   };
 | ||
| 
 | ||
|   // Returns a predicate for checking whether an object has a given set of
 | ||
|   // `key:value` pairs.
 | ||
|   _.matcher = _.matches = function(attrs) {
 | ||
|     attrs = _.extendOwn({}, attrs);
 | ||
|     return function(obj) {
 | ||
|       return _.isMatch(obj, attrs);
 | ||
|     };
 | ||
|   };
 | ||
| 
 | ||
|   // Run a function **n** times.
 | ||
|   _.times = function(n, iteratee, context) {
 | ||
|     var accum = Array(Math.max(0, n));
 | ||
|     iteratee = optimizeCb(iteratee, context, 1);
 | ||
|     for (var i = 0; i < n; i++) accum[i] = iteratee(i);
 | ||
|     return accum;
 | ||
|   };
 | ||
| 
 | ||
|   // Return a random integer between min and max (inclusive).
 | ||
|   _.random = function(min, max) {
 | ||
|     if (max == null) {
 | ||
|       max = min;
 | ||
|       min = 0;
 | ||
|     }
 | ||
|     return min + Math.floor(Math.random() * (max - min + 1));
 | ||
|   };
 | ||
| 
 | ||
|   // A (possibly faster) way to get the current timestamp as an integer.
 | ||
|   _.now = Date.now || function() {
 | ||
|     return new Date().getTime();
 | ||
|   };
 | ||
| 
 | ||
|    // List of HTML entities for escaping.
 | ||
|   var escapeMap = {
 | ||
|     '&': '&',
 | ||
|     '<': '<',
 | ||
|     '>': '>',
 | ||
|     '"': '"',
 | ||
|     "'": ''',
 | ||
|     '`': '`'
 | ||
|   };
 | ||
|   var unescapeMap = _.invert(escapeMap);
 | ||
| 
 | ||
|   // Functions for escaping and unescaping strings to/from HTML interpolation.
 | ||
|   var createEscaper = function(map) {
 | ||
|     var escaper = function(match) {
 | ||
|       return map[match];
 | ||
|     };
 | ||
|     // Regexes for identifying a key that needs to be escaped
 | ||
|     var source = '(?:' + _.keys(map).join('|') + ')';
 | ||
|     var testRegexp = RegExp(source);
 | ||
|     var replaceRegexp = RegExp(source, 'g');
 | ||
|     return function(string) {
 | ||
|       string = string == null ? '' : '' + string;
 | ||
|       return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
 | ||
|     };
 | ||
|   };
 | ||
|   _.escape = createEscaper(escapeMap);
 | ||
|   _.unescape = createEscaper(unescapeMap);
 | ||
| 
 | ||
|   // If the value of the named `property` is a function then invoke it with the
 | ||
|   // `object` as context; otherwise, return it.
 | ||
|   _.result = function(object, property, fallback) {
 | ||
|     var value = object == null ? void 0 : object[property];
 | ||
|     if (value === void 0) {
 | ||
|       value = fallback;
 | ||
|     }
 | ||
|     return _.isFunction(value) ? value.call(object) : value;
 | ||
|   };
 | ||
| 
 | ||
|   // Generate a unique integer id (unique within the entire client session).
 | ||
|   // Useful for temporary DOM ids.
 | ||
|   var idCounter = 0;
 | ||
|   _.uniqueId = function(prefix) {
 | ||
|     var id = ++idCounter + '';
 | ||
|     return prefix ? prefix + id : id;
 | ||
|   };
 | ||
| 
 | ||
|   // By default, Underscore uses ERB-style template delimiters, change the
 | ||
|   // following template settings to use alternative delimiters.
 | ||
|   _.templateSettings = {
 | ||
|     evaluate    : /<%([\s\S]+?)%>/g,
 | ||
|     interpolate : /<%=([\s\S]+?)%>/g,
 | ||
|     escape      : /<%-([\s\S]+?)%>/g
 | ||
|   };
 | ||
| 
 | ||
|   // When customizing `templateSettings`, if you don't want to define an
 | ||
|   // interpolation, evaluation or escaping regex, we need one that is
 | ||
|   // guaranteed not to match.
 | ||
|   var noMatch = /(.)^/;
 | ||
| 
 | ||
|   // Certain characters need to be escaped so that they can be put into a
 | ||
|   // string literal.
 | ||
|   var escapes = {
 | ||
|     "'":      "'",
 | ||
|     '\\':     '\\',
 | ||
|     '\r':     'r',
 | ||
|     '\n':     'n',
 | ||
|     '\u2028': 'u2028',
 | ||
|     '\u2029': 'u2029'
 | ||
|   };
 | ||
| 
 | ||
|   var escaper = /\\|'|\r|\n|\u2028|\u2029/g;
 | ||
| 
 | ||
|   var escapeChar = function(match) {
 | ||
|     return '\\' + escapes[match];
 | ||
|   };
 | ||
| 
 | ||
|   // JavaScript micro-templating, similar to John Resig's implementation.
 | ||
|   // Underscore templating handles arbitrary delimiters, preserves whitespace,
 | ||
|   // and correctly escapes quotes within interpolated code.
 | ||
|   // NB: `oldSettings` only exists for backwards compatibility.
 | ||
|   _.template = function(text, settings, oldSettings) {
 | ||
|     if (!settings && oldSettings) settings = oldSettings;
 | ||
|     settings = _.defaults({}, settings, _.templateSettings);
 | ||
| 
 | ||
|     // Combine delimiters into one regular expression via alternation.
 | ||
|     var matcher = RegExp([
 | ||
|       (settings.escape || noMatch).source,
 | ||
|       (settings.interpolate || noMatch).source,
 | ||
|       (settings.evaluate || noMatch).source
 | ||
|     ].join('|') + '|$', 'g');
 | ||
| 
 | ||
|     // Compile the template source, escaping string literals appropriately.
 | ||
|     var index = 0;
 | ||
|     var source = "__p+='";
 | ||
|     text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
 | ||
|       source += text.slice(index, offset).replace(escaper, escapeChar);
 | ||
|       index = offset + match.length;
 | ||
| 
 | ||
|       if (escape) {
 | ||
|         source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
 | ||
|       } else if (interpolate) {
 | ||
|         source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
 | ||
|       } else if (evaluate) {
 | ||
|         source += "';\n" + evaluate + "\n__p+='";
 | ||
|       }
 | ||
| 
 | ||
|       // Adobe VMs need the match returned to produce the correct offest.
 | ||
|       return match;
 | ||
|     });
 | ||
|     source += "';\n";
 | ||
| 
 | ||
|     // If a variable is not specified, place data values in local scope.
 | ||
|     if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
 | ||
| 
 | ||
|     source = "var __t,__p='',__j=Array.prototype.join," +
 | ||
|       "print=function(){__p+=__j.call(arguments,'');};\n" +
 | ||
|       source + 'return __p;\n';
 | ||
| 
 | ||
|     try {
 | ||
|       var render = new Function(settings.variable || 'obj', '_', source);
 | ||
|     } catch (e) {
 | ||
|       e.source = source;
 | ||
|       throw e;
 | ||
|     }
 | ||
| 
 | ||
|     var template = function(data) {
 | ||
|       return render.call(this, data, _);
 | ||
|     };
 | ||
| 
 | ||
|     // Provide the compiled source as a convenience for precompilation.
 | ||
|     var argument = settings.variable || 'obj';
 | ||
|     template.source = 'function(' + argument + '){\n' + source + '}';
 | ||
| 
 | ||
|     return template;
 | ||
|   };
 | ||
| 
 | ||
|   // Add a "chain" function. Start chaining a wrapped Underscore object.
 | ||
|   _.chain = function(obj) {
 | ||
|     var instance = _(obj);
 | ||
|     instance._chain = true;
 | ||
|     return instance;
 | ||
|   };
 | ||
| 
 | ||
|   // OOP
 | ||
|   // ---------------
 | ||
|   // If Underscore is called as a function, it returns a wrapped object that
 | ||
|   // can be used OO-style. This wrapper holds altered versions of all the
 | ||
|   // underscore functions. Wrapped objects may be chained.
 | ||
| 
 | ||
|   // Helper function to continue chaining intermediate results.
 | ||
|   var result = function(instance, obj) {
 | ||
|     return instance._chain ? _(obj).chain() : obj;
 | ||
|   };
 | ||
| 
 | ||
|   // Add your own custom functions to the Underscore object.
 | ||
|   _.mixin = function(obj) {
 | ||
|     _.each(_.functions(obj), function(name) {
 | ||
|       var func = _[name] = obj[name];
 | ||
|       _.prototype[name] = function() {
 | ||
|         var args = [this._wrapped];
 | ||
|         push.apply(args, arguments);
 | ||
|         return result(this, func.apply(_, args));
 | ||
|       };
 | ||
|     });
 | ||
|   };
 | ||
| 
 | ||
|   // Add all of the Underscore functions to the wrapper object.
 | ||
|   _.mixin(_);
 | ||
| 
 | ||
|   // Add all mutator Array functions to the wrapper.
 | ||
|   _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
 | ||
|     var method = ArrayProto[name];
 | ||
|     _.prototype[name] = function() {
 | ||
|       var obj = this._wrapped;
 | ||
|       method.apply(obj, arguments);
 | ||
|       if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
 | ||
|       return result(this, obj);
 | ||
|     };
 | ||
|   });
 | ||
| 
 | ||
|   // Add all accessor Array functions to the wrapper.
 | ||
|   _.each(['concat', 'join', 'slice'], function(name) {
 | ||
|     var method = ArrayProto[name];
 | ||
|     _.prototype[name] = function() {
 | ||
|       return result(this, method.apply(this._wrapped, arguments));
 | ||
|     };
 | ||
|   });
 | ||
| 
 | ||
|   // Extracts the result from a wrapped and chained object.
 | ||
|   _.prototype.value = function() {
 | ||
|     return this._wrapped;
 | ||
|   };
 | ||
| 
 | ||
|   // Provide unwrapping proxy for some methods used in engine operations
 | ||
|   // such as arithmetic and JSON stringification.
 | ||
|   _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
 | ||
| 
 | ||
|   _.prototype.toString = function() {
 | ||
|     return '' + this._wrapped;
 | ||
|   };
 | ||
| 
 | ||
|   // AMD registration happens at the end for compatibility with AMD loaders
 | ||
|   // that may not enforce next-turn semantics on modules. Even though general
 | ||
|   // practice for AMD registration is to be anonymous, underscore registers
 | ||
|   // as a named module because, like jQuery, it is a base library that is
 | ||
|   // popular enough to be bundled in a third party lib, but not be part of
 | ||
|   // an AMD load request. Those cases could generate an error when an
 | ||
|   // anonymous define() is called outside of a loader request.
 | ||
|   if (typeof define === 'function' && define.amd) {
 | ||
|     define('underscore', [], function() {
 | ||
|       return _;
 | ||
|     });
 | ||
|   }
 | ||
| }.call(this));
 | ||
| 
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 941:
 | ||
| /***/ (function(__unusedmodule, exports, __webpack_require__) {
 | ||
| 
 | ||
| "use strict";
 | ||
| 
 | ||
| Object.defineProperty(exports, "__esModule", { value: true });
 | ||
| var basiccreds_1 = __webpack_require__(12);
 | ||
| exports.BasicCredentialHandler = basiccreds_1.BasicCredentialHandler;
 | ||
| var bearertoken_1 = __webpack_require__(571);
 | ||
| exports.BearerCredentialHandler = bearertoken_1.BearerCredentialHandler;
 | ||
| var ntlm_1 = __webpack_require__(525);
 | ||
| exports.NtlmCredentialHandler = ntlm_1.NtlmCredentialHandler;
 | ||
| var personalaccesstoken_1 = __webpack_require__(327);
 | ||
| exports.PersonalAccessTokenCredentialHandler = personalaccesstoken_1.PersonalAccessTokenCredentialHandler;
 | ||
| 
 | ||
| 
 | ||
| /***/ }),
 | ||
| 
 | ||
| /***/ 986:
 | ||
| /***/ (function(__unusedmodule, exports, __webpack_require__) {
 | ||
| 
 | ||
| "use strict";
 | ||
| 
 | ||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
 | ||
|     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
 | ||
|     return new (P || (P = Promise))(function (resolve, reject) {
 | ||
|         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
 | ||
|         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
 | ||
|         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
 | ||
|         step((generator = generator.apply(thisArg, _arguments || [])).next());
 | ||
|     });
 | ||
| };
 | ||
| Object.defineProperty(exports, "__esModule", { value: true });
 | ||
| const tr = __webpack_require__(9);
 | ||
| /**
 | ||
|  * Exec a command.
 | ||
|  * Output will be streamed to the live console.
 | ||
|  * Returns promise with return code
 | ||
|  *
 | ||
|  * @param     commandLine        command to execute (can include additional args). Must be correctly escaped.
 | ||
|  * @param     args               optional arguments for tool. Escaping is handled by the lib.
 | ||
|  * @param     options            optional exec options.  See ExecOptions
 | ||
|  * @returns   Promise<number>    exit code
 | ||
|  */
 | ||
| function exec(commandLine, args, options) {
 | ||
|     return __awaiter(this, void 0, void 0, function* () {
 | ||
|         const commandArgs = tr.argStringToArray(commandLine);
 | ||
|         if (commandArgs.length === 0) {
 | ||
|             throw new Error(`Parameter 'commandLine' cannot be null or empty.`);
 | ||
|         }
 | ||
|         // Path to tool to execute should be first arg
 | ||
|         const toolPath = commandArgs[0];
 | ||
|         args = commandArgs.slice(1).concat(args || []);
 | ||
|         const runner = new tr.ToolRunner(toolPath, args, options);
 | ||
|         return runner.exec();
 | ||
|     });
 | ||
| }
 | ||
| exports.exec = exec;
 | ||
| //# sourceMappingURL=exec.js.map
 | ||
| 
 | ||
| /***/ })
 | ||
| 
 | ||
| /******/ }); |