text: d' option is not supplied, dest.end() will be called when
    // source gets the 'end' or 'close' events.  Only dest.end() once.
    if (!dest._isStdio && (!options || options.end !== false)) {
      source.on('end', onend);
      source.on('close', onclose);
    }
  
    var didOnEnd = false;
    function onend() {
      if (didOnEnd) return;
      didOnEnd = true;
  
      dest.end();
    }
  
  
    function onclose() {
      if (didOnEnd) return;
      didOnEnd = true;
  
      if (typeof dest.destroy === 'function') dest.destroy();
    }
  
    // don't leave dangling pipes when there are errors.
    function onerror(er) {
      cleanup();
      if (EE.listenerCount(this, 'error') === 0) {
        throw er; // Unhandled stream error in pipe.
      }
    }
  
    source.on('error', onerror);
    dest.on('error', onerror);
  
    // remove all the event listeners that were added.
    function cleanup() {
      source.removeListener('data', ondata);
      dest.removeListener('drain', ondrain);
  
      source.removeListener('end', onend);
      source.removeListener('close', onclose);
  
      source.removeListener('error', onerror);
      dest.removeListener('error', onerror);
  
      source.removeListener('end', cleanup);
      source.removeListener('close', cleanup);
  
      dest.removeListener('close', cleanup);
    }
  
    source.on('end', cleanup);
    source.on('close', cleanup);
  
    dest.on('close', cleanup);
  
    dest.emit('pipe', source);
  
    // Allow for unix-like usage: A.pipe(B).pipe(C)
    return dest;
  };
  
  },{"events":34,"inherits":36,"readable-stream/duplex.js":52,"readable-stream/passthrough.js":60,"readable-stream/readable.js":61,"readable-stream/transform.js":62,"readable-stream/writable.js":63}],65:[function(require,module,exports){
  'use strict';
  
  var Buffer = require('buffer').Buffer;
  var bufferShim = require('buffer-shims');
  
  var isEncoding = Buffer.isEncoding || function (encoding) {
    encoding = '' + encoding;
    switch (encoding && encoding.toLowerCase()) {
      case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':
        return true;
      default:
        return false;
    }
  };
  
  function _normalizeEncoding(enc) {
    if (!enc) return 'utf8';
    var retried;
    while (true) {
      switch (enc) {
        case 'utf8':
        case 'utf-8':
          return 'utf8';
        case 'ucs2':
        case 'ucs-2':
        case 'utf16le':
        case 'utf-16le':
          return 'utf16le';
        case 'latin1':
        case 'binary':
          return 'latin1';
        case 'base64':
        case 'ascii':
        case 'hex':
          return enc;
        default:
          if (retried) return; // undefined
          enc = ('' + enc).toLowerCase();
          retried = true;
      }
    }
  };
  
  // Do not cache `Buffer.isEncoding` when checking encoding names as some
  // modules monkey-patch it to support additional encodings
  function normalizeEncoding(enc) {
    var nenc = _normalizeEncoding(enc);
    if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);
    return nenc || enc;
  }
  
  // StringDecoder provides an interface for efficiently splitting a series of
  // buffers into a series of JS strings without breaking apart multi-byte
  // characters.
  exports.StringDecoder = StringDecoder;
  function StringDecoder(encoding) {
    this.encoding = normalizeEncoding(encoding);
    var nb;
    switch (this.encoding) {
      case 'utf16le':
        this.text = utf16Text;
        this.end = utf16End;
        nb = 4;
        break;
      case 'utf8':
        this.fillLast = utf8FillLast;
        nb = 4;
        break;
      case 'base64':
        this.text = base64Text;
        this.end = base64End;
        nb = 3;
        break;
      default:
        this.write = simpleWrite;
        this.end = simpleEnd;
        return;
    }
    this.lastNeed = 0;
    this.lastTotal = 0;
    this.lastChar = bufferShim.allocUnsafe(nb);
  }
  
  StringDecoder.prototype.write = function (buf) {
    if (buf.length === 0) return '';
    var r;
    var i;
    if (this.lastNeed) {
      r = this.fillLast(buf);
      if (r === undefined) return '';
      i = this.lastNeed;
      this.lastNeed = 0;
    } else {
      i = 0;
    }
    if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);
    return r || '';
  };
  
  StringDecoder.prototype.end = utf8End;
  
  // Returns only complete characters in a Buffer
  StringDecoder.prototype.text = utf8Text;
  
  // Attempts to complete a partial non-UTF-8 character using bytes from a Buffer
  StringDecoder.prototype.fillLast = function (buf) {
    if (this.lastNeed <= buf.length) {
      buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);
      return this.lastChar.toString(this.encoding, 0, this.lastTotal);
    }
    buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);
    this.lastNeed -= buf.length;
  };
  
  // Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
  // continuation byte.
  function utf8CheckByte(byte) {
    if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;
    return -1;
  }
  
  // Checks at most 3 bytes at the end of a Buffer in order to detect an
  // incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)
  // needed to complete the UTF-8 character (if applicable) are returned.
  function utf8CheckIncomplete(self, buf, i) {
    var j = buf.length - 1;
    if (j < i) return 0;
    var nb = utf8CheckByte(buf[j]);
    if (nb >= 0) {
      if (nb > 0) self.lastNeed = nb - 1;
      return nb;
    }
    if (--j < i) return 0;
    nb = utf8CheckByte(buf[j]);
    if (nb >= 0) {
      if (nb > 0) self.lastNeed = nb - 2;
      return nb;
    }
    if (--j < i) return 0;
    nb = utf8CheckByte(buf[j]);
    if (nb >= 0) {
      if (nb > 0) {
        if (nb === 2) nb = 0;else self.lastNeed = nb - 3;
      }
      return nb;
    }
    return 0;
  }
  
  // Validates as many continuation bytes for a multi-byte UTF-8 character as
  // needed or are available. If we see a non-continuation byte where we expect
  // one, we "replace" the validated continuation bytes we've seen so far with
  // UTF-8 replacement characters ('\ufffd'), to match v8's UTF-8 decoding
  // behavior. The continuation byte check is included three times in the case
  // where all of the continuation bytes for a character exist in the same buffer.
  // It is also done this way as a slight performance increase instead of using a
  // loop.
  function utf8CheckExtraBytes(self, buf, p) {
    if ((buf[0] & 0xC0) !== 0x80) {
      self.lastNeed = 0;
      return '\ufffd'.repeat(p);
    }
    if (self.lastNeed > 1 && buf.length > 1) {
      if ((buf[1] & 0xC0) !== 0x80) {
        self.lastNeed = 1;
        return '\ufffd'.repeat(p + 1);
      }
      if (self.lastNeed > 2 && buf.length > 2) {
        if ((buf[2] & 0xC0) !== 0x80) {
          self.lastNeed = 2;
          return '\ufffd'.repeat(p + 2);
        }
      }
    }
  }
  
  // Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.
  function utf8FillLast(buf) {
    var p = this.lastTotal - this.lastNeed;
    var r = utf8CheckExtraBytes(this, buf, p);
    if (r !== undefined) return r;
    if (this.lastNeed <= buf.length) {
      buf.copy(this.lastChar, p, 0, this.lastNeed);
      return this.lastChar.toString(this.encoding, 0, this.lastTotal);
    }
    buf.copy(this.lastChar, p, 0, buf.length);
    this.lastNeed -= buf.length;
  }
  
  // Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a
  // partial character, the character's bytes are buffered until the required
  // number of bytes are available.
  function utf8Text(buf, i) {
    var total = utf8CheckIncomplete(this, buf, i);
    if (!this.lastNeed) return buf.toString('utf8', i);
    this.lastTotal = total;
    var end = buf.length - (total - this.lastNeed);
    buf.copy(this.lastChar, 0, end);
    return buf.toString('utf8', i, end);
  }
  
  // For UTF-8, a replacement character for each buffered byte of a (partial)
  // character needs to be added to the output.
  function utf8End(buf) {
    var r = buf && buf.length ? this.write(buf) : '';
    if (this.lastNeed) return r + '\ufffd'.repeat(this.lastTotal - this.lastNeed);
    return r;
  }
  
  // UTF-16LE typically needs two bytes per character, but even if we have an even
  // number of bytes available, we need to check if we end on a leading/high
  // surrogate. In that case, we need to wait for the next two bytes in order to
  // decode the last character properly.
  function utf16Text(buf, i) {
    if ((buf.length - i) % 2 === 0) {
      var r = buf.toString('utf16le', i);
      if (r) {
        var c = r.charCodeAt(r.length - 1);
        if (c >= 0xD800 && c <= 0xDBFF) {
          this.lastNeed = 2;
          this.lastTotal = 4;
          this.lastChar[0] = buf[buf.length - 2];
          this.lastChar[1] = buf[buf.length - 1];
          return r.slice(0, -1);
        }
      }
      return r;
    }
    this.lastNeed = 1;
    this.lastTotal = 2;
    this.lastChar[0] = buf[buf.length - 1];
    return buf.toString('utf16le', i, buf.length - 1);
  }
  
  // For UTF-16LE we do not explicitly append special replacement characters if we
  // end on a partial character, we simply let v8 handle that.
  function utf16End(buf) {
    var r = buf && buf.length ? this.write(buf) : '';
    if (this.lastNeed) {
      var end = this.lastTotal - this.lastNeed;
      return r + this.lastChar.toString('utf16le', 0, end);
    }
    return r;
  }
  
  function base64Text(buf, i) {
    var n = (buf.length - i) % 3;
    if (n === 0) return buf.toString('base64', i);
    this.lastNeed = 3 - n;
    this.lastTotal = 3;
    if (n === 1) {
      this.lastChar[0] = buf[buf.length - 1];
    } else {
      this.lastChar[0] = buf[buf.length - 2];
      this.lastChar[1] = buf[buf.length - 1];
    }
    return buf.toString('base64', i, buf.length - n);
  }
  
  function base64End(buf) {
    var r = buf && buf.length ? this.write(buf) : '';
    if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);
    return r;
  }
  
  // Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)
  function simpleWrite(buf) {
    return buf.toString(this.encoding);
  }
  
  function simpleEnd(buf) {
    return buf && buf.length ? this.write(buf) : '';
  }
  },{"buffer":32,"buffer-shims":31}],66:[function(require,module,exports){
  (function (setImmediate,clearImmediate){
  var nextTick = require('process/browser.js').nextTick;
  var apply = Function.prototype.apply;
  var slice = Array.prototype.slice;
  var immediateIds = {};
  var nextImmediateId = 0;
  
  // DOM APIs, for completeness
  
  exports.setTimeout = function() {
    return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);
  };
  exports.setInterval = function() {
    return new Timeout(apply.call(setInterval, window, arguments), clearInterval);
  };
  exports.clearTimeout =
  exports.clearInterval = function(timeout) { timeout.close(); };
  
  function Timeout(id, clearFn) {
    this._id = id;
    this._clearFn = clearFn;
  }
  Timeout.prototype.unref = Timeout.prototype.ref = function() {};
  Timeout.prototype.close = function() {
    this._clearFn.call(window, this._id);
  };
  
  // Does not start the time, just sets up the members needed.
  exports.enroll = function(item, msecs) {
    clearTimeout(item._idleTimeoutId);
    item._idleTimeout = msecs;
  };
  
  exports.unenroll = function(item) {
    clearTimeout(item._idleTimeoutId);
    item._idleTimeout = -1;
  };
  
  exports._unrefActive = exports.active = function(item) {
    clearTimeout(item._idleTimeoutId);
  
    var msecs = item._idleTimeout;
    if (msecs >= 0) {
      item._idleTimeoutId = setTimeout(function onTimeout() {
        if (item._onTimeout)
          item._onTimeout();
      }, msecs);
    }
  };
  
  // That's not how node.js implements it but the exposed api is the same.
  exports.setImmediate = typeof setImmediate === "function" ? setImmediate : function(fn) {
    var id = nextImmediateId++;
    var args = arguments.length < 2 ? false : slice.call(arguments, 1);
  
    immediateIds[id] = true;
  
    nextTick(function onNextTick() {
      if (immediateIds[id]) {
        // fn.call() is faster so we optimize for the common use-case
        // @see http://jsperf.com/call-apply-segu
        if (args) {
          fn.apply(null, args);
        } else {
          fn.call(null);
        }
        // Prevent ids from leaking
        exports.clearImmediate(id);
      }
    });
  
    return id;
  };
  
  exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate : function(id) {
    delete immediateIds[id];
  };
  }).call(this,require("timers").setImmediate,require("timers").clearImmediate)
  },{"process/browser.js":51,"timers":66}],67:[function(require,module,exports){
  (function (global){
  
  /**
   * Module exports.
   */
  
  module.exports = deprecate;
  
  /**
   * Mark that a method should not be used.
   * Returns a modified function which warns once by default.
   *
   * If `localStorage.noDeprecation = true` is set, then it is a no-op.
   *
   * If `localStorage.throwDeprecation = true` is set, then deprecated functions
   * will throw an Error when invoked.
   *
   * If `localStorage.traceDeprecation = true` is set, then deprecated functions
   * will invoke `console.trace()` instead of `console.error()`.
   *
   * @param {Function} fn - the function to deprecate
   * @param {String} msg - the string to print to the console when `fn` is invoked
   * @returns {Function} a new "deprecated" version of `fn`
   * @api public
   */
  
  function deprecate (fn, msg) {
    if (config('noDeprecation')) {
      return fn;
    }
  
    var warned = false;
    function deprecated() {
      if (!warned) {
        if (config('throwDeprecation')) {
          throw new Error(msg);
        } else if (config('traceDeprecation')) {
          console.trace(msg);
        } else {
          console.warn(msg);
        }
        warned = true;
      }
      return fn.apply(this, arguments);
    }
  
    return deprecated;
  }
  
  /**
   * Checks `localStorage` for boolean values for the given `name`.
   *
   * @param {String} name
   * @returns {Boolean}
   * @api private
   */
  
  function config (name) {
    // accessing global.localStorage can trigger a DOMException in sandboxed iframes
    try {
      if (!global.localStorage) return false;
    } catch (_) {
      return false;
    }
    var val = global.localStorage[name];
    if (null == val) return false;
    return String(val).toLowerCase() === 'true';
  }
  
  }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
  },{}],68:[function(require,module,exports){
  arguments[4][25][0].apply(exports,arguments)
  },{"dup":25}],69:[function(require,module,exports){
  arguments[4][26][0].apply(exports,arguments)
  },{"./support/isBuffer":68,"_process":51,"dup":26,"inherits":36}]},{},[20])(20)
  });
  (function webpackUniversalModuleDefinition(root, factory) {
  	if(typeof exports === 'object' && typeof module === 'object')
  		module.exports = factory();
  	else if(typeof define === 'function' && define.amd)
  		define([], factory);
  	else if(typeof exports === 'object')
  		exports["sourceMap"] = factory();
  	else
  		root["sourceMap"] = factory();
  })(this, function() {
  return /******/ (function(modules) { // webpackBootstrap
  /******/ 	// 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] = {
  /******/ 			exports: {},
  /******/ 			id: moduleId,
  /******/ 			loaded: false
  /******/ 		};
  /******/
  /******/ 		// Execute the module function
  /******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
  /******/
  /******/ 		// Flag the module as loaded
  /******/ 		module.loaded = true;
  /******/
  /******/ 		// Return the exports of the module
  /******/ 		return module.exports;
  /******/ 	}
  /******/
  /******/
  /******/ 	// expose the modules object (__webpack_modules__)
  /******/ 	__webpack_require__.m = modules;
  /******/
  /******/ 	// expose the module cache
  /******/ 	__webpack_require__.c = installedModules;
  /******/
  /******/ 	// __webpack_public_path__
  /******/ 	__webpack_require__.p = "";
  /******/
  /******/ 	// Load entry module and return exports
  /******/ 	return __webpack_require__(0);
  /******/ })
  /************************************************************************/
  /******/ ([
  /* 0 */
  /***/ (function(module, exports, __webpack_require__) {
  
  	/*
  	 * Copyright 2009-2011 Mozilla Foundation and contributors
  	 * Licensed under the New BSD license. See LICENSE.txt or:
  	 * http://opensource.org/licenses/BSD-3-Clause
  	 */
  	exports.SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;
  	exports.SourceMapConsumer = __webpack_require__(7).SourceMapConsumer;
  	exports.SourceNode = __webpack_require__(10).SourceNode;
  
  
  /***/ }),
  /* 1 */
  /***/ (function(module, exports, __webpack_require__) {
  
  	/* -*- Mode: js; js-indent-level: 2; -*- */
  	/*
  	 * Copyright 2011 Mozilla Foundation and contributors
  	 * Licensed under the New BSD license. See LICENSE or:
  	 * http://opensource.org/licenses/BSD-3-Clause
  	 */
  	
  	var base64VLQ = __webpack_require__(2);
  	var util = __webpack_require__(4);
  	var ArraySet = __webpack_require__(5).ArraySet;
  	var MappingList = __webpack_require__(6).MappingList;
  	
  	/**
  	 * An instance of the SourceMapGenerator represents a source map which is
  	 * being built incrementally. You may pass an object with the following
  	 * properties:
  	 *
  	 *   - file: The filename of the generated source.
  	 *   - sourceRoot: A root for all relative URLs in this source map.
  	 */
  	function SourceMapGenerator(aArgs) {
  	  if (!aArgs) {
  	    aArgs = {};
  	  }
  	  this._file = util.getArg(aArgs, 'file', null);
  	  this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);
  	  this._skipValidation = util.getArg(aArgs, 'skipValidation', false);
  	  this._sources = new ArraySet();
  	  this._names = new ArraySet();
  	  this._mappings = new MappingList();
  	  this._sourcesContents = null;
  	}
  	
  	SourceMapGenerator.prototype._version = 3;
  	
  	/**
  	 * Creates a new SourceMapGenerator based on a SourceMapConsumer
  	 *
  	 * @param aSourceMapConsumer The SourceMap.
  	 */
  	SourceMapGenerator.fromSourceMap =
  	  function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {
  	    var sourceRoot = aSourceMapConsumer.sourceRoot;
  	    var generator = new SourceMapGenerator({
  	      file: aSourceMapConsumer.file,
  	      sourceRoot: sourceRoot
  	    });
  	    aSourceMapConsumer.eachMapping(function (mapping) {
  	      var newMapping = {
  	        generated: {
  	          line: mapping.generatedLine,
  	          column: mapping.generatedColumn
  	        }
  	      };
  	
  	      if (mapping.source != null) {
  	        newMapping.source = mapping.source;
  	        if (sourceRoot != null) {
  	          newMapping.source = util.relative(sourceRoot, newMapping.source);
  	        }
  	
  	        newMapping.original = {
  	          line: mapping.originalLine,
  	          column: mapping.originalColumn
  	        };
  	
  	        if (mapping.name != null) {
  	          newMapping.name = mapping.name;
  	        }
  	      }
  	
  	      generator.addMapping(newMapping);
  	    });
  	    aSourceMapConsumer.sources.forEach(function (sourceFile) {
  	      var sourceRelative = sourceFile;
  	      if (sourceRoot !== null) {
  	        sourceRelative = util.relative(sourceRoot, sourceFile);
  	      }
  	
  	      if (!generator._sources.has(sourceRelative)) {
  	        generator._sources.add(sourceRelative);
  	      }
  	
  	      var content = aSourceMapConsumer.sourceContentFor(sourceFile);
  	      if (content != null) {
  	        generator.setSourceContent(sourceFile, content);
  	      }
  	    });
  	    return generator;
  	  };
  	
  	/**
  	 * Add a single mapping from original source line and column to the generated
  	 * source's line and column for this source map being created. The mapping
  	 * object should have the following properties:
  	 *
  	 *   - generated: An object with the generated line and column positions.
  	 *   - original: An object with the original line and column positions.
  	 *   - source: The original source file (relative to the sourceRoot).
  	 *   - name: An optional original token name for this mapping.
  	 */
  	SourceMapGenerator.prototype.addMapping =
  	  function SourceMapGenerator_addMapping(aArgs) {
  	    var generated = util.getArg(aArgs, 'generated');
  	    var original = util.getArg(aArgs, 'original', null);
  	    var source = util.getArg(aArgs, 'source', null);
  	    var name = util.getArg(aArgs, 'name', null);
  	
  	    if (!this._skipValidation) {
  	      this._validateMapping(generated, original, source, name);
  	    }
  	
  	    if (source != null) {
  	      source = String(source);
  	      if (!this._sources.has(source)) {
  	        this._sources.add(source);
  	      }
  	    }
  	
  	    if (name != null) {
  	      name = String(name);
  	      if (!this._names.has(name)) {
  	        this._names.add(name);
  	      }
  	    }
  	
  	    this._mappings.add({
  	      generatedLine: generated.line,
  	      generatedColumn: generated.column,
  	      originalLine: original != null && original.line,
  	      originalColumn: original != null && original.column,
  	      source: source,
  	      name: name
  	    });
  	  };
  	
  	/**
  	 * Set the source content for a source file.
  	 */
  	SourceMapGenerator.prototype.setSourceContent =
  	  function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {
  	    var source = aSourceFile;
  	    if (this._sourceRoot != null) {
  	      source = util.relative(this._sourceRoot, source);
  	    }
  	
  	    if (aSourceContent != null) {
  	      // Add the source content to the _sourcesContents map.
  	      // Create a new _sourcesContents map if the property is null.
  	      if (!this._sourcesContents) {
  	        this._sourcesContents = Object.create(null);
  	      }
  	      this._sourcesContents[util.toSetString(source)] = aSourceContent;
  	    } else if (this._sourcesContents) {
  	      // Remove the source file from the _sourcesContents map.
  	      // If the _sourcesContents map is empty, set the property to null.
  	      delete this._sourcesContents[util.toSetString(source)];
  	      if (Object.keys(this._sourcesContents).length === 0) {
  	        this._sourcesContents = null;
  	      }
  	    }
  	  };
  	
  	/**
  	 * Applies the mappings of a sub-source-map for a specific source file to the
  	 * source map being generated. Each mapping to the supplied source file is
  	 * rewritten using the supplied source map. Note: The resolution for the
  	 * resulting mappings is the minimium of this map and the supplied map.
  	 *
  	 * @param aSourceMapConsumer The source map to be applied.
  	 * @param aSourceFile Optional. The filename of the source file.
  	 *        If omitted, SourceMapConsumer's file property will be used.
  	 * @param aSourceMapPath Optional. The dirname of the path to the source map
  	 *        to be applied. If relative, it is relative to the SourceMapConsumer.
  	 *        This parameter is needed when the two source maps aren't in the same
  	 *        directory, and the source map to be applied contains relative source
  	 *        paths. If so, those relative source paths need to be rewritten
  	 *        relative to the SourceMapGenerator.
  	 */
  	SourceMapGenerator.prototype.applySourceMap =
  	  function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {
  	    var sourceFile = aSourceFile;
  	    // If aSourceFile is omitted, we will use the file property of the SourceMap
  	    if (aSourceFile == null) {
  	      if (aSourceMapConsumer.file == null) {
  	        throw new Error(
  	          'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +
  	          'or the source map\'s "file" property. Both were omitted.'
  	        );
  	      }
  	      sourceFile = aSourceMapConsumer.file;
  	    }
  	    var sourceRoot = this._sourceRoot;
  	    // Make "sourceFile" relative if an absolute Url is passed.
  	    if (sourceRoot != null) {
  	      sourceFile = util.relative(sourceRoot, sourceFile);
  	    }
  	    // Applying the SourceMap can add and remove items from the sources and
  	    // the names array.
  	    var newSources = new ArraySet();
  	    var newNames = new ArraySet();
  	
  	    // Find mappings for the "sourceFile"
  	    this._mappings.unsortedForEach(function (mapping) {
  	      if (mapping.source === sourceFile && mapping.originalLine != null) {
  	        // Check if it can be mapped by the source map, then update the mapping.
  	        var original = aSourceMapConsumer.originalPositionFor({
  	          line: mapping.originalLine,
  	          column: mapping.originalColumn
  	        });
  	        if (original.source != null) {
  	          // Copy mapping
  	          mapping.source = original.source;
  	          if (aSourceMapPath != null) {
  	            mapping.source = util.join(aSourceMapPath, mapping.source)
  	          }
  	          if (sourceRoot != null) {
  	            mapping.source = util.relative(sourceRoot, mapping.source);
  	          }
  	          mapping.originalLine = original.line;
  	          mapping.originalColumn = original.column;
  	          if (original.name != null) {
  	            mapping.name = original.name;
  	          }
  	        }
  	      }
  	
  	      var source = mapping.source;
  	      if (source != null && !newSources.has(source)) {
  	        newSources.add(source);
  	      }
  	
  	      var name = mapping.name;
  	      if (name != null && !newNames.has(name)) {
  	        newNames.add(name);
  	      }
  	
  	    }, this);
  	    this._sources = newSources;
  	    this._names = newNames;
  	
  	    // Copy sourcesContents of applied map.
  	    aSourceMapConsumer.sources.forEach(function (sourceFile) {
  	      var content = aSourceMapConsumer.sourceContentFor(sourceFile);
  	      if (content != null) {
  	        if (aSourceMapPath != null) {
  	          sourceFile = util.join(aSourceMapPath, sourceFile);
  	        }
  	        if (sourceRoot != null) {
  	          sourceFile = util.relative(sourceRoot, sourceFile);
  	        }
  	        this.setSourceContent(sourceFile, content);
  	      }
  	    }, this);
  	  };
  	
  	/**
  	 * A mapping can have one of the three levels of data:
  	 *
  	 *   1. Just the generated position.
  	 *   2. The Generated position, original position, and original source.
  	 *   3. Generated and original position, original source, as well as a name
  	 *      token.
  	 *
  	 * To maintain consistency, we validate that any new mapping being added falls
  	 * in to one of these categories.
  	 */
  	SourceMapGenerator.prototype._validateMapping =
  	  function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,
  	                                              aName) {
  	    // When aOriginal is truthy but has empty values for .line and .column,
  	    // it is most likely a programmer error. In this case we throw a very
  	    // specific error message to try to guide them the right way.
  	    // For example: https://github.com/Polymer/polymer-bundler/pull/519
  	    if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {
  	        throw new Error(
  	            'original.line and original.column are not numbers -- you probably meant to omit ' +
  	            'the original mapping entirely and only map the generated position. If so, pass ' +
  	            'null for the original mapping instead of an object with empty or null values.'
  	        );
  	    }
  	
  	    if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
  	        && aGenerated.line > 0 && aGenerated.column >= 0
  	        && !aOriginal && !aSource && !aName) {
  	      // Case 1.
  	      return;
  	    }
  	    else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
  	             && aOriginal && 'line' in aOriginal && 'column' in aOriginal
  	             && aGenerated.line > 0 && aGenerated.column >= 0
  	             && aOriginal.line > 0 && aOriginal.column >= 0
  	             && aSource) {
  	      // Cases 2 and 3.
  	      return;
  	    }
  	    else {
  	      throw new Error('Invalid mapping: ' + JSON.stringify({
  	        generated: aGenerated,
  	        source: aSource,
  	        original: aOriginal,
  	        name: aName
  	      }));
  	    }
  	  };
  	
  	/**
  	 * Serialize the accumulated mappings in to the stream of base 64 VLQs
  	 * specified by the source map format.
  	 */
  	SourceMapGenerator.prototype._serializeMappings =
  	  function SourceMapGenerator_serializeMappings() {
  	    var previousGeneratedColumn = 0;
  	    var previousGeneratedLine = 1;
  	    var previousOriginalColumn = 0;
  	    var previousOriginalLine = 0;
  	    var previousName = 0;
  	    var previousSource = 0;
  	    var result = '';
  	    var next;
  	    var mapping;
  	    var nameIdx;
  	    var sourceIdx;
  	
  	    var mappings = this._mappings.toArray();
  	    for (var i = 0, len = mappings.length; i < len; i++) {
  	      mapping = mappings[i];
  	      next = ''
  	
  	      if (mapping.generatedLine !== previousGeneratedLine) {
  	        previousGeneratedColumn = 0;
  	        while (mapping.generatedLine !== previousGeneratedLine) {
  	          next += ';';
  	          previousGeneratedLine++;
  	        }
  	      }
  	      else {
  	        if (i > 0) {
  	          if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {
  	            continue;
  	          }
  	          next += ',';
  	        }
  	      }
  	
  	      next += base64VLQ.encode(mapping.generatedColumn
  	                                 - previousGeneratedColumn);
  	      previousGeneratedColumn = mapping.generatedColumn;
  	
  	      if (mapping.source != null) {
  	        sourceIdx = this._sources.indexOf(mapping.source);
  	        next += base64VLQ.encode(sourceIdx - previousSource);
  	        previousSource = sourceIdx;
  	
  	        // lines are stored 0-based in SourceMap spec version 3
  	        next += base64VLQ.encode(mapping.originalLine - 1
  	                                   - previousOriginalLine);
  	        previousOriginalLine = mapping.originalLine - 1;
  	
  	        next += base64VLQ.encode(mapping.originalColumn
  	                                   - previousOriginalColumn);
  	        previousOriginalColumn = mapping.originalColumn;
  	
  	        if (mapping.name != null) {
  	          nameIdx = this._names.indexOf(mapping.name);
  	          next += base64VLQ.encode(nameIdx - previousName);
  	          previousName = nameIdx;
  	        }
  	      }
  	
  	      result += next;
  	    }
  	
  	    return result;
  	  };
  	
  	SourceMapGenerator.prototype._generateSourcesContent =
  	  function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {
  	    return aSources.map(function (source) {
  	      if (!this._sourcesContents) {
  	        return null;
  	      }
  	      if (aSourceRoot != null) {
  	        source = util.relative(aSourceRoot, source);
  	      }
  	      var key = util.toSetString(source);
  	      return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)
  	        ? this._sourcesContents[key]
  	        : null;
  	    }, this);
  	  };
  	
  	/**
  	 * Externalize the source map.
  	 */
  	SourceMapGenerator.prototype.toJSON =
  	  function SourceMapGenerator_toJSON() {
  	    var map = {
  	      version: this._version,
  	      sources: this._sources.toArray(),
  	      names: this._names.toArray(),
  	      mappings: this._serializeMappings()
  	    };
  	    if (this._file != null) {
  	      map.file = this._file;
  	    }
  	    if (this._sourceRoot != null) {
  	      map.sourceRoot = this._sourceRoot;
  	    }
  	    if (this._sourcesContents) {
  	      map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);
  	    }
  	
  	    return map;
  	  };
  	
  	/**
  	 * Render the source map being generated to a string.
  	 */
  	SourceMapGenerator.prototype.toString =
  	  function SourceMapGenerator_toString() {
  	    return JSON.stringify(this.toJSON());
  	  };
  	
  	exports.SourceMapGenerator = SourceMapGenerator;
  
  
  /***/ }),
  /* 2 */
  /***/ (function(module, exports, __webpack_require__) {
  
  	/* -*- Mode: js; js-indent-level: 2; -*- */
  	/*
  	 * Copyright 2011 Mozilla Foundation and contributors
  	 * Licensed under the New BSD license. See LICENSE or:
  	 * http://opensource.org/licenses/BSD-3-Clause
  	 *
  	 * Based on the Base 64 VLQ implementation in Closure Compiler:
  	 * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java
  	 *
  	 * Copyright 2011 The Closure Compiler Authors. All rights reserved.
  	 * Redistribution and use in source and binary forms, with or without
  	 * modification, are permitted provided that the following conditions are
  	 * met:
  	 *
  	 *  * Redistributions of source code must retain the above copyright
  	 *    notice, this list of conditions and the following disclaimer.
  	 *  * Redistributions in binary form must reproduce the above
  	 *    copyright notice, this list of conditions and the following
  	 *    disclaimer in the documentation and/or other materials provided
  	 *    with the distribution.
  	 *  * Neither the name of Google Inc. nor the names of its
  	 *    contributors may be used to endorse or promote products derived
  	 *    from this software without specific prior written permission.
  	 *
  	 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  	 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  	 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  	 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  	 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  	 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  	 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  	 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  	 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  	 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  	 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  	 */
  	
  	var base64 = __webpack_require__(3);
  	
  	// A single base 64 digit can contain 6 bits of data. For the base 64 variable
  	// length quantities we use in the source map spec, the first bit is the sign,
  	// the next four bits are the actual value, and the 6th bit is the
  	// continuation bit. The continuation bit tells us whether there are more
  	// digits in this value following this digit.
  	//
  	//   Continuation
  	//   |    Sign
  	//   |    |
  	//   V    V
  	//   101011
  	
  	var VLQ_BASE_SHIFT = 5;
  	
  	// binary: 100000
  	var VLQ_BASE = 1 << VLQ_BASE_SHIFT;
  	
  	// binary: 011111
  	var VLQ_BASE_MASK = VLQ_BASE - 1;
  	
  	// binary: 100000
  	var VLQ_CONTINUATION_BIT = VLQ_BASE;
  	
  	/**
  	 * Converts from a two-complement value to a value where the sign bit is
  	 * placed in the least significant bit.  For example, as decimals:
  	 *   1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
  	 *   2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
  	 */
  	function toVLQSigned(aValue) {
  	  return aValue < 0
  	    ? ((-aValue) << 1) + 1
  	    : (aValue << 1) + 0;
  	}
  	
  	/**
  	 * Converts to a two-complement value from a value where the sign bit is
  	 * placed in the least significant bit.  For example, as decimals:
  	 *   2 (10 binary) becomes 1, 3 (11 binary) becomes -1
  	 *   4 (100 binary) becomes 2, 5 (101 binary) becomes -2
  	 */
  	function fromVLQSigned(aValue) {
  	  var isNegative = (aValue & 1) === 1;
  	  var shifted = aValue >> 1;
  	  return isNegative
  	    ? -shifted
  	    : shifted;
  	}
  	
  	/**
  	 * Returns the base 64 VLQ encoded value.
  	 */
  	exports.encode = function base64VLQ_encode(aValue) {
  	  var encoded = "";
  	  var digit;
  	
  	  var vlq = toVLQSigned(aValue);
  	
  	  do {
  	    digit = vlq & VLQ_BASE_MASK;
  	    vlq >>>= VLQ_BASE_SHIFT;
  	    if (vlq > 0) {
  	      // There are still more digits in this value, so we must make sure the
  	      // continuation bit is marked.
  	      digit |= VLQ_CONTINUATION_BIT;
  	    }
  	    encoded += base64.encode(digit);
  	  } while (vlq > 0);
  	
  	  return encoded;
  	};
  	
  	/**
  	 * Decodes the next base 64 VLQ value from the given string and returns the
  	 * value and the rest of the string via the out parameter.
  	 */
  	exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {
  	  var strLen = aStr.length;
  	  var result = 0;
  	  var shift = 0;
  	  var continuation, digit;
  	
  	  do {
  	    if (aIndex >= strLen) {
  	      throw new Error("Expected more digits in base 64 VLQ value.");
  	    }
  	
  	    digit = base64.decode(aStr.charCodeAt(aIndex++));
  	    if (digit === -1) {
  	      throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1));
  	    }
  	
  	    continuation = !!(digit & VLQ_CONTINUATION_BIT);
  	    digit &= VLQ_BASE_MASK;
  	    result = result + (digit << shift);
  	    shift += VLQ_BASE_SHIFT;
  	  } while (continuation);
  	
  	  aOutParam.value = fromVLQSigned(result);
  	  aOutParam.rest = aIndex;
  	};
  
  
  /***/ }),
  /* 3 */
  /***/ (function(module, exports) {
  
  	/* -*- Mode: js; js-indent-level: 2; -*- */
  	/*
  	 * Copyright 2011 Mozilla Foundation and contributors
  	 * Licensed under the New BSD license. See LICENSE or:
  	 * http://opensource.org/licenses/BSD-3-Clause
  	 */
  	
  	var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
  	
  	/**
  	 * Encode an integer in the range of 0 to 63 to a single base 64 digit.
  	 */
  	exports.encode = function (number) {
  	  if (0 <= number && number < intToCharMap.length) {
  	    return intToCharMap[number];
  	  }
  	  throw new TypeError("Must be between 0 and 63: " + number);
  	};
  	
  	/**
  	 * Decode a single base 64 character code digit to an integer. Returns -1 on
  	 * failure.
  	 */
  	exports.decode = function (charCode) {
  	  var bigA = 65;     // 'A'
  	  var bigZ = 90;     // 'Z'
  	
  	  var littleA = 97;  // 'a'
  	  var littleZ = 122; // 'z'
  	
  	  var zero = 48;     // '0'
  	  var nine = 57;     // '9'
  	
  	  var plus = 43;     // '+'
  	  var slash = 47;    // '/'
  	
  	  var littleOffset = 26;
  	  var numberOffset = 52;
  	
  	  // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ
  	  if (bigA <= charCode && charCode <= bigZ) {
  	    return (charCode - bigA);
  	  }
  	
  	  // 26 - 51: abcdefghijklmnopqrstuvwxyz
  	  if (littleA <= charCode && charCode <= littleZ) {
  	    return (charCode - littleA + littleOffset);
  	  }
  	
  	  // 52 - 61: 0123456789
  	  if (zero <= charCode && charCode <= nine) {
  	    return (charCode - zero + numberOffset);
  	  }
  	
  	  // 62: +
  	  if (charCode == plus) {
  	    return 62;
  	  }
  	
  	  // 63: /
  	  if (charCode == slash) {
  	    return 63;
  	  }
  	
  	  // Invalid base64 digit.
  	  return -1;
  	};
  
  
  /***/ }),
  /* 4 */
  /***/ (function(module, exports) {
  
  	/* -*- Mode: js; js-indent-level: 2; -*- */
  	/*
  	 * Copyright 2011 Mozilla Foundation and contributors
  	 * Licensed under the New BSD license. See LICENSE or:
  	 * http://opensource.org/licenses/BSD-3-Clause
  	 */
  	
  	/**
  	 * This is a helper function for getting values from parameter/options
  	 * objects.
  	 *
  	 * @param args The object we are extracting values from
  	 * @param name The name of the property we are getting.
  	 * @param defaultValue An optional value to return if the property is missing
  	 * from the object. If this is not specified and the property is missing, an
  	 * error will be thrown.
  	 */
  	function getArg(aArgs, aName, aDefaultValue) {
  	  if (aName in aArgs) {
  	    return aArgs[aName];
  	  } else if (arguments.length === 3) {
  	    return aDefaultValue;
  	  } else {
  	    throw new Error('"' + aName + '" is a required argument.');
  	  }
  	}
  	exports.getArg = getArg;
  	
  	var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/;
  	var dataUrlRegexp = /^data:.+\,.+$/;
  	
  	function urlParse(aUrl) {
  	  var match = aUrl.match(urlRegexp);
  	  if (!match) {
  	    return null;
  	  }
  	  return {
  	    scheme: match[1],
  	    auth: match[2],
  	    host: match[3],
  	    port: match[4],
  	    path: match[5]
  	  };
  	}
  	exports.urlParse = urlParse;
  	
  	function urlGenerate(aParsedUrl) {
  	  var url = '';
  	  if (aParsedUrl.scheme) {
  	    url += aParsedUrl.scheme + ':';
  	  }
  	  url += '//';
  	  if (aParsedUrl.auth) {
  	    url += aParsedUrl.auth + '@';
  	  }
  	  if (aParsedUrl.host) {
  	    url += aParsedUrl.host;
  	  }
  	  if (aParsedUrl.port) {
  	    url += ":" + aParsedUrl.port
  	  }
  	  if (aParsedUrl.path) {
  	    url += aParsedUrl.path;
  	  }
  	  return url;
  	}
  	exports.urlGenerate = urlGenerate;
  	
  	/**
  	 * Normalizes a path, or the path portion of a URL:
  	 *
  	 * - Replaces consecutive slashes with one slash.
  	 * - Removes unnecessary '.' parts.
  	 * - Removes unnecessary '<dir>/..' parts.
  	 *
  	 * Based on code in the Node.js 'path' core module.
  	 *
  	 * @param aPath The path or url to normalize.
  	 */
  	function normalize(aPath) {
  	  var path = aPath;
  	  var url = urlParse(aPath);
  	  if (url) {
  	    if (!url.path) {
  	      return aPath;
  	    }
  	    path = url.path;
  	  }
  	  var isAbsolute = exports.isAbsolute(path);
  	
  	  var parts = path.split(/\/+/);
  	  for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {
  	    part = parts[i];
  	    if (part === '.') {
  	      parts.splice(i, 1);
  	    } else if (part === '..') {
  	      up++;
  	    } else if (up > 0) {
  	      if (part === '') {
  	        // The first part is blank if the path is absolute. Trying to go
  	        // above the root is a no-op. Therefore we can remove all '..' parts
  	        // directly after the root.
  	        parts.splice(i + 1, up);
  	        up = 0;
  	      } else {
  	        parts.splice(i, 2);
  	        up--;
  	      }
  	    }
  	  }
  	  path = parts.join('/');
  	
  	  if (path === '') {
  	    path = isAbsolute ? '/' : '.';
  	  }
  	
  	  if (url) {
  	    url.path = path;
  	    return urlGenerate(url);
  	  }
  	  return path;
  	}
  	exports.normalize = normalize;
  	
  	/**
  	 * Joins two paths/URLs.
  	 *
  	 * @param aRoot The root path or URL.
  	 * @param aPath The path or URL to be joined with the root.
  	 *
  	 * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a
  	 *   scheme-relative URL: Then the scheme of aRoot, if any, is prepended
  	 *   first.
  	 * - Otherwise aPath is a path. If aRoot is a URL, then its path portion
  	 *   is updated with the result and aRoot is returned. Otherwise the result
  	 *   is returned.
  	 *   - If aPath is absolute, the result is aPath.
  	 *   - Otherwise the two paths are joined with a slash.
  	 * - Joining for example 'http://' and 'www.example.com' is also supported.
  	 */
  	function join(aRoot, aPath) {
  	  if (aRoot === "") {
  	    aRoot = ".";
  	  }
  	  if (aPath === "") {
  	    aPath = ".";
  	  }
  	  var aPathUrl = urlParse(aPath);
  	  var aRootUrl = urlParse(aRoot);
  	  if (aRootUrl) {
  	    aRoot = aRootUrl.path || '/';
  	  }
  	
  	  // `join(foo, '//www.example.org')`
  	  if (aPathUrl && !aPathUrl.scheme) {
  	    if (aRootUrl) {
  	      aPathUrl.scheme = aRootUrl.scheme;
  	    }
  	    return urlGenerate(aPathUrl);
  	  }
  	
  	  if (aPathUrl || aPath.match(dataUrlRegexp)) {
  	    return aPath;
  	  }
  	
  	  // `join('http://', 'www.example.com')`
  	  if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {
  	    aRootUrl.host = aPath;
  	    return urlGenerate(aRootUrl);
  	  }
  	
  	  var joined = aPath.charAt(0) === '/'
  	    ? aPath
  	    : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath);
  	
  	  if (aRootUrl) {
  	    aRootUrl.path = joined;
  	    return urlGenerate(aRootUrl);
  	  }
  	  return joined;
  	}
  	exports.join = join;
  	
  	exports.isAbsolute = function (aPath) {
  	  return aPath.charAt(0) === '/' || urlRegexp.test(aPath);
  	};
  	
  	/**
  	 * Make a path relative to a URL or another path.
  	 *
  	 * @param aRoot The root path or URL.
  	 * @param aPath The path or URL to be made relative to aRoot.
  	 */
  	function relative(aRoot, aPath) {
  	  if (aRoot === "") {
  	    aRoot = ".";
  	  }
  	
  	  aRoot = aRoot.replace(/\/$/, '');
  	
  	  // It is possible for the path to be above the root. In this case, simply
  	  // checking whether the root is a prefix of the path won't work. Instead, we
  	  // need to remove components from the root one by one, until either we find
  	  // a prefix that fits, or we run out of components to remove.
  	  var level = 0;
  	  while (aPath.indexOf(aRoot + '/') !== 0) {
  	    var index = aRoot.lastIndexOf("/");
  	    if (index < 0) {
  	      return aPath;
  	    }
  	
  	    // If the only part of the root that is left is the scheme (i.e. http://,
  	    // file:///, etc.), one or more slashes (/), or simply nothing at all, we
  	    // have exhausted all components, so the path is not relative to the root.
  	    aRoot = aRoot.slice(0, index);
  	    if (aRoot.match(/^([^\/]+:\/)?\/*$/)) {
  	      return aPath;
  	    }
  	
  	    ++level;
  	  }
  	
  	  // Make sure we add a "../" for each component we removed from the root.
  	  return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1);
  	}
  	exports.relative = relative;
  	
  	var supportsNullProto = (function () {
  	  var obj = Object.create(null);
  	  return !('__proto__' in obj);
  	}());
  	
  	function identity (s) {
  	  return s;
  	}
  	
  	/**
  	 * Because behavior goes wacky when you set `__proto__` on objects, we
  	 * have to prefix all the strings in our set with an arbitrary character.
  	 *
  	 * See https://github.com/mozilla/source-map/pull/31 and
  	 * https://github.com/mozilla/source-map/issues/30
  	 *
  	 * @param String aStr
  	 */
  	function toSetString(aStr) {
  	  if (isProtoString(aStr)) {
  	    return '$' + aStr;
  	  }
  	
  	  return aStr;
  	}
  	exports.toSetString = supportsNullProto ? identity : toSetString;
  	
  	function fromSetString(aStr) {
  	  if (isProtoString(aStr)) {
  	    return aStr.slice(1);
  	  }
  	
  	  return aStr;
  	}
  	exports.fromSetString = supportsNullProto ? identity : fromSetString;
  	
  	function isProtoString(s) {
  	  if (!s) {
  	    return false;
  	  }
  	
  	  var length = s.length;
  	
  	  if (length < 9 /* "__proto__".length */) {
  	    return false;
  	  }
  	
  	  if (s.charCodeAt(length - 1) !== 95  /* '_' */ ||
  	      s.charCodeAt(length - 2) !== 95  /* '_' */ ||
  	      s.charCodeAt(length - 3) !== 111 /* 'o' */ ||
  	      s.charCodeAt(length - 4) !== 116 /* 't' */ ||
  	      s.charCodeAt(length - 5) !== 111 /* 'o' */ ||
  	      s.charCodeAt(length - 6) !== 114 /* 'r' */ ||
  	      s.charCodeAt(length - 7) !== 112 /* 'p' */ ||
  	      s.charCodeAt(length - 8) !== 95  /* '_' */ ||
  	      s.charCodeAt(length - 9) !== 95  /* '_' */) {
  	    return false;
  	  }
  	
  	  for (var i = length - 10; i >= 0; i--) {
  	    if (s.charCodeAt(i) !== 36 /* '$' */) {
  	      return false;
  	    }
  	  }
  	
  	  return true;
  	}
  	
  	/**
  	 * Comparator between two mappings where the original positions are compared.
  	 *
  	 * Optionally pass in `true` as `onlyCompareGenerated` to consider two
  	 * mappings with the same original source/line/column, but different generated
  	 * line and column the same. Useful when searching for a mapping with a
  	 * stubbed out mapping.
  	 */
  	function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
  	  var cmp = strcmp(mappingA.source, mappingB.source);
  	  if (cmp !== 0) {
  	    return cmp;
  	  }
  	
  	  cmp = mappingA.originalLine - mappingB.originalLine;
  	  if (cmp !== 0) {
  	    return cmp;
  	  }
  	
  	  cmp = mappingA.originalColumn - mappingB.originalColumn;
  	  if (cmp !== 0 || onlyCompareOriginal) {
  	    return cmp;
  	  }
  	
  	  cmp = mappingA.generatedColumn - mappingB.generatedColumn;
  	  if (cmp !== 0) {
  	    return cmp;
  	  }
  	
  	  cmp = mappingA.generatedLine - mappingB.generatedLine;
  	  if (cmp !== 0) {
  	    return cmp;
  	  }
  	
  	  return strcmp(mappingA.name, mappingB.name);
  	}
  	exports.compareByOriginalPositions = compareByOriginalPositions;
  	
  	/**
  	 * Comparator between two mappings with deflated source and name indices where
  	 * the generated positions are compared.
  	 *
  	 * Optionally pass in `true` as `onlyCompareGenerated` to consider two
  	 * mappings with the same generated line and column, but different
  	 * source/name/original line and column the same. Useful when searching for a
  	 * mapping with a stubbed out mapping.
  	 */
  	function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {
  	  var cmp = mappingA.generatedLine - mappingB.generatedLine;
  	  if (cmp !== 0) {
  	    return cmp;
  	  }
  	
  	  cmp = mappingA.generatedColumn - mappingB.generatedColumn;
  	  if (cmp !== 0 || onlyCompareGenerated) {
  	    return cmp;
  	  }
  	
  	  cmp = strcmp(mappingA.source, mappingB.source);
  	  if (cmp !== 0) {
  	    return cmp;
  	  }
  	
  	  cmp = mappingA.originalLine - mappingB.originalLine;
  	  if (cmp !== 0) {
  	    return cmp;
  	  }
  	
  	  cmp = mappingA.originalColumn - mappingB.originalColumn;
  	  if (cmp !== 0) {
  	    return cmp;
  	  }
  	
  	  return strcmp(mappingA.name, mappingB.name);
  	}
  	exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;
  	
  	function strcmp(aStr1, aStr2) {
  	  if (aStr1 === aStr2) {
  	    return 0;
  	  }
  	
  	  if (aStr1 === null) {
  	    return 1; // aStr2 !== null
  	  }
  	
  	  if (aStr2 === null) {
  	    return -1; // aStr1 !== null
  	  }
  	
  	  if (aStr1 > aStr2) {
  	    return 1;
  	  }
  	
  	  return -1;
  	}
  	
  	/**
  	 * Comparator between two mappings with inflated source and name strings where
  	 * the generated positions are compared.
  	 */
  	function compareByGeneratedPositionsInflated(mappingA, mappingB) {
  	  var cmp = mappingA.generatedLine - mappingB.generatedLine;
  	  if (cmp !== 0) {
  	    return cmp;
  	  }
  	
  	  cmp = mappingA.generatedColumn - mappingB.generatedColumn;
  	  if (cmp !== 0) {
  	    return cmp;
  	  }
  	
  	  cmp = strcmp(mappingA.source, mappingB.source);
  	  if (cmp !== 0) {
  	    return cmp;
  	  }
  	
  	  cmp = mappingA.originalLine - mappingB.originalLine;
  	  if (cmp !== 0) {
  	    return cmp;
  	  }
  	
  	  cmp = mappingA.originalColumn - mappingB.originalColumn;
  	  if (cmp !== 0) {
  	    return cmp;
  	  }
  	
  	  return strcmp(mappingA.name, mappingB.name);
  	}
  	exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;
  	
  	/**
  	 * Strip any JSON XSSI avoidance prefix from the string (as documented
  	 * in the source maps specification), and then parse the string as
  	 * JSON.
  	 */
  	function parseSourceMapInput(str) {
  	  return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, ''));
  	}
  	exports.parseSourceMapInput = parseSourceMapInput;
  	
  	/**
  	 * Compute the URL of a source given the the source root, the source's
  	 * URL, and the source map's URL.
  	 */
  	function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {
  	  sourceURL = sourceURL || '';
  	
  	  if (sourceRoot) {
  	    // This follows what Chrome does.
  	    if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {
  	      sourceRoot += '/';
  	    }
  	    // The spec says:
  	    //   Line 4: An optional source root, useful for relocating source
  	    //   files on a server or removing repeated values in the
  	    //   “sources” entry.  This value is prepended to the individual
  	    //   entries in the “source” field.
  	    sourceURL = sourceRoot + sourceURL;
  	  }
  	
  	  // Historically, SourceMapConsumer did not take the sourceMapURL as
  	  // a parameter.  This mode is still somewhat supported, which is why
  	  // this code block is conditional.  However, it's preferable to pass
  	  // the source map URL to SourceMapConsumer, so that this function
  	  // can implement the source URL resolution algorithm as outlined in
  	  // the spec.  This block is basically the equivalent of:
  	  //    new URL(sourceURL, sourceMapURL).toString()
  	  // ... except it avoids using URL, which wasn't available in the
  	  // older releases of node still supported by this library.
  	  //
  	  // The spec says:
  	  //   If the sources are not absolute URLs after prepending of the
  	  //   “sourceRoot”, the sources are resolved relative to the
  	  //   SourceMap (like resolving script src in a html document).
  	  if (sourceMapURL) {
  	    var parsed = urlParse(sourceMapURL);
  	    if (!parsed) {
  	      throw new Error("sourceMapURL could not be parsed");
  	    }
  	    if (parsed.path) {
  	      // Strip the last path component, but keep the "/".
  	      var index = parsed.path.lastIndexOf('/');
  	      if (index >= 0) {
  	        parsed.path = parsed.path.substring(0, index + 1);
  	      }
  	    }
  	    sourceURL = join(urlGenerate(parsed), sourceURL);
  	  }
  	
  	  return normalize(sourceURL);
  	}
  	exports.computeSourceURL = computeSourceURL;
  
  
  /***/ }),
  /* 5 */
  /***/ (function(module, exports, __webpack_require__) {
  
  	/* -*- Mode: js; js-indent-level: 2; -*- */
  	/*
  	 * Copyright 2011 Mozilla Foundation and contributors
  	 * Licensed under the New BSD license. See LICENSE or:
  	 * http://opensource.org/licenses/BSD-3-Clause
  	 */
  	
  	var util = __webpack_require__(4);
  	var has = Object.prototype.hasOwnProperty;
  	var hasNativeMap = typeof Map !== "undefined";
  	
  	/**
  	 * A data structure which is a combination of an array and a set. Adding a new
  	 * member is O(1), testing for membership is O(1), and finding the index of an
  	 * element is O(1). Removing elements from the set is not supported. Only
  	 * strings are supported for membership.
  	 */
  	function ArraySet() {
  	  this._array = [];
  	  this._set = hasNativeMap ? new Map() : Object.create(null);
  	}
  	
  	/**
  	 * Static method for creating ArraySet instances from an existing array.
  	 */
  	ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {
  	  var set = new ArraySet();
  	  for (var i = 0, len = aArray.length; i < len; i++) {
  	    set.add(aArray[i], aAllowDuplicates);
  	  }
  	  return set;
  	};
  	
  	/**
  	 * Return how many unique items are in this ArraySet. If duplicates have been
  	 * added, than those do not count towards the size.
  	 *
  	 * @returns Number
  	 */
  	ArraySet.prototype.size = function ArraySet_size() {
  	  return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;
  	};
  	
  	/**
  	 * Add the given string to this set.
  	 *
  	 * @param String aStr
  	 */
  	ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {
  	  var sStr = hasNativeMap ? aStr : util.toSetString(aStr);
  	  var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);
  	  var idx = this._array.length;
  	  if (!isDuplicate || aAllowDuplicates) {
  	    this._array.push(aStr);
  	  }
  	  if (!isDuplicate) {
  	    if (hasNativeMap) {
  	      this._set.set(aStr, idx);
  	    } else {
  	      this._set[sStr] = idx;
  	    }
  	  }
  	};
  	
  	/**
  	 * Is the given string a member of this set?
  	 *
  	 * @param String aStr
  	 */
  	ArraySet.prototype.has = function ArraySet_has(aStr) {
  	  if (hasNativeMap) {
  	    return this._set.has(aStr);
  	  } else {
  	    var sStr = util.toSetString(aStr);
  	    return has.call(this._set, sStr);
  	  }
  	};
  	
  	/**
  	 * What is the index of the given string in the array?
  	 *
  	 * @param String aStr
  	 */
  	ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {
  	  if (hasNativeMap) {
  	    var idx = this._set.get(aStr);
  	    if (idx >= 0) {
  	        return idx;
  	    }
  	  } else {
  	    var sStr = util.toSetString(aStr);
  	    if (has.call(this._set, sStr)) {
  	      return this._set[sStr];
  	    }
  	  }
  	
  	  throw new Error('"' + aStr + '" is not in the set.');
  	};
  	
  	/**
  	 * What is the element at the given index?
  	 *
  	 * @param Number aIdx
  	 */
  	ArraySet.prototype.at = function ArraySet_at(aIdx) {
  	  if (aIdx >= 0 && aIdx < this._array.length) {
  	    return this._array[aIdx];
  	  }
  	  throw new Error('No element indexed by ' + aIdx);
  	};
  	
  	/**
  	 * Returns the array representation of this set (which has the proper indices
  	 * indicated by indexOf). Note that this is a copy of the internal array used
  	 * for storing the members so that no one can mess with internal state.
  	 */
  	ArraySet.prototype.toArray = function ArraySet_toArray() {
  	  return this._array.slice();
  	};
  	
  	exports.ArraySet = ArraySet;
  
  
  /***/ }),
  /* 6 */
  /***/ (function(module, exports, __webpack_require__) {
  
  	/* -*- Mode: js; js-indent-level: 2; -*- */
  	/*
  	 * Copyright 2014 Mozilla Foundation and contributors
  	 * Licensed under the New BSD license. See LICENSE or:
  	 * http://opensource.org/licenses/BSD-3-Clause
  	 */
  	
  	var util = __webpack_require__(4);
  	
  	/**
  	 * Determine whether mappingB is after mappingA with respect to generated
  	 * position.
  	 */
  	function generatedPositionAfter(mappingA, mappingB) {
  	  // Optimized for most common case
  	  var lineA = mappingA.generatedLine;
  	  var lineB = mappingB.generatedLine;
  	  var columnA = mappingA.generatedColumn;
  	  var columnB = mappingB.generatedColumn;
  	  return lineB > lineA || lineB == lineA && columnB >= columnA ||
  	         util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;
  	}
  	
  	/**
  	 * A data structure to provide a sorted view of accumulated mappings in a
  	 * performance conscious manner. It trades a neglibable overhead in general
  	 * case for a large speedup in case of mappings being added in order.
  	 */
  	function MappingList() {
  	  this._array = [];
  	  this._sorted = true;
  	  // Serves as infimum
  	  this._last = {generatedLine: -1, generatedColumn: 0};
  	}
  	
  	/**
  	 * Iterate through internal items. This method takes the same arguments that
  	 * `Array.prototype.forEach` takes.
  	 *
  	 * NOTE: The order of the mappings is NOT guaranteed.
  	 */
  	MappingList.prototype.unsortedForEach =
  	  function MappingList_forEach(aCallback, aThisArg) {
  	    this._array.forEach(aCallback, aThisArg);
  	  };
  	
  	/**
  	 * Add the given source mapping.
  	 *
  	 * @param Object aMapping
  	 */
  	MappingList.prototype.add = function MappingList_add(aMapping) {
  	  if (generatedPositionAfter(this._last, aMapping)) {
  	    this._last = aMapping;
  	    this._array.push(aMapping);
  	  } else {
  	    this._sorted = false;
  	    this._array.push(aMapping);
  	  }
  	};
  	
  	/**
  	 * Returns the flat, sorted array of mappings. The mappings are sorted by
  	 * generated position.
  	 *
  	 * WARNING: This method returns internal data without copying, for
  	 * performance. The return value must NOT be mutated, and should be treated as
  	 * an immutable borrow. If you want to take ownership, you must make your own
  	 * copy.
  	 */
  	MappingList.prototype.toArray = function MappingList_toArray() {
  	  if (!this._sorted) {
  	    this._array.sort(util.compareByGeneratedPositionsInflated);
  	    this._sorted = true;
  	  }
  	  return this._array;
  	};
  	
  	exports.MappingList = MappingList;
  
  
  /***/ }),
  /* 7 */
  /***/ (function(module, exports, __webpack_require__) {
  
  	/* -*- Mode: js; js-indent-level: 2; -*- */
  	/*
  	 * Copyright 2011 Mozilla Foundation and contributors
  	 * Licensed under the New BSD license. See LICENSE or:
  	 * http://opensource.org/licenses/BSD-3-Clause
  	 */
  	
  	var util = __webpack_require__(4);
  	var binarySearch = __webpack_require__(8);
  	var ArraySet = __webpack_require__(5).ArraySet;
  	var base64VLQ = __webpack_require__(2);
  	var quickSort = __webpack_require__(9).quickSort;
  	
  	function SourceMapConsumer(aSourceMap, aSourceMapURL) {
  	  var sourceMap = aSourceMap;
  	  if (typeof aSourceMap === 'string') {
  	    sourceMap = util.parseSourceMapInput(aSourceMap);
  	  }
  	
  	  return sourceMap.sections != null
  	    ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)
  	    : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);
  	}
  	
  	SourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {
  	  return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);
  	}
  	
  	/**
  	 * The version of the source mapping spec that we are consuming.
  	 */
  	SourceMapConsumer.prototype._version = 3;
  	
  	// `__generatedMappings` and `__originalMappings` are arrays that hold the
  	// parsed mapping coordinates from the source map's "mappings" attribute. They
  	// are lazily instantiated, accessed via the `_generatedMappings` and
  	// `_originalMappings` getters respectively, and we only parse the mappings
  	// and create these arrays once queried for a source location. We jump through
  	// these hoops because there can be many thousands of mappings, and parsing
  	// them is expensive, so we only want to do it if we must.
  	//
  	// Each object in the arrays is of the form:
  	//
  	//     {
  	//       generatedLine: The line number in the generated code,
  	//       generatedColumn: The column number in the generated code,
  	//       source: The path to the original source file that generated this
  	//               chunk of code,
  	//       originalLine: The line number in the original source that
  	//                     corresponds to this chunk of generated code,
  	//       originalColumn: The column number in the original source that
  	//                       corresponds to this chunk of generated code,
  	//       name: The name of the original symbol which generated this chunk of
  	//             code.
  	//     }
  	//
  	// All properties except for `generatedLine` and `generatedColumn` can be
  	// `null`.
  	//
  	// `_generatedMappings` is ordered by the generated positions.
  	//
  	// `_originalMappings` is ordered by the original positions.
  	
  	SourceMapConsumer.prototype.__generatedMappings = null;
  	Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {
  	  configurable: true,
  	  enumerable: true,
  	  get: function () {
  	    if (!this.__generatedMappings) {
  	      this._parseMappings(this._mappings, this.sourceRoot);
  	    }
  	
  	    return this.__generatedMappings;
  	  }
  	});
  	
  	SourceMapConsumer.prototype.__originalMappings = null;
  	Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {
  	  configurable: true,
  	  enumerable: true,
  	  get: function () {
  	    if (!this.__originalMappings) {
  	      this._parseMappings(this._mappings, this.sourceRoot);
  	    }
  	
  	    return this.__originalMappings;
  	  }
  	});
  	
  	SourceMapConsumer.prototype._charIsMappingSeparator =
  	  function SourceMapConsumer_charIsMappingSeparator(aStr, index) {
  	    var c = aStr.charAt(index);
  	    return c === ";" || c === ",";
  	  };
  	
  	/**
  	 * Parse the mappings in a string in to a data structure which we can easily
  	 * query (the ordered arrays in the `this.__generatedMappings` and
  	 * `this.__originalMappings` properties).
  	 */
  	SourceMapConsumer.prototype._parseMappings =
  	  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
  	    throw new Error("Subclasses must implement _parseMappings");
  	  };
  	
  	SourceMapConsumer.GENERATED_ORDER = 1;
  	SourceMapConsumer.ORIGINAL_ORDER = 2;
  	
  	SourceMapConsumer.GREATEST_LOWER_BOUND = 1;
  	SourceMapConsumer.LEAST_UPPER_BOUND = 2;
  	
  	/**
  	 * Iterate over each mapping between an original source/line/column and a
  	 * generated line/column in this source map.
  	 *
  	 * @param Function aCallback
  	 *        The function that is called with each mapping.
  	 * @param Object aContext
  	 *        Optional. If specified, this object will be the value of `this` every
  	 *        time that `aCallback` is called.
  	 * @param aOrder
  	 *        Either `SourceMapConsumer.GENERATED_ORDER` or
  	 *        `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to
  	 *        iterate over the mappings sorted by the generated file's line/column
  	 *        order or the original's source/line/column order, respectively. Defaults to
  	 *        `SourceMapConsumer.GENERATED_ORDER`.
  	 */
  	SourceMapConsumer.prototype.eachMapping =
  	  function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {
  	    var context = aContext || null;
  	    var order = aOrder || SourceMapConsumer.GENERATED_ORDER;
  	
  	    var mappings;
  	    switch (order) {
  	    case SourceMapConsumer.GENERATED_ORDER:
  	      mappings = this._generatedMappings;
  	      break;
  	    case SourceMapConsumer.ORIGINAL_ORDER:
  	      mappings = this._originalMappings;
  	      break;
  	    default:
  	      throw new Error("Unknown order of iteration.");
  	    }
  	
  	    var sourceRoot = this.sourceRoot;
  	    mappings.map(function (mapping) {
  	      var source = mapping.source === null ? null : this._sources.at(mapping.source);
  	      source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);
  	      return {
  	        source: source,
  	        generatedLine: mapping.generatedLine,
  	        generatedColumn: mapping.generatedColumn,
  	        originalLine: mapping.originalLine,
  	        originalColumn: mapping.originalColumn,
  	        name: mapping.name === null ? null : this._names.at(mapping.name)
  	      };
  	    }, this).forEach(aCallback, context);
  	  };
  	
  	/**
  	 * Returns all generated line and column information for the original source,
  	 * line, and column provided. If no column is provided, returns all mappings
  	 * corresponding to a either the line we are searching for or the next
  	 * closest line that has any mappings. Otherwise, returns all mappings
  	 * corresponding to the given line and either the column we are searching for
  	 * or the next closest column that has any offsets.
  	 *
  	 * The only argument is an object with the following properties:
  	 *
  	 *   - source: The filename of the original source.
  	 *   - line: The line number in the original source.  The line number is 1-based.
  	 *   - column: Optional. the column number in the original source.
  	 *    The column number is 0-based.
  	 *
  	 * and an array of objects is returned, each with the following properties:
  	 *
  	 *   - line: The line number in the generated source, or null.  The
  	 *    line number is 1-based.
  	 *   - column: The column number in the generated source, or null.
  	 *    The column number is 0-based.
  	 */
  	SourceMapConsumer.prototype.allGeneratedPositionsFor =
  	  function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {
  	    var line = util.getArg(aArgs, 'line');
  	
  	    // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping
  	    // returns the index of the closest mapping less than the needle. By
  	    // setting needle.originalColumn to 0, we thus find the last mapping for
  	    // the given line, provided such a mapping exists.
  	    var needle = {
  	      source: util.getArg(aArgs, 'source'),
  	      originalLine: line,
  	      originalColumn: util.getArg(aArgs, 'column', 0)
  	    };
  	
  	    needle.source = this._findSourceIndex(needle.source);
  	    if (needle.source < 0) {
  	      return [];
  	    }
  	
  	    var mappings = [];
  	
  	    var index = this._findMapping(needle,
  	                                  this._originalMappings,
  	                                  "originalLine",
  	                                  "originalColumn",
  	                                  util.compareByOriginalPositions,
  	                                  binarySearch.LEAST_UPPER_BOUND);
  	    if (index >= 0) {
  	      var mapping = this._originalMappings[index];
  	
  	      if (aArgs.column === undefined) {
  	        var originalLine = mapping.originalLine;
  	
  	        // Iterate until either we run out of mappings, or we run into
  	        // a mapping for a different line than the one we found. Since
  	        // mappings are sorted, this is guaranteed to find all mappings for
  	        // the line we found.
  	        while (mapping && mapping.originalLine === originalLine) {
  	          mappings.push({
  	            line: util.getArg(mapping, 'generatedLine', null),
  	            column: util.getArg(mapping, 'generatedColumn', null),
  	            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
  	          });
  	
  	          mapping = this._originalMappings[++index];
  	        }
  	      } else {
  	        var originalColumn = mapping.originalColumn;
  	
  	        // Iterate until either we run out of mappings, or we run into
  	        // a mapping for a different line than the one we were searching for.
  	        // Since mappings are sorted, this is guaranteed to find all mappings for
  	        // the line we are searching for.
  	        while (mapping &&
  	               mapping.originalLine === line &&
  	               mapping.originalColumn == originalColumn) {
  	          mappings.push({
  	            line: util.getArg(mapping, 'generatedLine', null),
  	            column: util.getArg(mapping, 'generatedColumn', null),
  	            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
  	          });
  	
  	          mapping = this._originalMappings[++index];
  	        }
  	      }
  	    }
  	
  	    return mappings;
  	  };
  	
  	exports.SourceMapConsumer = SourceMapConsumer;
  	
  	/**
  	 * A BasicSourceMapConsumer instance represents a parsed source map which we can
  	 * query for information about the original file positions by giving it a file
  	 * position in the generated source.
  	 *
  	 * The first parameter is the raw source map (either as a JSON string, or
  	 * already parsed to an object). According to the spec, source maps have the
  	 * following attributes:
  	 *
  	 *   - version: Which version of the source map spec this map is following.
  	 *   - sources: An array of URLs to the original source files.
  	 *   - names: An array of identifiers which can be referrenced by individual mappings.
  	 *   - sourceRoot: Optional. The URL root from which all sources are relative.
  	 *   - sourcesContent: Optional. An array of contents of the original source files.
  	 *   - mappings: A string of base64 VLQs which contain the actual mappings.
  	 *   - file: Optional. The generated file this source map is associated with.
  	 *
  	 * Here is an example source map, taken from the source map spec[0]:
  	 *
  	 *     {
  	 *       version : 3,
  	 *       file: "out.js",
  	 *       sourceRoot : "",
  	 *       sources: ["foo.js", "bar.js"],
  	 *       names: ["src", "maps", "are", "fun"],
  	 *       mappings: "AA,AB;;ABCDE;"
  	 *     }
  	 *
  	 * The second parameter, if given, is a string whose value is the URL
  	 * at which the source map was found.  This URL is used to compute the
  	 * sources array.
  	 *
  	 * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#
  	 */
  	function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {
  	  var sourceMap = aSourceMap;
  	  if (typeof aSourceMap === 'string') {
  	    sourceMap = util.parseSourceMapInput(aSourceMap);
  	  }
  	
  	  var version = util.getArg(sourceMap, 'version');
  	  var sources = util.getArg(sourceMap, 'sources');
  	  // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which
  	  // requires the array) to play nice here.
  	  var names = util.getArg(sourceMap, 'names', []);
  	  var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);
  	  var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);
  	  var mappings = util.getArg(sourceMap, 'mappings');
  	  var file = util.getArg(sourceMap, 'file', null);
  	
  	  // Once again, Sass deviates from the spec and supplies the version as a
  	  // string rather than a number, so we use loose equality checking here.
  	  if (version != this._version) {
  	    throw new Error('Unsupported version: ' + version);
  	  }
  	
  	  if (sourceRoot) {
  	    sourceRoot = util.normalize(sourceRoot);
  	  }
  	
  	  sources = sources
  	    .map(String)
  	    // Some source maps produce relative source paths like "./foo.js" instead of
  	    // "foo.js".  Normalize these first so that future comparisons will succeed.
  	    // See bugzil.la/1090768.
  	    .map(util.normalize)
  	    // Always ensure that absolute sources are internally stored relative to
  	    // the source root, if the source root is absolute. Not doing this would
  	    // be particularly problematic when the source root is a prefix of the
  	    // source (valid, but why??). See github issue #199 and bugzil.la/1188982.
  	    .map(function (source) {
  	      return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)
  	        ? util.relative(sourceRoot, source)
  	        : source;
  	    });
  	
  	  // Pass `true` below to allow duplicate names and sources. While source maps
  	  // are intended to be compressed and deduplicated, the TypeScript compiler
  	  // sometimes generates source maps with duplicates in them. See Github issue
  	  // #72 and bugzil.la/889492.
  	  this._names = ArraySet.fromArray(names.map(String), true);
  	  this._sources = ArraySet.fromArray(sources, true);
  	
  	  this._absoluteSources = this._sources.toArray().map(function (s) {
  	    return util.computeSourceURL(sourceRoot, s, aSourceMapURL);
  	  });
  	
  	  this.sourceRoot = sourceRoot;
  	  this.sourcesContent = sourcesContent;
  	  this._mappings = mappings;
  	  this._sourceMapURL = aSourceMapURL;
  	  this.file = file;
  	}
  	
  	BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
  	BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;
  	
  	/**
  	 * Utility function to find the index of a source.  Returns -1 if not
  	 * found.
  	 */
  	BasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {
  	  var relativeSource = aSource;
  	  if (this.sourceRoot != null) {
  	    relativeSource = util.relative(this.sourceRoot, relativeSource);
  	  }
  	
  	  if (this._sources.has(relativeSource)) {
  	    return this._sources.indexOf(relativeSource);
  	  }
  	
  	  // Maybe aSource is an absolute URL as returned by |sources|.  In
  	  // this case we can't simply undo the transform.
  	  var i;
  	  for (i = 0; i < this._absoluteSources.length; ++i) {
  	    if (this._absoluteSources[i] == aSource) {
  	      return i;
  	    }
  	  }
  	
  	  return -1;
  	};
  	
  	/**
  	 * Create a BasicSourceMapConsumer from a SourceMapGenerator.
  	 *
  	 * @param SourceMapGenerator aSourceMap
  	 *        The source map that will be consumed.
  	 * @param String aSourceMapURL
  	 *        The URL at which the source map can be found (optional)
  	 * @returns BasicSourceMapConsumer
  	 */
  	BasicSourceMapConsumer.fromSourceMap =
  	  function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {
  	    var smc = Object.create(BasicSourceMapConsumer.prototype);
  	
  	    var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);
  	    var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);
  	    smc.sourceRoot = aSourceMap._sourceRoot;
  	    smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),
  	                                                            smc.sourceRoot);
  	    smc.file = aSourceMap._file;
  	    smc._sourceMapURL = aSourceMapURL;
  	    smc._absoluteSources = smc._sources.toArray().map(function (s) {
  	      return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);
  	    });
  	
  	    // Because we are modifying the entries (by converting string sources and
  	    // names to indices into the sources and names ArraySets), we have to make
  	    // a copy of the entry or else bad things happen. Shared mutable state
  	    // strikes again! See github issue #191.
  	
  	    var generatedMappings = aSourceMap._mappings.toArray().slice();
  	    var destGeneratedMappings = smc.__generatedMappings = [];
  	    var destOriginalMappings = smc.__originalMappings = [];
  	
  	    for (var i = 0, length = generatedMappings.length; i < length; i++) {
  	      var srcMapping = generatedMappings[i];
  	      var destMapping = new Mapping;
  	      destMapping.generatedLine = srcMapping.generatedLine;
  	      destMapping.generatedColumn = srcMapping.generatedColumn;
  	
  	      if (srcMapping.source) {
  	        destMapping.source = sources.indexOf(srcMapping.source);
  	        destMapping.originalLine = srcMapping.originalLine;
  	        destMapping.originalColumn = srcMapping.originalColumn;
  	
  	        if (srcMapping.name) {
  	          destMapping.name = names.indexOf(srcMapping.name);
  	        }
  	
  	        destOriginalMappings.push(destMapping);
  	      }
  	
  	      destGeneratedMappings.push(destMapping);
  	    }
  	
  	    quickSort(smc.__originalMappings, util.compareByOriginalPositions);
  	
  	    return smc;
  	  };
  	
  	/**
  	 * The version of the source mapping spec that we are consuming.
  	 */
  	BasicSourceMapConsumer.prototype._version = 3;
  	
  	/**
  	 * The list of original sources.
  	 */
  	Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {
  	  get: function () {
  	    return this._absoluteSources.slice();
  	  }
  	});
  	
  	/**
  	 * Provide the JIT with a nice shape / hidden class.
  	 */
  	function Mapping() {
  	  this.generatedLine = 0;
  	  this.generatedColumn = 0;
  	  this.source = null;
  	  this.originalLine = null;
  	  this.originalColumn = null;
  	  this.name = null;
  	}
  	
  	/**
  	 * Parse the mappings in a string in to a data structure which we can easily
  	 * query (the ordered arrays in the `this.__generatedMappings` and
  	 * `this.__originalMappings` properties).
  	 */
  	BasicSourceMapConsumer.prototype._parseMappings =
  	  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
  	    var generatedLine = 1;
  	    var previousGeneratedColumn = 0;
  	    var previousOriginalLine = 0;
  	    var previousOriginalColumn = 0;
  	    var previousSource = 0;
  	    var previousName = 0;
  	    var length = aStr.length;
  	    var index = 0;
  	    var cachedSegments = {};
  	    var temp = {};
  	    var originalMappings = [];
  	    var generatedMappings = [];
  	    var mapping, str, segment, end, value;
  	
  	    while (index < length) {
  	      if (aStr.charAt(index) === ';') {
  	        generatedLine++;
  	        index++;
  	        previousGeneratedColumn = 0;
  	      }
  	      else if (aStr.charAt(index) === ',') {
  	        index++;
  	      }
  	      else {
  	        mapping = new Mapping();
  	        mapping.generatedLine = generatedLine;
  	
  	        // Because each offset is encoded relative to the previous one,
  	        // many segments often have the same encoding. We can exploit this
  	        // fact by caching the parsed variable length fields of each segment,
  	        // allowing us to avoid a second parse if we encounter the same
  	        // segment again.
  	        for (end = index; end < length; end++) {
  	          if (this._charIsMappingSeparator(aStr, end)) {
  	            break;
  	          }
  	        }
  	        str = aStr.slice(index, end);
  	
  	        segment = cachedSegments[str];
  	        if (segment) {
  	          index += str.length;
  	        } else {
  	          segment = [];
  	          while (index < end) {
  	            base64VLQ.decode(aStr, index, temp);
  	            value = temp.value;
  	            index = temp.rest;
  	            segment.push(value);
  	          }
  	
  	          if (segment.length === 2) {
  	            throw new Error('Found a source, but no line and column');
  	          }
  	
  	          if (segment.length === 3) {
  	            throw new Error('Found a source and line, but no column');
  	          }
  	
  	          cachedSegments[str] = segment;
  	        }
  	
  	        // Generated column.
  	        mapping.generatedColumn = previousGeneratedColumn + segment[0];
  	        previousGeneratedColumn = mapping.generatedColumn;
  	
  	        if (segment.length > 1) {
  	          // Original source.
  	          mapping.source = previousSource + segment[1];
  	          previousSource += segment[1];
  	
  	          // Original line.
  	          mapping.originalLine = previousOriginalLine + segment[2];
  	          previousOriginalLine = mapping.originalLine;
  	          // Lines are stored 0-based
  	          mapping.originalLine += 1;
  	
  	          // Original column.
  	          mapping.originalColumn = previousOriginalColumn + segment[3];
  	          previousOriginalColumn = mapping.originalColumn;
  	
  	          if (segment.length > 4) {
  	            // Original name.
  	            mapping.name = previousName + segment[4];
  	            previousName += segment[4];
  	          }
  	        }
  	
  	        generatedMappings.push(mapping);
  	        if (typeof mapping.originalLine === 'number') {
  	          originalMappings.push(mapping);
  	        }
  	      }
  	    }
  	
  	    quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);
  	    this.__generatedMappings = generatedMappings;
  	
  	    quickSort(originalMappings, util.compareByOriginalPositions);
  	    this.__originalMappings = originalMappings;
  	  };
  	
  	/**
  	 * Find the mapping that best matches the hypothetical "needle" mapping that
  	 * we are searching for in the given "haystack" of mappings.
  	 */
  	BasicSourceMapConsumer.prototype._findMapping =
  	  function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,
  	                                         aColumnName, aComparator, aBias) {
  	    // To return the position we are searching for, we must first find the
  	    // mapping for the given position and then return the opposite position it
  	    // points to. Because the mappings are sorted, we can use binary search to
  	    // find the best mapping.
  	
  	    if (aNeedle[aLineName] <= 0) {
  	      throw new TypeError('Line must be greater than or equal to 1, got '
  	                          + aNeedle[aLineName]);
  	    }
  	    if (aNeedle[aColumnName] < 0) {
  	      throw new TypeError('Column must be greater than or equal to 0, got '
  	                          + aNeedle[aColumnName]);
  	    }
  	
  	    return binarySearch.search(aNeedle, aMappings, aComparator, aBias);
  	  };
  	
  	/**
  	 * Compute the last column for each generated mapping. The last column is
  	 * inclusive.
  	 */
  	BasicSourceMapConsumer.prototype.computeColumnSpans =
  	  function SourceMapConsumer_computeColumnSpans() {
  	    for (var index = 0; index < this._generatedMappings.length; ++index) {
  	      var mapping = this._generatedMappings[index];
  	
  	      // Mappings do not contain a field for the last generated columnt. We
  	      // can come up with an optimistic estimate, however, by assuming that
  	      // mappings are contiguous (i.e. given two consecutive mappings, the
  	      // first mapping ends where the second one starts).
  	      if (index + 1 < this._generatedMappings.length) {
  	        var nextMapping = this._generatedMappings[index + 1];
  	
  	        if (mapping.generatedLine === nextMapping.generatedLine) {
  	          mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;
  	          continue;
  	        }
  	      }
  	
  	      // The last mapping for each line spans the entire line.
  	      mapping.lastGeneratedColumn = Infinity;
  	    }
  	  };
  	
  	/**
  	 * Returns the original source, line, and column information for the generated
  	 * source's line and column positions provided. The only argument is an object
  	 * with the following properties:
  	 *
  	 *   - line: The line number in the generated source.  The line number
  	 *     is 1-based.
  	 *   - column: The column number in the generated source.  The column
  	 *     number is 0-based.
  	 *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
  	 *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
  	 *     closest element that is smaller than or greater than the one we are
  	 *     searching for, respectively, if the exact element cannot be found.
  	 *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
  	 *
  	 * and an object is returned with the following properties:
  	 *
  	 *   - source: The original source file, or null.
  	 *   - line: The line number in the original source, or null.  The
  	 *     line number is 1-based.
  	 *   - column: The column number in the original source, or null.  The
  	 *     column number is 0-based.
  	 *   - name: The original identifier, or null.
  	 */
  	BasicSourceMapConsumer.prototype.originalPositionFor =
  	  function SourceMapConsumer_originalPositionFor(aArgs) {
  	    var needle = {
  	      generatedLine: util.getArg(aArgs, 'line'),
  	      generatedColumn: util.getArg(aArgs, 'column')
  	    };
  	
  	    var index = this._findMapping(
  	      needle,
  	      this._generatedMappings,
  	      "generatedLine",
  	      "generatedColumn",
  	      util.compareByGeneratedPositionsDeflated,
  	      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
  	    );
  	
  	    if (index >= 0) {
  	      var mapping = this._generatedMappings[index];
  	
  	      if (mapping.generatedLine === needle.generatedLine) {
  	        var source = util.getArg(mapping, 'source', null);
  	        if (source !== null) {
  	          source = this._sources.at(source);
  	          source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);
  	        }
  	        var name = util.getArg(mapping, 'name', null);
  	        if (name !== null) {
  	          name = this._names.at(name);
  	        }
  	        return {
  	          source: source,
  	          line: util.getArg(mapping, 'originalLine', null),
  	          column: util.getArg(mapping, 'originalColumn', null),
  	          name: name
  	        };
  	      }
  	    }
  	
  	    return {
  	      source: null,
  	      line: null,
  	      column: null,
  	      name: null
  	    };
  	  };
  	
  	/**
  	 * Return true if we have the source content for every source in the source
  	 * map, false otherwise.
  	 */
  	BasicSourceMapConsumer.prototype.hasContentsOfAllSources =
  	  function BasicSourceMapConsumer_hasContentsOfAllSources() {
  	    if (!this.sourcesContent) {
  	      return false;
  	    }
  	    return this.sourcesContent.length >= this._sources.size() &&
  	      !this.sourcesContent.some(function (sc) { return sc == null; });
  	  };
  	
  	/**
  	 * Returns the original source content. The only argument is the url of the
  	 * original source file. Returns null if no original source content is
  	 * available.
  	 */
  	BasicSourceMapConsumer.prototype.sourceContentFor =
  	  function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
  	    if (!this.sourcesContent) {
  	      return null;
  	    }
  	
  	    var index = this._findSourceIndex(aSource);
  	    if (index >= 0) {
  	      return this.sourcesContent[index];
  	    }
  	
  	    var relativeSource = aSource;
  	    if (this.sourceRoot != null) {
  	      relativeSource = util.relative(this.sourceRoot, relativeSource);
  	    }
  	
  	    var url;
  	    if (this.sourceRoot != null
  	        && (url = util.urlParse(this.sourceRoot))) {
  	      // XXX: file:// URIs and absolute paths lead to unexpected behavior for
  	      // many users. We can help them out when they expect file:// URIs to
  	      // behave like it would if they were running a local HTTP server. See
  	      // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.
  	      var fileUriAbsPath = relativeSource.replace(/^file:\/\//, "");
  	      if (url.scheme == "file"
  	          && this._sources.has(fileUriAbsPath)) {
  	        return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]
  	      }
  	
  	      if ((!url.path || url.path == "/")
  	          && this._sources.has("/" + relativeSource)) {
  	        return this.sourcesContent[this._sources.indexOf("/" + relativeSource)];
  	      }
  	    }
  	
  	    // This function is used recursively from
  	    // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we
  	    // don't want to throw if we can't find the source - we just want to
  	    // return null, so we provide a flag to exit gracefully.
  	    if (nullOnMissing) {
  	      return null;
  	    }
  	    else {
  	      throw new Error('"' + relativeSource + '" is not in the SourceMap.');
  	    }
  	  };
  	
  	/**
  	 * Returns the generated line and column information for the original source,
  	 * line, and column positions provided. The only argument is an object with
  	 * the following properties:
  	 *
  	 *   - source: The filename of the original source.
  	 *   - line: The line number in the original source.  The line number
  	 *     is 1-based.
  	 *   - column: The column number in the original source.  The column
  	 *     number is 0-based.
  	 *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
  	 *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
  	 *     closest element that is smaller than or greater than the one we are
  	 *     searching for, respectively, if the exact element cannot be found.
  	 *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
  	 *
  	 * and an object is returned with the following properties:
  	 *
  	 *   - line: The line number in the generated source, or null.  The
  	 *     line number is 1-based.
  	 *   - column: The column number in the generated source, or null.
  	 *     The column number is 0-based.
  	 */
  	BasicSourceMapConsumer.prototype.generatedPositionFor =
  	  function SourceMapConsumer_generatedPositionFor(aArgs) {
  	    var source = util.getArg(aArgs, 'source');
  	    source = this._findSourceIndex(source);
  	    if (source < 0) {
  	      return {
  	        line: null,
  	        column: null,
  	        lastColumn: null
  	      };
  	    }
  	
  	    var needle = {
  	      source: source,
  	      originalLine: util.getArg(aArgs, 'line'),
  	      originalColumn: util.getArg(aArgs, 'column')
  	    };
  	
  	    var index = this._findMapping(
  	      needle,
  	      this._originalMappings,
  	      "originalLine",
  	      "originalColumn",
  	      util.compareByOriginalPositions,
  	      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
  	    );
  	
  	    if (index >= 0) {
  	      var mapping = this._originalMappings[index];
  	
  	      if (mapping.source === needle.source) {
  	        return {
  	          line: util.getArg(mapping, 'generatedLine', null),
  	          column: util.getArg(mapping, 'generatedColumn', null),
  	          lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
  	        };
  	      }
  	    }
  	
  	    return {
  	      line: null,
  	      column: null,
  	      lastColumn: null
  	    };
  	  };
  	
  	exports.BasicSourceMapConsumer = BasicSourceMapConsumer;
  	
  	/**
  	 * An IndexedSourceMapConsumer instance represents a parsed source map which
  	 * we can query for information. It differs from BasicSourceMapConsumer in
  	 * that it takes "indexed" source maps (i.e. ones with a "sections" field) as
  	 * input.
  	 *
  	 * The first parameter is a raw source map (either as a JSON string, or already
  	 * parsed to an object). According to the spec for indexed source maps, they
  	 * have the following attributes:
  	 *
  	 *   - version: Which version of the source map spec this map is following.
  	 *   - file: Optional. The generated file this source map is associated with.
  	 *   - sections: A list of section definitions.
  	 *
  	 * Each value under the "sections" field has two fields:
  	 *   - offset: The offset into the original specified at which this section
  	 *       begins to apply, defined as an object with a "line" and "column"
  	 *       field.
  	 *   - map: A source map definition. This source map could also be indexed,
  	 *       but doesn't have to be.
  	 *
  	 * Instead of the "map" field, it's also possible to have a "url" field
  	 * specifying a URL to retrieve a source map from, but that's currently
  	 * unsupported.
  	 *
  	 * Here's an example source map, taken from the source map spec[0], but
  	 * modified to omit a section which uses the "url" field.
  	 *
  	 *  {
  	 *    version : 3,
  	 *    file: "app.js",
  	 *    sections: [{
  	 *      offset: {line:100, column:10},
  	 *      map: {
  	 *        version : 3,
  	 *        file: "section.js",
  	 *        sources: ["foo.js", "bar.js"],
  	 *        names: ["src", "maps", "are", "fun"],
  	 *        mappings: "AAAA,E;;ABCDE;"
  	 *      }
  	 *    }],
  	 *  }
  	 *
  	 * The second parameter, if given, is a string whose value is the URL
  	 * at which the source map was found.  This URL is used to compute the
  	 * sources array.
  	 *
  	 * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt
  	 */
  	function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {
  	  var sourceMap = aSourceMap;
  	  if (typeof aSourceMap === 'string') {
  	    sourceMap = util.parseSourceMapInput(aSourceMap);
  	  }
  	
  	  var version = util.getArg(sourceMap, 'version');
  	  var sections = util.getArg(sourceMap, 'sections');
  	
  	  if (version != this._version) {
  	    throw new Error('Unsupported version: ' + version);
  	  }
  	
  	  this._sources = new ArraySet();
  	  this._names = new ArraySet();
  	
  	  var lastOffset = {
  	    line: -1,
  	    column: 0
  	  };
  	  this._sections = sections.map(function (s) {
  	    if (s.url) {
  	      // The url field will require support for asynchronicity.
  	      // See https://github.com/mozilla/source-map/issues/16
  	      throw new Error('Support for url field in sections not implemented.');
  	    }
  	    var offset = util.getArg(s, 'offset');
  	    var offsetLine = util.getArg(offset, 'line');
  	    var offsetColumn = util.getArg(offset, 'column');
  	
  	    if (offsetLine < lastOffset.line ||
  	        (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {
  	      throw new Error('Section offsets must be ordered and non-overlapping.');
  	    }
  	    lastOffset = offset;
  	
  	    return {
  	      generatedOffset: {
  	        // The offset fields are 0-based, but we use 1-based indices when
  	        // encoding/decoding from VLQ.
  	        generatedLine: offsetLine + 1,
  	        generatedColumn: offsetColumn + 1
  	      },
  	      consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)
  	    }
  	  });
  	}
  	
  	IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
  	IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;
  	
  	/**
  	 * The version of the source mapping spec that we are consuming.
  	 */
  	IndexedSourceMapConsumer.prototype._version = 3;
  	
  	/**
  	 * The list of original sources.
  	 */
  	Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {
  	  get: function () {
  	    var sources = [];
  	    for (var i = 0; i < this._sections.length; i++) {
  	      for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {
  	        sources.push(this._sections[i].consumer.sources[j]);
  	      }
  	    }
  	    return sources;
  	  }
  	});
  	
  	/**
  	 * Returns the original source, line, and column information for the generated
  	 * source's line and column positions provided. The only argument is an object
  	 * with the following properties:
  	 *
  	 *   - line: The line number in the generated source.  The line number
  	 *     is 1-based.
  	 *   - column: The column number in the generated source.  The column
  	 *     number is 0-based.
  	 *
  	 * and an object is returned with the following properties:
  	 *
  	 *   - source: The original source file, or null.
  	 *   - line: The line number in the original source, or null.  The
  	 *     line number is 1-based.
  	 *   - column: The column number in the original source, or null.  The
  	 *     column number is 0-based.
  	 *   - name: The original identifier, or null.
  	 */
  	IndexedSourceMapConsumer.prototype.originalPositionFor =
  	  function IndexedSourceMapConsumer_originalPositionFor(aArgs) {
  	    var needle = {
  	      generatedLine: util.getArg(aArgs, 'line'),
  	      generatedColumn: util.getArg(aArgs, 'column')
  	    };
  	
  	    // Find the section containing the generated position we're trying to map
  	    // to an original position.
  	    var sectionIndex = binarySearch.search(needle, this._sections,
  	      function(needle, section) {
  	        var cmp = needle.generatedLine - section.generatedOffset.generatedLine;
  	        if (cmp) {
  	          return cmp;
  	        }
  	
  	        return (needle.generatedColumn -
  	                section.generatedOffset.generatedColumn);
  	      });
  	    var section = this._sections[sectionIndex];
  	
  	    if (!section) {
  	      return {
  	        source: null,
  	        line: null,
  	        column: null,
  	        name: null
  	      };
  	    }
  	
  	    return section.consumer.originalPositionFor({
  	      line: needle.generatedLine -
  	        (section.generatedOffset.generatedLine - 1),
  	      column: needle.generatedColumn -
  	        (section.generatedOffset.generatedLine === needle.generatedLine
  	         ? section.generatedOffset.generatedColumn - 1
  	         : 0),
  	      bias: aArgs.bias
  	    });
  	  };
  	
  	/**
  	 * Return true if we have the source content for every source in the source
  	 * map, false otherwise.
  	 */
  	IndexedSourceMapConsumer.prototype.hasContentsOfAllSources =
  	  function IndexedSourceMapConsumer_hasContentsOfAllSources() {
  	    return this._sections.every(function (s) {
  	      return s.consumer.hasContentsOfAllSources();
  	    });
  	  };
  	
  	/**
  	 * Returns the original source content. The only argument is the url of the
  	 * original source file. Returns null if no original source content is
  	 * available.
  	 */
  	IndexedSourceMapConsumer.prototype.sourceContentFor =
  	  function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
  	    for (var i = 0; i < this._sections.length; i++) {
  	      var section = this._sections[i];
  	
  	      var content = section.consumer.sourceContentFor(aSource, true);
  	      if (content) {
  	        return content;
  	      }
  	    }
  	    if (nullOnMissing) {
  	      return null;
  	    }
  	    else {
  	      throw new Error('"' + aSource + '" is not in the SourceMap.');
  	    }
  	  };
  	
  	/**
  	 * Returns the generated line and column information for the original source,
  	 * line, and column positions provided. The only argument is an object with
  	 * the following properties:
  	 *
  	 *   - source: The filename of the original source.
  	 *   - line: The line number in the original source.  The line number
  	 *     is 1-based.
  	 *   - column: The column number in the original source.  The column
  	 *     number is 0-based.
  	 *
  	 * and an object is returned with the following properties:
  	 *
  	 *   - line: The line number in the generated source, or null.  The
  	 *     line number is 1-based. 
  	 *   - column: The column number in the generated source, or null.
  	 *     The column number is 0-based.
  	 */
  	IndexedSourceMapConsumer.prototype.generatedPositionFor =
  	  function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {
  	    for (var i = 0; i < this._sections.length; i++) {
  	      var section = this._sections[i];
  	
  	      // Only consider this section if the requested source is in the list of
  	      // sources of the consumer.
  	      if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {
  	        continue;
  	      }
  	      var generatedPosition = section.consumer.generatedPositionFor(aArgs);
  	      if (generatedPosition) {
  	        var ret = {
  	          line: generatedPosition.line +
  	            (section.generatedOffset.generatedLine - 1),
  	          column: generatedPosition.column +
  	            (section.generatedOffset.generatedLine === generatedPosition.line
  	             ? section.generatedOffset.generatedColumn - 1
  	             : 0)
  	        };
  	        return ret;
  	      }
  	    }
  	
  	    return {
  	      line: null,
  	      column: null
  	    };
  	  };
  	
  	/**
  	 * Parse the mappings in a string in to a data structure which we can easily
  	 * query (the ordered arrays in the `this.__generatedMappings` and
  	 * `this.__originalMappings` properties).
  	 */
  	IndexedSourceMapConsumer.prototype._parseMappings =
  	  function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {
  	    this.__generatedMappings = [];
  	    this.__originalMappings = [];
  	    for (var i = 0; i < this._sections.length; i++) {
  	      var section = this._sections[i];
  	      var sectionMappings = section.consumer._generatedMappings;
  	      for (var j = 0; j < sectionMappings.length; j++) {
  	        var mapping = sectionMappings[j];
  	
  	        var source = section.consumer._sources.at(mapping.source);
  	        source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);
  	        this._sources.add(source);
  	        source = this._sources.indexOf(source);
  	
  	        var name = null;
  	        if (mapping.name) {
  	          name = section.consumer._names.at(mapping.name);
  	          this._names.add(name);
  	          name = this._names.indexOf(name);
  	        }
  	
  	        // The mappings coming from the consumer for the section have
  	        // generated positions relative to the start of the section, so we
  	        // need to offset them to be relative to the start of the concatenated
  	        // generated file.
  	        var adjustedMapping = {
  	          source: source,
  	          generatedLine: mapping.generatedLine +
  	            (section.generatedOffset.generatedLine - 1),
  	          generatedColumn: mapping.generatedColumn +
  	            (section.generatedOffset.generatedLine === mapping.generatedLine
  	            ? section.generatedOffset.generatedColumn - 1
  	            : 0),
  	          originalLine: mapping.originalLine,
  	          originalColumn: mapping.originalColumn,
  	          name: name
  	        };
  	
  	        this.__generatedMappings.push(adjustedMapping);
  	        if (typeof adjustedMapping.originalLine === 'number') {
  	          this.__originalMappings.push(adjustedMapping);
  	        }
  	      }
  	    }
  	
  	    quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);
  	    quickSort(this.__originalMappings, util.compareByOriginalPositions);
  	  };
  	
  	exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;
  
  
  /***/ }),
  /* 8 */
  /***/ (function(module, exports) {
  
  	/* -*- Mode: js; js-indent-level: 2; -*- */
  	/*
  	 * Copyright 2011 Mozilla Foundation and contributors
  	 * Licensed under the New BSD license. See LICENSE or:
  	 * http://opensource.org/licenses/BSD-3-Clause
  	 */
  	
  	exports.GREATEST_LOWER_BOUND = 1;
  	exports.LEAST_UPPER_BOUND = 2;
  	
  	/**
  	 * Recursive implementation of binary search.
  	 *
  	 * @param aLow Indices here and lower do not contain the needle.
  	 * @param aHigh Indices here and higher do not contain the needle.
  	 * @param aNeedle The element being searched for.
  	 * @param aHaystack The non-empty array being searched.
  	 * @param aCompare Function which takes two elements and returns -1, 0, or 1.
  	 * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
  	 *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
  	 *     closest element that is smaller than or greater than the one we are
  	 *     searching for, respectively, if the exact element cannot be found.
  	 */
  	function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {
  	  // This function terminates when one of the following is true:
  	  //
  	  //   1. We find the exact element we are looking for.
  	  //
  	  //   2. We did not find the exact element, but we can return the index of
  	  //      the next-closest element.
  	  //
  	  //   3. We did not find the exact element, and there is no next-closest
  	  //      element than the one we are searching for, so we return -1.
  	  var mid = Math.floor((aHigh - aLow) / 2) + aLow;
  	  var cmp = aCompare(aNeedle, aHaystack[mid], true);
  	  if (cmp === 0) {
  	    // Found the element we are looking for.
  	    return mid;
  	  }
  	  else if (cmp > 0) {
  	    // Our needle is greater than aHaystack[mid].
  	    if (aHigh - mid > 1) {
  	      // The element is in the upper half.
  	      return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);
  	    }
  	
  	    // The exact needle element was not found in this haystack. Determine if
  	    // we are in termination case (3) or (2) and return the appropriate thing.
  	    if (aBias == exports.LEAST_UPPER_BOUND) {
  	      return aHigh < aHaystack.length ? aHigh : -1;
  	    } else {
  	      return mid;
  	    }
  	  }
  	  else {
  	    // Our needle is less than aHaystack[mid].
  	    if (mid - aLow > 1) {
  	      // The element is in the lower half.
  	      return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);
  	    }
  	
  	    // we are in termination case (3) or (2) and return the appropriate thing.
  	    if (aBias == exports.LEAST_UPPER_BOUND) {
  	      return mid;
  	    } else {
  	      return aLow < 0 ? -1 : aLow;
  	    }
  	  }
  	}
  	
  	/**
  	 * This is an implementation of binary search which will always try and return
  	 * the index of the closest element if there is no exact hit. This is because
  	 * mappings between original and generated line/col pairs are single points,
  	 * and there is an implicit region between each of them, so a miss just means
  	 * that you aren't on the very start of a region.
  	 *
  	 * @param aNeedle The element you are looking for.
  	 * @param aHaystack The array that is being searched.
  	 * @param aCompare A function which takes the needle and an element in the
  	 *     array and returns -1, 0, or 1 depending on whether the needle is less
  	 *     than, equal to, or greater than the element, respectively.
  	 * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
  	 *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
  	 *     closest element that is smaller than or greater than the one we are
  	 *     searching for, respectively, if the exact element cannot be found.
  	 *     Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.
  	 */
  	exports.search = function search(aNeedle, aHaystack, aCompare, aBias) {
  	  if (aHaystack.length === 0) {
  	    return -1;
  	  }
  	
  	  var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,
  	                              aCompare, aBias || exports.GREATEST_LOWER_BOUND);
  	  if (index < 0) {
  	    return -1;
  	  }
  	
  	  // We have found either the exact element, or the next-closest element than
  	  // the one we are searching for. However, there may be more than one such
  	  // element. Make sure we always return the smallest of these.
  	  while (index - 1 >= 0) {
  	    if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {
  	      break;
  	    }
  	    --index;
  	  }
  	
  	  return index;
  	};
  
  
  /***/ }),
  /* 9 */
  /***/ (function(module, exports) {
  
  	/* -*- Mode: js; js-indent-level: 2; -*- */
  	/*
  	 * Copyright 2011 Mozilla Foundation and contributors
  	 * Licensed under the New BSD license. See LICENSE or:
  	 * http://opensource.org/licenses/BSD-3-Clause
  	 */
  	
  	// It turns out that some (most?) JavaScript engines don't self-host
  	// `Array.prototype.sort`. This makes sense because C++ will likely remain
  	// faster than JS when doing raw CPU-intensive sorting. However, when using a
  	// custom comparator function, calling back and forth between the VM's C++ and
  	// JIT'd JS is rather slow *and* loses JIT type information, resulting in
  	// worse generated code for the comparator function than would be optimal. In
  	// fact, when sorting with a comparator, these costs outweigh the benefits of
  	// sorting in C++. By using our own JS-implemented Quick Sort (below), we get
  	// a ~3500ms mean speed-up in `bench/bench.html`.
  	
  	/**
  	 * Swap the elements indexed by `x` and `y` in the array `ary`.
  	 *
  	 * @param {Array} ary
  	 *        The array.
  	 * @param {Number} x
  	 *        The index of the first item.
  	 * @param {Number} y
  	 *        The index of the second item.
  	 */
  	function swap(ary, x, y) {
  	  var temp = ary[x];
  	  ary[x] = ary[y];
  	  ary[y] = temp;
  	}
  	
  	/**
  	 * Returns a random integer within the range `low .. high` inclusive.
  	 *
  	 * @param {Number} low
  	 *        The lower bound on the range.
  	 * @param {Number} high
  	 *        The upper bound on the range.
  	 */
  	function randomIntInRange(low, high) {
  	  return Math.round(low + (Math.random() * (high - low)));
  	}
  	
  	/**
  	 * The Quick Sort algorithm.
  	 *
  	 * @param {Array} ary
  	 *        An array to sort.
  	 * @param {function} comparator
  	 *        Function to use to compare two items.
  	 * @param {Number} p
  	 *        Start index of the array
  	 * @param {Number} r
  	 *        End index of the array
  	 */
  	function doQuickSort(ary, comparator, p, r) {
  	  // If our lower bound is less than our upper bound, we (1) partition the
  	  // array into two pieces and (2) recurse on each half. If it is not, this is
  	  // the empty array and our base case.
  	
  	  if (p < r) {
  	    // (1) Partitioning.
  	    //
  	    // The partitioning chooses a pivot between `p` and `r` and moves all
  	    // elements that are less than or equal to the pivot to the before it, and
  	    // all the elements that are greater than it after it. The effect is that
  	    // once partition is done, the pivot is in the exact place it will be when
  	    // the array is put in sorted order, and it will not need to be moved
  	    // again. This runs in O(n) time.
  	
  	    // Always choose a random pivot so that an input array which is reverse
  	    // sorted does not cause O(n^2) running time.
  	    var pivotIndex = randomIntInRange(p, r);
  	    var i = p - 1;
  	
  	    swap(ary, pivotIndex, r);
  	    var pivot = ary[r];
  	
  	    // Immediately after `j` is incremented in this loop, the following hold
  	    // true:
  	    //
  	    //   * Every element in `ary[p .. i]` is less than or equal to the pivot.
  	    //
  	    //   * Every element in `ary[i+1 .. j-1]` is greater than the pivot.
  	    for (var j = p; j < r; j++) {
  	      if (comparator(ary[j], pivot) <= 0) {
  	        i += 1;
  	        swap(ary, i, j);
  	      }
  	    }
  	
  	    swap(ary, i + 1, j);
  	    var q = i + 1;
  	
  	    // (2) Recurse on each half.
  	
  	    doQuickSort(ary, comparator, p, q - 1);
  	    doQuickSort(ary, comparator, q + 1, r);
  	  }
  	}
  	
  	/**
  	 * Sort the given array in-place with the given comparator function.
  	 *
  	 * @param {Array} ary
  	 *        An array to sort.
  	 * @param {function} comparator
  	 *        Function to use to compare two items.
  	 */
  	exports.quickSort = function (ary, comparator) {
  	  doQuickSort(ary, comparator, 0, ary.length - 1);
  	};
  
  
  /***/ }),
  /* 10 */
  /***/ (function(module, exports, __webpack_require__) {
  
  	/* -*- Mode: js; js-indent-level: 2; -*- */
  	/*
  	 * Copyright 2011 Mozilla Foundation and contributors
  	 * Licensed under the New BSD license. See LICENSE or:
  	 * http://opensource.org/licenses/BSD-3-Clause
  	 */
  	
  	var SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;
  	var util = __webpack_require__(4);
  	
  	// Matches a Windows-style `\r\n` newline or a `\n` newline used by all other
  	// operating systems these days (capturing the result).
  	var REGEX_NEWLINE = /(\r?\n)/;
  	
  	// Newline character code for charCodeAt() comparisons
  	var NEWLINE_CODE = 10;
  	
  	// Private symbol for identifying `SourceNode`s when multiple versions of
  	// the source-map library are loaded. This MUST NOT CHANGE across
  	// versions!
  	var isSourceNode = "$$$isSourceNode$$$";
  	
  	/**
  	 * SourceNodes provide a way to abstract over interpolating/concatenating
  	 * snippets of generated JavaScript source code while maintaining the line and
  	 * column information associated with the original source code.
  	 *
  	 * @param aLine The original line number.
  	 * @param aColumn The original column number.
  	 * @param aSource The original source's filename.
  	 * @param aChunks Optional. An array of strings which are snippets of
  	 *        generated JS, or other SourceNodes.
  	 * @param aName The original identifier.
  	 */
  	function SourceNode(aLine, aColumn, aSource, aChunks, aName) {
  	  this.children = [];
  	  this.sourceContents = {};
  	  this.line = aLine == null ? null : aLine;
  	  this.column = aColumn == null ? null : aColumn;
  	  this.source = aSource == null ? null : aSource;
  	  this.name = aName == null ? null : aName;
  	  this[isSourceNode] = true;
  	  if (aChunks != null) this.add(aChunks);
  	}
  	
  	/**
  	 * Creates a SourceNode from generated code and a SourceMapConsumer.
  	 *
  	 * @param aGeneratedCode The generated code
  	 * @param aSourceMapConsumer The SourceMap for the generated code
  	 * @param aRelativePath Optional. The path that relative sources in the
  	 *        SourceMapConsumer should be relative to.
  	 */
  	SourceNode.fromStringWithSourceMap =
  	  function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {
  	    // The SourceNode we want to fill with the generated code
  	    // and the SourceMap
  	    var node = new SourceNode();
  	
  	    // All even indices of this array are one line of the generated code,
  	    // while all odd indices are the newlines between two adjacent lines
  	    // (since `REGEX_NEWLINE` captures its match).
  	    // Processed fragments are accessed by calling `shiftNextLine`.
  	    var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);
  	    var remainingLinesIndex = 0;
  	    var shiftNextLine = function() {
  	      var lineContents = getNextLine();
  	      // The last line of a file might not have a newline.
  	      var newLine = getNextLine() || "";
  	      return lineContents + newLine;
  	
  	      function getNextLine() {
  	        return remainingLinesIndex < remainingLines.length ?
  	            remainingLines[remainingLinesIndex++] : undefined;
  	      }
  	    };
  	
  	    // We need to remember the position of "remainingLines"
  	    var lastGeneratedLine = 1, lastGeneratedColumn = 0;
  	
  	    // The generate SourceNodes we need a code range.
  	    // To extract it current and last mapping is used.
  	    // Here we store the last mapping.
  	    var lastMapping = null;
  	
  	    aSourceMapConsumer.eachMapping(function (mapping) {
  	      if (lastMapping !== null) {
  	        // We add the code from "lastMapping" to "mapping":
  	        // First check if there is a new line in between.
  	        if (lastGeneratedLine < mapping.generatedLine) {
  	          // Associate first line with "lastMapping"
  	          addMappingWithCode(lastMapping, shiftNextLine());
  	          lastGeneratedLine++;
  	          lastGeneratedColumn = 0;
  	          // The remaining code is added without mapping
  	        } else {
  	          // There is no new line in between.
  	          // Associate the code between "lastGeneratedColumn" and
  	          // "mapping.generatedColumn" with "lastMapping"
  	          var nextLine = remainingLines[remainingLinesIndex] || '';
  	          var code = nextLine.substr(0, mapping.generatedColumn -
  	                                        lastGeneratedColumn);
  	          remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -
  	                                              lastGeneratedColumn);
  	          lastGeneratedColumn = mapping.generatedColumn;
  	          addMappingWithCode(lastMapping, code);
  	          // No more remaining code, continue
  	          lastMapping = mapping;
  	          return;
  	        }
  	      }
  	      // We add the generated code until the first mapping
  	      // to the SourceNode without any mapping.
  	      // Each line is added as separate string.
  	      while (lastGeneratedLine < mapping.generatedLine) {
  	        node.add(shiftNextLine());
  	        lastGeneratedLine++;
  	      }
  	      if (lastGeneratedColumn < mapping.generatedColumn) {
  	        var nextLine = remainingLines[remainingLinesIndex] || '';
  	        node.add(nextLine.substr(0, mapping.generatedColumn));
  	        remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);
  	        lastGeneratedColumn = mapping.generatedColumn;
  	      }
  	      lastMapping = mapping;
  	    }, this);
  	    // We have processed all mappings.
  	    if (remainingLinesIndex < remainingLines.length) {
  	      if (lastMapping) {
  	        // Associate the remaining code in the current line with "lastMapping"
  	        addMappingWithCode(lastMapping, shiftNextLine());
  	      }
  	      // and add the remaining lines without any mapping
  	      node.add(remainingLines.splice(remainingLinesIndex).join(""));
  	    }
  	
  	    // Copy sourcesContent into SourceNode
  	    aSourceMapConsumer.sources.forEach(function (sourceFile) {
  	      var content = aSourceMapConsumer.sourceContentFor(sourceFile);
  	      if (content != null) {
  	        if (aRelativePath != null) {
  	          sourceFile = util.join(aRelativePath, sourceFile);
  	        }
  	        node.setSourceContent(sourceFile, content);
  	      }
  	    });
  	
  	    return node;
  	
  	    function addMappingWithCode(mapping, code) {
  	      if (mapping === null || mapping.source === undefined) {
  	        node.add(code);
  	      } else {
  	        var source = aRelativePath
  	          ? util.join(aRelativePath, mapping.source)
  	          : mapping.source;
  	        node.add(new SourceNode(mapping.originalLine,
  	                                mapping.originalColumn,
  	                                source,
  	                                code,
  	                                mapping.name));
  	      }
  	    }
  	  };
  	
  	/**
  	 * Add a chunk of generated JS to this source node.
  	 *
  	 * @param aChunk A string snippet of generated JS code, another instance of
  	 *        SourceNode, or an array where each member is one of those things.
  	 */
  	SourceNode.prototype.add = function SourceNode_add(aChunk) {
  	  if (Array.isArray(aChunk)) {
  	    aChunk.forEach(function (chunk) {
  	      this.add(chunk);
  	    }, this);
  	  }
  	  else if (aChunk[isSourceNode] || typeof aChunk === "string") {
  	    if (aChunk) {
  	      this.children.push(aChunk);
  	    }
  	  }
  	  else {
  	    throw new TypeError(
  	      "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
  	    );
  	  }
  	  return this;
  	};
  	
  	/**
  	 * Add a chunk of generated JS to the beginning of this source node.
  	 *
  	 * @param aChunk A string snippet of generated JS code, another instance of
  	 *        SourceNode, or an array where each member is one of those things.
  	 */
  	SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {
  	  if (Array.isArray(aChunk)) {
  	    for (var i = aChunk.length-1; i >= 0; i--) {
  	      this.prepend(aChunk[i]);
  	    }
  	  }
  	  else if (aChunk[isSourceNode] || typeof aChunk === "string") {
  	    this.children.unshift(aChunk);
  	  }
  	  else {
  	    throw new TypeError(
  	      "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
  	    );
  	  }
  	  return this;
  	};
  	
  	/**
  	 * Walk over the tree of JS snippets in this node and its children. The
  	 * walking function is called once for each snippet of JS and is passed that
  	 * snippet and the its original associated source's line/column location.
  	 *
  	 * @param aFn The traversal function.
  	 */
  	SourceNode.prototype.walk = function SourceNode_walk(aFn) {
  	  var chunk;
  	  for (var i = 0, len = this.children.length; i < len; i++) {
  	    chunk = this.children[i];
  	    if (chunk[isSourceNode]) {
  	      chunk.walk(aFn);
  	    }
  	    else {
  	      if (chunk !== '') {
  	        aFn(chunk, { source: this.source,
  	                     line: this.line,
  	                     column: this.column,
  	                     name: this.name });
  	      }
  	    }
  	  }
  	};
  	
  	/**
  	 * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between
  	 * each of `this.children`.
  	 *
  	 * @param aSep The separator.
  	 */
  	SourceNode.prototype.join = function SourceNode_join(aSep) {
  	  var newChildren;
  	  var i;
  	  var len = this.children.length;
  	  if (len > 0) {
  	    newChildren = [];
  	    for (i = 0; i < len-1; i++) {
  	      newChildren.push(this.children[i]);
  	      newChildren.push(aSep);
  	    }
  	    newChildren.push(this.children[i]);
  	    this.children = newChildren;
  	  }
  	  return this;
  	};
  	
  	/**
  	 * Call String.prototype.replace on the very right-most source snippet. Useful
  	 * for trimming whitespace from the end of a source node, etc.
  	 *
  	 * @param aPattern The pattern to replace.
  	 * @param aReplacement The thing to replace the pattern with.
  	 */
  	SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {
  	  var lastChild = this.children[this.children.length - 1];
  	  if (lastChild[isSourceNode]) {
  	    lastChild.replaceRight(aPattern, aReplacement);
  	  }
  	  else if (typeof lastChild === 'string') {
  	    this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);
  	  }
  	  else {
  	    this.children.push(''.replace(aPattern, aReplacement));
  	  }
  	  return this;
  	};
  	
  	/**
  	 * Set the source content for a source file. This will be added to the SourceMapGenerator
  	 * in the sourcesContent field.
  	 *
  	 * @param aSourceFile The filename of the source file
  	 * @param aSourceContent The content of the source file
  	 */
  	SourceNode.prototype.setSourceContent =
  	  function SourceNode_setSourceContent(aSourceFile, aSourceContent) {
  	    this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;
  	  };
  	
  	/**
  	 * Walk over the tree of SourceNodes. The walking function is called for each
  	 * source file content and is passed the filename and source content.
  	 *
  	 * @param aFn The traversal function.
  	 */
  	SourceNode.prototype.walkSourceContents =
  	  function SourceNode_walkSourceContents(aFn) {
  	    for (var i = 0, len = this.children.length; i < len; i++) {
  	      if (this.children[i][isSourceNode]) {
  	        this.children[i].walkSourceContents(aFn);
  	      }
  	    }
  	
  	    var sources = Object.keys(this.sourceContents);
  	    for (var i = 0, len = sources.length; i < len; i++) {
  	      aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);
  	    }
  	  };
  	
  	/**
  	 * Return the string representation of this source node. Walks over the tree
  	 * and concatenates all the various snippets together to one string.
  	 */
  	SourceNode.prototype.toString = function SourceNode_toString() {
  	  var str = "";
  	  this.walk(function (chunk) {
  	    str += chunk;
  	  });
  	  return str;
  	};
  	
  	/**
  	 * Returns the string representation of this source node along with a source
  	 * map.
  	 */
  	SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {
  	  var generated = {
  	    code: "",
  	    line: 1,
  	    column: 0
  	  };
  	  var map = new SourceMapGenerator(aArgs);
  	  var sourceMappingActive = false;
  	  var lastOriginalSource = null;
  	  var lastOriginalLine = null;
  	  var lastOriginalColumn = null;
  	  var lastOriginalName = null;
  	  this.walk(function (chunk, original) {
  	    generated.code += chunk;
  	    if (original.source !== null
  	        && original.line !== null
  	        && original.column !== null) {
  	      if(lastOriginalSource !== original.source
  	         || lastOriginalLine !== original.line
  	         || lastOriginalColumn !== original.column
  	         || lastOriginalName !== original.name) {
  	        map.addMapping({
  	          source: original.source,
  	          original: {
  	            line: original.line,
  	            column: original.column
  	          },
  	          generated: {
  	            line: generated.line,
  	            column: generated.column
  	          },
  	          name: original.name
  	        });
  	      }
  	      lastOriginalSource = original.source;
  	      lastOriginalLine = original.line;
  	      lastOriginalColumn = original.column;
  	      lastOriginalName = original.name;
  	      sourceMappingActive = true;
  	    } else if (sourceMappingActive) {
  	      map.addMapping({
  	        generated: {
  	          line: generated.line,
  	          column: generated.column
  	        }
  	      });
  	      lastOriginalSource = null;
  	      sourceMappingActive = false;
  	    }
  	    for (var idx = 0, length = chunk.length; idx < length; idx++) {
  	      if (chunk.charCodeAt(idx) === NEWLINE_CODE) {
  	        generated.line++;
  	        generated.column = 0;
  	        // Mappings end at eol
  	        if (idx + 1 === length) {
  	          lastOriginalSource = null;
  	          sourceMappingActive = false;
  	        } else if (sourceMappingActive) {
  	          map.addMapping({
  	            source: original.source,
  	            original: {
  	              line: original.line,
  	              column: original.column
  	            },
  	            generated: {
  	              line: generated.line,
  	              column: generated.column
  	            },
  	            name: original.name
  	          });
  	        }
  	      } else {
  	        generated.column++;
  	      }
  	    }
  	  });
  	  this.walkSourceContents(function (sourceFile, sourceContent) {
  	    map.setSourceContent(sourceFile, sourceContent);
  	  });
  	
  	  return { code: generated.code, map: map };
  	};
  	
  	exports.SourceNode = SourceNode;
  
  
  /***/ })
  /******/ ])
  });
  ;
  //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCAxNjI0YzcyOTliODg3ZjdiZGY2NCIsIndlYnBhY2s6Ly8vLi9zb3VyY2UtbWFwLmpzIiwid2VicGFjazovLy8uL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmFzZTY0LXZscS5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmFzZTY0LmpzIiwid2VicGFjazovLy8uL2xpYi91dGlsLmpzIiwid2VicGFjazovLy8uL2xpYi9hcnJheS1zZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL21hcHBpbmctbGlzdC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvc291cmNlLW1hcC1jb25zdW1lci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmluYXJ5LXNlYXJjaC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvcXVpY2stc29ydC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvc291cmNlLW5vZGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87QUNWQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNQQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE1BQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJDQUEwQyxTQUFTO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUJBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7OztBQ3hhQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBMkQ7QUFDM0QscUJBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7O0FBRUg7QUFDQTtBQUNBOzs7Ozs7O0FDM0lBLGlCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFnQjtBQUNoQixpQkFBZ0I7O0FBRWhCLG9CQUFtQjtBQUNuQixxQkFBb0I7O0FBRXBCLGlCQUFnQjtBQUNoQixpQkFBZ0I7O0FBRWhCLGlCQUFnQjtBQUNoQixrQkFBaUI7O0FBRWpCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7O0FDbEVBLGlCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw0QkFBMkIsUUFBUTtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWE7QUFDYjs7QUFFQTtBQUNBLGVBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUFzQztBQUN0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7O0FDdmVBLGlCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUFzQyxTQUFTO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7QUN4SEEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFnQjtBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7QUM5RUEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0Esb0JBQW1CO0FBQ25COztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVc7O0FBRVg7QUFDQTtBQUNBLFFBQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTJCLE1BQU07QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWEsa0NBQWtDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVEQUFzRCxZQUFZO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBeUIsY0FBYztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXVCLHdDQUF3QztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUErQyxtQkFBbUIsRUFBRTtBQUNwRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBaUIsb0JBQW9CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBNkIsTUFBTTtBQUNuQztBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBbUIsMkJBQTJCO0FBQzlDLHNCQUFxQiwrQ0FBK0M7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW1CLDJCQUEyQjtBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFtQiwyQkFBMkI7QUFDOUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW1CLDJCQUEyQjtBQUM5QztBQUNBO0FBQ0Esc0JBQXFCLDRCQUE0QjtBQUNqRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7OztBQ3huQ0EsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7QUM5R0EsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFXLE1BQU07QUFDakI7QUFDQSxZQUFXLE9BQU87QUFDbEI7QUFDQSxZQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBVyxNQUFNO0FBQ2pCO0FBQ0EsWUFBVyxTQUFTO0FBQ3BCO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBbUIsT0FBTztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBVyxNQUFNO0FBQ2pCO0FBQ0EsWUFBVyxTQUFTO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNqSEEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWlDLFFBQVE7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLFNBQVM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQW9CO0FBQ3BCO0FBQ0E7QUFDQSx1Q0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWUsV0FBVztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQStDLFNBQVM7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQ0FBeUMsU0FBUztBQUNsRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxZQUFXO0FBQ1g7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsNkNBQTRDLGNBQWM7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxjQUFhO0FBQ2I7QUFDQSxZQUFXO0FBQ1g7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQSxJQUFHOztBQUVILFdBQVU7QUFDVjs7QUFFQSIsImZpbGUiOiJzb3VyY2UtbWFwLmRlYnVnLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wic291cmNlTWFwXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcInNvdXJjZU1hcFwiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuIFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0ZXhwb3J0czoge30sXG4gXHRcdFx0aWQ6IG1vZHVsZUlkLFxuIFx0XHRcdGxvYWRlZDogZmFsc2VcbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCAxNjI0YzcyOTliODg3ZjdiZGY2NCIsIi8qXG4gKiBDb3B5cmlnaHQgMjAwOS0yMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRS50eHQgb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbmV4cG9ydHMuU291cmNlTWFwR2VuZXJhdG9yID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW1hcC1nZW5lcmF0b3InKS5Tb3VyY2VNYXBHZW5lcmF0b3I7XG5leHBvcnRzLlNvdXJjZU1hcENvbnN1bWVyID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW1hcC1jb25zdW1lcicpLlNvdXJjZU1hcENvbnN1bWVyO1xuZXhwb3J0cy5Tb3VyY2VOb2RlID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW5vZGUnKS5Tb3VyY2VOb2RlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zb3VyY2UtbWFwLmpzXG4vLyBtb2R1bGUgaWQgPSAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIGJhc2U2NFZMUSA9IHJlcXVpcmUoJy4vYmFzZTY0LXZscScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBBcnJheVNldCA9IHJlcXVpcmUoJy4vYXJyYXktc2V0JykuQXJyYXlTZXQ7XG52YXIgTWFwcGluZ0xpc3QgPSByZXF1aXJlKCcuL21hcHBpbmctbGlzdCcpLk1hcHBpbmdMaXN0O1xuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IgcmVwcmVzZW50cyBhIHNvdXJjZSBtYXAgd2hpY2ggaXNcbiAqIGJlaW5nIGJ1aWx0IGluY3JlbWVudGFsbHkuIFlvdSBtYXkgcGFzcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nXG4gKiBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBmaWxlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gKiAgIC0gc291cmNlUm9vdDogQSByb290IGZvciBhbGwgcmVsYXRpdmUgVVJMcyBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcihhQXJncykge1xuICBpZiAoIWFBcmdzKSB7XG4gICAgYUFyZ3MgPSB7fTtcbiAgfVxuICB0aGlzLl9maWxlID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdmaWxlJywgbnVsbCk7XG4gIHRoaXMuX3NvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZVJvb3QnLCBudWxsKTtcbiAgdGhpcy5fc2tpcFZhbGlkYXRpb24gPSB1dGlsLmdldEFyZyhhQXJncywgJ3NraXBWYWxpZGF0aW9uJywgZmFsc2UpO1xuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX21hcHBpbmdzID0gbmV3IE1hcHBpbmdMaXN0KCk7XG4gIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IG51bGw7XG59XG5cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgU291cmNlTWFwR2VuZXJhdG9yIGJhc2VkIG9uIGEgU291cmNlTWFwQ29uc3VtZXJcbiAqXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBTb3VyY2VNYXAuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5mcm9tU291cmNlTWFwID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2Zyb21Tb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyKSB7XG4gICAgdmFyIHNvdXJjZVJvb3QgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlUm9vdDtcbiAgICB2YXIgZ2VuZXJhdG9yID0gbmV3IFNvdXJjZU1hcEdlbmVyYXRvcih7XG4gICAgICBmaWxlOiBhU291cmNlTWFwQ29uc3VtZXIuZmlsZSxcbiAgICAgIHNvdXJjZVJvb3Q6IHNvdXJjZVJvb3RcbiAgICB9KTtcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuZWFjaE1hcHBpbmcoZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgIHZhciBuZXdNYXBwaW5nID0ge1xuICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICBsaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtblxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICBuZXdNYXBwaW5nLnNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3TWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG5ld01hcHBpbmcuc291cmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5ld01hcHBpbmcub3JpZ2luYWwgPSB7XG4gICAgICAgICAgbGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG1hcHBpbmcubmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3TWFwcGluZy5uYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGdlbmVyYXRvci5hZGRNYXBwaW5nKG5ld01hcHBpbmcpO1xuICAgIH0pO1xuICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgIHZhciBzb3VyY2VSZWxhdGl2ZSA9IHNvdXJjZUZpbGU7XG4gICAgICBpZiAoc291cmNlUm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzb3VyY2VSZWxhdGl2ZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlRmlsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZ2VuZXJhdG9yLl9zb3VyY2VzLmhhcyhzb3VyY2VSZWxhdGl2ZSkpIHtcbiAgICAgICAgZ2VuZXJhdG9yLl9zb3VyY2VzLmFkZChzb3VyY2VSZWxhdGl2ZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGdlbmVyYXRvci5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIGNvbnRlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH07XG5cbi8qKlxuICogQWRkIGEgc2luZ2xlIG1hcHBpbmcgZnJvbSBvcmlnaW5hbCBzb3VyY2UgbGluZSBhbmQgY29sdW1uIHRvIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBmb3IgdGhpcyBzb3VyY2UgbWFwIGJlaW5nIGNyZWF0ZWQuIFRoZSBtYXBwaW5nXG4gKiBvYmplY3Qgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBnZW5lcmF0ZWQ6IEFuIG9iamVjdCB3aXRoIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucy5cbiAqICAgLSBvcmlnaW5hbDogQW4gb2JqZWN0IHdpdGggdGhlIG9yaWdpbmFsIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMuXG4gKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUgKHJlbGF0aXZlIHRvIHRoZSBzb3VyY2VSb290KS5cbiAqICAgLSBuYW1lOiBBbiBvcHRpb25hbCBvcmlnaW5hbCB0b2tlbiBuYW1lIGZvciB0aGlzIG1hcHBpbmcuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYWRkTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9hZGRNYXBwaW5nKGFBcmdzKSB7XG4gICAgdmFyIGdlbmVyYXRlZCA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnZ2VuZXJhdGVkJyk7XG4gICAgdmFyIG9yaWdpbmFsID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdvcmlnaW5hbCcsIG51bGwpO1xuICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScsIG51bGwpO1xuICAgIHZhciBuYW1lID0gdXRpbC5nZXRBcmcoYUFyZ3MsICduYW1lJywgbnVsbCk7XG5cbiAgICBpZiAoIXRoaXMuX3NraXBWYWxpZGF0aW9uKSB7XG4gICAgICB0aGlzLl92YWxpZGF0ZU1hcHBpbmcoZ2VuZXJhdGVkLCBvcmlnaW5hbCwgc291cmNlLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZSA9IFN0cmluZyhzb3VyY2UpO1xuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5hbWUgIT0gbnVsbCkge1xuICAgICAgbmFtZSA9IFN0cmluZyhuYW1lKTtcbiAgICAgIGlmICghdGhpcy5fbmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIHRoaXMuX25hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9tYXBwaW5ncy5hZGQoe1xuICAgICAgZ2VuZXJhdGVkTGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICBnZW5lcmF0ZWRDb2x1bW46IGdlbmVyYXRlZC5jb2x1bW4sXG4gICAgICBvcmlnaW5hbExpbmU6IG9yaWdpbmFsICE9IG51bGwgJiYgb3JpZ2luYWwubGluZSxcbiAgICAgIG9yaWdpbmFsQ29sdW1uOiBvcmlnaW5hbCAhPSBudWxsICYmIG9yaWdpbmFsLmNvbHVtbixcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgbmFtZTogbmFtZVxuICAgIH0pO1xuICB9O1xuXG4vKipcbiAqIFNldCB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGEgc291cmNlIGZpbGUuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuc2V0U291cmNlQ29udGVudCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgIHZhciBzb3VyY2UgPSBhU291cmNlRmlsZTtcbiAgICBpZiAodGhpcy5fc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBzb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuX3NvdXJjZVJvb3QsIHNvdXJjZSk7XG4gICAgfVxuXG4gICAgaWYgKGFTb3VyY2VDb250ZW50ICE9IG51bGwpIHtcbiAgICAgIC8vIEFkZCB0aGUgc291cmNlIGNvbnRlbnQgdG8gdGhlIF9zb3VyY2VzQ29udGVudHMgbWFwLlxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IF9zb3VyY2VzQ29udGVudHMgbWFwIGlmIHRoZSBwcm9wZXJ0eSBpcyBudWxsLlxuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgICAgdGhpcy5fc291cmNlc0NvbnRlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgc291cmNlIGZpbGUgZnJvbSB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAuXG4gICAgICAvLyBJZiB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAgaXMgZW1wdHksIHNldCB0aGUgcHJvcGVydHkgdG8gbnVsbC5cbiAgICAgIGRlbGV0ZSB0aGlzLl9zb3VyY2VzQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhzb3VyY2UpXTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9zb3VyY2VzQ29udGVudHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLl9zb3VyY2VzQ29udGVudHMgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBtYXBwaW5ncyBvZiBhIHN1Yi1zb3VyY2UtbWFwIGZvciBhIHNwZWNpZmljIHNvdXJjZSBmaWxlIHRvIHRoZVxuICogc291cmNlIG1hcCBiZWluZyBnZW5lcmF0ZWQuIEVhY2ggbWFwcGluZyB0byB0aGUgc3VwcGxpZWQgc291cmNlIGZpbGUgaXNcbiAqIHJld3JpdHRlbiB1c2luZyB0aGUgc3VwcGxpZWQgc291cmNlIG1hcC4gTm90ZTogVGhlIHJlc29sdXRpb24gZm9yIHRoZVxuICogcmVzdWx0aW5nIG1hcHBpbmdzIGlzIHRoZSBtaW5pbWl1bSBvZiB0aGlzIG1hcCBhbmQgdGhlIHN1cHBsaWVkIG1hcC5cbiAqXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBzb3VyY2UgbWFwIHRvIGJlIGFwcGxpZWQuXG4gKiBAcGFyYW0gYVNvdXJjZUZpbGUgT3B0aW9uYWwuIFRoZSBmaWxlbmFtZSBvZiB0aGUgc291cmNlIGZpbGUuXG4gKiAgICAgICAgSWYgb21pdHRlZCwgU291cmNlTWFwQ29uc3VtZXIncyBmaWxlIHByb3BlcnR5IHdpbGwgYmUgdXNlZC5cbiAqIEBwYXJhbSBhU291cmNlTWFwUGF0aCBPcHRpb25hbC4gVGhlIGRpcm5hbWUgb2YgdGhlIHBhdGggdG8gdGhlIHNvdXJjZSBtYXBcbiAqICAgICAgICB0byBiZSBhcHBsaWVkLiBJZiByZWxhdGl2ZSwgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIFNvdXJjZU1hcENvbnN1bWVyLlxuICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIG5lZWRlZCB3aGVuIHRoZSB0d28gc291cmNlIG1hcHMgYXJlbid0IGluIHRoZSBzYW1lXG4gKiAgICAgICAgZGlyZWN0b3J5LCBhbmQgdGhlIHNvdXJjZSBtYXAgdG8gYmUgYXBwbGllZCBjb250YWlucyByZWxhdGl2ZSBzb3VyY2VcbiAqICAgICAgICBwYXRocy4gSWYgc28sIHRob3NlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBuZWVkIHRvIGJlIHJld3JpdHRlblxuICogICAgICAgIHJlbGF0aXZlIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYXBwbHlTb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfYXBwbHlTb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyLCBhU291cmNlRmlsZSwgYVNvdXJjZU1hcFBhdGgpIHtcbiAgICB2YXIgc291cmNlRmlsZSA9IGFTb3VyY2VGaWxlO1xuICAgIC8vIElmIGFTb3VyY2VGaWxlIGlzIG9taXR0ZWQsIHdlIHdpbGwgdXNlIHRoZSBmaWxlIHByb3BlcnR5IG9mIHRoZSBTb3VyY2VNYXBcbiAgICBpZiAoYVNvdXJjZUZpbGUgPT0gbnVsbCkge1xuICAgICAgaWYgKGFTb3VyY2VNYXBDb25zdW1lci5maWxlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLmFwcGx5U291cmNlTWFwIHJlcXVpcmVzIGVpdGhlciBhbiBleHBsaWNpdCBzb3VyY2UgZmlsZSwgJyArXG4gICAgICAgICAgJ29yIHRoZSBzb3VyY2UgbWFwXFwncyBcImZpbGVcIiBwcm9wZXJ0eS4gQm90aCB3ZXJlIG9taXR0ZWQuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgc291cmNlRmlsZSA9IGFTb3VyY2VNYXBDb25zdW1lci5maWxlO1xuICAgIH1cbiAgICB2YXIgc291cmNlUm9vdCA9IHRoaXMuX3NvdXJjZVJvb3Q7XG4gICAgLy8gTWFrZSBcInNvdXJjZUZpbGVcIiByZWxhdGl2ZSBpZiBhbiBhYnNvbHV0ZSBVcmwgaXMgcGFzc2VkLlxuICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZUZpbGUpO1xuICAgIH1cbiAgICAvLyBBcHBseWluZyB0aGUgU291cmNlTWFwIGNhbiBhZGQgYW5kIHJlbW92ZSBpdGVtcyBmcm9tIHRoZSBzb3VyY2VzIGFuZFxuICAgIC8vIHRoZSBuYW1lcyBhcnJheS5cbiAgICB2YXIgbmV3U291cmNlcyA9IG5ldyBBcnJheVNldCgpO1xuICAgIHZhciBuZXdOYW1lcyA9IG5ldyBBcnJheVNldCgpO1xuXG4gICAgLy8gRmluZCBtYXBwaW5ncyBmb3IgdGhlIFwic291cmNlRmlsZVwiXG4gICAgdGhpcy5fbWFwcGluZ3MudW5zb3J0ZWRGb3JFYWNoKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgPT09IHNvdXJjZUZpbGUgJiYgbWFwcGluZy5vcmlnaW5hbExpbmUgIT0gbnVsbCkge1xuICAgICAgICAvLyBDaGVjayBpZiBpdCBjYW4gYmUgbWFwcGVkIGJ5IHRoZSBzb3VyY2UgbWFwLCB0aGVuIHVwZGF0ZSB0aGUgbWFwcGluZy5cbiAgICAgICAgdmFyIG9yaWdpbmFsID0gYVNvdXJjZU1hcENvbnN1bWVyLm9yaWdpbmFsUG9zaXRpb25Gb3Ioe1xuICAgICAgICAgIGxpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICAgIGNvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG9yaWdpbmFsLnNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgICAgLy8gQ29weSBtYXBwaW5nXG4gICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICAgICAgaWYgKGFTb3VyY2VNYXBQYXRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gdXRpbC5qb2luKGFTb3VyY2VNYXBQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgPSBvcmlnaW5hbC5saW5lO1xuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPSBvcmlnaW5hbC5jb2x1bW47XG4gICAgICAgICAgaWYgKG9yaWdpbmFsLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gb3JpZ2luYWwubmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgaWYgKHNvdXJjZSAhPSBudWxsICYmICFuZXdTb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIG5ld1NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBuYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiAhbmV3TmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIG5ld05hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cblxuICAgIH0sIHRoaXMpO1xuICAgIHRoaXMuX3NvdXJjZXMgPSBuZXdTb3VyY2VzO1xuICAgIHRoaXMuX25hbWVzID0gbmV3TmFtZXM7XG5cbiAgICAvLyBDb3B5IHNvdXJjZXNDb250ZW50cyBvZiBhcHBsaWVkIG1hcC5cbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVNvdXJjZU1hcFBhdGggIT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLmpvaW4oYVNvdXJjZU1hcFBhdGgsIHNvdXJjZUZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2VGaWxlID0gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG4gIH07XG5cbi8qKlxuICogQSBtYXBwaW5nIGNhbiBoYXZlIG9uZSBvZiB0aGUgdGhyZWUgbGV2ZWxzIG9mIGRhdGE6XG4gKlxuICogICAxLiBKdXN0IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24uXG4gKiAgIDIuIFRoZSBHZW5lcmF0ZWQgcG9zaXRpb24sIG9yaWdpbmFsIHBvc2l0aW9uLCBhbmQgb3JpZ2luYWwgc291cmNlLlxuICogICAzLiBHZW5lcmF0ZWQgYW5kIG9yaWdpbmFsIHBvc2l0aW9uLCBvcmlnaW5hbCBzb3VyY2UsIGFzIHdlbGwgYXMgYSBuYW1lXG4gKiAgICAgIHRva2VuLlxuICpcbiAqIFRvIG1haW50YWluIGNvbnNpc3RlbmN5LCB3ZSB2YWxpZGF0ZSB0aGF0IGFueSBuZXcgbWFwcGluZyBiZWluZyBhZGRlZCBmYWxsc1xuICogaW4gdG8gb25lIG9mIHRoZXNlIGNhdGVnb3JpZXMuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZhbGlkYXRlTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl92YWxpZGF0ZU1hcHBpbmcoYUdlbmVyYXRlZCwgYU9yaWdpbmFsLCBhU291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFOYW1lKSB7XG4gICAgLy8gV2hlbiBhT3JpZ2luYWwgaXMgdHJ1dGh5IGJ1dCBoYXMgZW1wdHkgdmFsdWVzIGZvciAubGluZSBhbmQgLmNvbHVtbixcbiAgICAvLyBpdCBpcyBtb3N0IGxpa2VseSBhIHByb2dyYW1tZXIgZXJyb3IuIEluIHRoaXMgY2FzZSB3ZSB0aHJvdyBhIHZlcnlcbiAgICAvLyBzcGVjaWZpYyBlcnJvciBtZXNzYWdlIHRvIHRyeSB0byBndWlkZSB0aGVtIHRoZSByaWdodCB3YXkuXG4gICAgLy8gRm9yIGV4YW1wbGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9Qb2x5bWVyL3BvbHltZXItYnVuZGxlci9wdWxsLzUxOVxuICAgIGlmIChhT3JpZ2luYWwgJiYgdHlwZW9mIGFPcmlnaW5hbC5saW5lICE9PSAnbnVtYmVyJyAmJiB0eXBlb2YgYU9yaWdpbmFsLmNvbHVtbiAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ29yaWdpbmFsLmxpbmUgYW5kIG9yaWdpbmFsLmNvbHVtbiBhcmUgbm90IG51bWJlcnMgLS0geW91IHByb2JhYmx5IG1lYW50IHRvIG9taXQgJyArXG4gICAgICAgICAgICAndGhlIG9yaWdpbmFsIG1hcHBpbmcgZW50aXJlbHkgYW5kIG9ubHkgbWFwIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24uIElmIHNvLCBwYXNzICcgK1xuICAgICAgICAgICAgJ251bGwgZm9yIHRoZSBvcmlnaW5hbCBtYXBwaW5nIGluc3RlYWQgb2YgYW4gb2JqZWN0IHdpdGggZW1wdHkgb3IgbnVsbCB2YWx1ZXMuJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChhR2VuZXJhdGVkICYmICdsaW5lJyBpbiBhR2VuZXJhdGVkICYmICdjb2x1bW4nIGluIGFHZW5lcmF0ZWRcbiAgICAgICAgJiYgYUdlbmVyYXRlZC5saW5lID4gMCAmJiBhR2VuZXJhdGVkLmNvbHVtbiA+PSAwXG4gICAgICAgICYmICFhT3JpZ2luYWwgJiYgIWFTb3VyY2UgJiYgIWFOYW1lKSB7XG4gICAgICAvLyBDYXNlIDEuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKGFHZW5lcmF0ZWQgJiYgJ2xpbmUnIGluIGFHZW5lcmF0ZWQgJiYgJ2NvbHVtbicgaW4gYUdlbmVyYXRlZFxuICAgICAgICAgICAgICYmIGFPcmlnaW5hbCAmJiAnbGluZScgaW4gYU9yaWdpbmFsICYmICdjb2x1bW4nIGluIGFPcmlnaW5hbFxuICAgICAgICAgICAgICYmIGFHZW5lcmF0ZWQubGluZSA+IDAgJiYgYUdlbmVyYXRlZC5jb2x1bW4gPj0gMFxuICAgICAgICAgICAgICYmIGFPcmlnaW5hbC5saW5lID4gMCAmJiBhT3JpZ2luYWwuY29sdW1uID49IDBcbiAgICAgICAgICAgICAmJiBhU291cmNlKSB7XG4gICAgICAvLyBDYXNlcyAyIGFuZCAzLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtYXBwaW5nOiAnICsgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBnZW5lcmF0ZWQ6IGFHZW5lcmF0ZWQsXG4gICAgICAgIHNvdXJjZTogYVNvdXJjZSxcbiAgICAgICAgb3JpZ2luYWw6IGFPcmlnaW5hbCxcbiAgICAgICAgbmFtZTogYU5hbWVcbiAgICAgIH0pKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogU2VyaWFsaXplIHRoZSBhY2N1bXVsYXRlZCBtYXBwaW5ncyBpbiB0byB0aGUgc3RyZWFtIG9mIGJhc2UgNjQgVkxRc1xuICogc3BlY2lmaWVkIGJ5IHRoZSBzb3VyY2UgbWFwIGZvcm1hdC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fc2VyaWFsaXplTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3Jfc2VyaWFsaXplTWFwcGluZ3MoKSB7XG4gICAgdmFyIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRMaW5lID0gMTtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgcHJldmlvdXNTb3VyY2UgPSAwO1xuICAgIHZhciByZXN1bHQgPSAnJztcbiAgICB2YXIgbmV4dDtcbiAgICB2YXIgbWFwcGluZztcbiAgICB2YXIgbmFtZUlkeDtcbiAgICB2YXIgc291cmNlSWR4O1xuXG4gICAgdmFyIG1hcHBpbmdzID0gdGhpcy5fbWFwcGluZ3MudG9BcnJheSgpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBtYXBwaW5ncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgbWFwcGluZyA9IG1hcHBpbmdzW2ldO1xuICAgICAgbmV4dCA9ICcnXG5cbiAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgIHdoaWxlIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIG5leHQgKz0gJzsnO1xuICAgICAgICAgIHByZXZpb3VzR2VuZXJhdGVkTGluZSsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgaWYgKCF1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmcsIG1hcHBpbmdzW2kgLSAxXSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXh0ICs9ICcsJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKG1hcHBpbmcuc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlSWR4ID0gdGhpcy5fc291cmNlcy5pbmRleE9mKG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgbmV4dCArPSBiYXNlNjRWTFEuZW5jb2RlKHNvdXJjZUlkeCAtIHByZXZpb3VzU291cmNlKTtcbiAgICAgICAgcHJldmlvdXNTb3VyY2UgPSBzb3VyY2VJZHg7XG5cbiAgICAgICAgLy8gbGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkIGluIFNvdXJjZU1hcCBzcGVjIHZlcnNpb24gM1xuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbExpbmUgLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNPcmlnaW5hbExpbmUpO1xuICAgICAgICBwcmV2aW91c09yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lIC0gMTtcblxuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4pO1xuICAgICAgICBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICBpZiAobWFwcGluZy5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICBuYW1lSWR4ID0gdGhpcy5fbmFtZXMuaW5kZXhPZihtYXBwaW5nLm5hbWUpO1xuICAgICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShuYW1lSWR4IC0gcHJldmlvdXNOYW1lKTtcbiAgICAgICAgICBwcmV2aW91c05hbWUgPSBuYW1lSWR4O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdCArPSBuZXh0O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX2dlbmVyYXRlU291cmNlc0NvbnRlbnQgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfZ2VuZXJhdGVTb3VyY2VzQ29udGVudChhU291cmNlcywgYVNvdXJjZVJvb3QpIHtcbiAgICByZXR1cm4gYVNvdXJjZXMubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgIGlmICghdGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKGFTb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlID0gdXRpbC5yZWxhdGl2ZShhU291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgIH1cbiAgICAgIHZhciBrZXkgPSB1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSk7XG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3NvdXJjZXNDb250ZW50cywga2V5KVxuICAgICAgICA/IHRoaXMuX3NvdXJjZXNDb250ZW50c1trZXldXG4gICAgICAgIDogbnVsbDtcbiAgICB9LCB0aGlzKTtcbiAgfTtcblxuLyoqXG4gKiBFeHRlcm5hbGl6ZSB0aGUgc291cmNlIG1hcC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS50b0pTT04gPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfdG9KU09OKCkge1xuICAgIHZhciBtYXAgPSB7XG4gICAgICB2ZXJzaW9uOiB0aGlzLl92ZXJzaW9uLFxuICAgICAgc291cmNlczogdGhpcy5fc291cmNlcy50b0FycmF5KCksXG4gICAgICBuYW1lczogdGhpcy5fbmFtZXMudG9BcnJheSgpLFxuICAgICAgbWFwcGluZ3M6IHRoaXMuX3NlcmlhbGl6ZU1hcHBpbmdzKClcbiAgICB9O1xuICAgIGlmICh0aGlzLl9maWxlICE9IG51bGwpIHtcbiAgICAgIG1hcC5maWxlID0gdGhpcy5fZmlsZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgbWFwLnNvdXJjZVJvb3QgPSB0aGlzLl9zb3VyY2VSb290O1xuICAgIH1cbiAgICBpZiAodGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICBtYXAuc291cmNlc0NvbnRlbnQgPSB0aGlzLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KG1hcC5zb3VyY2VzLCBtYXAuc291cmNlUm9vdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcDtcbiAgfTtcblxuLyoqXG4gKiBSZW5kZXIgdGhlIHNvdXJjZSBtYXAgYmVpbmcgZ2VuZXJhdGVkIHRvIGEgc3RyaW5nLlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLnRvU3RyaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3RvU3RyaW5nKCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvSlNPTigpKTtcbiAgfTtcblxuZXhwb3J0cy5Tb3VyY2VNYXBHZW5lcmF0b3IgPSBTb3VyY2VNYXBHZW5lcmF0b3I7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvci5qc1xuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICpcbiAqIEJhc2VkIG9uIHRoZSBCYXNlIDY0IFZMUSBpbXBsZW1lbnRhdGlvbiBpbiBDbG9zdXJlIENvbXBpbGVyOlxuICogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jbG9zdXJlLWNvbXBpbGVyL3NvdXJjZS9icm93c2UvdHJ1bmsvc3JjL2NvbS9nb29nbGUvZGVidWdnaW5nL3NvdXJjZW1hcC9CYXNlNjRWTFEuamF2YVxuICpcbiAqIENvcHlyaWdodCAyMDExIFRoZSBDbG9zdXJlIENvbXBpbGVyIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZVxuICogICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiAqICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZFxuICogICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICogICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuICogXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCcuL2Jhc2U2NCcpO1xuXG4vLyBBIHNpbmdsZSBiYXNlIDY0IGRpZ2l0IGNhbiBjb250YWluIDYgYml0cyBvZiBkYXRhLiBGb3IgdGhlIGJhc2UgNjQgdmFyaWFibGVcbi8vIGxlbmd0aCBxdWFudGl0aWVzIHdlIHVzZSBpbiB0aGUgc291cmNlIG1hcCBzcGVjLCB0aGUgZmlyc3QgYml0IGlzIHRoZSBzaWduLFxuLy8gdGhlIG5leHQgZm91ciBiaXRzIGFyZSB0aGUgYWN0dWFsIHZhbHVlLCBhbmQgdGhlIDZ0aCBiaXQgaXMgdGhlXG4vLyBjb250aW51YXRpb24gYml0LiBUaGUgY29udGludWF0aW9uIGJpdCB0ZWxscyB1cyB3aGV0aGVyIHRoZXJlIGFyZSBtb3JlXG4vLyBkaWdpdHMgaW4gdGhpcyB2YWx1ZSBmb2xsb3dpbmcgdGhpcyBkaWdpdC5cbi8vXG4vLyAgIENvbnRpbnVhdGlvblxuLy8gICB8ICAgIFNpZ25cbi8vICAgfCAgICB8XG4vLyAgIFYgICAgVlxuLy8gICAxMDEwMTFcblxudmFyIFZMUV9CQVNFX1NISUZUID0gNTtcblxuLy8gYmluYXJ5OiAxMDAwMDBcbnZhciBWTFFfQkFTRSA9IDEgPDwgVkxRX0JBU0VfU0hJRlQ7XG5cbi8vIGJpbmFyeTogMDExMTExXG52YXIgVkxRX0JBU0VfTUFTSyA9IFZMUV9CQVNFIC0gMTtcblxuLy8gYmluYXJ5OiAxMDAwMDBcbnZhciBWTFFfQ09OVElOVUFUSU9OX0JJVCA9IFZMUV9CQVNFO1xuXG4vKipcbiAqIENvbnZlcnRzIGZyb20gYSB0d28tY29tcGxlbWVudCB2YWx1ZSB0byBhIHZhbHVlIHdoZXJlIHRoZSBzaWduIGJpdCBpc1xuICogcGxhY2VkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICBGb3IgZXhhbXBsZSwgYXMgZGVjaW1hbHM6XG4gKiAgIDEgYmVjb21lcyAyICgxMCBiaW5hcnkpLCAtMSBiZWNvbWVzIDMgKDExIGJpbmFyeSlcbiAqICAgMiBiZWNvbWVzIDQgKDEwMCBiaW5hcnkpLCAtMiBiZWNvbWVzIDUgKDEwMSBiaW5hcnkpXG4gKi9cbmZ1bmN0aW9uIHRvVkxRU2lnbmVkKGFWYWx1ZSkge1xuICByZXR1cm4gYVZhbHVlIDwgMFxuICAgID8gKCgtYVZhbHVlKSA8PCAxKSArIDFcbiAgICA6IChhVmFsdWUgPDwgMSkgKyAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRvIGEgdHdvLWNvbXBsZW1lbnQgdmFsdWUgZnJvbSBhIHZhbHVlIHdoZXJlIHRoZSBzaWduIGJpdCBpc1xuICogcGxhY2VkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICBGb3IgZXhhbXBsZSwgYXMgZGVjaW1hbHM6XG4gKiAgIDIgKDEwIGJpbmFyeSkgYmVjb21lcyAxLCAzICgxMSBiaW5hcnkpIGJlY29tZXMgLTFcbiAqICAgNCAoMTAwIGJpbmFyeSkgYmVjb21lcyAyLCA1ICgxMDEgYmluYXJ5KSBiZWNvbWVzIC0yXG4gKi9cbmZ1bmN0aW9uIGZyb21WTFFTaWduZWQoYVZhbHVlKSB7XG4gIHZhciBpc05lZ2F0aXZlID0gKGFWYWx1ZSAmIDEpID09PSAxO1xuICB2YXIgc2hpZnRlZCA9IGFWYWx1ZSA+PiAxO1xuICByZXR1cm4gaXNOZWdhdGl2ZVxuICAgID8gLXNoaWZ0ZWRcbiAgICA6IHNoaWZ0ZWQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYmFzZSA2NCBWTFEgZW5jb2RlZCB2YWx1ZS5cbiAqL1xuZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbiBiYXNlNjRWTFFfZW5jb2RlKGFWYWx1ZSkge1xuICB2YXIgZW5jb2RlZCA9IFwiXCI7XG4gIHZhciBkaWdpdDtcblxuICB2YXIgdmxxID0gdG9WTFFTaWduZWQoYVZhbHVlKTtcblxuICBkbyB7XG4gICAgZGlnaXQgPSB2bHEgJiBWTFFfQkFTRV9NQVNLO1xuICAgIHZscSA+Pj49IFZMUV9CQVNFX1NISUZUO1xuICAgIGlmICh2bHEgPiAwKSB7XG4gICAgICAvLyBUaGVyZSBhcmUgc3RpbGwgbW9yZSBkaWdpdHMgaW4gdGhpcyB2YWx1ZSwgc28gd2UgbXVzdCBtYWtlIHN1cmUgdGhlXG4gICAgICAvLyBjb250aW51YXRpb24gYml0IGlzIG1hcmtlZC5cbiAgICAgIGRpZ2l0IHw9IFZMUV9DT05USU5VQVRJT05fQklUO1xuICAgIH1cbiAgICBlbmNvZGVkICs9IGJhc2U2NC5lbmNvZGUoZGlnaXQpO1xuICB9IHdoaWxlICh2bHEgPiAwKTtcblxuICByZXR1cm4gZW5jb2RlZDtcbn07XG5cbi8qKlxuICogRGVjb2RlcyB0aGUgbmV4dCBiYXNlIDY0IFZMUSB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBzdHJpbmcgYW5kIHJldHVybnMgdGhlXG4gKiB2YWx1ZSBhbmQgdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyB2aWEgdGhlIG91dCBwYXJhbWV0ZXIuXG4gKi9cbmV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24gYmFzZTY0VkxRX2RlY29kZShhU3RyLCBhSW5kZXgsIGFPdXRQYXJhbSkge1xuICB2YXIgc3RyTGVuID0gYVN0ci5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSAwO1xuICB2YXIgc2hpZnQgPSAwO1xuICB2YXIgY29udGludWF0aW9uLCBkaWdpdDtcblxuICBkbyB7XG4gICAgaWYgKGFJbmRleCA+PSBzdHJMZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIG1vcmUgZGlnaXRzIGluIGJhc2UgNjQgVkxRIHZhbHVlLlwiKTtcbiAgICB9XG5cbiAgICBkaWdpdCA9IGJhc2U2NC5kZWNvZGUoYVN0ci5jaGFyQ29kZUF0KGFJbmRleCsrKSk7XG4gICAgaWYgKGRpZ2l0ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBiYXNlNjQgZGlnaXQ6IFwiICsgYVN0ci5jaGFyQXQoYUluZGV4IC0gMSkpO1xuICAgIH1cblxuICAgIGNvbnRpbnVhdGlvbiA9ICEhKGRpZ2l0ICYgVkxRX0NPTlRJTlVBVElPTl9CSVQpO1xuICAgIGRpZ2l0ICY9IFZMUV9CQVNFX01BU0s7XG4gICAgcmVzdWx0ID0gcmVzdWx0ICsgKGRpZ2l0IDw8IHNoaWZ0KTtcbiAgICBzaGlmdCArPSBWTFFfQkFTRV9TSElGVDtcbiAgfSB3aGlsZSAoY29udGludWF0aW9uKTtcblxuICBhT3V0UGFyYW0udmFsdWUgPSBmcm9tVkxRU2lnbmVkKHJlc3VsdCk7XG4gIGFPdXRQYXJhbS5yZXN0ID0gYUluZGV4O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL2Jhc2U2NC12bHEuanNcbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgaW50VG9DaGFyTWFwID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nLnNwbGl0KCcnKTtcblxuLyoqXG4gKiBFbmNvZGUgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2Ugb2YgMCB0byA2MyB0byBhIHNpbmdsZSBiYXNlIDY0IGRpZ2l0LlxuICovXG5leHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgaWYgKDAgPD0gbnVtYmVyICYmIG51bWJlciA8IGludFRvQ2hhck1hcC5sZW5ndGgpIHtcbiAgICByZXR1cm4gaW50VG9DaGFyTWFwW251bWJlcl07XG4gIH1cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk11c3QgYmUgYmV0d2VlbiAwIGFuZCA2MzogXCIgKyBudW1iZXIpO1xufTtcblxuLyoqXG4gKiBEZWNvZGUgYSBzaW5nbGUgYmFzZSA2NCBjaGFyYWN0ZXIgY29kZSBkaWdpdCB0byBhbiBpbnRlZ2VyLiBSZXR1cm5zIC0xIG9uXG4gKiBmYWlsdXJlLlxuICovXG5leHBvcnRzLmRlY29kZSA9IGZ1bmN0aW9uIChjaGFyQ29kZSkge1xuICB2YXIgYmlnQSA9IDY1OyAgICAgLy8gJ0EnXG4gIHZhciBiaWdaID0gOTA7ICAgICAvLyAnWidcblxuICB2YXIgbGl0dGxlQSA9IDk3OyAgLy8gJ2EnXG4gIHZhciBsaXR0bGVaID0gMTIyOyAvLyAneidcblxuICB2YXIgemVybyA9IDQ4OyAgICAgLy8gJzAnXG4gIHZhciBuaW5lID0gNTc7ICAgICAvLyAnOSdcblxuICB2YXIgcGx1cyA9IDQzOyAgICAgLy8gJysnXG4gIHZhciBzbGFzaCA9IDQ3OyAgICAvLyAnLydcblxuICB2YXIgbGl0dGxlT2Zmc2V0ID0gMjY7XG4gIHZhciBudW1iZXJPZmZzZXQgPSA1MjtcblxuICAvLyAwIC0gMjU6IEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXG4gIGlmIChiaWdBIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IGJpZ1opIHtcbiAgICByZXR1cm4gKGNoYXJDb2RlIC0gYmlnQSk7XG4gIH1cblxuICAvLyAyNiAtIDUxOiBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elxuICBpZiAobGl0dGxlQSA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBsaXR0bGVaKSB7XG4gICAgcmV0dXJuIChjaGFyQ29kZSAtIGxpdHRsZUEgKyBsaXR0bGVPZmZzZXQpO1xuICB9XG5cbiAgLy8gNTIgLSA2MTogMDEyMzQ1Njc4OVxuICBpZiAoemVybyA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBuaW5lKSB7XG4gICAgcmV0dXJuIChjaGFyQ29kZSAtIHplcm8gKyBudW1iZXJPZmZzZXQpO1xuICB9XG5cbiAgLy8gNjI6ICtcbiAgaWYgKGNoYXJDb2RlID09IHBsdXMpIHtcbiAgICByZXR1cm4gNjI7XG4gIH1cblxuICAvLyA2MzogL1xuICBpZiAoY2hhckNvZGUgPT0gc2xhc2gpIHtcbiAgICByZXR1cm4gNjM7XG4gIH1cblxuICAvLyBJbnZhbGlkIGJhc2U2NCBkaWdpdC5cbiAgcmV0dXJuIC0xO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL2Jhc2U2NC5qc1xuLy8gbW9kdWxlIGlkID0gM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbi8qKlxuICogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgZ2V0dGluZyB2YWx1ZXMgZnJvbSBwYXJhbWV0ZXIvb3B0aW9uc1xuICogb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0gYXJncyBUaGUgb2JqZWN0IHdlIGFyZSBleHRyYWN0aW5nIHZhbHVlcyBmcm9tXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgd2UgYXJlIGdldHRpbmcuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIEFuIG9wdGlvbmFsIHZhbHVlIHRvIHJldHVybiBpZiB0aGUgcHJvcGVydHkgaXMgbWlzc2luZ1xuICogZnJvbSB0aGUgb2JqZWN0LiBJZiB0aGlzIGlzIG5vdCBzcGVjaWZpZWQgYW5kIHRoZSBwcm9wZXJ0eSBpcyBtaXNzaW5nLCBhblxuICogZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gKi9cbmZ1bmN0aW9uIGdldEFyZyhhQXJncywgYU5hbWUsIGFEZWZhdWx0VmFsdWUpIHtcbiAgaWYgKGFOYW1lIGluIGFBcmdzKSB7XG4gICAgcmV0dXJuIGFBcmdzW2FOYW1lXTtcbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgcmV0dXJuIGFEZWZhdWx0VmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhTmFtZSArICdcIiBpcyBhIHJlcXVpcmVkIGFyZ3VtZW50LicpO1xuICB9XG59XG5leHBvcnRzLmdldEFyZyA9IGdldEFyZztcblxudmFyIHVybFJlZ2V4cCA9IC9eKD86KFtcXHcrXFwtLl0rKTopP1xcL1xcLyg/OihcXHcrOlxcdyspQCk/KFtcXHcuLV0qKSg/OjooXFxkKykpPyguKikkLztcbnZhciBkYXRhVXJsUmVnZXhwID0gL15kYXRhOi4rXFwsLiskLztcblxuZnVuY3Rpb24gdXJsUGFyc2UoYVVybCkge1xuICB2YXIgbWF0Y2ggPSBhVXJsLm1hdGNoKHVybFJlZ2V4cCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNjaGVtZTogbWF0Y2hbMV0sXG4gICAgYXV0aDogbWF0Y2hbMl0sXG4gICAgaG9zdDogbWF0Y2hbM10sXG4gICAgcG9ydDogbWF0Y2hbNF0sXG4gICAgcGF0aDogbWF0Y2hbNV1cbiAgfTtcbn1cbmV4cG9ydHMudXJsUGFyc2UgPSB1cmxQYXJzZTtcblxuZnVuY3Rpb24gdXJsR2VuZXJhdGUoYVBhcnNlZFVybCkge1xuICB2YXIgdXJsID0gJyc7XG4gIGlmIChhUGFyc2VkVXJsLnNjaGVtZSkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLnNjaGVtZSArICc6JztcbiAgfVxuICB1cmwgKz0gJy8vJztcbiAgaWYgKGFQYXJzZWRVcmwuYXV0aCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLmF1dGggKyAnQCc7XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwuaG9zdCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLmhvc3Q7XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwucG9ydCkge1xuICAgIHVybCArPSBcIjpcIiArIGFQYXJzZWRVcmwucG9ydFxuICB9XG4gIGlmIChhUGFyc2VkVXJsLnBhdGgpIHtcbiAgICB1cmwgKz0gYVBhcnNlZFVybC5wYXRoO1xuICB9XG4gIHJldHVybiB1cmw7XG59XG5leHBvcnRzLnVybEdlbmVyYXRlID0gdXJsR2VuZXJhdGU7XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHBhdGgsIG9yIHRoZSBwYXRoIHBvcnRpb24gb2YgYSBVUkw6XG4gKlxuICogLSBSZXBsYWNlcyBjb25zZWN1dGl2ZSBzbGFzaGVzIHdpdGggb25lIHNsYXNoLlxuICogLSBSZW1vdmVzIHVubmVjZXNzYXJ5ICcuJyBwYXJ0cy5cbiAqIC0gUmVtb3ZlcyB1bm5lY2Vzc2FyeSAnPGRpcj4vLi4nIHBhcnRzLlxuICpcbiAqIEJhc2VkIG9uIGNvZGUgaW4gdGhlIE5vZGUuanMgJ3BhdGgnIGNvcmUgbW9kdWxlLlxuICpcbiAqIEBwYXJhbSBhUGF0aCBUaGUgcGF0aCBvciB1cmwgdG8gbm9ybWFsaXplLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemUoYVBhdGgpIHtcbiAgdmFyIHBhdGggPSBhUGF0aDtcbiAgdmFyIHVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgaWYgKHVybCkge1xuICAgIGlmICghdXJsLnBhdGgpIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG4gICAgcGF0aCA9IHVybC5wYXRoO1xuICB9XG4gIHZhciBpc0Fic29sdXRlID0gZXhwb3J0cy5pc0Fic29sdXRlKHBhdGgpO1xuXG4gIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQoL1xcLysvKTtcbiAgZm9yICh2YXIgcGFydCwgdXAgPSAwLCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBwYXJ0ID0gcGFydHNbaV07XG4gICAgaWYgKHBhcnQgPT09ICcuJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykge1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwID4gMCkge1xuICAgICAgaWYgKHBhcnQgPT09ICcnKSB7XG4gICAgICAgIC8vIFRoZSBmaXJzdCBwYXJ0IGlzIGJsYW5rIGlmIHRoZSBwYXRoIGlzIGFic29sdXRlLiBUcnlpbmcgdG8gZ29cbiAgICAgICAgLy8gYWJvdmUgdGhlIHJvb3QgaXMgYSBuby1vcC4gVGhlcmVmb3JlIHdlIGNhbiByZW1vdmUgYWxsICcuLicgcGFydHNcbiAgICAgICAgLy8gZGlyZWN0bHkgYWZ0ZXIgdGhlIHJvb3QuXG4gICAgICAgIHBhcnRzLnNwbGljZShpICsgMSwgdXApO1xuICAgICAgICB1cCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0cy5zcGxpY2UoaSwgMik7XG4gICAgICAgIHVwLS07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHBhdGggPSBwYXJ0cy5qb2luKCcvJyk7XG5cbiAgaWYgKHBhdGggPT09ICcnKSB7XG4gICAgcGF0aCA9IGlzQWJzb2x1dGUgPyAnLycgOiAnLic7XG4gIH1cblxuICBpZiAodXJsKSB7XG4gICAgdXJsLnBhdGggPSBwYXRoO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZSh1cmwpO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuZXhwb3J0cy5ub3JtYWxpemUgPSBub3JtYWxpemU7XG5cbi8qKlxuICogSm9pbnMgdHdvIHBhdGhzL1VSTHMuXG4gKlxuICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBqb2luZWQgd2l0aCB0aGUgcm9vdC5cbiAqXG4gKiAtIElmIGFQYXRoIGlzIGEgVVJMIG9yIGEgZGF0YSBVUkksIGFQYXRoIGlzIHJldHVybmVkLCB1bmxlc3MgYVBhdGggaXMgYVxuICogICBzY2hlbWUtcmVsYXRpdmUgVVJMOiBUaGVuIHRoZSBzY2hlbWUgb2YgYVJvb3QsIGlmIGFueSwgaXMgcHJlcGVuZGVkXG4gKiAgIGZpcnN0LlxuICogLSBPdGhlcndpc2UgYVBhdGggaXMgYSBwYXRoLiBJZiBhUm9vdCBpcyBhIFVSTCwgdGhlbiBpdHMgcGF0aCBwb3J0aW9uXG4gKiAgIGlzIHVwZGF0ZWQgd2l0aCB0aGUgcmVzdWx0IGFuZCBhUm9vdCBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSByZXN1bHRcbiAqICAgaXMgcmV0dXJuZWQuXG4gKiAgIC0gSWYgYVBhdGggaXMgYWJzb2x1dGUsIHRoZSByZXN1bHQgaXMgYVBhdGguXG4gKiAgIC0gT3RoZXJ3aXNlIHRoZSB0d28gcGF0aHMgYXJlIGpvaW5lZCB3aXRoIGEgc2xhc2guXG4gKiAtIEpvaW5pbmcgZm9yIGV4YW1wbGUgJ2h0dHA6Ly8nIGFuZCAnd3d3LmV4YW1wbGUuY29tJyBpcyBhbHNvIHN1cHBvcnRlZC5cbiAqL1xuZnVuY3Rpb24gam9pbihhUm9vdCwgYVBhdGgpIHtcbiAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgYVJvb3QgPSBcIi5cIjtcbiAgfVxuICBpZiAoYVBhdGggPT09IFwiXCIpIHtcbiAgICBhUGF0aCA9IFwiLlwiO1xuICB9XG4gIHZhciBhUGF0aFVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgdmFyIGFSb290VXJsID0gdXJsUGFyc2UoYVJvb3QpO1xuICBpZiAoYVJvb3RVcmwpIHtcbiAgICBhUm9vdCA9IGFSb290VXJsLnBhdGggfHwgJy8nO1xuICB9XG5cbiAgLy8gYGpvaW4oZm9vLCAnLy93d3cuZXhhbXBsZS5vcmcnKWBcbiAgaWYgKGFQYXRoVXJsICYmICFhUGF0aFVybC5zY2hlbWUpIHtcbiAgICBpZiAoYVJvb3RVcmwpIHtcbiAgICAgIGFQYXRoVXJsLnNjaGVtZSA9IGFSb290VXJsLnNjaGVtZTtcbiAgICB9XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFQYXRoVXJsKTtcbiAgfVxuXG4gIGlmIChhUGF0aFVybCB8fCBhUGF0aC5tYXRjaChkYXRhVXJsUmVnZXhwKSkge1xuICAgIHJldHVybiBhUGF0aDtcbiAgfVxuXG4gIC8vIGBqb2luKCdodHRwOi8vJywgJ3d3dy5leGFtcGxlLmNvbScpYFxuICBpZiAoYVJvb3RVcmwgJiYgIWFSb290VXJsLmhvc3QgJiYgIWFSb290VXJsLnBhdGgpIHtcbiAgICBhUm9vdFVybC5ob3N0ID0gYVBhdGg7XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFSb290VXJsKTtcbiAgfVxuXG4gIHZhciBqb2luZWQgPSBhUGF0aC5jaGFyQXQoMCkgPT09ICcvJ1xuICAgID8gYVBhdGhcbiAgICA6IG5vcm1hbGl6ZShhUm9vdC5yZXBsYWNlKC9cXC8rJC8sICcnKSArICcvJyArIGFQYXRoKTtcblxuICBpZiAoYVJvb3RVcmwpIHtcbiAgICBhUm9vdFVybC5wYXRoID0gam9pbmVkO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUm9vdFVybCk7XG4gIH1cbiAgcmV0dXJuIGpvaW5lZDtcbn1cbmV4cG9ydHMuam9pbiA9IGpvaW47XG5cbmV4cG9ydHMuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uIChhUGF0aCkge1xuICByZXR1cm4gYVBhdGguY2hhckF0KDApID09PSAnLycgfHwgdXJsUmVnZXhwLnRlc3QoYVBhdGgpO1xufTtcblxuLyoqXG4gKiBNYWtlIGEgcGF0aCByZWxhdGl2ZSB0byBhIFVSTCBvciBhbm90aGVyIHBhdGguXG4gKlxuICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBtYWRlIHJlbGF0aXZlIHRvIGFSb290LlxuICovXG5mdW5jdGlvbiByZWxhdGl2ZShhUm9vdCwgYVBhdGgpIHtcbiAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgYVJvb3QgPSBcIi5cIjtcbiAgfVxuXG4gIGFSb290ID0gYVJvb3QucmVwbGFjZSgvXFwvJC8sICcnKTtcblxuICAvLyBJdCBpcyBwb3NzaWJsZSBmb3IgdGhlIHBhdGggdG8gYmUgYWJvdmUgdGhlIHJvb3QuIEluIHRoaXMgY2FzZSwgc2ltcGx5XG4gIC8vIGNoZWNraW5nIHdoZXRoZXIgdGhlIHJvb3QgaXMgYSBwcmVmaXggb2YgdGhlIHBhdGggd29uJ3Qgd29yay4gSW5zdGVhZCwgd2VcbiAgLy8gbmVlZCB0byByZW1vdmUgY29tcG9uZW50cyBmcm9tIHRoZSByb290IG9uZSBieSBvbmUsIHVudGlsIGVpdGhlciB3ZSBmaW5kXG4gIC8vIGEgcHJlZml4IHRoYXQgZml0cywgb3Igd2UgcnVuIG91dCBvZiBjb21wb25lbnRzIHRvIHJlbW92ZS5cbiAgdmFyIGxldmVsID0gMDtcbiAgd2hpbGUgKGFQYXRoLmluZGV4T2YoYVJvb3QgKyAnLycpICE9PSAwKSB7XG4gICAgdmFyIGluZGV4ID0gYVJvb3QubGFzdEluZGV4T2YoXCIvXCIpO1xuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgb25seSBwYXJ0IG9mIHRoZSByb290IHRoYXQgaXMgbGVmdCBpcyB0aGUgc2NoZW1lIChpLmUuIGh0dHA6Ly8sXG4gICAgLy8gZmlsZTovLy8sIGV0Yy4pLCBvbmUgb3IgbW9yZSBzbGFzaGVzICgvKSwgb3Igc2ltcGx5IG5vdGhpbmcgYXQgYWxsLCB3ZVxuICAgIC8vIGhhdmUgZXhoYXVzdGVkIGFsbCBjb21wb25lbnRzLCBzbyB0aGUgcGF0aCBpcyBub3QgcmVsYXRpdmUgdG8gdGhlIHJvb3QuXG4gICAgYVJvb3QgPSBhUm9vdC5zbGljZSgwLCBpbmRleCk7XG4gICAgaWYgKGFSb290Lm1hdGNoKC9eKFteXFwvXSs6XFwvKT9cXC8qJC8pKSB7XG4gICAgICByZXR1cm4gYVBhdGg7XG4gICAgfVxuXG4gICAgKytsZXZlbDtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSB3ZSBhZGQgYSBcIi4uL1wiIGZvciBlYWNoIGNvbXBvbmVudCB3ZSByZW1vdmVkIGZyb20gdGhlIHJvb3QuXG4gIHJldHVybiBBcnJheShsZXZlbCArIDEpLmpvaW4oXCIuLi9cIikgKyBhUGF0aC5zdWJzdHIoYVJvb3QubGVuZ3RoICsgMSk7XG59XG5leHBvcnRzLnJlbGF0aXZlID0gcmVsYXRpdmU7XG5cbnZhciBzdXBwb3J0c051bGxQcm90byA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gISgnX19wcm90b19fJyBpbiBvYmopO1xufSgpKTtcblxuZnVuY3Rpb24gaWRlbnRpdHkgKHMpIHtcbiAgcmV0dXJuIHM7XG59XG5cbi8qKlxuICogQmVjYXVzZSBiZWhhdmlvciBnb2VzIHdhY2t5IHdoZW4geW91IHNldCBgX19wcm90b19fYCBvbiBvYmplY3RzLCB3ZVxuICogaGF2ZSB0byBwcmVmaXggYWxsIHRoZSBzdHJpbmdzIGluIG91ciBzZXQgd2l0aCBhbiBhcmJpdHJhcnkgY2hhcmFjdGVyLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL3B1bGwvMzEgYW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8zMFxuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5mdW5jdGlvbiB0b1NldFN0cmluZyhhU3RyKSB7XG4gIGlmIChpc1Byb3RvU3RyaW5nKGFTdHIpKSB7XG4gICAgcmV0dXJuICckJyArIGFTdHI7XG4gIH1cblxuICByZXR1cm4gYVN0cjtcbn1cbmV4cG9ydHMudG9TZXRTdHJpbmcgPSBzdXBwb3J0c051bGxQcm90byA/IGlkZW50aXR5IDogdG9TZXRTdHJpbmc7XG5cbmZ1bmN0aW9uIGZyb21TZXRTdHJpbmcoYVN0cikge1xuICBpZiAoaXNQcm90b1N0cmluZyhhU3RyKSkge1xuICAgIHJldHVybiBhU3RyLnNsaWNlKDEpO1xuICB9XG5cbiAgcmV0dXJuIGFTdHI7XG59XG5leHBvcnRzLmZyb21TZXRTdHJpbmcgPSBzdXBwb3J0c051bGxQcm90byA/IGlkZW50aXR5IDogZnJvbVNldFN0cmluZztcblxuZnVuY3Rpb24gaXNQcm90b1N0cmluZyhzKSB7XG4gIGlmICghcykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBzLmxlbmd0aDtcblxuICBpZiAobGVuZ3RoIDwgOSAvKiBcIl9fcHJvdG9fX1wiLmxlbmd0aCAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChzLmNoYXJDb2RlQXQobGVuZ3RoIC0gMSkgIT09IDk1ICAvKiAnXycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSAyKSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDMpICE9PSAxMTEgLyogJ28nICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNCkgIT09IDExNiAvKiAndCcgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA1KSAhPT0gMTExIC8qICdvJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDYpICE9PSAxMTQgLyogJ3InICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNykgIT09IDExMiAvKiAncCcgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA4KSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDkpICE9PSA5NSAgLyogJ18nICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IGxlbmd0aCAtIDEwOyBpID49IDA7IGktLSkge1xuICAgIGlmIChzLmNoYXJDb2RlQXQoaSkgIT09IDM2IC8qICckJyAqLykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENvbXBhcmF0b3IgYmV0d2VlbiB0d28gbWFwcGluZ3Mgd2hlcmUgdGhlIG9yaWdpbmFsIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKlxuICogT3B0aW9uYWxseSBwYXNzIGluIGB0cnVlYCBhcyBgb25seUNvbXBhcmVHZW5lcmF0ZWRgIHRvIGNvbnNpZGVyIHR3b1xuICogbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4sIGJ1dCBkaWZmZXJlbnQgZ2VuZXJhdGVkXG4gKiBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYSBtYXBwaW5nIHdpdGggYVxuICogc3R1YmJlZCBvdXQgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZU9yaWdpbmFsKSB7XG4gIHZhciBjbXAgPSBzdHJjbXAobWFwcGluZ0Euc291cmNlLCBtYXBwaW5nQi5zb3VyY2UpO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsTGluZSAtIG1hcHBpbmdCLm9yaWdpbmFsTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbENvbHVtbiAtIG1hcHBpbmdCLm9yaWdpbmFsQ29sdW1uO1xuICBpZiAoY21wICE9PSAwIHx8IG9ubHlDb21wYXJlT3JpZ2luYWwpIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIHJldHVybiBzdHJjbXAobWFwcGluZ0EubmFtZSwgbWFwcGluZ0IubmFtZSk7XG59XG5leHBvcnRzLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zID0gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnM7XG5cbi8qKlxuICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aXRoIGRlZmxhdGVkIHNvdXJjZSBhbmQgbmFtZSBpbmRpY2VzIHdoZXJlXG4gKiB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKlxuICogT3B0aW9uYWxseSBwYXNzIGluIGB0cnVlYCBhcyBgb25seUNvbXBhcmVHZW5lcmF0ZWRgIHRvIGNvbnNpZGVyIHR3b1xuICogbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uLCBidXQgZGlmZmVyZW50XG4gKiBzb3VyY2UvbmFtZS9vcmlnaW5hbCBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYVxuICogbWFwcGluZyB3aXRoIGEgc3R1YmJlZCBvdXQgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZUdlbmVyYXRlZCkge1xuICB2YXIgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwIHx8IG9ubHlDb21wYXJlR2VuZXJhdGVkKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbn1cbmV4cG9ydHMuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQgPSBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZDtcblxuZnVuY3Rpb24gc3RyY21wKGFTdHIxLCBhU3RyMikge1xuICBpZiAoYVN0cjEgPT09IGFTdHIyKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZiAoYVN0cjEgPT09IG51bGwpIHtcbiAgICByZXR1cm4gMTsgLy8gYVN0cjIgIT09IG51bGxcbiAgfVxuXG4gIGlmIChhU3RyMiA9PT0gbnVsbCkge1xuICAgIHJldHVybiAtMTsgLy8gYVN0cjEgIT09IG51bGxcbiAgfVxuXG4gIGlmIChhU3RyMSA+IGFTdHIyKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aXRoIGluZmxhdGVkIHNvdXJjZSBhbmQgbmFtZSBzdHJpbmdzIHdoZXJlXG4gKiB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmdBLCBtYXBwaW5nQikge1xuICB2YXIgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbn1cbmV4cG9ydHMuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQgPSBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZDtcblxuLyoqXG4gKiBTdHJpcCBhbnkgSlNPTiBYU1NJIGF2b2lkYW5jZSBwcmVmaXggZnJvbSB0aGUgc3RyaW5nIChhcyBkb2N1bWVudGVkXG4gKiBpbiB0aGUgc291cmNlIG1hcHMgc3BlY2lmaWNhdGlvbiksIGFuZCB0aGVuIHBhcnNlIHRoZSBzdHJpbmcgYXNcbiAqIEpTT04uXG4gKi9cbmZ1bmN0aW9uIHBhcnNlU291cmNlTWFwSW5wdXQoc3RyKSB7XG4gIHJldHVybiBKU09OLnBhcnNlKHN0ci5yZXBsYWNlKC9eXFwpXX0nW15cXG5dKlxcbi8sICcnKSk7XG59XG5leHBvcnRzLnBhcnNlU291cmNlTWFwSW5wdXQgPSBwYXJzZVNvdXJjZU1hcElucHV0O1xuXG4vKipcbiAqIENvbXB1dGUgdGhlIFVSTCBvZiBhIHNvdXJjZSBnaXZlbiB0aGUgdGhlIHNvdXJjZSByb290LCB0aGUgc291cmNlJ3NcbiAqIFVSTCwgYW5kIHRoZSBzb3VyY2UgbWFwJ3MgVVJMLlxuICovXG5mdW5jdGlvbiBjb21wdXRlU291cmNlVVJMKHNvdXJjZVJvb3QsIHNvdXJjZVVSTCwgc291cmNlTWFwVVJMKSB7XG4gIHNvdXJjZVVSTCA9IHNvdXJjZVVSTCB8fCAnJztcblxuICBpZiAoc291cmNlUm9vdCkge1xuICAgIC8vIFRoaXMgZm9sbG93cyB3aGF0IENocm9tZSBkb2VzLlxuICAgIGlmIChzb3VyY2VSb290W3NvdXJjZVJvb3QubGVuZ3RoIC0gMV0gIT09ICcvJyAmJiBzb3VyY2VVUkxbMF0gIT09ICcvJykge1xuICAgICAgc291cmNlUm9vdCArPSAnLyc7XG4gICAgfVxuICAgIC8vIFRoZSBzcGVjIHNheXM6XG4gICAgLy8gICBMaW5lIDQ6IEFuIG9wdGlvbmFsIHNvdXJjZSByb290LCB1c2VmdWwgZm9yIHJlbG9jYXRpbmcgc291cmNlXG4gICAgLy8gICBmaWxlcyBvbiBhIHNlcnZlciBvciByZW1vdmluZyByZXBlYXRlZCB2YWx1ZXMgaW4gdGhlXG4gICAgLy8gICDigJxzb3VyY2Vz4oCdIGVudHJ5LiAgVGhpcyB2YWx1ZSBpcyBwcmVwZW5kZWQgdG8gdGhlIGluZGl2aWR1YWxcbiAgICAvLyAgIGVudHJpZXMgaW4gdGhlIOKAnHNvdXJjZeKAnSBmaWVsZC5cbiAgICBzb3VyY2VVUkwgPSBzb3VyY2VSb290ICsgc291cmNlVVJMO1xuICB9XG5cbiAgLy8gSGlzdG9yaWNhbGx5LCBTb3VyY2VNYXBDb25zdW1lciBkaWQgbm90IHRha2UgdGhlIHNvdXJjZU1hcFVSTCBhc1xuICAvLyBhIHBhcmFtZXRlci4gIFRoaXMgbW9kZSBpcyBzdGlsbCBzb21ld2hhdCBzdXBwb3J0ZWQsIHdoaWNoIGlzIHdoeVxuICAvLyB0aGlzIGNvZGUgYmxvY2sgaXMgY29uZGl0aW9uYWwuICBIb3dldmVyLCBpdCdzIHByZWZlcmFibGUgdG8gcGFzc1xuICAvLyB0aGUgc291cmNlIG1hcCBVUkwgdG8gU291cmNlTWFwQ29uc3VtZXIsIHNvIHRoYXQgdGhpcyBmdW5jdGlvblxuICAvLyBjYW4gaW1wbGVtZW50IHRoZSBzb3VyY2UgVVJMIHJlc29sdXRpb24gYWxnb3JpdGhtIGFzIG91dGxpbmVkIGluXG4gIC8vIHRoZSBzcGVjLiAgVGhpcyBibG9jayBpcyBiYXNpY2FsbHkgdGhlIGVxdWl2YWxlbnQgb2Y6XG4gIC8vICAgIG5ldyBVUkwoc291cmNlVVJMLCBzb3VyY2VNYXBVUkwpLnRvU3RyaW5nKClcbiAgLy8gLi4uIGV4Y2VwdCBpdCBhdm9pZHMgdXNpbmcgVVJMLCB3aGljaCB3YXNuJ3QgYXZhaWxhYmxlIGluIHRoZVxuICAvLyBvbGRlciByZWxlYXNlcyBvZiBub2RlIHN0aWxsIHN1cHBvcnRlZCBieSB0aGlzIGxpYnJhcnkuXG4gIC8vXG4gIC8vIFRoZSBzcGVjIHNheXM6XG4gIC8vICAgSWYgdGhlIHNvdXJjZXMgYXJlIG5vdCBhYnNvbHV0ZSBVUkxzIGFmdGVyIHByZXBlbmRpbmcgb2YgdGhlXG4gIC8vICAg4oCcc291cmNlUm9vdOKAnSwgdGhlIHNvdXJjZXMgYXJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZVxuICAvLyAgIFNvdXJjZU1hcCAobGlrZSByZXNvbHZpbmcgc2NyaXB0IHNyYyBpbiBhIGh0bWwgZG9jdW1lbnQpLlxuICBpZiAoc291cmNlTWFwVVJMKSB7XG4gICAgdmFyIHBhcnNlZCA9IHVybFBhcnNlKHNvdXJjZU1hcFVSTCk7XG4gICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNvdXJjZU1hcFVSTCBjb3VsZCBub3QgYmUgcGFyc2VkXCIpO1xuICAgIH1cbiAgICBpZiAocGFyc2VkLnBhdGgpIHtcbiAgICAgIC8vIFN0cmlwIHRoZSBsYXN0IHBhdGggY29tcG9uZW50LCBidXQga2VlcCB0aGUgXCIvXCIuXG4gICAgICB2YXIgaW5kZXggPSBwYXJzZWQucGF0aC5sYXN0SW5kZXhPZignLycpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgcGFyc2VkLnBhdGggPSBwYXJzZWQucGF0aC5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc291cmNlVVJMID0gam9pbih1cmxHZW5lcmF0ZShwYXJzZWQpLCBzb3VyY2VVUkwpO1xuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZShzb3VyY2VVUkwpO1xufVxuZXhwb3J0cy5jb21wdXRlU291cmNlVVJMID0gY29tcHV0ZVNvdXJjZVVSTDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL3V0aWwuanNcbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaGFzTmF0aXZlTWFwID0gdHlwZW9mIE1hcCAhPT0gXCJ1bmRlZmluZWRcIjtcblxuLyoqXG4gKiBBIGRhdGEgc3RydWN0dXJlIHdoaWNoIGlzIGEgY29tYmluYXRpb24gb2YgYW4gYXJyYXkgYW5kIGEgc2V0LiBBZGRpbmcgYSBuZXdcbiAqIG1lbWJlciBpcyBPKDEpLCB0ZXN0aW5nIGZvciBtZW1iZXJzaGlwIGlzIE8oMSksIGFuZCBmaW5kaW5nIHRoZSBpbmRleCBvZiBhblxuICogZWxlbWVudCBpcyBPKDEpLiBSZW1vdmluZyBlbGVtZW50cyBmcm9tIHRoZSBzZXQgaXMgbm90IHN1cHBvcnRlZC4gT25seVxuICogc3RyaW5ncyBhcmUgc3VwcG9ydGVkIGZvciBtZW1iZXJzaGlwLlxuICovXG5mdW5jdGlvbiBBcnJheVNldCgpIHtcbiAgdGhpcy5fYXJyYXkgPSBbXTtcbiAgdGhpcy5fc2V0ID0gaGFzTmF0aXZlTWFwID8gbmV3IE1hcCgpIDogT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cblxuLyoqXG4gKiBTdGF0aWMgbWV0aG9kIGZvciBjcmVhdGluZyBBcnJheVNldCBpbnN0YW5jZXMgZnJvbSBhbiBleGlzdGluZyBhcnJheS5cbiAqL1xuQXJyYXlTZXQuZnJvbUFycmF5ID0gZnVuY3Rpb24gQXJyYXlTZXRfZnJvbUFycmF5KGFBcnJheSwgYUFsbG93RHVwbGljYXRlcykge1xuICB2YXIgc2V0ID0gbmV3IEFycmF5U2V0KCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhQXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBzZXQuYWRkKGFBcnJheVtpXSwgYUFsbG93RHVwbGljYXRlcyk7XG4gIH1cbiAgcmV0dXJuIHNldDtcbn07XG5cbi8qKlxuICogUmV0dXJuIGhvdyBtYW55IHVuaXF1ZSBpdGVtcyBhcmUgaW4gdGhpcyBBcnJheVNldC4gSWYgZHVwbGljYXRlcyBoYXZlIGJlZW5cbiAqIGFkZGVkLCB0aGFuIHRob3NlIGRvIG5vdCBjb3VudCB0b3dhcmRzIHRoZSBzaXplLlxuICpcbiAqIEByZXR1cm5zIE51bWJlclxuICovXG5BcnJheVNldC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uIEFycmF5U2V0X3NpemUoKSB7XG4gIHJldHVybiBoYXNOYXRpdmVNYXAgPyB0aGlzLl9zZXQuc2l6ZSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMuX3NldCkubGVuZ3RoO1xufTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHN0cmluZyB0byB0aGlzIHNldC5cbiAqXG4gKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIEFycmF5U2V0X2FkZChhU3RyLCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gIHZhciBzU3RyID0gaGFzTmF0aXZlTWFwID8gYVN0ciA6IHV0aWwudG9TZXRTdHJpbmcoYVN0cik7XG4gIHZhciBpc0R1cGxpY2F0ZSA9IGhhc05hdGl2ZU1hcCA/IHRoaXMuaGFzKGFTdHIpIDogaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKTtcbiAgdmFyIGlkeCA9IHRoaXMuX2FycmF5Lmxlbmd0aDtcbiAgaWYgKCFpc0R1cGxpY2F0ZSB8fCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhU3RyKTtcbiAgfVxuICBpZiAoIWlzRHVwbGljYXRlKSB7XG4gICAgaWYgKGhhc05hdGl2ZU1hcCkge1xuICAgICAgdGhpcy5fc2V0LnNldChhU3RyLCBpZHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXRbc1N0cl0gPSBpZHg7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIElzIHRoZSBnaXZlbiBzdHJpbmcgYSBtZW1iZXIgb2YgdGhpcyBzZXQ/XG4gKlxuICogQHBhcmFtIFN0cmluZyBhU3RyXG4gKi9cbkFycmF5U2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBBcnJheVNldF9oYXMoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NldC5oYXMoYVN0cik7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNTdHIgPSB1dGlsLnRvU2V0U3RyaW5nKGFTdHIpO1xuICAgIHJldHVybiBoYXMuY2FsbCh0aGlzLl9zZXQsIHNTdHIpO1xuICB9XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBzdHJpbmcgaW4gdGhlIGFycmF5P1xuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5BcnJheVNldC5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIEFycmF5U2V0X2luZGV4T2YoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgdmFyIGlkeCA9IHRoaXMuX3NldC5nZXQoYVN0cik7XG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBzU3RyID0gdXRpbC50b1NldFN0cmluZyhhU3RyKTtcbiAgICBpZiAoaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NldFtzU3RyXTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTdHIgKyAnXCIgaXMgbm90IGluIHRoZSBzZXQuJyk7XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4P1xuICpcbiAqIEBwYXJhbSBOdW1iZXIgYUlkeFxuICovXG5BcnJheVNldC5wcm90b3R5cGUuYXQgPSBmdW5jdGlvbiBBcnJheVNldF9hdChhSWR4KSB7XG4gIGlmIChhSWR4ID49IDAgJiYgYUlkeCA8IHRoaXMuX2FycmF5Lmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9hcnJheVthSWR4XTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVsZW1lbnQgaW5kZXhlZCBieSAnICsgYUlkeCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGFycmF5IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2V0ICh3aGljaCBoYXMgdGhlIHByb3BlciBpbmRpY2VzXG4gKiBpbmRpY2F0ZWQgYnkgaW5kZXhPZikuIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgYXJyYXkgdXNlZFxuICogZm9yIHN0b3JpbmcgdGhlIG1lbWJlcnMgc28gdGhhdCBubyBvbmUgY2FuIG1lc3Mgd2l0aCBpbnRlcm5hbCBzdGF0ZS5cbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBBcnJheVNldF90b0FycmF5KCkge1xuICByZXR1cm4gdGhpcy5fYXJyYXkuc2xpY2UoKTtcbn07XG5cbmV4cG9ydHMuQXJyYXlTZXQgPSBBcnJheVNldDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL2FycmF5LXNldC5qc1xuLy8gbW9kdWxlIGlkID0gNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTQgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgbWFwcGluZ0IgaXMgYWZ0ZXIgbWFwcGluZ0Egd2l0aCByZXNwZWN0IHRvIGdlbmVyYXRlZFxuICogcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlZFBvc2l0aW9uQWZ0ZXIobWFwcGluZ0EsIG1hcHBpbmdCKSB7XG4gIC8vIE9wdGltaXplZCBmb3IgbW9zdCBjb21tb24gY2FzZVxuICB2YXIgbGluZUEgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgbGluZUIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgY29sdW1uQSA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbjtcbiAgdmFyIGNvbHVtbkIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gIHJldHVybiBsaW5lQiA+IGxpbmVBIHx8IGxpbmVCID09IGxpbmVBICYmIGNvbHVtbkIgPj0gY29sdW1uQSB8fFxuICAgICAgICAgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZChtYXBwaW5nQSwgbWFwcGluZ0IpIDw9IDA7XG59XG5cbi8qKlxuICogQSBkYXRhIHN0cnVjdHVyZSB0byBwcm92aWRlIGEgc29ydGVkIHZpZXcgb2YgYWNjdW11bGF0ZWQgbWFwcGluZ3MgaW4gYVxuICogcGVyZm9ybWFuY2UgY29uc2Npb3VzIG1hbm5lci4gSXQgdHJhZGVzIGEgbmVnbGliYWJsZSBvdmVyaGVhZCBpbiBnZW5lcmFsXG4gKiBjYXNlIGZvciBhIGxhcmdlIHNwZWVkdXAgaW4gY2FzZSBvZiBtYXBwaW5ncyBiZWluZyBhZGRlZCBpbiBvcmRlci5cbiAqL1xuZnVuY3Rpb24gTWFwcGluZ0xpc3QoKSB7XG4gIHRoaXMuX2FycmF5ID0gW107XG4gIHRoaXMuX3NvcnRlZCA9IHRydWU7XG4gIC8vIFNlcnZlcyBhcyBpbmZpbXVtXG4gIHRoaXMuX2xhc3QgPSB7Z2VuZXJhdGVkTGluZTogLTEsIGdlbmVyYXRlZENvbHVtbjogMH07XG59XG5cbi8qKlxuICogSXRlcmF0ZSB0aHJvdWdoIGludGVybmFsIGl0ZW1zLiBUaGlzIG1ldGhvZCB0YWtlcyB0aGUgc2FtZSBhcmd1bWVudHMgdGhhdFxuICogYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCB0YWtlcy5cbiAqXG4gKiBOT1RFOiBUaGUgb3JkZXIgb2YgdGhlIG1hcHBpbmdzIGlzIE5PVCBndWFyYW50ZWVkLlxuICovXG5NYXBwaW5nTGlzdC5wcm90b3R5cGUudW5zb3J0ZWRGb3JFYWNoID1cbiAgZnVuY3Rpb24gTWFwcGluZ0xpc3RfZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKSB7XG4gICAgdGhpcy5fYXJyYXkuZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKTtcbiAgfTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHNvdXJjZSBtYXBwaW5nLlxuICpcbiAqIEBwYXJhbSBPYmplY3QgYU1hcHBpbmdcbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIE1hcHBpbmdMaXN0X2FkZChhTWFwcGluZykge1xuICBpZiAoZ2VuZXJhdGVkUG9zaXRpb25BZnRlcih0aGlzLl9sYXN0LCBhTWFwcGluZykpIHtcbiAgICB0aGlzLl9sYXN0ID0gYU1hcHBpbmc7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fc29ydGVkID0gZmFsc2U7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmxhdCwgc29ydGVkIGFycmF5IG9mIG1hcHBpbmdzLiBUaGUgbWFwcGluZ3MgYXJlIHNvcnRlZCBieVxuICogZ2VuZXJhdGVkIHBvc2l0aW9uLlxuICpcbiAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIHJldHVybnMgaW50ZXJuYWwgZGF0YSB3aXRob3V0IGNvcHlpbmcsIGZvclxuICogcGVyZm9ybWFuY2UuIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBOT1QgYmUgbXV0YXRlZCwgYW5kIHNob3VsZCBiZSB0cmVhdGVkIGFzXG4gKiBhbiBpbW11dGFibGUgYm9ycm93LiBJZiB5b3Ugd2FudCB0byB0YWtlIG93bmVyc2hpcCwgeW91IG11c3QgbWFrZSB5b3VyIG93blxuICogY29weS5cbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBNYXBwaW5nTGlzdF90b0FycmF5KCkge1xuICBpZiAoIXRoaXMuX3NvcnRlZCkge1xuICAgIHRoaXMuX2FycmF5LnNvcnQodXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZCk7XG4gICAgdGhpcy5fc29ydGVkID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gdGhpcy5fYXJyYXk7XG59O1xuXG5leHBvcnRzLk1hcHBpbmdMaXN0ID0gTWFwcGluZ0xpc3Q7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL2xpYi9tYXBwaW5nLWxpc3QuanNcbi8vIG1vZHVsZSBpZCA9IDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGJpbmFyeVNlYXJjaCA9IHJlcXVpcmUoJy4vYmluYXJ5LXNlYXJjaCcpO1xudmFyIEFycmF5U2V0ID0gcmVxdWlyZSgnLi9hcnJheS1zZXQnKS5BcnJheVNldDtcbnZhciBiYXNlNjRWTFEgPSByZXF1aXJlKCcuL2Jhc2U2NC12bHEnKTtcbnZhciBxdWlja1NvcnQgPSByZXF1aXJlKCcuL3F1aWNrLXNvcnQnKS5xdWlja1NvcnQ7XG5cbmZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7XG4gIH1cblxuICByZXR1cm4gc291cmNlTWFwLnNlY3Rpb25zICE9IG51bGxcbiAgICA/IG5ldyBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIoc291cmNlTWFwLCBhU291cmNlTWFwVVJMKVxuICAgIDogbmV3IEJhc2ljU291cmNlTWFwQ29uc3VtZXIoc291cmNlTWFwLCBhU291cmNlTWFwVVJMKTtcbn1cblxuU291cmNlTWFwQ29uc3VtZXIuZnJvbVNvdXJjZU1hcCA9IGZ1bmN0aW9uKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgcmV0dXJuIEJhc2ljU291cmNlTWFwQ29uc3VtZXIuZnJvbVNvdXJjZU1hcChhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKTtcbn1cblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcHBpbmcgc3BlYyB0aGF0IHdlIGFyZSBjb25zdW1pbmcuXG4gKi9cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8vIGBfX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmQgYF9fb3JpZ2luYWxNYXBwaW5nc2AgYXJlIGFycmF5cyB0aGF0IGhvbGQgdGhlXG4vLyBwYXJzZWQgbWFwcGluZyBjb29yZGluYXRlcyBmcm9tIHRoZSBzb3VyY2UgbWFwJ3MgXCJtYXBwaW5nc1wiIGF0dHJpYnV0ZS4gVGhleVxuLy8gYXJlIGxhemlseSBpbnN0YW50aWF0ZWQsIGFjY2Vzc2VkIHZpYSB0aGUgYF9nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4vLyBgX29yaWdpbmFsTWFwcGluZ3NgIGdldHRlcnMgcmVzcGVjdGl2ZWx5LCBhbmQgd2Ugb25seSBwYXJzZSB0aGUgbWFwcGluZ3Ncbi8vIGFuZCBjcmVhdGUgdGhlc2UgYXJyYXlzIG9uY2UgcXVlcmllZCBmb3IgYSBzb3VyY2UgbG9jYXRpb24uIFdlIGp1bXAgdGhyb3VnaFxuLy8gdGhlc2UgaG9vcHMgYmVjYXVzZSB0aGVyZSBjYW4gYmUgbWFueSB0aG91c2FuZHMgb2YgbWFwcGluZ3MsIGFuZCBwYXJzaW5nXG4vLyB0aGVtIGlzIGV4cGVuc2l2ZSwgc28gd2Ugb25seSB3YW50IHRvIGRvIGl0IGlmIHdlIG11c3QuXG4vL1xuLy8gRWFjaCBvYmplY3QgaW4gdGhlIGFycmF5cyBpcyBvZiB0aGUgZm9ybTpcbi8vXG4vLyAgICAge1xuLy8gICAgICAgZ2VuZXJhdGVkTGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIGdlbmVyYXRlZENvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLFxuLy8gICAgICAgc291cmNlOiBUaGUgcGF0aCB0byB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUgdGhhdCBnZW5lcmF0ZWQgdGhpc1xuLy8gICAgICAgICAgICAgICBjaHVuayBvZiBjb2RlLFxuLy8gICAgICAgb3JpZ2luYWxMaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGF0XG4vLyAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoaXMgY2h1bmsgb2YgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBvcmlnaW5hbENvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGF0XG4vLyAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhpcyBjaHVuayBvZiBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBvcmlnaW5hbCBzeW1ib2wgd2hpY2ggZ2VuZXJhdGVkIHRoaXMgY2h1bmsgb2Zcbi8vICAgICAgICAgICAgIGNvZGUuXG4vLyAgICAgfVxuLy9cbi8vIEFsbCBwcm9wZXJ0aWVzIGV4Y2VwdCBmb3IgYGdlbmVyYXRlZExpbmVgIGFuZCBgZ2VuZXJhdGVkQ29sdW1uYCBjYW4gYmVcbi8vIGBudWxsYC5cbi8vXG4vLyBgX2dlbmVyYXRlZE1hcHBpbmdzYCBpcyBvcmRlcmVkIGJ5IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb25zLlxuLy9cbi8vIGBfb3JpZ2luYWxNYXBwaW5nc2AgaXMgb3JkZXJlZCBieSB0aGUgb3JpZ2luYWwgcG9zaXRpb25zLlxuXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IG51bGw7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnX2dlbmVyYXRlZE1hcHBpbmdzJywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzKSB7XG4gICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3M7XG4gIH1cbn0pO1xuXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX19vcmlnaW5hbE1hcHBpbmdzID0gbnVsbDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdfb3JpZ2luYWxNYXBwaW5ncycsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX19vcmlnaW5hbE1hcHBpbmdzKSB7XG4gICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncztcbiAgfVxufSk7XG5cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fY2hhcklzTWFwcGluZ1NlcGFyYXRvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NoYXJJc01hcHBpbmdTZXBhcmF0b3IoYVN0ciwgaW5kZXgpIHtcbiAgICB2YXIgYyA9IGFTdHIuY2hhckF0KGluZGV4KTtcbiAgICByZXR1cm4gYyA9PT0gXCI7XCIgfHwgYyA9PT0gXCIsXCI7XG4gIH07XG5cbi8qKlxuICogUGFyc2UgdGhlIG1hcHBpbmdzIGluIGEgc3RyaW5nIGluIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggd2UgY2FuIGVhc2lseVxuICogcXVlcnkgKHRoZSBvcmRlcmVkIGFycmF5cyBpbiB0aGUgYHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4gKiBgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3NgIHByb3BlcnRpZXMpLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBfcGFyc2VNYXBwaW5nc1wiKTtcbiAgfTtcblxuU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSID0gMTtcblNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSID0gMjtcblxuU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuU291cmNlTWFwQ29uc3VtZXIuTEVBU1RfVVBQRVJfQk9VTkQgPSAyO1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBlYWNoIG1hcHBpbmcgYmV0d2VlbiBhbiBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4gYW5kIGFcbiAqIGdlbmVyYXRlZCBsaW5lL2NvbHVtbiBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKlxuICogQHBhcmFtIEZ1bmN0aW9uIGFDYWxsYmFja1xuICogICAgICAgIFRoZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aXRoIGVhY2ggbWFwcGluZy5cbiAqIEBwYXJhbSBPYmplY3QgYUNvbnRleHRcbiAqICAgICAgICBPcHRpb25hbC4gSWYgc3BlY2lmaWVkLCB0aGlzIG9iamVjdCB3aWxsIGJlIHRoZSB2YWx1ZSBvZiBgdGhpc2AgZXZlcnlcbiAqICAgICAgICB0aW1lIHRoYXQgYGFDYWxsYmFja2AgaXMgY2FsbGVkLlxuICogQHBhcmFtIGFPcmRlclxuICogICAgICAgIEVpdGhlciBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYCBvclxuICogICAgICAgIGBTb3VyY2VNYXBDb25zdW1lci5PUklHSU5BTF9PUkRFUmAuIFNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRvXG4gKiAgICAgICAgaXRlcmF0ZSBvdmVyIHRoZSBtYXBwaW5ncyBzb3J0ZWQgYnkgdGhlIGdlbmVyYXRlZCBmaWxlJ3MgbGluZS9jb2x1bW5cbiAqICAgICAgICBvcmRlciBvciB0aGUgb3JpZ2luYWwncyBzb3VyY2UvbGluZS9jb2x1bW4gb3JkZXIsIHJlc3BlY3RpdmVseS4gRGVmYXVsdHMgdG9cbiAqICAgICAgICBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYC5cbiAqL1xuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmVhY2hNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZWFjaE1hcHBpbmcoYUNhbGxiYWNrLCBhQ29udGV4dCwgYU9yZGVyKSB7XG4gICAgdmFyIGNvbnRleHQgPSBhQ29udGV4dCB8fCBudWxsO1xuICAgIHZhciBvcmRlciA9IGFPcmRlciB8fCBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVI7XG5cbiAgICB2YXIgbWFwcGluZ3M7XG4gICAgc3dpdGNoIChvcmRlcikge1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSOlxuICAgICAgbWFwcGluZ3MgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuT1JJR0lOQUxfT1JERVI6XG4gICAgICBtYXBwaW5ncyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3M7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBvcmRlciBvZiBpdGVyYXRpb24uXCIpO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2VSb290ID0gdGhpcy5zb3VyY2VSb290O1xuICAgIG1hcHBpbmdzLm1hcChmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlID09PSBudWxsID8gbnVsbCA6IHRoaXMuX3NvdXJjZXMuYXQobWFwcGluZy5zb3VyY2UpO1xuICAgICAgc291cmNlID0gdXRpbC5jb21wdXRlU291cmNlVVJMKHNvdXJjZVJvb3QsIHNvdXJjZSwgdGhpcy5fc291cmNlTWFwVVJMKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICBnZW5lcmF0ZWRMaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgIGdlbmVyYXRlZENvbHVtbjogbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4sXG4gICAgICAgIG9yaWdpbmFsTGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgIG9yaWdpbmFsQ29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLFxuICAgICAgICBuYW1lOiBtYXBwaW5nLm5hbWUgPT09IG51bGwgPyBudWxsIDogdGhpcy5fbmFtZXMuYXQobWFwcGluZy5uYW1lKVxuICAgICAgfTtcbiAgICB9LCB0aGlzKS5mb3JFYWNoKGFDYWxsYmFjaywgY29udGV4dCk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyBhbGwgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIG9yaWdpbmFsIHNvdXJjZSxcbiAqIGxpbmUsIGFuZCBjb2x1bW4gcHJvdmlkZWQuIElmIG5vIGNvbHVtbiBpcyBwcm92aWRlZCwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gYSBlaXRoZXIgdGhlIGxpbmUgd2UgYXJlIHNlYXJjaGluZyBmb3Igb3IgdGhlIG5leHRcbiAqIGNsb3Nlc3QgbGluZSB0aGF0IGhhcyBhbnkgbWFwcGluZ3MuIE90aGVyd2lzZSwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGxpbmUgYW5kIGVpdGhlciB0aGUgY29sdW1uIHdlIGFyZSBzZWFyY2hpbmcgZm9yXG4gKiBvciB0aGUgbmV4dCBjbG9zZXN0IGNvbHVtbiB0aGF0IGhhcyBhbnkgb2Zmc2V0cy5cbiAqXG4gKiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuICBUaGUgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IE9wdGlvbmFsLiB0aGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICogICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqXG4gKiBhbmQgYW4gYXJyYXkgb2Ygb2JqZWN0cyBpcyByZXR1cm5lZCwgZWFjaCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICBsaW5lIG51bWJlciBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgICBUaGUgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuYWxsR2VuZXJhdGVkUG9zaXRpb25zRm9yID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfYWxsR2VuZXJhdGVkUG9zaXRpb25zRm9yKGFBcmdzKSB7XG4gICAgdmFyIGxpbmUgPSB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKTtcblxuICAgIC8vIFdoZW4gdGhlcmUgaXMgbm8gZXhhY3QgbWF0Y2gsIEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9maW5kTWFwcGluZ1xuICAgIC8vIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IG1hcHBpbmcgbGVzcyB0aGFuIHRoZSBuZWVkbGUuIEJ5XG4gICAgLy8gc2V0dGluZyBuZWVkbGUub3JpZ2luYWxDb2x1bW4gdG8gMCwgd2UgdGh1cyBmaW5kIHRoZSBsYXN0IG1hcHBpbmcgZm9yXG4gICAgLy8gdGhlIGdpdmVuIGxpbmUsIHByb3ZpZGVkIHN1Y2ggYSBtYXBwaW5nIGV4aXN0cy5cbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgc291cmNlOiB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScpLFxuICAgICAgb3JpZ2luYWxMaW5lOiBsaW5lLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJywgMClcbiAgICB9O1xuXG4gICAgbmVlZGxlLnNvdXJjZSA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChuZWVkbGUuc291cmNlKTtcbiAgICBpZiAobmVlZGxlLnNvdXJjZSA8IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB2YXIgbWFwcGluZ3MgPSBbXTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKG5lZWRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3JpZ2luYWxMaW5lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcmlnaW5hbENvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgaWYgKGFBcmdzLmNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBvcmlnaW5hbExpbmUgPSBtYXBwaW5nLm9yaWdpbmFsTGluZTtcblxuICAgICAgICAvLyBJdGVyYXRlIHVudGlsIGVpdGhlciB3ZSBydW4gb3V0IG9mIG1hcHBpbmdzLCBvciB3ZSBydW4gaW50b1xuICAgICAgICAvLyBhIG1hcHBpbmcgZm9yIGEgZGlmZmVyZW50IGxpbmUgdGhhbiB0aGUgb25lIHdlIGZvdW5kLiBTaW5jZVxuICAgICAgICAvLyBtYXBwaW5ncyBhcmUgc29ydGVkLCB0aGlzIGlzIGd1YXJhbnRlZWQgdG8gZmluZCBhbGwgbWFwcGluZ3MgZm9yXG4gICAgICAgIC8vIHRoZSBsaW5lIHdlIGZvdW5kLlxuICAgICAgICB3aGlsZSAobWFwcGluZyAmJiBtYXBwaW5nLm9yaWdpbmFsTGluZSA9PT0gb3JpZ2luYWxMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgICBsYXN0Q29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbGFzdEdlbmVyYXRlZENvbHVtbicsIG51bGwpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1srK2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG9yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICAvLyBJdGVyYXRlIHVudGlsIGVpdGhlciB3ZSBydW4gb3V0IG9mIG1hcHBpbmdzLCBvciB3ZSBydW4gaW50b1xuICAgICAgICAvLyBhIG1hcHBpbmcgZm9yIGEgZGlmZmVyZW50IGxpbmUgdGhhbiB0aGUgb25lIHdlIHdlcmUgc2VhcmNoaW5nIGZvci5cbiAgICAgICAgLy8gU2luY2UgbWFwcGluZ3MgYXJlIHNvcnRlZCwgdGhpcyBpcyBndWFyYW50ZWVkIHRvIGZpbmQgYWxsIG1hcHBpbmdzIGZvclxuICAgICAgICAvLyB0aGUgbGluZSB3ZSBhcmUgc2VhcmNoaW5nIGZvci5cbiAgICAgICAgd2hpbGUgKG1hcHBpbmcgJiZcbiAgICAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID09PSBsaW5lICYmXG4gICAgICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID09IG9yaWdpbmFsQ29sdW1uKSB7XG4gICAgICAgICAgbWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgICBsYXN0Q29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbGFzdEdlbmVyYXRlZENvbHVtbicsIG51bGwpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1srK2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXBwaW5ncztcbiAgfTtcblxuZXhwb3J0cy5Tb3VyY2VNYXBDb25zdW1lciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIEEgQmFzaWNTb3VyY2VNYXBDb25zdW1lciBpbnN0YW5jZSByZXByZXNlbnRzIGEgcGFyc2VkIHNvdXJjZSBtYXAgd2hpY2ggd2UgY2FuXG4gKiBxdWVyeSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIGZpbGUgcG9zaXRpb25zIGJ5IGdpdmluZyBpdCBhIGZpbGVcbiAqIHBvc2l0aW9uIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLlxuICpcbiAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3JcbiAqIGFscmVhZHkgcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYywgc291cmNlIG1hcHMgaGF2ZSB0aGVcbiAqIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICpcbiAqICAgLSB2ZXJzaW9uOiBXaGljaCB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwIHNwZWMgdGhpcyBtYXAgaXMgZm9sbG93aW5nLlxuICogICAtIHNvdXJjZXM6IEFuIGFycmF5IG9mIFVSTHMgdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlcy5cbiAqICAgLSBuYW1lczogQW4gYXJyYXkgb2YgaWRlbnRpZmllcnMgd2hpY2ggY2FuIGJlIHJlZmVycmVuY2VkIGJ5IGluZGl2aWR1YWwgbWFwcGluZ3MuXG4gKiAgIC0gc291cmNlUm9vdDogT3B0aW9uYWwuIFRoZSBVUkwgcm9vdCBmcm9tIHdoaWNoIGFsbCBzb3VyY2VzIGFyZSByZWxhdGl2ZS5cbiAqICAgLSBzb3VyY2VzQ29udGVudDogT3B0aW9uYWwuIEFuIGFycmF5IG9mIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMuXG4gKiAgIC0gbWFwcGluZ3M6IEEgc3RyaW5nIG9mIGJhc2U2NCBWTFFzIHdoaWNoIGNvbnRhaW4gdGhlIGFjdHVhbCBtYXBwaW5ncy5cbiAqICAgLSBmaWxlOiBPcHRpb25hbC4gVGhlIGdlbmVyYXRlZCBmaWxlIHRoaXMgc291cmNlIG1hcCBpcyBhc3NvY2lhdGVkIHdpdGguXG4gKlxuICogSGVyZSBpcyBhbiBleGFtcGxlIHNvdXJjZSBtYXAsIHRha2VuIGZyb20gdGhlIHNvdXJjZSBtYXAgc3BlY1swXTpcbiAqXG4gKiAgICAge1xuICogICAgICAgdmVyc2lvbiA6IDMsXG4gKiAgICAgICBmaWxlOiBcIm91dC5qc1wiLFxuICogICAgICAgc291cmNlUm9vdCA6IFwiXCIsXG4gKiAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gKiAgICAgICBuYW1lczogW1wic3JjXCIsIFwibWFwc1wiLCBcImFyZVwiLCBcImZ1blwiXSxcbiAqICAgICAgIG1hcHBpbmdzOiBcIkFBLEFCOztBQkNERTtcIlxuICogICAgIH1cbiAqXG4gKiBUaGUgc2Vjb25kIHBhcmFtZXRlciwgaWYgZ2l2ZW4sIGlzIGEgc3RyaW5nIHdob3NlIHZhbHVlIGlzIHRoZSBVUkxcbiAqIGF0IHdoaWNoIHRoZSBzb3VyY2UgbWFwIHdhcyBmb3VuZC4gIFRoaXMgVVJMIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGVcbiAqIHNvdXJjZXMgYXJyYXkuXG4gKlxuICogWzBdOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFVMVJHQWVoUXdSeXBVVG92RjFLUmxwaU9GemUwYi1fMmdjNmZBSDBLWTBrL2VkaXQ/cGxpPTEjXG4gKi9cbmZ1bmN0aW9uIEJhc2ljU291cmNlTWFwQ29uc3VtZXIoYVNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTCkge1xuICB2YXIgc291cmNlTWFwID0gYVNvdXJjZU1hcDtcbiAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAnc3RyaW5nJykge1xuICAgIHNvdXJjZU1hcCA9IHV0aWwucGFyc2VTb3VyY2VNYXBJbnB1dChhU291cmNlTWFwKTtcbiAgfVxuXG4gIHZhciB2ZXJzaW9uID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAndmVyc2lvbicpO1xuICB2YXIgc291cmNlcyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZXMnKTtcbiAgLy8gU2FzcyAzLjMgbGVhdmVzIG91dCB0aGUgJ25hbWVzJyBhcnJheSwgc28gd2UgZGV2aWF0ZSBmcm9tIHRoZSBzcGVjICh3aGljaFxuICAvLyByZXF1aXJlcyB0aGUgYXJyYXkpIHRvIHBsYXkgbmljZSBoZXJlLlxuICB2YXIgbmFtZXMgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICduYW1lcycsIFtdKTtcbiAgdmFyIHNvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VSb290JywgbnVsbCk7XG4gIHZhciBzb3VyY2VzQ29udGVudCA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZXNDb250ZW50JywgbnVsbCk7XG4gIHZhciBtYXBwaW5ncyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ21hcHBpbmdzJyk7XG4gIHZhciBmaWxlID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnZmlsZScsIG51bGwpO1xuXG4gIC8vIE9uY2UgYWdhaW4sIFNhc3MgZGV2aWF0ZXMgZnJvbSB0aGUgc3BlYyBhbmQgc3VwcGxpZXMgdGhlIHZlcnNpb24gYXMgYVxuICAvLyBzdHJpbmcgcmF0aGVyIHRoYW4gYSBudW1iZXIsIHNvIHdlIHVzZSBsb29zZSBlcXVhbGl0eSBjaGVja2luZyBoZXJlLlxuICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICBpZiAoc291cmNlUm9vdCkge1xuICAgIHNvdXJjZVJvb3QgPSB1dGlsLm5vcm1hbGl6ZShzb3VyY2VSb290KTtcbiAgfVxuXG4gIHNvdXJjZXMgPSBzb3VyY2VzXG4gICAgLm1hcChTdHJpbmcpXG4gICAgLy8gU29tZSBzb3VyY2UgbWFwcyBwcm9kdWNlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBsaWtlIFwiLi9mb28uanNcIiBpbnN0ZWFkIG9mXG4gICAgLy8gXCJmb28uanNcIi4gIE5vcm1hbGl6ZSB0aGVzZSBmaXJzdCBzbyB0aGF0IGZ1dHVyZSBjb21wYXJpc29ucyB3aWxsIHN1Y2NlZWQuXG4gICAgLy8gU2VlIGJ1Z3ppbC5sYS8xMDkwNzY4LlxuICAgIC5tYXAodXRpbC5ub3JtYWxpemUpXG4gICAgLy8gQWx3YXlzIGVuc3VyZSB0aGF0IGFic29sdXRlIHNvdXJjZXMgYXJlIGludGVybmFsbHkgc3RvcmVkIHJlbGF0aXZlIHRvXG4gICAgLy8gdGhlIHNvdXJjZSByb290LCBpZiB0aGUgc291cmNlIHJvb3QgaXMgYWJzb2x1dGUuIE5vdCBkb2luZyB0aGlzIHdvdWxkXG4gICAgLy8gYmUgcGFydGljdWxhcmx5IHByb2JsZW1hdGljIHdoZW4gdGhlIHNvdXJjZSByb290IGlzIGEgcHJlZml4IG9mIHRoZVxuICAgIC8vIHNvdXJjZSAodmFsaWQsIGJ1dCB3aHk/PykuIFNlZSBnaXRodWIgaXNzdWUgIzE5OSBhbmQgYnVnemlsLmxhLzExODg5ODIuXG4gICAgLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICByZXR1cm4gc291cmNlUm9vdCAmJiB1dGlsLmlzQWJzb2x1dGUoc291cmNlUm9vdCkgJiYgdXRpbC5pc0Fic29sdXRlKHNvdXJjZSlcbiAgICAgICAgPyB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZSlcbiAgICAgICAgOiBzb3VyY2U7XG4gICAgfSk7XG5cbiAgLy8gUGFzcyBgdHJ1ZWAgYmVsb3cgdG8gYWxsb3cgZHVwbGljYXRlIG5hbWVzIGFuZCBzb3VyY2VzLiBXaGlsZSBzb3VyY2UgbWFwc1xuICAvLyBhcmUgaW50ZW5kZWQgdG8gYmUgY29tcHJlc3NlZCBhbmQgZGVkdXBsaWNhdGVkLCB0aGUgVHlwZVNjcmlwdCBjb21waWxlclxuICAvLyBzb21ldGltZXMgZ2VuZXJhdGVzIHNvdXJjZSBtYXBzIHdpdGggZHVwbGljYXRlcyBpbiB0aGVtLiBTZWUgR2l0aHViIGlzc3VlXG4gIC8vICM3MiBhbmQgYnVnemlsLmxhLzg4OTQ5Mi5cbiAgdGhpcy5fbmFtZXMgPSBBcnJheVNldC5mcm9tQXJyYXkobmFtZXMubWFwKFN0cmluZyksIHRydWUpO1xuICB0aGlzLl9zb3VyY2VzID0gQXJyYXlTZXQuZnJvbUFycmF5KHNvdXJjZXMsIHRydWUpO1xuXG4gIHRoaXMuX2Fic29sdXRlU291cmNlcyA9IHRoaXMuX3NvdXJjZXMudG9BcnJheSgpLm1hcChmdW5jdGlvbiAocykge1xuICAgIHJldHVybiB1dGlsLmNvbXB1dGVTb3VyY2VVUkwoc291cmNlUm9vdCwgcywgYVNvdXJjZU1hcFVSTCk7XG4gIH0pO1xuXG4gIHRoaXMuc291cmNlUm9vdCA9IHNvdXJjZVJvb3Q7XG4gIHRoaXMuc291cmNlc0NvbnRlbnQgPSBzb3VyY2VzQ29udGVudDtcbiAgdGhpcy5fbWFwcGluZ3MgPSBtYXBwaW5ncztcbiAgdGhpcy5fc291cmNlTWFwVVJMID0gYVNvdXJjZU1hcFVSTDtcbiAgdGhpcy5maWxlID0gZmlsZTtcbn1cblxuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSk7XG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdW1lciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZmluZCB0aGUgaW5kZXggb2YgYSBzb3VyY2UuICBSZXR1cm5zIC0xIGlmIG5vdFxuICogZm91bmQuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9maW5kU291cmNlSW5kZXggPSBmdW5jdGlvbihhU291cmNlKSB7XG4gIHZhciByZWxhdGl2ZVNvdXJjZSA9IGFTb3VyY2U7XG4gIGlmICh0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgIHJlbGF0aXZlU291cmNlID0gdXRpbC5yZWxhdGl2ZSh0aGlzLnNvdXJjZVJvb3QsIHJlbGF0aXZlU291cmNlKTtcbiAgfVxuXG4gIGlmICh0aGlzLl9zb3VyY2VzLmhhcyhyZWxhdGl2ZVNvdXJjZSkpIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlcy5pbmRleE9mKHJlbGF0aXZlU291cmNlKTtcbiAgfVxuXG4gIC8vIE1heWJlIGFTb3VyY2UgaXMgYW4gYWJzb2x1dGUgVVJMIGFzIHJldHVybmVkIGJ5IHxzb3VyY2VzfC4gIEluXG4gIC8vIHRoaXMgY2FzZSB3ZSBjYW4ndCBzaW1wbHkgdW5kbyB0aGUgdHJhbnNmb3JtLlxuICB2YXIgaTtcbiAgZm9yIChpID0gMDsgaSA8IHRoaXMuX2Fic29sdXRlU291cmNlcy5sZW5ndGg7ICsraSkge1xuICAgIGlmICh0aGlzLl9hYnNvbHV0ZVNvdXJjZXNbaV0gPT0gYVNvdXJjZSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyIGZyb20gYSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gKlxuICogQHBhcmFtIFNvdXJjZU1hcEdlbmVyYXRvciBhU291cmNlTWFwXG4gKiAgICAgICAgVGhlIHNvdXJjZSBtYXAgdGhhdCB3aWxsIGJlIGNvbnN1bWVkLlxuICogQHBhcmFtIFN0cmluZyBhU291cmNlTWFwVVJMXG4gKiAgICAgICAgVGhlIFVSTCBhdCB3aGljaCB0aGUgc291cmNlIG1hcCBjYW4gYmUgZm91bmQgKG9wdGlvbmFsKVxuICogQHJldHVybnMgQmFzaWNTb3VyY2VNYXBDb25zdW1lclxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9mcm9tU291cmNlTWFwKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgICB2YXIgc21jID0gT2JqZWN0LmNyZWF0ZShCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSk7XG5cbiAgICB2YXIgbmFtZXMgPSBzbWMuX25hbWVzID0gQXJyYXlTZXQuZnJvbUFycmF5KGFTb3VyY2VNYXAuX25hbWVzLnRvQXJyYXkoKSwgdHJ1ZSk7XG4gICAgdmFyIHNvdXJjZXMgPSBzbWMuX3NvdXJjZXMgPSBBcnJheVNldC5mcm9tQXJyYXkoYVNvdXJjZU1hcC5fc291cmNlcy50b0FycmF5KCksIHRydWUpO1xuICAgIHNtYy5zb3VyY2VSb290ID0gYVNvdXJjZU1hcC5fc291cmNlUm9vdDtcbiAgICBzbWMuc291cmNlc0NvbnRlbnQgPSBhU291cmNlTWFwLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KHNtYy5fc291cmNlcy50b0FycmF5KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWMuc291cmNlUm9vdCk7XG4gICAgc21jLmZpbGUgPSBhU291cmNlTWFwLl9maWxlO1xuICAgIHNtYy5fc291cmNlTWFwVVJMID0gYVNvdXJjZU1hcFVSTDtcbiAgICBzbWMuX2Fic29sdXRlU291cmNlcyA9IHNtYy5fc291cmNlcy50b0FycmF5KCkubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgICByZXR1cm4gdXRpbC5jb21wdXRlU291cmNlVVJMKHNtYy5zb3VyY2VSb290LCBzLCBhU291cmNlTWFwVVJMKTtcbiAgICB9KTtcblxuICAgIC8vIEJlY2F1c2Ugd2UgYXJlIG1vZGlmeWluZyB0aGUgZW50cmllcyAoYnkgY29udmVydGluZyBzdHJpbmcgc291cmNlcyBhbmRcbiAgICAvLyBuYW1lcyB0byBpbmRpY2VzIGludG8gdGhlIHNvdXJjZXMgYW5kIG5hbWVzIEFycmF5U2V0cyksIHdlIGhhdmUgdG8gbWFrZVxuICAgIC8vIGEgY29weSBvZiB0aGUgZW50cnkgb3IgZWxzZSBiYWQgdGhpbmdzIGhhcHBlbi4gU2hhcmVkIG11dGFibGUgc3RhdGVcbiAgICAvLyBzdHJpa2VzIGFnYWluISBTZWUgZ2l0aHViIGlzc3VlICMxOTEuXG5cbiAgICB2YXIgZ2VuZXJhdGVkTWFwcGluZ3MgPSBhU291cmNlTWFwLl9tYXBwaW5ncy50b0FycmF5KCkuc2xpY2UoKTtcbiAgICB2YXIgZGVzdEdlbmVyYXRlZE1hcHBpbmdzID0gc21jLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBbXTtcbiAgICB2YXIgZGVzdE9yaWdpbmFsTWFwcGluZ3MgPSBzbWMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzcmNNYXBwaW5nID0gZ2VuZXJhdGVkTWFwcGluZ3NbaV07XG4gICAgICB2YXIgZGVzdE1hcHBpbmcgPSBuZXcgTWFwcGluZztcbiAgICAgIGRlc3RNYXBwaW5nLmdlbmVyYXRlZExpbmUgPSBzcmNNYXBwaW5nLmdlbmVyYXRlZExpbmU7XG4gICAgICBkZXN0TWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gPSBzcmNNYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKHNyY01hcHBpbmcuc291cmNlKSB7XG4gICAgICAgIGRlc3RNYXBwaW5nLnNvdXJjZSA9IHNvdXJjZXMuaW5kZXhPZihzcmNNYXBwaW5nLnNvdXJjZSk7XG4gICAgICAgIGRlc3RNYXBwaW5nLm9yaWdpbmFsTGluZSA9IHNyY01hcHBpbmcub3JpZ2luYWxMaW5lO1xuICAgICAgICBkZXN0TWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IHNyY01hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgaWYgKHNyY01hcHBpbmcubmFtZSkge1xuICAgICAgICAgIGRlc3RNYXBwaW5nLm5hbWUgPSBuYW1lcy5pbmRleE9mKHNyY01hcHBpbmcubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZXN0T3JpZ2luYWxNYXBwaW5ncy5wdXNoKGRlc3RNYXBwaW5nKTtcbiAgICAgIH1cblxuICAgICAgZGVzdEdlbmVyYXRlZE1hcHBpbmdzLnB1c2goZGVzdE1hcHBpbmcpO1xuICAgIH1cblxuICAgIHF1aWNrU29ydChzbWMuX19vcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcblxuICAgIHJldHVybiBzbWM7XG4gIH07XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnc291cmNlcycsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Fic29sdXRlU291cmNlcy5zbGljZSgpO1xuICB9XG59KTtcblxuLyoqXG4gKiBQcm92aWRlIHRoZSBKSVQgd2l0aCBhIG5pY2Ugc2hhcGUgLyBoaWRkZW4gY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIE1hcHBpbmcoKSB7XG4gIHRoaXMuZ2VuZXJhdGVkTGluZSA9IDA7XG4gIHRoaXMuZ2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgdGhpcy5zb3VyY2UgPSBudWxsO1xuICB0aGlzLm9yaWdpbmFsTGluZSA9IG51bGw7XG4gIHRoaXMub3JpZ2luYWxDb2x1bW4gPSBudWxsO1xuICB0aGlzLm5hbWUgPSBudWxsO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdmFyIGdlbmVyYXRlZExpbmUgPSAxO1xuICAgIHZhciBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzU291cmNlID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gYVN0ci5sZW5ndGg7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgY2FjaGVkU2VnbWVudHMgPSB7fTtcbiAgICB2YXIgdGVtcCA9IHt9O1xuICAgIHZhciBvcmlnaW5hbE1hcHBpbmdzID0gW107XG4gICAgdmFyIGdlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdmFyIG1hcHBpbmcsIHN0ciwgc2VnbWVudCwgZW5kLCB2YWx1ZTtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGFTdHIuY2hhckF0KGluZGV4KSA9PT0gJzsnKSB7XG4gICAgICAgIGdlbmVyYXRlZExpbmUrKztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoYVN0ci5jaGFyQXQoaW5kZXgpID09PSAnLCcpIHtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBtYXBwaW5nID0gbmV3IE1hcHBpbmcoKTtcbiAgICAgICAgbWFwcGluZy5nZW5lcmF0ZWRMaW5lID0gZ2VuZXJhdGVkTGluZTtcblxuICAgICAgICAvLyBCZWNhdXNlIGVhY2ggb2Zmc2V0IGlzIGVuY29kZWQgcmVsYXRpdmUgdG8gdGhlIHByZXZpb3VzIG9uZSxcbiAgICAgICAgLy8gbWFueSBzZWdtZW50cyBvZnRlbiBoYXZlIHRoZSBzYW1lIGVuY29kaW5nLiBXZSBjYW4gZXhwbG9pdCB0aGlzXG4gICAgICAgIC8vIGZhY3QgYnkgY2FjaGluZyB0aGUgcGFyc2VkIHZhcmlhYmxlIGxlbmd0aCBmaWVsZHMgb2YgZWFjaCBzZWdtZW50LFxuICAgICAgICAvLyBhbGxvd2luZyB1cyB0byBhdm9pZCBhIHNlY29uZCBwYXJzZSBpZiB3ZSBlbmNvdW50ZXIgdGhlIHNhbWVcbiAgICAgICAgLy8gc2VnbWVudCBhZ2Fpbi5cbiAgICAgICAgZm9yIChlbmQgPSBpbmRleDsgZW5kIDwgbGVuZ3RoOyBlbmQrKykge1xuICAgICAgICAgIGlmICh0aGlzLl9jaGFySXNNYXBwaW5nU2VwYXJhdG9yKGFTdHIsIGVuZCkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdHIgPSBhU3RyLnNsaWNlKGluZGV4LCBlbmQpO1xuXG4gICAgICAgIHNlZ21lbnQgPSBjYWNoZWRTZWdtZW50c1tzdHJdO1xuICAgICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICAgIGluZGV4ICs9IHN0ci5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VnbWVudCA9IFtdO1xuICAgICAgICAgIHdoaWxlIChpbmRleCA8IGVuZCkge1xuICAgICAgICAgICAgYmFzZTY0VkxRLmRlY29kZShhU3RyLCBpbmRleCwgdGVtcCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHRlbXAudmFsdWU7XG4gICAgICAgICAgICBpbmRleCA9IHRlbXAucmVzdDtcbiAgICAgICAgICAgIHNlZ21lbnQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlLCBidXQgbm8gbGluZSBhbmQgY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlIGFuZCBsaW5lLCBidXQgbm8gY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FjaGVkU2VnbWVudHNbc3RyXSA9IHNlZ21lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZW5lcmF0ZWQgY29sdW1uLlxuICAgICAgICBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiA9IHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uICsgc2VnbWVudFswXTtcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgLy8gT3JpZ2luYWwgc291cmNlLlxuICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gcHJldmlvdXNTb3VyY2UgKyBzZWdtZW50WzFdO1xuICAgICAgICAgIHByZXZpb3VzU291cmNlICs9IHNlZ21lbnRbMV07XG5cbiAgICAgICAgICAvLyBPcmlnaW5hbCBsaW5lLlxuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID0gcHJldmlvdXNPcmlnaW5hbExpbmUgKyBzZWdtZW50WzJdO1xuICAgICAgICAgIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmU7XG4gICAgICAgICAgLy8gTGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkXG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgKz0gMTtcblxuICAgICAgICAgIC8vIE9yaWdpbmFsIGNvbHVtbi5cbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID0gcHJldmlvdXNPcmlnaW5hbENvbHVtbiArIHNlZ21lbnRbM107XG4gICAgICAgICAgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IG1hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiA0KSB7XG4gICAgICAgICAgICAvLyBPcmlnaW5hbCBuYW1lLlxuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gcHJldmlvdXNOYW1lICsgc2VnbWVudFs0XTtcbiAgICAgICAgICAgIHByZXZpb3VzTmFtZSArPSBzZWdtZW50WzRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdlbmVyYXRlZE1hcHBpbmdzLnB1c2gobWFwcGluZyk7XG4gICAgICAgIGlmICh0eXBlb2YgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgb3JpZ2luYWxNYXBwaW5ncy5wdXNoKG1hcHBpbmcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcXVpY2tTb3J0KGdlbmVyYXRlZE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKTtcbiAgICB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBnZW5lcmF0ZWRNYXBwaW5ncztcblxuICAgIHF1aWNrU29ydChvcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncyA9IG9yaWdpbmFsTWFwcGluZ3M7XG4gIH07XG5cbi8qKlxuICogRmluZCB0aGUgbWFwcGluZyB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUgaHlwb3RoZXRpY2FsIFwibmVlZGxlXCIgbWFwcGluZyB0aGF0XG4gKiB3ZSBhcmUgc2VhcmNoaW5nIGZvciBpbiB0aGUgZ2l2ZW4gXCJoYXlzdGFja1wiIG9mIG1hcHBpbmdzLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZE1hcHBpbmcgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9maW5kTWFwcGluZyhhTmVlZGxlLCBhTWFwcGluZ3MsIGFMaW5lTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUNvbHVtbk5hbWUsIGFDb21wYXJhdG9yLCBhQmlhcykge1xuICAgIC8vIFRvIHJldHVybiB0aGUgcG9zaXRpb24gd2UgYXJlIHNlYXJjaGluZyBmb3IsIHdlIG11c3QgZmlyc3QgZmluZCB0aGVcbiAgICAvLyBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHRoZW4gcmV0dXJuIHRoZSBvcHBvc2l0ZSBwb3NpdGlvbiBpdFxuICAgIC8vIHBvaW50cyB0by4gQmVjYXVzZSB0aGUgbWFwcGluZ3MgYXJlIHNvcnRlZCwgd2UgY2FuIHVzZSBiaW5hcnkgc2VhcmNoIHRvXG4gICAgLy8gZmluZCB0aGUgYmVzdCBtYXBwaW5nLlxuXG4gICAgaWYgKGFOZWVkbGVbYUxpbmVOYW1lXSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdMaW5lIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthTGluZU5hbWVdKTtcbiAgICB9XG4gICAgaWYgKGFOZWVkbGVbYUNvbHVtbk5hbWVdIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ29sdW1uIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthQ29sdW1uTmFtZV0pO1xuICAgIH1cblxuICAgIHJldHVybiBiaW5hcnlTZWFyY2guc2VhcmNoKGFOZWVkbGUsIGFNYXBwaW5ncywgYUNvbXBhcmF0b3IsIGFCaWFzKTtcbiAgfTtcblxuLyoqXG4gKiBDb21wdXRlIHRoZSBsYXN0IGNvbHVtbiBmb3IgZWFjaCBnZW5lcmF0ZWQgbWFwcGluZy4gVGhlIGxhc3QgY29sdW1uIGlzXG4gKiBpbmNsdXNpdmUuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmNvbXB1dGVDb2x1bW5TcGFucyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NvbXB1dGVDb2x1bW5TcGFucygpIHtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyArK2luZGV4KSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgLy8gTWFwcGluZ3MgZG8gbm90IGNvbnRhaW4gYSBmaWVsZCBmb3IgdGhlIGxhc3QgZ2VuZXJhdGVkIGNvbHVtbnQuIFdlXG4gICAgICAvLyBjYW4gY29tZSB1cCB3aXRoIGFuIG9wdGltaXN0aWMgZXN0aW1hdGUsIGhvd2V2ZXIsIGJ5IGFzc3VtaW5nIHRoYXRcbiAgICAgIC8vIG1hcHBpbmdzIGFyZSBjb250aWd1b3VzIChpLmUuIGdpdmVuIHR3byBjb25zZWN1dGl2ZSBtYXBwaW5ncywgdGhlXG4gICAgICAvLyBmaXJzdCBtYXBwaW5nIGVuZHMgd2hlcmUgdGhlIHNlY29uZCBvbmUgc3RhcnRzKS5cbiAgICAgIGlmIChpbmRleCArIDEgPCB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIG5leHRNYXBwaW5nID0gdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3NbaW5kZXggKyAxXTtcblxuICAgICAgICBpZiAobWFwcGluZy5nZW5lcmF0ZWRMaW5lID09PSBuZXh0TWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gbmV4dE1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgbGFzdCBtYXBwaW5nIGZvciBlYWNoIGxpbmUgc3BhbnMgdGhlIGVudGlyZSBsaW5lLlxuICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gSW5maW5pdHk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSwgbGluZSwgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGdlbmVyYXRlZFxuICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0XG4gKiB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLiAgVGhlIGxpbmUgbnVtYmVyXG4gKiAgICAgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ1NvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLCBvciBudWxsLlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UsIG9yIG51bGwuICBUaGVcbiAqICAgICBjb2x1bW4gbnVtYmVyIGlzIDAtYmFzZWQuXG4gKiAgIC0gbmFtZTogVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIsIG9yIG51bGwuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLm9yaWdpbmFsUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9vcmlnaW5hbFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgIGdlbmVyYXRlZExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgZ2VuZXJhdGVkQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicpXG4gICAgfTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKFxuICAgICAgbmVlZGxlLFxuICAgICAgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MsXG4gICAgICBcImdlbmVyYXRlZExpbmVcIixcbiAgICAgIFwiZ2VuZXJhdGVkQ29sdW1uXCIsXG4gICAgICB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkLFxuICAgICAgdXRpbC5nZXRBcmcoYUFyZ3MsICdiaWFzJywgU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQpXG4gICAgKTtcblxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSA9PT0gbmVlZGxlLmdlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdzb3VyY2UnLCBudWxsKTtcbiAgICAgICAgaWYgKHNvdXJjZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuYXQoc291cmNlKTtcbiAgICAgICAgICBzb3VyY2UgPSB1dGlsLmNvbXB1dGVTb3VyY2VVUkwodGhpcy5zb3VyY2VSb290LCBzb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5hbWUgPSB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbmFtZScsIG51bGwpO1xuICAgICAgICBpZiAobmFtZSAhPT0gbnVsbCkge1xuICAgICAgICAgIG5hbWUgPSB0aGlzLl9uYW1lcy5hdChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdvcmlnaW5hbExpbmUnLCBudWxsKSxcbiAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdvcmlnaW5hbENvbHVtbicsIG51bGwpLFxuICAgICAgICAgIG5hbWU6IG5hbWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc291cmNlOiBudWxsLFxuICAgICAgbGluZTogbnVsbCxcbiAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgIG5hbWU6IG51bGxcbiAgICB9O1xuICB9O1xuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHdlIGhhdmUgdGhlIHNvdXJjZSBjb250ZW50IGZvciBldmVyeSBzb3VyY2UgaW4gdGhlIHNvdXJjZVxuICogbWFwLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzID1cbiAgZnVuY3Rpb24gQmFzaWNTb3VyY2VNYXBDb25zdW1lcl9oYXNDb250ZW50c09mQWxsU291cmNlcygpIHtcbiAgICBpZiAoIXRoaXMuc291cmNlc0NvbnRlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnQubGVuZ3RoID49IHRoaXMuX3NvdXJjZXMuc2l6ZSgpICYmXG4gICAgICAhdGhpcy5zb3VyY2VzQ29udGVudC5zb21lKGZ1bmN0aW9uIChzYykgeyByZXR1cm4gc2MgPT0gbnVsbDsgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlIGNvbnRlbnQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIHRoZSB1cmwgb2YgdGhlXG4gKiBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gUmV0dXJucyBudWxsIGlmIG5vIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50IGlzXG4gKiBhdmFpbGFibGUuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLnNvdXJjZUNvbnRlbnRGb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIG51bGxPbk1pc3NpbmcpIHtcbiAgICBpZiAoIXRoaXMuc291cmNlc0NvbnRlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChhU291cmNlKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnRbaW5kZXhdO1xuICAgIH1cblxuICAgIHZhciByZWxhdGl2ZVNvdXJjZSA9IGFTb3VyY2U7XG4gICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICByZWxhdGl2ZVNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5zb3VyY2VSb290LCByZWxhdGl2ZVNvdXJjZSk7XG4gICAgfVxuXG4gICAgdmFyIHVybDtcbiAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGxcbiAgICAgICAgJiYgKHVybCA9IHV0aWwudXJsUGFyc2UodGhpcy5zb3VyY2VSb290KSkpIHtcbiAgICAgIC8vIFhYWDogZmlsZTovLyBVUklzIGFuZCBhYnNvbHV0ZSBwYXRocyBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3IgZm9yXG4gICAgICAvLyBtYW55IHVzZXJzLiBXZSBjYW4gaGVscCB0aGVtIG91dCB3aGVuIHRoZXkgZXhwZWN0IGZpbGU6Ly8gVVJJcyB0b1xuICAgICAgLy8gYmVoYXZlIGxpa2UgaXQgd291bGQgaWYgdGhleSB3ZXJlIHJ1bm5pbmcgYSBsb2NhbCBIVFRQIHNlcnZlci4gU2VlXG4gICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD04ODU1OTcuXG4gICAgICB2YXIgZmlsZVVyaUFic1BhdGggPSByZWxhdGl2ZVNvdXJjZS5yZXBsYWNlKC9eZmlsZTpcXC9cXC8vLCBcIlwiKTtcbiAgICAgIGlmICh1cmwuc2NoZW1lID09IFwiZmlsZVwiXG4gICAgICAgICAgJiYgdGhpcy5fc291cmNlcy5oYXMoZmlsZVVyaUFic1BhdGgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihmaWxlVXJpQWJzUGF0aCldXG4gICAgICB9XG5cbiAgICAgIGlmICgoIXVybC5wYXRoIHx8IHVybC5wYXRoID09IFwiL1wiKVxuICAgICAgICAgICYmIHRoaXMuX3NvdXJjZXMuaGFzKFwiL1wiICsgcmVsYXRpdmVTb3VyY2UpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihcIi9cIiArIHJlbGF0aXZlU291cmNlKV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHJlY3Vyc2l2ZWx5IGZyb21cbiAgICAvLyBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLnNvdXJjZUNvbnRlbnRGb3IuIEluIHRoYXQgY2FzZSwgd2VcbiAgICAvLyBkb24ndCB3YW50IHRvIHRocm93IGlmIHdlIGNhbid0IGZpbmQgdGhlIHNvdXJjZSAtIHdlIGp1c3Qgd2FudCB0b1xuICAgIC8vIHJldHVybiBudWxsLCBzbyB3ZSBwcm92aWRlIGEgZmxhZyB0byBleGl0IGdyYWNlZnVsbHkuXG4gICAgaWYgKG51bGxPbk1pc3NpbmcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignXCInICsgcmVsYXRpdmVTb3VyY2UgKyAnXCIgaXMgbm90IGluIHRoZSBTb3VyY2VNYXAuJyk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsXG4gKiBsaW5lLCBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcbiAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ1NvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAqICAgICBUaGUgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2dlbmVyYXRlZFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJyk7XG4gICAgc291cmNlID0gdGhpcy5fZmluZFNvdXJjZUluZGV4KHNvdXJjZSk7XG4gICAgaWYgKHNvdXJjZSA8IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpbmU6IG51bGwsXG4gICAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgICAgbGFzdENvbHVtbjogbnVsbFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICBvcmlnaW5hbExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJylcbiAgICB9O1xuXG4gICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZE1hcHBpbmcoXG4gICAgICBuZWVkbGUsXG4gICAgICB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzLFxuICAgICAgXCJvcmlnaW5hbExpbmVcIixcbiAgICAgIFwib3JpZ2luYWxDb2x1bW5cIixcbiAgICAgIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMsXG4gICAgICB1dGlsLmdldEFyZyhhQXJncywgJ2JpYXMnLCBTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORClcbiAgICApO1xuXG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHZhciBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSA9PT0gbmVlZGxlLnNvdXJjZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRMaW5lJywgbnVsbCksXG4gICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgbGFzdENvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2xhc3RHZW5lcmF0ZWRDb2x1bW4nLCBudWxsKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsaW5lOiBudWxsLFxuICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgbGFzdENvbHVtbjogbnVsbFxuICAgIH07XG4gIH07XG5cbmV4cG9ydHMuQmFzaWNTb3VyY2VNYXBDb25zdW1lciA9IEJhc2ljU291cmNlTWFwQ29uc3VtZXI7XG5cbi8qKlxuICogQW4gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyIGluc3RhbmNlIHJlcHJlc2VudHMgYSBwYXJzZWQgc291cmNlIG1hcCB3aGljaFxuICogd2UgY2FuIHF1ZXJ5IGZvciBpbmZvcm1hdGlvbi4gSXQgZGlmZmVycyBmcm9tIEJhc2ljU291cmNlTWFwQ29uc3VtZXIgaW5cbiAqIHRoYXQgaXQgdGFrZXMgXCJpbmRleGVkXCIgc291cmNlIG1hcHMgKGkuZS4gb25lcyB3aXRoIGEgXCJzZWN0aW9uc1wiIGZpZWxkKSBhc1xuICogaW5wdXQuXG4gKlxuICogVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3IgYWxyZWFkeVxuICogcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYyBmb3IgaW5kZXhlZCBzb3VyY2UgbWFwcywgdGhleVxuICogaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKlxuICogICAtIHZlcnNpb246IFdoaWNoIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXAgc3BlYyB0aGlzIG1hcCBpcyBmb2xsb3dpbmcuXG4gKiAgIC0gZmlsZTogT3B0aW9uYWwuIFRoZSBnZW5lcmF0ZWQgZmlsZSB0aGlzIHNvdXJjZSBtYXAgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICogICAtIHNlY3Rpb25zOiBBIGxpc3Qgb2Ygc2VjdGlvbiBkZWZpbml0aW9ucy5cbiAqXG4gKiBFYWNoIHZhbHVlIHVuZGVyIHRoZSBcInNlY3Rpb25zXCIgZmllbGQgaGFzIHR3byBmaWVsZHM6XG4gKiAgIC0gb2Zmc2V0OiBUaGUgb2Zmc2V0IGludG8gdGhlIG9yaWdpbmFsIHNwZWNpZmllZCBhdCB3aGljaCB0aGlzIHNlY3Rpb25cbiAqICAgICAgIGJlZ2lucyB0byBhcHBseSwgZGVmaW5lZCBhcyBhbiBvYmplY3Qgd2l0aCBhIFwibGluZVwiIGFuZCBcImNvbHVtblwiXG4gKiAgICAgICBmaWVsZC5cbiAqICAgLSBtYXA6IEEgc291cmNlIG1hcCBkZWZpbml0aW9uLiBUaGlzIHNvdXJjZSBtYXAgY291bGQgYWxzbyBiZSBpbmRleGVkLFxuICogICAgICAgYnV0IGRvZXNuJ3QgaGF2ZSB0byBiZS5cbiAqXG4gKiBJbnN0ZWFkIG9mIHRoZSBcIm1hcFwiIGZpZWxkLCBpdCdzIGFsc28gcG9zc2libGUgdG8gaGF2ZSBhIFwidXJsXCIgZmllbGRcbiAqIHNwZWNpZnlpbmcgYSBVUkwgdG8gcmV0cmlldmUgYSBzb3VyY2UgbWFwIGZyb20sIGJ1dCB0aGF0J3MgY3VycmVudGx5XG4gKiB1bnN1cHBvcnRlZC5cbiAqXG4gKiBIZXJlJ3MgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF0sIGJ1dFxuICogbW9kaWZpZWQgdG8gb21pdCBhIHNlY3Rpb24gd2hpY2ggdXNlcyB0aGUgXCJ1cmxcIiBmaWVsZC5cbiAqXG4gKiAge1xuICogICAgdmVyc2lvbiA6IDMsXG4gKiAgICBmaWxlOiBcImFwcC5qc1wiLFxuICogICAgc2VjdGlvbnM6IFt7XG4gKiAgICAgIG9mZnNldDoge2xpbmU6MTAwLCBjb2x1bW46MTB9LFxuICogICAgICBtYXA6IHtcbiAqICAgICAgICB2ZXJzaW9uIDogMyxcbiAqICAgICAgICBmaWxlOiBcInNlY3Rpb24uanNcIixcbiAqICAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gKiAgICAgICAgbmFtZXM6IFtcInNyY1wiLCBcIm1hcHNcIiwgXCJhcmVcIiwgXCJmdW5cIl0sXG4gKiAgICAgICAgbWFwcGluZ3M6IFwiQUFBQSxFOztBQkNERTtcIlxuICogICAgICB9XG4gKiAgICB9XSxcbiAqICB9XG4gKlxuICogVGhlIHNlY29uZCBwYXJhbWV0ZXIsIGlmIGdpdmVuLCBpcyBhIHN0cmluZyB3aG9zZSB2YWx1ZSBpcyB0aGUgVVJMXG4gKiBhdCB3aGljaCB0aGUgc291cmNlIG1hcCB3YXMgZm91bmQuICBUaGlzIFVSTCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlXG4gKiBzb3VyY2VzIGFycmF5LlxuICpcbiAqIFswXTogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xVTFSR0FlaFF3UnlwVVRvdkYxS1JscGlPRnplMGItXzJnYzZmQUgwS1kway9lZGl0I2hlYWRpbmc9aC41MzVlczN4ZXByZ3RcbiAqL1xuZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7XG4gIH1cblxuICB2YXIgdmVyc2lvbiA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3ZlcnNpb24nKTtcbiAgdmFyIHNlY3Rpb25zID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc2VjdGlvbnMnKTtcblxuICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG5cbiAgdmFyIGxhc3RPZmZzZXQgPSB7XG4gICAgbGluZTogLTEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHRoaXMuX3NlY3Rpb25zID0gc2VjdGlvbnMubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgaWYgKHMudXJsKSB7XG4gICAgICAvLyBUaGUgdXJsIGZpZWxkIHdpbGwgcmVxdWlyZSBzdXBwb3J0IGZvciBhc3luY2hyb25pY2l0eS5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8xNlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdXBwb3J0IGZvciB1cmwgZmllbGQgaW4gc2VjdGlvbnMgbm90IGltcGxlbWVudGVkLicpO1xuICAgIH1cbiAgICB2YXIgb2Zmc2V0ID0gdXRpbC5nZXRBcmcocywgJ29mZnNldCcpO1xuICAgIHZhciBvZmZzZXRMaW5lID0gdXRpbC5nZXRBcmcob2Zmc2V0LCAnbGluZScpO1xuICAgIHZhciBvZmZzZXRDb2x1bW4gPSB1dGlsLmdldEFyZyhvZmZzZXQsICdjb2x1bW4nKTtcblxuICAgIGlmIChvZmZzZXRMaW5lIDwgbGFzdE9mZnNldC5saW5lIHx8XG4gICAgICAgIChvZmZzZXRMaW5lID09PSBsYXN0T2Zmc2V0LmxpbmUgJiYgb2Zmc2V0Q29sdW1uIDwgbGFzdE9mZnNldC5jb2x1bW4pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlY3Rpb24gb2Zmc2V0cyBtdXN0IGJlIG9yZGVyZWQgYW5kIG5vbi1vdmVybGFwcGluZy4nKTtcbiAgICB9XG4gICAgbGFzdE9mZnNldCA9IG9mZnNldDtcblxuICAgIHJldHVybiB7XG4gICAgICBnZW5lcmF0ZWRPZmZzZXQ6IHtcbiAgICAgICAgLy8gVGhlIG9mZnNldCBmaWVsZHMgYXJlIDAtYmFzZWQsIGJ1dCB3ZSB1c2UgMS1iYXNlZCBpbmRpY2VzIHdoZW5cbiAgICAgICAgLy8gZW5jb2RpbmcvZGVjb2RpbmcgZnJvbSBWTFEuXG4gICAgICAgIGdlbmVyYXRlZExpbmU6IG9mZnNldExpbmUgKyAxLFxuICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IG9mZnNldENvbHVtbiArIDFcbiAgICAgIH0sXG4gICAgICBjb25zdW1lcjogbmV3IFNvdXJjZU1hcENvbnN1bWVyKHV0aWwuZ2V0QXJnKHMsICdtYXAnKSwgYVNvdXJjZU1hcFVSTClcbiAgICB9XG4gIH0pO1xufVxuXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwcGluZyBzcGVjIHRoYXQgd2UgYXJlIGNvbnN1bWluZy5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdzb3VyY2VzJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc291cmNlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBzb3VyY2VzLnB1c2godGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlc1tqXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VzO1xuICB9XG59KTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UsIGxpbmUsIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdFxuICogd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBjb2x1bW5cbiAqICAgICBudW1iZXIgaXMgMC1iYXNlZC5cbiAqXG4gKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBzb3VyY2U6IFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSwgb3IgbnVsbC5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIG5hbWU6IFRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLCBvciBudWxsLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLm9yaWdpbmFsUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfb3JpZ2luYWxQb3NpdGlvbkZvcihhQXJncykge1xuICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICBnZW5lcmF0ZWRMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIGdlbmVyYXRlZENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nKVxuICAgIH07XG5cbiAgICAvLyBGaW5kIHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbiB3ZSdyZSB0cnlpbmcgdG8gbWFwXG4gICAgLy8gdG8gYW4gb3JpZ2luYWwgcG9zaXRpb24uXG4gICAgdmFyIHNlY3Rpb25JbmRleCA9IGJpbmFyeVNlYXJjaC5zZWFyY2gobmVlZGxlLCB0aGlzLl9zZWN0aW9ucyxcbiAgICAgIGZ1bmN0aW9uKG5lZWRsZSwgc2VjdGlvbikge1xuICAgICAgICB2YXIgY21wID0gbmVlZGxlLmdlbmVyYXRlZExpbmUgLSBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lO1xuICAgICAgICBpZiAoY21wKSB7XG4gICAgICAgICAgcmV0dXJuIGNtcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAobmVlZGxlLmdlbmVyYXRlZENvbHVtbiAtXG4gICAgICAgICAgICAgICAgc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgIH0pO1xuICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbc2VjdGlvbkluZGV4XTtcblxuICAgIGlmICghc2VjdGlvbikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc291cmNlOiBudWxsLFxuICAgICAgICBsaW5lOiBudWxsLFxuICAgICAgICBjb2x1bW46IG51bGwsXG4gICAgICAgIG5hbWU6IG51bGxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlY3Rpb24uY29uc3VtZXIub3JpZ2luYWxQb3NpdGlvbkZvcih7XG4gICAgICBsaW5lOiBuZWVkbGUuZ2VuZXJhdGVkTGluZSAtXG4gICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICBjb2x1bW46IG5lZWRsZS5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbmVlZGxlLmdlbmVyYXRlZExpbmVcbiAgICAgICAgID8gc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkQ29sdW1uIC0gMVxuICAgICAgICAgOiAwKSxcbiAgICAgIGJpYXM6IGFBcmdzLmJpYXNcbiAgICB9KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIHRoZSBzb3VyY2UgY29udGVudCBmb3IgZXZlcnkgc291cmNlIGluIHRoZSBzb3VyY2VcbiAqIG1hcCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX2hhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWN0aW9ucy5ldmVyeShmdW5jdGlvbiAocykge1xuICAgICAgcmV0dXJuIHMuY29uc3VtZXIuaGFzQ29udGVudHNPZkFsbFNvdXJjZXMoKTtcbiAgICB9KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29udGVudC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgdGhlIHVybCBvZiB0aGVcbiAqIG9yaWdpbmFsIHNvdXJjZSBmaWxlLiBSZXR1cm5zIG51bGwgaWYgbm8gb3JpZ2luYWwgc291cmNlIGNvbnRlbnQgaXNcbiAqIGF2YWlsYWJsZS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5zb3VyY2VDb250ZW50Rm9yID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX3NvdXJjZUNvbnRlbnRGb3IoYVNvdXJjZSwgbnVsbE9uTWlzc2luZykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbaV07XG5cbiAgICAgIHZhciBjb250ZW50ID0gc2VjdGlvbi5jb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIHRydWUpO1xuICAgICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChudWxsT25NaXNzaW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTb3VyY2UgKyAnXCIgaXMgbm90IGluIHRoZSBTb3VyY2VNYXAuJyk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsXG4gKiBsaW5lLCBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcbiAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuIFxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbaV07XG5cbiAgICAgIC8vIE9ubHkgY29uc2lkZXIgdGhpcyBzZWN0aW9uIGlmIHRoZSByZXF1ZXN0ZWQgc291cmNlIGlzIGluIHRoZSBsaXN0IG9mXG4gICAgICAvLyBzb3VyY2VzIG9mIHRoZSBjb25zdW1lci5cbiAgICAgIGlmIChzZWN0aW9uLmNvbnN1bWVyLl9maW5kU291cmNlSW5kZXgodXRpbC5nZXRBcmcoYUFyZ3MsICdzb3VyY2UnKSkgPT09IC0xKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIGdlbmVyYXRlZFBvc2l0aW9uID0gc2VjdGlvbi5jb25zdW1lci5nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncyk7XG4gICAgICBpZiAoZ2VuZXJhdGVkUG9zaXRpb24pIHtcbiAgICAgICAgdmFyIHJldCA9IHtcbiAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWRQb3NpdGlvbi5saW5lICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWRQb3NpdGlvbi5jb2x1bW4gK1xuICAgICAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IGdlbmVyYXRlZFBvc2l0aW9uLmxpbmVcbiAgICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgICA6IDApXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmU6IG51bGwsXG4gICAgICBjb2x1bW46IG51bGxcbiAgICB9O1xuICB9O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fcGFyc2VNYXBwaW5ncyA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW2ldO1xuICAgICAgdmFyIHNlY3Rpb25NYXBwaW5ncyA9IHNlY3Rpb24uY29uc3VtZXIuX2dlbmVyYXRlZE1hcHBpbmdzO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWN0aW9uTWFwcGluZ3MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIG1hcHBpbmcgPSBzZWN0aW9uTWFwcGluZ3Nbal07XG5cbiAgICAgICAgdmFyIHNvdXJjZSA9IHNlY3Rpb24uY29uc3VtZXIuX3NvdXJjZXMuYXQobWFwcGluZy5zb3VyY2UpO1xuICAgICAgICBzb3VyY2UgPSB1dGlsLmNvbXB1dGVTb3VyY2VVUkwoc2VjdGlvbi5jb25zdW1lci5zb3VyY2VSb290LCBzb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7XG4gICAgICAgIHRoaXMuX3NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICAgIHNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuaW5kZXhPZihzb3VyY2UpO1xuXG4gICAgICAgIHZhciBuYW1lID0gbnVsbDtcbiAgICAgICAgaWYgKG1hcHBpbmcubmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBzZWN0aW9uLmNvbnN1bWVyLl9uYW1lcy5hdChtYXBwaW5nLm5hbWUpO1xuICAgICAgICAgIHRoaXMuX25hbWVzLmFkZChuYW1lKTtcbiAgICAgICAgICBuYW1lID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBtYXBwaW5ncyBjb21pbmcgZnJvbSB0aGUgY29uc3VtZXIgZm9yIHRoZSBzZWN0aW9uIGhhdmVcbiAgICAgICAgLy8gZ2VuZXJhdGVkIHBvc2l0aW9ucyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24sIHNvIHdlXG4gICAgICAgIC8vIG5lZWQgdG8gb2Zmc2V0IHRoZW0gdG8gYmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb25jYXRlbmF0ZWRcbiAgICAgICAgLy8gZ2VuZXJhdGVkIGZpbGUuXG4gICAgICAgIHZhciBhZGp1c3RlZE1hcHBpbmcgPSB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgZ2VuZXJhdGVkTGluZTogbWFwcGluZy5nZW5lcmF0ZWRMaW5lICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbWFwcGluZy5nZW5lcmF0ZWRMaW5lXG4gICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgIDogMCksXG4gICAgICAgICAgb3JpZ2luYWxMaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICBvcmlnaW5hbENvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhZGp1c3RlZE1hcHBpbmcub3JpZ2luYWxMaW5lID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHF1aWNrU29ydCh0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MsIHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQpO1xuICAgIHF1aWNrU29ydCh0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG4gIH07XG5cbmV4cG9ydHMuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyID0gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvc291cmNlLW1hcC1jb25zdW1lci5qc1xuLy8gbW9kdWxlIGlkID0gN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbmV4cG9ydHMuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCA9IDI7XG5cbi8qKlxuICogUmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBzZWFyY2guXG4gKlxuICogQHBhcmFtIGFMb3cgSW5kaWNlcyBoZXJlIGFuZCBsb3dlciBkbyBub3QgY29udGFpbiB0aGUgbmVlZGxlLlxuICogQHBhcmFtIGFIaWdoIEluZGljZXMgaGVyZSBhbmQgaGlnaGVyIGRvIG5vdCBjb250YWluIHRoZSBuZWVkbGUuXG4gKiBAcGFyYW0gYU5lZWRsZSBUaGUgZWxlbWVudCBiZWluZyBzZWFyY2hlZCBmb3IuXG4gKiBAcGFyYW0gYUhheXN0YWNrIFRoZSBub24tZW1wdHkgYXJyYXkgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgRnVuY3Rpb24gd2hpY2ggdGFrZXMgdHdvIGVsZW1lbnRzIGFuZCByZXR1cm5zIC0xLCAwLCBvciAxLlxuICogQHBhcmFtIGFCaWFzIEVpdGhlciAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICogICAgICdiaW5hcnlTZWFyY2guTEVBU1RfVVBQRVJfQk9VTkQnLiBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlXG4gKiAgICAgY2xvc2VzdCBlbGVtZW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGdyZWF0ZXIgdGhhbiB0aGUgb25lIHdlIGFyZVxuICogICAgIHNlYXJjaGluZyBmb3IsIHJlc3BlY3RpdmVseSwgaWYgdGhlIGV4YWN0IGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLlxuICovXG5mdW5jdGlvbiByZWN1cnNpdmVTZWFyY2goYUxvdywgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gdGVybWluYXRlcyB3aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6XG4gIC8vXG4gIC8vICAgMS4gV2UgZmluZCB0aGUgZXhhY3QgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gIC8vXG4gIC8vICAgMi4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBidXQgd2UgY2FuIHJldHVybiB0aGUgaW5kZXggb2ZcbiAgLy8gICAgICB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQuXG4gIC8vXG4gIC8vICAgMy4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBhbmQgdGhlcmUgaXMgbm8gbmV4dC1jbG9zZXN0XG4gIC8vICAgICAgZWxlbWVudCB0aGFuIHRoZSBvbmUgd2UgYXJlIHNlYXJjaGluZyBmb3IsIHNvIHdlIHJldHVybiAtMS5cbiAgdmFyIG1pZCA9IE1hdGguZmxvb3IoKGFIaWdoIC0gYUxvdykgLyAyKSArIGFMb3c7XG4gIHZhciBjbXAgPSBhQ29tcGFyZShhTmVlZGxlLCBhSGF5c3RhY2tbbWlkXSwgdHJ1ZSk7XG4gIGlmIChjbXAgPT09IDApIHtcbiAgICAvLyBGb3VuZCB0aGUgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gICAgcmV0dXJuIG1pZDtcbiAgfVxuICBlbHNlIGlmIChjbXAgPiAwKSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBncmVhdGVyIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKGFIaWdoIC0gbWlkID4gMSkge1xuICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgaW4gdGhlIHVwcGVyIGhhbGYuXG4gICAgICByZXR1cm4gcmVjdXJzaXZlU2VhcmNoKG1pZCwgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgZXhhY3QgbmVlZGxlIGVsZW1lbnQgd2FzIG5vdCBmb3VuZCBpbiB0aGlzIGhheXN0YWNrLiBEZXRlcm1pbmUgaWZcbiAgICAvLyB3ZSBhcmUgaW4gdGVybWluYXRpb24gY2FzZSAoMykgb3IgKDIpIGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHRoaW5nLlxuICAgIGlmIChhQmlhcyA9PSBleHBvcnRzLkxFQVNUX1VQUEVSX0JPVU5EKSB7XG4gICAgICByZXR1cm4gYUhpZ2ggPCBhSGF5c3RhY2subGVuZ3RoID8gYUhpZ2ggOiAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBsZXNzIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKG1pZCAtIGFMb3cgPiAxKSB7XG4gICAgICAvLyBUaGUgZWxlbWVudCBpcyBpbiB0aGUgbG93ZXIgaGFsZi5cbiAgICAgIHJldHVybiByZWN1cnNpdmVTZWFyY2goYUxvdywgbWlkLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcyk7XG4gICAgfVxuXG4gICAgLy8gd2UgYXJlIGluIHRlcm1pbmF0aW9uIGNhc2UgKDMpIG9yICgyKSBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB0aGluZy5cbiAgICBpZiAoYUJpYXMgPT0gZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCkge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFMb3cgPCAwID8gLTEgOiBhTG93O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IHNlYXJjaCB3aGljaCB3aWxsIGFsd2F5cyB0cnkgYW5kIHJldHVyblxuICogdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IGVsZW1lbnQgaWYgdGhlcmUgaXMgbm8gZXhhY3QgaGl0LiBUaGlzIGlzIGJlY2F1c2VcbiAqIG1hcHBpbmdzIGJldHdlZW4gb3JpZ2luYWwgYW5kIGdlbmVyYXRlZCBsaW5lL2NvbCBwYWlycyBhcmUgc2luZ2xlIHBvaW50cyxcbiAqIGFuZCB0aGVyZSBpcyBhbiBpbXBsaWNpdCByZWdpb24gYmV0d2VlbiBlYWNoIG9mIHRoZW0sIHNvIGEgbWlzcyBqdXN0IG1lYW5zXG4gKiB0aGF0IHlvdSBhcmVuJ3Qgb24gdGhlIHZlcnkgc3RhcnQgb2YgYSByZWdpb24uXG4gKlxuICogQHBhcmFtIGFOZWVkbGUgVGhlIGVsZW1lbnQgeW91IGFyZSBsb29raW5nIGZvci5cbiAqIEBwYXJhbSBhSGF5c3RhY2sgVGhlIGFycmF5IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgQSBmdW5jdGlvbiB3aGljaCB0YWtlcyB0aGUgbmVlZGxlIGFuZCBhbiBlbGVtZW50IGluIHRoZVxuICogICAgIGFycmF5IGFuZCByZXR1cm5zIC0xLCAwLCBvciAxIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBuZWVkbGUgaXMgbGVzc1xuICogICAgIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIGVsZW1lbnQsIHJlc3BlY3RpdmVseS5cbiAqIEBwYXJhbSBhQmlhcyBFaXRoZXIgJ2JpbmFyeVNlYXJjaC5HUkVBVEVTVF9MT1dFUl9CT1VORCcgb3JcbiAqICAgICAnYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJy5cbiAqL1xuZXhwb3J0cy5zZWFyY2ggPSBmdW5jdGlvbiBzZWFyY2goYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSwgYUJpYXMpIHtcbiAgaWYgKGFIYXlzdGFjay5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICB2YXIgaW5kZXggPSByZWN1cnNpdmVTZWFyY2goLTEsIGFIYXlzdGFjay5sZW5ndGgsIGFOZWVkbGUsIGFIYXlzdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb21wYXJlLCBhQmlhcyB8fCBleHBvcnRzLkdSRUFURVNUX0xPV0VSX0JPVU5EKTtcbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vIFdlIGhhdmUgZm91bmQgZWl0aGVyIHRoZSBleGFjdCBlbGVtZW50LCBvciB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQgdGhhblxuICAvLyB0aGUgb25lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLiBIb3dldmVyLCB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSBzdWNoXG4gIC8vIGVsZW1lbnQuIE1ha2Ugc3VyZSB3ZSBhbHdheXMgcmV0dXJuIHRoZSBzbWFsbGVzdCBvZiB0aGVzZS5cbiAgd2hpbGUgKGluZGV4IC0gMSA+PSAwKSB7XG4gICAgaWYgKGFDb21wYXJlKGFIYXlzdGFja1tpbmRleF0sIGFIYXlzdGFja1tpbmRleCAtIDFdLCB0cnVlKSAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC0taW5kZXg7XG4gIH1cblxuICByZXR1cm4gaW5kZXg7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvYmluYXJ5LXNlYXJjaC5qc1xuLy8gbW9kdWxlIGlkID0gOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbi8vIEl0IHR1cm5zIG91dCB0aGF0IHNvbWUgKG1vc3Q/KSBKYXZhU2NyaXB0IGVuZ2luZXMgZG9uJ3Qgc2VsZi1ob3N0XG4vLyBgQXJyYXkucHJvdG90eXBlLnNvcnRgLiBUaGlzIG1ha2VzIHNlbnNlIGJlY2F1c2UgQysrIHdpbGwgbGlrZWx5IHJlbWFpblxuLy8gZmFzdGVyIHRoYW4gSlMgd2hlbiBkb2luZyByYXcgQ1BVLWludGVuc2l2ZSBzb3J0aW5nLiBIb3dldmVyLCB3aGVuIHVzaW5nIGFcbi8vIGN1c3RvbSBjb21wYXJhdG9yIGZ1bmN0aW9uLCBjYWxsaW5nIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIFZNJ3MgQysrIGFuZFxuLy8gSklUJ2QgSlMgaXMgcmF0aGVyIHNsb3cgKmFuZCogbG9zZXMgSklUIHR5cGUgaW5mb3JtYXRpb24sIHJlc3VsdGluZyBpblxuLy8gd29yc2UgZ2VuZXJhdGVkIGNvZGUgZm9yIHRoZSBjb21wYXJhdG9yIGZ1bmN0aW9uIHRoYW4gd291bGQgYmUgb3B0aW1hbC4gSW5cbi8vIGZhY3QsIHdoZW4gc29ydGluZyB3aXRoIGEgY29tcGFyYXRvciwgdGhlc2UgY29zdHMgb3V0d2VpZ2ggdGhlIGJlbmVmaXRzIG9mXG4vLyBzb3J0aW5nIGluIEMrKy4gQnkgdXNpbmcgb3VyIG93biBKUy1pbXBsZW1lbnRlZCBRdWljayBTb3J0IChiZWxvdyksIHdlIGdldFxuLy8gYSB+MzUwMG1zIG1lYW4gc3BlZWQtdXAgaW4gYGJlbmNoL2JlbmNoLmh0bWxgLlxuXG4vKipcbiAqIFN3YXAgdGhlIGVsZW1lbnRzIGluZGV4ZWQgYnkgYHhgIGFuZCBgeWAgaW4gdGhlIGFycmF5IGBhcnlgLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIFRoZSBhcnJheS5cbiAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gKiAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBpdGVtLlxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqICAgICAgICBUaGUgaW5kZXggb2YgdGhlIHNlY29uZCBpdGVtLlxuICovXG5mdW5jdGlvbiBzd2FwKGFyeSwgeCwgeSkge1xuICB2YXIgdGVtcCA9IGFyeVt4XTtcbiAgYXJ5W3hdID0gYXJ5W3ldO1xuICBhcnlbeV0gPSB0ZW1wO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciB3aXRoaW4gdGhlIHJhbmdlIGBsb3cgLi4gaGlnaGAgaW5jbHVzaXZlLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBsb3dcbiAqICAgICAgICBUaGUgbG93ZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGhpZ2hcbiAqICAgICAgICBUaGUgdXBwZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICovXG5mdW5jdGlvbiByYW5kb21JbnRJblJhbmdlKGxvdywgaGlnaCkge1xuICByZXR1cm4gTWF0aC5yb3VuZChsb3cgKyAoTWF0aC5yYW5kb20oKSAqIChoaWdoIC0gbG93KSkpO1xufVxuXG4vKipcbiAqIFRoZSBRdWljayBTb3J0IGFsZ29yaXRobS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnlcbiAqICAgICAgICBBbiBhcnJheSB0byBzb3J0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY29tcGFyYXRvclxuICogICAgICAgIEZ1bmN0aW9uIHRvIHVzZSB0byBjb21wYXJlIHR3byBpdGVtcy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBwXG4gKiAgICAgICAgU3RhcnQgaW5kZXggb2YgdGhlIGFycmF5XG4gKiBAcGFyYW0ge051bWJlcn0gclxuICogICAgICAgIEVuZCBpbmRleCBvZiB0aGUgYXJyYXlcbiAqL1xuZnVuY3Rpb24gZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCByKSB7XG4gIC8vIElmIG91ciBsb3dlciBib3VuZCBpcyBsZXNzIHRoYW4gb3VyIHVwcGVyIGJvdW5kLCB3ZSAoMSkgcGFydGl0aW9uIHRoZVxuICAvLyBhcnJheSBpbnRvIHR3byBwaWVjZXMgYW5kICgyKSByZWN1cnNlIG9uIGVhY2ggaGFsZi4gSWYgaXQgaXMgbm90LCB0aGlzIGlzXG4gIC8vIHRoZSBlbXB0eSBhcnJheSBhbmQgb3VyIGJhc2UgY2FzZS5cblxuICBpZiAocCA8IHIpIHtcbiAgICAvLyAoMSkgUGFydGl0aW9uaW5nLlxuICAgIC8vXG4gICAgLy8gVGhlIHBhcnRpdGlvbmluZyBjaG9vc2VzIGEgcGl2b3QgYmV0d2VlbiBgcGAgYW5kIGByYCBhbmQgbW92ZXMgYWxsXG4gICAgLy8gZWxlbWVudHMgdGhhdCBhcmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdCB0byB0aGUgYmVmb3JlIGl0LCBhbmRcbiAgICAvLyBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiBpdCBhZnRlciBpdC4gVGhlIGVmZmVjdCBpcyB0aGF0XG4gICAgLy8gb25jZSBwYXJ0aXRpb24gaXMgZG9uZSwgdGhlIHBpdm90IGlzIGluIHRoZSBleGFjdCBwbGFjZSBpdCB3aWxsIGJlIHdoZW5cbiAgICAvLyB0aGUgYXJyYXkgaXMgcHV0IGluIHNvcnRlZCBvcmRlciwgYW5kIGl0IHdpbGwgbm90IG5lZWQgdG8gYmUgbW92ZWRcbiAgICAvLyBhZ2Fpbi4gVGhpcyBydW5zIGluIE8obikgdGltZS5cblxuICAgIC8vIEFsd2F5cyBjaG9vc2UgYSByYW5kb20gcGl2b3Qgc28gdGhhdCBhbiBpbnB1dCBhcnJheSB3aGljaCBpcyByZXZlcnNlXG4gICAgLy8gc29ydGVkIGRvZXMgbm90IGNhdXNlIE8obl4yKSBydW5uaW5nIHRpbWUuXG4gICAgdmFyIHBpdm90SW5kZXggPSByYW5kb21JbnRJblJhbmdlKHAsIHIpO1xuICAgIHZhciBpID0gcCAtIDE7XG5cbiAgICBzd2FwKGFyeSwgcGl2b3RJbmRleCwgcik7XG4gICAgdmFyIHBpdm90ID0gYXJ5W3JdO1xuXG4gICAgLy8gSW1tZWRpYXRlbHkgYWZ0ZXIgYGpgIGlzIGluY3JlbWVudGVkIGluIHRoaXMgbG9vcCwgdGhlIGZvbGxvd2luZyBob2xkXG4gICAgLy8gdHJ1ZTpcbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbcCAuLiBpXWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdC5cbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbaSsxIC4uIGotMV1gIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcGl2b3QuXG4gICAgZm9yICh2YXIgaiA9IHA7IGogPCByOyBqKyspIHtcbiAgICAgIGlmIChjb21wYXJhdG9yKGFyeVtqXSwgcGl2b3QpIDw9IDApIHtcbiAgICAgICAgaSArPSAxO1xuICAgICAgICBzd2FwKGFyeSwgaSwgaik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dhcChhcnksIGkgKyAxLCBqKTtcbiAgICB2YXIgcSA9IGkgKyAxO1xuXG4gICAgLy8gKDIpIFJlY3Vyc2Ugb24gZWFjaCBoYWxmLlxuXG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCBxIC0gMSk7XG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBxICsgMSwgcik7XG4gIH1cbn1cblxuLyoqXG4gKiBTb3J0IHRoZSBnaXZlbiBhcnJheSBpbi1wbGFjZSB3aXRoIHRoZSBnaXZlbiBjb21wYXJhdG9yIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIEFuIGFycmF5IHRvIHNvcnQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjb21wYXJhdG9yXG4gKiAgICAgICAgRnVuY3Rpb24gdG8gdXNlIHRvIGNvbXBhcmUgdHdvIGl0ZW1zLlxuICovXG5leHBvcnRzLnF1aWNrU29ydCA9IGZ1bmN0aW9uIChhcnksIGNvbXBhcmF0b3IpIHtcbiAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCAwLCBhcnkubGVuZ3RoIC0gMSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvcXVpY2stc29ydC5qc1xuLy8gbW9kdWxlIGlkID0gOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciBTb3VyY2VNYXBHZW5lcmF0b3IgPSByZXF1aXJlKCcuL3NvdXJjZS1tYXAtZ2VuZXJhdG9yJykuU291cmNlTWFwR2VuZXJhdG9yO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuLy8gTWF0Y2hlcyBhIFdpbmRvd3Mtc3R5bGUgYFxcclxcbmAgbmV3bGluZSBvciBhIGBcXG5gIG5ld2xpbmUgdXNlZCBieSBhbGwgb3RoZXJcbi8vIG9wZXJhdGluZyBzeXN0ZW1zIHRoZXNlIGRheXMgKGNhcHR1cmluZyB0aGUgcmVzdWx0KS5cbnZhciBSRUdFWF9ORVdMSU5FID0gLyhcXHI/XFxuKS87XG5cbi8vIE5ld2xpbmUgY2hhcmFjdGVyIGNvZGUgZm9yIGNoYXJDb2RlQXQoKSBjb21wYXJpc29uc1xudmFyIE5FV0xJTkVfQ09ERSA9IDEwO1xuXG4vLyBQcml2YXRlIHN5bWJvbCBmb3IgaWRlbnRpZnlpbmcgYFNvdXJjZU5vZGVgcyB3aGVuIG11bHRpcGxlIHZlcnNpb25zIG9mXG4vLyB0aGUgc291cmNlLW1hcCBsaWJyYXJ5IGFyZSBsb2FkZWQuIFRoaXMgTVVTVCBOT1QgQ0hBTkdFIGFjcm9zc1xuLy8gdmVyc2lvbnMhXG52YXIgaXNTb3VyY2VOb2RlID0gXCIkJCRpc1NvdXJjZU5vZGUkJCRcIjtcblxuLyoqXG4gKiBTb3VyY2VOb2RlcyBwcm92aWRlIGEgd2F5IHRvIGFic3RyYWN0IG92ZXIgaW50ZXJwb2xhdGluZy9jb25jYXRlbmF0aW5nXG4gKiBzbmlwcGV0cyBvZiBnZW5lcmF0ZWQgSmF2YVNjcmlwdCBzb3VyY2UgY29kZSB3aGlsZSBtYWludGFpbmluZyB0aGUgbGluZSBhbmRcbiAqIGNvbHVtbiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwYXJhbSBhTGluZSBUaGUgb3JpZ2luYWwgbGluZSBudW1iZXIuXG4gKiBAcGFyYW0gYUNvbHVtbiBUaGUgb3JpZ2luYWwgY29sdW1uIG51bWJlci5cbiAqIEBwYXJhbSBhU291cmNlIFRoZSBvcmlnaW5hbCBzb3VyY2UncyBmaWxlbmFtZS5cbiAqIEBwYXJhbSBhQ2h1bmtzIE9wdGlvbmFsLiBBbiBhcnJheSBvZiBzdHJpbmdzIHdoaWNoIGFyZSBzbmlwcGV0cyBvZlxuICogICAgICAgIGdlbmVyYXRlZCBKUywgb3Igb3RoZXIgU291cmNlTm9kZXMuXG4gKiBAcGFyYW0gYU5hbWUgVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU5vZGUoYUxpbmUsIGFDb2x1bW4sIGFTb3VyY2UsIGFDaHVua3MsIGFOYW1lKSB7XG4gIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgdGhpcy5zb3VyY2VDb250ZW50cyA9IHt9O1xuICB0aGlzLmxpbmUgPSBhTGluZSA9PSBudWxsID8gbnVsbCA6IGFMaW5lO1xuICB0aGlzLmNvbHVtbiA9IGFDb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBhQ29sdW1uO1xuICB0aGlzLnNvdXJjZSA9IGFTb3VyY2UgPT0gbnVsbCA/IG51bGwgOiBhU291cmNlO1xuICB0aGlzLm5hbWUgPSBhTmFtZSA9PSBudWxsID8gbnVsbCA6IGFOYW1lO1xuICB0aGlzW2lzU291cmNlTm9kZV0gPSB0cnVlO1xuICBpZiAoYUNodW5rcyAhPSBudWxsKSB0aGlzLmFkZChhQ2h1bmtzKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgU291cmNlTm9kZSBmcm9tIGdlbmVyYXRlZCBjb2RlIGFuZCBhIFNvdXJjZU1hcENvbnN1bWVyLlxuICpcbiAqIEBwYXJhbSBhR2VuZXJhdGVkQ29kZSBUaGUgZ2VuZXJhdGVkIGNvZGVcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIFNvdXJjZU1hcCBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlXG4gKiBAcGFyYW0gYVJlbGF0aXZlUGF0aCBPcHRpb25hbC4gVGhlIHBhdGggdGhhdCByZWxhdGl2ZSBzb3VyY2VzIGluIHRoZVxuICogICAgICAgIFNvdXJjZU1hcENvbnN1bWVyIHNob3VsZCBiZSByZWxhdGl2ZSB0by5cbiAqL1xuU291cmNlTm9kZS5mcm9tU3RyaW5nV2l0aFNvdXJjZU1hcCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU5vZGVfZnJvbVN0cmluZ1dpdGhTb3VyY2VNYXAoYUdlbmVyYXRlZENvZGUsIGFTb3VyY2VNYXBDb25zdW1lciwgYVJlbGF0aXZlUGF0aCkge1xuICAgIC8vIFRoZSBTb3VyY2VOb2RlIHdlIHdhbnQgdG8gZmlsbCB3aXRoIHRoZSBnZW5lcmF0ZWQgY29kZVxuICAgIC8vIGFuZCB0aGUgU291cmNlTWFwXG4gICAgdmFyIG5vZGUgPSBuZXcgU291cmNlTm9kZSgpO1xuXG4gICAgLy8gQWxsIGV2ZW4gaW5kaWNlcyBvZiB0aGlzIGFycmF5IGFyZSBvbmUgbGluZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4gICAgLy8gd2hpbGUgYWxsIG9kZCBpbmRpY2VzIGFyZSB0aGUgbmV3bGluZXMgYmV0d2VlbiB0d28gYWRqYWNlbnQgbGluZXNcbiAgICAvLyAoc2luY2UgYFJFR0VYX05FV0xJTkVgIGNhcHR1cmVzIGl0cyBtYXRjaCkuXG4gICAgLy8gUHJvY2Vzc2VkIGZyYWdtZW50cyBhcmUgYWNjZXNzZWQgYnkgY2FsbGluZyBgc2hpZnROZXh0TGluZWAuXG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzID0gYUdlbmVyYXRlZENvZGUuc3BsaXQoUkVHRVhfTkVXTElORSk7XG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzSW5kZXggPSAwO1xuICAgIHZhciBzaGlmdE5leHRMaW5lID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbGluZUNvbnRlbnRzID0gZ2V0TmV4dExpbmUoKTtcbiAgICAgIC8vIFRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlIG1pZ2h0IG5vdCBoYXZlIGEgbmV3bGluZS5cbiAgICAgIHZhciBuZXdMaW5lID0gZ2V0TmV4dExpbmUoKSB8fCBcIlwiO1xuICAgICAgcmV0dXJuIGxpbmVDb250ZW50cyArIG5ld0xpbmU7XG5cbiAgICAgIGZ1bmN0aW9uIGdldE5leHRMaW5lKCkge1xuICAgICAgICByZXR1cm4gcmVtYWluaW5nTGluZXNJbmRleCA8IHJlbWFpbmluZ0xpbmVzLmxlbmd0aCA/XG4gICAgICAgICAgICByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4KytdIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBwb3NpdGlvbiBvZiBcInJlbWFpbmluZ0xpbmVzXCJcbiAgICB2YXIgbGFzdEdlbmVyYXRlZExpbmUgPSAxLCBsYXN0R2VuZXJhdGVkQ29sdW1uID0gMDtcblxuICAgIC8vIFRoZSBnZW5lcmF0ZSBTb3VyY2VOb2RlcyB3ZSBuZWVkIGEgY29kZSByYW5nZS5cbiAgICAvLyBUbyBleHRyYWN0IGl0IGN1cnJlbnQgYW5kIGxhc3QgbWFwcGluZyBpcyB1c2VkLlxuICAgIC8vIEhlcmUgd2Ugc3RvcmUgdGhlIGxhc3QgbWFwcGluZy5cbiAgICB2YXIgbGFzdE1hcHBpbmcgPSBudWxsO1xuXG4gICAgYVNvdXJjZU1hcENvbnN1bWVyLmVhY2hNYXBwaW5nKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcgIT09IG51bGwpIHtcbiAgICAgICAgLy8gV2UgYWRkIHRoZSBjb2RlIGZyb20gXCJsYXN0TWFwcGluZ1wiIHRvIFwibWFwcGluZ1wiOlxuICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGVyZSBpcyBhIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgIGlmIChsYXN0R2VuZXJhdGVkTGluZSA8IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIC8vIEFzc29jaWF0ZSBmaXJzdCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBzaGlmdE5leHRMaW5lKCkpO1xuICAgICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgICAgLy8gVGhlIHJlbWFpbmluZyBjb2RlIGlzIGFkZGVkIHdpdGhvdXQgbWFwcGluZ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSBjb2RlIGJldHdlZW4gXCJsYXN0R2VuZXJhdGVkQ29sdW1uXCIgYW5kXG4gICAgICAgICAgLy8gXCJtYXBwaW5nLmdlbmVyYXRlZENvbHVtblwiIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgdmFyIG5leHRMaW5lID0gcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gfHwgJyc7XG4gICAgICAgICAgdmFyIGNvZGUgPSBuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICAgIHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdID0gbmV4dExpbmUuc3Vic3RyKG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBjb2RlKTtcbiAgICAgICAgICAvLyBObyBtb3JlIHJlbWFpbmluZyBjb2RlLCBjb250aW51ZVxuICAgICAgICAgIGxhc3RNYXBwaW5nID0gbWFwcGluZztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFdlIGFkZCB0aGUgZ2VuZXJhdGVkIGNvZGUgdW50aWwgdGhlIGZpcnN0IG1hcHBpbmdcbiAgICAgIC8vIHRvIHRoZSBTb3VyY2VOb2RlIHdpdGhvdXQgYW55IG1hcHBpbmcuXG4gICAgICAvLyBFYWNoIGxpbmUgaXMgYWRkZWQgYXMgc2VwYXJhdGUgc3RyaW5nLlxuICAgICAgd2hpbGUgKGxhc3RHZW5lcmF0ZWRMaW5lIDwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIG5vZGUuYWRkKHNoaWZ0TmV4dExpbmUoKSk7XG4gICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICB9XG4gICAgICBpZiAobGFzdEdlbmVyYXRlZENvbHVtbiA8IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKSB7XG4gICAgICAgIHZhciBuZXh0TGluZSA9IHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdIHx8ICcnO1xuICAgICAgICBub2RlLmFkZChuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pKTtcbiAgICAgICAgcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gPSBuZXh0TGluZS5zdWJzdHIobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICB9XG4gICAgICBsYXN0TWFwcGluZyA9IG1hcHBpbmc7XG4gICAgfSwgdGhpcyk7XG4gICAgLy8gV2UgaGF2ZSBwcm9jZXNzZWQgYWxsIG1hcHBpbmdzLlxuICAgIGlmIChyZW1haW5pbmdMaW5lc0luZGV4IDwgcmVtYWluaW5nTGluZXMubGVuZ3RoKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcpIHtcbiAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSByZW1haW5pbmcgY29kZSBpbiB0aGUgY3VycmVudCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgIGFkZE1hcHBpbmdXaXRoQ29kZShsYXN0TWFwcGluZywgc2hpZnROZXh0TGluZSgpKTtcbiAgICAgIH1cbiAgICAgIC8vIGFuZCBhZGQgdGhlIHJlbWFpbmluZyBsaW5lcyB3aXRob3V0IGFueSBtYXBwaW5nXG4gICAgICBub2RlLmFkZChyZW1haW5pbmdMaW5lcy5zcGxpY2UocmVtYWluaW5nTGluZXNJbmRleCkuam9pbihcIlwiKSk7XG4gICAgfVxuXG4gICAgLy8gQ29weSBzb3VyY2VzQ29udGVudCBpbnRvIFNvdXJjZU5vZGVcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVJlbGF0aXZlUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbm9kZTtcblxuICAgIGZ1bmN0aW9uIGFkZE1hcHBpbmdXaXRoQ29kZShtYXBwaW5nLCBjb2RlKSB7XG4gICAgICBpZiAobWFwcGluZyA9PT0gbnVsbCB8fCBtYXBwaW5nLnNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vZGUuYWRkKGNvZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFSZWxhdGl2ZVBhdGhcbiAgICAgICAgICA/IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICA6IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBub2RlLmFkZChuZXcgU291cmNlTm9kZShtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLm5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoaXMgc291cmNlIG5vZGUuXG4gKlxuICogQHBhcmFtIGFDaHVuayBBIHN0cmluZyBzbmlwcGV0IG9mIGdlbmVyYXRlZCBKUyBjb2RlLCBhbm90aGVyIGluc3RhbmNlIG9mXG4gKiAgICAgICAgU291cmNlTm9kZSwgb3IgYW4gYXJyYXkgd2hlcmUgZWFjaCBtZW1iZXIgaXMgb25lIG9mIHRob3NlIHRoaW5ncy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gU291cmNlTm9kZV9hZGQoYUNodW5rKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFDaHVuaykpIHtcbiAgICBhQ2h1bmsuZm9yRWFjaChmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgIHRoaXMuYWRkKGNodW5rKTtcbiAgICB9LCB0aGlzKTtcbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKGFDaHVuaykge1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGFDaHVuayk7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBcIkV4cGVjdGVkIGEgU291cmNlTm9kZSwgc3RyaW5nLCBvciBhbiBhcnJheSBvZiBTb3VyY2VOb2RlcyBhbmQgc3RyaW5ncy4gR290IFwiICsgYUNodW5rXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBzb3VyY2Ugbm9kZS5cbiAqXG4gKiBAcGFyYW0gYUNodW5rIEEgc3RyaW5nIHNuaXBwZXQgb2YgZ2VuZXJhdGVkIEpTIGNvZGUsIGFub3RoZXIgaW5zdGFuY2Ugb2ZcbiAqICAgICAgICBTb3VyY2VOb2RlLCBvciBhbiBhcnJheSB3aGVyZSBlYWNoIG1lbWJlciBpcyBvbmUgb2YgdGhvc2UgdGhpbmdzLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5wcmVwZW5kID0gZnVuY3Rpb24gU291cmNlTm9kZV9wcmVwZW5kKGFDaHVuaykge1xuICBpZiAoQXJyYXkuaXNBcnJheShhQ2h1bmspKSB7XG4gICAgZm9yICh2YXIgaSA9IGFDaHVuay5sZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHRoaXMucHJlcGVuZChhQ2h1bmtbaV0pO1xuICAgIH1cbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgdGhpcy5jaGlsZHJlbi51bnNoaWZ0KGFDaHVuayk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIFwiRXhwZWN0ZWQgYSBTb3VyY2VOb2RlLCBzdHJpbmcsIG9yIGFuIGFycmF5IG9mIFNvdXJjZU5vZGVzIGFuZCBzdHJpbmdzLiBHb3QgXCIgKyBhQ2h1bmtcbiAgICApO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBXYWxrIG92ZXIgdGhlIHRyZWUgb2YgSlMgc25pcHBldHMgaW4gdGhpcyBub2RlIGFuZCBpdHMgY2hpbGRyZW4uIFRoZVxuICogd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBzbmlwcGV0IG9mIEpTIGFuZCBpcyBwYXNzZWQgdGhhdFxuICogc25pcHBldCBhbmQgdGhlIGl0cyBvcmlnaW5hbCBhc3NvY2lhdGVkIHNvdXJjZSdzIGxpbmUvY29sdW1uIGxvY2F0aW9uLlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2FsayA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfd2FsayhhRm4pIHtcbiAgdmFyIGNodW5rO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGNodW5rID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICBpZiAoY2h1bmtbaXNTb3VyY2VOb2RlXSkge1xuICAgICAgY2h1bmsud2FsayhhRm4pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChjaHVuayAhPT0gJycpIHtcbiAgICAgICAgYUZuKGNodW5rLCB7IHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmUsXG4gICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBMaWtlIGBTdHJpbmcucHJvdG90eXBlLmpvaW5gIGV4Y2VwdCBmb3IgU291cmNlTm9kZXMuIEluc2VydHMgYGFTdHJgIGJldHdlZW5cbiAqIGVhY2ggb2YgYHRoaXMuY2hpbGRyZW5gLlxuICpcbiAqIEBwYXJhbSBhU2VwIFRoZSBzZXBhcmF0b3IuXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiBTb3VyY2VOb2RlX2pvaW4oYVNlcCkge1xuICB2YXIgbmV3Q2hpbGRyZW47XG4gIHZhciBpO1xuICB2YXIgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7XG4gIGlmIChsZW4gPiAwKSB7XG4gICAgbmV3Q2hpbGRyZW4gPSBbXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuLTE7IGkrKykge1xuICAgICAgbmV3Q2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2ldKTtcbiAgICAgIG5ld0NoaWxkcmVuLnB1c2goYVNlcCk7XG4gICAgfVxuICAgIG5ld0NoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlbltpXSk7XG4gICAgdGhpcy5jaGlsZHJlbiA9IG5ld0NoaWxkcmVuO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDYWxsIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSBvbiB0aGUgdmVyeSByaWdodC1tb3N0IHNvdXJjZSBzbmlwcGV0LiBVc2VmdWxcbiAqIGZvciB0cmltbWluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIGVuZCBvZiBhIHNvdXJjZSBub2RlLCBldGMuXG4gKlxuICogQHBhcmFtIGFQYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIHJlcGxhY2UuXG4gKiBAcGFyYW0gYVJlcGxhY2VtZW50IFRoZSB0aGluZyB0byByZXBsYWNlIHRoZSBwYXR0ZXJuIHdpdGguXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLnJlcGxhY2VSaWdodCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfcmVwbGFjZVJpZ2h0KGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpIHtcbiAgdmFyIGxhc3RDaGlsZCA9IHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgaWYgKGxhc3RDaGlsZFtpc1NvdXJjZU5vZGVdKSB7XG4gICAgbGFzdENoaWxkLnJlcGxhY2VSaWdodChhUGF0dGVybiwgYVJlcGxhY2VtZW50KTtcbiAgfVxuICBlbHNlIGlmICh0eXBlb2YgbGFzdENoaWxkID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXSA9IGxhc3RDaGlsZC5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpO1xuICB9XG4gIGVsc2Uge1xuICAgIHRoaXMuY2hpbGRyZW4ucHVzaCgnJy5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBzb3VyY2UgY29udGVudCBmb3IgYSBzb3VyY2UgZmlsZS4gVGhpcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3JcbiAqIGluIHRoZSBzb3VyY2VzQ29udGVudCBmaWVsZC5cbiAqXG4gKiBAcGFyYW0gYVNvdXJjZUZpbGUgVGhlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZVxuICogQHBhcmFtIGFTb3VyY2VDb250ZW50IFRoZSBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZVxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5zZXRTb3VyY2VDb250ZW50ID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgIHRoaXMuc291cmNlQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhhU291cmNlRmlsZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gIH07XG5cbi8qKlxuICogV2FsayBvdmVyIHRoZSB0cmVlIG9mIFNvdXJjZU5vZGVzLiBUaGUgd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2hcbiAqIHNvdXJjZSBmaWxlIGNvbnRlbnQgYW5kIGlzIHBhc3NlZCB0aGUgZmlsZW5hbWUgYW5kIHNvdXJjZSBjb250ZW50LlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2Fsa1NvdXJjZUNvbnRlbnRzID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV93YWxrU291cmNlQ29udGVudHMoYUZuKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldW2lzU291cmNlTm9kZV0pIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbltpXS53YWxrU291cmNlQ29udGVudHMoYUZuKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc291cmNlcyA9IE9iamVjdC5rZXlzKHRoaXMuc291cmNlQ29udGVudHMpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzb3VyY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhRm4odXRpbC5mcm9tU2V0U3RyaW5nKHNvdXJjZXNbaV0pLCB0aGlzLnNvdXJjZUNvbnRlbnRzW3NvdXJjZXNbaV1dKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzb3VyY2Ugbm9kZS4gV2Fsa3Mgb3ZlciB0aGUgdHJlZVxuICogYW5kIGNvbmNhdGVuYXRlcyBhbGwgdGhlIHZhcmlvdXMgc25pcHBldHMgdG9nZXRoZXIgdG8gb25lIHN0cmluZy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3RvU3RyaW5nKCkge1xuICB2YXIgc3RyID0gXCJcIjtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaykge1xuICAgIHN0ciArPSBjaHVuaztcbiAgfSk7XG4gIHJldHVybiBzdHI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNvdXJjZSBub2RlIGFsb25nIHdpdGggYSBzb3VyY2VcbiAqIG1hcC5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmdXaXRoU291cmNlTWFwID0gZnVuY3Rpb24gU291cmNlTm9kZV90b1N0cmluZ1dpdGhTb3VyY2VNYXAoYUFyZ3MpIHtcbiAgdmFyIGdlbmVyYXRlZCA9IHtcbiAgICBjb2RlOiBcIlwiLFxuICAgIGxpbmU6IDEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHZhciBtYXAgPSBuZXcgU291cmNlTWFwR2VuZXJhdG9yKGFBcmdzKTtcbiAgdmFyIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgdmFyIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxMaW5lID0gbnVsbDtcbiAgdmFyIGxhc3RPcmlnaW5hbENvbHVtbiA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxOYW1lID0gbnVsbDtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaywgb3JpZ2luYWwpIHtcbiAgICBnZW5lcmF0ZWQuY29kZSArPSBjaHVuaztcbiAgICBpZiAob3JpZ2luYWwuc291cmNlICE9PSBudWxsXG4gICAgICAgICYmIG9yaWdpbmFsLmxpbmUgIT09IG51bGxcbiAgICAgICAgJiYgb3JpZ2luYWwuY29sdW1uICE9PSBudWxsKSB7XG4gICAgICBpZihsYXN0T3JpZ2luYWxTb3VyY2UgIT09IG9yaWdpbmFsLnNvdXJjZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsTGluZSAhPT0gb3JpZ2luYWwubGluZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsQ29sdW1uICE9PSBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgIHx8IGxhc3RPcmlnaW5hbE5hbWUgIT09IG9yaWdpbmFsLm5hbWUpIHtcbiAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgIHNvdXJjZTogb3JpZ2luYWwuc291cmNlLFxuICAgICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgY29sdW1uOiBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgbGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hbWU6IG9yaWdpbmFsLm5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICBsYXN0T3JpZ2luYWxMaW5lID0gb3JpZ2luYWwubGluZTtcbiAgICAgIGxhc3RPcmlnaW5hbENvbHVtbiA9IG9yaWdpbmFsLmNvbHVtbjtcbiAgICAgIGxhc3RPcmlnaW5hbE5hbWUgPSBvcmlnaW5hbC5uYW1lO1xuICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICBtYXAuYWRkTWFwcGluZyh7XG4gICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkLmNvbHVtblxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gICAgICBzb3VyY2VNYXBwaW5nQWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbmd0aCA9IGNodW5rLmxlbmd0aDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykge1xuICAgICAgaWYgKGNodW5rLmNoYXJDb2RlQXQoaWR4KSA9PT0gTkVXTElORV9DT0RFKSB7XG4gICAgICAgIGdlbmVyYXRlZC5saW5lKys7XG4gICAgICAgIGdlbmVyYXRlZC5jb2x1bW4gPSAwO1xuICAgICAgICAvLyBNYXBwaW5ncyBlbmQgYXQgZW9sXG4gICAgICAgIGlmIChpZHggKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBudWxsO1xuICAgICAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgICAgc291cmNlOiBvcmlnaW5hbC5zb3VyY2UsXG4gICAgICAgICAgICBvcmlnaW5hbDoge1xuICAgICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgICBjb2x1bW46IG9yaWdpbmFsLmNvbHVtblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWQuY29sdW1uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmFtZTogb3JpZ2luYWwubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZW5lcmF0ZWQuY29sdW1uKys7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdGhpcy53YWxrU291cmNlQ29udGVudHMoZnVuY3Rpb24gKHNvdXJjZUZpbGUsIHNvdXJjZUNvbnRlbnQpIHtcbiAgICBtYXAuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBzb3VyY2VDb250ZW50KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgY29kZTogZ2VuZXJhdGVkLmNvZGUsIG1hcDogbWFwIH07XG59O1xuXG5leHBvcnRzLlNvdXJjZU5vZGUgPSBTb3VyY2VOb2RlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvc291cmNlLW5vZGUuanNcbi8vIG1vZHVsZSBpZCA9IDEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0=/*! *****************************************************************************
  Copyright (c) Microsoft Corporation. All rights reserved.
  Licensed under the Apache License, Version 2.0 (the "License"); you may not use
  this file except in compliance with the License. You may obtain a copy of the
  License at http://www.apache.org/licenses/LICENSE-2.0
  
  THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
  WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
  MERCHANTABLITY OR NON-INFRINGEMENT.
  
  See the Apache Version 2.0 License for specific language governing permissions
  and limitations under the License.
  ***************************************************************************** */
  
  declare namespace ts {
      const versionMajorMinor = "3.9";
      /** The version of the TypeScript compiler release */
      const version: string;
      /**
       * Type of objects whose values are all of the same type.
       * The `in` and `for-in` operators can *not* be safely used,
       * since `Object.prototype` may be modified by outside code.
       */
      interface MapLike<T> {
          [index: string]: T;
      }
      interface SortedReadonlyArray<T> extends ReadonlyArray<T> {
          " __sortedArrayBrand": any;
      }
      interface SortedArray<T> extends Array<T> {
          " __sortedArrayBrand": any;
      }
      /** ES6 Map interface, only read methods included. */
      interface ReadonlyMap<T> {
          get(key: string): T | undefined;
          has(key: string): boolean;
          forEach(action: (value: T, key: string) => void): void;
          readonly size: number;
          keys(): Iterator<string>;
          values(): Iterator<T>;
          entries(): Iterator<[string, T]>;
      }
      /** ES6 Map interface. */
      interface Map<T> extends ReadonlyMap<T> {
          set(key: string, value: T): this;
          delete(key: string): boolean;
          clear(): void;
      }
      /** ES6 Iterator type. */
      interface Iterator<T> {
          next(): {
              value: T;
              done?: false;
          } | {
              value: never;
              done: true;
          };
      }
      /** Array that is only intended to be pushed to, never read. */
      interface Push<T> {
          push(...values: T[]): void;
      }
  }
  declare namespace ts {
      export type Path = string & {
          __pathBrand: any;
      };
      export interface TextRange {
          pos: number;
          end: number;
      }
      export type JSDocSyntaxKind = SyntaxKind.EndOfFileToken | SyntaxKind.WhitespaceTrivia | SyntaxKind.AtToken | SyntaxKind.NewLineTrivia | SyntaxKind.AsteriskToken | SyntaxKind.OpenBraceToken | SyntaxKind.CloseBraceToken | SyntaxKind.LessThanToken | SyntaxKind.GreaterThanToken | SyntaxKind.OpenBracketToken | SyntaxKind.CloseBracketToken | SyntaxKind.EqualsToken | SyntaxKind.CommaToken | SyntaxKind.DotToken | SyntaxKind.Identifier | SyntaxKind.BacktickToken | SyntaxKind.Unknown | KeywordSyntaxKind;
      export type KeywordSyntaxKind = SyntaxKind.AbstractKeyword | SyntaxKind.AnyKeyword | SyntaxKind.AsKeyword | SyntaxKind.AssertsKeyword | SyntaxKind.BigIntKeyword | SyntaxKind.BooleanKeyword | SyntaxKind.BreakKeyword | SyntaxKind.CaseKeyword | SyntaxKind.CatchKeyword | SyntaxKind.ClassKeyword | SyntaxKind.ContinueKeyword | SyntaxKind.ConstKeyword | SyntaxKind.ConstructorKeyword | SyntaxKind.DebuggerKeyword | SyntaxKind.DeclareKeyword | SyntaxKind.DefaultKeyword | SyntaxKind.DeleteKeyword | SyntaxKind.DoKeyword | SyntaxKind.ElseKeyword | SyntaxKind.EnumKeyword | SyntaxKind.ExportKeyword | SyntaxKind.ExtendsKeyword | SyntaxKind.FalseKeyword | SyntaxKind.FinallyKeyword | SyntaxKind.ForKeyword | SyntaxKind.FromKeyword | SyntaxKind.FunctionKeyword | SyntaxKind.GetKeyword | SyntaxKind.IfKeyword | SyntaxKind.ImplementsKeyword | SyntaxKind.ImportKeyword | SyntaxKind.InKeyword | SyntaxKind.InferKeyword | SyntaxKind.InstanceOfKeyword | SyntaxKind.InterfaceKeyword | SyntaxKind.IsKeyword | SyntaxKind.KeyOfKeyword | SyntaxKind.LetKeyword | SyntaxKind.ModuleKeyword | SyntaxKind.NamespaceKeyword | SyntaxKind.NeverKeyword | SyntaxKind.NewKeyword | SyntaxKind.NullKeyword | SyntaxKind.NumberKeyword | SyntaxKind.ObjectKeyword | SyntaxKind.PackageKeyword | SyntaxKind.PrivateKeyword | SyntaxKind.ProtectedKeyword | SyntaxKind.PublicKeyword | SyntaxKind.ReadonlyKeyword | SyntaxKind.RequireKeyword | SyntaxKind.GlobalKeyword | SyntaxKind.ReturnKeyword | SyntaxKind.SetKeyword | SyntaxKind.StaticKeyword | SyntaxKind.StringKeyword | SyntaxKind.SuperKeyword | SyntaxKind.SwitchKeyword | SyntaxKind.SymbolKeyword | SyntaxKind.ThisKeyword | SyntaxKind.ThrowKeyword | SyntaxKind.TrueKeyword | SyntaxKind.TryKeyword | SyntaxKind.TypeKeyword | SyntaxKind.TypeOfKeyword | SyntaxKind.UndefinedKeyword | SyntaxKind.UniqueKeyword | SyntaxKind.UnknownKeyword | SyntaxKind.VarKeyword | SyntaxKind.VoidKeyword | SyntaxKind.WhileKeyword | SyntaxKind.WithKeyword | SyntaxKind.YieldKeyword | SyntaxKind.AsyncKeyword | SyntaxKind.AwaitKeyword | SyntaxKind.OfKeyword;
      export type JsxTokenSyntaxKind = SyntaxKind.LessThanSlashToken | SyntaxKind.EndOfFileToken | SyntaxKind.ConflictMarkerTrivia | SyntaxKind.JsxText | SyntaxKind.JsxTextAllWhiteSpaces | SyntaxKind.OpenBraceToken | SyntaxKind.LessThanToken;
      export enum SyntaxKind {
          Unknown = 0,
          EndOfFileToken = 1,
          SingleLineCommentTrivia = 2,
          MultiLineCommentTrivia = 3,
          NewLineTrivia = 4,
          WhitespaceTrivia = 5,
          ShebangTrivia = 6,
          ConflictMarkerTrivia = 7,
          NumericLiteral = 8,
          BigIntLiteral = 9,
          StringLiteral = 10,
          JsxText = 11,
          JsxTextAllWhiteSpaces = 12,
          RegularExpressionLiteral = 13,
          NoSubstitutionTemplateLiteral = 14,
          TemplateHead = 15,
          TemplateMiddle = 16,
          TemplateTail = 17,
          OpenBraceToken = 18,
          CloseBraceToken = 19,
          OpenParenToken = 20,
          CloseParenToken = 21,
          OpenBracketToken = 22,
          CloseBracketToken = 23,
          DotToken = 24,
          DotDotDotToken = 25,
          SemicolonToken = 26,
          CommaToken = 27,
          QuestionDotToken = 28,
          LessThanToken = 29,
          LessThanSlashToken = 30,
          GreaterThanToken = 31,
          LessThanEqualsToken = 32,
          GreaterThanEqualsToken = 33,
          EqualsEqualsToken = 34,
          ExclamationEqualsToken = 35,
          EqualsEqualsEqualsToken = 36,
          ExclamationEqualsEqualsToken = 37,
          EqualsGreaterThanToken = 38,
          PlusToken = 39,
          MinusToken = 40,
          AsteriskToken = 41,
          AsteriskAsteriskToken = 42,
          SlashToken = 43,
          PercentToken = 44,
          PlusPlusToken = 45,
          MinusMinusToken = 46,
          LessThanLessThanToken = 47,
          GreaterThanGreaterThanToken = 48,
          GreaterThanGreaterThanGreaterThanToken = 49,
          AmpersandToken = 50,
          BarToken = 51,
          CaretToken = 52,
          ExclamationToken = 53,
          TildeToken = 54,
          AmpersandAmpersandToken = 55,
          BarBarToken = 56,
          QuestionToken = 57,
          ColonToken = 58,
          AtToken = 59,
          QuestionQuestionToken = 60,
          /** Only the JSDoc scanner produces BacktickToken. The normal scanner produces NoSubstitutionTemplateLiteral and related kinds. */
          BacktickToken = 61,
          EqualsToken = 62,
          PlusEqualsToken = 63,
          MinusEqualsToken = 64,
          AsteriskEqualsToken = 65,
          AsteriskAsteriskEqualsToken = 66,
          SlashEqualsToken = 67,
          PercentEqualsToken = 68,
          LessThanLessThanEqualsToken = 69,
          GreaterThanGreaterThanEqualsToken = 70,
          GreaterThanGreaterThanGreaterThanEqualsToken = 71,
          AmpersandEqualsToken = 72,
          BarEqualsToken = 73,
          CaretEqualsToken = 74,
          Identifier = 75,
          PrivateIdentifier = 76,
          BreakKeyword = 77,
          CaseKeyword = 78,
          CatchKeyword = 79,
          ClassKeyword = 80,
          ConstKeyword = 81,
          ContinueKeyword = 82,
          DebuggerKeyword = 83,
          DefaultKeyword = 84,
          DeleteKeyword = 85,
          DoKeyword = 86,
          ElseKeyword = 87,
          EnumKeyword = 88,
          ExportKeyword = 89,
          ExtendsKeyword = 90,
          FalseKeyword = 91,
          FinallyKeyword = 92,
          ForKeyword = 93,
          FunctionKeyword = 94,
          IfKeyword = 95,
          ImportKeyword = 96,
          InKeyword = 97,
          InstanceOfKeyword = 98,
          NewKeyword = 99,
          NullKeyword = 100,
          ReturnKeyword = 101,
          SuperKeyword = 102,
          SwitchKeyword = 103,
          ThisKeyword = 104,
          ThrowKeyword = 105,
          TrueKeyword = 106,
          TryKeyword = 107,
          TypeOfKeyword = 108,
          VarKeyword = 109,
          VoidKeyword = 110,
          WhileKeyword = 111,
          WithKeyword = 112,
          ImplementsKeyword = 113,
          InterfaceKeyword = 114,
          LetKeyword = 115,
          PackageKeyword = 116,
          PrivateKeyword = 117,
          ProtectedKeyword = 118,
          PublicKeyword = 119,
          StaticKeyword = 120,
          YieldKeyword = 121,
          AbstractKeyword = 122,
          AsKeyword = 123,
          AssertsKeyword = 124,
          AnyKeyword = 125,
          AsyncKeyword = 126,
          AwaitKeyword = 127,
          BooleanKeyword = 128,
          ConstructorKeyword = 129,
          DeclareKeyword = 130,
          GetKeyword = 131,
          InferKeyword = 132,
          IsKeyword = 133,
          KeyOfKeyword = 134,
          ModuleKeyword = 135,
          NamespaceKeyword = 136,
          NeverKeyword = 137,
          ReadonlyKeyword = 138,
          RequireKeyword = 139,
          NumberKeyword = 140,
          ObjectKeyword = 141,
          SetKeyword = 142,
          StringKeyword = 143,
          SymbolKeyword = 144,
          TypeKeyword = 145,
          UndefinedKeyword = 146,
          UniqueKeyword = 147,
          UnknownKeyword = 148,
          FromKeyword = 149,
          GlobalKeyword = 150,
          BigIntKeyword = 151,
          OfKeyword = 152,
          QualifiedName = 153,
          ComputedPropertyName = 154,
          TypeParameter = 155,
          Parameter = 156,
          Decorator = 157,
          PropertySignature = 158,
          PropertyDeclaration = 159,
          MethodSignature = 160,
          MethodDeclaration = 161,
          Constructor = 162,
          GetAccessor = 163,
          SetAccessor = 164,
          CallSignature = 165,
          ConstructSignature = 166,
          IndexSignature = 167,
          TypePredicate = 168,
          TypeReference = 169,
          FunctionType = 170,
          ConstructorType = 171,
          TypeQuery = 172,
          TypeLiteral = 173,
          ArrayType = 174,
          TupleType = 175,
          OptionalType = 176,
          RestType = 177,
          UnionType = 178,
          IntersectionType = 179,
          ConditionalType = 180,
          InferType = 181,
          ParenthesizedType = 182,
          ThisType = 183,
          TypeOperator = 184,
          IndexedAccessType = 185,
          MappedType = 186,
          LiteralType = 187,
          ImportType = 188,
          ObjectBindingPattern = 189,
          ArrayBindingPattern = 190,
          BindingElement = 191,
          ArrayLiteralExpression = 192,
          ObjectLiteralExpression = 193,
          PropertyAccessExpression = 194,
          ElementAccessExpression = 195,
          CallExpression = 196,
          NewExpression = 197,
          TaggedTemplateExpression = 198,
          TypeAssertionExpression = 199,
          ParenthesizedExpression = 200,
          FunctionExpression = 201,
          ArrowFunction = 202,
          DeleteExpression = 203,
          TypeOfExpression = 204,
          VoidExpression = 205,
          AwaitExpression = 206,
          PrefixUnaryExpression = 207,
          PostfixUnaryExpression = 208,
          BinaryExpression = 209,
          ConditionalExpression = 210,
          TemplateExpression = 211,
          YieldExpression = 212,
          SpreadElement = 213,
          ClassExpression = 214,
          OmittedExpression = 215,
          ExpressionWithTypeArguments = 216,
          AsExpression = 217,
          NonNullExpression = 218,
          MetaProperty = 219,
          SyntheticExpression = 220,
          TemplateSpan = 221,
          SemicolonClassElement = 222,
          Block = 223,
          EmptyStatement = 224,
          VariableStatement = 225,
          ExpressionStatement = 226,
          IfStatement = 227,
          DoStatement = 228,
          WhileStatement = 229,
          ForStatement = 230,
          ForInStatement = 231,
          ForOfStatement = 232,
          ContinueStatement = 233,
          BreakStatement = 234,
          ReturnStatement = 235,
          WithStatement = 236,
          SwitchStatement = 237,
          LabeledStatement = 238,
          ThrowStatement = 239,
          TryStatement = 240,
          DebuggerStatement = 241,
          VariableDeclaration = 242,
          VariableDeclarationList = 243,
          FunctionDeclaration = 244,
          ClassDeclaration = 245,
          InterfaceDeclaration = 246,
          TypeAliasDeclaration = 247,
          EnumDeclaration = 248,
          ModuleDeclaration = 249,
          ModuleBlock = 250,
          CaseBlock = 251,
          NamespaceExportDeclaration = 252,
          ImportEqualsDeclaration = 253,
          ImportDeclaration = 254,
          ImportClause = 255,
          NamespaceImport = 256,
          NamedImports = 257,
          ImportSpecifier = 258,
          ExportAssignment = 259,
          ExportDeclaration = 260,
          NamedExports = 261,
          NamespaceExport = 262,
          ExportSpecifier = 263,
          MissingDeclaration = 264,
          ExternalModuleReference = 265,
          JsxElement = 266,
          JsxSelfClosingElement = 267,
          JsxOpeningElement = 268,
          JsxClosingElement = 269,
          JsxFragment = 270,
          JsxOpeningFragment = 271,
          JsxClosingFragment = 272,
          JsxAttribute = 273,
          JsxAttributes = 274,
          JsxSpreadAttribute = 275,
          JsxExpression = 276,
          CaseClause = 277,
          DefaultClause = 278,
          HeritageClause = 279,
          CatchClause = 280,
          PropertyAssignment = 281,
          ShorthandPropertyAssignment = 282,
          SpreadAssignment = 283,
          EnumMember = 284,
          UnparsedPrologue = 285,
          UnparsedPrepend = 286,
          UnparsedText = 287,
          UnparsedInternalText = 288,
          UnparsedSyntheticReference = 289,
          SourceFile = 290,
          Bundle = 291,
          UnparsedSource = 292,
          InputFiles = 293,
          JSDocTypeExpression = 294,
          JSDocAllType = 295,
          JSDocUnknownType = 296,
          JSDocNullableType = 297,
          JSDocNonNullableType = 298,
          JSDocOptionalType = 299,
          JSDocFunctionType = 300,
          JSDocVariadicType = 301,
          JSDocNamepathType = 302,
          JSDocComment = 303,
          JSDocTypeLiteral = 304,
          JSDocSignature = 305,
          JSDocTag = 306,
          JSDocAugmentsTag = 307,
          JSDocImplementsTag = 308,
          JSDocAuthorTag = 309,
          JSDocClassTag = 310,
          JSDocPublicTag = 311,
          JSDocPrivateTag = 312,
          JSDocProtectedTag = 313,
          JSDocReadonlyTag = 314,
          JSDocCallbackTag = 315,
          JSDocEnumTag = 316,
          JSDocParameterTag = 317,
          JSDocReturnTag = 318,
          JSDocThisTag = 319,
          JSDocTypeTag = 320,
          JSDocTemplateTag = 321,
          JSDocTypedefTag = 322,
          JSDocPropertyTag = 323,
          SyntaxList = 324,
          NotEmittedStatement = 325,
          PartiallyEmittedExpression = 326,
          CommaListExpression = 327,
          MergeDeclarationMarker = 328,
          EndOfDeclarationMarker = 329,
          SyntheticReferenceExpression = 330,
          Count = 331,
          FirstAssignment = 62,
          LastAssignment = 74,
          FirstCompoundAssignment = 63,
          LastCompoundAssignment = 74,
          FirstReservedWord = 77,
          LastReservedWord = 112,
          FirstKeyword = 77,
          LastKeyword = 152,
          FirstFutureReservedWord = 113,
          LastFutureReservedWord = 121,
          FirstTypeNode = 168,
          LastTypeNode = 188,
          FirstPunctuation = 18,
          LastPunctuation = 74,
          FirstToken = 0,
          LastToken = 152,
          FirstTriviaToken = 2,
          LastTriviaToken = 7,
          FirstLiteralToken = 8,
          LastLiteralToken = 14,
          FirstTemplateToken = 14,
          LastTemplateToken = 17,
          FirstBinaryOperator = 29,
          LastBinaryOperator = 74,
          FirstStatement = 225,
          LastStatement = 241,
          FirstNode = 153,
          FirstJSDocNode = 294,
          LastJSDocNode = 323,
          FirstJSDocTagNode = 306,
          LastJSDocTagNode = 323,
      }
      export enum NodeFlags {
          None = 0,
          Let = 1,
          Const = 2,
          NestedNamespace = 4,
          Synthesized = 8,
          Namespace = 16,
          OptionalChain = 32,
          ExportContext = 64,
          ContainsThis = 128,
          HasImplicitReturn = 256,
          HasExplicitReturn = 512,
          GlobalAugmentation = 1024,
          HasAsyncFunctions = 2048,
          DisallowInContext = 4096,
          YieldContext = 8192,
          DecoratorContext = 16384,
          AwaitContext = 32768,
          ThisNodeHasError = 65536,
          JavaScriptFile = 131072,
          ThisNodeOrAnySubNodesHasError = 262144,
          HasAggregatedChildData = 524288,
          JSDoc = 4194304,
          JsonFile = 33554432,
          BlockScoped = 3,
          ReachabilityCheckFlags = 768,
          ReachabilityAndEmitFlags = 2816,
          ContextFlags = 25358336,
          TypeExcludesFlags = 40960,
      }
      export enum ModifierFlags {
          None = 0,
          Export = 1,
          Ambient = 2,
          Public = 4,
          Private = 8,
          Protected = 16,
          Static = 32,
          Readonly = 64,
          Abstract = 128,
          Async = 256,
          Default = 512,
          Const = 2048,
          HasComputedFlags = 536870912,
          AccessibilityModifier = 28,
          ParameterPropertyModifier = 92,
          NonPublicAccessibilityModifier = 24,
          TypeScriptModifier = 2270,
          ExportDefault = 513,
          All = 3071
      }
      export enum JsxFlags {
          None = 0,
          /** An element from a named property of the JSX.IntrinsicElements interface */
          IntrinsicNamedElement = 1,
          /** An element inferred from the string index signature of the JSX.IntrinsicElements interface */
          IntrinsicIndexedElement = 2,
          IntrinsicElement = 3
      }
      export interface Node extends TextRange {
          kind: SyntaxKind;
          flags: NodeFlags;
          decorators?: NodeArray<Decorator>;
          modifiers?: ModifiersArray;
          parent: Node;
      }
      export interface JSDocContainer {
      }
      export type HasJSDoc = ParameterDeclaration | CallSignatureDeclaration | ConstructSignatureDeclaration | MethodSignature | PropertySignature | ArrowFunction | ParenthesizedExpression | SpreadAssignment | ShorthandPropertyAssignment | PropertyAssignment | FunctionExpression | LabeledStatement | ExpressionStatement | VariableStatement | FunctionDeclaration | ConstructorDeclaration | MethodDeclaration | PropertyDeclaration | AccessorDeclaration | ClassLikeDeclaration | InterfaceDeclaration | TypeAliasDeclaration | EnumMember | EnumDeclaration | ModuleDeclaration | ImportEqualsDeclaration | IndexSignatureDeclaration | FunctionTypeNode | ConstructorTypeNode | JSDocFunctionType | ExportDeclaration | EndOfFileToken;
      export type HasType = SignatureDeclaration | VariableDeclaration | ParameterDeclaration | PropertySignature | PropertyDeclaration | TypePredicateNode | ParenthesizedTypeNode | TypeOperatorNode | MappedTypeNode | AssertionExpression | TypeAliasDeclaration | JSDocTypeExpression | JSDocNonNullableType | JSDocNullableType | JSDocOptionalType | JSDocVariadicType;
      export type HasTypeArguments = CallExpression | NewExpression | TaggedTemplateExpression | JsxOpeningElement | JsxSelfClosingElement;
      export type HasInitializer = HasExpressionInitializer | ForStatement | ForInStatement | ForOfStatement | JsxAttribute;
      export type HasExpressionInitializer = VariableDeclaration | ParameterDeclaration | BindingElement | PropertySignature | PropertyDeclaration | PropertyAssignment | EnumMember;
      export interface NodeArray<T extends Node> extends ReadonlyArray<T>, TextRange {
          hasTrailingComma?: boolean;
      }
      export interface Token<TKind extends SyntaxKind> extends Node {
          kind: TKind;
      }
      export type DotToken = Token<SyntaxKind.DotToken>;
      export type DotDotDotToken = Token<SyntaxKind.DotDotDotToken>;
      export type QuestionToken = Token<SyntaxKind.QuestionToken>;
      export type QuestionDotToken = Token<SyntaxKind.QuestionDotToken>;
      export type ExclamationToken = Token<SyntaxKind.ExclamationToken>;
      export type ColonToken = Token<SyntaxKind.ColonToken>;
      export type EqualsToken = Token<SyntaxKind.EqualsToken>;
      export type AsteriskToken = Token<SyntaxKind.AsteriskToken>;
      export type EqualsGreaterThanToken = Token<SyntaxKind.EqualsGreaterThanToken>;
      export type EndOfFileToken = Token<SyntaxKind.EndOfFileToken> & JSDocContainer;
      export type ReadonlyToken = Token<SyntaxKind.ReadonlyKeyword>;
      export type AwaitKeywordToken = Token<SyntaxKind.AwaitKeyword>;
      export type PlusToken = Token<SyntaxKind.PlusToken>;
      export type MinusToken = Token<SyntaxKind.MinusToken>;
      export type AssertsToken = Token<SyntaxKind.AssertsKeyword>;
      export type Modifier = Token<SyntaxKind.AbstractKeyword> | Token<SyntaxKind.AsyncKeyword> | Token<SyntaxKind.ConstKeyword> | Token<SyntaxKind.DeclareKeyword> | Token<SyntaxKind.DefaultKeyword> | Token<SyntaxKind.ExportKeyword> | Token<SyntaxKind.PublicKeyword> | Token<SyntaxKind.PrivateKeyword> | Token<SyntaxKind.ProtectedKeyword> | Token<SyntaxKind.ReadonlyKeyword> | Token<SyntaxKind.StaticKeyword>;
      export type ModifiersArray = NodeArray<Modifier>;
      export interface Identifier extends PrimaryExpression, Declaration {
          kind: SyntaxKind.Identifier;
          /**
           * Prefer to use `id.unescapedText`. (Note: This is available only in services, not internally to the TypeScript compiler.)
           * Text of identifier, but if the identifier begins with two underscores, this will begin with three.
           */
          escapedText: __String;
          originalKeywordKind?: SyntaxKind;
          isInJSDocNamespace?: boolean;
      }
      export interface TransientIdentifier extends Identifier {
          resolvedSymbol: Symbol;
      }
      export interface QualifiedName extends Node {
          kind: SyntaxKind.QualifiedName;
          left: EntityName;
          right: Identifier;
      }
      export type EntityName = Identifier | QualifiedName;
      export type PropertyName = Identifier | StringLiteral | NumericLiteral | ComputedPropertyName | PrivateIdentifier;
      export type DeclarationName = Identifier | PrivateIdentifier | StringLiteralLike | NumericLiteral | ComputedPropertyName | ElementAccessExpression | BindingPattern | EntityNameExpression;
      export interface Declaration extends Node {
          _declarationBrand: any;
      }
      export interface NamedDeclaration extends Declaration {
          name?: DeclarationName;
      }
      export interface DeclarationStatement extends NamedDeclaration, Statement {
          name?: Identifier | StringLiteral | NumericLiteral;
      }
      export interface ComputedPropertyName extends Node {
          parent: Declaration;
          kind: SyntaxKind.ComputedPropertyName;
          expression: Expression;
      }
      export interface PrivateIdentifier extends Node {
          kind: SyntaxKind.PrivateIdentifier;
          escapedText: __String;
      }
      export interface Decorator extends Node {
          kind: SyntaxKind.Decorator;
          parent: NamedDeclaration;
          expression: LeftHandSideExpression;
      }
      export interface TypeParameterDeclaration extends NamedDeclaration {
          kind: SyntaxKind.TypeParameter;
          parent: DeclarationWithTypeParameterChildren | InferTypeNode;
          name: Identifier;
          /** Note: Consider calling `getEffectiveConstraintOfTypeParameter` */
          constraint?: TypeNode;
          default?: TypeNode;
          expression?: Expression;
      }
      export interface SignatureDeclarationBase extends NamedDeclaration, JSDocContainer {
          kind: SignatureDeclaration["kind"];
          name?: PropertyName;
          typeParameters?: NodeArray<TypeParameterDeclaration>;
          parameters: NodeArray<ParameterDeclaration>;
          type?: TypeNode;
      }
      export type SignatureDeclaration = CallSignatureDeclaration | ConstructSignatureDeclaration | MethodSignature | IndexSignatureDeclaration | FunctionTypeNode | ConstructorTypeNode | JSDocFunctionType | FunctionDeclaration | MethodDeclaration | ConstructorDeclaration | AccessorDeclaration | FunctionExpression | ArrowFunction;
      export interface CallSignatureDeclaration extends SignatureDeclarationBase, TypeElement {
          kind: SyntaxKind.CallSignature;
      }
      export interface ConstructSignatureDeclaration extends SignatureDeclarationBase, TypeElement {
          kind: SyntaxKind.ConstructSignature;
      }
      export type BindingName = Identifier | BindingPattern;
      export interface VariableDeclaration extends NamedDeclaration {
          kind: SyntaxKind.VariableDeclaration;
          parent: VariableDeclarationList | CatchClause;
          name: BindingName;
          exclamationToken?: ExclamationToken;
          type?: TypeNode;
          initializer?: Expression;
      }
      export interface VariableDeclarationList extends Node {
          kind: SyntaxKind.VariableDeclarationList;
          parent: VariableStatement | ForStatement | ForOfStatement | ForInStatement;
          declarations: NodeArray<VariableDeclaration>;
      }
      export interface ParameterDeclaration extends NamedDeclaration, JSDocContainer {
          kind: SyntaxKind.Parameter;
          parent: SignatureDeclaration;
          dotDotDotToken?: DotDotDotToken;
          name: BindingName;
          questionToken?: QuestionToken;
          type?: TypeNode;
          initializer?: Expression;
      }
      export interface BindingElement extends NamedDeclaration {
          kind: SyntaxKind.BindingElement;
          parent: BindingPattern;
          propertyName?: PropertyName;
          dotDotDotToken?: DotDotDotToken;
          name: BindingName;
          initializer?: Expression;
      }
      export interface PropertySignature extends TypeElement, JSDocContainer {
          kind: SyntaxKind.PropertySignature;
          name: PropertyName;
          questionToken?: QuestionToken;
          type?: TypeNode;
          initializer?: Expression;
      }
      export interface PropertyDeclaration extends ClassElement, JSDocContainer {
          kind: SyntaxKind.PropertyDeclaration;
          parent: ClassLikeDeclaration;
          name: PropertyName;
          questionToken?: QuestionToken;
          exclamationToken?: ExclamationToken;
          type?: TypeNode;
          initializer?: Expression;
      }
      export interface ObjectLiteralElement extends NamedDeclaration {
          _objectLiteralBrand: any;
          name?: PropertyName;
      }
      /** Unlike ObjectLiteralElement, excludes JSXAttribute and JSXSpreadAttribute. */
      export type ObjectLiteralElementLike = PropertyAssignment | ShorthandPropertyAssignment | SpreadAssignment | MethodDeclaration | AccessorDeclaration;
      export interface PropertyAssignment extends ObjectLiteralElement, JSDocContainer {
          parent: ObjectLiteralExpression;
          kind: SyntaxKind.PropertyAssignment;
          name: PropertyName;
          questionToken?: QuestionToken;
          initializer: Expression;
      }
      export interface ShorthandPropertyAssignment extends ObjectLiteralElement, JSDocContainer {
          parent: ObjectLiteralExpression;
          kind: SyntaxKind.ShorthandPropertyAssignment;
          name: Identifier;
          questionToken?: QuestionToken;
          exclamationToken?: ExclamationToken;
          equalsToken?: Token<SyntaxKind.EqualsToken>;
          objectAssignmentInitializer?: Expression;
      }
      export interface SpreadAssignment extends ObjectLiteralElement, JSDocContainer {
          parent: ObjectLiteralExpression;
          kind: SyntaxKind.SpreadAssignment;
          expression: Expression;
      }
      export type VariableLikeDeclaration = VariableDeclaration | ParameterDeclaration | BindingElement | PropertyDeclaration | PropertyAssignment | PropertySignature | JsxAttribute | ShorthandPropertyAssignment | EnumMember | JSDocPropertyTag | JSDocParameterTag;
      export interface PropertyLikeDeclaration extends NamedDeclaration {
          name: PropertyName;
      }
      export interface ObjectBindingPattern extends Node {
          kind: SyntaxKind.ObjectBindingPattern;
          parent: VariableDeclaration | ParameterDeclaration | BindingElement;
          elements: NodeArray<BindingElement>;
      }
      export interface ArrayBindingPattern extends Node {
          kind: SyntaxKind.ArrayBindingPattern;
          parent: VariableDeclaration | ParameterDeclaration | BindingElement;
          elements: NodeArray<ArrayBindingElement>;
      }
      export type BindingPattern = ObjectBindingPattern | ArrayBindingPattern;
      export type ArrayBindingElement = BindingElement | OmittedExpression;
      /**
       * Several node kinds share function-like features such as a signature,
       * a name, and a body. These nodes should extend FunctionLikeDeclarationBase.
       * Examples:
       * - FunctionDeclaration
       * - MethodDeclaration
       * - AccessorDeclaration
       */
      export interface FunctionLikeDeclarationBase extends SignatureDeclarationBase {
          _functionLikeDeclarationBrand: any;
          asteriskToken?: AsteriskToken;
          questionToken?: QuestionToken;
          exclamationToken?: ExclamationToken;
          body?: Block | Expression;
      }
      export type FunctionLikeDeclaration = FunctionDeclaration | MethodDeclaration | GetAccessorDeclaration | SetAccessorDeclaration | ConstructorDeclaration | FunctionExpression | ArrowFunction;
      /** @deprecated Use SignatureDeclaration */
      export type FunctionLike = SignatureDeclaration;
      export interface FunctionDeclaration extends FunctionLikeDeclarationBase, DeclarationStatement {
          kind: SyntaxKind.FunctionDeclaration;
          name?: Identifier;
          body?: FunctionBody;
      }
      export interface MethodSignature extends SignatureDeclarationBase, TypeElement {
          kind: SyntaxKind.MethodSignature;
          parent: ObjectTypeDeclaration;
          name: PropertyName;
      }
      export interface MethodDeclaration extends FunctionLikeDeclarationBase, ClassElement, ObjectLiteralElement, JSDocContainer {
          kind: SyntaxKind.MethodDeclaration;
          parent: ClassLikeDeclaration | ObjectLiteralExpression;
          name: PropertyName;
          body?: FunctionBody;
      }
      export interface ConstructorDeclaration extends FunctionLikeDeclarationBase, ClassElement, JSDocContainer {
          kind: SyntaxKind.Constructor;
          parent: ClassLikeDeclaration;
          body?: FunctionBody;
      }
      /** For when we encounter a semicolon in a class declaration. ES6 allows these as class elements. */
      export interface SemicolonClassElement extends ClassElement {
          kind: SyntaxKind.SemicolonClassElement;
          parent: ClassLikeDeclaration;
      }
      export interface GetAccessorDeclaration extends FunctionLikeDeclarationBase, ClassElement, ObjectLiteralElement, JSDocContainer {
          kind: SyntaxKind.GetAccessor;
          parent: ClassLikeDeclaration | ObjectLiteralExpression;
          name: PropertyName;
          body?: FunctionBody;
      }
      export interface SetAccessorDeclaration extends FunctionLikeDeclarationBase, ClassElement, ObjectLiteralElement, JSDocContainer {
          kind: SyntaxKind.SetAccessor;
          parent: ClassLikeDeclaration | ObjectLiteralExpression;
          name: PropertyName;
          body?: FunctionBody;
      }
      export type AccessorDeclaration = GetAccessorDeclaration | SetAccessorDeclaration;
      export interface IndexSignatureDeclaration extends SignatureDeclarationBase, ClassElement, TypeElement {
          kind: SyntaxKind.IndexSignature;
          parent: ObjectTypeDeclaration;
      }
      export interface TypeNode extends Node {
          _typeNodeBrand: any;
      }
      export interface KeywordTypeNode extends TypeNode {
          kind: SyntaxKind.AnyKeyword | SyntaxKind.UnknownKeyword | SyntaxKind.NumberKeyword | SyntaxKind.BigIntKeyword | SyntaxKind.ObjectKeyword | SyntaxKind.BooleanKeyword | SyntaxKind.StringKeyword | SyntaxKind.SymbolKeyword | SyntaxKind.ThisKeyword | SyntaxKind.VoidKeyword | SyntaxKind.UndefinedKeyword | SyntaxKind.NullKeyword | SyntaxKind.NeverKeyword;
      }
      export interface ImportTypeNode extends NodeWithTypeArguments {
          kind: SyntaxKind.ImportType;
          isTypeOf?: boolean;
          argument: TypeNode;
          qualifier?: EntityName;
      }
      export interface ThisTypeNode extends TypeNode {
          kind: SyntaxKind.ThisType;
      }
      export type FunctionOrConstructorTypeNode = FunctionTypeNode | ConstructorTypeNode;
      export interface FunctionOrConstructorTypeNodeBase extends TypeNode, SignatureDeclarationBase {
          kind: SyntaxKind.FunctionType | SyntaxKind.ConstructorType;
          type: TypeNode;
      }
      export interface FunctionTypeNode extends FunctionOrConstructorTypeNodeBase {
          kind: SyntaxKind.FunctionType;
      }
      export interface ConstructorTypeNode extends FunctionOrConstructorTypeNodeBase {
          kind: SyntaxKind.ConstructorType;
      }
      export interface NodeWithTypeArguments extends TypeNode {
          typeArguments?: NodeArray<TypeNode>;
      }
      export type TypeReferenceType = TypeReferenceNode | ExpressionWithTypeArguments;
      export interface TypeReferenceNode extends NodeWithTypeArguments {
          kind: SyntaxKind.TypeReference;
          typeName: EntityName;
      }
      export interface TypePredicateNode extends TypeNode {
          kind: SyntaxKind.TypePredicate;
          parent: SignatureDeclaration | JSDocTypeExpression;
          assertsModifier?: AssertsToken;
          parameterName: Identifier | ThisTypeNode;
          type?: TypeNode;
      }
      export interface TypeQueryNode extends TypeNode {
          kind: SyntaxKind.TypeQuery;
          exprName: EntityName;
      }
      export interface TypeLiteralNode extends TypeNode, Declaration {
          kind: SyntaxKind.TypeLiteral;
          members: NodeArray<TypeElement>;
      }
      export interface ArrayTypeNode extends TypeNode {
          kind: SyntaxKind.ArrayType;
          elementType: TypeNode;
      }
      export interface TupleTypeNode extends TypeNode {
          kind: SyntaxKind.TupleType;
          elementTypes: NodeArray<TypeNode>;
      }
      export interface OptionalTypeNode extends TypeNode {
          kind: SyntaxKind.OptionalType;
          type: TypeNode;
      }
      export interface RestTypeNode extends TypeNode {
          kind: SyntaxKind.RestType;
          type: TypeNode;
      }
      export type UnionOrIntersectionTypeNode = UnionTypeNode | IntersectionTypeNode;
      export interface UnionTypeNode extends TypeNode {
          kind: SyntaxKind.UnionType;
          types: NodeArray<TypeNode>;
      }
      export interface IntersectionTypeNode extends TypeNode {
          kind: SyntaxKind.IntersectionType;
          types: NodeArray<TypeNode>;
      }
      export interface ConditionalTypeNode extends TypeNode {
          kind: SyntaxKind.ConditionalType;
          checkType: TypeNode;
          extendsType: TypeNode;
          trueType: TypeNode;
          falseType: TypeNode;
      }
      export interface InferTypeNode extends TypeNode {
          kind: SyntaxKind.InferType;
          typeParameter: TypeParameterDeclaration;
      }
      export interface ParenthesizedTypeNode extends TypeNode {
          kind: SyntaxKind.ParenthesizedType;
          type: TypeNode;
      }
      export interface TypeOperatorNode extends TypeNode {
          kind: SyntaxKind.TypeOperator;
          operator: SyntaxKind.KeyOfKeyword | SyntaxKind.UniqueKeyword | SyntaxKind.ReadonlyKeyword;
          type: TypeNode;
      }
      export interface IndexedAccessTypeNode extends TypeNode {
          kind: SyntaxKind.IndexedAccessType;
          objectType: TypeNode;
          indexType: TypeNode;
      }
      export interface MappedTypeNode extends TypeNode, Declaration {
          kind: SyntaxKind.MappedType;
          readonlyToken?: ReadonlyToken | PlusToken | MinusToken;
          typeParameter: TypeParameterDeclaration;
          questionToken?: QuestionToken | PlusToken | MinusToken;
          type?: TypeNode;
      }
      export interface LiteralTypeNode extends TypeNode {
          kind: SyntaxKind.LiteralType;
          literal: BooleanLiteral | LiteralExpression | PrefixUnaryExpression;
      }
      export interface StringLiteral extends LiteralExpression, Declaration {
          kind: SyntaxKind.StringLiteral;
      }
      export type StringLiteralLike = StringLiteral | NoSubstitutionTemplateLiteral;
      export interface Expression extends Node {
          _expressionBrand: any;
      }
      export interface OmittedExpression extends Expression {
          kind: SyntaxKind.OmittedExpression;
      }
      export interface PartiallyEmittedExpression extends LeftHandSideExpression {
          kind: SyntaxKind.PartiallyEmittedExpression;
          expression: Expression;
      }
      export interface UnaryExpression extends Expression {
          _unaryExpressionBrand: any;
      }
      /** Deprecated, please use UpdateExpression */
      export type IncrementExpression = UpdateExpression;
      export interface UpdateExpression extends UnaryExpression {
          _updateExpressionBrand: any;
      }
      export type PrefixUnaryOperator = SyntaxKind.PlusPlusToken | SyntaxKind.MinusMinusToken | SyntaxKind.PlusToken | SyntaxKind.MinusToken | SyntaxKind.TildeToken | SyntaxKind.ExclamationToken;
      export interface PrefixUnaryExpression extends UpdateExpression {
          kind: SyntaxKind.PrefixUnaryExpression;
          operator: PrefixUnaryOperator;
          operand: UnaryExpression;
      }
      export type PostfixUnaryOperator = SyntaxKind.PlusPlusToken | SyntaxKind.MinusMinusToken;
      export interface PostfixUnaryExpression extends UpdateExpression {
          kind: SyntaxKind.PostfixUnaryExpression;
          operand: LeftHandSideExpression;
          operator: PostfixUnaryOperator;
      }
      export interface LeftHandSideExpression extends UpdateExpression {
          _leftHandSideExpressionBrand: any;
      }
      export interface MemberExpression extends LeftHandSideExpression {
          _memberExpressionBrand: any;
      }
      export interface PrimaryExpression extends MemberExpression {
          _primaryExpressionBrand: any;
      }
      export interface NullLiteral extends PrimaryExpression, TypeNode {
          kind: SyntaxKind.NullKeyword;
      }
      export interface BooleanLiteral extends PrimaryExpression, TypeNode {
          kind: SyntaxKind.TrueKeyword | SyntaxKind.FalseKeyword;
      }
      export interface ThisExpression extends PrimaryExpression, KeywordTypeNode {
          kind: SyntaxKind.ThisKeyword;
      }
      export interface SuperExpression extends PrimaryExpression {
          kind: SyntaxKind.SuperKeyword;
      }
      export interface ImportExpression extends PrimaryExpression {
          kind: SyntaxKind.ImportKeyword;
      }
      export interface DeleteExpression extends UnaryExpression {
          kind: SyntaxKind.DeleteExpression;
          expression: UnaryExpression;
      }
      export interface TypeOfExpression extends UnaryExpression {
          kind: SyntaxKind.TypeOfExpression;
          expression: UnaryExpression;
      }
      export interface VoidExpression extends UnaryExpression {
          kind: SyntaxKind.VoidExpression;
          expression: UnaryExpression;
      }
      export interface AwaitExpression extends UnaryExpression {
          kind: SyntaxKind.AwaitExpression;
          expression: UnaryExpression;
      }
      export interface YieldExpression extends Expression {
          kind: SyntaxKind.YieldExpression;
          asteriskToken?: AsteriskToken;
          expression?: Expression;
      }
      export interface SyntheticExpression extends Expression {
          kind: SyntaxKind.SyntheticExpression;
          isSpread: boolean;
          type: Type;
      }
      export type ExponentiationOperator = SyntaxKind.AsteriskAsteriskToken;
      export type MultiplicativeOperator = SyntaxKind.AsteriskToken | SyntaxKind.SlashToken | SyntaxKind.PercentToken;
      export type MultiplicativeOperatorOrHigher = ExponentiationOperator | MultiplicativeOperator;
      export type AdditiveOperator = SyntaxKind.PlusToken | SyntaxKind.MinusToken;
      export type AdditiveOperatorOrHigher = MultiplicativeOperatorOrHigher | AdditiveOperator;
      export type ShiftOperator = SyntaxKind.LessThanLessThanToken | SyntaxKind.GreaterThanGreaterThanToken | SyntaxKind.GreaterThanGreaterThanGreaterThanToken;
      export type ShiftOperatorOrHigher = AdditiveOperatorOrHigher | ShiftOperator;
      export type RelationalOperator = SyntaxKind.LessThanToken | SyntaxKind.LessThanEqualsToken | SyntaxKind.GreaterThanToken | SyntaxKind.GreaterThanEqualsToken | SyntaxKind.InstanceOfKeyword | SyntaxKind.InKeyword;
      export type RelationalOperatorOrHigher = ShiftOperatorOrHigher | RelationalOperator;
      export type EqualityOperator = SyntaxKind.EqualsEqualsToken | SyntaxKind.EqualsEqualsEqualsToken | SyntaxKind.ExclamationEqualsEqualsToken | SyntaxKind.ExclamationEqualsToken;
      export type EqualityOperatorOrHigher = RelationalOperatorOrHigher | EqualityOperator;
      export type BitwiseOperator = SyntaxKind.AmpersandToken | SyntaxKind.BarToken | SyntaxKind.CaretToken;
      export type BitwiseOperatorOrHigher = EqualityOperatorOrHigher | BitwiseOperator;
      export type LogicalOperator = SyntaxKind.AmpersandAmpersandToken | SyntaxKind.BarBarToken;
      export type LogicalOperatorOrHigher = BitwiseOperatorOrHigher | LogicalOperator;
      export type CompoundAssignmentOperator = SyntaxKind.PlusEqualsToken | SyntaxKind.MinusEqualsToken | SyntaxKind.AsteriskAsteriskEqualsToken | SyntaxKind.AsteriskEqualsToken | SyntaxKind.SlashEqualsToken | SyntaxKind.PercentEqualsToken | SyntaxKind.AmpersandEqualsToken | SyntaxKind.BarEqualsToken | SyntaxKind.CaretEqualsToken | SyntaxKind.LessThanLessThanEqualsToken | SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken | SyntaxKind.GreaterThanGreaterThanEqualsToken;
      export type AssignmentOperator = SyntaxKind.EqualsToken | CompoundAssignmentOperator;
      export type AssignmentOperatorOrHigher = SyntaxKind.QuestionQuestionToken | LogicalOperatorOrHigher | AssignmentOperator;
      export type BinaryOperator = AssignmentOperatorOrHigher | SyntaxKind.CommaToken;
      export type BinaryOperatorToken = Token<BinaryOperator>;
      export interface BinaryExpression extends Expression, Declaration {
          kind: SyntaxKind.BinaryExpression;
          left: Expression;
          operatorToken: BinaryOperatorToken;
          right: Expression;
      }
      export type AssignmentOperatorToken = Token<AssignmentOperator>;
      export interface AssignmentExpression<TOperator extends AssignmentOperatorToken> extends BinaryExpression {
          left: LeftHandSideExpression;
          operatorToken: TOperator;
      }
      export interface ObjectDestructuringAssignment extends AssignmentExpression<EqualsToken> {
          left: ObjectLiteralExpression;
      }
      export interface ArrayDestructuringAssignment extends AssignmentExpression<EqualsToken> {
          left: ArrayLiteralExpression;
      }
      export type DestructuringAssignment = ObjectDestructuringAssignment | ArrayDestructuringAssignment;
      export type BindingOrAssignmentElement = VariableDeclaration | ParameterDeclaration | BindingElement | PropertyAssignment | ShorthandPropertyAssignment | SpreadAssignment | OmittedExpression | SpreadElement | ArrayLiteralExpression | ObjectLiteralExpression | AssignmentExpression<EqualsToken> | Identifier | PropertyAccessExpression | ElementAccessExpression;
      export type BindingOrAssignmentElementRestIndicator = DotDotDotToken | SpreadElement | SpreadAssignment;
      export type BindingOrAssignmentElementTarget = BindingOrAssignmentPattern | Identifier | PropertyAccessExpression | ElementAccessExpression | OmittedExpression;
      export type ObjectBindingOrAssignmentPattern = ObjectBindingPattern | ObjectLiteralExpression;
      export type ArrayBindingOrAssignmentPattern = ArrayBindingPattern | ArrayLiteralExpression;
      export type AssignmentPattern = ObjectLiteralExpression | ArrayLiteralExpression;
      export type BindingOrAssignmentPattern = ObjectBindingOrAssignmentPattern | ArrayBindingOrAssignmentPattern;
      export interface ConditionalExpression extends Expression {
          kind: SyntaxKind.ConditionalExpression;
          condition: Expression;
          questionToken: QuestionToken;
          whenTrue: Expression;
          colonToken: ColonToken;
          whenFalse: Expression;
      }
      export type FunctionBody = Block;
      export type ConciseBody = FunctionBody | Expression;
      export interface FunctionExpression extends PrimaryExpression, FunctionLikeDeclarationBase, JSDocContainer {
          kind: SyntaxKind.FunctionExpression;
          name?: Identifier;
          body: FunctionBody;
      }
      export interface ArrowFunction extends Expression, FunctionLikeDeclarationBase, JSDocContainer {
          kind: SyntaxKind.ArrowFunction;
          equalsGreaterThanToken: EqualsGreaterThanToken;
          body: ConciseBody;
          name: never;
      }
      export interface LiteralLikeNode extends Node {
          text: string;
          isUnterminated?: boolean;
          hasExtendedUnicodeEscape?: boolean;
      }
      export interface TemplateLiteralLikeNode extends LiteralLikeNode {
          rawText?: string;
      }
      export interface LiteralExpression extends LiteralLikeNode, PrimaryExpression {
          _literalExpressionBrand: any;
      }
      export interface RegularExpressionLiteral extends LiteralExpression {
          kind: SyntaxKind.RegularExpressionLiteral;
      }
      export interface NoSubstitutionTemplateLiteral extends LiteralExpression, TemplateLiteralLikeNode, Declaration {
          kind: SyntaxKind.NoSubstitutionTemplateLiteral;
      }
      export enum TokenFlags {
          None = 0,
          Scientific = 16,
          Octal = 32,
          HexSpecifier = 64,
          BinarySpecifier = 128,
          OctalSpecifier = 256,
      }
      export interface NumericLiteral extends LiteralExpression, Declaration {
          kind: SyntaxKind.NumericLiteral;
      }
      export interface BigIntLiteral extends LiteralExpression {
          kind: SyntaxKind.BigIntLiteral;
      }
      export interface TemplateHead extends TemplateLiteralLikeNode {
          kind: SyntaxKind.TemplateHead;
          parent: TemplateExpression;
      }
      export interface TemplateMiddle extends TemplateLiteralLikeNode {
          kind: SyntaxKind.TemplateMiddle;
          parent: TemplateSpan;
      }
      export interface TemplateTail extends TemplateLiteralLikeNode {
          kind: SyntaxKind.TemplateTail;
          parent: TemplateSpan;
      }
      export type TemplateLiteral = TemplateExpression | NoSubstitutionTemplateLiteral;
      export interface TemplateExpression extends PrimaryExpression {
          kind: SyntaxKind.TemplateExpression;
          head: TemplateHead;
          templateSpans: NodeArray<TemplateSpan>;
      }
      export interface TemplateSpan extends Node {
          kind: SyntaxKind.TemplateSpan;
          parent: TemplateExpression;
          expression: Expression;
          literal: TemplateMiddle | TemplateTail;
      }
      export interface ParenthesizedExpression extends PrimaryExpression, JSDocContainer {
          kind: SyntaxKind.ParenthesizedExpression;
          expression: Expression;
      }
      export interface ArrayLiteralExpression extends PrimaryExpression {
          kind: SyntaxKind.ArrayLiteralExpression;
          elements: NodeArray<Expression>;
      }
      export interface SpreadElement extends Expression {
          kind: SyntaxKind.SpreadElement;
          parent: ArrayLiteralExpression | CallExpression | NewExpression;
          expression: Expression;
      }
      /**
       * This interface is a base interface for ObjectLiteralExpression and JSXAttributes to extend from. JSXAttributes is similar to
       * ObjectLiteralExpression in that it contains array of properties; however, JSXAttributes' properties can only be
       * JSXAttribute or JSXSpreadAttribute. ObjectLiteralExpression, on the other hand, can only have properties of type
       * ObjectLiteralElement (e.g. PropertyAssignment, ShorthandPropertyAssignment etc.)
       */
      export interface ObjectLiteralExpressionBase<T extends ObjectLiteralElement> extends PrimaryExpression, Declaration {
          properties: NodeArray<T>;
      }
      export interface ObjectLiteralExpression extends ObjectLiteralExpressionBase<ObjectLiteralElementLike> {
          kind: SyntaxKind.ObjectLiteralExpression;
      }
      export type EntityNameExpression = Identifier | PropertyAccessEntityNameExpression;
      export type EntityNameOrEntityNameExpression = EntityName | EntityNameExpression;
      export interface PropertyAccessExpression extends MemberExpression, NamedDeclaration {
          kind: SyntaxKind.PropertyAccessExpression;
          expression: LeftHandSideExpression;
          questionDotToken?: QuestionDotToken;
          name: Identifier | PrivateIdentifier;
      }
      export interface PropertyAccessChain extends PropertyAccessExpression {
          _optionalChainBrand: any;
          name: Identifier;
      }
      export interface SuperPropertyAccessExpression extends PropertyAccessExpression {
          expression: SuperExpression;
      }
      /** Brand for a PropertyAccessExpression which, like a QualifiedName, consists of a sequence of identifiers separated by dots. */
      export interface PropertyAccessEntityNameExpression extends PropertyAccessExpression {
          _propertyAccessExpressionLikeQualifiedNameBrand?: any;
          expression: EntityNameExpression;
          name: Identifier;
      }
      export interface ElementAccessExpression extends MemberExpression {
          kind: SyntaxKind.ElementAccessExpression;
          expression: LeftHandSideExpression;
          questionDotToken?: QuestionDotToken;
          argumentExpression: Expression;
      }
      export interface ElementAccessChain extends ElementAccessExpression {
          _optionalChainBrand: any;
      }
      export interface SuperElementAccessExpression extends ElementAccessExpression {
          expression: SuperExpression;
      }
      export type SuperProperty = SuperPropertyAccessExpression | SuperElementAccessExpression;
      export interface CallExpression extends LeftHandSideExpression, Declaration {
          kind: SyntaxKind.CallExpression;
          expression: LeftHandSideExpression;
          questionDotToken?: QuestionDotToken;
          typeArguments?: NodeArray<TypeNode>;
          arguments: NodeArray<Expression>;
      }
      export interface CallChain extends CallExpression {
          _optionalChainBrand: any;
      }
      export type OptionalChain = PropertyAccessChain | ElementAccessChain | CallChain | NonNullChain;
      export interface SuperCall extends CallExpression {
          expression: SuperExpression;
      }
      export interface ImportCall extends CallExpression {
          expression: ImportExpression;
      }
      export interface ExpressionWithTypeArguments extends NodeWithTypeArguments {
          kind: SyntaxKind.ExpressionWithTypeArguments;
          parent: HeritageClause | JSDocAugmentsTag | JSDocImplementsTag;
          expression: LeftHandSideExpression;
      }
      export interface NewExpression extends PrimaryExpression, Declaration {
          kind: SyntaxKind.NewExpression;
          expression: LeftHandSideExpression;
          typeArguments?: NodeArray<TypeNode>;
          arguments?: NodeArray<Expression>;
      }
      export interface TaggedTemplateExpression extends MemberExpression {
          kind: SyntaxKind.TaggedTemplateExpression;
          tag: LeftHandSideExpression;
          typeArguments?: NodeArray<TypeNode>;
          template: TemplateLiteral;
      }
      export type CallLikeExpression = CallExpression | NewExpression | TaggedTemplateExpression | Decorator | JsxOpeningLikeElement;
      export interface AsExpression extends Expression {
          kind: SyntaxKind.AsExpression;
          expression: Expression;
          type: TypeNode;
      }
      export interface TypeAssertion extends UnaryExpression {
          kind: SyntaxKind.TypeAssertionExpression;
          type: TypeNode;
          expression: UnaryExpression;
      }
      export type AssertionExpression = TypeAssertion | AsExpression;
      export interface NonNullExpression extends LeftHandSideExpression {
          kind: SyntaxKind.NonNullExpression;
          expression: Expression;
      }
      export interface NonNullChain extends NonNullExpression {
          _optionalChainBrand: any;
      }
      export interface MetaProperty extends PrimaryExpression {
          kind: SyntaxKind.MetaProperty;
          keywordToken: SyntaxKind.NewKeyword | SyntaxKind.ImportKeyword;
          name: Identifier;
      }
      export interface JsxElement extends PrimaryExpression {
          kind: SyntaxKind.JsxElement;
          openingElement: JsxOpeningElement;
          children: NodeArray<JsxChild>;
          closingElement: JsxClosingElement;
      }
      export type JsxOpeningLikeElement = JsxSelfClosingElement | JsxOpeningElement;
      export type JsxAttributeLike = JsxAttribute | JsxSpreadAttribute;
      export type JsxTagNameExpression = Identifier | ThisExpression | JsxTagNamePropertyAccess;
      export interface JsxTagNamePropertyAccess extends PropertyAccessExpression {
          expression: JsxTagNameExpression;
      }
      export interface JsxAttributes extends ObjectLiteralExpressionBase<JsxAttributeLike> {
          kind: SyntaxKind.JsxAttributes;
          parent: JsxOpeningLikeElement;
      }
      export interface JsxOpeningElement extends Expression {
          kind: SyntaxKind.JsxOpeningElement;
          parent: JsxElement;
          tagName: JsxTagNameExpression;
          typeArguments?: NodeArray<TypeNode>;
          attributes: JsxAttributes;
      }
      export interface JsxSelfClosingElement extends PrimaryExpression {
          kind: SyntaxKind.JsxSelfClosingElement;
          tagName: JsxTagNameExpression;
          typeArguments?: NodeArray<TypeNode>;
          attributes: JsxAttributes;
      }
      export interface JsxFragment extends PrimaryExpression {
          kind: SyntaxKind.JsxFragment;
          openingFragment: JsxOpeningFragment;
          children: NodeArray<JsxChild>;
          closingFragment: JsxClosingFragment;
      }
      export interface JsxOpeningFragment extends Expression {
          kind: SyntaxKind.JsxOpeningFragment;
          parent: JsxFragment;
      }
      export interface JsxClosingFragment extends Expression {
          kind: SyntaxKind.JsxClosingFragment;
          parent: JsxFragment;
      }
      export interface JsxAttribute extends ObjectLiteralElement {
          kind: SyntaxKind.JsxAttribute;
          parent: JsxAttributes;
          name: Identifier;
          initializer?: StringLiteral | JsxExpression;
      }
      export interface JsxSpreadAttribute extends ObjectLiteralElement {
          kind: SyntaxKind.JsxSpreadAttribute;
          parent: JsxAttributes;
          expression: Expression;
      }
      export interface JsxClosingElement extends Node {
          kind: SyntaxKind.JsxClosingElement;
          parent: JsxElement;
          tagName: JsxTagNameExpression;
      }
      export interface JsxExpression extends Expression {
          kind: SyntaxKind.JsxExpression;
          parent: JsxElement | JsxAttributeLike;
          dotDotDotToken?: Token<SyntaxKind.DotDotDotToken>;
          expression?: Expression;
      }
      export interface JsxText extends LiteralLikeNode {
          kind: SyntaxKind.JsxText;
          containsOnlyTriviaWhiteSpaces: boolean;
          parent: JsxElement;
      }
      export type JsxChild = JsxText | JsxExpression | JsxElement | JsxSelfClosingElement | JsxFragment;
      export interface Statement extends Node {
          _statementBrand: any;
      }
      export interface NotEmittedStatement extends Statement {
          kind: SyntaxKind.NotEmittedStatement;
      }
      /**
       * A list of comma-separated expressions. This node is only created by transformations.
       */
      export interface CommaListExpression extends Expression {
          kind: SyntaxKind.CommaListExpression;
          elements: NodeArray<Expression>;
      }
      export interface EmptyStatement extends Statement {
          kind: SyntaxKind.EmptyStatement;
      }
      export interface DebuggerStatement extends Statement {
          kind: SyntaxKind.DebuggerStatement;
      }
      export interface MissingDeclaration extends DeclarationStatement {
          kind: SyntaxKind.MissingDeclaration;
          name?: Identifier;
      }
      export type BlockLike = SourceFile | Block | ModuleBlock | CaseOrDefaultClause;
      export interface Block extends Statement {
          kind: SyntaxKind.Block;
          statements: NodeArray<Statement>;
      }
      export interface VariableStatement extends Statement, JSDocContainer {
          kind: SyntaxKind.VariableStatement;
          declarationList: VariableDeclarationList;
      }
      export interface ExpressionStatement extends Statement, JSDocContainer {
          kind: SyntaxKind.ExpressionStatement;
          expression: Expression;
      }
      export interface IfStatement extends Statement {
          kind: SyntaxKind.IfStatement;
          expression: Expression;
          thenStatement: Statement;
          elseStatement?: Statement;
      }
      export interface IterationStatement extends Statement {
          statement: Statement;
      }
      export interface DoStatement extends IterationStatement {
          kind: SyntaxKind.DoStatement;
          expression: Expression;
      }
      export interface WhileStatement extends IterationStatement {
          kind: SyntaxKind.WhileStatement;
          expression: Expression;
      }
      export type ForInitializer = VariableDeclarationList | Expression;
      export interface ForStatement extends IterationStatement {
          kind: SyntaxKind.ForStatement;
          initializer?: ForInitializer;
          condition?: Expression;
          incrementor?: Expression;
      }
      export type ForInOrOfStatement = ForInStatement | ForOfStatement;
      export interface ForInStatement extends IterationStatement {
          kind: SyntaxKind.ForInStatement;
          initializer: ForInitializer;
          expression: Expression;
      }
      export interface ForOfStatement extends IterationStatement {
          kind: SyntaxKind.ForOfStatement;
          awaitModifier?: AwaitKeywordToken;
          initializer: ForInitializer;
          expression: Expression;
      }
      export interface BreakStatement extends Statement {
          kind: SyntaxKind.BreakStatement;
          label?: Identifier;
      }
      export interface ContinueStatement extends Statement {
          kind: SyntaxKind.ContinueStatement;
          label?: Identifier;
      }
      export type BreakOrContinueStatement = BreakStatement | ContinueStatement;
      export interface ReturnStatement extends Statement {
          kind: SyntaxKind.ReturnStatement;
          expression?: Expression;
      }
      export interface WithStatement extends Statement {
          kind: SyntaxKind.WithStatement;
          expression: Expression;
          statement: Statement;
      }
      export interface SwitchStatement extends Statement {
          kind: SyntaxKind.SwitchStatement;
          expression: Expression;
          caseBlock: CaseBlock;
          possiblyExhaustive?: boolean;
      }
      export interface CaseBlock extends Node {
          kind: SyntaxKind.CaseBlock;
          parent: SwitchStatement;
          clauses: NodeArray<CaseOrDefaultClause>;
      }
      export interface CaseClause extends Node {
          kind: SyntaxKind.CaseClause;
          parent: CaseBlock;
          expression: Expression;
          statements: NodeArray<Statement>;
      }
      export interface DefaultClause extends Node {
          kind: SyntaxKind.DefaultClause;
          parent: CaseBlock;
          statements: NodeArray<Statement>;
      }
      export type CaseOrDefaultClause = CaseClause | DefaultClause;
      export interface LabeledStatement extends Statement, JSDocContainer {
          kind: SyntaxKind.LabeledStatement;
          label: Identifier;
          statement: Statement;
      }
      export interface ThrowStatement extends Statement {
          kind: SyntaxKind.ThrowStatement;
          expression?: Expression;
      }
      export interface TryStatement extends Statement {
          kind: SyntaxKind.TryStatement;
          tryBlock: Block;
          catchClause?: CatchClause;
          finallyBlock?: Block;
      }
      export interface CatchClause extends Node {
          kind: SyntaxKind.CatchClause;
          parent: TryStatement;
          variableDeclaration?: VariableDeclaration;
          block: Block;
      }
      export type ObjectTypeDeclaration = ClassLikeDeclaration | InterfaceDeclaration | TypeLiteralNode;
      export type DeclarationWithTypeParameters = DeclarationWithTypeParameterChildren | JSDocTypedefTag | JSDocCallbackTag | JSDocSignature;
      export type DeclarationWithTypeParameterChildren = SignatureDeclaration | ClassLikeDeclaration | InterfaceDeclaration | TypeAliasDeclaration | JSDocTemplateTag;
      export interface ClassLikeDeclarationBase extends NamedDeclaration, JSDocContainer {
          kind: SyntaxKind.ClassDeclaration | SyntaxKind.ClassExpression;
          name?: Identifier;
          typeParameters?: NodeArray<TypeParameterDeclaration>;
          heritageClauses?: NodeArray<HeritageClause>;
          members: NodeArray<ClassElement>;
      }
      export interface ClassDeclaration extends ClassLikeDeclarationBase, DeclarationStatement {
          kind: SyntaxKind.ClassDeclaration;
          /** May be undefined in `export default class { ... }`. */
          name?: Identifier;
      }
      export interface ClassExpression extends ClassLikeDeclarationBase, PrimaryExpression {
          kind: SyntaxKind.ClassExpression;
      }
      export type ClassLikeDeclaration = ClassDeclaration | ClassExpression;
      export interface ClassElement extends NamedDeclaration {
          _classElementBrand: any;
          name?: PropertyName;
      }
      export interface TypeElement extends NamedDeclaration {
          _typeElementBrand: any;
          name?: PropertyName;
          questionToken?: QuestionToken;
      }
      export interface InterfaceDeclaration extends DeclarationStatement, JSDocContainer {
          kind: SyntaxKind.InterfaceDeclaration;
          name: Identifier;
          typeParameters?: NodeArray<TypeParameterDeclaration>;
          heritageClauses?: NodeArray<HeritageClause>;
          members: NodeArray<TypeElement>;
      }
      export interface HeritageClause extends Node {
          kind: SyntaxKind.HeritageClause;
          parent: InterfaceDeclaration | ClassLikeDeclaration;
          token: SyntaxKind.ExtendsKeyword | SyntaxKind.ImplementsKeyword;
          types: NodeArray<ExpressionWithTypeArguments>;
      }
      export interface TypeAliasDeclaration extends DeclarationStatement, JSDocContainer {
          kind: SyntaxKind.TypeAliasDeclaration;
          name: Identifier;
          typeParameters?: NodeArray<TypeParameterDeclaration>;
          type: TypeNode;
      }
      export interface EnumMember extends NamedDeclaration, JSDocContainer {
          kind: SyntaxKind.EnumMember;
          parent: EnumDeclaration;
          name: PropertyName;
          initializer?: Expression;
      }
      export interface EnumDeclaration extends DeclarationStatement, JSDocContainer {
          kind: SyntaxKind.EnumDeclaration;
          name: Identifier;
          members: NodeArray<EnumMember>;
      }
      export type ModuleName = Identifier | StringLiteral;
      export type ModuleBody = NamespaceBody | JSDocNamespaceBody;
      export interface ModuleDeclaration extends DeclarationStatement, JSDocContainer {
          kind: SyntaxKind.ModuleDeclaration;
          parent: ModuleBody | SourceFile;
          name: ModuleName;
          body?: ModuleBody | JSDocNamespaceDeclaration;
      }
      export type NamespaceBody = ModuleBlock | NamespaceDeclaration;
      export interface NamespaceDeclaration extends ModuleDeclaration {
          name: Identifier;
          body: NamespaceBody;
      }
      export type JSDocNamespaceBody = Identifier | JSDocNamespaceDeclaration;
      export interface JSDocNamespaceDeclaration extends ModuleDeclaration {
          name: Identifier;
          body?: JSDocNamespaceBody;
      }
      export interface ModuleBlock extends Node, Statement {
          kind: SyntaxKind.ModuleBlock;
          parent: ModuleDeclaration;
          statements: NodeArray<Statement>;
      }
      export type ModuleReference = EntityName | ExternalModuleReference;
      /**
       * One of:
       * - import x = require("mod");
       * - import x = M.x;
       */
      export interface ImportEqualsDeclaration extends DeclarationStatement, JSDocContainer {
          kind: SyntaxKind.ImportEqualsDeclaration;
          parent: SourceFile | ModuleBlock;
          name: Identifier;
          moduleReference: ModuleReference;
      }
      export interface ExternalModuleReference extends Node {
          kind: SyntaxKind.ExternalModuleReference;
          parent: ImportEqualsDeclaration;
          expression: Expression;
      }
      export interface ImportDeclaration extends Statement {
          kind: SyntaxKind.ImportDeclaration;
          parent: SourceFile | ModuleBlock;
          importClause?: ImportClause;
          /** If this is not a StringLiteral it will be a grammar error. */
          moduleSpecifier: Expression;
      }
      export type NamedImportBindings = NamespaceImport | NamedImports;
      export type NamedExportBindings = NamespaceExport | NamedExports;
      export interface ImportClause extends NamedDeclaration {
          kind: SyntaxKind.ImportClause;
          parent: ImportDeclaration;
          isTypeOnly: boolean;
          name?: Identifier;
          namedBindings?: NamedImportBindings;
      }
      export interface NamespaceImport extends NamedDeclaration {
          kind: SyntaxKind.NamespaceImport;
          parent: ImportClause;
          name: Identifier;
      }
      export interface NamespaceExport extends NamedDeclaration {
          kind: SyntaxKind.NamespaceExport;
          parent: ExportDeclaration;
          name: Identifier;
      }
      export interface NamespaceExportDeclaration extends DeclarationStatement {
          kind: SyntaxKind.NamespaceExportDeclaration;
          name: Identifier;
      }
      export interface ExportDeclaration extends DeclarationStatement, JSDocContainer {
          kind: SyntaxKind.ExportDeclaration;
          parent: SourceFile | ModuleBlock;
          isTypeOnly: boolean;
          /** Will not be assigned in the case of `export * from "foo";` */
          exportClause?: NamedExportBindings;
          /** If this is not a StringLiteral it will be a grammar error. */
          moduleSpecifier?: Expression;
      }
      export interface NamedImports extends Node {
          kind: SyntaxKind.NamedImports;
          parent: ImportClause;
          elements: NodeArray<ImportSpecifier>;
      }
      export interface NamedExports extends Node {
          kind: SyntaxKind.NamedExports;
          parent: ExportDeclaration;
          elements: NodeArray<ExportSpecifier>;
      }
      export type NamedImportsOrExports = NamedImports | NamedExports;
      export interface ImportSpecifier extends NamedDeclaration {
          kind: SyntaxKind.ImportSpecifier;
          parent: NamedImports;
          propertyName?: Identifier;
          name: Identifier;
      }
      export interface ExportSpecifier extends NamedDeclaration {
          kind: SyntaxKind.ExportSpecifier;
          parent: NamedExports;
          propertyName?: Identifier;
          name: Identifier;
      }
      export type ImportOrExportSpecifier = ImportSpecifier | ExportSpecifier;
      export type TypeOnlyCompatibleAliasDeclaration = ImportClause | NamespaceImport | ImportOrExportSpecifier;
      /**
       * This is either an `export =` or an `export default` declaration.
       * Unless `isExportEquals` is set, this node was parsed as an `export default`.
       */
      export interface ExportAssignment extends DeclarationStatement {
          kind: SyntaxKind.ExportAssignment;
          parent: SourceFile;
          isExportEquals?: boolean;
          expression: Expression;
      }
      export interface FileReference extends TextRange {
          fileName: string;
      }
      export interface CheckJsDirective extends TextRange {
          enabled: boolean;
      }
      export type CommentKind = SyntaxKind.SingleLineCommentTrivia | SyntaxKind.MultiLineCommentTrivia;
      export interface CommentRange extends TextRange {
          hasTrailingNewLine?: boolean;
          kind: CommentKind;
      }
      export interface SynthesizedComment extends CommentRange {
          text: string;
          pos: -1;
          end: -1;
      }
      export interface JSDocTypeExpression extends TypeNode {
          kind: SyntaxKind.JSDocTypeExpression;
          type: TypeNode;
      }
      export interface JSDocType extends TypeNode {
          _jsDocTypeBrand: any;
      }
      export interface JSDocAllType extends JSDocType {
          kind: SyntaxKind.JSDocAllType;
      }
      export interface JSDocUnknownType extends JSDocType {
          kind: SyntaxKind.JSDocUnknownType;
      }
      export interface JSDocNonNullableType extends JSDocType {
          kind: SyntaxKind.JSDocNonNullableType;
          type: TypeNode;
      }
      export interface JSDocNullableType extends JSDocType {
          kind: SyntaxKind.JSDocNullableType;
          type: TypeNode;
      }
      export interface JSDocOptionalType extends JSDocType {
          kind: SyntaxKind.JSDocOptionalType;
          type: TypeNode;
      }
      export interface JSDocFunctionType extends JSDocType, SignatureDeclarationBase {
          kind: SyntaxKind.JSDocFunctionType;
      }
      export interface JSDocVariadicType extends JSDocType {
          kind: SyntaxKind.JSDocVariadicType;
          type: TypeNode;
      }
      export interface JSDocNamepathType extends JSDocType {
          kind: SyntaxKind.JSDocNamepathType;
          type: TypeNode;
      }
      export type JSDocTypeReferencingNode = JSDocVariadicType | JSDocOptionalType | JSDocNullableType | JSDocNonNullableType;
      export interface JSDoc extends Node {
          kind: SyntaxKind.JSDocComment;
          parent: HasJSDoc;
          tags?: NodeArray<JSDocTag>;
          comment?: string;
      }
      export interface JSDocTag extends Node {
          parent: JSDoc | JSDocTypeLiteral;
          tagName: Identifier;
          comment?: string;
      }
      export interface JSDocUnknownTag extends JSDocTag {
          kind: SyntaxKind.JSDocTag;
      }
      /**
       * Note that `@extends` is a synonym of `@augments`.
       * Both tags are represented by this interface.
       */
      export interface JSDocAugmentsTag extends JSDocTag {
          kind: SyntaxKind.JSDocAugmentsTag;
          class: ExpressionWithTypeArguments & {
              expression: Identifier | PropertyAccessEntityNameExpression;
          };
      }
      export interface JSDocImplementsTag extends JSDocTag {
          kind: SyntaxKind.JSDocImplementsTag;
          class: ExpressionWithTypeArguments & {
              expression: Identifier | PropertyAccessEntityNameExpression;
          };
      }
      export interface JSDocAuthorTag extends JSDocTag {
          kind: SyntaxKind.JSDocAuthorTag;
      }
      export interface JSDocClassTag extends JSDocTag {
          kind: SyntaxKind.JSDocClassTag;
      }
      export interface JSDocPublicTag extends JSDocTag {
          kind: SyntaxKind.JSDocPublicTag;
      }
      export interface JSDocPrivateTag extends JSDocTag {
          kind: SyntaxKind.JSDocPrivateTag;
      }
      export interface JSDocProtectedTag extends JSDocTag {
          kind: SyntaxKind.JSDocProtectedTag;
      }
      export interface JSDocReadonlyTag extends JSDocTag {
          kind: SyntaxKind.JSDocReadonlyTag;
      }
      export interface JSDocEnumTag extends JSDocTag, Declaration {
          parent: JSDoc;
          kind: SyntaxKind.JSDocEnumTag;
          typeExpression?: JSDocTypeExpression;
      }
      export interface JSDocThisTag extends JSDocTag {
          kind: SyntaxKind.JSDocThisTag;
          typeExpression?: JSDocTypeExpression;
      }
      export interface JSDocTemplateTag extends JSDocTag {
          kind: SyntaxKind.JSDocTemplateTag;
          constraint: JSDocTypeExpression | undefined;
          typeParameters: NodeArray<TypeParameterDeclaration>;
      }
      export interface JSDocReturnTag extends JSDocTag {
          kind: SyntaxKind.JSDocReturnTag;
          typeExpression?: JSDocTypeExpression;
      }
      export interface JSDocTypeTag extends JSDocTag {
          kind: SyntaxKind.JSDocTypeTag;
          typeExpression: JSDocTypeExpression;
      }
      export interface JSDocTypedefTag extends JSDocTag, NamedDeclaration {
          parent: JSDoc;
          kind: SyntaxKind.JSDocTypedefTag;
          fullName?: JSDocNamespaceDeclaration | Identifier;
          name?: Identifier;
          typeExpression?: JSDocTypeExpression | JSDocTypeLiteral;
      }
      export interface JSDocCallbackTag extends JSDocTag, NamedDeclaration {
          parent: JSDoc;
          kind: SyntaxKind.JSDocCallbackTag;
          fullName?: JSDocNamespaceDeclaration | Identifier;
          name?: Identifier;
          typeExpression: JSDocSignature;
      }
      export interface JSDocSignature extends JSDocType, Declaration {
          kind: SyntaxKind.JSDocSignature;
          typeParameters?: readonly JSDocTemplateTag[];
          parameters: readonly JSDocParameterTag[];
          type: JSDocReturnTag | undefined;
      }
      export interface JSDocPropertyLikeTag extends JSDocTag, Declaration {
          parent: JSDoc;
          name: EntityName;
          typeExpression?: JSDocTypeExpression;
          /** Whether the property name came before the type -- non-standard for JSDoc, but Typescript-like */
          isNameFirst: boolean;
          isBracketed: boolean;
      }
      export interface JSDocPropertyTag extends JSDocPropertyLikeTag {
          kind: SyntaxKind.JSDocPropertyTag;
      }
      export interface JSDocParameterTag extends JSDocPropertyLikeTag {
          kind: SyntaxKind.JSDocParameterTag;
      }
      export interface JSDocTypeLiteral extends JSDocType {
          kind: SyntaxKind.JSDocTypeLiteral;
          jsDocPropertyTags?: readonly JSDocPropertyLikeTag[];
          /** If true, then this type literal represents an *array* of its type. */
          isArrayType?: boolean;
      }
      export enum FlowFlags {
          Unreachable = 1,
          Start = 2,
          BranchLabel = 4,
          LoopLabel = 8,
          Assignment = 16,
          TrueCondition = 32,
          FalseCondition = 64,
          SwitchClause = 128,
          ArrayMutation = 256,
          Call = 512,
          ReduceLabel = 1024,
          Referenced = 2048,
          Shared = 4096,
          Label = 12,
          Condition = 96
      }
      export type FlowNode = AfterFinallyFlow | PreFinallyFlow | FlowStart | FlowLabel | FlowAssignment | FlowCall | FlowCondition | FlowSwitchClause | FlowArrayMutation;
      export interface FlowNodeBase {
          flags: FlowFlags;
          id?: number;
      }
      export interface FlowLock {
          locked?: boolean;
      }
      export interface AfterFinallyFlow extends FlowNodeBase, FlowLock {
          antecedent: FlowNode;
      }
      export interface PreFinallyFlow extends FlowNodeBase {
          antecedent: FlowNode;
          lock: FlowLock;
      }
      export interface FlowStart extends FlowNodeBase {
          node?: FunctionExpression | ArrowFunction | MethodDeclaration;
      }
      export interface FlowLabel extends FlowNodeBase {
          antecedents: FlowNode[] | undefined;
      }
      export interface FlowAssignment extends FlowNodeBase {
          node: Expression | VariableDeclaration | BindingElement;
          antecedent: FlowNode;
      }
      export interface FlowCall extends FlowNodeBase {
          node: CallExpression;
          antecedent: FlowNode;
      }
      export interface FlowCondition extends FlowNodeBase {
          node: Expression;
          antecedent: FlowNode;
      }
      export interface FlowSwitchClause extends FlowNodeBase {
          switchStatement: SwitchStatement;
          clauseStart: number;
          clauseEnd: number;
          antecedent: FlowNode;
      }
      export interface FlowArrayMutation extends FlowNodeBase {
          node: CallExpression | BinaryExpression;
          antecedent: FlowNode;
      }
      export interface FlowReduceLabel extends FlowNodeBase {
          target: FlowLabel;
          antecedents: FlowNode[];
          antecedent: FlowNode;
      }
      export type FlowType = Type | IncompleteType;
      export interface IncompleteType {
          flags: TypeFlags;
          type: Type;
      }
      export interface AmdDependency {
          path: string;
          name?: string;
      }
      export interface SourceFile extends Declaration {
          kind: SyntaxKind.SourceFile;
          statements: NodeArray<Statement>;
          endOfFileToken: Token<SyntaxKind.EndOfFileToken>;
          fileName: string;
          text: string;
          amdDependencies: readonly AmdDependency[];
          moduleName?: string;
          referencedFiles: readonly FileReference[];
          typeReferenceDirectives: readonly FileReference[];
          libReferenceDirectives: readonly FileReference[];
          languageVariant: LanguageVariant;
          isDeclarationFile: boolean;
          /**
           * lib.d.ts should have a reference comment like
           *
           *  /// <reference no-default-lib="true"/>
           *
           * If any other file has this comment, it signals not to include lib.d.ts
           * because this containing file is intended to act as a default library.
           */
          hasNoDefaultLib: boolean;
          languageVersion: ScriptTarget;
      }
      export interface Bundle extends Node {
          kind: SyntaxKind.Bundle;
          prepends: readonly (InputFiles | UnparsedSource)[];
          sourceFiles: readonly SourceFile[];
      }
      export interface InputFiles extends Node {
          kind: SyntaxKind.InputFiles;
          javascriptPath?: string;
          javascriptText: string;
          javascriptMapPath?: string;
          javascriptMapText?: string;
          declarationPath?: string;
          declarationText: string;
          declarationMapPath?: string;
          declarationMapText?: string;
      }
      export interface UnparsedSource extends Node {
          kind: SyntaxKind.UnparsedSource;
          fileName: string;
          text: string;
          prologues: readonly UnparsedPrologue[];
          helpers: readonly UnscopedEmitHelper[] | undefined;
          referencedFiles: readonly FileReference[];
          typeReferenceDirectives: readonly string[] | undefined;
          libReferenceDirectives: readonly FileReference[];
          hasNoDefaultLib?: boolean;
          sourceMapPath?: string;
          sourceMapText?: string;
          syntheticReferences?: readonly UnparsedSyntheticReference[];
          texts: readonly UnparsedSourceText[];
      }
      export type UnparsedSourceText = UnparsedPrepend | UnparsedTextLike;
      export type UnparsedNode = UnparsedPrologue | UnparsedSourceText | UnparsedSyntheticReference;
      export interface UnparsedSection extends Node {
          kind: SyntaxKind;
          data?: string;
          parent: UnparsedSource;
      }
      export interface UnparsedPrologue extends UnparsedSection {
          kind: SyntaxKind.UnparsedPrologue;
          data: string;
          parent: UnparsedSource;
      }
      export interface UnparsedPrepend extends UnparsedSection {
          kind: SyntaxKind.UnparsedPrepend;
          data: string;
          parent: UnparsedSource;
          texts: readonly UnparsedTextLike[];
      }
      export interface UnparsedTextLike extends UnparsedSection {
          kind: SyntaxKind.UnparsedText | SyntaxKind.UnparsedInternalText;
          parent: UnparsedSource;
      }
      export interface UnparsedSyntheticReference extends UnparsedSection {
          kind: SyntaxKind.UnparsedSyntheticReference;
          parent: UnparsedSource;
      }
      export interface JsonSourceFile extends SourceFile {
          statements: NodeArray<JsonObjectExpressionStatement>;
      }
      export interface TsConfigSourceFile extends JsonSourceFile {
          extendedSourceFiles?: string[];
      }
      export interface JsonMinusNumericLiteral extends PrefixUnaryExpression {
          kind: SyntaxKind.PrefixUnaryExpression;
          operator: SyntaxKind.MinusToken;
          operand: NumericLiteral;
      }
      export interface JsonObjectExpressionStatement extends ExpressionStatement {
          expression: ObjectLiteralExpression | ArrayLiteralExpression | JsonMinusNumericLiteral | NumericLiteral | StringLiteral | BooleanLiteral | NullLiteral;
      }
      export interface ScriptReferenceHost {
          getCompilerOptions(): CompilerOptions;
          getSourceFile(fileName: string): SourceFile | undefined;
          getSourceFileByPath(path: Path): SourceFile | undefined;
          getCurrentDirectory(): string;
      }
      export interface ParseConfigHost {
          useCaseSensitiveFileNames: boolean;
          readDirectory(rootDir: string, extensions: readonly string[], excludes: readonly string[] | undefined, includes: readonly string[], depth?: number): readonly string[];
          /**
           * Gets a value indicating whether the specified path exists and is a file.
           * @param path The path to test.
           */
          fileExists(path: string): boolean;
          readFile(path: string): string | undefined;
          trace?(s: string): void;
      }
      /**
       * Branded string for keeping track of when we've turned an ambiguous path
       * specified like "./blah" to an absolute path to an actual
       * tsconfig file, e.g. "/root/blah/tsconfig.json"
       */
      export type ResolvedConfigFileName = string & {
          _isResolvedConfigFileName: never;
      };
      export type WriteFileCallback = (fileName: string, data: string, writeByteOrderMark: boolean, onError?: (message: string) => void, sourceFiles?: readonly SourceFile[]) => void;
      export class OperationCanceledException {
      }
      export interface CancellationToken {
          isCancellationRequested(): boolean;
          /** @throws OperationCanceledException if isCancellationRequested is true */
          throwIfCancellationRequested(): void;
      }
      export interface Program extends ScriptReferenceHost {
          getCurrentDirectory(): string;
          /**
           * Get a list of root file names that were passed to a 'createProgram'
           */
          getRootFileNames(): readonly string[];
          /**
           * Get a list of files in the program
           */
          getSourceFiles(): readonly SourceFile[];
          /**
           * Emits the JavaScript and declaration files.  If targetSourceFile is not specified, then
           * the JavaScript and declaration files will be produced for all the files in this program.
           * If targetSourceFile is specified, then only the JavaScript and declaration for that
           * specific file will be generated.
           *
           * If writeFile is not specified then the writeFile callback from the compiler host will be
           * used for writing the JavaScript and declaration files.  Otherwise, the writeFile parameter
           * will be invoked when writing the JavaScript and declaration files.
           */
          emit(targetSourceFile?: SourceFile, writeFile?: WriteFileCallback, cancellationToken?: CancellationToken, emitOnlyDtsFiles?: boolean, customTransformers?: CustomTransformers): EmitResult;
          getOptionsDiagnostics(cancellationToken?: CancellationToken): readonly Diagnostic[];
          getGlobalDiagnostics(cancellationToken?: CancellationToken): readonly Diagnostic[];
          getSyntacticDiagnostics(sourceFile?: SourceFile, cancellationToken?: CancellationToken): readonly DiagnosticWithLocation[];
          /** The first time this is called, it will return global diagnostics (no location). */
          getSemanticDiagnostics(sourceFile?: SourceFile, cancellationToken?: CancellationToken): readonly Diagnostic[];
          getDeclarationDiagnostics(sourceFile?: SourceFile, cancellationToken?: CancellationToken): readonly DiagnosticWithLocation[];
          getConfigFileParsingDiagnostics(): readonly Diagnostic[];
          /**
           * Gets a type checker that can be used to semantically analyze source files in the program.
           */
          getTypeChecker(): TypeChecker;
          getNodeCount(): number;
          getIdentifierCount(): number;
          getSymbolCount(): number;
          getTypeCount(): number;
          getInstantiationCount(): number;
          getRelationCacheSizes(): {
              assignable: number;
              identity: number;
              subtype: number;
              strictSubtype: number;
          };
          isSourceFileFromExternalLibrary(file: SourceFile): boolean;
          isSourceFileDefaultLibrary(file: SourceFile): boolean;
          getProjectReferences(): readonly ProjectReference[] | undefined;
          getResolvedProjectReferences(): readonly (ResolvedProjectReference | undefined)[] | undefined;
      }
      export interface ResolvedProjectReference {
          commandLine: ParsedCommandLine;
          sourceFile: SourceFile;
          references?: readonly (ResolvedProjectReference | undefined)[];
      }
      export type CustomTransformerFactory = (context: TransformationContext) => CustomTransformer;
      export interface CustomTransformer {
          transformSourceFile(node: SourceFile): SourceFile;
          transformBundle(node: Bundle): Bundle;
      }
      export interface CustomTransformers {
          /** Custom transformers to evaluate before built-in .js transformations. */
          before?: (TransformerFactory<SourceFile> | CustomTransformerFactory)[];
          /** Custom transformers to evaluate after built-in .js transformations. */
          after?: (TransformerFactory<SourceFile> | CustomTransformerFactory)[];
          /** Custom transformers to evaluate after built-in .d.ts transformations. */
          afterDeclarations?: (TransformerFactory<Bundle | SourceFile> | CustomTransformerFactory)[];
      }
      export interface SourceMapSpan {
          /** Line number in the .js file. */
          emittedLine: number;
          /** Column number in the .js file. */
          emittedColumn: number;
          /** Line number in the .ts file. */
          sourceLine: number;
          /** Column number in the .ts file. */
          sourceColumn: number;
          /** Optional name (index into names array) associated with this span. */
          nameIndex?: number;
          /** .ts file (index into sources array) associated with this span */
          sourceIndex: number;
      }
      /** Return code used by getEmitOutput function to indicate status of the function */
      export enum ExitStatus {
          Success = 0,
          DiagnosticsPresent_OutputsSkipped = 1,
          DiagnosticsPresent_OutputsGenerated = 2,
          InvalidProject_OutputsSkipped = 3,
          ProjectReferenceCycle_OutputsSkipped = 4,
          /** @deprecated Use ProjectReferenceCycle_OutputsSkipped instead. */
          ProjectReferenceCycle_OutputsSkupped = 4
      }
      export interface EmitResult {
          emitSkipped: boolean;
          /** Contains declaration emit diagnostics */
          diagnostics: readonly Diagnostic[];
          emittedFiles?: string[];
      }
      export interface TypeChecker {
          getTypeOfSymbolAtLocation(symbol: Symbol, node: Node): Type;
          getDeclaredTypeOfSymbol(symbol: Symbol): Type;
          getPropertiesOfType(type: Type): Symbol[];
          getPropertyOfType(type: Type, propertyName: string): Symbol | undefined;
          getPrivateIdentifierPropertyOfType(leftType: Type, name: string, location: Node): Symbol | undefined;
          getIndexInfoOfType(type: Type, kind: IndexKind): IndexInfo | undefined;
          getSignaturesOfType(type: Type, kind: SignatureKind): readonly Signature[];
          getIndexTypeOfType(type: Type, kind: IndexKind): Type | undefined;
          getBaseTypes(type: InterfaceType): BaseType[];
          getBaseTypeOfLiteralType(type: Type): Type;
          getWidenedType(type: Type): Type;
          getReturnTypeOfSignature(signature: Signature): Type;
          getNullableType(type: Type, flags: TypeFlags): Type;
          getNonNullableType(type: Type): Type;
          getTypeArguments(type: TypeReference): readonly Type[];
          /** Note that the resulting nodes cannot be checked. */
          typeToTypeNode(type: Type, enclosingDeclaration?: Node, flags?: NodeBuilderFlags): TypeNode | undefined;
          /** Note that the resulting nodes cannot be checked. */
          signatureToSignatureDeclaration(signature: Signature, kind: SyntaxKind, enclosingDeclaration?: Node, flags?: NodeBuilderFlags): (SignatureDeclaration & {
              typeArguments?: NodeArray<TypeNode>;
          }) | undefined;
          /** Note that the resulting nodes cannot be checked. */
          indexInfoToIndexSignatureDeclaration(indexInfo: IndexInfo, kind: IndexKind, enclosingDeclaration?: Node, flags?: NodeBuilderFlags): IndexSignatureDeclaration | undefined;
          /** Note that the resulting nodes cannot be checked. */
          symbolToEntityName(symbol: Symbol, meaning: SymbolFlags, enclosingDeclaration?: Node, flags?: NodeBuilderFlags): EntityName | undefined;
          /** Note that the resulting nodes cannot be checked. */
          symbolToExpression(symbol: Symbol, meaning: SymbolFlags, enclosingDeclaration?: Node, flags?: NodeBuilderFlags): Expression | undefined;
          /** Note that the resulting nodes cannot be checked. */
          symbolToTypeParameterDeclarations(symbol: Symbol, enclosingDeclaration?: Node, flags?: NodeBuilderFlags): NodeArray<TypeParameterDeclaration> | undefined;
          /** Note that the resulting nodes cannot be checked. */
          symbolToParameterDeclaration(symbol: Symbol, enclosingDeclaration?: Node, flags?: NodeBuilderFlags): ParameterDeclaration | undefined;
          /** Note that the resulting nodes cannot be checked. */
          typeParameterToDeclaration(parameter: TypeParameter, enclosingDeclaration?: Node, flags?: NodeBuilderFlags): TypeParameterDeclaration | undefined;
          getSymbolsInScope(location: Node, meaning: SymbolFlags): Symbol[];
          getSymbolAtLocation(node: Node): Symbol | undefined;
          getSymbolsOfParameterPropertyDeclaration(parameter: ParameterDeclaration, parameterName: string): Symbol[];
          /**
           * The function returns the value (local variable) symbol of an identifier in the short-hand property assignment.
           * This is necessary as an identifier in short-hand property assignment can contains two meaning: property name and property value.
           */
          getShorthandAssignmentValueSymbol(location: Node): Symbol | undefined;
          getExportSpecifierLocalTargetSymbol(location: ExportSpecifier): Symbol | undefined;
          /**
           * If a symbol is a local symbol with an associated exported symbol, returns the exported symbol.
           * Otherwise returns its input.
           * For example, at `export type T = number;`:
           *     - `getSymbolAtLocation` at the location `T` will return the exported symbol for `T`.
           *     - But the result of `getSymbolsInScope` will contain the *local* symbol for `T`, not the exported symbol.
           *     - Calling `getExportSymbolOfSymbol` on that local symbol will return the exported symbol.
           */
          getExportSymbolOfSymbol(symbol: Symbol): Symbol;
          getPropertySymbolOfDestructuringAssignment(location: Identifier): Symbol | undefined;
          getTypeOfAssignmentPattern(pattern: AssignmentPattern): Type;
          getTypeAtLocation(node: Node): Type;
          getTypeFromTypeNode(node: TypeNode): Type;
          signatureToString(signature: Signature, enclosingDeclaration?: Node, flags?: TypeFormatFlags, kind?: SignatureKind): string;
          typeToString(type: Type, enclosingDeclaration?: Node, flags?: TypeFormatFlags): string;
          symbolToString(symbol: Symbol, enclosingDeclaration?: Node, meaning?: SymbolFlags, flags?: SymbolFormatFlags): string;
          typePredicateToString(predicate: TypePredicate, enclosingDeclaration?: Node, flags?: TypeFormatFlags): string;
          getFullyQualifiedName(symbol: Symbol): string;
          getAugmentedPropertiesOfType(type: Type): Symbol[];
          getRootSymbols(symbol: Symbol): readonly Symbol[];
          getContextualType(node: Expression): Type | undefined;
          /**
           * returns unknownSignature in the case of an error.
           * returns undefined if the node is not valid.
           * @param argumentCount Apparent number of arguments, passed in case of a possibly incomplete call. This should come from an ArgumentListInfo. See `signatureHelp.ts`.
           */
          getResolvedSignature(node: CallLikeExpression, candidatesOutArray?: Signature[], argumentCount?: number): Signature | undefined;
          getSignatureFromDeclaration(declaration: SignatureDeclaration): Signature | undefined;
          isImplementationOfOverload(node: SignatureDeclaration): boolean | undefined;
          isUndefinedSymbol(symbol: Symbol): boolean;
          isArgumentsSymbol(symbol: Symbol): boolean;
          isUnknownSymbol(symbol: Symbol): boolean;
          getConstantValue(node: EnumMember | PropertyAccessExpression | ElementAccessExpression): string | number | undefined;
          isValidPropertyAccess(node: PropertyAccessExpression | QualifiedName | ImportTypeNode, propertyName: string): boolean;
          /** Follow all aliases to get the original symbol. */
          getAliasedSymbol(symbol: Symbol): Symbol;
          getExportsOfModule(moduleSymbol: Symbol): Symbol[];
          getJsxIntrinsicTagNamesAt(location: Node): Symbol[];
          isOptionalParameter(node: ParameterDeclaration): boolean;
          getAmbientModules(): Symbol[];
          tryGetMemberInModuleExports(memberName: string, moduleSymbol: Symbol): Symbol | undefined;
          getApparentType(type: Type): Type;
          getBaseConstraintOfType(type: Type): Type | undefined;
          getDefaultFromTypeParameter(type: Type): Type | undefined;
          /**
           * Depending on the operation performed, it may be appropriate to throw away the checker
           * if the cancellation token is triggered. Typically, if it is used for error checking
           * and the operation is cancelled, then it should be discarded, otherwise it is safe to keep.
           */
          runWithCancellationToken<T>(token: CancellationToken, cb: (checker: TypeChecker) => T): T;
      }
      export enum NodeBuilderFlags {
          None = 0,
          NoTruncation = 1,
          WriteArrayAsGenericType = 2,
          GenerateNamesForShadowedTypeParams = 4,
          UseStructuralFallback = 8,
          ForbidIndexedAccessSymbolReferences = 16,
          WriteTypeArgumentsOfSignature = 32,
          UseFullyQualifiedType = 64,
          UseOnlyExternalAliasing = 128,
          SuppressAnyReturnType = 256,
          WriteTypeParametersInQualifiedName = 512,
          MultilineObjectLiterals = 1024,
          WriteClassExpressionAsTypeLiteral = 2048,
          UseTypeOfFunction = 4096,
          OmitParameterModifiers = 8192,
          UseAliasDefinedOutsideCurrentScope = 16384,
          UseSingleQuotesForStringLiteralType = 268435456,
          NoTypeReduction = 536870912,
          AllowThisInObjectLiteral = 32768,
          AllowQualifedNameInPlaceOfIdentifier = 65536,
          AllowAnonymousIdentifier = 131072,
          AllowEmptyUnionOrIntersection = 262144,
          AllowEmptyTuple = 524288,
          AllowUniqueESSymbolType = 1048576,
          AllowEmptyIndexInfoType = 2097152,
          AllowNodeModulesRelativePaths = 67108864,
          IgnoreErrors = 70221824,
          InObjectTypeLiteral = 4194304,
          InTypeAlias = 8388608,
          InInitialEntityName = 16777216,
          InReverseMappedType = 33554432
      }
      export enum TypeFormatFlags {
          None = 0,
          NoTruncation = 1,
          WriteArrayAsGenericType = 2,
          UseStructuralFallback = 8,
          WriteTypeArgumentsOfSignature = 32,
          UseFullyQualifiedType = 64,
          SuppressAnyReturnType = 256,
          MultilineObjectLiterals = 1024,
          WriteClassExpressionAsTypeLiteral = 2048,
          UseTypeOfFunction = 4096,
          OmitParameterModifiers = 8192,
          UseAliasDefinedOutsideCurrentScope = 16384,
          UseSingleQuotesForStringLiteralType = 268435456,
          NoTypeReduction = 536870912,
          AllowUniqueESSymbolType = 1048576,
          AddUndefined = 131072,
          WriteArrowStyleSignature = 262144,
          InArrayType = 524288,
          InElementType = 2097152,
          InFirstTypeArgument = 4194304,
          InTypeAlias = 8388608,
          /** @deprecated */ WriteOwnNameForAnyLike = 0,
          NodeBuilderFlagsMask = 814775659
      }
      export enum SymbolFormatFlags {
          None = 0,
          WriteTypeParametersOrArguments = 1,
          UseOnlyExternalAliasing = 2,
          AllowAnyNodeKind = 4,
          UseAliasDefinedOutsideCurrentScope = 8,
      }
      export enum TypePredicateKind {
          This = 0,
          Identifier = 1,
          AssertsThis = 2,
          AssertsIdentifier = 3
      }
      export interface TypePredicateBase {
          kind: TypePredicateKind;
          type: Type | undefined;
      }
      export interface ThisTypePredicate extends TypePredicateBase {
          kind: TypePredicateKind.This;
          parameterName: undefined;
          parameterIndex: undefined;
          type: Type;
      }
      export interface IdentifierTypePredicate extends TypePredicateBase {
          kind: TypePredicateKind.Identifier;
          parameterName: string;
          parameterIndex: number;
          type: Type;
      }
      export interface AssertsThisTypePredicate extends TypePredicateBase {
          kind: TypePredicateKind.AssertsThis;
          parameterName: undefined;
          parameterIndex: undefined;
          type: Type | undefined;
      }
      export interface AssertsIdentifierTypePredicate extends TypePredicateBase {
          kind: TypePredicateKind.AssertsIdentifier;
          parameterName: string;
          parameterIndex: number;
          type: Type | undefined;
      }
      export type TypePredicate = ThisTypePredicate | IdentifierTypePredicate | AssertsThisTypePredicate | AssertsIdentifierTypePredicate;
      export enum SymbolFlags {
          None = 0,
          FunctionScopedVariable = 1,
          BlockScopedVariable = 2,
          Property = 4,
          EnumMember = 8,
          Function = 16,
          Class = 32,
          Interface = 64,
          ConstEnum = 128,
          RegularEnum = 256,
          ValueModule = 512,
          NamespaceModule = 1024,
          TypeLiteral = 2048,
          ObjectLiteral = 4096,
          Method = 8192,
          Constructor = 16384,
          GetAccessor = 32768,
          SetAccessor = 65536,
          Signature = 131072,
          TypeParameter = 262144,
          TypeAlias = 524288,
          ExportValue = 1048576,
          Alias = 2097152,
          Prototype = 4194304,
          ExportStar = 8388608,
          Optional = 16777216,
          Transient = 33554432,
          Assignment = 67108864,
          ModuleExports = 134217728,
          Enum = 384,
          Variable = 3,
          Value = 111551,
          Type = 788968,
          Namespace = 1920,
          Module = 1536,
          Accessor = 98304,
          FunctionScopedVariableExcludes = 111550,
          BlockScopedVariableExcludes = 111551,
          ParameterExcludes = 111551,
          PropertyExcludes = 0,
          EnumMemberExcludes = 900095,
          FunctionExcludes = 110991,
          ClassExcludes = 899503,
          InterfaceExcludes = 788872,
          RegularEnumExcludes = 899327,
          ConstEnumExcludes = 899967,
          ValueModuleExcludes = 110735,
          NamespaceModuleExcludes = 0,
          MethodExcludes = 103359,
          GetAccessorExcludes = 46015,
          SetAccessorExcludes = 78783,
          TypeParameterExcludes = 526824,
          TypeAliasExcludes = 788968,
          AliasExcludes = 2097152,
          ModuleMember = 2623475,
          ExportHasLocal = 944,
          BlockScoped = 418,
          PropertyOrAccessor = 98308,
          ClassMember = 106500,
      }
      export interface Symbol {
          flags: SymbolFlags;
          escapedName: __String;
          declarations: Declaration[];
          valueDeclaration: Declaration;
          members?: SymbolTable;
          exports?: SymbolTable;
          globalExports?: SymbolTable;
      }
      export enum InternalSymbolName {
          Call = "__call",
          Constructor = "__constructor",
          New = "__new",
          Index = "__index",
          ExportStar = "__export",
          Global = "__global",
          Missing = "__missing",
          Type = "__type",
          Object = "__object",
          JSXAttributes = "__jsxAttributes",
          Class = "__class",
          Function = "__function",
          Computed = "__computed",
          Resolving = "__resolving__",
          ExportEquals = "export=",
          Default = "default",
          This = "this"
      }
      /**
       * This represents a string whose leading underscore have been escaped by adding extra leading underscores.
       * The shape of this brand is rather unique compared to others we've used.
       * Instead of just an intersection of a string and an object, it is that union-ed
       * with an intersection of void and an object. This makes it wholly incompatible
       * with a normal string (which is good, it cannot be misused on assignment or on usage),
       * while still being comparable with a normal string via === (also good) and castable from a string.
       */
      export type __String = (string & {
          __escapedIdentifier: void;
      }) | (void & {
          __escapedIdentifier: void;
      }) | InternalSymbolName;
      /** ReadonlyMap where keys are `__String`s. */
      export interface ReadonlyUnderscoreEscapedMap<T> {
          get(key: __String): T | undefined;
          has(key: __String): boolean;
          forEach(action: (value: T, key: __String) => void): void;
          readonly size: number;
          keys(): Iterator<__String>;
          values(): Iterator<T>;
          entries(): Iterator<[__String, T]>;
      }
      /** Map where keys are `__String`s. */
      export interface UnderscoreEscapedMap<T> extends ReadonlyUnderscoreEscapedMap<T> {
          set(key: __String, value: T): this;
          delete(key: __String): boolean;
          clear(): void;
      }
      /** SymbolTable based on ES6 Map interface. */
      export type SymbolTable = UnderscoreEscapedMap<Symbol>;
      export enum TypeFlags {
          Any = 1,
          Unknown = 2,
          String = 4,
          Number = 8,
          Boolean = 16,
          Enum = 32,
          BigInt = 64,
          StringLiteral = 128,
          NumberLiteral = 256,
          BooleanLiteral = 512,
          EnumLiteral = 1024,
          BigIntLiteral = 2048,
          ESSymbol = 4096,
          UniqueESSymbol = 8192,
          Void = 16384,
          Undefined = 32768,
          Null = 65536,
          Never = 131072,
          TypeParameter = 262144,
          Object = 524288,
          Union = 1048576,
          Intersection = 2097152,
          Index = 4194304,
          IndexedAccess = 8388608,
          Conditional = 16777216,
          Substitution = 33554432,
          NonPrimitive = 67108864,
          Literal = 2944,
          Unit = 109440,
          StringOrNumberLiteral = 384,
          PossiblyFalsy = 117724,
          StringLike = 132,
          NumberLike = 296,
          BigIntLike = 2112,
          BooleanLike = 528,
          EnumLike = 1056,
          ESSymbolLike = 12288,
          VoidLike = 49152,
          UnionOrIntersection = 3145728,
          StructuredType = 3670016,
          TypeVariable = 8650752,
          InstantiableNonPrimitive = 58982400,
          InstantiablePrimitive = 4194304,
          Instantiable = 63176704,
          StructuredOrInstantiable = 66846720,
          Narrowable = 133970943,
          NotUnionOrUnit = 67637251,
      }
      export type DestructuringPattern = BindingPattern | ObjectLiteralExpression | ArrayLiteralExpression;
      export interface Type {
          flags: TypeFlags;
          symbol: Symbol;
          pattern?: DestructuringPattern;
          aliasSymbol?: Symbol;
          aliasTypeArguments?: readonly Type[];
      }
      export interface LiteralType extends Type {
          value: string | number | PseudoBigInt;
          freshType: LiteralType;
          regularType: LiteralType;
      }
      export interface UniqueESSymbolType extends Type {
          symbol: Symbol;
          escapedName: __String;
      }
      export interface StringLiteralType extends LiteralType {
          value: string;
      }
      export interface NumberLiteralType extends LiteralType {
          value: number;
      }
      export interface BigIntLiteralType extends LiteralType {
          value: PseudoBigInt;
      }
      export interface EnumType extends Type {
      }
      export enum ObjectFlags {
          Class = 1,
          Interface = 2,
          Reference = 4,
          Tuple = 8,
          Anonymous = 16,
          Mapped = 32,
          Instantiated = 64,
          ObjectLiteral = 128,
          EvolvingArray = 256,
          ObjectLiteralPatternWithComputedProperties = 512,
          ContainsSpread = 1024,
          ReverseMapped = 2048,
          JsxAttributes = 4096,
          MarkerType = 8192,
          JSLiteral = 16384,
          FreshLiteral = 32768,
          ArrayLiteral = 65536,
          ObjectRestType = 131072,
          ClassOrInterface = 3,
      }
      export interface ObjectType extends Type {
          objectFlags: ObjectFlags;
      }
      /** Class and interface types (ObjectFlags.Class and ObjectFlags.Interface). */
      export interface InterfaceType extends ObjectType {
          typeParameters: TypeParameter[] | undefined;
          outerTypeParameters: TypeParameter[] | undefined;
          localTypeParameters: TypeParameter[] | undefined;
          thisType: TypeParameter | undefined;
      }
      export type BaseType = ObjectType | IntersectionType | TypeVariable;
      export interface InterfaceTypeWithDeclaredMembers extends InterfaceType {
          declaredProperties: Symbol[];
          declaredCallSignatures: Signature[];
          declaredConstructSignatures: Signature[];
          declaredStringIndexInfo?: IndexInfo;
          declaredNumberIndexInfo?: IndexInfo;
      }
      /**
       * Type references (ObjectFlags.Reference). When a class or interface has type parameters or
       * a "this" type, references to the class or interface are made using type references. The
       * typeArguments property specifies the types to substitute for the type parameters of the
       * class or interface and optionally includes an extra element that specifies the type to
       * substitute for "this" in the resulting instantiation. When no extra argument is present,
       * the type reference itself is substituted for "this". The typeArguments property is undefined
       * if the class or interface has no type parameters and the reference isn't specifying an
       * explicit "this" argument.
       */
      export interface TypeReference extends ObjectType {
          target: GenericType;
          node?: TypeReferenceNode | ArrayTypeNode | TupleTypeNode;
      }
      export interface DeferredTypeReference extends TypeReference {
      }
      export interface GenericType extends InterfaceType, TypeReference {
      }
      export interface TupleType extends GenericType {
          minLength: number;
          hasRestElement: boolean;
          readonly: boolean;
          associatedNames?: __String[];
      }
      export interface TupleTypeReference extends TypeReference {
          target: TupleType;
      }
      export interface UnionOrIntersectionType extends Type {
          types: Type[];
      }
      export interface UnionType extends UnionOrIntersectionType {
      }
      export interface IntersectionType extends UnionOrIntersectionType {
      }
      export type StructuredType = ObjectType | UnionType | IntersectionType;
      export interface EvolvingArrayType extends ObjectType {
          elementType: Type;
          finalArrayType?: Type;
      }
      export interface InstantiableType extends Type {
      }
      export interface TypeParameter extends InstantiableType {
      }
      export interface IndexedAccessType extends InstantiableType {
          objectType: Type;
          indexType: Type;
          constraint?: Type;
          simplifiedForReading?: Type;
          simplifiedForWriting?: Type;
      }
      export type TypeVariable = TypeParameter | IndexedAccessType;
      export interface IndexType extends InstantiableType {
          type: InstantiableType | UnionOrIntersectionType;
      }
      export interface ConditionalRoot {
          node: ConditionalTypeNode;
          checkType: Type;
          extendsType: Type;
          trueType: Type;
          falseType: Type;
          isDistributive: boolean;
          inferTypeParameters?: TypeParameter[];
          outerTypeParameters?: TypeParameter[];
          instantiations?: Map<Type>;
          aliasSymbol?: Symbol;
          aliasTypeArguments?: Type[];
      }
      export interface ConditionalType extends InstantiableType {
          root: ConditionalRoot;
          checkType: Type;
          extendsType: Type;
          resolvedTrueType: Type;
          resolvedFalseType: Type;
      }
      export interface SubstitutionType extends InstantiableType {
          baseType: Type;
          substitute: Type;
      }
      export enum SignatureKind {
          Call = 0,
          Construct = 1
      }
      export interface Signature {
          declaration?: SignatureDeclaration | JSDocSignature;
          typeParameters?: readonly TypeParameter[];
          parameters: readonly Symbol[];
      }
      export enum IndexKind {
          String = 0,
          Number = 1
      }
      export interface IndexInfo {
          type: Type;
          isReadonly: boolean;
          declaration?: IndexSignatureDeclaration;
      }
      export enum InferencePriority {
          NakedTypeVariable = 1,
          HomomorphicMappedType = 2,
          PartialHomomorphicMappedType = 4,
          MappedTypeConstraint = 8,
          ContravariantConditional = 16,
          ReturnType = 32,
          LiteralKeyof = 64,
          NoConstraints = 128,
          AlwaysStrict = 256,
          MaxValue = 512,
          PriorityImpliesCombination = 104,
          Circularity = -1
      }
      /** @deprecated Use FileExtensionInfo instead. */
      export type JsFileExtensionInfo = FileExtensionInfo;
      export interface FileExtensionInfo {
          extension: string;
          isMixedContent: boolean;
          scriptKind?: ScriptKind;
      }
      export interface DiagnosticMessage {
          key: string;
          category: DiagnosticCategory;
          code: number;
          message: string;
          reportsUnnecessary?: {};
      }
      /**
       * A linked list of formatted diagnostic messages to be used as part of a multiline message.
       * It is built from the bottom up, leaving the head to be the "main" diagnostic.
       * While it seems that DiagnosticMessageChain is structurally similar to DiagnosticMessage,
       * the difference is that messages are all preformatted in DMC.
       */
      export interface DiagnosticMessageChain {
          messageText: string;
          category: DiagnosticCategory;
          code: number;
          next?: DiagnosticMessageChain[];
      }
      export interface Diagnostic extends DiagnosticRelatedInformation {
          /** May store more in future. For now, this will simply be `true` to indicate when a diagnostic is an unused-identifier diagnostic. */
          reportsUnnecessary?: {};
          source?: string;
          relatedInformation?: DiagnosticRelatedInformation[];
      }
      export interface DiagnosticRelatedInformation {
          category: DiagnosticCategory;
          code: number;
          file: SourceFile | undefined;
          start: number | undefined;
          length: number | undefined;
          messageText: string | DiagnosticMessageChain;
      }
      export interface DiagnosticWithLocation extends Diagnostic {
          file: SourceFile;
          start: number;
          length: number;
      }
      export enum DiagnosticCategory {
          Warning = 0,
          Error = 1,
          Suggestion = 2,
          Message = 3
      }
      export enum ModuleResolutionKind {
          Classic = 1,
          NodeJs = 2
      }
      export interface PluginImport {
          name: string;
      }
      export interface ProjectReference {
          /** A normalized path on disk */
          path: string;
          /** The path as the user originally wrote it */
          originalPath?: string;
          /** True if the output of this reference should be prepended to the output of this project. Only valid for --outFile compilations */
          prepend?: boolean;
          /** True if it is intended that this reference form a circularity */
          circular?: boolean;
      }
      export enum WatchFileKind {
          FixedPollingInterval = 0,
          PriorityPollingInterval = 1,
          DynamicPriorityPolling = 2,
          UseFsEvents = 3,
          UseFsEventsOnParentDirectory = 4
      }
      export enum WatchDirectoryKind {
          UseFsEvents = 0,
          FixedPollingInterval = 1,
          DynamicPriorityPolling = 2
      }
      export enum PollingWatchKind {
          FixedInterval = 0,
          PriorityInterval = 1,
          DynamicPriority = 2
      }
      export type CompilerOptionsValue = string | number | boolean | (string | number)[] | string[] | MapLike<string[]> | PluginImport[] | ProjectReference[] | null | undefined;
      export interface CompilerOptions {
          allowJs?: boolean;
          allowSyntheticDefaultImports?: boolean;
          allowUmdGlobalAccess?: boolean;
          allowUnreachableCode?: boolean;
          allowUnusedLabels?: boolean;
          alwaysStrict?: boolean;
          baseUrl?: string;
          charset?: string;
          checkJs?: boolean;
          declaration?: boolean;
          declarationMap?: boolean;
          emitDeclarationOnly?: boolean;
          declarationDir?: string;
          disableSizeLimit?: boolean;
          disableSourceOfProjectReferenceRedirect?: boolean;
          disableSolutionSearching?: boolean;
          downlevelIteration?: boolean;
          emitBOM?: boolean;
          emitDecoratorMetadata?: boolean;
          experimentalDecorators?: boolean;
          forceConsistentCasingInFileNames?: boolean;
          importHelpers?: boolean;
          importsNotUsedAsValues?: ImportsNotUsedAsValues;
          inlineSourceMap?: boolean;
          inlineSources?: boolean;
          isolatedModules?: boolean;
          jsx?: JsxEmit;
          keyofStringsOnly?: boolean;
          lib?: string[];
          locale?: string;
          mapRoot?: string;
          maxNodeModuleJsDepth?: number;
          module?: ModuleKind;
          moduleResolution?: ModuleResolutionKind;
          newLine?: NewLineKind;
          noEmit?: boolean;
          noEmitHelpers?: boolean;
          noEmitOnError?: boolean;
          noErrorTruncation?: boolean;
          noFallthroughCasesInSwitch?: boolean;
          noImplicitAny?: boolean;
          noImplicitReturns?: boolean;
          noImplicitThis?: boolean;
          noStrictGenericChecks?: boolean;
          noUnusedLocals?: boolean;
          noUnusedParameters?: boolean;
          noImplicitUseStrict?: boolean;
          assumeChangesOnlyAffectDirectDependencies?: boolean;
          noLib?: boolean;
          noResolve?: boolean;
          out?: string;
          outDir?: string;
          outFile?: string;
          paths?: MapLike<string[]>;
          preserveConstEnums?: boolean;
          preserveSymlinks?: boolean;
          project?: string;
          reactNamespace?: string;
          jsxFactory?: string;
          composite?: boolean;
          incremental?: boolean;
          tsBuildInfoFile?: string;
          removeComments?: boolean;
          rootDir?: string;
          rootDirs?: string[];
          skipLibCheck?: boolean;
          skipDefaultLibCheck?: boolean;
          sourceMap?: boolean;
          sourceRoot?: string;
          strict?: boolean;
          strictFunctionTypes?: boolean;
          strictBindCallApply?: boolean;
          strictNullChecks?: boolean;
          strictPropertyInitialization?: boolean;
          stripInternal?: boolean;
          suppressExcessPropertyErrors?: boolean;
          suppressImplicitAnyIndexErrors?: boolean;
          target?: ScriptTarget;
          traceResolution?: boolean;
          resolveJsonModule?: boolean;
          types?: string[];
          /** Paths used to compute primary types search locations */
          typeRoots?: string[];
          esModuleInterop?: boolean;
          useDefineForClassFields?: boolean;
          [option: string]: CompilerOptionsValue | TsConfigSourceFile | undefined;
      }
      export interface WatchOptions {
          watchFile?: WatchFileKind;
          watchDirectory?: WatchDirectoryKind;
          fallbackPolling?: PollingWatchKind;
          synchronousWatchDirectory?: boolean;
          [option: string]: CompilerOptionsValue | undefined;
      }
      export interface TypeAcquisition {
          /**
           * @deprecated typingOptions.enableAutoDiscovery
           * Use typeAcquisition.enable instead.
           */
          enableAutoDiscovery?: boolean;
          enable?: boolean;
          include?: string[];
          exclude?: string[];
          [option: string]: string[] | boolean | undefined;
      }
      export enum ModuleKind {
          None = 0,
          CommonJS = 1,
          AMD = 2,
          UMD = 3,
          System = 4,
          ES2015 = 5,
          ES2020 = 6,
          ESNext = 99
      }
      export enum JsxEmit {
          None = 0,
          Preserve = 1,
          React = 2,
          ReactNative = 3
      }
      export enum ImportsNotUsedAsValues {
          Remove = 0,
          Preserve = 1,
          Error = 2
      }
      export enum NewLineKind {
          CarriageReturnLineFeed = 0,
          LineFeed = 1
      }
      export interface LineAndCharacter {
          /** 0-based. */
          line: number;
          character: number;
      }
      export enum ScriptKind {
          Unknown = 0,
          JS = 1,
          JSX = 2,
          TS = 3,
          TSX = 4,
          External = 5,
          JSON = 6,
          /**
           * Used on extensions that doesn't define the ScriptKind but the content defines it.
           * Deferred extensions are going to be included in all project contexts.
           */
          Deferred = 7
      }
      export enum ScriptTarget {
          ES3 = 0,
          ES5 = 1,
          ES2015 = 2,
          ES2016 = 3,
          ES2017 = 4,
          ES2018 = 5,
          ES2019 = 6,
          ES2020 = 7,
          ESNext = 99,
          JSON = 100,
          Latest = 99
      }
      export enum LanguageVariant {
          Standard = 0,
          JSX = 1
      }
      /** Either a parsed command line or a parsed tsconfig.json */
      export interface ParsedCommandLine {
          options: CompilerOptions;
          typeAcquisition?: TypeAcquisition;
          fileNames: string[];
          projectReferences?: readonly ProjectReference[];
          watchOptions?: WatchOptions;
          raw?: any;
          errors: Diagnostic[];
          wildcardDirectories?: MapLike<WatchDirectoryFlags>;
          compileOnSave?: boolean;
      }
      export enum WatchDirectoryFlags {
          None = 0,
          Recursive = 1
      }
      export interface ExpandResult {
          fileNames: string[];
          wildcardDirectories: MapLike<WatchDirectoryFlags>;
      }
      export interface CreateProgramOptions {
          rootNames: readonly string[];
          options: CompilerOptions;
          projectReferences?: readonly ProjectReference[];
          host?: CompilerHost;
          oldProgram?: Program;
          configFileParsingDiagnostics?: readonly Diagnostic[];
      }
      export interface ModuleResolutionHost {
          fileExists(fileName: string): boolean;
          readFile(fileName: string): string | undefined;
          trace?(s: string): void;
          directoryExists?(directoryName: string): boolean;
          /**
           * Resolve a symbolic link.
           * @see https://nodejs.org/api/fs.html#fs_fs_realpathsync_path_options
           */
          realpath?(path: string): string;
          getCurrentDirectory?(): string;
          getDirectories?(path: string): string[];
      }
      /**
       * Represents the result of module resolution.
       * Module resolution will pick up tsx/jsx/js files even if '--jsx' and '--allowJs' are turned off.
       * The Program will then filter results based on these flags.
       *
       * Prefer to return a `ResolvedModuleFull` so that the file type does not have to be inferred.
       */
      export interface ResolvedModule {
          /** Path of the file the module was resolved to. */
          resolvedFileName: string;
          /** True if `resolvedFileName` comes from `node_modules`. */
          isExternalLibraryImport?: boolean;
      }
      /**
       * ResolvedModule with an explicitly provided `extension` property.
       * Prefer this over `ResolvedModule`.
       * If changing this, remember to change `moduleResolutionIsEqualTo`.
       */
      export interface ResolvedModuleFull extends ResolvedModule {
          /**
           * Extension of resolvedFileName. This must match what's at the end of resolvedFileName.
           * This is optional for backwards-compatibility, but will be added if not provided.
           */
          extension: Extension;
          packageId?: PackageId;
      }
      /**
       * Unique identifier with a package name and version.
       * If changing this, remember to change `packageIdIsEqual`.
       */
      export interface PackageId {
          /**
           * Name of the package.
           * Should not include `@types`.
           * If accessing a non-index file, this should include its name e.g. "foo/bar".
           */
          name: string;
          /**
           * Name of a submodule within this package.
           * May be "".
           */
          subModuleName: string;
          /** Version of the package, e.g. "1.2.3" */
          version: string;
      }
      export enum Extension {
          Ts = ".ts",
          Tsx = ".tsx",
          Dts = ".d.ts",
          Js = ".js",
          Jsx = ".jsx",
          Json = ".json",
          TsBuildInfo = ".tsbuildinfo"
      }
      export interface ResolvedModuleWithFailedLookupLocations {
          readonly resolvedModule: ResolvedModuleFull | undefined;
      }
      export interface ResolvedTypeReferenceDirective {
          primary: boolean;
          resolvedFileName: string | undefined;
          packageId?: PackageId;
          /** True if `resolvedFileName` comes from `node_modules`. */
          isExternalLibraryImport?: boolean;
      }
      export interface ResolvedTypeReferenceDirectiveWithFailedLookupLocations {
          readonly resolvedTypeReferenceDirective: ResolvedTypeReferenceDirective | undefined;
          readonly failedLookupLocations: string[];
      }
      export interface CompilerHost extends ModuleResolutionHost {
          getSourceFile(fileName: string, languageVersion: ScriptTarget, onError?: (message: string) => void, shouldCreateNewSourceFile?: boolean): SourceFile | undefined;
          getSourceFileByPath?(fileName: string, path: Path, languageVersion: ScriptTarget, onError?: (message: string) => void, shouldCreateNewSourceFile?: boolean): SourceFile | undefined;
          getCancellationToken?(): CancellationToken;
          getDefaultLibFileName(options: CompilerOptions): string;
          getDefaultLibLocation?(): string;
          writeFile: WriteFileCallback;
          getCurrentDirectory(): string;
          getCanonicalFileName(fileName: string): string;
          useCaseSensitiveFileNames(): boolean;
          getNewLine(): string;
          readDirectory?(rootDir: string, extensions: readonly string[], excludes: readonly string[] | undefined, includes: readonly string[], depth?: number): string[];
          resolveModuleNames?(moduleNames: string[], containingFile: string, reusedNames: string[] | undefined, redirectedReference: ResolvedProjectReference | undefined, options: CompilerOptions): (ResolvedModule | undefined)[];
          /**
           * This method is a companion for 'resolveModuleNames' and is used to resolve 'types' references to actual type declaration files
           */
          resolveTypeReferenceDirectives?(typeReferenceDirectiveNames: string[], containingFile: string, redirectedReference: ResolvedProjectReference | undefined, options: CompilerOptions): (ResolvedTypeReferenceDirective | undefined)[];
          getEnvironmentVariable?(name: string): string | undefined;
          createHash?(data: string): string;
          getParsedCommandLine?(fileName: string): ParsedCommandLine | undefined;
      }
      export interface SourceMapRange extends TextRange {
          source?: SourceMapSource;
      }
      export interface SourceMapSource {
          fileName: string;
          text: string;
          skipTrivia?: (pos: number) => number;
      }
      export enum EmitFlags {
          None = 0,
          SingleLine = 1,
          AdviseOnEmitNode = 2,
          NoSubstitution = 4,
          CapturesThis = 8,
          NoLeadingSourceMap = 16,
          NoTrailingSourceMap = 32,
          NoSourceMap = 48,
          NoNestedSourceMaps = 64,
          NoTokenLeadingSourceMaps = 128,
          NoTokenTrailingSourceMaps = 256,
          NoTokenSourceMaps = 384,
          NoLeadingComments = 512,
          NoTrailingComments = 1024,
          NoComments = 1536,
          NoNestedComments = 2048,
          HelperName = 4096,
          ExportName = 8192,
          LocalName = 16384,
          InternalName = 32768,
          Indented = 65536,
          NoIndentation = 131072,
          AsyncFunctionBody = 262144,
          ReuseTempVariableScope = 524288,
          CustomPrologue = 1048576,
          NoHoisting = 2097152,
          HasEndOfDeclarationMarker = 4194304,
          Iterator = 8388608,
          NoAsciiEscaping = 16777216,
      }
      export interface EmitHelper {
          readonly name: string;
          readonly scoped: boolean;
          readonly text: string | ((node: EmitHelperUniqueNameCallback) => string);
          readonly priority?: number;
          readonly dependencies?: EmitHelper[];
      }
      export interface UnscopedEmitHelper extends EmitHelper {
          readonly scoped: false;
          readonly text: string;
      }
      export type EmitHelperUniqueNameCallback = (name: string) => string;
      export enum EmitHint {
          SourceFile = 0,
          Expression = 1,
          IdentifierName = 2,
          MappedTypeParameter = 3,
          Unspecified = 4,
          EmbeddedStatement = 5,
          JsxAttributeValue = 6
      }
      export interface TransformationContext {
          /** Gets the compiler options supplied to the transformer. */
          getCompilerOptions(): CompilerOptions;
          /** Starts a new lexical environment. */
          startLexicalEnvironment(): void;
          /** Suspends the current lexical environment, usually after visiting a parameter list. */
          suspendLexicalEnvironment(): void;
          /** Resumes a suspended lexical environment, usually before visiting a function body. */
          resumeLexicalEnvironment(): void;
          /** Ends a lexical environment, returning any declarations. */
          endLexicalEnvironment(): Statement[] | undefined;
          /** Hoists a function declaration to the containing scope. */
          hoistFunctionDeclaration(node: FunctionDeclaration): void;
          /** Hoists a variable declaration to the containing scope. */
          hoistVariableDeclaration(node: Identifier): void;
          /** Records a request for a non-scoped emit helper in the current context. */
          requestEmitHelper(helper: EmitHelper): void;
          /** Gets and resets the requested non-scoped emit helpers. */
          readEmitHelpers(): EmitHelper[] | undefined;
          /** Enables expression substitutions in the pretty printer for the provided SyntaxKind. */
          enableSubstitution(kind: SyntaxKind): void;
          /** Determines whether expression substitutions are enabled for the provided node. */
          isSubstitutionEnabled(node: Node): boolean;
          /**
           * Hook used by transformers to substitute expressions just before they
           * are emitted by the pretty printer.
           *
           * NOTE: Transformation hooks should only be modified during `Transformer` initialization,
           * before returning the `NodeTransformer` callback.
           */
          onSubstituteNode: (hint: EmitHint, node: Node) => Node;
          /**
           * Enables before/after emit notifications in the pretty printer for the provided
           * SyntaxKind.
           */
          enableEmitNotification(kind: SyntaxKind): void;
          /**
           * Determines whether before/after emit notifications should be raised in the pretty
           * printer when it emits a node.
           */
          isEmitNotificationEnabled(node: Node): boolean;
          /**
           * Hook used to allow transformers to capture state before or after
           * the printer emits a node.
           *
           * NOTE: Transformation hooks should only be modified during `Transformer` initialization,
           * before returning the `NodeTransformer` callback.
           */
          onEmitNode: (hint: EmitHint, node: Node, emitCallback: (hint: EmitHint, node: Node) => void) => void;
      }
      export interface TransformationResult<T extends Node> {
          /** Gets the transformed source files. */
          transformed: T[];
          /** Gets diagnostics for the transformation. */
          diagnostics?: DiagnosticWithLocation[];
          /**
           * Gets a substitute for a node, if one is available; otherwise, returns the original node.
           *
           * @param hint A hint as to the intended usage of the node.
           * @param node The node to substitute.
           */
          substituteNode(hint: EmitHint, node: Node): Node;
          /**
           * Emits a node with possible notification.
           *
           * @param hint A hint as to the intended usage of the node.
           * @param node The node to emit.
           * @param emitCallback A callback used to emit the node.
           */
          emitNodeWithNotification(hint: EmitHint, node: Node, emitCallback: (hint: EmitHint, node: Node) => void): void;
          /**
           * Indicates if a given node needs an emit notification
           *
           * @param node The node to emit.
           */
          isEmitNotificationEnabled?(node: Node): boolean;
          /**
           * Clean up EmitNode entries on any parse-tree nodes.
           */
          dispose(): void;
      }
      /**
       * A function that is used to initialize and return a `Transformer` callback, which in turn
       * will be used to transform one or more nodes.
       */
      export type TransformerFactory<T extends Node> = (context: TransformationContext) => Transformer<T>;
      /**
       * A function that transforms a node.
       */
      export type Transformer<T extends Node> = (node: T) => T;
      /**
       * A function that accepts and possibly transforms a node.
       */
      export type Visitor = (node: Node) => VisitResult<Node>;
      export type VisitResult<T extends Node> = T | T[] | undefined;
      export interface Printer {
          /**
           * Print a node and its subtree as-is, without any emit transformations.
           * @param hint A value indicating the purpose of a node. This is primarily used to
           * distinguish between an `Identifier` used in an expression position, versus an
           * `Identifier` used as an `IdentifierName` as part of a declaration. For most nodes you
           * should just pass `Unspecified`.
           * @param node The node to print. The node and its subtree are printed as-is, without any
           * emit transformations.
           * @param sourceFile A source file that provides context for the node. The source text of
           * the file is used to emit the original source content for literals and identifiers, while
           * the identifiers of the source file are used when generating unique names to avoid
           * collisions.
           */
          printNode(hint: EmitHint, node: Node, sourceFile: SourceFile): string;
          /**
           * Prints a list of nodes using the given format flags
           */
          printList<T extends Node>(format: ListFormat, list: NodeArray<T>, sourceFile: SourceFile): string;
          /**
           * Prints a source file as-is, without any emit transformations.
           */
          printFile(sourceFile: SourceFile): string;
          /**
           * Prints a bundle of source files as-is, without any emit transformations.
           */
          printBundle(bundle: Bundle): string;
      }
      export interface PrintHandlers {
          /**
           * A hook used by the Printer when generating unique names to avoid collisions with
           * globally defined names that exist outside of the current source file.
           */
          hasGlobalName?(name: string): boolean;
          /**
           * A hook used by the Printer to provide notifications prior to emitting a node. A
           * compatible implementation **must** invoke `emitCallback` with the provided `hint` and
           * `node` values.
           * @param hint A hint indicating the intended purpose of the node.
           * @param node The node to emit.
           * @param emitCallback A callback that, when invoked, will emit the node.
           * @example
           * ```ts
           * var printer = createPrinter(printerOptions, {
           *   onEmitNode(hint, node, emitCallback) {
           *     // set up or track state prior to emitting the node...
           *     emitCallback(hint, node);
           *     // restore state after emitting the node...
           *   }
           * });
           * ```
           */
          onEmitNode?(hint: EmitHint, node: Node | undefined, emitCallback: (hint: EmitHint, node: Node | undefined) => void): void;
          /**
           * A hook used to check if an emit notification is required for a node.
           * @param node The node to emit.
           */
          isEmitNotificationEnabled?(node: Node | undefined): boolean;
          /**
           * A hook used by the Printer to perform just-in-time substitution of a node. This is
           * primarily used by node transformations that need to substitute one node for another,
           * such as replacing `myExportedVar` with `exports.myExportedVar`.
           * @param hint A hint indicating the intended purpose of the node.
           * @param node The node to emit.
           * @example
           * ```ts
           * var printer = createPrinter(printerOptions, {
           *   substituteNode(hint, node) {
           *     // perform substitution if necessary...
           *     return node;
           *   }
           * });
           * ```
           */
          substituteNode?(hint: EmitHint, node: Node): Node;
      }
      export interface PrinterOptions {
          removeComments?: boolean;
          newLine?: NewLineKind;
          omitTrailingSemicolon?: boolean;
          noEmitHelpers?: boolean;
      }
      export interface GetEffectiveTypeRootsHost {
          directoryExists?(directoryName: string): boolean;
          getCurrentDirectory?(): string;
      }
      export interface TextSpan {
          start: number;
          length: number;
      }
      export interface TextChangeRange {
          span: TextSpan;
          newLength: number;
      }
      export interface SyntaxList extends Node {
          _children: Node[];
      }
      export enum ListFormat {
          None = 0,
          SingleLine = 0,
          MultiLine = 1,
          PreserveLines = 2,
          LinesMask = 3,
          NotDelimited = 0,
          BarDelimited = 4,
          AmpersandDelimited = 8,
          CommaDelimited = 16,
          AsteriskDelimited = 32,
          DelimitersMask = 60,
          AllowTrailingComma = 64,
          Indented = 128,
          SpaceBetweenBraces = 256,
          SpaceBetweenSiblings = 512,
          Braces = 1024,
          Parenthesis = 2048,
          AngleBrackets = 4096,
          SquareBrackets = 8192,
          BracketsMask = 15360,
          OptionalIfUndefined = 16384,
          OptionalIfEmpty = 32768,
          Optional = 49152,
          PreferNewLine = 65536,
          NoTrailingNewLine = 131072,
          NoInterveningComments = 262144,
          NoSpaceIfEmpty = 524288,
          SingleElement = 1048576,
          SpaceAfterList = 2097152,
          Modifiers = 262656,
          HeritageClauses = 512,
          SingleLineTypeLiteralMembers = 768,
          MultiLineTypeLiteralMembers = 32897,
          TupleTypeElements = 528,
          UnionTypeConstituents = 516,
          IntersectionTypeConstituents = 520,
          ObjectBindingPatternElements = 525136,
          ArrayBindingPatternElements = 524880,
          ObjectLiteralExpressionProperties = 526226,
          ArrayLiteralExpressionElements = 8914,
          CommaListElements = 528,
          CallExpressionArguments = 2576,
          NewExpressionArguments = 18960,
          TemplateExpressionSpans = 262144,
          SingleLineBlockStatements = 768,
          MultiLineBlockStatements = 129,
          VariableDeclarationList = 528,
          SingleLineFunctionBodyStatements = 768,
          MultiLineFunctionBodyStatements = 1,
          ClassHeritageClauses = 0,
          ClassMembers = 129,
          InterfaceMembers = 129,
          EnumMembers = 145,
          CaseBlockClauses = 129,
          NamedImportsOrExportsElements = 525136,
          JsxElementOrFragmentChildren = 262144,
          JsxElementAttributes = 262656,
          CaseOrDefaultClauseStatements = 163969,
          HeritageClauseTypes = 528,
          SourceFileStatements = 131073,
          Decorators = 2146305,
          TypeArguments = 53776,
          TypeParameters = 53776,
          Parameters = 2576,
          IndexSignatureParameters = 8848,
          JSDocComment = 33
      }
      export interface UserPreferences {
          readonly disableSuggestions?: boolean;
          readonly quotePreference?: "auto" | "double" | "single";
          readonly includeCompletionsForModuleExports?: boolean;
          readonly includeAutomaticOptionalChainCompletions?: boolean;
          readonly includeCompletionsWithInsertText?: boolean;
          readonly importModuleSpecifierPreference?: "auto" | "relative" | "non-relative";
          /** Determines whether we import `foo/index.ts` as "foo", "foo/index", or "foo/index.js" */
          readonly importModuleSpecifierEnding?: "auto" | "minimal" | "index" | "js";
          readonly allowTextChangesInNewFiles?: boolean;
          readonly providePrefixAndSuffixTextForRename?: boolean;
      }
      /** Represents a bigint literal value without requiring bigint support */
      export interface PseudoBigInt {
          negative: boolean;
          base10Value: string;
      }
      export {};
  }
  declare function setTimeout(handler: (...args: any[]) => void, timeout: number): any;
  declare function clearTimeout(handle: any): void;
  declare namespace ts {
      export enum FileWatcherEventKind {
          Created = 0,
          Changed = 1,
          Deleted = 2
      }
      export type FileWatcherCallback = (fileName: string, eventKind: FileWatcherEventKind) => void;
      export type DirectoryWatcherCallback = (fileName: string) => void;
      export interface System {
          args: string[];
          newLine: string;
          useCaseSensitiveFileNames: boolean;
          write(s: string): void;
          writeOutputIsTTY?(): boolean;
          readFile(path: string, encoding?: string): string | undefined;
          getFileSize?(path: string): number;
          writeFile(path: string, data: string, writeByteOrderMark?: boolean): void;
          /**
           * @pollingInterval - this parameter is used in polling-based watchers and ignored in watchers that
           * use native OS file watching
           */
          watchFile?(path: string, callback: FileWatcherCallback, pollingInterval?: number, options?: WatchOptions): FileWatcher;
          watchDirectory?(path: string, callback: DirectoryWatcherCallback, recursive?: boolean, options?: WatchOptions): FileWatcher;
          resolvePath(path: string): string;
          fileExists(path: string): boolean;
          directoryExists(path: string): boolean;
          createDirectory(path: string): void;
          getExecutingFilePath(): string;
          getCurrentDirectory(): string;
          getDirectories(path: string): string[];
          readDirectory(path: string, extensions?: readonly string[], exclude?: readonly string[], include?: readonly string[], depth?: number): string[];
          getModifiedTime?(path: string): Date | undefined;
          setModifiedTime?(path: string, time: Date): void;
          deleteFile?(path: string): void;
          /**
           * A good implementation is node.js' `crypto.createHash`. (https://nodejs.org/api/crypto.html#crypto_crypto_createhash_algorithm)
           */
          createHash?(data: string): string;
          /** This must be cryptographically secure. Only implement this method using `crypto.createHash("sha256")`. */
          createSHA256Hash?(data: string): string;
          getMemoryUsage?(): number;
          exit(exitCode?: number): void;
          realpath?(path: string): string;
          setTimeout?(callback: (...args: any[]) => void, ms: number, ...args: any[]): any;
          clearTimeout?(timeoutId: any): void;
          clearScreen?(): void;
          base64decode?(input: string): string;
          base64encode?(input: string): string;
      }
      export interface FileWatcher {
          close(): void;
      }
      export function getNodeMajorVersion(): number | undefined;
      export let sys: System;
      export {};
  }
  declare namespace ts {
      type ErrorCallback = (message: DiagnosticMessage, length: number) => void;
      interface Scanner {
          getStartPos(): number;
          getToken(): SyntaxKind;
          getTextPos(): number;
          getTokenPos(): number;
          getTokenText(): string;
          getTokenValue(): string;
          hasUnicodeEscape(): boolean;
          hasExtendedUnicodeEscape(): boolean;
          hasPrecedingLineBreak(): boolean;
          isIdentifier(): boolean;
          isReservedWord(): boolean;
          isUnterminated(): boolean;
          reScanGreaterToken(): SyntaxKind;
          reScanSlashToken(): SyntaxKind;
          reScanTemplateToken(isTaggedTemplate: boolean): SyntaxKind;
          reScanTemplateHeadOrNoSubstitutionTemplate(): SyntaxKind;
          scanJsxIdentifier(): SyntaxKind;
          scanJsxAttributeValue(): SyntaxKind;
          reScanJsxAttributeValue(): SyntaxKind;
          reScanJsxToken(): JsxTokenSyntaxKind;
          reScanLessThanToken(): SyntaxKind;
          reScanQuestionToken(): SyntaxKind;
          scanJsxToken(): JsxTokenSyntaxKind;
          scanJsDocToken(): JSDocSyntaxKind;
          scan(): SyntaxKind;
          getText(): string;
          setText(text: string | undefined, start?: number, length?: number): void;
          setOnError(onError: ErrorCallback | undefined): void;
          setScriptTarget(scriptTarget: ScriptTarget): void;
          setLanguageVariant(variant: LanguageVariant): void;
          setTextPos(textPos: number): void;
          lookAhead<T>(callback: () => T): T;
          scanRange<T>(start: number, length: number, callback: () => T): T;
          tryScan<T>(callback: () => T): T;
      }
      function tokenToString(t: SyntaxKind): string | undefined;
      function getPositionOfLineAndCharacter(sourceFile: SourceFileLike, line: number, character: number): number;
      function getLineAndCharacterOfPosition(sourceFile: SourceFileLike, position: number): LineAndCharacter;
      function isWhiteSpaceLike(ch: number): boolean;
      /** Does not include line breaks. For that, see isWhiteSpaceLike. */
      function isWhiteSpaceSingleLine(ch: number): boolean;
      function isLineBreak(ch: number): boolean;
      function couldStartTrivia(text: string, pos: number): boolean;
      function forEachLeadingCommentRange<U>(text: string, pos: number, cb: (pos: number, end: number, kind: CommentKind, hasTrailingNewLine: boolean) => U): U | undefined;
      function forEachLeadingCommentRange<T, U>(text: string, pos: number, cb: (pos: number, end: number, kind: CommentKind, hasTrailingNewLine: boolean, state: T) => U, state: T): U | undefined;
      function forEachTrailingCommentRange<U>(text: string, pos: number, cb: (pos: number, end: number, kind: CommentKind, hasTrailingNewLine: boolean) => U): U | undefined;
      function forEachTrailingCommentRange<T, U>(text: string, pos: number, cb: (pos: number, end: number, kind: CommentKind, hasTrailingNewLine: boolean, state: T) => U, state: T): U | undefined;
      function reduceEachLeadingCommentRange<T, U>(text: string, pos: number, cb: (pos: number, end: number, kind: CommentKind, hasTrailingNewLine: boolean, state: T, memo: U) => U, state: T, initial: U): U | undefined;
      function reduceEachTrailingCommentRange<T, U>(text: string, pos: number, cb: (pos: number, end: number, kind: CommentKind, hasTrailingNewLine: boolean, state: T, memo: U) => U, state: T, initial: U): U | undefined;
      function getLeadingCommentRanges(text: string, pos: number): CommentRange[] | undefined;
      function getTrailingCommentRanges(text: string, pos: number): CommentRange[] | undefined;
      /** Optionally, get the shebang */
      function getShebang(text: string): string | undefined;
      function isIdentifierStart(ch: number, languageVersion: ScriptTarget | undefined): boolean;
      function isIdentifierPart(ch: number, languageVersion: ScriptTarget | undefined, identifierVariant?: LanguageVariant): boolean;
      function createScanner(languageVersion: ScriptTarget, skipTrivia: boolean, languageVariant?: LanguageVariant, textInitial?: string, onError?: ErrorCallback, start?: number, length?: number): Scanner;
  }
  declare namespace ts {
      function isExternalModuleNameRelative(moduleName: string): boolean;
      function sortAndDeduplicateDiagnostics<T extends Diagnostic>(diagnostics: readonly T[]): SortedReadonlyArray<T>;
      function getDefaultLibFileName(options: CompilerOptions): string;
      function textSpanEnd(span: TextSpan): number;
      function textSpanIsEmpty(span: TextSpan): boolean;
      function textSpanContainsPosition(span: TextSpan, position: number): boolean;
      function textSpanContainsTextSpan(span: TextSpan, other: TextSpan): boolean;
      function textSpanOverlapsWith(span: TextSpan, other: TextSpan): boolean;
      function textSpanOverlap(span1: TextSpan, span2: TextSpan): TextSpan | undefined;
      function textSpanIntersectsWithTextSpan(span: TextSpan, other: TextSpan): boolean;
      function textSpanIntersectsWith(span: TextSpan, start: number, length: number): boolean;
      function decodedTextSpanIntersectsWith(start1: number, length1: number, start2: number, length2: number): boolean;
      function textSpanIntersectsWithPosition(span: TextSpan, position: number): boolean;
      function textSpanIntersection(span1: TextSpan, span2: TextSpan): TextSpan | undefined;
      function createTextSpan(start: number, length: number): TextSpan;
      function createTextSpanFromBounds(start: number, end: number): TextSpan;
      function textChangeRangeNewSpan(range: TextChangeRange): TextSpan;
      function textChangeRangeIsUnchanged(range: TextChangeRange): boolean;
      function createTextChangeRange(span: TextSpan, newLength: number): TextChangeRange;
      let unchangedTextChangeRange: TextChangeRange;
      /**
       * Called to merge all the changes that occurred across several versions of a script snapshot
       * into a single change.  i.e. if a user keeps making successive edits to a script we will
       * have a text change from V1 to V2, V2 to V3, ..., Vn.
       *
       * This function will then merge those changes into a single change range valid between V1 and
       * Vn.
       */
      function collapseTextChangeRangesAcrossMultipleVersions(changes: readonly TextChangeRange[]): TextChangeRange;
      function getTypeParameterOwner(d: Declaration): Declaration | undefined;
      type ParameterPropertyDeclaration = ParameterDeclaration & {
          parent: ConstructorDeclaration;
          name: Identifier;
      };
      function isParameterPropertyDeclaration(node: Node, parent: Node): node is ParameterPropertyDeclaration;
      function isEmptyBindingPattern(node: BindingName): node is BindingPattern;
      function isEmptyBindingElement(node: BindingElement): boolean;
      function walkUpBindingElementsAndPatterns(binding: BindingElement): VariableDeclaration | ParameterDeclaration;
      function getCombinedModifierFlags(node: Declaration): ModifierFlags;
      function getCombinedNodeFlags(node: Node): NodeFlags;
      /**
       * Checks to see if the locale is in the appropriate format,
       * and if it is, attempts to set the appropriate language.
       */
      function validateLocaleAndSetLanguage(locale: string, sys: {
          getExecutingFilePath(): string;
          resolvePath(path: string): string;
          fileExists(fileName: string): boolean;
          readFile(fileName: string): string | undefined;
      }, errors?: Push<Diagnostic>): void;
      function getOriginalNode(node: Node): Node;
      function getOriginalNode<T extends Node>(node: Node, nodeTest: (node: Node) => node is T): T;
      function getOriginalNode(node: Node | undefined): Node | undefined;
      function getOriginalNode<T extends Node>(node: Node | undefined, nodeTest: (node: Node | undefined) => node is T): T | undefined;
      /**
       * Gets a value indicating whether a node originated in the parse tree.
       *
       * @param node The node to test.
       */
      function isParseTreeNode(node: Node): boolean;
      /**
       * Gets the original parse tree node for a node.
       *
       * @param node The original node.
       * @returns The original parse tree node if found; otherwise, undefined.
       */
      function getParseTreeNode(node: Node): Node;
      /**
       * Gets the original parse tree node for a node.
       *
       * @param node The original node.
       * @param nodeTest A callback used to ensure the correct type of parse tree node is returned.
       * @returns The original parse tree node if found; otherwise, undefined.
       */
      function getParseTreeNode<T extends Node>(node: Node | undefined, nodeTest?: (node: Node) => node is T): T | undefined;
      /** Add an extra underscore to identifiers that start with two underscores to avoid issues with magic names like '__proto__' */
      function escapeLeadingUnderscores(identifier: string): __String;
      /**
       * Remove extra underscore from escaped identifier text content.
       *
       * @param identifier The escaped identifier text.
       * @returns The unescaped identifier text.
       */
      function unescapeLeadingUnderscores(identifier: __String): string;
      function idText(identifierOrPrivateName: Identifier | PrivateIdentifier): string;
      function symbolName(symbol: Symbol): string;
      function getNameOfJSDocTypedef(declaration: JSDocTypedefTag): Identifier | PrivateIdentifier | undefined;
      function getNameOfDeclaration(declaration: Declaration | Expression): DeclarationName | undefined;
      /**
       * Gets the JSDoc parameter tags for the node if present.
       *
       * @remarks Returns any JSDoc param tag whose name matches the provided
       * parameter, whether a param tag on a containing function
       * expression, or a param tag on a variable declaration whose
       * initializer is the containing function. The tags closest to the
       * node are returned first, so in the previous example, the param
       * tag on the containing function expression would be first.
       *
       * For binding patterns, parameter tags are matched by position.
       */
      function getJSDocParameterTags(param: ParameterDeclaration): readonly JSDocParameterTag[];
      /**
       * Gets the JSDoc type parameter tags for the node if present.
       *
       * @remarks Returns any JSDoc template tag whose names match the provided
       * parameter, whether a template tag on a containing function
       * expression, or a template tag on a variable declaration whose
       * initializer is the containing function. The tags closest to the
       * node are returned first, so in the previous example, the template
       * tag on the containing function expression would be first.
       */
      function getJSDocTypeParameterTags(param: TypeParameterDeclaration): readonly JSDocTemplateTag[];
      /**
       * Return true if the node has JSDoc parameter tags.
       *
       * @remarks Includes parameter tags that are not directly on the node,
       * for example on a variable declaration whose initializer is a function expression.
       */
      function hasJSDocParameterTags(node: FunctionLikeDeclaration | SignatureDeclaration): boolean;
      /** Gets the JSDoc augments tag for the node if present */
      function getJSDocAugmentsTag(node: Node): JSDocAugmentsTag | undefined;
      /** Gets the JSDoc implements tags for the node if present */
      function getJSDocImplementsTags(node: Node): readonly JSDocImplementsTag[];
      /** Gets the JSDoc class tag for the node if present */
      function getJSDocClassTag(node: Node): JSDocClassTag | undefined;
      /** Gets the JSDoc public tag for the node if present */
      function getJSDocPublicTag(node: Node): JSDocPublicTag | undefined;
      /** Gets the JSDoc private tag for the node if present */
      function getJSDocPrivateTag(node: Node): JSDocPrivateTag | undefined;
      /** Gets the JSDoc protected tag for the node if present */
      function getJSDocProtectedTag(node: Node): JSDocProtectedTag | undefined;
      /** Gets the JSDoc protected tag for the node if present */
      function getJSDocReadonlyTag(node: Node): JSDocReadonlyTag | undefined;
      /** Gets the JSDoc enum tag for the node if present */
      function getJSDocEnumTag(node: Node): JSDocEnumTag | undefined;
      /** Gets the JSDoc this tag for the node if present */
      function getJSDocThisTag(node: Node): JSDocThisTag | undefined;
      /** Gets the JSDoc return tag for the node if present */
      function getJSDocReturnTag(node: Node): JSDocReturnTag | undefined;
      /** Gets the JSDoc template tag for the node if present */
      function getJSDocTemplateTag(node: Node): JSDocTemplateTag | undefined;
      /** Gets the JSDoc type tag for the node if present and valid */
      function getJSDocTypeTag(node: Node): JSDocTypeTag | undefined;
      /**
       * Gets the type node for the node if provided via JSDoc.
       *
       * @remarks The search includes any JSDoc param tag that relates
       * to the provided parameter, for example a type tag on the
       * parameter itself, or a param tag on a containing function
       * expression, or a param tag on a variable declaration whose
       * initializer is the containing function. The tags closest to the
       * node are examined first, so in the previous example, the type
       * tag directly on the node would be returned.
       */
      function getJSDocType(node: Node): TypeNode | undefined;
      /**
       * Gets the return type node for the node if provided via JSDoc return tag or type tag.
       *
       * @remarks `getJSDocReturnTag` just gets the whole JSDoc tag. This function
       * gets the type from inside the braces, after the fat arrow, etc.
       */
      function getJSDocReturnType(node: Node): TypeNode | undefined;
      /** Get all JSDoc tags related to a node, including those on parent nodes. */
      function getJSDocTags(node: Node): readonly JSDocTag[];
      /** Gets all JSDoc tags that match a specified predicate */
      function getAllJSDocTags<T extends JSDocTag>(node: Node, predicate: (tag: JSDocTag) => tag is T): readonly T[];
      /** Gets all JSDoc tags of a specified kind */
      function getAllJSDocTagsOfKind(node: Node, kind: SyntaxKind): readonly JSDocTag[];
      /**
       * Gets the effective type parameters. If the node was parsed in a
       * JavaScript file, gets the type parameters from the `@template` tag from JSDoc.
       */
      function getEffectiveTypeParameterDeclarations(node: DeclarationWithTypeParameters): readonly TypeParameterDeclaration[];
      function getEffectiveConstraintOfTypeParameter(node: TypeParameterDeclaration): TypeNode | undefined;
      function isNumericLiteral(node: Node): node is NumericLiteral;
      function isBigIntLiteral(node: Node): node is BigIntLiteral;
      function isStringLiteral(node: Node): node is StringLiteral;
      function isJsxText(node: Node): node is JsxText;
      function isRegularExpressionLiteral(node: Node): node is RegularExpressionLiteral;
      function isNoSubstitutionTemplateLiteral(node: Node): node is NoSubstitutionTemplateLiteral;
      function isTemplateHead(node: Node): node is TemplateHead;
      function isTemplateMiddle(node: Node): node is TemplateMiddle;
      function isTemplateTail(node: Node): node is TemplateTail;
      function isIdentifier(node: Node): node is Identifier;
      function isQualifiedName(node: Node): node is QualifiedName;
      function isComputedPropertyName(node: Node): node is ComputedPropertyName;
      function isPrivateIdentifier(node: Node): node is PrivateIdentifier;
      function isIdentifierOrPrivateIdentifier(node: Node): node is Identifier | PrivateIdentifier;
      function isTypeParameterDeclaration(node: Node): node is TypeParameterDeclaration;
      function isParameter(node: Node): node is ParameterDeclaration;
      function isDecorator(node: Node): node is Decorator;
      function isPropertySignature(node: Node): node is PropertySignature;
      function isPropertyDeclaration(node: Node): node is PropertyDeclaration;
      function isMethodSignature(node: Node): node is MethodSignature;
      function isMethodDeclaration(node: Node): node is MethodDeclaration;
      function isConstructorDeclaration(node: Node): node is ConstructorDeclaration;
      function isGetAccessorDeclaration(node: Node): node is GetAccessorDeclaration;
      function isSetAccessorDeclaration(node: Node): node is SetAccessorDeclaration;
      function isCallSignatureDeclaration(node: Node): node is CallSignatureDeclaration;
      function isConstructSignatureDeclaration(node: Node): node is ConstructSignatureDeclaration;
      function isIndexSignatureDeclaration(node: Node): node is IndexSignatureDeclaration;
      function isTypePredicateNode(node: Node): node is TypePredicateNode;
      function isTypeReferenceNode(node: Node): node is TypeReferenceNode;
      function isFunctionTypeNode(node: Node): node is FunctionTypeNode;
      function isConstructorTypeNode(node: Node): node is ConstructorTypeNode;
      function isTypeQueryNode(node: Node): node is TypeQueryNode;
      function isTypeLiteralNode(node: Node): node is TypeLiteralNode;
      function isArrayTypeNode(node: Node): node is ArrayTypeNode;
      function isTupleTypeNode(node: Node): node is TupleTypeNode;
      function isUnionTypeNode(node: Node): node is UnionTypeNode;
      function isIntersectionTypeNode(node: Node): node is IntersectionTypeNode;
      function isConditionalTypeNode(node: Node): node is ConditionalTypeNode;
      function isInferTypeNode(node: Node): node is InferTypeNode;
      function isParenthesizedTypeNode(node: Node): node is ParenthesizedTypeNode;
      function isThisTypeNode(node: Node): node is ThisTypeNode;
      function isTypeOperatorNode(node: Node): node is TypeOperatorNode;
      function isIndexedAccessTypeNode(node: Node): node is IndexedAccessTypeNode;
      function isMappedTypeNode(node: Node): node is MappedTypeNode;
      function isLiteralTypeNode(node: Node): node is LiteralTypeNode;
      function isImportTypeNode(node: Node): node is ImportTypeNode;
      function isObjectBindingPattern(node: Node): node is ObjectBindingPattern;
      function isArrayBindingPattern(node: Node): node is ArrayBindingPattern;
      function isBindingElement(node: Node): node is BindingElement;
      function isArrayLiteralExpression(node: Node): node is ArrayLiteralExpression;
      function isObjectLiteralExpression(node: Node): node is ObjectLiteralExpression;
      function isPropertyAccessExpression(node: Node): node is PropertyAccessExpression;
      function isPropertyAccessChain(node: Node): node is PropertyAccessChain;
      function isElementAccessExpression(node: Node): node is ElementAccessExpression;
      function isElementAccessChain(node: Node): node is ElementAccessChain;
      function isCallExpression(node: Node): node is CallExpression;
      function isCallChain(node: Node): node is CallChain;
      function isOptionalChain(node: Node): node is PropertyAccessChain | ElementAccessChain | CallChain | NonNullChain;
      function isNullishCoalesce(node: Node): boolean;
      function isNewExpression(node: Node): node is NewExpression;
      function isTaggedTemplateExpression(node: Node): node is TaggedTemplateExpression;
      function isTypeAssertion(node: Node): node is TypeAssertion;
      function isConstTypeReference(node: Node): boolean;
      function isParenthesizedExpression(node: Node): node is ParenthesizedExpression;
      function skipPartiallyEmittedExpressions(node: Expression): Expression;
      function skipPartiallyEmittedExpressions(node: Node): Node;
      function isFunctionExpression(node: Node): node is FunctionExpression;
      function isArrowFunction(node: Node): node is ArrowFunction;
      function isDeleteExpression(node: Node): node is DeleteExpression;
      function isTypeOfExpression(node: Node): node is TypeOfExpression;
      function isVoidExpression(node: Node): node is VoidExpression;
      function isAwaitExpression(node: Node): node is AwaitExpression;
      function isPrefixUnaryExpression(node: Node): node is PrefixUnaryExpression;
      function isPostfixUnaryExpression(node: Node): node is PostfixUnaryExpression;
      function isBinaryExpression(node: Node): node is BinaryExpression;
      function isConditionalExpression(node: Node): node is ConditionalExpression;
      function isTemplateExpression(node: Node): node is TemplateExpression;
      function isYieldExpression(node: Node): node is YieldExpression;
      function isSpreadElement(node: Node): node is SpreadElement;
      function isClassExpression(node: Node): node is ClassExpression;
      function isOmittedExpression(node: Node): node is OmittedExpression;
      function isExpressionWithTypeArguments(node: Node): node is ExpressionWithTypeArguments;
      function isAsExpression(node: Node): node is AsExpression;
      function isNonNullExpression(node: Node): node is NonNullExpression;
      function isNonNullChain(node: Node): node is NonNullChain;
      function isMetaProperty(node: Node): node is MetaProperty;
      function isTemplateSpan(node: Node): node is TemplateSpan;
      function isSemicolonClassElement(node: Node): node is SemicolonClassElement;
      function isBlock(node: Node): node is Block;
      function isVariableStatement(node: Node): node is VariableStatement;
      function isEmptyStatement(node: Node): node is EmptyStatement;
      function isExpressionStatement(node: Node): node is ExpressionStatement;
      function isIfStatement(node: Node): node is IfStatement;
      function isDoStatement(node: Node): node is DoStatement;
      function isWhileStatement(node: Node): node is WhileStatement;
      function isForStatement(node: Node): node is ForStatement;
      function isForInStatement(node: Node): node is ForInStatement;
      function isForOfStatement(node: Node): node is ForOfStatement;
      function isContinueStatement(node: Node): node is ContinueStatement;
      function isBreakStatement(node: Node): node is BreakStatement;
      function isBreakOrContinueStatement(node: Node): node is BreakOrContinueStatement;
      function isReturnStatement(node: Node): node is ReturnStatement;
      function isWithStatement(node: Node): node is WithStatement;
      function isSwitchStatement(node: Node): node is SwitchStatement;
      function isLabeledStatement(node: Node): node is LabeledStatement;
      function isThrowStatement(node: Node): node is ThrowStatement;
      function isTryStatement(node: Node): node is TryStatement;
      function isDebuggerStatement(node: Node): node is DebuggerStatement;
      function isVariableDeclaration(node: Node): node is VariableDeclaration;
      function isVariableDeclarationList(node: Node): node is VariableDeclarationList;
      function isFunctionDeclaration(node: Node): node is FunctionDeclaration;
      function isClassDeclaration(node: Node): node is ClassDeclaration;
      function isInterfaceDeclaration(node: Node): node is InterfaceDeclaration;
      function isTypeAliasDeclaration(node: Node): node is TypeAliasDeclaration;
      function isEnumDeclaration(node: Node): node is EnumDeclaration;
      function isModuleDeclaration(node: Node): node is ModuleDeclaration;
      function isModuleBlock(node: Node): node is ModuleBlock;
      function isCaseBlock(node: Node): node is CaseBlock;
      function isNamespaceExportDeclaration(node: Node): node is NamespaceExportDeclaration;
      function isImportEqualsDeclaration(node: Node): node is ImportEqualsDeclaration;
      function isImportDeclaration(node: Node): node is ImportDeclaration;
      function isImportClause(node: Node): node is ImportClause;
      function isNamespaceImport(node: Node): node is NamespaceImport;
      function isNamespaceExport(node: Node): node is NamespaceExport;
      function isNamedExportBindings(node: Node): node is NamedExportBindings;
      function isNamedImports(node: Node): node is NamedImports;
      function isImportSpecifier(node: Node): node is ImportSpecifier;
      function isExportAssignment(node: Node): node is ExportAssignment;
      function isExportDeclaration(node: Node): node is ExportDeclaration;
      function isNamedExports(node: Node): node is NamedExports;
      function isExportSpecifier(node: Node): node is ExportSpecifier;
      function isMissingDeclaration(node: Node): node is MissingDeclaration;
      function isExternalModuleReference(node: Node): node is ExternalModuleReference;
      function isJsxElement(node: Node): node is JsxElement;
      function isJsxSelfClosingElement(node: Node): node is JsxSelfClosingElement;
      function isJsxOpeningElement(node: Node): node is JsxOpeningElement;
      function isJsxClosingElement(node: Node): node is JsxClosingElement;
      function isJsxFragment(node: Node): node is JsxFragment;
      function isJsxOpeningFragment(node: Node): node is JsxOpeningFragment;
      function isJsxClosingFragment(node: Node): node is JsxClosingFragment;
      function isJsxAttribute(node: Node): node is JsxAttribute;
      function isJsxAttributes(node: Node): node is JsxAttributes;
      function isJsxSpreadAttribute(node: Node): node is JsxSpreadAttribute;
      function isJsxExpression(node: Node): node is JsxExpression;
      function isCaseClause(node: Node): node is CaseClause;
      function isDefaultClause(node: Node): node is DefaultClause;
      function isHeritageClause(node: Node): node is HeritageClause;
      function isCatchClause(node: Node): node is CatchClause;
      function isPropertyAssignment(node: Node): node is PropertyAssignment;
      function isShorthandPropertyAssignment(node: Node): node is ShorthandPropertyAssignment;
      function isSpreadAssignment(node: Node): node is SpreadAssignment;
      function isEnumMember(node: Node): node is EnumMember;
      function isSourceFile(node: Node): node is SourceFile;
      function isBundle(node: Node): node is Bundle;
      function isUnparsedSource(node: Node): node is UnparsedSource;
      function isUnparsedPrepend(node: Node): node is UnparsedPrepend;
      function isUnparsedTextLike(node: Node): node is UnparsedTextLike;
      function isUnparsedNode(node: Node): node is UnparsedNode;
      function isJSDocTypeExpression(node: Node): node is JSDocTypeExpression;
      function isJSDocAllType(node: Node): node is JSDocAllType;
      function isJSDocUnknownType(node: Node): node is JSDocUnknownType;
      function isJSDocNullableType(node: Node): node is JSDocNullableType;
      function isJSDocNonNullableType(node: Node): node is JSDocNonNullableType;
      function isJSDocOptionalType(node: Node): node is JSDocOptionalType;
      function isJSDocFunctionType(node: Node): node is JSDocFunctionType;
      function isJSDocVariadicType(node: Node): node is JSDocVariadicType;
      function isJSDoc(node: Node): node is JSDoc;
      function isJSDocAuthorTag(node: Node): node is JSDocAuthorTag;
      function isJSDocAugmentsTag(node: Node): node is JSDocAugmentsTag;
      function isJSDocImplementsTag(node: Node): node is JSDocImplementsTag;
      function isJSDocClassTag(node: Node): node is JSDocClassTag;
      function isJSDocPublicTag(node: Node): node is JSDocPublicTag;
      function isJSDocPrivateTag(node: Node): node is JSDocPrivateTag;
      function isJSDocProtectedTag(node: Node): node is JSDocProtectedTag;
      function isJSDocReadonlyTag(node: Node): node is JSDocReadonlyTag;
      function isJSDocEnumTag(node: Node): node is JSDocEnumTag;
      function isJSDocThisTag(node: Node): node is JSDocThisTag;
      function isJSDocParameterTag(node: Node): node is JSDocParameterTag;
      function isJSDocReturnTag(node: Node): node is JSDocReturnTag;
      function isJSDocTypeTag(node: Node): node is JSDocTypeTag;
      function isJSDocTemplateTag(node: Node): node is JSDocTemplateTag;
      function isJSDocTypedefTag(node: Node): node is JSDocTypedefTag;
      function isJSDocPropertyTag(node: Node): node is JSDocPropertyTag;
      function isJSDocPropertyLikeTag(node: Node): node is JSDocPropertyLikeTag;
      function isJSDocTypeLiteral(node: Node): node is JSDocTypeLiteral;
      function isJSDocCallbackTag(node: Node): node is JSDocCallbackTag;
      function isJSDocSignature(node: Node): node is JSDocSignature;
      /**
       * True if node is of some token syntax kind.
       * For example, this is true for an IfKeyword but not for an IfStatement.
       * Literals are considered tokens, except TemplateLiteral, but does include TemplateHead/Middle/Tail.
       */
      function isToken(n: Node): boolean;
      function isLiteralExpression(node: Node): node is LiteralExpression;
      type TemplateLiteralToken = NoSubstitutionTemplateLiteral | TemplateHead | TemplateMiddle | TemplateTail;
      function isTemplateLiteralToken(node: Node): node is TemplateLiteralToken;
      function isTemplateMiddleOrTemplateTail(node: Node): node is TemplateMiddle | TemplateTail;
      function isImportOrExportSpecifier(node: Node): node is ImportSpecifier | ExportSpecifier;
      function isTypeOnlyImportOrExportDeclaration(node: Node): node is TypeOnlyCompatibleAliasDeclaration;
      function isStringTextContainingNode(node: Node): node is StringLiteral | TemplateLiteralToken;
      function isModifier(node: Node): node is Modifier;
      function isEntityName(node: Node): node is EntityName;
      function isPropertyName(node: Node): node is PropertyName;
      function isBindingName(node: Node): node is BindingName;
      function isFunctionLike(node: Node): node is SignatureDeclaration;
      function isClassElement(node: Node): node is ClassElement;
      function isClassLike(node: Node): node is ClassLikeDeclaration;
      function isAccessor(node: Node): node is AccessorDeclaration;
      function isTypeElement(node: Node): node is TypeElement;
      function isClassOrTypeElement(node: Node): node is ClassElement | TypeElement;
      function isObjectLiteralElementLike(node: Node): node is ObjectLiteralElementLike;
      /**
       * Node test that determines whether a node is a valid type node.
       * This differs from the `isPartOfTypeNode` function which determines whether a node is *part*
       * of a TypeNode.
       */
      function isTypeNode(node: Node): node is TypeNode;
      function isFunctionOrConstructorTypeNode(node: Node): node is FunctionTypeNode | ConstructorTypeNode;
      function isPropertyAccessOrQualifiedName(node: Node): node is PropertyAccessExpression | QualifiedName;
      function isCallLikeExpression(node: Node): node is CallLikeExpression;
      function isCallOrNewExpression(node: Node): node is CallExpression | NewExpression;
      function isTemplateLiteral(node: Node): node is TemplateLiteral;
      function isAssertionExpression(node: Node): node is AssertionExpression;
      function isIterationStatement(node: Node, lookInLabeledStatements: false): node is IterationStatement;
      function isIterationStatement(node: Node, lookInLabeledStatements: boolean): node is IterationStatement | LabeledStatement;
      function isJsxOpeningLikeElement(node: Node): node is JsxOpeningLikeElement;
      function isCaseOrDefaultClause(node: Node): node is CaseOrDefaultClause;
      /** True if node is of a kind that may contain comment text. */
      function isJSDocCommentContainingNode(node: Node): boolean;
      function isSetAccessor(node: Node): node is SetAccessorDeclaration;
      function isGetAccessor(node: Node): node is GetAccessorDeclaration;
      /** True if has initializer node attached to it. */
      function hasOnlyExpressionInitializer(node: Node): node is HasExpressionInitializer;
      function isObjectLiteralElement(node: Node): node is ObjectLiteralElement;
      function isStringLiteralLike(node: Node): node is StringLiteralLike;
  }
  declare namespace ts {
      export function createNode(kind: SyntaxKind, pos?: number, end?: number): Node;
      /**
       * Invokes a callback for each child of the given node. The 'cbNode' callback is invoked for all child nodes
       * stored in properties. If a 'cbNodes' callback is specified, it is invoked for embedded arrays; otherwise,
       * embedded arrays are flattened and the 'cbNode' callback is invoked for each element. If a callback returns
       * a truthy value, iteration stops and that value is returned. Otherwise, undefined is returned.
       *
       * @param node a given node to visit its children
       * @param cbNode a callback to be invoked for all child nodes
       * @param cbNodes a callback to be invoked for embedded array
       *
       * @remarks `forEachChild` must visit the children of a node in the order
       * that they appear in the source code. The language service depends on this property to locate nodes by position.
       */
      export function forEachChild<T>(node: Node, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray<Node>) => T | undefined): T | undefined;
      export function createSourceFile(fileName: string, sourceText: string, languageVersion: ScriptTarget, setParentNodes?: boolean, scriptKind?: ScriptKind): SourceFile;
      export function parseIsolatedEntityName(text: string, languageVersion: ScriptTarget): EntityName | undefined;
      /**
       * Parse json text into SyntaxTree and return node and parse errors if any
       * @param fileName
       * @param sourceText
       */
      export function parseJsonText(fileName: string, sourceText: string): JsonSourceFile;
      export function isExternalModule(file: SourceFile): boolean;
      export function updateSourceFile(sourceFile: SourceFile, newText: string, textChangeRange: TextChangeRange, aggressiveChecks?: boolean): SourceFile;
      export {};
  }
  declare namespace ts {
      export function parseCommandLine(commandLine: readonly string[], readFile?: (path: string) => string | undefined): ParsedCommandLine;
      export type DiagnosticReporter = (diagnostic: Diagnostic) => void;
      /**
       * Reports config file diagnostics
       */
      export interface ConfigFileDiagnosticsReporter {
          /**
           * Reports unrecoverable error when parsing config file
           */
          onUnRecoverableConfigFileDiagnostic: DiagnosticReporter;
      }
      /**
       * Interface extending ParseConfigHost to support ParseConfigFile that reads config file and reports errors
       */
      export interface ParseConfigFileHost extends ParseConfigHost, ConfigFileDiagnosticsReporter {
          getCurrentDirectory(): string;
      }
      /**
       * Reads the config file, reports errors if any and exits if the config file cannot be found
       */
      export function getParsedCommandLineOfConfigFile(configFileName: string, optionsToExtend: CompilerOptions, host: ParseConfigFileHost, extendedConfigCache?: Map<ExtendedConfigCacheEntry>, watchOptionsToExtend?: WatchOptions, extraFileExtensions?: readonly FileExtensionInfo[]): ParsedCommandLine | undefined;
      /**
       * Read tsconfig.json file
       * @param fileName The path to the config file
       */
      export function readConfigFile(fileName: string, readFile: (path: string) => string | undefined): {
          config?: any;
          error?: Diagnostic;
      };
      /**
       * Parse the text of the tsconfig.json file
       * @param fileName The path to the config file
       * @param jsonText The text of the config file
       */
      export function parseConfigFileTextToJson(fileName: string, jsonText: string): {
          config?: any;
          error?: Diagnostic;
      };
      /**
       * Read tsconfig.json file
       * @param fileName The path to the config file
       */
      export function readJsonConfigFile(fileName: string, readFile: (path: string) => string | undefined): TsConfigSourceFile;
      /**
       * Convert the json syntax tree into the json value
       */
      export function convertToObject(sourceFile: JsonSourceFile, errors: Push<Diagnostic>): any;
      /**
       * Parse the contents of a config file (tsconfig.json).
       * @param json The contents of the config file to parse
       * @param host Instance of ParseConfigHost used to enumerate files in folder.
       * @param basePath A root directory to resolve relative path entries in the config
       *    file to. e.g. outDir
       */
      export function parseJsonConfigFileContent(json: any, host: ParseConfigHost, basePath: string, existingOptions?: CompilerOptions, configFileName?: string, resolutionStack?: Path[], extraFileExtensions?: readonly FileExtensionInfo[], extendedConfigCache?: Map<ExtendedConfigCacheEntry>, existingWatchOptions?: WatchOptions): ParsedCommandLine;
      /**
       * Parse the contents of a config file (tsconfig.json).
       * @param jsonNode The contents of the config file to parse
       * @param host Instance of ParseConfigHost used to enumerate files in folder.
       * @param basePath A root directory to resolve relative path entries in the config
       *    file to. e.g. outDir
       */
      export function parseJsonSourceFileConfigFileContent(sourceFile: TsConfigSourceFile, host: ParseConfigHost, basePath: string, existingOptions?: CompilerOptions, configFileName?: string, resolutionStack?: Path[], extraFileExtensions?: readonly FileExtensionInfo[], extendedConfigCache?: Map<ExtendedConfigCacheEntry>, existingWatchOptions?: WatchOptions): ParsedCommandLine;
      export interface ParsedTsconfig {
          raw: any;
          options?: CompilerOptions;
          watchOptions?: WatchOptions;
          typeAcquisition?: TypeAcquisition;
          /**
           * Note that the case of the config path has not yet been normalized, as no files have been imported into the project yet
           */
          extendedConfigPath?: string;
      }
      export interface ExtendedConfigCacheEntry {
          extendedResult: TsConfigSourceFile;
          extendedConfig: ParsedTsconfig | undefined;
      }
      export function convertCompilerOptionsFromJson(jsonOptions: any, basePath: string, configFileName?: string): {
          options: CompilerOptions;
          errors: Diagnostic[];
      };
      export function convertTypeAcquisitionFromJson(jsonOptions: any, basePath: string, configFileName?: string): {
          options: TypeAcquisition;
          errors: Diagnostic[];
      };
      export {};
  }
  declare namespace ts {
      function getEffectiveTypeRoots(options: CompilerOptions, host: GetEffectiveTypeRootsHost): string[] | undefined;
      /**
       * @param {string | undefined} containingFile - file that contains type reference directive, can be undefined if containing file is unknown.
       * This is possible in case if resolution is performed for directives specified via 'types' parameter. In this case initial path for secondary lookups
       * is assumed to be the same as root directory of the project.
       */
      function resolveTypeReferenceDirective(typeReferenceDirectiveName: string, containingFile: string | undefined, options: CompilerOptions, host: ModuleResolutionHost, redirectedReference?: ResolvedProjectReference): ResolvedTypeReferenceDirectiveWithFailedLookupLocations;
      /**
       * Given a set of options, returns the set of type directive names
       *   that should be included for this program automatically.
       * This list could either come from the config file,
       *   or from enumerating the types root + initial secondary types lookup location.
       * More type directives might appear in the program later as a result of loading actual source files;
       *   this list is only the set of defaults that are implicitly included.
       */
      function getAutomaticTypeDirectiveNames(options: CompilerOptions, host: ModuleResolutionHost): string[];
      /**
       * Cached module resolutions per containing directory.
       * This assumes that any module id will have the same resolution for sibling files located in the same folder.
       */
      interface ModuleResolutionCache extends NonRelativeModuleNameResolutionCache {
          getOrCreateCacheForDirectory(directoryName: string, redirectedReference?: ResolvedProjectReference): Map<ResolvedModuleWithFailedLookupLocations>;
      }
      /**
       * Stored map from non-relative module name to a table: directory -> result of module lookup in this directory
       * We support only non-relative module names because resolution of relative module names is usually more deterministic and thus less expensive.
       */
      interface NonRelativeModuleNameResolutionCache {
          getOrCreateCacheForModuleName(nonRelativeModuleName: string, redirectedReference?: ResolvedProjectReference): PerModuleNameCache;
      }
      interface PerModuleNameCache {
          get(directory: string): ResolvedModuleWithFailedLookupLocations | undefined;
          set(directory: string, result: ResolvedModuleWithFailedLookupLocations): void;
      }
      function createModuleResolutionCache(currentDirectory: string, getCanonicalFileName: (s: string) => string, options?: CompilerOptions): ModuleResolutionCache;
      function resolveModuleNameFromCache(moduleName: string, containingFile: string, cache: ModuleResolutionCache): ResolvedModuleWithFailedLookupLocations | undefined;
      function resolveModuleName(moduleName: string, containingFile: string, compilerOptions: CompilerOptions, host: ModuleResolutionHost, cache?: ModuleResolutionCache, redirectedReference?: ResolvedProjectReference): ResolvedModuleWithFailedLookupLocations;
      function nodeModuleNameResolver(moduleName: string, containingFile: string, compilerOptions: CompilerOptions, host: ModuleResolutionHost, cache?: ModuleResolutionCache, redirectedReference?: ResolvedProjectReference): ResolvedModuleWithFailedLookupLocations;
      function classicNameResolver(moduleName: string, containingFile: string, compilerOptions: CompilerOptions, host: ModuleResolutionHost, cache?: NonRelativeModuleNameResolutionCache, redirectedReference?: ResolvedProjectReference): ResolvedModuleWithFailedLookupLocations;
  }
  declare namespace ts {
      function createNodeArray<T extends Node>(elements?: readonly T[], hasTrailingComma?: boolean): NodeArray<T>;
      /** If a node is passed, creates a string literal whose source text is read from a source node during emit. */
      function createLiteral(value: string | StringLiteral | NoSubstitutionTemplateLiteral | NumericLiteral | Identifier): StringLiteral;
      function createLiteral(value: number | PseudoBigInt): NumericLiteral;
      function createLiteral(value: boolean): BooleanLiteral;
      function createLiteral(value: string | number | PseudoBigInt | boolean): PrimaryExpression;
      function createNumericLiteral(value: string, numericLiteralFlags?: TokenFlags): NumericLiteral;
      function createBigIntLiteral(value: string): BigIntLiteral;
      function createStringLiteral(text: string): StringLiteral;
      function createRegularExpressionLiteral(text: string): RegularExpressionLiteral;
      function createIdentifier(text: string): Identifier;
      function updateIdentifier(node: Identifier): Identifier;
      /** Create a unique temporary variable. */
      function createTempVariable(recordTempVariable: ((node: Identifier) => void) | undefined): Identifier;
      /** Create a unique temporary variable for use in a loop. */
      function createLoopVariable(): Identifier;
      /** Create a unique name based on the supplied text. */
      function createUniqueName(text: string): Identifier;
      /** Create a unique name based on the supplied text. */
      function createOptimisticUniqueName(text: string): Identifier;
      /** Create a unique name based on the supplied text. This does not consider names injected by the transformer. */
      function createFileLevelUniqueName(text: string): Identifier;
      /** Create a unique name generated for a node. */
      function getGeneratedNameForNode(node: Node | undefined): Identifier;
      function createPrivateIdentifier(text: string): PrivateIdentifier;
      function createToken<TKind extends SyntaxKind>(token: TKind): Token<TKind>;
      function createSuper(): SuperExpression;
      function createThis(): ThisExpression & Token<SyntaxKind.ThisKeyword>;
      function createNull(): NullLiteral & Token<SyntaxKind.NullKeyword>;
      function createTrue(): BooleanLiteral & Token<SyntaxKind.TrueKeyword>;
      function createFalse(): BooleanLiteral & Token<SyntaxKind.FalseKeyword>;
      function createModifier<T extends Modifier["kind"]>(kind: T): Token<T>;
      function createModifiersFromModifierFlags(flags: ModifierFlags): Modifier[];
      function createQualifiedName(left: EntityName, right: string | Identifier): QualifiedName;
      function updateQualifiedName(node: QualifiedName, left: EntityName, right: Identifier): QualifiedName;
      function createComputedPropertyName(expression: Expression): ComputedPropertyName;
      function updateComputedPropertyName(node: ComputedPropertyName, expression: Expression): ComputedPropertyName;
      function createTypeParameterDeclaration(name: string | Identifier, constraint?: TypeNode, defaultType?: TypeNode): TypeParameterDeclaration;
      function updateTypeParameterDeclaration(node: TypeParameterDeclaration, name: Identifier, constraint: TypeNode | undefined, defaultType: TypeNode | undefined): TypeParameterDeclaration;
      function createParameter(decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, dotDotDotToken: DotDotDotToken | undefined, name: string | BindingName, questionToken?: QuestionToken, type?: TypeNode, initializer?: Expression): ParameterDeclaration;
      function updateParameter(node: ParameterDeclaration, decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, dotDotDotToken: DotDotDotToken | undefined, name: string | BindingName, questionToken: QuestionToken | undefined, type: TypeNode | undefined, initializer: Expression | undefined): ParameterDeclaration;
      function createDecorator(expression: Expression): Decorator;
      function updateDecorator(node: Decorator, expression: Expression): Decorator;
      function createPropertySignature(modifiers: readonly Modifier[] | undefined, name: PropertyName | string, questionToken: QuestionToken | undefined, type: TypeNode | undefined, initializer: Expression | undefined): PropertySignature;
      function updatePropertySignature(node: PropertySignature, modifiers: readonly Modifier[] | undefined, name: PropertyName, questionToken: QuestionToken | undefined, type: TypeNode | undefined, initializer: Expression | undefined): PropertySignature;
      function createProperty(decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, name: string | PropertyName, questionOrExclamationToken: QuestionToken | ExclamationToken | undefined, type: TypeNode | undefined, initializer: Expression | undefined): PropertyDeclaration;
      function updateProperty(node: PropertyDeclaration, decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, name: string | PropertyName, questionOrExclamationToken: QuestionToken | ExclamationToken | undefined, type: TypeNode | undefined, initializer: Expression | undefined): PropertyDeclaration;
      function createMethodSignature(typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, name: string | PropertyName, questionToken: QuestionToken | undefined): MethodSignature;
      function updateMethodSignature(node: MethodSignature, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined, name: PropertyName, questionToken: QuestionToken | undefined): MethodSignature;
      function createMethod(decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, asteriskToken: AsteriskToken | undefined, name: string | PropertyName, questionToken: QuestionToken | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: Block | undefined): MethodDeclaration;
      function updateMethod(node: MethodDeclaration, decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, asteriskToken: AsteriskToken | undefined, name: PropertyName, questionToken: QuestionToken | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: Block | undefined): MethodDeclaration;
      function createConstructor(decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, parameters: readonly ParameterDeclaration[], body: Block | undefined): ConstructorDeclaration;
      function updateConstructor(node: ConstructorDeclaration, decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, parameters: readonly ParameterDeclaration[], body: Block | undefined): ConstructorDeclaration;
      function createGetAccessor(decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, name: string | PropertyName, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: Block | undefined): GetAccessorDeclaration;
      function updateGetAccessor(node: GetAccessorDeclaration, decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, name: PropertyName, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: Block | undefined): GetAccessorDeclaration;
      function createSetAccessor(decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, name: string | PropertyName, parameters: readonly ParameterDeclaration[], body: Block | undefined): SetAccessorDeclaration;
      function updateSetAccessor(node: SetAccessorDeclaration, decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, name: PropertyName, parameters: readonly ParameterDeclaration[], body: Block | undefined): SetAccessorDeclaration;
      function createCallSignature(typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined): CallSignatureDeclaration;
      function updateCallSignature(node: CallSignatureDeclaration, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined): CallSignatureDeclaration;
      function createConstructSignature(typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined): ConstructSignatureDeclaration;
      function updateConstructSignature(node: ConstructSignatureDeclaration, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined): ConstructSignatureDeclaration;
      function createIndexSignature(decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode): IndexSignatureDeclaration;
      function updateIndexSignature(node: IndexSignatureDeclaration, decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode): IndexSignatureDeclaration;
      function createKeywordTypeNode(kind: KeywordTypeNode["kind"]): KeywordTypeNode;
      function createTypePredicateNode(parameterName: Identifier | ThisTypeNode | string, type: TypeNode): TypePredicateNode;
      function createTypePredicateNodeWithModifier(assertsModifier: AssertsToken | undefined, parameterName: Identifier | ThisTypeNode | string, type: TypeNode | undefined): TypePredicateNode;
      function updateTypePredicateNode(node: TypePredicateNode, parameterName: Identifier | ThisTypeNode, type: TypeNode): TypePredicateNode;
      function updateTypePredicateNodeWithModifier(node: TypePredicateNode, assertsModifier: AssertsToken | undefined, parameterName: Identifier | ThisTypeNode, type: TypeNode | undefined): TypePredicateNode;
      function createTypeReferenceNode(typeName: string | EntityName, typeArguments: readonly TypeNode[] | undefined): TypeReferenceNode;
      function updateTypeReferenceNode(node: TypeReferenceNode, typeName: EntityName, typeArguments: NodeArray<TypeNode> | undefined): TypeReferenceNode;
      function createFunctionTypeNode(typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined): FunctionTypeNode;
      function updateFunctionTypeNode(node: FunctionTypeNode, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined): FunctionTypeNode;
      function createConstructorTypeNode(typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined): ConstructorTypeNode;
      function updateConstructorTypeNode(node: ConstructorTypeNode, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined): ConstructorTypeNode;
      function createTypeQueryNode(exprName: EntityName): TypeQueryNode;
      function updateTypeQueryNode(node: TypeQueryNode, exprName: EntityName): TypeQueryNode;
      function createTypeLiteralNode(members: readonly TypeElement[] | undefined): TypeLiteralNode;
      function updateTypeLiteralNode(node: TypeLiteralNode, members: NodeArray<TypeElement>): TypeLiteralNode;
      function createArrayTypeNode(elementType: TypeNode): ArrayTypeNode;
      function updateArrayTypeNode(node: ArrayTypeNode, elementType: TypeNode): ArrayTypeNode;
      function createTupleTypeNode(elementTypes: readonly TypeNode[]): TupleTypeNode;
      function updateTupleTypeNode(node: TupleTypeNode, elementTypes: readonly TypeNode[]): TupleTypeNode;
      function createOptionalTypeNode(type: TypeNode): OptionalTypeNode;
      function updateOptionalTypeNode(node: OptionalTypeNode, type: TypeNode): OptionalTypeNode;
      function createRestTypeNode(type: TypeNode): RestTypeNode;
      function updateRestTypeNode(node: RestTypeNode, type: TypeNode): RestTypeNode;
      function createUnionTypeNode(types: readonly TypeNode[]): UnionTypeNode;
      function updateUnionTypeNode(node: UnionTypeNode, types: NodeArray<TypeNode>): UnionTypeNode;
      function createIntersectionTypeNode(types: readonly TypeNode[]): IntersectionTypeNode;
      function updateIntersectionTypeNode(node: IntersectionTypeNode, types: NodeArray<TypeNode>): IntersectionTypeNode;
      function createUnionOrIntersectionTypeNode(kind: SyntaxKind.UnionType | SyntaxKind.IntersectionType, types: readonly TypeNode[]): UnionOrIntersectionTypeNode;
      function createConditionalTypeNode(checkType: TypeNode, extendsType: TypeNode, trueType: TypeNode, falseType: TypeNode): ConditionalTypeNode;
      function updateConditionalTypeNode(node: ConditionalTypeNode, checkType: TypeNode, extendsType: TypeNode, trueType: TypeNode, falseType: TypeNode): ConditionalTypeNode;
      function createInferTypeNode(typeParameter: TypeParameterDeclaration): InferTypeNode;
      function updateInferTypeNode(node: InferTypeNode, typeParameter: TypeParameterDeclaration): InferTypeNode;
      function createImportTypeNode(argument: TypeNode, qualifier?: EntityName, typeArguments?: readonly TypeNode[], isTypeOf?: boolean): ImportTypeNode;
      function updateImportTypeNode(node: ImportTypeNode, argument: TypeNode, qualifier?: EntityName, typeArguments?: readonly TypeNode[], isTypeOf?: boolean): ImportTypeNode;
      function createParenthesizedType(type: TypeNode): ParenthesizedTypeNode;
      function updateParenthesizedType(node: ParenthesizedTypeNode, type: TypeNode): ParenthesizedTypeNode;
      function createThisTypeNode(): ThisTypeNode;
      function createTypeOperatorNode(type: TypeNode): TypeOperatorNode;
      function createTypeOperatorNode(operator: SyntaxKind.KeyOfKeyword | SyntaxKind.UniqueKeyword | SyntaxKind.ReadonlyKeyword, type: TypeNode): TypeOperatorNode;
      function updateTypeOperatorNode(node: TypeOperatorNode, type: TypeNode): TypeOperatorNode;
      function createIndexedAccessTypeNode(objectType: TypeNode, indexType: TypeNode): IndexedAccessTypeNode;
      function updateIndexedAccessTypeNode(node: IndexedAccessTypeNode, objectType: TypeNode, indexType: TypeNode): IndexedAccessTypeNode;
      function createMappedTypeNode(readonlyToken: ReadonlyToken | PlusToken | MinusToken | undefined, typeParameter: TypeParameterDeclaration, questionToken: QuestionToken | PlusToken | MinusToken | undefined, type: TypeNode | undefined): MappedTypeNode;
      function updateMappedTypeNode(node: MappedTypeNode, readonlyToken: ReadonlyToken | PlusToken | MinusToken | undefined, typeParameter: TypeParameterDeclaration, questionToken: QuestionToken | PlusToken | MinusToken | undefined, type: TypeNode | undefined): MappedTypeNode;
      function createLiteralTypeNode(literal: LiteralTypeNode["literal"]): LiteralTypeNode;
      function updateLiteralTypeNode(node: LiteralTypeNode, literal: LiteralTypeNode["literal"]): LiteralTypeNode;
      function createObjectBindingPattern(elements: readonly BindingElement[]): ObjectBindingPattern;
      function updateObjectBindingPattern(node: ObjectBindingPattern, elements: readonly BindingElement[]): ObjectBindingPattern;
      function createArrayBindingPattern(elements: readonly ArrayBindingElement[]): ArrayBindingPattern;
      function updateArrayBindingPattern(node: ArrayBindingPattern, elements: readonly ArrayBindingElement[]): ArrayBindingPattern;
      function createBindingElement(dotDotDotToken: DotDotDotToken | undefined, propertyName: string | PropertyName | undefined, name: string | BindingName, initializer?: Expression): BindingElement;
      function updateBindingElement(node: BindingElement, dotDotDotToken: DotDotDotToken | undefined, propertyName: PropertyName | undefined, name: BindingName, initializer: Expression | undefined): BindingElement;
      function createArrayLiteral(elements?: readonly Expression[], multiLine?: boolean): ArrayLiteralExpression;
      function updateArrayLiteral(node: ArrayLiteralExpression, elements: readonly Expression[]): ArrayLiteralExpression;
      function createObjectLiteral(properties?: readonly ObjectLiteralElementLike[], multiLine?: boolean): ObjectLiteralExpression;
      function updateObjectLiteral(node: ObjectLiteralExpression, properties: readonly ObjectLiteralElementLike[]): ObjectLiteralExpression;
      function createPropertyAccess(expression: Expression, name: string | Identifier | PrivateIdentifier): PropertyAccessExpression;
      function updatePropertyAccess(node: PropertyAccessExpression, expression: Expression, name: Identifier | PrivateIdentifier): PropertyAccessExpression;
      function createPropertyAccessChain(expression: Expression, questionDotToken: QuestionDotToken | undefined, name: string | Identifier): PropertyAccessChain;
      function updatePropertyAccessChain(node: PropertyAccessChain, expression: Expression, questionDotToken: QuestionDotToken | undefined, name: Identifier): PropertyAccessChain;
      function createElementAccess(expression: Expression, index: number | Expression): ElementAccessExpression;
      function updateElementAccess(node: ElementAccessExpression, expression: Expression, argumentExpression: Expression): ElementAccessExpression;
      function createElementAccessChain(expression: Expression, questionDotToken: QuestionDotToken | undefined, index: number | Expression): ElementAccessChain;
      function updateElementAccessChain(node: ElementAccessChain, expression: Expression, questionDotToken: QuestionDotToken | undefined, argumentExpression: Expression): ElementAccessChain;
      function createCall(expression: Expression, typeArguments: readonly TypeNode[] | undefined, argumentsArray: readonly Expression[] | undefined): CallExpression;
      function updateCall(node: CallExpression, expression: Expression, typeArguments: readonly TypeNode[] | undefined, argumentsArray: readonly Expression[]): CallExpression;
      function createCallChain(expression: Expression, questionDotToken: QuestionDotToken | undefined, typeArguments: readonly TypeNode[] | undefined, argumentsArray: readonly Expression[] | undefined): CallChain;
      function updateCallChain(node: CallChain, expression: Expression, questionDotToken: QuestionDotToken | undefined, typeArguments: readonly TypeNode[] | undefined, argumentsArray: readonly Expression[]): CallChain;
      function createNew(expression: Expression, typeArguments: readonly TypeNode[] | undefined, argumentsArray: readonly Expression[] | undefined): NewExpression;
      function updateNew(node: NewExpression, expression: Expression, typeArguments: readonly TypeNode[] | undefined, argumentsArray: readonly Expression[] | undefined): NewExpression;
      /** @deprecated */ function createTaggedTemplate(tag: Expression, template: TemplateLiteral): TaggedTemplateExpression;
      function createTaggedTemplate(tag: Expression, typeArguments: readonly TypeNode[] | undefined, template: TemplateLiteral): TaggedTemplateExpression;
      /** @deprecated */ function updateTaggedTemplate(node: TaggedTemplateExpression, tag: Expression, template: TemplateLiteral): TaggedTemplateExpression;
      function updateTaggedTemplate(node: TaggedTemplateExpression, tag: Expression, typeArguments: readonly TypeNode[] | undefined, template: TemplateLiteral): TaggedTemplateExpression;
      function createTypeAssertion(type: TypeNode, expression: Expression): TypeAssertion;
      function updateTypeAssertion(node: TypeAssertion, type: TypeNode, expression: Expression): TypeAssertion;
      function createParen(expression: Expression): ParenthesizedExpression;
      function updateParen(node: ParenthesizedExpression, expression: Expression): ParenthesizedExpression;
      function createFunctionExpression(modifiers: readonly Modifier[] | undefined, asteriskToken: AsteriskToken | undefined, name: string | Identifier | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[] | undefined, type: TypeNode | undefined, body: Block): FunctionExpression;
      function updateFunctionExpression(node: FunctionExpression, modifiers: readonly Modifier[] | undefined, asteriskToken: AsteriskToken | undefined, name: Identifier | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: Block): FunctionExpression;
      function createArrowFunction(modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, equalsGreaterThanToken: EqualsGreaterThanToken | undefined, body: ConciseBody): ArrowFunction;
      function updateArrowFunction(node: ArrowFunction, modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, equalsGreaterThanToken: Token<SyntaxKind.EqualsGreaterThanToken>, body: ConciseBody): ArrowFunction;
      function createDelete(expression: Expression): DeleteExpression;
      function updateDelete(node: DeleteExpression, expression: Expression): DeleteExpression;
      function createTypeOf(expression: Expression): TypeOfExpression;
      function updateTypeOf(node: TypeOfExpression, expression: Expression): TypeOfExpression;
      function createVoid(expression: Expression): VoidExpression;
      function updateVoid(node: VoidExpression, expression: Expression): VoidExpression;
      function createAwait(expression: Expression): AwaitExpression;
      function updateAwait(node: AwaitExpression, expression: Expression): AwaitExpression;
      function createPrefix(operator: PrefixUnaryOperator, operand: Expression): PrefixUnaryExpression;
      function updatePrefix(node: PrefixUnaryExpression, operand: Expression): PrefixUnaryExpression;
      function createPostfix(operand: Expression, operator: PostfixUnaryOperator): PostfixUnaryExpression;
      function updatePostfix(node: PostfixUnaryExpression, operand: Expression): PostfixUnaryExpression;
      function createBinary(left: Expression, operator: BinaryOperator | BinaryOperatorToken, right: Expression): BinaryExpression;
      function updateBinary(node: BinaryExpression, left: Expression, right: Expression, operator?: BinaryOperator | BinaryOperatorToken): BinaryExpression;
      /** @deprecated */ function createConditional(condition: Expression, whenTrue: Expression, whenFalse: Expression): ConditionalExpression;
      function createConditional(condition: Expression, questionToken: QuestionToken, whenTrue: Expression, colonToken: ColonToken, whenFalse: Expression): ConditionalExpression;
      function updateConditional(node: ConditionalExpression, condition: Expression, questionToken: Token<SyntaxKind.QuestionToken>, whenTrue: Expression, colonToken: Token<SyntaxKind.ColonToken>, whenFalse: Expression): ConditionalExpression;
      function createTemplateExpression(head: TemplateHead, templateSpans: readonly TemplateSpan[]): TemplateExpression;
      function updateTemplateExpression(node: TemplateExpression, head: TemplateHead, templateSpans: readonly TemplateSpan[]): TemplateExpression;
      function createTemplateHead(text: string, rawText?: string): TemplateHead;
      function createTemplateMiddle(text: string, rawText?: string): TemplateMiddle;
      function createTemplateTail(text: string, rawText?: string): TemplateTail;
      function createNoSubstitutionTemplateLiteral(text: string, rawText?: string): NoSubstitutionTemplateLiteral;
      function createYield(expression?: Expression): YieldExpression;
      function createYield(asteriskToken: AsteriskToken | undefined, expression: Expression): YieldExpression;
      function updateYield(node: YieldExpression, asteriskToken: AsteriskToken | undefined, expression: Expression): YieldExpression;
      function createSpread(expression: Expression): SpreadElement;
      function updateSpread(node: SpreadElement, expression: Expression): SpreadElement;
      function createClassExpression(modifiers: readonly Modifier[] | undefined, name: string | Identifier | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, heritageClauses: readonly HeritageClause[] | undefined, members: readonly ClassElement[]): ClassExpression;
      function updateClassExpression(node: ClassExpression, modifiers: readonly Modifier[] | undefined, name: Identifier | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, heritageClauses: readonly HeritageClause[] | undefined, members: readonly ClassElement[]): ClassExpression;
      function createOmittedExpression(): OmittedExpression;
      function createExpressionWithTypeArguments(typeArguments: readonly TypeNode[] | undefined, expression: Expression): ExpressionWithTypeArguments;
      function updateExpressionWithTypeArguments(node: ExpressionWithTypeArguments, typeArguments: readonly TypeNode[] | undefined, expression: Expression): ExpressionWithTypeArguments;
      function createAsExpression(expression: Expression, type: TypeNode): AsExpression;
      function updateAsExpression(node: AsExpression, expression: Expression, type: TypeNode): AsExpression;
      function createNonNullExpression(expression: Expression): NonNullExpression;
      function updateNonNullExpression(node: NonNullExpression, expression: Expression): NonNullExpression;
      function createNonNullChain(expression: Expression): NonNullChain;
      function updateNonNullChain(node: NonNullChain, expression: Expression): NonNullChain;
      function createMetaProperty(keywordToken: MetaProperty["keywordToken"], name: Identifier): MetaProperty;
      function updateMetaProperty(node: MetaProperty, name: Identifier): MetaProperty;
      function createTemplateSpan(expression: Expression, literal: TemplateMiddle | TemplateTail): TemplateSpan;
      function updateTemplateSpan(node: TemplateSpan, expression: Expression, literal: TemplateMiddle | TemplateTail): TemplateSpan;
      function createSemicolonClassElement(): SemicolonClassElement;
      function createBlock(statements: readonly Statement[], multiLine?: boolean): Block;
      function updateBlock(node: Block, statements: readonly Statement[]): Block;
      function createVariableStatement(modifiers: readonly Modifier[] | undefined, declarationList: VariableDeclarationList | readonly VariableDeclaration[]): VariableStatement;
      function updateVariableStatement(node: VariableStatement, modifiers: readonly Modifier[] | undefined, declarationList: VariableDeclarationList): VariableStatement;
      function createEmptyStatement(): EmptyStatement;
      function createExpressionStatement(expression: Expression): ExpressionStatement;
      function updateExpressionStatement(node: ExpressionStatement, expression: Expression): ExpressionStatement;
      /** @deprecated Use `createExpressionStatement` instead.  */
      const createStatement: typeof createExpressionStatement;
      /** @deprecated Use `updateExpressionStatement` instead.  */
      const updateStatement: typeof updateExpressionStatement;
      function createIf(expression: Expression, thenStatement: Statement, elseStatement?: Statement): IfStatement;
      function updateIf(node: IfStatement, expression: Expression, thenStatement: Statement, elseStatement: Statement | undefined): IfStatement;
      function createDo(statement: Statement, expression: Expression): DoStatement;
      function updateDo(node: DoStatement, statement: Statement, expression: Expression): DoStatement;
      function createWhile(expression: Expression, statement: Statement): WhileStatement;
      function updateWhile(node: WhileStatement, expression: Expression, statement: Statement): WhileStatement;
      function createFor(initializer: ForInitializer | undefined, condition: Expression | undefined, incrementor: Expression | undefined, statement: Statement): ForStatement;
      function updateFor(node: ForStatement, initializer: ForInitializer | undefined, condition: Expression | undefined, incrementor: Expression | undefined, statement: Statement): ForStatement;
      function createForIn(initializer: ForInitializer, expression: Expression, statement: Statement): ForInStatement;
      function updateForIn(node: ForInStatement, initializer: ForInitializer, expression: Expression, statement: Statement): ForInStatement;
      function createForOf(awaitModifier: AwaitKeywordToken | undefined, initializer: ForInitializer, expression: Expression, statement: Statement): ForOfStatement;
      function updateForOf(node: ForOfStatement, awaitModifier: AwaitKeywordToken | undefined, initializer: ForInitializer, expression: Expression, statement: Statement): ForOfStatement;
      function createContinue(label?: string | Identifier): ContinueStatement;
      function updateContinue(node: ContinueStatement, label: Identifier | undefined): ContinueStatement;
      function createBreak(label?: string | Identifier): BreakStatement;
      function updateBreak(node: BreakStatement, label: Identifier | undefined): BreakStatement;
      function createReturn(expression?: Expression): ReturnStatement;
      function updateReturn(node: ReturnStatement, expression: Expression | undefined): ReturnStatement;
      function createWith(expression: Expression, statement: Statement): WithStatement;
      function updateWith(node: WithStatement, expression: Expression, statement: Statement): WithStatement;
      function createSwitch(expression: Expression, caseBlock: CaseBlock): SwitchStatement;
      function updateSwitch(node: SwitchStatement, expression: Expression, caseBlock: CaseBlock): SwitchStatement;
      function createLabel(label: string | Identifier, statement: Statement): LabeledStatement;
      function updateLabel(node: LabeledStatement, label: Identifier, statement: Statement): LabeledStatement;
      function createThrow(expression: Expression): ThrowStatement;
      function updateThrow(node: ThrowStatement, expression: Expression): ThrowStatement;
      function createTry(tryBlock: Block, catchClause: CatchClause | undefined, finallyBlock: Block | undefined): TryStatement;
      function updateTry(node: TryStatement, tryBlock: Block, catchClause: CatchClause | undefined, finallyBlock: Block | undefined): TryStatement;
      function createDebuggerStatement(): DebuggerStatement;
      function createVariableDeclaration(name: string | BindingName, type?: TypeNode, initializer?: Expression): VariableDeclaration;
      function updateVariableDeclaration(node: VariableDeclaration, name: BindingName, type: TypeNode | undefined, initializer: Expression | undefined): VariableDeclaration;
      function createVariableDeclarationList(declarations: readonly VariableDeclaration[], flags?: NodeFlags): VariableDeclarationList;
      function updateVariableDeclarationList(node: VariableDeclarationList, declarations: readonly VariableDeclaration[]): VariableDeclarationList;
      function createFunctionDeclaration(decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, asteriskToken: AsteriskToken | undefined, name: string | Identifier | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: Block | undefined): FunctionDeclaration;
      function updateFunctionDeclaration(node: FunctionDeclaration, decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, asteriskToken: AsteriskToken | undefined, name: Identifier | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: Block | undefined): FunctionDeclaration;
      function createClassDeclaration(decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, name: string | Identifier | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, heritageClauses: readonly HeritageClause[] | undefined, members: readonly ClassElement[]): ClassDeclaration;
      function updateClassDeclaration(node: ClassDeclaration, decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, name: Identifier | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, heritageClauses: readonly HeritageClause[] | undefined, members: readonly ClassElement[]): ClassDeclaration;
      function createInterfaceDeclaration(decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, name: string | Identifier, typeParameters: readonly TypeParameterDeclaration[] | undefined, heritageClauses: readonly HeritageClause[] | undefined, members: readonly TypeElement[]): InterfaceDeclaration;
      function updateInterfaceDeclaration(node: InterfaceDeclaration, decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, name: Identifier, typeParameters: readonly TypeParameterDeclaration[] | undefined, heritageClauses: readonly HeritageClause[] | undefined, members: readonly TypeElement[]): InterfaceDeclaration;
      function createTypeAliasDeclaration(decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, name: string | Identifier, typeParameters: readonly TypeParameterDeclaration[] | undefined, type: TypeNode): TypeAliasDeclaration;
      function updateTypeAliasDeclaration(node: TypeAliasDeclaration, decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, name: Identifier, typeParameters: readonly TypeParameterDeclaration[] | undefined, type: TypeNode): TypeAliasDeclaration;
      function createEnumDeclaration(decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, name: string | Identifier, members: readonly EnumMember[]): EnumDeclaration;
      function updateEnumDeclaration(node: EnumDeclaration, decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, name: Identifier, members: readonly EnumMember[]): EnumDeclaration;
      function createModuleDeclaration(decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, name: ModuleName, body: ModuleBody | undefined, flags?: NodeFlags): ModuleDeclaration;
      function updateModuleDeclaration(node: ModuleDeclaration, decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, name: ModuleName, body: ModuleBody | undefined): ModuleDeclaration;
      function createModuleBlock(statements: readonly Statement[]): ModuleBlock;
      function updateModuleBlock(node: ModuleBlock, statements: readonly Statement[]): ModuleBlock;
      function createCaseBlock(clauses: readonly CaseOrDefaultClause[]): CaseBlock;
      function updateCaseBlock(node: CaseBlock, clauses: readonly CaseOrDefaultClause[]): CaseBlock;
      function createNamespaceExportDeclaration(name: string | Identifier): NamespaceExportDeclaration;
      function updateNamespaceExportDeclaration(node: NamespaceExportDeclaration, name: Identifier): NamespaceExportDeclaration;
      function createImportEqualsDeclaration(decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, name: string | Identifier, moduleReference: ModuleReference): ImportEqualsDeclaration;
      function updateImportEqualsDeclaration(node: ImportEqualsDeclaration, decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, name: Identifier, moduleReference: ModuleReference): ImportEqualsDeclaration;
      function createImportDeclaration(decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, importClause: ImportClause | undefined, moduleSpecifier: Expression): ImportDeclaration;
      function updateImportDeclaration(node: ImportDeclaration, decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, importClause: ImportClause | undefined, moduleSpecifier: Expression): ImportDeclaration;
      function createImportClause(name: Identifier | undefined, namedBindings: NamedImportBindings | undefined, isTypeOnly?: boolean): ImportClause;
      function updateImportClause(node: ImportClause, name: Identifier | undefined, namedBindings: NamedImportBindings | undefined, isTypeOnly: boolean): ImportClause;
      function createNamespaceImport(name: Identifier): NamespaceImport;
      function createNamespaceExport(name: Identifier): NamespaceExport;
      function updateNamespaceImport(node: NamespaceImport, name: Identifier): NamespaceImport;
      function updateNamespaceExport(node: NamespaceExport, name: Identifier): NamespaceExport;
      function createNamedImports(elements: readonly ImportSpecifier[]): NamedImports;
      function updateNamedImports(node: NamedImports, elements: readonly ImportSpecifier[]): NamedImports;
      function createImportSpecifier(propertyName: Identifier | undefined, name: Identifier): ImportSpecifier;
      function updateImportSpecifier(node: ImportSpecifier, propertyName: Identifier | undefined, name: Identifier): ImportSpecifier;
      function createExportAssignment(decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, isExportEquals: boolean | undefined, expression: Expression): ExportAssignment;
      function updateExportAssignment(node: ExportAssignment, decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, expression: Expression): ExportAssignment;
      function createExportDeclaration(decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, exportClause: NamedExportBindings | undefined, moduleSpecifier?: Expression, isTypeOnly?: boolean): ExportDeclaration;
      function updateExportDeclaration(node: ExportDeclaration, decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, exportClause: NamedExportBindings | undefined, moduleSpecifier: Expression | undefined, isTypeOnly: boolean): ExportDeclaration;
      function createNamedExports(elements: readonly ExportSpecifier[]): NamedExports;
      function updateNamedExports(node: NamedExports, elements: readonly ExportSpecifier[]): NamedExports;
      function createExportSpecifier(propertyName: string | Identifier | undefined, name: string | Identifier): ExportSpecifier;
      function updateExportSpecifier(node: ExportSpecifier, propertyName: Identifier | undefined, name: Identifier): ExportSpecifier;
      function createExternalModuleReference(expression: Expression): ExternalModuleReference;
      function updateExternalModuleReference(node: ExternalModuleReference, expression: Expression): ExternalModuleReference;
      function createJsxElement(openingElement: JsxOpeningElement, children: readonly JsxChild[], closingElement: JsxClosingElement): JsxElement;
      function updateJsxElement(node: JsxElement, openingElement: JsxOpeningElement, children: readonly JsxChild[], closingElement: JsxClosingElement): JsxElement;
      function createJsxSelfClosingElement(tagName: JsxTagNameExpression, typeArguments: readonly TypeNode[] | undefined, attributes: JsxAttributes): JsxSelfClosingElement;
      function updateJsxSelfClosingElement(node: JsxSelfClosingElement, tagName: JsxTagNameExpression, typeArguments: readonly TypeNode[] | undefined, attributes: JsxAttributes): JsxSelfClosingElement;
      function createJsxOpeningElement(tagName: JsxTagNameExpression, typeArguments: readonly TypeNode[] | undefined, attributes: JsxAttributes): JsxOpeningElement;
      function updateJsxOpeningElement(node: JsxOpeningElement, tagName: JsxTagNameExpression, typeArguments: readonly TypeNode[] | undefined, attributes: JsxAttributes): JsxOpeningElement;
      function createJsxClosingElement(tagName: JsxTagNameExpression): JsxClosingElement;
      function updateJsxClosingElement(node: JsxClosingElement, tagName: JsxTagNameExpression): JsxClosingElement;
      function createJsxFragment(openingFragment: JsxOpeningFragment, children: readonly JsxChild[], closingFragment: JsxClosingFragment): JsxFragment;
      function createJsxText(text: string, containsOnlyTriviaWhiteSpaces?: boolean): JsxText;
      function updateJsxText(node: JsxText, text: string, containsOnlyTriviaWhiteSpaces?: boolean): JsxText;
      function createJsxOpeningFragment(): JsxOpeningFragment;
      function createJsxJsxClosingFragment(): JsxClosingFragment;
      function updateJsxFragment(node: JsxFragment, openingFragment: JsxOpeningFragment, children: readonly JsxChild[], closingFragment: JsxClosingFragment): JsxFragment;
      function createJsxAttribute(name: Identifier, initializer: StringLiteral | JsxExpression): JsxAttribute;
      function updateJsxAttribute(node: JsxAttribute, name: Identifier, initializer: StringLiteral | JsxExpression): JsxAttribute;
      function createJsxAttributes(properties: readonly JsxAttributeLike[]): JsxAttributes;
      function updateJsxAttributes(node: JsxAttributes, properties: readonly JsxAttributeLike[]): JsxAttributes;
      function createJsxSpreadAttribute(expression: Expression): JsxSpreadAttribute;
      function updateJsxSpreadAttribute(node: JsxSpreadAttribute, expression: Expression): JsxSpreadAttribute;
      function createJsxExpression(dotDotDotToken: DotDotDotToken | undefined, expression: Expression | undefined): JsxExpression;
      function updateJsxExpression(node: JsxExpression, expression: Expression | undefined): JsxExpression;
      function createCaseClause(expression: Expression, statements: readonly Statement[]): CaseClause;
      function updateCaseClause(node: CaseClause, expression: Expression, statements: readonly Statement[]): CaseClause;
      function createDefaultClause(statements: readonly Statement[]): DefaultClause;
      function updateDefaultClause(node: DefaultClause, statements: readonly Statement[]): DefaultClause;
      function createHeritageClause(token: HeritageClause["token"], types: readonly ExpressionWithTypeArguments[]): HeritageClause;
      function updateHeritageClause(node: HeritageClause, types: readonly ExpressionWithTypeArguments[]): HeritageClause;
      function createCatchClause(variableDeclaration: string | VariableDeclaration | undefined, block: Block): CatchClause;
      function updateCatchClause(node: CatchClause, variableDeclaration: VariableDeclaration | undefined, block: Block): CatchClause;
      function createPropertyAssignment(name: string | PropertyName, initializer: Expression): PropertyAssignment;
      function updatePropertyAssignment(node: PropertyAssignment, name: PropertyName, initializer: Expression): PropertyAssignment;
      function createShorthandPropertyAssignment(name: string | Identifier, objectAssignmentInitializer?: Expression): ShorthandPropertyAssignment;
      function updateShorthandPropertyAssignment(node: ShorthandPropertyAssignment, name: Identifier, objectAssignmentInitializer: Expression | undefined): ShorthandPropertyAssignment;
      function createSpreadAssignment(expression: Expression): SpreadAssignment;
      function updateSpreadAssignment(node: SpreadAssignment, expression: Expression): SpreadAssignment;
      function createEnumMember(name: string | PropertyName, initializer?: Expression): EnumMember;
      function updateEnumMember(node: EnumMember, name: PropertyName, initializer: Expression | undefined): EnumMember;
      function updateSourceFileNode(node: SourceFile, statements: readonly Statement[], isDeclarationFile?: boolean, referencedFiles?: SourceFile["referencedFiles"], typeReferences?: SourceFile["typeReferenceDirectives"], hasNoDefaultLib?: boolean, libReferences?: SourceFile["libReferenceDirectives"]): SourceFile;
      /**
       * Creates a shallow, memberwise clone of a node for mutation.
       */
      function getMutableClone<T extends Node>(node: T): T;
      /**
       * Creates a synthetic statement to act as a placeholder for a not-emitted statement in
       * order to preserve comments.
       *
       * @param original The original statement.
       */
      function createNotEmittedStatement(original: Node): NotEmittedStatement;
      /**
       * Creates a synthetic expression to act as a placeholder for a not-emitted expression in
       * order to preserve comments or sourcemap positions.
       *
       * @param expression The inner expression to emit.
       * @param original The original outer expression.
       * @param location The location for the expression. Defaults to the positions from "original" if provided.
       */
      function createPartiallyEmittedExpression(expression: Expression, original?: Node): PartiallyEmittedExpression;
      function updatePartiallyEmittedExpression(node: PartiallyEmittedExpression, expression: Expression): PartiallyEmittedExpression;
      function createCommaList(elements: readonly Expression[]): CommaListExpression;
      function updateCommaList(node: CommaListExpression, elements: readonly Expression[]): CommaListExpression;
      function createBundle(sourceFiles: readonly SourceFile[], prepends?: readonly (UnparsedSource | InputFiles)[]): Bundle;
      function createUnparsedSourceFile(text: string): UnparsedSource;
      function createUnparsedSourceFile(inputFile: InputFiles, type: "js" | "dts", stripInternal?: boolean): UnparsedSource;
      function createUnparsedSourceFile(text: string, mapPath: string | undefined, map: string | undefined): UnparsedSource;
      function createInputFiles(javascriptText: string, declarationText: string): InputFiles;
      function createInputFiles(readFileText: (path: string) => string | undefined, javascriptPath: string, javascriptMapPath: string | undefined, declarationPath: string, declarationMapPath: string | undefined, buildInfoPath: string | undefined): InputFiles;
      function createInputFiles(javascriptText: string, declarationText: string, javascriptMapPath: string | undefined, javascriptMapText: string | undefined, declarationMapPath: string | undefined, declarationMapText: string | undefined): InputFiles;
      function updateBundle(node: Bundle, sourceFiles: readonly SourceFile[], prepends?: readonly (UnparsedSource | InputFiles)[]): Bundle;
      function createImmediatelyInvokedFunctionExpression(statements: readonly Statement[]): CallExpression;
      function createImmediatelyInvokedFunctionExpression(statements: readonly Statement[], param: ParameterDeclaration, paramValue: Expression): CallExpression;
      function createImmediatelyInvokedArrowFunction(statements: readonly Statement[]): CallExpression;
      function createImmediatelyInvokedArrowFunction(statements: readonly Statement[], param: ParameterDeclaration, paramValue: Expression): CallExpression;
      function createComma(left: Expression, right: Expression): Expression;
      function createLessThan(left: Expression, right: Expression): Expression;
      function createAssignment(left: ObjectLiteralExpression | ArrayLiteralExpression, right: Expression): DestructuringAssignment;
      function createAssignment(left: Expression, right: Expression): BinaryExpression;
      function createStrictEquality(left: Expression, right: Expression): BinaryExpression;
      function createStrictInequality(left: Expression, right: Expression): BinaryExpression;
      function createAdd(left: Expression, right: Expression): BinaryExpression;
      function createSubtract(left: Expression, right: Expression): BinaryExpression;
      function createPostfixIncrement(operand: Expression): PostfixUnaryExpression;
      function createLogicalAnd(left: Expression, right: Expression): BinaryExpression;
      function createLogicalOr(left: Expression, right: Expression): BinaryExpression;
      function createNullishCoalesce(left: Expression, right: Expression): BinaryExpression;
      function createLogicalNot(operand: Expression): PrefixUnaryExpression;
      function createVoidZero(): VoidExpression;
      function createExportDefault(expression: Expression): ExportAssignment;
      function createExternalModuleExport(exportName: Identifier): ExportDeclaration;
      /**
       * Clears any EmitNode entries from parse-tree nodes.
       * @param sourceFile A source file.
       */
      function disposeEmitNodes(sourceFile: SourceFile): void;
      function setTextRange<T extends TextRange>(range: T, location: TextRange | undefined): T;
      /**
       * Sets flags that control emit behavior of a node.
       */
      function setEmitFlags<T extends Node>(node: T, emitFlags: EmitFlags): T;
      /**
       * Gets a custom text range to use when emitting source maps.
       */
      function getSourceMapRange(node: Node): SourceMapRange;
      /**
       * Sets a custom text range to use when emitting source maps.
       */
      function setSourceMapRange<T extends Node>(node: T, range: SourceMapRange | undefined): T;
      /**
       * Create an external source map source file reference
       */
      function createSourceMapSource(fileName: string, text: string, skipTrivia?: (pos: number) => number): SourceMapSource;
      /**
       * Gets the TextRange to use for source maps for a token of a node.
       */
      function getTokenSourceMapRange(node: Node, token: SyntaxKind): SourceMapRange | undefined;
      /**
       * Sets the TextRange to use for source maps for a token of a node.
       */
      function setTokenSourceMapRange<T extends Node>(node: T, token: SyntaxKind, range: SourceMapRange | undefined): T;
      /**
       * Gets a custom text range to use when emitting comments.
       */
      function getCommentRange(node: Node): TextRange;
      /**
       * Sets a custom text range to use when emitting comments.
       */
      function setCommentRange<T extends Node>(node: T, range: TextRange): T;
      function getSyntheticLeadingComments(node: Node): SynthesizedComment[] | undefined;
      function setSyntheticLeadingComments<T extends Node>(node: T, comments: SynthesizedComment[] | undefined): T;
      function addSyntheticLeadingComment<T extends Node>(node: T, kind: SyntaxKind.SingleLineCommentTrivia | SyntaxKind.MultiLineCommentTrivia, text: string, hasTrailingNewLine?: boolean): T;
      function getSyntheticTrailingComments(node: Node): SynthesizedComment[] | undefined;
      function setSyntheticTrailingComments<T extends Node>(node: T, comments: SynthesizedComment[] | undefined): T;
      function addSyntheticTrailingComment<T extends Node>(node: T, kind: SyntaxKind.SingleLineCommentTrivia | SyntaxKind.MultiLineCommentTrivia, text: string, hasTrailingNewLine?: boolean): T;
      function moveSyntheticComments<T extends Node>(node: T, original: Node): T;
      /**
       * Gets the constant value to emit for an expression.
       */
      function getConstantValue(node: PropertyAccessExpression | ElementAccessExpression): string | number | undefined;
      /**
       * Sets the constant value to emit for an expression.
       */
      function setConstantValue(node: PropertyAccessExpression | ElementAccessExpression, value: string | number): PropertyAccessExpression | ElementAccessExpression;
      /**
       * Adds an EmitHelper to a node.
       */
      function addEmitHelper<T extends Node>(node: T, helper: EmitHelper): T;
      /**
       * Add EmitHelpers to a node.
       */
      function addEmitHelpers<T extends Node>(node: T, helpers: EmitHelper[] | undefined): T;
      /**
       * Removes an EmitHelper from a node.
       */
      function removeEmitHelper(node: Node, helper: EmitHelper): boolean;
      /**
       * Gets the EmitHelpers of a node.
       */
      function getEmitHelpers(node: Node): EmitHelper[] | undefined;
      /**
       * Moves matching emit helpers from a source node to a target node.
       */
      function moveEmitHelpers(source: Node, target: Node, predicate: (helper: EmitHelper) => boolean): void;
      function setOriginalNode<T extends Node>(node: T, original: Node | undefined): T;
  }
  declare namespace ts {
      /**
       * Visits a Node using the supplied visitor, possibly returning a new Node in its place.
       *
       * @param node The Node to visit.
       * @param visitor The callback used to visit the Node.
       * @param test A callback to execute to verify the Node is valid.
       * @param lift An optional callback to execute to lift a NodeArray into a valid Node.
       */
      function visitNode<T extends Node>(node: T | undefined, visitor: Visitor | undefined, test?: (node: Node) => boolean, lift?: (node: NodeArray<Node>) => T): T;
      /**
       * Visits a Node using the supplied visitor, possibly returning a new Node in its place.
       *
       * @param node The Node to visit.
       * @param visitor The callback used to visit the Node.
       * @param test A callback to execute to verify the Node is valid.
       * @param lift An optional callback to execute to lift a NodeArray into a valid Node.
       */
      function visitNode<T extends Node>(node: T | undefined, visitor: Visitor | undefined, test?: (node: Node) => boolean, lift?: (node: NodeArray<Node>) => T): T | undefined;
      /**
       * Visits a NodeArray using the supplied visitor, possibly returning a new NodeArray in its place.
       *
       * @param nodes The NodeArray to visit.
       * @param visitor The callback used to visit a Node.
       * @param test A node test to execute for each node.
       * @param start An optional value indicating the starting offset at which to start visiting.
       * @param count An optional value indicating the maximum number of nodes to visit.
       */
      function visitNodes<T extends Node>(nodes: NodeArray<T> | undefined, visitor: Visitor, test?: (node: Node) => boolean, start?: number, count?: number): NodeArray<T>;
      /**
       * Visits a NodeArray using the supplied visitor, possibly returning a new NodeArray in its place.
       *
       * @param nodes The NodeArray to visit.
       * @param visitor The callback used to visit a Node.
       * @param test A node test to execute for each node.
       * @param start An optional value indicating the starting offset at which to start visiting.
       * @param count An optional value indicating the maximum number of nodes to visit.
       */
      function visitNodes<T extends Node>(nodes: NodeArray<T> | undefined, visitor: Visitor, test?: (node: Node) => boolean, start?: number, count?: number): NodeArray<T> | undefined;
      /**
       * Starts a new lexical environment and visits a statement list, ending the lexical environment
       * and merging hoisted declarations upon completion.
       */
      function visitLexicalEnvironment(statements: NodeArray<Statement>, visitor: Visitor, context: TransformationContext, start?: number, ensureUseStrict?: boolean): NodeArray<Statement>;
      /**
       * Starts a new lexical environment and visits a parameter list, suspending the lexical
       * environment upon completion.
       */
      function visitParameterList(nodes: NodeArray<ParameterDeclaration>, visitor: Visitor, context: TransformationContext, nodesVisitor?: <T extends Node>(nodes: NodeArray<T>, visitor: Visitor, test?: (node: Node) => boolean, start?: number, count?: number) => NodeArray<T>): NodeArray<ParameterDeclaration>;
      function visitParameterList(nodes: NodeArray<ParameterDeclaration> | undefined, visitor: Visitor, context: TransformationContext, nodesVisitor?: <T extends Node>(nodes: NodeArray<T> | undefined, visitor: Visitor, test?: (node: Node) => boolean, start?: number, count?: number) => NodeArray<T> | undefined): NodeArray<ParameterDeclaration> | undefined;
      /**
       * Resumes a suspended lexical environment and visits a function body, ending the lexical
       * environment and merging hoisted declarations upon completion.
       */
      function visitFunctionBody(node: FunctionBody, visitor: Visitor, context: TransformationContext): FunctionBody;
      /**
       * Resumes a suspended lexical environment and visits a function body, ending the lexical
       * environment and merging hoisted declarations upon completion.
       */
      function visitFunctionBody(node: FunctionBody | undefined, visitor: Visitor, context: TransformationContext): FunctionBody | undefined;
      /**
       * Resumes a suspended lexical environment and visits a concise body, ending the lexical
       * environment and merging hoisted declarations upon completion.
       */
      function visitFunctionBody(node: ConciseBody, visitor: Visitor, context: TransformationContext): ConciseBody;
      /**
       * Visits each child of a Node using the supplied visitor, possibly returning a new Node of the same kind in its place.
       *
       * @param node The Node whose children will be visited.
       * @param visitor The callback used to visit each child.
       * @param context A lexical environment context for the visitor.
       */
      function visitEachChild<T extends Node>(node: T, visitor: Visitor, context: TransformationContext): T;
      /**
       * Visits each child of a Node using the supplied visitor, possibly returning a new Node of the same kind in its place.
       *
       * @param node The Node whose children will be visited.
       * @param visitor The callback used to visit each child.
       * @param context A lexical environment context for the visitor.
       */
      function visitEachChild<T extends Node>(node: T | undefined, visitor: Visitor, context: TransformationContext, nodesVisitor?: typeof visitNodes, tokenVisitor?: Visitor): T | undefined;
  }
  declare namespace ts {
      function getTsBuildInfoEmitOutputFilePath(options: CompilerOptions): string | undefined;
      function getOutputFileNames(commandLine: ParsedCommandLine, inputFileName: string, ignoreCase: boolean): readonly string[];
      function createPrinter(printerOptions?: PrinterOptions, handlers?: PrintHandlers): Printer;
  }
  declare namespace ts {
      export function findConfigFile(searchPath: string, fileExists: (fileName: string) => boolean, configName?: string): string | undefined;
      export function resolveTripleslashReference(moduleName: string, containingFile: string): string;
      export function createCompilerHost(options: CompilerOptions, setParentNodes?: boolean): CompilerHost;
      export function getPreEmitDiagnostics(program: Program, sourceFile?: SourceFile, cancellationToken?: CancellationToken): readonly Diagnostic[];
      export interface FormatDiagnosticsHost {
          getCurrentDirectory(): string;
          getCanonicalFileName(fileName: string): string;
          getNewLine(): string;
      }
      export function formatDiagnostics(diagnostics: readonly Diagnostic[], host: FormatDiagnosticsHost): string;
      export function formatDiagnostic(diagnostic: Diagnostic, host: FormatDiagnosticsHost): string;
      export function formatDiagnosticsWithColorAndContext(diagnostics: readonly Diagnostic[], host: FormatDiagnosticsHost): string;
      export function flattenDiagnosticMessageText(diag: string | DiagnosticMessageChain | undefined, newLine: string, indent?: number): string;
      export function getConfigFileParsingDiagnostics(configFileParseResult: ParsedCommandLine): readonly Diagnostic[];
      /**
       * Create a new 'Program' instance. A Program is an immutable collection of 'SourceFile's and a 'CompilerOptions'
       * that represent a compilation unit.
       *
       * Creating a program proceeds from a set of root files, expanding the set of inputs by following imports and
       * triple-slash-reference-path directives transitively. '@types' and triple-slash-reference-types are also pulled in.
       *
       * @param createProgramOptions - The options for creating a program.
       * @returns A 'Program' object.
       */
      export function createProgram(createProgramOptions: CreateProgramOptions): Program;
      /**
       * Create a new 'Program' instance. A Program is an immutable collection of 'SourceFile's and a 'CompilerOptions'
       * that represent a compilation unit.
       *
       * Creating a program proceeds from a set of root files, expanding the set of inputs by following imports and
       * triple-slash-reference-path directives transitively. '@types' and triple-slash-reference-types are also pulled in.
       *
       * @param rootNames - A set of root files.
       * @param options - The compiler options which should be used.
       * @param host - The host interacts with the underlying file system.
       * @param oldProgram - Reuses an old program structure.
       * @param configFileParsingDiagnostics - error during config file parsing
       * @returns A 'Program' object.
       */
      export function createProgram(rootNames: readonly string[], options: CompilerOptions, host?: CompilerHost, oldProgram?: Program, configFileParsingDiagnostics?: readonly Diagnostic[]): Program;
      /** @deprecated */ export interface ResolveProjectReferencePathHost {
          fileExists(fileName: string): boolean;
      }
      /**
       * Returns the target config filename of a project reference.
       * Note: The file might not exist.
       */
      export function resolveProjectReferencePath(ref: ProjectReference): ResolvedConfigFileName;
      /** @deprecated */ export function resolveProjectReferencePath(host: ResolveProjectReferencePathHost, ref: ProjectReference): ResolvedConfigFileName;
      export {};
  }
  declare namespace ts {
      interface EmitOutput {
          outputFiles: OutputFile[];
          emitSkipped: boolean;
      }
      interface OutputFile {
          name: string;
          writeByteOrderMark: boolean;
          text: string;
      }
  }
  declare namespace ts {
      type AffectedFileResult<T> = {
          result: T;
          affected: SourceFile | Program;
      } | undefined;
      interface BuilderProgramHost {
          /**
           * return true if file names are treated with case sensitivity
           */
          useCaseSensitiveFileNames(): boolean;
          /**
           * If provided this would be used this hash instead of actual file shape text for detecting changes
           */
          createHash?: (data: string) => string;
          /**
           * When emit or emitNextAffectedFile are called without writeFile,
           * this callback if present would be used to write files
           */
          writeFile?: WriteFileCallback;
      }
      /**
       * Builder to manage the program state changes
       */
      interface BuilderProgram {
          /**
           * Returns current program
           */
          getProgram(): Program;
          /**
           * Get compiler options of the program
           */
          getCompilerOptions(): CompilerOptions;
          /**
           * Get the source file in the program with file name
           */
          getSourceFile(fileName: string): SourceFile | undefined;
          /**
           * Get a list of files in the program
           */
          getSourceFiles(): readonly SourceFile[];
          /**
           * Get the diagnostics for compiler options
           */
          getOptionsDiagnostics(cancellationToken?: CancellationToken): readonly Diagnostic[];
          /**
           * Get the diagnostics that dont belong to any file
           */
          getGlobalDiagnostics(cancellationToken?: CancellationToken): readonly Diagnostic[];
          /**
           * Get the diagnostics from config file parsing
           */
          getConfigFileParsingDiagnostics(): readonly Diagnostic[];
          /**
           * Get the syntax diagnostics, for all source files if source file is not supplied
           */
          getSyntacticDiagnostics(sourceFile?: SourceFile, cancellationToken?: CancellationToken): readonly Diagnostic[];
          /**
           * Get the declaration diagnostics, for all source files if source file is not supplied
           */
          getDeclarationDiagnostics(sourceFile?: SourceFile, cancellationToken?: CancellationToken): readonly DiagnosticWithLocation[];
          /**
           * Get all the dependencies of the file
           */
          getAllDependencies(sourceFile: SourceFile): readonly string[];
          /**
           * Gets the semantic diagnostics from the program corresponding to this state of file (if provided) or whole program
           * The semantic diagnostics are cached and managed here
           * Note that it is assumed that when asked about semantic diagnostics through this API,
           * the file has been taken out of affected files so it is safe to use cache or get from program and cache the diagnostics
           * In case of SemanticDiagnosticsBuilderProgram if the source file is not provided,
           * it will iterate through all the affected files, to ensure that cache stays valid and yet provide a way to get all semantic diagnostics
           */
          getSemanticDiagnostics(sourceFile?: SourceFile, cancellationToken?: CancellationToken): readonly Diagnostic[];
          /**
           * Emits the JavaScript and declaration files.
           * When targetSource file is specified, emits the files corresponding to that source file,
           * otherwise for the whole program.
           * In case of EmitAndSemanticDiagnosticsBuilderProgram, when targetSourceFile is specified,
           * it is assumed that that file is handled from affected file list. If targetSourceFile is not specified,
           * it will only emit all the affected files instead of whole program
           *
           * The first of writeFile if provided, writeFile of BuilderProgramHost if provided, writeFile of compiler host
           * in that order would be used to write the files
           */
          emit(targetSourceFile?: SourceFile, writeFile?: WriteFileCallback, cancellationToken?: CancellationToken, emitOnlyDtsFiles?: boolean, customTransformers?: CustomTransformers): EmitResult;
          /**
           * Get the current directory of the program
           */
          getCurrentDirectory(): string;
      }
      /**
       * The builder that caches the semantic diagnostics for the program and handles the changed files and affected files
       */
      interface SemanticDiagnosticsBuilderProgram extends BuilderProgram {
          /**
           * Gets the semantic diagnostics from the program for the next affected file and caches it
           * Returns undefined if the iteration is complete
           */
          getSemanticDiagnosticsOfNextAffectedFile(cancellationToken?: CancellationToken, ignoreSourceFile?: (sourceFile: SourceFile) => boolean): AffectedFileResult<readonly Diagnostic[]>;
      }
      /**
       * The builder that can handle the changes in program and iterate through changed file to emit the files
       * The semantic diagnostics are cached per file and managed by clearing for the changed/affected files
       */
      interface EmitAndSemanticDiagnosticsBuilderProgram extends SemanticDiagnosticsBuilderProgram {
          /**
           * Emits the next affected file's emit result (EmitResult and sourceFiles emitted) or returns undefined if iteration is complete
           * The first of writeFile if provided, writeFile of BuilderProgramHost if provided, writeFile of compiler host
           * in that order would be used to write the files
           */
          emitNextAffectedFile(writeFile?: WriteFileCallback, cancellationToken?: CancellationToken, emitOnlyDtsFiles?: boolean, customTransformers?: CustomTransformers): AffectedFileResult<EmitResult>;
      }
      /**
       * Create the builder to manage semantic diagnostics and cache them
       */
      function createSemanticDiagnosticsBuilderProgram(newProgram: Program, host: BuilderProgramHost, oldProgram?: SemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[]): SemanticDiagnosticsBuilderProgram;
      function createSemanticDiagnosticsBuilderProgram(rootNames: readonly string[] | undefined, options: CompilerOptions | undefined, host?: CompilerHost, oldProgram?: SemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[], projectReferences?: readonly ProjectReference[]): SemanticDiagnosticsBuilderProgram;
      /**
       * Create the builder that can handle the changes in program and iterate through changed files
       * to emit the those files and manage semantic diagnostics cache as well
       */
      function createEmitAndSemanticDiagnosticsBuilderProgram(newProgram: Program, host: BuilderProgramHost, oldProgram?: EmitAndSemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[]): EmitAndSemanticDiagnosticsBuilderProgram;
      function createEmitAndSemanticDiagnosticsBuilderProgram(rootNames: readonly string[] | undefined, options: CompilerOptions | undefined, host?: CompilerHost, oldProgram?: EmitAndSemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[], projectReferences?: readonly ProjectReference[]): EmitAndSemanticDiagnosticsBuilderProgram;
      /**
       * Creates a builder thats just abstraction over program and can be used with watch
       */
      function createAbstractBuilder(newProgram: Program, host: BuilderProgramHost, oldProgram?: BuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[]): BuilderProgram;
      function createAbstractBuilder(rootNames: readonly string[] | undefined, options: CompilerOptions | undefined, host?: CompilerHost, oldProgram?: BuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[], projectReferences?: readonly ProjectReference[]): BuilderProgram;
  }
  declare namespace ts {
      interface ReadBuildProgramHost {
          useCaseSensitiveFileNames(): boolean;
          getCurrentDirectory(): string;
          readFile(fileName: string): string | undefined;
      }
      function readBuilderProgram(compilerOptions: CompilerOptions, host: ReadBuildProgramHost): EmitAndSemanticDiagnosticsBuilderProgram | undefined;
      function createIncrementalCompilerHost(options: CompilerOptions, system?: System): CompilerHost;
      interface IncrementalProgramOptions<T extends BuilderProgram> {
          rootNames: readonly string[];
          options: CompilerOptions;
          configFileParsingDiagnostics?: readonly Diagnostic[];
          projectReferences?: readonly ProjectReference[];
          host?: CompilerHost;
          createProgram?: CreateProgram<T>;
      }
      function createIncrementalProgram<T extends BuilderProgram = EmitAndSemanticDiagnosticsBuilderProgram>({ rootNames, options, configFileParsingDiagnostics, projectReferences, host, createProgram }: IncrementalProgramOptions<T>): T;
      type WatchStatusReporter = (diagnostic: Diagnostic, newLine: string, options: CompilerOptions, errorCount?: number) => void;
      /** Create the program with rootNames and options, if they are undefined, oldProgram and new configFile diagnostics create new program */
      type CreateProgram<T extends BuilderProgram> = (rootNames: readonly string[] | undefined, options: CompilerOptions | undefined, host?: CompilerHost, oldProgram?: T, configFileParsingDiagnostics?: readonly Diagnostic[], projectReferences?: readonly ProjectReference[] | undefined) => T;
      /** Host that has watch functionality used in --watch mode */
      interface WatchHost {
          /** If provided, called with Diagnostic message that informs about change in watch status */
          onWatchStatusChange?(diagnostic: Diagnostic, newLine: string, options: CompilerOptions, errorCount?: number): void;
          /** Used to watch changes in source files, missing files needed to update the program or config file */
          watchFile(path: string, callback: FileWatcherCallback, pollingInterval?: number, options?: CompilerOptions): FileWatcher;
          /** Used to watch resolved module's failed lookup locations, config file specs, type roots where auto type reference directives are added */
          watchDirectory(path: string, callback: DirectoryWatcherCallback, recursive?: boolean, options?: CompilerOptions): FileWatcher;
          /** If provided, will be used to set delayed compilation, so that multiple changes in short span are compiled together */
          setTimeout?(callback: (...args: any[]) => void, ms: number, ...args: any[]): any;
          /** If provided, will be used to reset existing delayed compilation */
          clearTimeout?(timeoutId: any): void;
      }
      interface ProgramHost<T extends BuilderProgram> {
          /**
           * Used to create the program when need for program creation or recreation detected
           */
          createProgram: CreateProgram<T>;
          useCaseSensitiveFileNames(): boolean;
          getNewLine(): string;
          getCurrentDirectory(): string;
          getDefaultLibFileName(options: CompilerOptions): string;
          getDefaultLibLocation?(): string;
          createHash?(data: string): string;
          /**
           * Use to check file presence for source files and
           * if resolveModuleNames is not provided (complier is in charge of module resolution) then module files as well
           */
          fileExists(path: string): boolean;
          /**
           * Use to read file text for source files and
           * if resolveModuleNames is not provided (complier is in charge of module resolution) then module files as well
           */
          readFile(path: string, encoding?: string): string | undefined;
          /** If provided, used for module resolution as well as to handle directory structure */
          directoryExists?(path: string): boolean;
          /** If provided, used in resolutions as well as handling directory structure */
          getDirectories?(path: string): string[];
          /** If provided, used to cache and handle directory structure modifications */
          readDirectory?(path: string, extensions?: readonly string[], exclude?: readonly string[], include?: readonly string[], depth?: number): string[];
          /** Symbol links resolution */
          realpath?(path: string): string;
          /** If provided would be used to write log about compilation */
          trace?(s: string): void;
          /** If provided is used to get the environment variable */
          getEnvironmentVariable?(name: string): string | undefined;
          /** If provided, used to resolve the module names, otherwise typescript's default module resolution */
          resolveModuleNames?(moduleNames: string[], containingFile: string, reusedNames: string[] | undefined, redirectedReference: ResolvedProjectReference | undefined, options: CompilerOptions): (ResolvedModule | undefined)[];
          /** If provided, used to resolve type reference directives, otherwise typescript's default resolution */
          resolveTypeReferenceDirectives?(typeReferenceDirectiveNames: string[], containingFile: string, redirectedReference: ResolvedProjectReference | undefined, options: CompilerOptions): (ResolvedTypeReferenceDirective | undefined)[];
      }
      interface WatchCompilerHost<T extends BuilderProgram> extends ProgramHost<T>, WatchHost {
          /** Instead of using output d.ts file from project reference, use its source file */
          useSourceOfProjectReferenceRedirect?(): boolean;
          /** If provided, callback to invoke after every new program creation */
          afterProgramCreate?(program: T): void;
      }
      /**
       * Host to create watch with root files and options
       */
      interface WatchCompilerHostOfFilesAndCompilerOptions<T extends BuilderProgram> extends WatchCompilerHost<T> {
          /** root files to use to generate program */
          rootFiles: string[];
          /** Compiler options */
          options: CompilerOptions;
          watchOptions?: WatchOptions;
          /** Project References */
          projectReferences?: readonly ProjectReference[];
      }
      /**
       * Host to create watch with config file
       */
      interface WatchCompilerHostOfConfigFile<T extends BuilderProgram> extends WatchCompilerHost<T>, ConfigFileDiagnosticsReporter {
          /** Name of the config file to compile */
          configFileName: string;
          /** Options to extend */
          optionsToExtend?: CompilerOptions;
          watchOptionsToExtend?: WatchOptions;
          extraFileExtensions?: readonly FileExtensionInfo[];
          /**
           * Used to generate source file names from the config file and its include, exclude, files rules
           * and also to cache the directory stucture
           */
          readDirectory(path: string, extensions?: readonly string[], exclude?: readonly string[], include?: readonly string[], depth?: number): string[];
      }
      interface Watch<T> {
          /** Synchronize with host and get updated program */
          getProgram(): T;
          /** Closes the watch */
          close(): void;
      }
      /**
       * Creates the watch what generates program using the config file
       */
      interface WatchOfConfigFile<T> extends Watch<T> {
      }
      /**
       * Creates the watch that generates program using the root files and compiler options
       */
      interface WatchOfFilesAndCompilerOptions<T> extends Watch<T> {
          /** Updates the root files in the program, only if this is not config file compilation */
          updateRootFileNames(fileNames: string[]): void;
      }
      /**
       * Create the watch compiler host for either configFile or fileNames and its options
       */
      function createWatchCompilerHost<T extends BuilderProgram>(configFileName: string, optionsToExtend: CompilerOptions | undefined, system: System, createProgram?: CreateProgram<T>, reportDiagnostic?: DiagnosticReporter, reportWatchStatus?: WatchStatusReporter, watchOptionsToExtend?: WatchOptions, extraFileExtensions?: readonly FileExtensionInfo[]): WatchCompilerHostOfConfigFile<T>;
      function createWatchCompilerHost<T extends BuilderProgram>(rootFiles: string[], options: CompilerOptions, system: System, createProgram?: CreateProgram<T>, reportDiagnostic?: DiagnosticReporter, reportWatchStatus?: WatchStatusReporter, projectReferences?: readonly ProjectReference[], watchOptions?: WatchOptions): WatchCompilerHostOfFilesAndCompilerOptions<T>;
      /**
       * Creates the watch from the host for root files and compiler options
       */
      function createWatchProgram<T extends BuilderProgram>(host: WatchCompilerHostOfFilesAndCompilerOptions<T>): WatchOfFilesAndCompilerOptions<T>;
      /**
       * Creates the watch from the host for config file
       */
      function createWatchProgram<T extends BuilderProgram>(host: WatchCompilerHostOfConfigFile<T>): WatchOfConfigFile<T>;
  }
  declare namespace ts {
      interface BuildOptions {
          dry?: boolean;
          force?: boolean;
          verbose?: boolean;
          incremental?: boolean;
          assumeChangesOnlyAffectDirectDependencies?: boolean;
          traceResolution?: boolean;
          [option: string]: CompilerOptionsValue | undefined;
      }
      type ReportEmitErrorSummary = (errorCount: number) => void;
      interface SolutionBuilderHostBase<T extends BuilderProgram> extends ProgramHost<T> {
          createDirectory?(path: string): void;
          /**
           * Should provide create directory and writeFile if done of invalidatedProjects is not invoked with
           * writeFileCallback
           */
          writeFile?(path: string, data: string, writeByteOrderMark?: boolean): void;
          getModifiedTime(fileName: string): Date | undefined;
          setModifiedTime(fileName: string, date: Date): void;
          deleteFile(fileName: string): void;
          getParsedCommandLine?(fileName: string): ParsedCommandLine | undefined;
          reportDiagnostic: DiagnosticReporter;
          reportSolutionBuilderStatus: DiagnosticReporter;
          afterProgramEmitAndDiagnostics?(program: T): void;
      }
      interface SolutionBuilderHost<T extends BuilderProgram> extends SolutionBuilderHostBase<T> {
          reportErrorSummary?: ReportEmitErrorSummary;
      }
      interface SolutionBuilderWithWatchHost<T extends BuilderProgram> extends SolutionBuilderHostBase<T>, WatchHost {
      }
      interface SolutionBuilder<T extends BuilderProgram> {
          build(project?: string, cancellationToken?: CancellationToken): ExitStatus;
          clean(project?: string): ExitStatus;
          buildReferences(project: string, cancellationToken?: CancellationToken): ExitStatus;
          cleanReferences(project?: string): ExitStatus;
          getNextInvalidatedProject(cancellationToken?: CancellationToken): InvalidatedProject<T> | undefined;
      }
      /**
       * Create a function that reports watch status by writing to the system and handles the formating of the diagnostic
       */
      function createBuilderStatusReporter(system: System, pretty?: boolean): DiagnosticReporter;
      function createSolutionBuilderHost<T extends BuilderProgram = EmitAndSemanticDiagnosticsBuilderProgram>(system?: System, createProgram?: CreateProgram<T>, reportDiagnostic?: DiagnosticReporter, reportSolutionBuilderStatus?: DiagnosticReporter, reportErrorSummary?: ReportEmitErrorSummary): SolutionBuilderHost<T>;
      function createSolutionBuilderWithWatchHost<T extends BuilderProgram = EmitAndSemanticDiagnosticsBuilderProgram>(system?: System, createProgram?: CreateProgram<T>, reportDiagnostic?: DiagnosticReporter, reportSolutionBuilderStatus?: DiagnosticReporter, reportWatchStatus?: WatchStatusReporter): SolutionBuilderWithWatchHost<T>;
      function createSolutionBuilder<T extends BuilderProgram>(host: SolutionBuilderHost<T>, rootNames: readonly string[], defaultOptions: BuildOptions): SolutionBuilder<T>;
      function createSolutionBuilderWithWatch<T extends BuilderProgram>(host: SolutionBuilderWithWatchHost<T>, rootNames: readonly string[], defaultOptions: BuildOptions, baseWatchOptions?: WatchOptions): SolutionBuilder<T>;
      enum InvalidatedProjectKind {
          Build = 0,
          UpdateBundle = 1,
          UpdateOutputFileStamps = 2
      }
      interface InvalidatedProjectBase {
          readonly kind: InvalidatedProjectKind;
          readonly project: ResolvedConfigFileName;
          /**
           *  To dispose this project and ensure that all the necessary actions are taken and state is updated accordingly
           */
          done(cancellationToken?: CancellationToken, writeFile?: WriteFileCallback, customTransformers?: CustomTransformers): ExitStatus;
          getCompilerOptions(): CompilerOptions;
          getCurrentDirectory(): string;
      }
      interface UpdateOutputFileStampsProject extends InvalidatedProjectBase {
          readonly kind: InvalidatedProjectKind.UpdateOutputFileStamps;
          updateOutputFileStatmps(): void;
      }
      interface BuildInvalidedProject<T extends BuilderProgram> extends InvalidatedProjectBase {
          readonly kind: InvalidatedProjectKind.Build;
          getBuilderProgram(): T | undefined;
          getProgram(): Program | undefined;
          getSourceFile(fileName: string): SourceFile | undefined;
          getSourceFiles(): readonly SourceFile[];
          getOptionsDiagnostics(cancellationToken?: CancellationToken): readonly Diagnostic[];
          getGlobalDiagnostics(cancellationToken?: CancellationToken): readonly Diagnostic[];
          getConfigFileParsingDiagnostics(): readonly Diagnostic[];
          getSyntacticDiagnostics(sourceFile?: SourceFile, cancellationToken?: CancellationToken): readonly Diagnostic[];
          getAllDependencies(sourceFile: SourceFile): readonly string[];
          getSemanticDiagnostics(sourceFile?: SourceFile, cancellationToken?: CancellationToken): readonly Diagnostic[];
          getSemanticDiagnosticsOfNextAffectedFile(cancellationToken?: CancellationToken, ignoreSourceFile?: (sourceFile: SourceFile) => boolean): AffectedFileResult<readonly Diagnostic[]>;
          emit(targetSourceFile?: SourceFile, writeFile?: WriteFileCallback, cancellationToken?: CancellationToken, emitOnlyDtsFiles?: boolean, customTransformers?: CustomTransformers): EmitResult | undefined;
      }
      interface UpdateBundleProject<T extends BuilderProgram> extends InvalidatedProjectBase {
          readonly kind: InvalidatedProjectKind.UpdateBundle;
          emit(writeFile?: WriteFileCallback, customTransformers?: CustomTransformers): EmitResult | BuildInvalidedProject<T> | undefined;
      }
      type InvalidatedProject<T extends BuilderProgram> = UpdateOutputFileStampsProject | BuildInvalidedProject<T> | UpdateBundleProject<T>;
  }
  declare namespace ts.server {
      type ActionSet = "action::set";
      type ActionInvalidate = "action::invalidate";
      type ActionPackageInstalled = "action::packageInstalled";
      type EventTypesRegistry = "event::typesRegistry";
      type EventBeginInstallTypes = "event::beginInstallTypes";
      type EventEndInstallTypes = "event::endInstallTypes";
      type EventInitializationFailed = "event::initializationFailed";
  }
  declare namespace ts.server {
      interface TypingInstallerResponse {
          readonly kind: ActionSet | ActionInvalidate | EventTypesRegistry | ActionPackageInstalled | EventBeginInstallTypes | EventEndInstallTypes | EventInitializationFailed;
      }
      interface TypingInstallerRequestWithProjectName {
          readonly projectName: string;
      }
      interface DiscoverTypings extends TypingInstallerRequestWithProjectName {
          readonly fileNames: string[];
          readonly projectRootPath: Path;
          readonly compilerOptions: CompilerOptions;
          readonly watchOptions?: WatchOptions;
          readonly typeAcquisition: TypeAcquisition;
          readonly unresolvedImports: SortedReadonlyArray<string>;
          readonly cachePath?: string;
          readonly kind: "discover";
      }
      interface CloseProject extends TypingInstallerRequestWithProjectName {
          readonly kind: "closeProject";
      }
      interface TypesRegistryRequest {
          readonly kind: "typesRegistry";
      }
      interface InstallPackageRequest extends TypingInstallerRequestWithProjectName {
          readonly kind: "installPackage";
          readonly fileName: Path;
          readonly packageName: string;
          readonly projectRootPath: Path;
      }
      interface PackageInstalledResponse extends ProjectResponse {
          readonly kind: ActionPackageInstalled;
          readonly success: boolean;
          readonly message: string;
      }
      interface InitializationFailedResponse extends TypingInstallerResponse {
          readonly kind: EventInitializationFailed;
          readonly message: string;
      }
      interface ProjectResponse extends TypingInstallerResponse {
          readonly projectName: string;
      }
      interface InvalidateCachedTypings extends ProjectResponse {
          readonly kind: ActionInvalidate;
      }
      interface InstallTypes extends ProjectResponse {
          readonly kind: EventBeginInstallTypes | EventEndInstallTypes;
          readonly eventId: number;
          readonly typingsInstallerVersion: string;
          readonly packagesToInstall: readonly string[];
      }
      interface BeginInstallTypes extends InstallTypes {
          readonly kind: EventBeginInstallTypes;
      }
      interface EndInstallTypes extends InstallTypes {
          readonly kind: EventEndInstallTypes;
          readonly installSuccess: boolean;
      }
      interface SetTypings extends ProjectResponse {
          readonly typeAcquisition: TypeAcquisition;
          readonly compilerOptions: CompilerOptions;
          readonly typings: string[];
          readonly unresolvedImports: SortedReadonlyArray<string>;
          readonly kind: ActionSet;
      }
  }
  declare namespace ts {
      interface Node {
          getSourceFile(): SourceFile;
          getChildCount(sourceFile?: SourceFile): number;
          getChildAt(index: number, sourceFile?: SourceFile): Node;
          getChildren(sourceFile?: SourceFile): Node[];
          getStart(sourceFile?: SourceFile, includeJsDocComment?: boolean): number;
          getFullStart(): number;
          getEnd(): number;
          getWidth(sourceFile?: SourceFileLike): number;
          getFullWidth(): number;
          getLeadingTriviaWidth(sourceFile?: SourceFile): number;
          getFullText(sourceFile?: SourceFile): string;
          getText(sourceFile?: SourceFile): string;
          getFirstToken(sourceFile?: SourceFile): Node | undefined;
          getLastToken(sourceFile?: SourceFile): Node | undefined;
          forEachChild<T>(cbNode: (node: Node) => T | undefined, cbNodeArray?: (nodes: NodeArray<Node>) => T | undefined): T | undefined;
      }
      interface Identifier {
          readonly text: string;
      }
      interface PrivateIdentifier {
          readonly text: string;
      }
      interface Symbol {
          readonly name: string;
          getFlags(): SymbolFlags;
          getEscapedName(): __String;
          getName(): string;
          getDeclarations(): Declaration[] | undefined;
          getDocumentationComment(typeChecker: TypeChecker | undefined): SymbolDisplayPart[];
          getJsDocTags(): JSDocTagInfo[];
      }
      interface Type {
          getFlags(): TypeFlags;
          getSymbol(): Symbol | undefined;
          getProperties(): Symbol[];
          getProperty(propertyName: string): Symbol | undefined;
          getApparentProperties(): Symbol[];
          getCallSignatures(): readonly Signature[];
          getConstructSignatures(): readonly Signature[];
          getStringIndexType(): Type | undefined;
          getNumberIndexType(): Type | undefined;
          getBaseTypes(): BaseType[] | undefined;
          getNonNullableType(): Type;
          getConstraint(): Type | undefined;
          getDefault(): Type | undefined;
          isUnion(): this is UnionType;
          isIntersection(): this is IntersectionType;
          isUnionOrIntersection(): this is UnionOrIntersectionType;
          isLiteral(): this is LiteralType;
          isStringLiteral(): this is StringLiteralType;
          isNumberLiteral(): this is NumberLiteralType;
          isTypeParameter(): this is TypeParameter;
          isClassOrInterface(): this is InterfaceType;
          isClass(): this is InterfaceType;
      }
      interface TypeReference {
          typeArguments?: readonly Type[];
      }
      interface Signature {
          getDeclaration(): SignatureDeclaration;
          getTypeParameters(): TypeParameter[] | undefined;
          getParameters(): Symbol[];
          getReturnType(): Type;
          getDocumentationComment(typeChecker: TypeChecker | undefined): SymbolDisplayPart[];
          getJsDocTags(): JSDocTagInfo[];
      }
      interface SourceFile {
          getLineAndCharacterOfPosition(pos: number): LineAndCharacter;
          getLineEndOfPosition(pos: number): number;
          getLineStarts(): readonly number[];
          getPositionOfLineAndCharacter(line: number, character: number): number;
          update(newText: string, textChangeRange: TextChangeRange): SourceFile;
      }
      interface SourceFileLike {
          getLineAndCharacterOfPosition(pos: number): LineAndCharacter;
      }
      interface SourceMapSource {
          getLineAndCharacterOfPosition(pos: number): LineAndCharacter;
      }
      /**
       * Represents an immutable snapshot of a script at a specified time.Once acquired, the
       * snapshot is observably immutable. i.e. the same calls with the same parameters will return
       * the same values.
       */
      interface IScriptSnapshot {
          /** Gets a portion of the script snapshot specified by [start, end). */
          getText(start: number, end: number): string;
          /** Gets the length of this script snapshot. */
          getLength(): number;
          /**
           * Gets the TextChangeRange that describe how the text changed between this text and
           * an older version.  This information is used by the incremental parser to determine
           * what sections of the script need to be re-parsed.  'undefined' can be returned if the
           * change range cannot be determined.  However, in that case, incremental parsing will
           * not happen and the entire document will be re - parsed.
           */
          getChangeRange(oldSnapshot: IScriptSnapshot): TextChangeRange | undefined;
          /** Releases all resources held by this script snapshot */
          dispose?(): void;
      }
      namespace ScriptSnapshot {
          function fromString(text: string): IScriptSnapshot;
      }
      interface PreProcessedFileInfo {
          referencedFiles: FileReference[];
          typeReferenceDirectives: FileReference[];
          libReferenceDirectives: FileReference[];
          importedFiles: FileReference[];
          ambientExternalModules?: string[];
          isLibFile: boolean;
      }
      interface HostCancellationToken {
          isCancellationRequested(): boolean;
      }
      interface InstallPackageOptions {
          fileName: Path;
          packageName: string;
      }
      interface LanguageServiceHost extends GetEffectiveTypeRootsHost {
          getCompilationSettings(): CompilerOptions;
          getNewLine?(): string;
          getProjectVersion?(): string;
          getScriptFileNames(): string[];
          getScriptKind?(fileName: string): ScriptKind;
          getScriptVersion(fileName: string): string;
          getScriptSnapshot(fileName: string): IScriptSnapshot | undefined;
          getProjectReferences?(): readonly ProjectReference[] | undefined;
          getLocalizedDiagnosticMessages?(): any;
          getCancellationToken?(): HostCancellationToken;
          getCurrentDirectory(): string;
          getDefaultLibFileName(options: CompilerOptions): string;
          log?(s: string): void;
          trace?(s: string): void;
          error?(s: string): void;
          useCaseSensitiveFileNames?(): boolean;
          readDirectory?(path: string, extensions?: readonly string[], exclude?: readonly string[], include?: readonly string[], depth?: number): string[];
          readFile?(path: string, encoding?: string): string | undefined;
          realpath?(path: string): string;
          fileExists?(path: string): boolean;
          getTypeRootsVersion?(): number;
          resolveModuleNames?(moduleNames: string[], containingFile: string, reusedNames: string[] | undefined, redirectedReference: ResolvedProjectReference | undefined, options: CompilerOptions): (ResolvedModule | undefined)[];
          getResolvedModuleWithFailedLookupLocationsFromCache?(modulename: string, containingFile: string): ResolvedModuleWithFailedLookupLocations | undefined;
          resolveTypeReferenceDirectives?(typeDirectiveNames: string[], containingFile: string, redirectedReference: ResolvedProjectReference | undefined, options: CompilerOptions): (ResolvedTypeReferenceDirective | undefined)[];
          getDirectories?(directoryName: string): string[];
          /**
           * Gets a set of custom transformers to use during emit.
           */
          getCustomTransformers?(): CustomTransformers | undefined;
          isKnownTypesPackageName?(name: string): boolean;
          installPackage?(options: InstallPackageOptions): Promise<ApplyCodeActionCommandResult>;
          writeFile?(fileName: string, content: string): void;
      }
      type WithMetadata<T> = T & {
          metadata?: unknown;
      };
      interface LanguageService {
          /** This is used as a part of restarting the language service. */
          cleanupSemanticCache(): void;
          /**
           * Gets errors indicating invalid syntax in a file.
           *
           * In English, "this cdeo have, erorrs" is syntactically invalid because it has typos,
           * grammatical errors, and misplaced punctuation. Likewise, examples of syntax
           * errors in TypeScript are missing parentheses in an `if` statement, mismatched
           * curly braces, and using a reserved keyword as a variable name.
           *
           * These diagnostics are inexpensive to compute and don't require knowledge of
           * other files. Note that a non-empty result increases the likelihood of false positives
           * from `getSemanticDiagnostics`.
           *
           * While these represent the majority of syntax-related diagnostics, there are some
           * that require the type system, which will be present in `getSemanticDiagnostics`.
           *
           * @param fileName A path to the file you want syntactic diagnostics for
           */
          getSyntacticDiagnostics(fileName: string): DiagnosticWithLocation[];
          /**
           * Gets warnings or errors indicating type system issues in a given file.
           * Requesting semantic diagnostics may start up the type system and
           * run deferred work, so the first call may take longer than subsequent calls.
           *
           * Unlike the other get*Diagnostics functions, these diagnostics can potentially not
           * include a reference to a source file. Specifically, the first time this is called,
           * it will return global diagnostics with no associated location.
           *
           * To contrast the differences between semantic and syntactic diagnostics, consider the
           * sentence: "The sun is green." is syntactically correct; those are real English words with
           * correct sentence structure. However, it is semantically invalid, because it is not true.
           *
           * @param fileName A path to the file you want semantic diagnostics for
           */
          getSemanticDiagnostics(fileName: string): Diagnostic[];
          /**
           * Gets suggestion diagnostics for a specific file. These diagnostics tend to
           * proactively suggest refactors, as opposed to diagnostics that indicate
           * potentially incorrect runtime behavior.
           *
           * @param fileName A path to the file you want semantic diagnostics for
           */
          getSuggestionDiagnostics(fileName: string): DiagnosticWithLocation[];
          /**
           * Gets global diagnostics related to the program configuration and compiler options.
           */
          getCompilerOptionsDiagnostics(): Diagnostic[];
          /** @deprecated Use getEncodedSyntacticClassifications instead. */
          getSyntacticClassifications(fileName: string, span: TextSpan): ClassifiedSpan[];
          /** @deprecated Use getEncodedSemanticClassifications instead. */
          getSemanticClassifications(fileName: string, span: TextSpan): ClassifiedSpan[];
          getEncodedSyntacticClassifications(fileName: string, span: TextSpan): Classifications;
          getEncodedSemanticClassifications(fileName: string, span: TextSpan): Classifications;
          /**
           * Gets completion entries at a particular position in a file.
           *
           * @param fileName The path to the file
           * @param position A zero-based index of the character where you want the entries
           * @param options An object describing how the request was triggered and what kinds
           * of code actions can be returned with the completions.
           */
          getCompletionsAtPosition(fileName: string, position: number, options: GetCompletionsAtPositionOptions | undefined): WithMetadata<CompletionInfo> | undefined;
          /**
           * Gets the extended details for a completion entry retrieved from `getCompletionsAtPosition`.
           *
           * @param fileName The path to the file
           * @param position A zero based index of the character where you want the entries
           * @param entryName The name from an existing completion which came from `getCompletionsAtPosition`
           * @param formatOptions How should code samples in the completions be formatted, can be undefined for backwards compatibility
           * @param source Source code for the current file, can be undefined for backwards compatibility
           * @param preferences User settings, can be undefined for backwards compatibility
           */
          getCompletionEntryDetails(fileName: string, position: number, entryName: string, formatOptions: FormatCodeOptions | FormatCodeSettings | undefined, source: string | undefined, preferences: UserPreferences | undefined): CompletionEntryDetails | undefined;
          getCompletionEntrySymbol(fileName: string, position: number, name: string, source: string | undefined): Symbol | undefined;
          /**
           * Gets semantic information about the identifier at a particular position in a
           * file. Quick info is what you typically see when you hover in an editor.
           *
           * @param fileName The path to the file
           * @param position A zero-based index of the character where you want the quick info
           */
          getQuickInfoAtPosition(fileName: string, position: number): QuickInfo | undefined;
          getNameOrDottedNameSpan(fileName: string, startPos: number, endPos: number): TextSpan | undefined;
          getBreakpointStatementAtPosition(fileName: string, position: number): TextSpan | undefined;
          getSignatureHelpItems(fileName: string, position: number, options: SignatureHelpItemsOptions | undefined): SignatureHelpItems | undefined;
          getRenameInfo(fileName: string, position: number, options?: RenameInfoOptions): RenameInfo;
          findRenameLocations(fileName: string, position: number, findInStrings: boolean, findInComments: boolean, providePrefixAndSuffixTextForRename?: boolean): readonly RenameLocation[] | undefined;
          getSmartSelectionRange(fileName: string, position: number): SelectionRange;
          getDefinitionAtPosition(fileName: string, position: number): readonly DefinitionInfo[] | undefined;
          getDefinitionAndBoundSpan(fileName: string, position: number): DefinitionInfoAndBoundSpan | undefined;
          getTypeDefinitionAtPosition(fileName: string, position: number): readonly DefinitionInfo[] | undefined;
          getImplementationAtPosition(fileName: string, position: number): readonly ImplementationLocation[] | undefined;
          getReferencesAtPosition(fileName: string, position: number): ReferenceEntry[] | undefined;
          findReferences(fileName: string, position: number): ReferencedSymbol[] | undefined;
          getDocumentHighlights(fileName: string, position: number, filesToSearch: string[]): DocumentHighlights[] | undefined;
          /** @deprecated */
          getOccurrencesAtPosition(fileName: string, position: number): readonly ReferenceEntry[] | undefined;
          getNavigateToItems(searchValue: string, maxResultCount?: number, fileName?: string, excludeDtsFiles?: boolean): NavigateToItem[];
          getNavigationBarItems(fileName: string): NavigationBarItem[];
          getNavigationTree(fileName: string): NavigationTree;
          prepareCallHierarchy(fileName: string, position: number): CallHierarchyItem | CallHierarchyItem[] | undefined;
          provideCallHierarchyIncomingCalls(fileName: string, position: number): CallHierarchyIncomingCall[];
          provideCallHierarchyOutgoingCalls(fileName: string, position: number): CallHierarchyOutgoingCall[];
          getOutliningSpans(fileName: string): OutliningSpan[];
          getTodoComments(fileName: string, descriptors: TodoCommentDescriptor[]): TodoComment[];
          getBraceMatchingAtPosition(fileName: string, position: number): TextSpan[];
          getIndentationAtPosition(fileName: string, position: number, options: EditorOptions | EditorSettings): number;
          getFormattingEditsForRange(fileName: string, start: number, end: number, options: FormatCodeOptions | FormatCodeSettings): TextChange[];
          getFormattingEditsForDocument(fileName: string, options: FormatCodeOptions | FormatCodeSettings): TextChange[];
          getFormattingEditsAfterKeystroke(fileName: string, position: number, key: string, options: FormatCodeOptions | FormatCodeSettings): TextChange[];
          getDocCommentTemplateAtPosition(fileName: string, position: number): TextInsertion | undefined;
          isValidBraceCompletionAtPosition(fileName: string, position: number, openingBrace: number): boolean;
          /**
           * This will return a defined result if the position is after the `>` of the opening tag, or somewhere in the text, of a JSXElement with no closing tag.
           * Editors should call this after `>` is typed.
           */
          getJsxClosingTagAtPosition(fileName: string, position: number): JsxClosingTagInfo | undefined;
          getSpanOfEnclosingComment(fileName: string, position: number, onlyMultiLine: boolean): TextSpan | undefined;
          toLineColumnOffset?(fileName: string, position: number): LineAndCharacter;
          getCodeFixesAtPosition(fileName: string, start: number, end: number, errorCodes: readonly number[], formatOptions: FormatCodeSettings, preferences: UserPreferences): readonly CodeFixAction[];
          getCombinedCodeFix(scope: CombinedCodeFixScope, fixId: {}, formatOptions: FormatCodeSettings, preferences: UserPreferences): CombinedCodeActions;
          applyCodeActionCommand(action: CodeActionCommand, formatSettings?: FormatCodeSettings): Promise<ApplyCodeActionCommandResult>;
          applyCodeActionCommand(action: CodeActionCommand[], formatSettings?: FormatCodeSettings): Promise<ApplyCodeActionCommandResult[]>;
          applyCodeActionCommand(action: CodeActionCommand | CodeActionCommand[], formatSettings?: FormatCodeSettings): Promise<ApplyCodeActionCommandResult | ApplyCodeActionCommandResult[]>;
          /** @deprecated `fileName` will be ignored */
          applyCodeActionCommand(fileName: string, action: CodeActionCommand): Promise<ApplyCodeActionCommandResult>;
          /** @deprecated `fileName` will be ignored */
          applyCodeActionCommand(fileName: string, action: CodeActionCommand[]): Promise<ApplyCodeActionCommandResult[]>;
          /** @deprecated `fileName` will be ignored */
          applyCodeActionCommand(fileName: string, action: CodeActionCommand | CodeActionCommand[]): Promise<ApplyCodeActionCommandResult | ApplyCodeActionCommandResult[]>;
          getApplicableRefactors(fileName: string, positionOrRange: number | TextRange, preferences: UserPreferences | undefined): ApplicableRefactorInfo[];
          getEditsForRefactor(fileName: string, formatOptions: FormatCodeSettings, positionOrRange: number | TextRange, refactorName: string, actionName: string, preferences: UserPreferences | undefined): RefactorEditInfo | undefined;
          organizeImports(scope: OrganizeImportsScope, formatOptions: FormatCodeSettings, preferences: UserPreferences | undefined): readonly FileTextChanges[];
          getEditsForFileRename(oldFilePath: string, newFilePath: string, formatOptions: FormatCodeSettings, preferences: UserPreferences | undefined): readonly FileTextChanges[];
          getEmitOutput(fileName: string, emitOnlyDtsFiles?: boolean, forceDtsEmit?: boolean): EmitOutput;
          getProgram(): Program | undefined;
          dispose(): void;
      }
      interface JsxClosingTagInfo {
          readonly newText: string;
      }
      interface CombinedCodeFixScope {
          type: "file";
          fileName: string;
      }
      type OrganizeImportsScope = CombinedCodeFixScope;
      type CompletionsTriggerCharacter = "." | '"' | "'" | "`" | "/" | "@" | "<" | "#";
      interface GetCompletionsAtPositionOptions extends UserPreferences {
          /**
           * If the editor is asking for completions because a certain character was typed
           * (as opposed to when the user explicitly requested them) this should be set.
           */
          triggerCharacter?: CompletionsTriggerCharacter;
          /** @deprecated Use includeCompletionsForModuleExports */
          includeExternalModuleExports?: boolean;
          /** @deprecated Use includeCompletionsWithInsertText */
          includeInsertTextCompletions?: boolean;
      }
      type SignatureHelpTriggerCharacter = "," | "(" | "<";
      type SignatureHelpRetriggerCharacter = SignatureHelpTriggerCharacter | ")";
      interface SignatureHelpItemsOptions {
          triggerReason?: SignatureHelpTriggerReason;
      }
      type SignatureHelpTriggerReason = SignatureHelpInvokedReason | SignatureHelpCharacterTypedReason | SignatureHelpRetriggeredReason;
      /**
       * Signals that the user manually requested signature help.
       * The language service will unconditionally attempt to provide a result.
       */
      interface SignatureHelpInvokedReason {
          kind: "invoked";
          triggerCharacter?: undefined;
      }
      /**
       * Signals that the signature help request came from a user typing a character.
       * Depending on the character and the syntactic context, the request may or may not be served a result.
       */
      interface SignatureHelpCharacterTypedReason {
          kind: "characterTyped";
          /**
           * Character that was responsible for triggering signature help.
           */
          triggerCharacter: SignatureHelpTriggerCharacter;
      }
      /**
       * Signals that this signature help request came from typing a character or moving the cursor.
       * This should only occur if a signature help session was already active and the editor needs to see if it should adjust.
       * The language service will unconditionally attempt to provide a result.
       * `triggerCharacter` can be `undefined` for a retrigger caused by a cursor move.
       */
      interface SignatureHelpRetriggeredReason {
          kind: "retrigger";
          /**
           * Character that was responsible for triggering signature help.
           */
          triggerCharacter?: SignatureHelpRetriggerCharacter;
      }
      interface ApplyCodeActionCommandResult {
          successMessage: string;
      }
      interface Classifications {
          spans: number[];
          endOfLineState: EndOfLineState;
      }
      interface ClassifiedSpan {
          textSpan: TextSpan;
          classificationType: ClassificationTypeNames;
      }
      /**
       * Navigation bar interface designed for visual studio's dual-column layout.
       * This does not form a proper tree.
       * The navbar is returned as a list of top-level items, each of which has a list of child items.
       * Child items always have an empty array for their `childItems`.
       */
      interface NavigationBarItem {
          text: string;
          kind: ScriptElementKind;
          kindModifiers: string;
          spans: TextSpan[];
          childItems: NavigationBarItem[];
          indent: number;
          bolded: boolean;
          grayed: boolean;
      }
      /**
       * Node in a tree of nested declarations in a file.
       * The top node is always a script or module node.
       */
      interface NavigationTree {
          /** Name of the declaration, or a short description, e.g. "<class>". */
          text: string;
          kind: ScriptElementKind;
          /** ScriptElementKindModifier separated by commas, e.g. "public,abstract" */
          kindModifiers: string;
          /**
           * Spans of the nodes that generated this declaration.
           * There will be more than one if this is the result of merging.
           */
          spans: TextSpan[];
          nameSpan: TextSpan | undefined;
          /** Present if non-empty */
          childItems?: NavigationTree[];
      }
      interface CallHierarchyItem {
          name: string;
          kind: ScriptElementKind;
          file: string;
          span: TextSpan;
          selectionSpan: TextSpan;
      }
      interface CallHierarchyIncomingCall {
          from: CallHierarchyItem;
          fromSpans: TextSpan[];
      }
      interface CallHierarchyOutgoingCall {
          to: CallHierarchyItem;
          fromSpans: TextSpan[];
      }
      interface TodoCommentDescriptor {
          text: string;
          priority: number;
      }
      interface TodoComment {
          descriptor: TodoCommentDescriptor;
          message: string;
          position: number;
      }
      interface TextChange {
          span: TextSpan;
          newText: string;
      }
      interface FileTextChanges {
          fileName: string;
          textChanges: readonly TextChange[];
          isNewFile?: boolean;
      }
      interface CodeAction {
          /** Description of the code action to display in the UI of the editor */
          description: string;
          /** Text changes to apply to each file as part of the code action */
          changes: FileTextChanges[];
          /**
           * If the user accepts the code fix, the editor should send the action back in a `applyAction` request.
           * This allows the language service to have side effects (e.g. installing dependencies) upon a code fix.
           */
          commands?: CodeActionCommand[];
      }
      interface CodeFixAction extends CodeAction {
          /** Short name to identify the fix, for use by telemetry. */
          fixName: string;
          /**
           * If present, one may call 'getCombinedCodeFix' with this fixId.
           * This may be omitted to indicate that the code fix can't be applied in a group.
           */
          fixId?: {};
          fixAllDescription?: string;
      }
      interface CombinedCodeActions {
          changes: readonly FileTextChanges[];
          commands?: readonly CodeActionCommand[];
      }
      type CodeActionCommand = InstallPackageAction;
      interface InstallPackageAction {
      }
      /**
       * A set of one or more available refactoring actions, grouped under a parent refactoring.
       */
      interface ApplicableRefactorInfo {
          /**
           * The programmatic name of the refactoring
           */
          name: string;
          /**
           * A description of this refactoring category to show to the user.
           * If the refactoring gets inlined (see below), this text will not be visible.
           */
          description: string;
          /**
           * Inlineable refactorings can have their actions hoisted out to the top level
           * of a context menu. Non-inlineanable refactorings should always be shown inside
           * their parent grouping.
           *
           * If not specified, this value is assumed to be 'true'
           */
          inlineable?: boolean;
          actions: RefactorActionInfo[];
      }
      /**
       * Represents a single refactoring action - for example, the "Extract Method..." refactor might
       * offer several actions, each corresponding to a surround class or closure to extract into.
       */
      interface RefactorActionInfo {
          /**
           * The programmatic name of the refactoring action
           */
          name: string;
          /**
           * A description of this refactoring action to show to the user.
           * If the parent refactoring is inlined away, this will be the only text shown,
           * so this description should make sense by itself if the parent is inlineable=true
           */
          description: string;
      }
      /**
       * A set of edits to make in response to a refactor action, plus an optional
       * location where renaming should be invoked from
       */
      interface RefactorEditInfo {
          edits: FileTextChanges[];
          renameFilename?: string;
          renameLocation?: number;
          commands?: CodeActionCommand[];
      }
      interface TextInsertion {
          newText: string;
          /** The position in newText the caret should point to after the insertion. */
          caretOffset: number;
      }
      interface DocumentSpan {
          textSpan: TextSpan;
          fileName: string;
          /**
           * If the span represents a location that was remapped (e.g. via a .d.ts.map file),
           * then the original filename and span will be specified here
           */
          originalTextSpan?: TextSpan;
          originalFileName?: string;
          /**
           * If DocumentSpan.textSpan is the span for name of the declaration,
           * then this is the span for relevant declaration
           */
          contextSpan?: TextSpan;
          originalContextSpan?: TextSpan;
      }
      interface RenameLocation extends DocumentSpan {
          readonly prefixText?: string;
          readonly suffixText?: string;
      }
      interface ReferenceEntry extends DocumentSpan {
          isWriteAccess: boolean;
          isDefinition: boolean;
          isInString?: true;
      }
      interface ImplementationLocation extends DocumentSpan {
          kind: ScriptElementKind;
          displayParts: SymbolDisplayPart[];
      }
      enum HighlightSpanKind {
          none = "none",
          definition = "definition",
          reference = "reference",
          writtenReference = "writtenReference"
      }
      interface HighlightSpan {
          fileName?: string;
          isInString?: true;
          textSpan: TextSpan;
          contextSpan?: TextSpan;
          kind: HighlightSpanKind;
      }
      interface NavigateToItem {
          name: string;
          kind: ScriptElementKind;
          kindModifiers: string;
          matchKind: "exact" | "prefix" | "substring" | "camelCase";
          isCaseSensitive: boolean;
          fileName: string;
          textSpan: TextSpan;
          containerName: string;
          containerKind: ScriptElementKind;
      }
      enum IndentStyle {
          None = 0,
          Block = 1,
          Smart = 2
      }
      enum SemicolonPreference {
          Ignore = "ignore",
          Insert = "insert",
          Remove = "remove"
      }
      interface EditorOptions {
          BaseIndentSize?: number;
          IndentSize: number;
          TabSize: number;
          NewLineCharacter: string;
          ConvertTabsToSpaces: boolean;
          IndentStyle: IndentStyle;
      }
      interface EditorSettings {
          baseIndentSize?: number;
          indentSize?: number;
          tabSize?: number;
          newLineCharacter?: string;
          convertTabsToSpaces?: boolean;
          indentStyle?: IndentStyle;
          trimTrailingWhitespace?: boolean;
      }
      interface FormatCodeOptions extends EditorOptions {
          InsertSpaceAfterCommaDelimiter: boolean;
          InsertSpaceAfterSemicolonInForStatements: boolean;
          InsertSpaceBeforeAndAfterBinaryOperators: boolean;
          InsertSpaceAfterConstructor?: boolean;
          InsertSpaceAfterKeywordsInControlFlowStatements: boolean;
          InsertSpaceAfterFunctionKeywordForAnonymousFunctions: boolean;
          InsertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis: boolean;
          InsertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets: boolean;
          InsertSpaceAfterOpeningAndBeforeClosingNonemptyBraces?: boolean;
          InsertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces: boolean;
          InsertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces?: boolean;
          InsertSpaceAfterTypeAssertion?: boolean;
          InsertSpaceBeforeFunctionParenthesis?: boolean;
          PlaceOpenBraceOnNewLineForFunctions: boolean;
          PlaceOpenBraceOnNewLineForControlBlocks: boolean;
          insertSpaceBeforeTypeAnnotation?: boolean;
      }
      interface FormatCodeSettings extends EditorSettings {
          readonly insertSpaceAfterCommaDelimiter?: boolean;
          readonly insertSpaceAfterSemicolonInForStatements?: boolean;
          readonly insertSpaceBeforeAndAfterBinaryOperators?: boolean;
          readonly insertSpaceAfterConstructor?: boolean;
          readonly insertSpaceAfterKeywordsInControlFlowStatements?: boolean;
          readonly insertSpaceAfterFunctionKeywordForAnonymousFunctions?: boolean;
          readonly insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis?: boolean;
          readonly insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets?: boolean;
          readonly insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces?: boolean;
          readonly insertSpaceAfterOpeningAndBeforeClosingEmptyBraces?: boolean;
          readonly insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces?: boolean;
          readonly insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces?: boolean;
          readonly insertSpaceAfterTypeAssertion?: boolean;
          readonly insertSpaceBeforeFunctionParenthesis?: boolean;
          readonly placeOpenBraceOnNewLineForFunctions?: boolean;
          readonly placeOpenBraceOnNewLineForControlBlocks?: boolean;
          readonly insertSpaceBeforeTypeAnnotation?: boolean;
          readonly indentMultiLineObjectLiteralBeginningOnBlankLine?: boolean;
          readonly semicolons?: SemicolonPreference;
      }
      function getDefaultFormatCodeSettings(newLineCharacter?: string): FormatCodeSettings;
      interface DefinitionInfo extends DocumentSpan {
          kind: ScriptElementKind;
          name: string;
          containerKind: ScriptElementKind;
          containerName: string;
      }
      interface DefinitionInfoAndBoundSpan {
          definitions?: readonly DefinitionInfo[];
          textSpan: TextSpan;
      }
      interface ReferencedSymbolDefinitionInfo extends DefinitionInfo {
          displayParts: SymbolDisplayPart[];
      }
      interface ReferencedSymbol {
          definition: ReferencedSymbolDefinitionInfo;
          references: ReferenceEntry[];
      }
      enum SymbolDisplayPartKind {
          aliasName = 0,
          className = 1,
          enumName = 2,
          fieldName = 3,
          interfaceName = 4,
          keyword = 5,
          lineBreak = 6,
          numericLiteral = 7,
          stringLiteral = 8,
          localName = 9,
          methodName = 10,
          moduleName = 11,
          operator = 12,
          parameterName = 13,
          propertyName = 14,
          punctuation = 15,
          space = 16,
          text = 17,
          typeParameterName = 18,
          enumMemberName = 19,
          functionName = 20,
          regularExpressionLiteral = 21
      }
      interface SymbolDisplayPart {
          text: string;
          kind: string;
      }
      interface JSDocTagInfo {
          name: string;
          text?: string;
      }
      interface QuickInfo {
          kind: ScriptElementKind;
          kindModifiers: string;
          textSpan: TextSpan;
          displayParts?: SymbolDisplayPart[];
          documentation?: SymbolDisplayPart[];
          tags?: JSDocTagInfo[];
      }
      type RenameInfo = RenameInfoSuccess | RenameInfoFailure;
      interface RenameInfoSuccess {
          canRename: true;
          /**
           * File or directory to rename.
           * If set, `getEditsForFileRename` should be called instead of `findRenameLocations`.
           */
          fileToRename?: string;
          displayName: string;
          fullDisplayName: string;
          kind: ScriptElementKind;
          kindModifiers: string;
          triggerSpan: TextSpan;
      }
      interface RenameInfoFailure {
          canRename: false;
          localizedErrorMessage: string;
      }
      interface RenameInfoOptions {
          readonly allowRenameOfImportPath?: boolean;
      }
      interface SignatureHelpParameter {
          name: string;
          documentation: SymbolDisplayPart[];
          displayParts: SymbolDisplayPart[];
          isOptional: boolean;
      }
      interface SelectionRange {
          textSpan: TextSpan;
          parent?: SelectionRange;
      }
      /**
       * Represents a single signature to show in signature help.
       * The id is used for subsequent calls into the language service to ask questions about the
       * signature help item in the context of any documents that have been updated.  i.e. after
       * an edit has happened, while signature help is still active, the host can ask important
       * questions like 'what parameter is the user currently contained within?'.
       */
      interface SignatureHelpItem {
          isVariadic: boolean;
          prefixDisplayParts: SymbolDisplayPart[];
          suffixDisplayParts: SymbolDisplayPart[];
          separatorDisplayParts: SymbolDisplayPart[];
          parameters: SignatureHelpParameter[];
          documentation: SymbolDisplayPart[];
          tags: JSDocTagInfo[];
      }
      /**
       * Represents a set of signature help items, and the preferred item that should be selected.
       */
      interface SignatureHelpItems {
          items: SignatureHelpItem[];
          applicableSpan: TextSpan;
          selectedItemIndex: number;
          argumentIndex: number;
          argumentCount: number;
      }
      interface CompletionInfo {
          /** Not true for all global completions. This will be true if the enclosing scope matches a few syntax kinds. See `isSnippetScope`. */
          isGlobalCompletion: boolean;
          isMemberCompletion: boolean;
          /**
           * true when the current location also allows for a new identifier
           */
          isNewIdentifierLocation: boolean;
          entries: CompletionEntry[];
      }
      interface CompletionEntry {
          name: string;
          kind: ScriptElementKind;
          kindModifiers?: string;
          sortText: string;
          insertText?: string;
          /**
           * An optional span that indicates the text to be replaced by this completion item.
           * If present, this span should be used instead of the default one.
           * It will be set if the required span differs from the one generated by the default replacement behavior.
           */
          replacementSpan?: TextSpan;
          hasAction?: true;
          source?: string;
          isRecommended?: true;
          isFromUncheckedFile?: true;
      }
      interface CompletionEntryDetails {
          name: string;
          kind: ScriptElementKind;
          kindModifiers: string;
          displayParts: SymbolDisplayPart[];
          documentation?: SymbolDisplayPart[];
          tags?: JSDocTagInfo[];
          codeActions?: CodeAction[];
          source?: SymbolDisplayPart[];
      }
      interface OutliningSpan {
          /** The span of the document to actually collapse. */
          textSpan: TextSpan;
          /** The span of the document to display when the user hovers over the collapsed span. */
          hintSpan: TextSpan;
          /** The text to display in the editor for the collapsed region. */
          bannerText: string;
          /**
           * Whether or not this region should be automatically collapsed when
           * the 'Collapse to Definitions' command is invoked.
           */
          autoCollapse: boolean;
          /**
           * Classification of the contents of the span
           */
          kind: OutliningSpanKind;
      }
      enum OutliningSpanKind {
          /** Single or multi-line comments */
          Comment = "comment",
          /** Sections marked by '// #region' and '// #endregion' comments */
          Region = "region",
          /** Declarations and expressions */
          Code = "code",
          /** Contiguous blocks of import declarations */
          Imports = "imports"
      }
      enum OutputFileType {
          JavaScript = 0,
          SourceMap = 1,
          Declaration = 2
      }
      enum EndOfLineState {
          None = 0,
          InMultiLineCommentTrivia = 1,
          InSingleQuoteStringLiteral = 2,
          InDoubleQuoteStringLiteral = 3,
          InTemplateHeadOrNoSubstitutionTemplate = 4,
          InTemplateMiddleOrTail = 5,
          InTemplateSubstitutionPosition = 6
      }
      enum TokenClass {
          Punctuation = 0,
          Keyword = 1,
          Operator = 2,
          Comment = 3,
          Whitespace = 4,
          Identifier = 5,
          NumberLiteral = 6,
          BigIntLiteral = 7,
          StringLiteral = 8,
          RegExpLiteral = 9
      }
      interface ClassificationResult {
          finalLexState: EndOfLineState;
          entries: ClassificationInfo[];
      }
      interface ClassificationInfo {
          length: number;
          classification: TokenClass;
      }
      interface Classifier {
          /**
           * Gives lexical classifications of tokens on a line without any syntactic context.
           * For instance, a token consisting of the text 'string' can be either an identifier
           * named 'string' or the keyword 'string', however, because this classifier is not aware,
           * it relies on certain heuristics to give acceptable results. For classifications where
           * speed trumps accuracy, this function is preferable; however, for true accuracy, the
           * syntactic classifier is ideal. In fact, in certain editing scenarios, combining the
           * lexical, syntactic, and semantic classifiers may issue the best user experience.
           *
           * @param text                      The text of a line to classify.
           * @param lexState                  The state of the lexical classifier at the end of the previous line.
           * @param syntacticClassifierAbsent Whether the client is *not* using a syntactic classifier.
           *                                  If there is no syntactic classifier (syntacticClassifierAbsent=true),
           *                                  certain heuristics may be used in its place; however, if there is a
           *                                  syntactic classifier (syntacticClassifierAbsent=false), certain
           *                                  classifications which may be incorrectly categorized will be given
           *                                  back as Identifiers in order to allow the syntactic classifier to
           *                                  subsume the classification.
           * @deprecated Use getLexicalClassifications instead.
           */
          getClassificationsForLine(text: string, lexState: EndOfLineState, syntacticClassifierAbsent: boolean): ClassificationResult;
          getEncodedLexicalClassifications(text: string, endOfLineState: EndOfLineState, syntacticClassifierAbsent: boolean): Classifications;
      }
      enum ScriptElementKind {
          unknown = "",
          warning = "warning",
          /** predefined type (void) or keyword (class) */
          keyword = "keyword",
          /** top level script node */
          scriptElement = "script",
          /** module foo {} */
          moduleElement = "module",
          /** class X {} */
          classElement = "class",
          /** var x = class X {} */
          localClassElement = "local class",
          /** interface Y {} */
          interfaceElement = "interface",
          /** type T = ... */
          typeElement = "type",
          /** enum E */
          enumElement = "enum",
          enumMemberElement = "enum member",
          /**
           * Inside module and script only
           * const v = ..
           */
          variableElement = "var",
          /** Inside function */
          localVariableElement = "local var",
          /**
           * Inside module and script only
           * function f() { }
           */
          functionElement = "function",
          /** Inside function */
          localFunctionElement = "local function",
          /** class X { [public|private]* foo() {} } */
          memberFunctionElement = "method",
          /** class X { [public|private]* [get|set] foo:number; } */
          memberGetAccessorElement = "getter",
          memberSetAccessorElement = "setter",
          /**
           * class X { [public|private]* foo:number; }
           * interface Y { foo:number; }
           */
          memberVariableElement = "property",
          /** class X { constructor() { } } */
          constructorImplementationElement = "constructor",
          /** interface Y { ():number; } */
          callSignatureElement = "call",
          /** interface Y { []:number; } */
          indexSignatureElement = "index",
          /** interface Y { new():Y; } */
          constructSignatureElement = "construct",
          /** function foo(*Y*: string) */
          parameterElement = "parameter",
          typeParameterElement = "type parameter",
          primitiveType = "primitive type",
          label = "label",
          alias = "alias",
          constElement = "const",
          letElement = "let",
          directory = "directory",
          externalModuleName = "external module name",
          /**
           * <JsxTagName attribute1 attribute2={0} />
           */
          jsxAttribute = "JSX attribute",
          /** String literal */
          string = "string"
      }
      enum ScriptElementKindModifier {
          none = "",
          publicMemberModifier = "public",
          privateMemberModifier = "private",
          protectedMemberModifier = "protected",
          exportedModifier = "export",
          ambientModifier = "declare",
          staticModifier = "static",
          abstractModifier = "abstract",
          optionalModifier = "optional",
          dtsModifier = ".d.ts",
          tsModifier = ".ts",
          tsxModifier = ".tsx",
          jsModifier = ".js",
          jsxModifier = ".jsx",
          jsonModifier = ".json"
      }
      enum ClassificationTypeNames {
          comment = "comment",
          identifier = "identifier",
          keyword = "keyword",
          numericLiteral = "number",
          bigintLiteral = "bigint",
          operator = "operator",
          stringLiteral = "string",
          whiteSpace = "whitespace",
          text = "text",
          punctuation = "punctuation",
          className = "class name",
          enumName = "enum name",
          interfaceName = "interface name",
          moduleName = "module name",
          typeParameterName = "type parameter name",
          typeAliasName = "type alias name",
          parameterName = "parameter name",
          docCommentTagName = "doc comment tag name",
          jsxOpenTagName = "jsx open tag name",
          jsxCloseTagName = "jsx close tag name",
          jsxSelfClosingTagName = "jsx self closing tag name",
          jsxAttribute = "jsx attribute",
          jsxText = "jsx text",
          jsxAttributeStringLiteralValue = "jsx attribute string literal value"
      }
      enum ClassificationType {
          comment = 1,
          identifier = 2,
          keyword = 3,
          numericLiteral = 4,
          operator = 5,
          stringLiteral = 6,
          regularExpressionLiteral = 7,
          whiteSpace = 8,
          text = 9,
          punctuation = 10,
          className = 11,
          enumName = 12,
          interfaceName = 13,
          moduleName = 14,
          typeParameterName = 15,
          typeAliasName = 16,
          parameterName = 17,
          docCommentTagName = 18,
          jsxOpenTagName = 19,
          jsxCloseTagName = 20,
          jsxSelfClosingTagName = 21,
          jsxAttribute = 22,
          jsxText = 23,
          jsxAttributeStringLiteralValue = 24,
          bigintLiteral = 25
      }
  }
  declare namespace ts {
      /** The classifier is used for syntactic highlighting in editors via the TSServer */
      function createClassifier(): Classifier;
  }
  declare namespace ts {
      interface DocumentHighlights {
          fileName: string;
          highlightSpans: HighlightSpan[];
      }
  }
  declare namespace ts {
      /**
       * The document registry represents a store of SourceFile objects that can be shared between
       * multiple LanguageService instances. A LanguageService instance holds on the SourceFile (AST)
       * of files in the context.
       * SourceFile objects account for most of the memory usage by the language service. Sharing
       * the same DocumentRegistry instance between different instances of LanguageService allow
       * for more efficient memory utilization since all projects will share at least the library
       * file (lib.d.ts).
       *
       * A more advanced use of the document registry is to serialize sourceFile objects to disk
       * and re-hydrate them when needed.
       *
       * To create a default DocumentRegistry, use createDocumentRegistry to create one, and pass it
       * to all subsequent createLanguageService calls.
       */
      interface DocumentRegistry {
          /**
           * Request a stored SourceFile with a given fileName and compilationSettings.
           * The first call to acquire will call createLanguageServiceSourceFile to generate
           * the SourceFile if was not found in the registry.
           *
           * @param fileName The name of the file requested
           * @param compilationSettings Some compilation settings like target affects the
           * shape of a the resulting SourceFile. This allows the DocumentRegistry to store
           * multiple copies of the same file for different compilation settings.
           * @param scriptSnapshot Text of the file. Only used if the file was not found
           * in the registry and a new one was created.
           * @param version Current version of the file. Only used if the file was not found
           * in the registry and a new one was created.
           */
          acquireDocument(fileName: string, compilationSettings: CompilerOptions, scriptSnapshot: IScriptSnapshot, version: string, scriptKind?: ScriptKind): SourceFile;
          acquireDocumentWithKey(fileName: string, path: Path, compilationSettings: CompilerOptions, key: DocumentRegistryBucketKey, scriptSnapshot: IScriptSnapshot, version: string, scriptKind?: ScriptKind): SourceFile;
          /**
           * Request an updated version of an already existing SourceFile with a given fileName
           * and compilationSettings. The update will in-turn call updateLanguageServiceSourceFile
           * to get an updated SourceFile.
           *
           * @param fileName The name of the file requested
           * @param compilationSettings Some compilation settings like target affects the
           * shape of a the resulting SourceFile. This allows the DocumentRegistry to store
           * multiple copies of the same file for different compilation settings.
           * @param scriptSnapshot Text of the file.
           * @param version Current version of the file.
           */
          updateDocument(fileName: string, compilationSettings: CompilerOptions, scriptSnapshot: IScriptSnapshot, version: string, scriptKind?: ScriptKind): SourceFile;
          updateDocumentWithKey(fileName: string, path: Path, compilationSettings: CompilerOptions, key: DocumentRegistryBucketKey, scriptSnapshot: IScriptSnapshot, version: string, scriptKind?: ScriptKind): SourceFile;
          getKeyForCompilationSettings(settings: CompilerOptions): DocumentRegistryBucketKey;
          /**
           * Informs the DocumentRegistry that a file is not needed any longer.
           *
           * Note: It is not allowed to call release on a SourceFile that was not acquired from
           * this registry originally.
           *
           * @param fileName The name of the file to be released
           * @param compilationSettings The compilation settings used to acquire the file
           */
          releaseDocument(fileName: string, compilationSettings: CompilerOptions): void;
          releaseDocumentWithKey(path: Path, key: DocumentRegistryBucketKey): void;
          reportStats(): string;
      }
      type DocumentRegistryBucketKey = string & {
          __bucketKey: any;
      };
      function createDocumentRegistry(useCaseSensitiveFileNames?: boolean, currentDirectory?: string): DocumentRegistry;
  }
  declare namespace ts {
      function preProcessFile(sourceText: string, readImportFiles?: boolean, detectJavaScriptImports?: boolean): PreProcessedFileInfo;
  }
  declare namespace ts {
      interface TranspileOptions {
          compilerOptions?: CompilerOptions;
          fileName?: string;
          reportDiagnostics?: boolean;
          moduleName?: string;
          renamedDependencies?: MapLike<string>;
          transformers?: CustomTransformers;
      }
      interface TranspileOutput {
          outputText: string;
          diagnostics?: Diagnostic[];
          sourceMapText?: string;
      }
      function transpileModule(input: string, transpileOptions: TranspileOptions): TranspileOutput;
      function transpile(input: string, compilerOptions?: CompilerOptions, fileName?: string, diagnostics?: Diagnostic[], moduleName?: string): string;
  }
  declare namespace ts {
      /** The version of the language service API */
      const servicesVersion = "0.8";
      function toEditorSettings(options: EditorOptions | EditorSettings): EditorSettings;
      function displayPartsToString(displayParts: SymbolDisplayPart[] | undefined): string;
      function getDefaultCompilerOptions(): CompilerOptions;
      function getSupportedCodeFixes(): string[];
      function createLanguageServiceSourceFile(fileName: string, scriptSnapshot: IScriptSnapshot, scriptTarget: ScriptTarget, version: string, setNodeParents: boolean, scriptKind?: ScriptKind): SourceFile;
      function updateLanguageServiceSourceFile(sourceFile: SourceFile, scriptSnapshot: IScriptSnapshot, version: string, textChangeRange: TextChangeRange | undefined, aggressiveChecks?: boolean): SourceFile;
      function createLanguageService(host: LanguageServiceHost, documentRegistry?: DocumentRegistry, syntaxOnly?: boolean): LanguageService;
      /**
       * Get the path of the default library files (lib.d.ts) as distributed with the typescript
       * node package.
       * The functionality is not supported if the ts module is consumed outside of a node module.
       */
      function getDefaultLibFilePath(options: CompilerOptions): string;
  }
  declare namespace ts {
      /**
       * Transform one or more nodes using the supplied transformers.
       * @param source A single `Node` or an array of `Node` objects.
       * @param transformers An array of `TransformerFactory` callbacks used to process the transformation.
       * @param compilerOptions Optional compiler options.
       */
      function transform<T extends Node>(source: T | T[], transformers: TransformerFactory<T>[], compilerOptions?: CompilerOptions): TransformationResult<T>;
  }
  declare namespace ts.server {
      interface CompressedData {
          length: number;
          compressionKind: string;
          data: any;
      }
      type RequireResult = {
          module: {};
          error: undefined;
      } | {
          module: undefined;
          error: {
              stack?: string;
              message?: string;
          };
      };
      interface ServerHost extends System {
          watchFile(path: string, callback: FileWatcherCallback, pollingInterval?: number, options?: WatchOptions): FileWatcher;
          watchDirectory(path: string, callback: DirectoryWatcherCallback, recursive?: boolean, options?: WatchOptions): FileWatcher;
          setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): any;
          clearTimeout(timeoutId: any): void;
          setImmediate(callback: (...args: any[]) => void, ...args: any[]): any;
          clearImmediate(timeoutId: any): void;
          gc?(): void;
          trace?(s: string): void;
          require?(initialPath: string, moduleName: string): RequireResult;
      }
  }
  declare namespace ts.server {
      enum LogLevel {
          terse = 0,
          normal = 1,
          requestTime = 2,
          verbose = 3
      }
      const emptyArray: SortedReadonlyArray<never>;
      interface Logger {
          close(): void;
          hasLevel(level: LogLevel): boolean;
          loggingEnabled(): boolean;
          perftrc(s: string): void;
          info(s: string): void;
          startGroup(): void;
          endGroup(): void;
          msg(s: string, type?: Msg): void;
          getLogFileName(): string | undefined;
      }
      enum Msg {
          Err = "Err",
          Info = "Info",
          Perf = "Perf"
      }
      namespace Msg {
          /** @deprecated Only here for backwards-compatibility. Prefer just `Msg`. */
          type Types = Msg;
      }
      function createInstallTypingsRequest(project: Project, typeAcquisition: TypeAcquisition, unresolvedImports: SortedReadonlyArray<string>, cachePath?: string): DiscoverTypings;
      namespace Errors {
          function ThrowNoProject(): never;
          function ThrowProjectLanguageServiceDisabled(): never;
          function ThrowProjectDoesNotContainDocument(fileName: string, project: Project): never;
      }
      type NormalizedPath = string & {
          __normalizedPathTag: any;
      };
      function toNormalizedPath(fileName: string): NormalizedPath;
      function normalizedPathToPath(normalizedPath: NormalizedPath, currentDirectory: string, getCanonicalFileName: (f: string) => string): Path;
      function asNormalizedPath(fileName: string): NormalizedPath;
      interface NormalizedPathMap<T> {
          get(path: NormalizedPath): T | undefined;
          set(path: NormalizedPath, value: T): void;
          contains(path: NormalizedPath): boolean;
          remove(path: NormalizedPath): void;
      }
      function createNormalizedPathMap<T>(): NormalizedPathMap<T>;
      function isInferredProjectName(name: string): boolean;
      function makeInferredProjectName(counter: number): string;
      function createSortedArray<T>(): SortedArray<T>;
  }
  /**
   * Declaration module describing the TypeScript Server protocol
   */
  declare namespace ts.server.protocol {
      enum CommandTypes {
          JsxClosingTag = "jsxClosingTag",
          Brace = "brace",
          BraceCompletion = "braceCompletion",
          GetSpanOfEnclosingComment = "getSpanOfEnclosingComment",
          Change = "change",
          Close = "close",
          /** @deprecated Prefer CompletionInfo -- see comment on CompletionsResponse */
          Completions = "completions",
          CompletionInfo = "completionInfo",
          CompletionDetails = "completionEntryDetails",
          CompileOnSaveAffectedFileList = "compileOnSaveAffectedFileList",
          CompileOnSaveEmitFile = "compileOnSaveEmitFile",
          Configure = "configure",
          Definition = "definition",
          DefinitionAndBoundSpan = "definitionAndBoundSpan",
          Implementation = "implementation",
          Exit = "exit",
          Format = "format",
          Formatonkey = "formatonkey",
          Geterr = "geterr",
          GeterrForProject = "geterrForProject",
          SemanticDiagnosticsSync = "semanticDiagnosticsSync",
          SyntacticDiagnosticsSync = "syntacticDiagnosticsSync",
          SuggestionDiagnosticsSync = "suggestionDiagnosticsSync",
          NavBar = "navbar",
          Navto = "navto",
          NavTree = "navtree",
          NavTreeFull = "navtree-full",
          /** @deprecated */
          Occurrences = "occurrences",
          DocumentHighlights = "documentHighlights",
          Open = "open",
          Quickinfo = "quickinfo",
          References = "references",
          Reload = "reload",
          Rename = "rename",
          Saveto = "saveto",
          SignatureHelp = "signatureHelp",
          Status = "status",
          TypeDefinition = "typeDefinition",
          ProjectInfo = "projectInfo",
          ReloadProjects = "reloadProjects",
          Unknown = "unknown",
          OpenExternalProject = "openExternalProject",
          OpenExternalProjects = "openExternalProjects",
          CloseExternalProject = "closeExternalProject",
          UpdateOpen = "updateOpen",
          GetOutliningSpans = "getOutliningSpans",
          TodoComments = "todoComments",
          Indentation = "indentation",
          DocCommentTemplate = "docCommentTemplate",
          CompilerOptionsForInferredProjects = "compilerOptionsForInferredProjects",
          GetCodeFixes = "getCodeFixes",
          GetCombinedCodeFix = "getCombinedCodeFix",
          ApplyCodeActionCommand = "applyCodeActionCommand",
          GetSupportedCodeFixes = "getSupportedCodeFixes",
          GetApplicableRefactors = "getApplicableRefactors",
          GetEditsForRefactor = "getEditsForRefactor",
          OrganizeImports = "organizeImports",
          GetEditsForFileRename = "getEditsForFileRename",
          ConfigurePlugin = "configurePlugin",
          SelectionRange = "selectionRange",
          PrepareCallHierarchy = "prepareCallHierarchy",
          ProvideCallHierarchyIncomingCalls = "provideCallHierarchyIncomingCalls",
          ProvideCallHierarchyOutgoingCalls = "provideCallHierarchyOutgoingCalls"
      }
      /**
       * A TypeScript Server message
       */
      interface Message {
          /**
           * Sequence number of the message
           */
          seq: number;
          /**
           * One of "request", "response", or "event"
           */
          type: "request" | "response" | "event";
      }
      /**
       * Client-initiated request message
       */
      interface Request extends Message {
          type: "request";
          /**
           * The command to execute
           */
          command: string;
          /**
           * Object containing arguments for the command
           */
          arguments?: any;
      }
      /**
       * Request to reload the project structure for all the opened files
       */
      interface ReloadProjectsRequest extends Message {
          command: CommandTypes.ReloadProjects;
      }
      /**
       * Server-initiated event message
       */
      interface Event extends Message {
          type: "event";
          /**
           * Name of event
           */
          event: string;
          /**
           * Event-specific information
           */
          body?: any;
      }
      /**
       * Response by server to client request message.
       */
      interface Response extends Message {
          type: "response";
          /**
           * Sequence number of the request message.
           */
          request_seq: number;
          /**
           * Outcome of the request.
           */
          success: boolean;
          /**
           * The command requested.
           */
          command: string;
          /**
           * If success === false, this should always be provided.
           * Otherwise, may (or may not) contain a success message.
           */
          message?: string;
          /**
           * Contains message body if success === true.
           */
          body?: any;
          /**
           * Contains extra information that plugin can include to be passed on
           */
          metadata?: unknown;
          /**
           * Exposes information about the performance of this request-response pair.
           */
          performanceData?: PerformanceData;
      }
      interface PerformanceData {
          /**
           * Time spent updating the program graph, in milliseconds.
           */
          updateGraphDurationMs?: number;
      }
      /**
       * Arguments for FileRequest messages.
       */
      interface FileRequestArgs {
          /**
           * The file for the request (absolute pathname required).
           */
          file: string;
          projectFileName?: string;
      }
      interface StatusRequest extends Request {
          command: CommandTypes.Status;
      }
      interface StatusResponseBody {
          /**
           * The TypeScript version (`ts.version`).
           */
          version: string;
      }
      /**
       * Response to StatusRequest
       */
      interface StatusResponse extends Response {
          body: StatusResponseBody;
      }
      /**
       * Requests a JS Doc comment template for a given position
       */
      interface DocCommentTemplateRequest extends FileLocationRequest {
          command: CommandTypes.DocCommentTemplate;
      }
      /**
       * Response to DocCommentTemplateRequest
       */
      interface DocCommandTemplateResponse extends Response {
          body?: TextInsertion;
      }
      /**
       * A request to get TODO comments from the file
       */
      interface TodoCommentRequest extends FileRequest {
          command: CommandTypes.TodoComments;
          arguments: TodoCommentRequestArgs;
      }
      /**
       * Arguments for TodoCommentRequest request.
       */
      interface TodoCommentRequestArgs extends FileRequestArgs {
          /**
           * Array of target TodoCommentDescriptors that describes TODO comments to be found
           */
          descriptors: TodoCommentDescriptor[];
      }
      /**
       * Response for TodoCommentRequest request.
       */
      interface TodoCommentsResponse extends Response {
          body?: TodoComment[];
      }
      /**
       * A request to determine if the caret is inside a comment.
       */
      interface SpanOfEnclosingCommentRequest extends FileLocationRequest {
          command: CommandTypes.GetSpanOfEnclosingComment;
          arguments: SpanOfEnclosingCommentRequestArgs;
      }
      interface SpanOfEnclosingCommentRequestArgs extends FileLocationRequestArgs {
          /**
           * Requires that the enclosing span be a multi-line comment, or else the request returns undefined.
           */
          onlyMultiLine: boolean;
      }
      /**
       * Request to obtain outlining spans in file.
       */
      interface OutliningSpansRequest extends FileRequest {
          command: CommandTypes.GetOutliningSpans;
      }
      interface OutliningSpan {
          /** The span of the document to actually collapse. */
          textSpan: TextSpan;
          /** The span of the document to display when the user hovers over the collapsed span. */
          hintSpan: TextSpan;
          /** The text to display in the editor for the collapsed region. */
          bannerText: string;
          /**
           * Whether or not this region should be automatically collapsed when
           * the 'Collapse to Definitions' command is invoked.
           */
          autoCollapse: boolean;
          /**
           * Classification of the contents of the span
           */
          kind: OutliningSpanKind;
      }
      /**
       * Response to OutliningSpansRequest request.
       */
      interface OutliningSpansResponse extends Response {
          body?: OutliningSpan[];
      }
      /**
       * A request to get indentation for a location in file
       */
      interface IndentationRequest extends FileLocationRequest {
          command: CommandTypes.Indentation;
          arguments: IndentationRequestArgs;
      }
      /**
       * Response for IndentationRequest request.
       */
      interface IndentationResponse extends Response {
          body?: IndentationResult;
      }
      /**
       * Indentation result representing where indentation should be placed
       */
      interface IndentationResult {
          /**
           * The base position in the document that the indent should be relative to
           */
          position: number;
          /**
           * The number of columns the indent should be at relative to the position's column.
           */
          indentation: number;
      }
      /**
       * Arguments for IndentationRequest request.
       */
      interface IndentationRequestArgs extends FileLocationRequestArgs {
          /**
           * An optional set of settings to be used when computing indentation.
           * If argument is omitted - then it will use settings for file that were previously set via 'configure' request or global settings.
           */
          options?: EditorSettings;
      }
      /**
       * Arguments for ProjectInfoRequest request.
       */
      interface ProjectInfoRequestArgs extends FileRequestArgs {
          /**
           * Indicate if the file name list of the project is needed
           */
          needFileNameList: boolean;
      }
      /**
       * A request to get the project information of the current file.
       */
      interface ProjectInfoRequest extends Request {
          command: CommandTypes.ProjectInfo;
          arguments: ProjectInfoRequestArgs;
      }
      /**
       * A request to retrieve compiler options diagnostics for a project
       */
      interface CompilerOptionsDiagnosticsRequest extends Request {
          arguments: CompilerOptionsDiagnosticsRequestArgs;
      }
      /**
       * Arguments for CompilerOptionsDiagnosticsRequest request.
       */
      interface CompilerOptionsDiagnosticsRequestArgs {
          /**
           * Name of the project to retrieve compiler options diagnostics.
           */
          projectFileName: string;
      }
      /**
       * Response message body for "projectInfo" request
       */
      interface ProjectInfo {
          /**
           * For configured project, this is the normalized path of the 'tsconfig.json' file
           * For inferred project, this is undefined
           */
          configFileName: string;
          /**
           * The list of normalized file name in the project, including 'lib.d.ts'
           */
          fileNames?: string[];
          /**
           * Indicates if the project has a active language service instance
           */
          languageServiceDisabled?: boolean;
      }
      /**
       * Represents diagnostic info that includes location of diagnostic in two forms
       * - start position and length of the error span
       * - startLocation and endLocation - a pair of Location objects that store start/end line and offset of the error span.
       */
      interface DiagnosticWithLinePosition {
          message: string;
          start: number;
          length: number;
          startLocation: Location;
          endLocation: Location;
          category: string;
          code: number;
          /** May store more in future. For now, this will simply be `true` to indicate when a diagnostic is an unused-identifier diagnostic. */
          reportsUnnecessary?: {};
          relatedInformation?: DiagnosticRelatedInformation[];
      }
      /**
       * Response message for "projectInfo" request
       */
      interface ProjectInfoResponse extends Response {
          body?: ProjectInfo;
      }
      /**
       * Request whose sole parameter is a file name.
       */
      interface FileRequest extends Request {
          arguments: FileRequestArgs;
      }
      /**
       * Instances of this interface specify a location in a source file:
       * (file, line, character offset), where line and character offset are 1-based.
       */
      interface FileLocationRequestArgs extends FileRequestArgs {
          /**
           * The line number for the request (1-based).
           */
          line: number;
          /**
           * The character offset (on the line) for the request (1-based).
           */
          offset: number;
      }
      type FileLocationOrRangeRequestArgs = FileLocationRequestArgs | FileRangeRequestArgs;
      /**
       * Request refactorings at a given position or selection area.
       */
      interface GetApplicableRefactorsRequest extends Request {
          command: CommandTypes.GetApplicableRefactors;
          arguments: GetApplicableRefactorsRequestArgs;
      }
      type GetApplicableRefactorsRequestArgs = FileLocationOrRangeRequestArgs;
      /**
       * Response is a list of available refactorings.
       * Each refactoring exposes one or more "Actions"; a user selects one action to invoke a refactoring
       */
      interface GetApplicableRefactorsResponse extends Response {
          body?: ApplicableRefactorInfo[];
      }
      /**
       * A set of one or more available refactoring actions, grouped under a parent refactoring.
       */
      interface ApplicableRefactorInfo {
          /**
           * The programmatic name of the refactoring
           */
          name: string;
          /**
           * A description of this refactoring category to show to the user.
           * If the refactoring gets inlined (see below), this text will not be visible.
           */
          description: string;
          /**
           * Inlineable refactorings can have their actions hoisted out to the top level
           * of a context menu. Non-inlineanable refactorings should always be shown inside
           * their parent grouping.
           *
           * If not specified, this value is assumed to be 'true'
           */
          inlineable?: boolean;
          actions: RefactorActionInfo[];
      }
      /**
       * Represents a single refactoring action - for example, the "Extract Method..." refactor might
       * offer several actions, each corresponding to a surround class or closure to extract into.
       */
      interface RefactorActionInfo {
          /**
           * The programmatic name of the refactoring action
           */
          name: string;
          /**
           * A description of this refactoring action to show to the user.
           * If the parent refactoring is inlined away, this will be the only text shown,
           * so this description should make sense by itself if the parent is inlineable=true
           */
          description: string;
      }
      interface GetEditsForRefactorRequest extends Request {
          command: CommandTypes.GetEditsForRefactor;
          arguments: GetEditsForRefactorRequestArgs;
      }
      /**
       * Request the edits that a particular refactoring action produces.
       * Callers must specify the name of the refactor and the name of the action.
       */
      type GetEditsForRefactorRequestArgs = FileLocationOrRangeRequestArgs & {
          refactor: string;
          action: string;
      };
      interface GetEditsForRefactorResponse extends Response {
          body?: RefactorEditInfo;
      }
      interface RefactorEditInfo {
          edits: FileCodeEdits[];
          /**
           * An optional location where the editor should start a rename operation once
           * the refactoring edits have been applied
           */
          renameLocation?: Location;
          renameFilename?: string;
      }
      /**
       * Organize imports by:
       *   1) Removing unused imports
       *   2) Coalescing imports from the same module
       *   3) Sorting imports
       */
      interface OrganizeImportsRequest extends Request {
          command: CommandTypes.OrganizeImports;
          arguments: OrganizeImportsRequestArgs;
      }
      type OrganizeImportsScope = GetCombinedCodeFixScope;
      interface OrganizeImportsRequestArgs {
          scope: OrganizeImportsScope;
      }
      interface OrganizeImportsResponse extends Response {
          body: readonly FileCodeEdits[];
      }
      interface GetEditsForFileRenameRequest extends Request {
          command: CommandTypes.GetEditsForFileRename;
          arguments: GetEditsForFileRenameRequestArgs;
      }
      /** Note: Paths may also be directories. */
      interface GetEditsForFileRenameRequestArgs {
          readonly oldFilePath: string;
          readonly newFilePath: string;
      }
      interface GetEditsForFileRenameResponse extends Response {
          body: readonly FileCodeEdits[];
      }
      /**
       * Request for the available codefixes at a specific position.
       */
      interface CodeFixRequest extends Request {
          command: CommandTypes.GetCodeFixes;
          arguments: CodeFixRequestArgs;
      }
      interface GetCombinedCodeFixRequest extends Request {
          command: CommandTypes.GetCombinedCodeFix;
          arguments: GetCombinedCodeFixRequestArgs;
      }
      interface GetCombinedCodeFixResponse extends Response {
          body: CombinedCodeActions;
      }
      interface ApplyCodeActionCommandRequest extends Request {
          command: CommandTypes.ApplyCodeActionCommand;
          arguments: ApplyCodeActionCommandRequestArgs;
      }
      interface ApplyCodeActionCommandResponse extends Response {
      }
      interface FileRangeRequestArgs extends FileRequestArgs {
          /**
           * The line number for the request (1-based).
           */
          startLine: number;
          /**
           * The character offset (on the line) for the request (1-based).
           */
          startOffset: number;
          /**
           * The line number for the request (1-based).
           */
          endLine: number;
          /**
           * The character offset (on the line) for the request (1-based).
           */
          endOffset: number;
      }
      /**
       * Instances of this interface specify errorcodes on a specific location in a sourcefile.
       */
      interface CodeFixRequestArgs extends FileRangeRequestArgs {
          /**
           * Errorcodes we want to get the fixes for.
           */
          errorCodes: readonly number[];
      }
      interface GetCombinedCodeFixRequestArgs {
          scope: GetCombinedCodeFixScope;
          fixId: {};
      }
      interface GetCombinedCodeFixScope {
          type: "file";
          args: FileRequestArgs;
      }
      interface ApplyCodeActionCommandRequestArgs {
          /** May also be an array of commands. */
          command: {};
      }
      /**
       * Response for GetCodeFixes request.
       */
      interface GetCodeFixesResponse extends Response {
          body?: CodeAction[];
      }
      /**
       * A request whose arguments specify a file location (file, line, col).
       */
      interface FileLocationRequest extends FileRequest {
          arguments: FileLocationRequestArgs;
      }
      /**
       * A request to get codes of supported code fixes.
       */
      interface GetSupportedCodeFixesRequest extends Request {
          command: CommandTypes.GetSupportedCodeFixes;
      }
      /**
       * A response for GetSupportedCodeFixesRequest request.
       */
      interface GetSupportedCodeFixesResponse extends Response {
          /**
           * List of error codes supported by the server.
           */
          body?: string[];
      }
      /**
       * Arguments in document highlight request; include: filesToSearch, file,
       * line, offset.
       */
      interface DocumentHighlightsRequestArgs extends FileLocationRequestArgs {
          /**
           * List of files to search for document highlights.
           */
          filesToSearch: string[];
      }
      /**
       * Go to definition request; value of command field is
       * "definition". Return response giving the file locations that
       * define the symbol found in file at location line, col.
       */
      interface DefinitionRequest extends FileLocationRequest {
          command: CommandTypes.Definition;
      }
      interface DefinitionAndBoundSpanRequest extends FileLocationRequest {
          readonly command: CommandTypes.DefinitionAndBoundSpan;
      }
      interface DefinitionAndBoundSpanResponse extends Response {
          readonly body: DefinitionInfoAndBoundSpan;
      }
      /**
       * Go to type request; value of command field is
       * "typeDefinition". Return response giving the file locations that
       * define the type for the symbol found in file at location line, col.
       */
      interface TypeDefinitionRequest extends FileLocationRequest {
          command: CommandTypes.TypeDefinition;
      }
      /**
       * Go to implementation request; value of command field is
       * "implementation". Return response giving the file locations that
       * implement the symbol found in file at location line, col.
       */
      interface ImplementationRequest extends FileLocationRequest {
          command: CommandTypes.Implementation;
      }
      /**
       * Location in source code expressed as (one-based) line and (one-based) column offset.
       */
      interface Location {
          line: number;
          offset: number;
      }
      /**
       * Object found in response messages defining a span of text in source code.
       */
      interface TextSpan {
          /**
           * First character of the definition.
           */
          start: Location;
          /**
           * One character past last character of the definition.
           */
          end: Location;
      }
      /**
       * Object found in response messages defining a span of text in a specific source file.
       */
      interface FileSpan extends TextSpan {
          /**
           * File containing text span.
           */
          file: string;
      }
      interface TextSpanWithContext extends TextSpan {
          contextStart?: Location;
          contextEnd?: Location;
      }
      interface FileSpanWithContext extends FileSpan, TextSpanWithContext {
      }
      interface DefinitionInfoAndBoundSpan {
          definitions: readonly FileSpanWithContext[];
          textSpan: TextSpan;
      }
      /**
       * Definition response message.  Gives text range for definition.
       */
      interface DefinitionResponse extends Response {
          body?: FileSpanWithContext[];
      }
      interface DefinitionInfoAndBoundSpanResponse extends Response {
          body?: DefinitionInfoAndBoundSpan;
      }
      /** @deprecated Use `DefinitionInfoAndBoundSpanResponse` instead. */
      type DefinitionInfoAndBoundSpanReponse = DefinitionInfoAndBoundSpanResponse;
      /**
       * Definition response message.  Gives text range for definition.
       */
      interface TypeDefinitionResponse extends Response {
          body?: FileSpanWithContext[];
      }
      /**
       * Implementation response message.  Gives text range for implementations.
       */
      interface ImplementationResponse extends Response {
          body?: FileSpanWithContext[];
      }
      /**
       * Request to get brace completion for a location in the file.
       */
      interface BraceCompletionRequest extends FileLocationRequest {
          command: CommandTypes.BraceCompletion;
          arguments: BraceCompletionRequestArgs;
      }
      /**
       * Argument for BraceCompletionRequest request.
       */
      interface BraceCompletionRequestArgs extends FileLocationRequestArgs {
          /**
           * Kind of opening brace
           */
          openingBrace: string;
      }
      interface JsxClosingTagRequest extends FileLocationRequest {
          readonly command: CommandTypes.JsxClosingTag;
          readonly arguments: JsxClosingTagRequestArgs;
      }
      interface JsxClosingTagRequestArgs extends FileLocationRequestArgs {
      }
      interface JsxClosingTagResponse extends Response {
          readonly body: TextInsertion;
      }
      /**
       * @deprecated
       * Get occurrences request; value of command field is
       * "occurrences". Return response giving spans that are relevant
       * in the file at a given line and column.
       */
      interface OccurrencesRequest extends FileLocationRequest {
          command: CommandTypes.Occurrences;
      }
      /** @deprecated */
      interface OccurrencesResponseItem extends FileSpanWithContext {
          /**
           * True if the occurrence is a write location, false otherwise.
           */
          isWriteAccess: boolean;
          /**
           * True if the occurrence is in a string, undefined otherwise;
           */
          isInString?: true;
      }
      /** @deprecated */
      interface OccurrencesResponse extends Response {
          body?: OccurrencesResponseItem[];
      }
      /**
       * Get document highlights request; value of command field is
       * "documentHighlights". Return response giving spans that are relevant
       * in the file at a given line and column.
       */
      interface DocumentHighlightsRequest extends FileLocationRequest {
          command: CommandTypes.DocumentHighlights;
          arguments: DocumentHighlightsRequestArgs;
      }
      /**
       * Span augmented with extra information that denotes the kind of the highlighting to be used for span.
       */
      interface HighlightSpan extends TextSpanWithContext {
          kind: HighlightSpanKind;
      }
      /**
       * Represents a set of highligh spans for a give name
       */
      interface DocumentHighlightsItem {
          /**
           * File containing highlight spans.
           */
          file: string;
          /**
           * Spans to highlight in file.
           */
          highlightSpans: HighlightSpan[];
      }
      /**
       * Response for a DocumentHighlightsRequest request.
       */
      interface DocumentHighlightsResponse extends Response {
          body?: DocumentHighlightsItem[];
      }
      /**
       * Find references request; value of command field is
       * "references". Return response giving the file locations that
       * reference the symbol found in file at location line, col.
       */
      interface ReferencesRequest extends FileLocationRequest {
          command: CommandTypes.References;
      }
      interface ReferencesResponseItem extends FileSpanWithContext {
          /** Text of line containing the reference.  Including this
           *  with the response avoids latency of editor loading files
           * to show text of reference line (the server already has
           * loaded the referencing files).
           */
          lineText: string;
          /**
           * True if reference is a write location, false otherwise.
           */
          isWriteAccess: boolean;
          /**
           * True if reference is a definition, false otherwise.
           */
          isDefinition: boolean;
      }
      /**
       * The body of a "references" response message.
       */
      interface ReferencesResponseBody {
          /**
           * The file locations referencing the symbol.
           */
          refs: readonly ReferencesResponseItem[];
          /**
           * The name of the symbol.
           */
          symbolName: string;
          /**
           * The start character offset of the symbol (on the line provided by the references request).
           */
          symbolStartOffset: number;
          /**
           * The full display name of the symbol.
           */
          symbolDisplayString: string;
      }
      /**
       * Response to "references" request.
       */
      interface ReferencesResponse extends Response {
          body?: ReferencesResponseBody;
      }
      /**
       * Argument for RenameRequest request.
       */
      interface RenameRequestArgs extends FileLocationRequestArgs {
          /**
           * Should text at specified location be found/changed in comments?
           */
          findInComments?: boolean;
          /**
           * Should text at specified location be found/changed in strings?
           */
          findInStrings?: boolean;
      }
      /**
       * Rename request; value of command field is "rename". Return
       * response giving the file locations that reference the symbol
       * found in file at location line, col. Also return full display
       * name of the symbol so that client can print it unambiguously.
       */
      interface RenameRequest extends FileLocationRequest {
          command: CommandTypes.Rename;
          arguments: RenameRequestArgs;
      }
      /**
       * Information about the item to be renamed.
       */
      type RenameInfo = RenameInfoSuccess | RenameInfoFailure;
      interface RenameInfoSuccess {
          /**
           * True if item can be renamed.
           */
          canRename: true;
          /**
           * File or directory to rename.
           * If set, `getEditsForFileRename` should be called instead of `findRenameLocations`.
           */
          fileToRename?: string;
          /**
           * Display name of the item to be renamed.
           */
          displayName: string;
          /**
           * Full display name of item to be renamed.
           */
          fullDisplayName: string;
          /**
           * The items's kind (such as 'className' or 'parameterName' or plain 'text').
           */
          kind: ScriptElementKind;
          /**
           * Optional modifiers for the kind (such as 'public').
           */
          kindModifiers: string;
          /** Span of text to rename. */
          triggerSpan: TextSpan;
      }
      interface RenameInfoFailure {
          canRename: false;
          /**
           * Error message if item can not be renamed.
           */
          localizedErrorMessage: string;
      }
      /**
       *  A group of text spans, all in 'file'.
       */
      interface SpanGroup {
          /** The file to which the spans apply */
          file: string;
          /** The text spans in this group */
          locs: RenameTextSpan[];
      }
      interface RenameTextSpan extends TextSpanWithContext {
          readonly prefixText?: string;
          readonly suffixText?: string;
      }
      interface RenameResponseBody {
          /**
           * Information about the item to be renamed.
           */
          info: RenameInfo;
          /**
           * An array of span groups (one per file) that refer to the item to be renamed.
           */
          locs: readonly SpanGroup[];
      }
      /**
       * Rename response message.
       */
      interface RenameResponse extends Response {
          body?: RenameResponseBody;
      }
      /**
       * Represents a file in external project.
       * External project is project whose set of files, compilation options and open\close state
       * is maintained by the client (i.e. if all this data come from .csproj file in Visual Studio).
       * External project will exist even if all files in it are closed and should be closed explicitly.
       * If external project includes one or more tsconfig.json/jsconfig.json files then tsserver will
       * create configured project for every config file but will maintain a link that these projects were created
       * as a result of opening external project so they should be removed once external project is closed.
       */
      interface ExternalFile {
          /**
           * Name of file file
           */
          fileName: string;
          /**
           * Script kind of the file
           */
          scriptKind?: ScriptKindName | ts.ScriptKind;
          /**
           * Whether file has mixed content (i.e. .cshtml file that combines html markup with C#/JavaScript)
           */
          hasMixedContent?: boolean;
          /**
           * Content of the file
           */
          content?: string;
      }
      /**
       * Represent an external project
       */
      interface ExternalProject {
          /**
           * Project name
           */
          projectFileName: string;
          /**
           * List of root files in project
           */
          rootFiles: ExternalFile[];
          /**
           * Compiler options for the project
           */
          options: ExternalProjectCompilerOptions;
          /**
           * @deprecated typingOptions. Use typeAcquisition instead
           */
          typingOptions?: TypeAcquisition;
          /**
           * Explicitly specified type acquisition for the project
           */
          typeAcquisition?: TypeAcquisition;
      }
      interface CompileOnSaveMixin {
          /**
           * If compile on save is enabled for the project
           */
          compileOnSave?: boolean;
      }
      /**
       * For external projects, some of the project settings are sent together with
       * compiler settings.
       */
      type ExternalProjectCompilerOptions = CompilerOptions & CompileOnSaveMixin & WatchOptions;
      interface FileWithProjectReferenceRedirectInfo {
          /**
           * Name of file
           */
          fileName: string;
          /**
           * True if the file is primarily included in a referenced project
           */
          isSourceOfProjectReferenceRedirect: boolean;
      }
      /**
       * Represents a set of changes that happen in project
       */
      interface ProjectChanges {
          /**
           * List of added files
           */
          added: string[] | FileWithProjectReferenceRedirectInfo[];
          /**
           * List of removed files
           */
          removed: string[] | FileWithProjectReferenceRedirectInfo[];
          /**
           * List of updated files
           */
          updated: string[] | FileWithProjectReferenceRedirectInfo[];
          /**
           * List of files that have had their project reference redirect status updated
           * Only provided when the synchronizeProjectList request has includeProjectReferenceRedirectInfo set to true
           */
          updatedRedirects?: FileWithProjectReferenceRedirectInfo[];
      }
      /**
       * Information found in a configure request.
       */
      interface ConfigureRequestArguments {
          /**
           * Information about the host, for example 'Emacs 24.4' or
           * 'Sublime Text version 3075'
           */
          hostInfo?: string;
          /**
           * If present, tab settings apply only to this file.
           */
          file?: string;
          /**
           * The format options to use during formatting and other code editing features.
           */
          formatOptions?: FormatCodeSettings;
          preferences?: UserPreferences;
          /**
           * The host's additional supported .js file extensions
           */
          extraFileExtensions?: FileExtensionInfo[];
          watchOptions?: WatchOptions;
      }
      enum WatchFileKind {
          FixedPollingInterval = "FixedPollingInterval",
          PriorityPollingInterval = "PriorityPollingInterval",
          DynamicPriorityPolling = "DynamicPriorityPolling",
          UseFsEvents = "UseFsEvents",
          UseFsEventsOnParentDirectory = "UseFsEventsOnParentDirectory"
      }
      enum WatchDirectoryKind {
          UseFsEvents = "UseFsEvents",
          FixedPollingInterval = "FixedPollingInterval",
          DynamicPriorityPolling = "DynamicPriorityPolling"
      }
      enum PollingWatchKind {
          FixedInterval = "FixedInterval",
          PriorityInterval = "PriorityInterval",
          DynamicPriority = "DynamicPriority"
      }
      interface WatchOptions {
          watchFile?: WatchFileKind | ts.WatchFileKind;
          watchDirectory?: WatchDirectoryKind | ts.WatchDirectoryKind;
          fallbackPolling?: PollingWatchKind | ts.PollingWatchKind;
          synchronousWatchDirectory?: boolean;
          [option: string]: CompilerOptionsValue | undefined;
      }
      /**
       *  Configure request; value of command field is "configure".  Specifies
       *  host information, such as host type, tab size, and indent size.
       */
      interface ConfigureRequest extends Request {
          command: CommandTypes.Configure;
          arguments: ConfigureRequestArguments;
      }
      /**
       * Response to "configure" request.  This is just an acknowledgement, so
       * no body field is required.
       */
      interface ConfigureResponse extends Response {
      }
      interface ConfigurePluginRequestArguments {
          pluginName: string;
          configuration: any;
      }
      interface ConfigurePluginRequest extends Request {
          command: CommandTypes.ConfigurePlugin;
          arguments: ConfigurePluginRequestArguments;
      }
      interface ConfigurePluginResponse extends Response {
      }
      interface SelectionRangeRequest extends FileRequest {
          command: CommandTypes.SelectionRange;
          arguments: SelectionRangeRequestArgs;
      }
      interface SelectionRangeRequestArgs extends FileRequestArgs {
          locations: Location[];
      }
      interface SelectionRangeResponse extends Response {
          body?: SelectionRange[];
      }
      interface SelectionRange {
          textSpan: TextSpan;
          parent?: SelectionRange;
      }
      /**
       *  Information found in an "open" request.
       */
      interface OpenRequestArgs extends FileRequestArgs {
          /**
           * Used when a version of the file content is known to be more up to date than the one on disk.
           * Then the known content will be used upon opening instead of the disk copy
           */
          fileContent?: string;
          /**
           * Used to specify the script kind of the file explicitly. It could be one of the following:
           *      "TS", "JS", "TSX", "JSX"
           */
          scriptKindName?: ScriptKindName;
          /**
           * Used to limit the searching for project config file. If given the searching will stop at this
           * root path; otherwise it will go all the way up to the dist root path.
           */
          projectRootPath?: string;
      }
      type ScriptKindName = "TS" | "JS" | "TSX" | "JSX";
      /**
       * Open request; value of command field is "open". Notify the
       * server that the client has file open.  The server will not
       * monitor the filesystem for changes in this file and will assume
       * that the client is updating the server (using the change and/or
       * reload messages) when the file changes. Server does not currently
       * send a response to an open request.
       */
      interface OpenRequest extends Request {
          command: CommandTypes.Open;
          arguments: OpenRequestArgs;
      }
      /**
       * Request to open or update external project
       */
      interface OpenExternalProjectRequest extends Request {
          command: CommandTypes.OpenExternalProject;
          arguments: OpenExternalProjectArgs;
      }
      /**
       * Arguments to OpenExternalProjectRequest request
       */
      type OpenExternalProjectArgs = ExternalProject;
      /**
       * Request to open multiple external projects
       */
      interface OpenExternalProjectsRequest extends Request {
          command: CommandTypes.OpenExternalProjects;
          arguments: OpenExternalProjectsArgs;
      }
      /**
       * Arguments to OpenExternalProjectsRequest
       */
      interface OpenExternalProjectsArgs {
          /**
           * List of external projects to open or update
           */
          projects: ExternalProject[];
      }
      /**
       * Response to OpenExternalProjectRequest request. This is just an acknowledgement, so
       * no body field is required.
       */
      interface OpenExternalProjectResponse extends Response {
      }
      /**
       * Response to OpenExternalProjectsRequest request. This is just an acknowledgement, so
       * no body field is required.
       */
      interface OpenExternalProjectsResponse extends Response {
      }
      /**
       * Request to close external project.
       */
      interface CloseExternalProjectRequest extends Request {
          command: CommandTypes.CloseExternalProject;
          arguments: CloseExternalProjectRequestArgs;
      }
      /**
       * Arguments to CloseExternalProjectRequest request
       */
      interface CloseExternalProjectRequestArgs {
          /**
           * Name of the project to close
           */
          projectFileName: string;
      }
      /**
       * Response to CloseExternalProjectRequest request. This is just an acknowledgement, so
       * no body field is required.
       */
      interface CloseExternalProjectResponse extends Response {
      }
      /**
       * Request to synchronize list of open files with the client
       */
      interface UpdateOpenRequest extends Request {
          command: CommandTypes.UpdateOpen;
          arguments: UpdateOpenRequestArgs;
      }
      /**
       * Arguments to UpdateOpenRequest
       */
      interface UpdateOpenRequestArgs {
          /**
           * List of newly open files
           */
          openFiles?: OpenRequestArgs[];
          /**
           * List of open files files that were changes
           */
          changedFiles?: FileCodeEdits[];
          /**
           * List of files that were closed
           */
          closedFiles?: string[];
      }
      /**
       * Request to set compiler options for inferred projects.
       * External projects are opened / closed explicitly.
       * Configured projects are opened when user opens loose file that has 'tsconfig.json' or 'jsconfig.json' anywhere in one of containing folders.
       * This configuration file will be used to obtain a list of files and configuration settings for the project.
       * Inferred projects are created when user opens a loose file that is not the part of external project
       * or configured project and will contain only open file and transitive closure of referenced files if 'useOneInferredProject' is false,
       * or all open loose files and its transitive closure of referenced files if 'useOneInferredProject' is true.
       */
      interface SetCompilerOptionsForInferredProjectsRequest extends Request {
          command: CommandTypes.CompilerOptionsForInferredProjects;
          arguments: SetCompilerOptionsForInferredProjectsArgs;
      }
      /**
       * Argument for SetCompilerOptionsForInferredProjectsRequest request.
       */
      interface SetCompilerOptionsForInferredProjectsArgs {
          /**
           * Compiler options to be used with inferred projects.
           */
          options: ExternalProjectCompilerOptions;
          /**
           * Specifies the project root path used to scope compiler options.
           * It is an error to provide this property if the server has not been started with
           * `useInferredProjectPerProjectRoot` enabled.
           */
          projectRootPath?: string;
      }
      /**
       * Response to SetCompilerOptionsForInferredProjectsResponse request. This is just an acknowledgement, so
       * no body field is required.
       */
      interface SetCompilerOptionsForInferredProjectsResponse extends Response {
      }
      /**
       *  Exit request; value of command field is "exit".  Ask the server process
       *  to exit.
       */
      interface ExitRequest extends Request {
          command: CommandTypes.Exit;
      }
      /**
       * Close request; value of command field is "close". Notify the
       * server that the client has closed a previously open file.  If
       * file is still referenced by open files, the server will resume
       * monitoring the filesystem for changes to file.  Server does not
       * currently send a response to a close request.
       */
      interface CloseRequest extends FileRequest {
          command: CommandTypes.Close;
      }
      /**
       * Request to obtain the list of files that should be regenerated if target file is recompiled.
       * NOTE: this us query-only operation and does not generate any output on disk.
       */
      interface CompileOnSaveAffectedFileListRequest extends FileRequest {
          command: CommandTypes.CompileOnSaveAffectedFileList;
      }
      /**
       * Contains a list of files that should be regenerated in a project
       */
      interface CompileOnSaveAffectedFileListSingleProject {
          /**
           * Project name
           */
          projectFileName: string;
          /**
           * List of files names that should be recompiled
           */
          fileNames: string[];
          /**
           * true if project uses outFile or out compiler option
           */
          projectUsesOutFile: boolean;
      }
      /**
       * Response for CompileOnSaveAffectedFileListRequest request;
       */
      interface CompileOnSaveAffectedFileListResponse extends Response {
          body: CompileOnSaveAffectedFileListSingleProject[];
      }
      /**
       * Request to recompile the file. All generated outputs (.js, .d.ts or .js.map files) is written on disk.
       */
      interface CompileOnSaveEmitFileRequest extends FileRequest {
          command: CommandTypes.CompileOnSaveEmitFile;
          arguments: CompileOnSaveEmitFileRequestArgs;
      }
      /**
       * Arguments for CompileOnSaveEmitFileRequest
       */
      interface CompileOnSaveEmitFileRequestArgs extends FileRequestArgs {
          /**
           * if true - then file should be recompiled even if it does not have any changes.
           */
          forced?: boolean;
          includeLinePosition?: boolean;
          /** if true - return response as object with emitSkipped and diagnostics */
          richResponse?: boolean;
      }
      interface CompileOnSaveEmitFileResponse extends Response {
          body: boolean | EmitResult;
      }
      interface EmitResult {
          emitSkipped: boolean;
          diagnostics: Diagnostic[] | DiagnosticWithLinePosition[];
      }
      /**
       * Quickinfo request; value of command field is
       * "quickinfo". Return response giving a quick type and
       * documentation string for the symbol found in file at location
       * line, col.
       */
      interface QuickInfoRequest extends FileLocationRequest {
          command: CommandTypes.Quickinfo;
      }
      /**
       * Body of QuickInfoResponse.
       */
      interface QuickInfoResponseBody {
          /**
           * The symbol's kind (such as 'className' or 'parameterName' or plain 'text').
           */
          kind: ScriptElementKind;
          /**
           * Optional modifiers for the kind (such as 'public').
           */
          kindModifiers: string;
          /**
           * Starting file location of symbol.
           */
          start: Location;
          /**
           * One past last character of symbol.
           */
          end: Location;
          /**
           * Type and kind of symbol.
           */
          displayString: string;
          /**
           * Documentation associated with symbol.
           */
          documentation: string;
          /**
           * JSDoc tags associated with symbol.
           */
          tags: JSDocTagInfo[];
      }
      /**
       * Quickinfo response message.
       */
      interface QuickInfoResponse extends Response {
          body?: QuickInfoResponseBody;
      }
      /**
       * Arguments for format messages.
       */
      interface FormatRequestArgs extends FileLocationRequestArgs {
          /**
           * Last line of range for which to format text in file.
           */
          endLine: number;
          /**
           * Character offset on last line of range for which to format text in file.
           */
          endOffset: number;
          /**
           * Format options to be used.
           */
          options?: FormatCodeSettings;
      }
      /**
       * Format request; value of command field is "format".  Return
       * response giving zero or more edit instructions.  The edit
       * instructions will be sorted in file order.  Applying the edit
       * instructions in reverse to file will result in correctly
       * reformatted text.
       */
      interface FormatRequest extends FileLocationRequest {
          command: CommandTypes.Format;
          arguments: FormatRequestArgs;
      }
      /**
       * Object found in response messages defining an editing
       * instruction for a span of text in source code.  The effect of
       * this instruction is to replace the text starting at start and
       * ending one character before end with newText. For an insertion,
       * the text span is empty.  For a deletion, newText is empty.
       */
      interface CodeEdit {
          /**
           * First character of the text span to edit.
           */
          start: Location;
          /**
           * One character past last character of the text span to edit.
           */
          end: Location;
          /**
           * Replace the span defined above with this string (may be
           * the empty string).
           */
          newText: string;
      }
      interface FileCodeEdits {
          fileName: string;
          textChanges: CodeEdit[];
      }
      interface CodeFixResponse extends Response {
          /** The code actions that are available */
          body?: CodeFixAction[];
      }
      interface CodeAction {
          /** Description of the code action to display in the UI of the editor */
          description: string;
          /** Text changes to apply to each file as part of the code action */
          changes: FileCodeEdits[];
          /** A command is an opaque object that should be passed to `ApplyCodeActionCommandRequestArgs` without modification.  */
          commands?: {}[];
      }
      interface CombinedCodeActions {
          changes: readonly FileCodeEdits[];
          commands?: readonly {}[];
      }
      interface CodeFixAction extends CodeAction {
          /** Short name to identify the fix, for use by telemetry. */
          fixName: string;
          /**
           * If present, one may call 'getCombinedCodeFix' with this fixId.
           * This may be omitted to indicate that the code fix can't be applied in a group.
           */
          fixId?: {};
          /** Should be present if and only if 'fixId' is. */
          fixAllDescription?: string;
      }
      /**
       * Format and format on key response message.
       */
      interface FormatResponse extends Response {
          body?: CodeEdit[];
      }
      /**
       * Arguments for format on key messages.
       */
      interface FormatOnKeyRequestArgs extends FileLocationRequestArgs {
          /**
           * Key pressed (';', '\n', or '}').
           */
          key: string;
          options?: FormatCodeSettings;
      }
      /**
       * Format on key request; value of command field is
       * "formatonkey". Given file location and key typed (as string),
       * return response giving zero or more edit instructions.  The
       * edit instructions will be sorted in file order.  Applying the
       * edit instructions in reverse to file will result in correctly
       * reformatted text.
       */
      interface FormatOnKeyRequest extends FileLocationRequest {
          command: CommandTypes.Formatonkey;
          arguments: FormatOnKeyRequestArgs;
      }
      type CompletionsTriggerCharacter = "." | '"' | "'" | "`" | "/" | "@" | "<" | "#";
      /**
       * Arguments for completions messages.
       */
      interface CompletionsRequestArgs extends FileLocationRequestArgs {
          /**
           * Optional prefix to apply to possible completions.
           */
          prefix?: string;
          /**
           * Character that was responsible for triggering completion.
           * Should be `undefined` if a user manually requested completion.
           */
          triggerCharacter?: CompletionsTriggerCharacter;
          /**
           * @deprecated Use UserPreferences.includeCompletionsForModuleExports
           */
          includeExternalModuleExports?: boolean;
          /**
           * @deprecated Use UserPreferences.includeCompletionsWithInsertText
           */
          includeInsertTextCompletions?: boolean;
      }
      /**
       * Completions request; value of command field is "completions".
       * Given a file location (file, line, col) and a prefix (which may
       * be the empty string), return the possible completions that
       * begin with prefix.
       */
      interface CompletionsRequest extends FileLocationRequest {
          command: CommandTypes.Completions | CommandTypes.CompletionInfo;
          arguments: CompletionsRequestArgs;
      }
      /**
       * Arguments for completion details request.
       */
      interface CompletionDetailsRequestArgs extends FileLocationRequestArgs {
          /**
           * Names of one or more entries for which to obtain details.
           */
          entryNames: (string | CompletionEntryIdentifier)[];
      }
      interface CompletionEntryIdentifier {
          name: string;
          source?: string;
      }
      /**
       * Completion entry details request; value of command field is
       * "completionEntryDetails".  Given a file location (file, line,
       * col) and an array of completion entry names return more
       * detailed information for each completion entry.
       */
      interface CompletionDetailsRequest extends FileLocationRequest {
          command: CommandTypes.CompletionDetails;
          arguments: CompletionDetailsRequestArgs;
      }
      /**
       * Part of a symbol description.
       */
      interface SymbolDisplayPart {
          /**
           * Text of an item describing the symbol.
           */
          text: string;
          /**
           * The symbol's kind (such as 'className' or 'parameterName' or plain 'text').
           */
          kind: string;
      }
      /**
       * An item found in a completion response.
       */
      interface CompletionEntry {
          /**
           * The symbol's name.
           */
          name: string;
          /**
           * The symbol's kind (such as 'className' or 'parameterName').
           */
          kind: ScriptElementKind;
          /**
           * Optional modifiers for the kind (such as 'public').
           */
          kindModifiers?: string;
          /**
           * A string that is used for comparing completion items so that they can be ordered.  This
           * is often the same as the name but may be different in certain circumstances.
           */
          sortText: string;
          /**
           * Text to insert instead of `name`.
           * This is used to support bracketed completions; If `name` might be "a-b" but `insertText` would be `["a-b"]`,
           * coupled with `replacementSpan` to replace a dotted access with a bracket access.
           */
          insertText?: string;
          /**
           * An optional span that indicates the text to be replaced by this completion item.
           * If present, this span should be used instead of the default one.
           * It will be set if the required span differs from the one generated by the default replacement behavior.
           */
          replacementSpan?: TextSpan;
          /**
           * Indicates whether commiting this completion entry will require additional code actions to be
           * made to avoid errors. The CompletionEntryDetails will have these actions.
           */
          hasAction?: true;
          /**
           * Identifier (not necessarily human-readable) identifying where this completion came from.
           */
          source?: string;
          /**
           * If true, this completion should be highlighted as recommended. There will only be one of these.
           * This will be set when we know the user should write an expression with a certain type and that type is an enum or constructable class.
           * Then either that enum/class or a namespace containing it will be the recommended symbol.
           */
          isRecommended?: true;
          /**
           * If true, this completion was generated from traversing the name table of an unchecked JS file,
           * and therefore may not be accurate.
           */
          isFromUncheckedFile?: true;
      }
      /**
       * Additional completion entry details, available on demand
       */
      interface CompletionEntryDetails {
          /**
           * The symbol's name.
           */
          name: string;
          /**
           * The symbol's kind (such as 'className' or 'parameterName').
           */
          kind: ScriptElementKind;
          /**
           * Optional modifiers for the kind (such as 'public').
           */
          kindModifiers: string;
          /**
           * Display parts of the symbol (similar to quick info).
           */
          displayParts: SymbolDisplayPart[];
          /**
           * Documentation strings for the symbol.
           */
          documentation?: SymbolDisplayPart[];
          /**
           * JSDoc tags for the symbol.
           */
          tags?: JSDocTagInfo[];
          /**
           * The associated code actions for this entry
           */
          codeActions?: CodeAction[];
          /**
           * Human-readable description of the `source` from the CompletionEntry.
           */
          source?: SymbolDisplayPart[];
      }
      /** @deprecated Prefer CompletionInfoResponse, which supports several top-level fields in addition to the array of entries. */
      interface CompletionsResponse extends Response {
          body?: CompletionEntry[];
      }
      interface CompletionInfoResponse extends Response {
          body?: CompletionInfo;
      }
      interface CompletionInfo {
          readonly isGlobalCompletion: boolean;
          readonly isMemberCompletion: boolean;
          readonly isNewIdentifierLocation: boolean;
          readonly entries: readonly CompletionEntry[];
      }
      interface CompletionDetailsResponse extends Response {
          body?: CompletionEntryDetails[];
      }
      /**
       * Signature help information for a single parameter
       */
      interface SignatureHelpParameter {
          /**
           * The parameter's name
           */
          name: string;
          /**
           * Documentation of the parameter.
           */
          documentation: SymbolDisplayPart[];
          /**
           * Display parts of the parameter.
           */
          displayParts: SymbolDisplayPart[];
          /**
           * Whether the parameter is optional or not.
           */
          isOptional: boolean;
      }
      /**
       * Represents a single signature to show in signature help.
       */
      interface SignatureHelpItem {
          /**
           * Whether the signature accepts a variable number of arguments.
           */
          isVariadic: boolean;
          /**
           * The prefix display parts.
           */
          prefixDisplayParts: SymbolDisplayPart[];
          /**
           * The suffix display parts.
           */
          suffixDisplayParts: SymbolDisplayPart[];
          /**
           * The separator display parts.
           */
          separatorDisplayParts: SymbolDisplayPart[];
          /**
           * The signature helps items for the parameters.
           */
          parameters: SignatureHelpParameter[];
          /**
           * The signature's documentation
           */
          documentation: SymbolDisplayPart[];
          /**
           * The signature's JSDoc tags
           */
          tags: JSDocTagInfo[];
      }
      /**
       * Signature help items found in the response of a signature help request.
       */
      interface SignatureHelpItems {
          /**
           * The signature help items.
           */
          items: SignatureHelpItem[];
          /**
           * The span for which signature help should appear on a signature
           */
          applicableSpan: TextSpan;
          /**
           * The item selected in the set of available help items.
           */
          selectedItemIndex: number;
          /**
           * The argument selected in the set of parameters.
           */
          argumentIndex: number;
          /**
           * The argument count
           */
          argumentCount: number;
      }
      type SignatureHelpTriggerCharacter = "," | "(" | "<";
      type SignatureHelpRetriggerCharacter = SignatureHelpTriggerCharacter | ")";
      /**
       * Arguments of a signature help request.
       */
      interface SignatureHelpRequestArgs extends FileLocationRequestArgs {
          /**
           * Reason why signature help was invoked.
           * See each individual possible
           */
          triggerReason?: SignatureHelpTriggerReason;
      }
      type SignatureHelpTriggerReason = SignatureHelpInvokedReason | SignatureHelpCharacterTypedReason | SignatureHelpRetriggeredReason;
      /**
       * Signals that the user manually requested signature help.
       * The language service will unconditionally attempt to provide a result.
       */
      interface SignatureHelpInvokedReason {
          kind: "invoked";
          triggerCharacter?: undefined;
      }
      /**
       * Signals that the signature help request came from a user typing a character.
       * Depending on the character and the syntactic context, the request may or may not be served a result.
       */
      interface SignatureHelpCharacterTypedReason {
          kind: "characterTyped";
          /**
           * Character that was responsible for triggering signature help.
           */
          triggerCharacter: SignatureHelpTriggerCharacter;
      }
      /**
       * Signals that this signature help request came from typing a character or moving the cursor.
       * This should only occur if a signature help session was already active and the editor needs to see if it should adjust.
       * The language service will unconditionally attempt to provide a result.
       * `triggerCharacter` can be `undefined` for a retrigger caused by a cursor move.
       */
      interface SignatureHelpRetriggeredReason {
          kind: "retrigger";
          /**
           * Character that was responsible for triggering signature help.
           */
          triggerCharacter?: SignatureHelpRetriggerCharacter;
      }
      /**
       * Signature help request; value of command field is "signatureHelp".
       * Given a file location (file, line, col), return the signature
       * help.
       */
      interface SignatureHelpRequest extends FileLocationRequest {
          command: CommandTypes.SignatureHelp;
          arguments: SignatureHelpRequestArgs;
      }
      /**
       * Response object for a SignatureHelpRequest.
       */
      interface SignatureHelpResponse extends Response {
          body?: SignatureHelpItems;
      }
      /**
       * Synchronous request for semantic diagnostics of one file.
       */
      interface SemanticDiagnosticsSyncRequest extends FileRequest {
          command: CommandTypes.SemanticDiagnosticsSync;
          arguments: SemanticDiagnosticsSyncRequestArgs;
      }
      interface SemanticDiagnosticsSyncRequestArgs extends FileRequestArgs {
          includeLinePosition?: boolean;
      }
      /**
       * Response object for synchronous sematic diagnostics request.
       */
      interface SemanticDiagnosticsSyncResponse extends Response {
          body?: Diagnostic[] | DiagnosticWithLinePosition[];
      }
      interface SuggestionDiagnosticsSyncRequest extends FileRequest {
          command: CommandTypes.SuggestionDiagnosticsSync;
          arguments: SuggestionDiagnosticsSyncRequestArgs;
      }
      type SuggestionDiagnosticsSyncRequestArgs = SemanticDiagnosticsSyncRequestArgs;
      type SuggestionDiagnosticsSyncResponse = SemanticDiagnosticsSyncResponse;
      /**
       * Synchronous request for syntactic diagnostics of one file.
       */
      interface SyntacticDiagnosticsSyncRequest extends FileRequest {
          command: CommandTypes.SyntacticDiagnosticsSync;
          arguments: SyntacticDiagnosticsSyncRequestArgs;
      }
      interface SyntacticDiagnosticsSyncRequestArgs extends FileRequestArgs {
          includeLinePosition?: boolean;
      }
      /**
       * Response object for synchronous syntactic diagnostics request.
       */
      interface SyntacticDiagnosticsSyncResponse extends Response {
          body?: Diagnostic[] | DiagnosticWithLinePosition[];
      }
      /**
       * Arguments for GeterrForProject request.
       */
      interface GeterrForProjectRequestArgs {
          /**
           * the file requesting project error list
           */
          file: string;
          /**
           * Delay in milliseconds to wait before starting to compute
           * errors for the files in the file list
           */
          delay: number;
      }
      /**
       * GeterrForProjectRequest request; value of command field is
       * "geterrForProject". It works similarly with 'Geterr', only
       * it request for every file in this project.
       */
      interface GeterrForProjectRequest extends Request {
          command: CommandTypes.GeterrForProject;
          arguments: GeterrForProjectRequestArgs;
      }
      /**
       * Arguments for geterr messages.
       */
      interface GeterrRequestArgs {
          /**
           * List of file names for which to compute compiler errors.
           * The files will be checked in list order.
           */
          files: string[];
          /**
           * Delay in milliseconds to wait before starting to compute
           * errors for the files in the file list
           */
          delay: number;
      }
      /**
       * Geterr request; value of command field is "geterr". Wait for
       * delay milliseconds and then, if during the wait no change or
       * reload messages have arrived for the first file in the files
       * list, get the syntactic errors for the file, field requests,
       * and then get the semantic errors for the file.  Repeat with a
       * smaller delay for each subsequent file on the files list.  Best
       * practice for an editor is to send a file list containing each
       * file that is currently visible, in most-recently-used order.
       */
      interface GeterrRequest extends Request {
          command: CommandTypes.Geterr;
          arguments: GeterrRequestArgs;
      }
      type RequestCompletedEventName = "requestCompleted";
      /**
       * Event that is sent when server have finished processing request with specified id.
       */
      interface RequestCompletedEvent extends Event {
          event: RequestCompletedEventName;
          body: RequestCompletedEventBody;
      }
      interface RequestCompletedEventBody {
          request_seq: number;
      }
      /**
       * Item of diagnostic information found in a DiagnosticEvent message.
       */
      interface Diagnostic {
          /**
           * Starting file location at which text applies.
           */
          start: Location;
          /**
           * The last file location at which the text applies.
           */
          end: Location;
          /**
           * Text of diagnostic message.
           */
          text: string;
          /**
           * The category of the diagnostic message, e.g. "error", "warning", or "suggestion".
           */
          category: string;
          reportsUnnecessary?: {};
          /**
           * Any related spans the diagnostic may have, such as other locations relevant to an error, such as declarartion sites
           */
          relatedInformation?: DiagnosticRelatedInformation[];
          /**
           * The error code of the diagnostic message.
           */
          code?: number;
          /**
           * The name of the plugin reporting the message.
           */
          source?: string;
      }
      interface DiagnosticWithFileName extends Diagnostic {
          /**
           * Name of the file the diagnostic is in
           */
          fileName: string;
      }
      /**
       * Represents additional spans returned with a diagnostic which are relevant to it
       */
      interface DiagnosticRelatedInformation {
          /**
           * The category of the related information message, e.g. "error", "warning", or "suggestion".
           */
          category: string;
          /**
           * The code used ot identify the related information
           */
          code: number;
          /**
           * Text of related or additional information.
           */
          message: string;
          /**
           * Associated location
           */
          span?: FileSpan;
      }
      interface DiagnosticEventBody {
          /**
           * The file for which diagnostic information is reported.
           */
          file: string;
          /**
           * An array of diagnostic information items.
           */
          diagnostics: Diagnostic[];
      }
      type DiagnosticEventKind = "semanticDiag" | "syntaxDiag" | "suggestionDiag";
      /**
       * Event message for DiagnosticEventKind event types.
       * These events provide syntactic and semantic errors for a file.
       */
      interface DiagnosticEvent extends Event {
          body?: DiagnosticEventBody;
          event: DiagnosticEventKind;
      }
      interface ConfigFileDiagnosticEventBody {
          /**
           * The file which trigged the searching and error-checking of the config file
           */
          triggerFile: string;
          /**
           * The name of the found config file.
           */
          configFile: string;
          /**
           * An arry of diagnostic information items for the found config file.
           */
          diagnostics: DiagnosticWithFileName[];
      }
      /**
       * Event message for "configFileDiag" event type.
       * This event provides errors for a found config file.
       */
      interface ConfigFileDiagnosticEvent extends Event {
          body?: ConfigFileDiagnosticEventBody;
          event: "configFileDiag";
      }
      type ProjectLanguageServiceStateEventName = "projectLanguageServiceState";
      interface ProjectLanguageServiceStateEvent extends Event {
          event: ProjectLanguageServiceStateEventName;
          body?: ProjectLanguageServiceStateEventBody;
      }
      interface ProjectLanguageServiceStateEventBody {
          /**
           * Project name that has changes in the state of language service.
           * For configured projects this will be the config file path.
           * For external projects this will be the name of the projects specified when project was open.
           * For inferred projects this event is not raised.
           */
          projectName: string;
          /**
           * True if language service state switched from disabled to enabled
           * and false otherwise.
           */
          languageServiceEnabled: boolean;
      }
      type ProjectsUpdatedInBackgroundEventName = "projectsUpdatedInBackground";
      interface ProjectsUpdatedInBackgroundEvent extends Event {
          event: ProjectsUpdatedInBackgroundEventName;
          body: ProjectsUpdatedInBackgroundEventBody;
      }
      interface ProjectsUpdatedInBackgroundEventBody {
          /**
           * Current set of open files
           */
          openFiles: string[];
      }
      type ProjectLoadingStartEventName = "projectLoadingStart";
      interface ProjectLoadingStartEvent extends Event {
          event: ProjectLoadingStartEventName;
          body: ProjectLoadingStartEventBody;
      }
      interface ProjectLoadingStartEventBody {
          /** name of the project */
          projectName: string;
          /** reason for loading */
          reason: string;
      }
      type ProjectLoadingFinishEventName = "projectLoadingFinish";
      interface ProjectLoadingFinishEvent extends Event {
          event: ProjectLoadingFinishEventName;
          body: ProjectLoadingFinishEventBody;
      }
      interface ProjectLoadingFinishEventBody {
          /** name of the project */
          projectName: string;
      }
      type SurveyReadyEventName = "surveyReady";
      interface SurveyReadyEvent extends Event {
          event: SurveyReadyEventName;
          body: SurveyReadyEventBody;
      }
      interface SurveyReadyEventBody {
          /** Name of the survey. This is an internal machine- and programmer-friendly name */
          surveyId: string;
      }
      type LargeFileReferencedEventName = "largeFileReferenced";
      interface LargeFileReferencedEvent extends Event {
          event: LargeFileReferencedEventName;
          body: LargeFileReferencedEventBody;
      }
      interface LargeFileReferencedEventBody {
          /**
           * name of the large file being loaded
           */
          file: string;
          /**
           * size of the file
           */
          fileSize: number;
          /**
           * max file size allowed on the server
           */
          maxFileSize: number;
      }
      /**
       * Arguments for reload request.
       */
      interface ReloadRequestArgs extends FileRequestArgs {
          /**
           * Name of temporary file from which to reload file
           * contents. May be same as file.
           */
          tmpfile: string;
      }
      /**
       * Reload request message; value of command field is "reload".
       * Reload contents of file with name given by the 'file' argument
       * from temporary file with name given by the 'tmpfile' argument.
       * The two names can be identical.
       */
      interface ReloadRequest extends FileRequest {
          command: CommandTypes.Reload;
          arguments: ReloadRequestArgs;
      }
      /**
       * Response to "reload" request. This is just an acknowledgement, so
       * no body field is required.
       */
      interface ReloadResponse extends Response {
      }
      /**
       * Arguments for saveto request.
       */
      interface SavetoRequestArgs extends FileRequestArgs {
          /**
           * Name of temporary file into which to save server's view of
           * file contents.
           */
          tmpfile: string;
      }
      /**
       * Saveto request message; value of command field is "saveto".
       * For debugging purposes, save to a temporaryfile (named by
       * argument 'tmpfile') the contents of file named by argument
       * 'file'.  The server does not currently send a response to a
       * "saveto" request.
       */
      interface SavetoRequest extends FileRequest {
          command: CommandTypes.Saveto;
          arguments: SavetoRequestArgs;
      }
      /**
       * Arguments for navto request message.
       */
      interface NavtoRequestArgs {
          /**
           * Search term to navigate to from current location; term can
           * be '.*' or an identifier prefix.
           */
          searchValue: string;
          /**
           *  Optional limit on the number of items to return.
           */
          maxResultCount?: number;
          /**
           * The file for the request (absolute pathname required).
           */
          file?: string;
          /**
           * Optional flag to indicate we want results for just the current file
           * or the entire project.
           */
          currentFileOnly?: boolean;
          projectFileName?: string;
      }
      /**
       * Navto request message; value of command field is "navto".
       * Return list of objects giving file locations and symbols that
       * match the search term given in argument 'searchTerm'.  The
       * context for the search is given by the named file.
       */
      interface NavtoRequest extends Request {
          command: CommandTypes.Navto;
          arguments: NavtoRequestArgs;
      }
      /**
       * An item found in a navto response.
       */
      interface NavtoItem extends FileSpan {
          /**
           * The symbol's name.
           */
          name: string;
          /**
           * The symbol's kind (such as 'className' or 'parameterName').
           */
          kind: ScriptElementKind;
          /**
           * exact, substring, or prefix.
           */
          matchKind: string;
          /**
           * If this was a case sensitive or insensitive match.
           */
          isCaseSensitive: boolean;
          /**
           * Optional modifiers for the kind (such as 'public').
           */
          kindModifiers?: string;
          /**
           * Name of symbol's container symbol (if any); for example,
           * the class name if symbol is a class member.
           */
          containerName?: string;
          /**
           * Kind of symbol's container symbol (if any).
           */
          containerKind?: ScriptElementKind;
      }
      /**
       * Navto response message. Body is an array of navto items.  Each
       * item gives a symbol that matched the search term.
       */
      interface NavtoResponse extends Response {
          body?: NavtoItem[];
      }
      /**
       * Arguments for change request message.
       */
      interface ChangeRequestArgs extends FormatRequestArgs {
          /**
           * Optional string to insert at location (file, line, offset).
           */
          insertString?: string;
      }
      /**
       * Change request message; value of command field is "change".
       * Update the server's view of the file named by argument 'file'.
       * Server does not currently send a response to a change request.
       */
      interface ChangeRequest extends FileLocationRequest {
          command: CommandTypes.Change;
          arguments: ChangeRequestArgs;
      }
      /**
       * Response to "brace" request.
       */
      interface BraceResponse extends Response {
          body?: TextSpan[];
      }
      /**
       * Brace matching request; value of command field is "brace".
       * Return response giving the file locations of matching braces
       * found in file at location line, offset.
       */
      interface BraceRequest extends FileLocationRequest {
          command: CommandTypes.Brace;
      }
      /**
       * NavBar items request; value of command field is "navbar".
       * Return response giving the list of navigation bar entries
       * extracted from the requested file.
       */
      interface NavBarRequest extends FileRequest {
          command: CommandTypes.NavBar;
      }
      /**
       * NavTree request; value of command field is "navtree".
       * Return response giving the navigation tree of the requested file.
       */
      interface NavTreeRequest extends FileRequest {
          command: CommandTypes.NavTree;
      }
      interface NavigationBarItem {
          /**
           * The item's display text.
           */
          text: string;
          /**
           * The symbol's kind (such as 'className' or 'parameterName').
           */
          kind: ScriptElementKind;
          /**
           * Optional modifiers for the kind (such as 'public').
           */
          kindModifiers?: string;
          /**
           * The definition locations of the item.
           */
          spans: TextSpan[];
          /**
           * Optional children.
           */
          childItems?: NavigationBarItem[];
          /**
           * Number of levels deep this item should appear.
           */
          indent: number;
      }
      /** protocol.NavigationTree is identical to ts.NavigationTree, except using protocol.TextSpan instead of ts.TextSpan */
      interface NavigationTree {
          text: string;
          kind: ScriptElementKind;
          kindModifiers: string;
          spans: TextSpan[];
          nameSpan: TextSpan | undefined;
          childItems?: NavigationTree[];
      }
      type TelemetryEventName = "telemetry";
      interface TelemetryEvent extends Event {
          event: TelemetryEventName;
          body: TelemetryEventBody;
      }
      interface TelemetryEventBody {
          telemetryEventName: string;
          payload: any;
      }
      type TypesInstallerInitializationFailedEventName = "typesInstallerInitializationFailed";
      interface TypesInstallerInitializationFailedEvent extends Event {
          event: TypesInstallerInitializationFailedEventName;
          body: TypesInstallerInitializationFailedEventBody;
      }
      interface TypesInstallerInitializationFailedEventBody {
          message: string;
      }
      type TypingsInstalledTelemetryEventName = "typingsInstalled";
      interface TypingsInstalledTelemetryEventBody extends TelemetryEventBody {
          telemetryEventName: TypingsInstalledTelemetryEventName;
          payload: TypingsInstalledTelemetryEventPayload;
      }
      interface TypingsInstalledTelemetryEventPayload {
          /**
           * Comma separated list of installed typing packages
           */
          installedPackages: string;
          /**
           * true if install request succeeded, otherwise - false
           */
          installSuccess: boolean;
          /**
           * version of typings installer
           */
          typingsInstallerVersion: string;
      }
      type BeginInstallTypesEventName = "beginInstallTypes";
      type EndInstallTypesEventName = "endInstallTypes";
      interface BeginInstallTypesEvent extends Event {
          event: BeginInstallTypesEventName;
          body: BeginInstallTypesEventBody;
      }
      interface EndInstallTypesEvent extends Event {
          event: EndInstallTypesEventName;
          body: EndInstallTypesEventBody;
      }
      interface InstallTypesEventBody {
          /**
           * correlation id to match begin and end events
           */
          eventId: number;
          /**
           * list of packages to install
           */
          packages: readonly string[];
      }
      interface BeginInstallTypesEventBody extends InstallTypesEventBody {
      }
      interface EndInstallTypesEventBody extends InstallTypesEventBody {
          /**
           * true if installation succeeded, otherwise false
           */
          success: boolean;
      }
      interface NavBarResponse extends Response {
          body?: NavigationBarItem[];
      }
      interface NavTreeResponse extends Response {
          body?: NavigationTree;
      }
      interface CallHierarchyItem {
          name: string;
          kind: ScriptElementKind;
          file: string;
          span: TextSpan;
          selectionSpan: TextSpan;
      }
      interface CallHierarchyIncomingCall {
          from: CallHierarchyItem;
          fromSpans: TextSpan[];
      }
      interface CallHierarchyOutgoingCall {
          to: CallHierarchyItem;
          fromSpans: TextSpan[];
      }
      interface PrepareCallHierarchyRequest extends FileLocationRequest {
          command: CommandTypes.PrepareCallHierarchy;
      }
      interface PrepareCallHierarchyResponse extends Response {
          readonly body: CallHierarchyItem | CallHierarchyItem[];
      }
      interface ProvideCallHierarchyIncomingCallsRequest extends FileLocationRequest {
          command: CommandTypes.ProvideCallHierarchyIncomingCalls;
      }
      interface ProvideCallHierarchyIncomingCallsResponse extends Response {
          readonly body: CallHierarchyIncomingCall[];
      }
      interface ProvideCallHierarchyOutgoingCallsRequest extends FileLocationRequest {
          command: CommandTypes.ProvideCallHierarchyOutgoingCalls;
      }
      interface ProvideCallHierarchyOutgoingCallsResponse extends Response {
          readonly body: CallHierarchyOutgoingCall[];
      }
      enum IndentStyle {
          None = "None",
          Block = "Block",
          Smart = "Smart"
      }
      enum SemicolonPreference {
          Ignore = "ignore",
          Insert = "insert",
          Remove = "remove"
      }
      interface EditorSettings {
          baseIndentSize?: number;
          indentSize?: number;
          tabSize?: number;
          newLineCharacter?: string;
          convertTabsToSpaces?: boolean;
          indentStyle?: IndentStyle | ts.IndentStyle;
          trimTrailingWhitespace?: boolean;
      }
      interface FormatCodeSettings extends EditorSettings {
          insertSpaceAfterCommaDelimiter?: boolean;
          insertSpaceAfterSemicolonInForStatements?: boolean;
          insertSpaceBeforeAndAfterBinaryOperators?: boolean;
          insertSpaceAfterConstructor?: boolean;
          insertSpaceAfterKeywordsInControlFlowStatements?: boolean;
          insertSpaceAfterFunctionKeywordForAnonymousFunctions?: boolean;
          insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis?: boolean;
          insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets?: boolean;
          insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces?: boolean;
          insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces?: boolean;
          insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces?: boolean;
          insertSpaceAfterTypeAssertion?: boolean;
          insertSpaceBeforeFunctionParenthesis?: boolean;
          placeOpenBraceOnNewLineForFunctions?: boolean;
          placeOpenBraceOnNewLineForControlBlocks?: boolean;
          insertSpaceBeforeTypeAnnotation?: boolean;
          semicolons?: SemicolonPreference;
      }
      interface UserPreferences {
          readonly disableSuggestions?: boolean;
          readonly quotePreference?: "auto" | "double" | "single";
          /**
           * If enabled, TypeScript will search through all external modules' exports and add them to the completions list.
           * This affects lone identifier completions but not completions on the right hand side of `obj.`.
           */
          readonly includeCompletionsForModuleExports?: boolean;
          /**
           * If enabled, the completion list will include completions with invalid identifier names.
           * For those entries, The `insertText` and `replacementSpan` properties will be set to change from `.x` property access to `["x"]`.
           */
          readonly includeCompletionsWithInsertText?: boolean;
          /**
           * Unless this option is `false`, or `includeCompletionsWithInsertText` is not enabled,
           * member completion lists triggered with `.` will include entries on potentially-null and potentially-undefined
           * values, with insertion text to replace preceding `.` tokens with `?.`.
           */
          readonly includeAutomaticOptionalChainCompletions?: boolean;
          readonly importModuleSpecifierPreference?: "auto" | "relative" | "non-relative";
          /** Determines whether we import `foo/index.ts` as "foo", "foo/index", or "foo/index.js" */
          readonly importModuleSpecifierEnding?: "auto" | "minimal" | "index" | "js";
          readonly allowTextChangesInNewFiles?: boolean;
          readonly lazyConfiguredProjectsFromExternalProject?: boolean;
          readonly providePrefixAndSuffixTextForRename?: boolean;
          readonly allowRenameOfImportPath?: boolean;
      }
      interface CompilerOptions {
          allowJs?: boolean;
          allowSyntheticDefaultImports?: boolean;
          allowUnreachableCode?: boolean;
          allowUnusedLabels?: boolean;
          alwaysStrict?: boolean;
          baseUrl?: string;
          charset?: string;
          checkJs?: boolean;
          declaration?: boolean;
          declarationDir?: string;
          disableSizeLimit?: boolean;
          downlevelIteration?: boolean;
          emitBOM?: boolean;
          emitDecoratorMetadata?: boolean;
          experimentalDecorators?: boolean;
          forceConsistentCasingInFileNames?: boolean;
          importHelpers?: boolean;
          inlineSourceMap?: boolean;
          inlineSources?: boolean;
          isolatedModules?: boolean;
          jsx?: JsxEmit | ts.JsxEmit;
          lib?: string[];
          locale?: string;
          mapRoot?: string;
          maxNodeModuleJsDepth?: number;
          module?: ModuleKind | ts.ModuleKind;
          moduleResolution?: ModuleResolutionKind | ts.ModuleResolutionKind;
          newLine?: NewLineKind | ts.NewLineKind;
          noEmit?: boolean;
          noEmitHelpers?: boolean;
          noEmitOnError?: boolean;
          noErrorTruncation?: boolean;
          noFallthroughCasesInSwitch?: boolean;
          noImplicitAny?: boolean;
          noImplicitReturns?: boolean;
          noImplicitThis?: boolean;
          noUnusedLocals?: boolean;
          noUnusedParameters?: boolean;
          noImplicitUseStrict?: boolean;
          noLib?: boolean;
          noResolve?: boolean;
          out?: string;
          outDir?: string;
          outFile?: string;
          paths?: MapLike<string[]>;
          plugins?: PluginImport[];
          preserveConstEnums?: boolean;
          preserveSymlinks?: boolean;
          project?: string;
          reactNamespace?: string;
          removeComments?: boolean;
          references?: ProjectReference[];
          rootDir?: string;
          rootDirs?: string[];
          skipLibCheck?: boolean;
          skipDefaultLibCheck?: boolean;
          sourceMap?: boolean;
          sourceRoot?: string;
          strict?: boolean;
          strictNullChecks?: boolean;
          suppressExcessPropertyErrors?: boolean;
          suppressImplicitAnyIndexErrors?: boolean;
          useDefineForClassFields?: boolean;
          target?: ScriptTarget | ts.ScriptTarget;
          traceResolution?: boolean;
          resolveJsonMo