You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							44254 lines
						
					
					
						
							1.3 MiB
						
					
					
				
			
		
		
	
	
							44254 lines
						
					
					
						
							1.3 MiB
						
					
					
				'use strict'; | 
						|
 | 
						|
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } | 
						|
 | 
						|
var fs$1 = _interopDefault(require('fs')); | 
						|
var os$1 = _interopDefault(require('os')); | 
						|
var path$2 = _interopDefault(require('path')); | 
						|
var assert$1 = _interopDefault(require('assert')); | 
						|
var util$2 = _interopDefault(require('util')); | 
						|
var events$1 = _interopDefault(require('events')); | 
						|
 | 
						|
var name = "prettier"; | 
						|
var version = "1.19.1"; | 
						|
var description = "Prettier is an opinionated code formatter"; | 
						|
var bin = { | 
						|
	prettier: "./bin/prettier.js" | 
						|
}; | 
						|
var repository = "prettier/prettier"; | 
						|
var homepage = "https://prettier.io"; | 
						|
var author = "James Long"; | 
						|
var license = "MIT"; | 
						|
var main = "./index.js"; | 
						|
var engines = { | 
						|
	node: ">=8" | 
						|
}; | 
						|
var dependencies = { | 
						|
	"@angular/compiler": "8.2.13", | 
						|
	"@babel/code-frame": "7.5.5", | 
						|
	"@babel/parser": "7.7.3", | 
						|
	"@glimmer/syntax": "0.41.0", | 
						|
	"@iarna/toml": "2.2.3", | 
						|
	"@typescript-eslint/typescript-estree": "2.6.1", | 
						|
	"angular-estree-parser": "1.1.5", | 
						|
	"angular-html-parser": "1.3.0", | 
						|
	camelcase: "5.3.1", | 
						|
	chalk: "2.4.2", | 
						|
	"cjk-regex": "2.0.0", | 
						|
	cosmiconfig: "5.2.1", | 
						|
	dashify: "2.0.0", | 
						|
	dedent: "0.7.0", | 
						|
	diff: "4.0.1", | 
						|
	editorconfig: "0.15.3", | 
						|
	"editorconfig-to-prettier": "0.1.1", | 
						|
	"escape-string-regexp": "1.0.5", | 
						|
	esutils: "2.0.3", | 
						|
	"find-parent-dir": "0.3.0", | 
						|
	"find-project-root": "1.1.1", | 
						|
	"flow-parser": "0.111.3", | 
						|
	"get-stream": "4.1.0", | 
						|
	globby: "6.1.0", | 
						|
	graphql: "14.5.8", | 
						|
	"html-element-attributes": "2.2.0", | 
						|
	"html-styles": "1.0.0", | 
						|
	"html-tag-names": "1.1.4", | 
						|
	ignore: "4.0.6", | 
						|
	"is-ci": "2.0.0", | 
						|
	"jest-docblock": "24.9.0", | 
						|
	"json-stable-stringify": "1.0.1", | 
						|
	leven: "3.1.0", | 
						|
	"lines-and-columns": "1.1.6", | 
						|
	"linguist-languages": "7.6.0", | 
						|
	"lodash.uniqby": "4.7.0", | 
						|
	mem: "5.1.1", | 
						|
	minimatch: "3.0.4", | 
						|
	minimist: "1.2.0", | 
						|
	"n-readlines": "1.0.0", | 
						|
	"normalize-path": "3.0.0", | 
						|
	"parse-srcset": "ikatyang/parse-srcset#54eb9c1cb21db5c62b4d0e275d7249516df6f0ee", | 
						|
	"postcss-less": "2.0.0", | 
						|
	"postcss-media-query-parser": "0.2.3", | 
						|
	"postcss-scss": "2.0.0", | 
						|
	"postcss-selector-parser": "2.2.3", | 
						|
	"postcss-values-parser": "1.5.0", | 
						|
	"regexp-util": "1.2.2", | 
						|
	"remark-math": "1.0.6", | 
						|
	"remark-parse": "5.0.0", | 
						|
	resolve: "1.12.0", | 
						|
	semver: "6.3.0", | 
						|
	"string-width": "4.1.0", | 
						|
	typescript: "3.7.2", | 
						|
	"unicode-regex": "3.0.0", | 
						|
	unified: "8.4.1", | 
						|
	vnopts: "1.0.2", | 
						|
	"yaml-unist-parser": "1.1.1" | 
						|
}; | 
						|
var devDependencies = { | 
						|
	"@babel/core": "7.7.2", | 
						|
	"@babel/preset-env": "7.7.1", | 
						|
	"@rollup/plugin-alias": "2.2.0", | 
						|
	"@rollup/plugin-replace": "2.2.1", | 
						|
	"babel-loader": "8.0.6", | 
						|
	benchmark: "2.1.4", | 
						|
	"builtin-modules": "3.1.0", | 
						|
	codecov: "3.6.1", | 
						|
	"cross-env": "6.0.3", | 
						|
	eslint: "6.6.0", | 
						|
	"eslint-config-prettier": "6.5.0", | 
						|
	"eslint-formatter-friendly": "7.0.0", | 
						|
	"eslint-plugin-import": "2.18.2", | 
						|
	"eslint-plugin-prettier": "3.1.1", | 
						|
	"eslint-plugin-react": "7.16.0", | 
						|
	execa: "3.2.0", | 
						|
	jest: "23.3.0", | 
						|
	"jest-junit": "9.0.0", | 
						|
	"jest-snapshot-serializer-ansi": "1.0.0", | 
						|
	"jest-snapshot-serializer-raw": "1.1.0", | 
						|
	"jest-watch-typeahead": "0.4.0", | 
						|
	mkdirp: "0.5.1", | 
						|
	prettier: "1.19.0", | 
						|
	prettylint: "1.0.0", | 
						|
	rimraf: "3.0.0", | 
						|
	rollup: "1.26.3", | 
						|
	"rollup-plugin-babel": "4.3.3", | 
						|
	"rollup-plugin-commonjs": "10.1.0", | 
						|
	"rollup-plugin-json": "4.0.0", | 
						|
	"rollup-plugin-node-globals": "1.4.0", | 
						|
	"rollup-plugin-node-resolve": "5.2.0", | 
						|
	"rollup-plugin-terser": "5.1.2", | 
						|
	shelljs: "0.8.3", | 
						|
	"snapshot-diff": "0.4.0", | 
						|
	"strip-ansi": "5.2.0", | 
						|
	"synchronous-promise": "2.0.10", | 
						|
	tempy: "0.2.1", | 
						|
	"terser-webpack-plugin": "2.2.1", | 
						|
	webpack: "4.41.2" | 
						|
}; | 
						|
var scripts = { | 
						|
	prepublishOnly: "echo \"Error: must publish from dist/\" && exit 1", | 
						|
	"prepare-release": "yarn && yarn build && yarn test:dist", | 
						|
	test: "jest", | 
						|
	"test:dist": "node ./scripts/test-dist.js", | 
						|
	"test-integration": "jest tests_integration", | 
						|
	"perf-repeat": "yarn && yarn build && cross-env NODE_ENV=production node ./dist/bin-prettier.js --debug-repeat ${PERF_REPEAT:-1000} --loglevel debug ${PERF_FILE:-./index.js} > /dev/null", | 
						|
	"perf-repeat-inspect": "yarn && yarn build && cross-env NODE_ENV=production node --inspect-brk ./dist/bin-prettier.js --debug-repeat ${PERF_REPEAT:-1000} --loglevel debug ${PERF_FILE:-./index.js} > /dev/null", | 
						|
	"perf-benchmark": "yarn && yarn build && cross-env NODE_ENV=production node ./dist/bin-prettier.js --debug-benchmark --loglevel debug ${PERF_FILE:-./index.js} > /dev/null", | 
						|
	"check-types": "tsc", | 
						|
	lint: "cross-env EFF_NO_LINK_RULES=true eslint . --format friendly", | 
						|
	"lint-docs": "prettylint {.,docs,website,website/blog}/*.md", | 
						|
	"lint-dist": "eslint --no-eslintrc --no-ignore --env=browser \"dist/!(bin-prettier|index|third-party).js\"", | 
						|
	build: "node --max-old-space-size=3072 ./scripts/build/build.js", | 
						|
	"build-docs": "node ./scripts/build-docs.js", | 
						|
	"check-deps": "node ./scripts/check-deps.js", | 
						|
	spellcheck: "npx -p cspell@4.0.31 cspell {bin,scripts,src}/**/*.js {docs,website/blog,changelog_unreleased}/**/*.md" | 
						|
}; | 
						|
var _package = { | 
						|
	name: name, | 
						|
	version: version, | 
						|
	description: description, | 
						|
	bin: bin, | 
						|
	repository: repository, | 
						|
	homepage: homepage, | 
						|
	author: author, | 
						|
	license: license, | 
						|
	main: main, | 
						|
	engines: engines, | 
						|
	dependencies: dependencies, | 
						|
	devDependencies: devDependencies, | 
						|
	scripts: scripts | 
						|
}; | 
						|
 | 
						|
var _package$1 = /*#__PURE__*/Object.freeze({ | 
						|
  __proto__: null, | 
						|
  name: name, | 
						|
  version: version, | 
						|
  description: description, | 
						|
  bin: bin, | 
						|
  repository: repository, | 
						|
  homepage: homepage, | 
						|
  author: author, | 
						|
  license: license, | 
						|
  main: main, | 
						|
  engines: engines, | 
						|
  dependencies: dependencies, | 
						|
  devDependencies: devDependencies, | 
						|
  scripts: scripts, | 
						|
  'default': _package | 
						|
}); | 
						|
 | 
						|
function Diff() {} | 
						|
 | 
						|
Diff.prototype = { | 
						|
  diff: function diff(oldString, newString) { | 
						|
    var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; | 
						|
    var callback = options.callback; | 
						|
 | 
						|
    if (typeof options === 'function') { | 
						|
      callback = options; | 
						|
      options = {}; | 
						|
    } | 
						|
 | 
						|
    this.options = options; | 
						|
    var self = this; | 
						|
 | 
						|
    function done(value) { | 
						|
      if (callback) { | 
						|
        setTimeout(function () { | 
						|
          callback(undefined, value); | 
						|
        }, 0); | 
						|
        return true; | 
						|
      } else { | 
						|
        return value; | 
						|
      } | 
						|
    } // Allow subclasses to massage the input prior to running | 
						|
 | 
						|
 | 
						|
    oldString = this.castInput(oldString); | 
						|
    newString = this.castInput(newString); | 
						|
    oldString = this.removeEmpty(this.tokenize(oldString)); | 
						|
    newString = this.removeEmpty(this.tokenize(newString)); | 
						|
    var newLen = newString.length, | 
						|
        oldLen = oldString.length; | 
						|
    var editLength = 1; | 
						|
    var maxEditLength = newLen + oldLen; | 
						|
    var bestPath = [{ | 
						|
      newPos: -1, | 
						|
      components: [] | 
						|
    }]; // Seed editLength = 0, i.e. the content starts with the same values | 
						|
 | 
						|
    var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); | 
						|
 | 
						|
    if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) { | 
						|
      // Identity per the equality and tokenizer | 
						|
      return done([{ | 
						|
        value: this.join(newString), | 
						|
        count: newString.length | 
						|
      }]); | 
						|
    } // Main worker method. checks all permutations of a given edit length for acceptance. | 
						|
 | 
						|
 | 
						|
    function execEditLength() { | 
						|
      for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) { | 
						|
        var basePath = void 0; | 
						|
 | 
						|
        var addPath = bestPath[diagonalPath - 1], | 
						|
            removePath = bestPath[diagonalPath + 1], | 
						|
            _oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; | 
						|
 | 
						|
        if (addPath) { | 
						|
          // No one else is going to attempt to use this value, clear it | 
						|
          bestPath[diagonalPath - 1] = undefined; | 
						|
        } | 
						|
 | 
						|
        var canAdd = addPath && addPath.newPos + 1 < newLen, | 
						|
            canRemove = removePath && 0 <= _oldPos && _oldPos < oldLen; | 
						|
 | 
						|
        if (!canAdd && !canRemove) { | 
						|
          // If this path is a terminal then prune | 
						|
          bestPath[diagonalPath] = undefined; | 
						|
          continue; | 
						|
        } // Select the diagonal that we want to branch from. We select the prior | 
						|
        // path whose position in the new string is the farthest from the origin | 
						|
        // and does not pass the bounds of the diff graph | 
						|
 | 
						|
 | 
						|
        if (!canAdd || canRemove && addPath.newPos < removePath.newPos) { | 
						|
          basePath = clonePath(removePath); | 
						|
          self.pushComponent(basePath.components, undefined, true); | 
						|
        } else { | 
						|
          basePath = addPath; // No need to clone, we've pulled it from the list | 
						|
 | 
						|
          basePath.newPos++; | 
						|
          self.pushComponent(basePath.components, true, undefined); | 
						|
        } | 
						|
 | 
						|
        _oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); // If we have hit the end of both strings, then we are done | 
						|
 | 
						|
        if (basePath.newPos + 1 >= newLen && _oldPos + 1 >= oldLen) { | 
						|
          return done(buildValues(self, basePath.components, newString, oldString, self.useLongestToken)); | 
						|
        } else { | 
						|
          // Otherwise track this path as a potential candidate and continue. | 
						|
          bestPath[diagonalPath] = basePath; | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      editLength++; | 
						|
    } // Performs the length of edit iteration. Is a bit fugly as this has to support the | 
						|
    // sync and async mode which is never fun. Loops over execEditLength until a value | 
						|
    // is produced. | 
						|
 | 
						|
 | 
						|
    if (callback) { | 
						|
      (function exec() { | 
						|
        setTimeout(function () { | 
						|
          // This should not happen, but we want to be safe. | 
						|
 | 
						|
          /* istanbul ignore next */ | 
						|
          if (editLength > maxEditLength) { | 
						|
            return callback(); | 
						|
          } | 
						|
 | 
						|
          if (!execEditLength()) { | 
						|
            exec(); | 
						|
          } | 
						|
        }, 0); | 
						|
      })(); | 
						|
    } else { | 
						|
      while (editLength <= maxEditLength) { | 
						|
        var ret = execEditLength(); | 
						|
 | 
						|
        if (ret) { | 
						|
          return ret; | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
  }, | 
						|
  pushComponent: function pushComponent(components, added, removed) { | 
						|
    var last = components[components.length - 1]; | 
						|
 | 
						|
    if (last && last.added === added && last.removed === removed) { | 
						|
      // We need to clone here as the component clone operation is just | 
						|
      // as shallow array clone | 
						|
      components[components.length - 1] = { | 
						|
        count: last.count + 1, | 
						|
        added: added, | 
						|
        removed: removed | 
						|
      }; | 
						|
    } else { | 
						|
      components.push({ | 
						|
        count: 1, | 
						|
        added: added, | 
						|
        removed: removed | 
						|
      }); | 
						|
    } | 
						|
  }, | 
						|
  extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath) { | 
						|
    var newLen = newString.length, | 
						|
        oldLen = oldString.length, | 
						|
        newPos = basePath.newPos, | 
						|
        oldPos = newPos - diagonalPath, | 
						|
        commonCount = 0; | 
						|
 | 
						|
    while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) { | 
						|
      newPos++; | 
						|
      oldPos++; | 
						|
      commonCount++; | 
						|
    } | 
						|
 | 
						|
    if (commonCount) { | 
						|
      basePath.components.push({ | 
						|
        count: commonCount | 
						|
      }); | 
						|
    } | 
						|
 | 
						|
    basePath.newPos = newPos; | 
						|
    return oldPos; | 
						|
  }, | 
						|
  equals: function equals(left, right) { | 
						|
    if (this.options.comparator) { | 
						|
      return this.options.comparator(left, right); | 
						|
    } else { | 
						|
      return left === right || this.options.ignoreCase && left.toLowerCase() === right.toLowerCase(); | 
						|
    } | 
						|
  }, | 
						|
  removeEmpty: function removeEmpty(array) { | 
						|
    var ret = []; | 
						|
 | 
						|
    for (var i = 0; i < array.length; i++) { | 
						|
      if (array[i]) { | 
						|
        ret.push(array[i]); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return ret; | 
						|
  }, | 
						|
  castInput: function castInput(value) { | 
						|
    return value; | 
						|
  }, | 
						|
  tokenize: function tokenize(value) { | 
						|
    return value.split(''); | 
						|
  }, | 
						|
  join: function join(chars) { | 
						|
    return chars.join(''); | 
						|
  } | 
						|
}; | 
						|
 | 
						|
function buildValues(diff, components, newString, oldString, useLongestToken) { | 
						|
  var componentPos = 0, | 
						|
      componentLen = components.length, | 
						|
      newPos = 0, | 
						|
      oldPos = 0; | 
						|
 | 
						|
  for (; componentPos < componentLen; componentPos++) { | 
						|
    var component = components[componentPos]; | 
						|
 | 
						|
    if (!component.removed) { | 
						|
      if (!component.added && useLongestToken) { | 
						|
        var value = newString.slice(newPos, newPos + component.count); | 
						|
        value = value.map(function (value, i) { | 
						|
          var oldValue = oldString[oldPos + i]; | 
						|
          return oldValue.length > value.length ? oldValue : value; | 
						|
        }); | 
						|
        component.value = diff.join(value); | 
						|
      } else { | 
						|
        component.value = diff.join(newString.slice(newPos, newPos + component.count)); | 
						|
      } | 
						|
 | 
						|
      newPos += component.count; // Common case | 
						|
 | 
						|
      if (!component.added) { | 
						|
        oldPos += component.count; | 
						|
      } | 
						|
    } else { | 
						|
      component.value = diff.join(oldString.slice(oldPos, oldPos + component.count)); | 
						|
      oldPos += component.count; // Reverse add and remove so removes are output first to match common convention | 
						|
      // The diffing algorithm is tied to add then remove output and this is the simplest | 
						|
      // route to get the desired output with minimal overhead. | 
						|
 | 
						|
      if (componentPos && components[componentPos - 1].added) { | 
						|
        var tmp = components[componentPos - 1]; | 
						|
        components[componentPos - 1] = components[componentPos]; | 
						|
        components[componentPos] = tmp; | 
						|
      } | 
						|
    } | 
						|
  } // Special case handle for when one terminal is ignored (i.e. whitespace). | 
						|
  // For this case we merge the terminal into the prior string and drop the change. | 
						|
  // This is only available for string mode. | 
						|
 | 
						|
 | 
						|
  var lastComponent = components[componentLen - 1]; | 
						|
 | 
						|
  if (componentLen > 1 && typeof lastComponent.value === 'string' && (lastComponent.added || lastComponent.removed) && diff.equals('', lastComponent.value)) { | 
						|
    components[componentLen - 2].value += lastComponent.value; | 
						|
    components.pop(); | 
						|
  } | 
						|
 | 
						|
  return components; | 
						|
} | 
						|
 | 
						|
function clonePath(path) { | 
						|
  return { | 
						|
    newPos: path.newPos, | 
						|
    components: path.components.slice(0) | 
						|
  }; | 
						|
} | 
						|
 | 
						|
var characterDiff = new Diff(); | 
						|
 | 
						|
function diffChars(oldStr, newStr, options) { | 
						|
  return characterDiff.diff(oldStr, newStr, options); | 
						|
} | 
						|
 | 
						|
function generateOptions(options, defaults) { | 
						|
  if (typeof options === 'function') { | 
						|
    defaults.callback = options; | 
						|
  } else if (options) { | 
						|
    for (var name in options) { | 
						|
      /* istanbul ignore else */ | 
						|
      if (options.hasOwnProperty(name)) { | 
						|
        defaults[name] = options[name]; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return defaults; | 
						|
} // | 
						|
// Ranges and exceptions: | 
						|
// Latin-1 Supplement, 0080–00FF | 
						|
//  - U+00D7  × Multiplication sign | 
						|
//  - U+00F7  ÷ Division sign | 
						|
// Latin Extended-A, 0100–017F | 
						|
// Latin Extended-B, 0180–024F | 
						|
// IPA Extensions, 0250–02AF | 
						|
// Spacing Modifier Letters, 02B0–02FF | 
						|
//  - U+02C7  ˇ ˇ  Caron | 
						|
//  - U+02D8  ˘ ˘  Breve | 
						|
//  - U+02D9  ˙ ˙  Dot Above | 
						|
//  - U+02DA  ˚ ˚  Ring Above | 
						|
//  - U+02DB  ˛ ˛  Ogonek | 
						|
//  - U+02DC  ˜ ˜  Small Tilde | 
						|
//  - U+02DD  ˝ ˝  Double Acute Accent | 
						|
// Latin Extended Additional, 1E00–1EFF | 
						|
 | 
						|
 | 
						|
var extendedWordChars = /^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/; | 
						|
var reWhitespace = /\S/; | 
						|
var wordDiff = new Diff(); | 
						|
 | 
						|
wordDiff.equals = function (left, right) { | 
						|
  if (this.options.ignoreCase) { | 
						|
    left = left.toLowerCase(); | 
						|
    right = right.toLowerCase(); | 
						|
  } | 
						|
 | 
						|
  return left === right || this.options.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right); | 
						|
}; | 
						|
 | 
						|
wordDiff.tokenize = function (value) { | 
						|
  var tokens = value.split(/(\s+|[()[\]{}'"]|\b)/); // Join the boundary splits that we do not consider to be boundaries. This is primarily the extended Latin character set. | 
						|
 | 
						|
  for (var i = 0; i < tokens.length - 1; i++) { | 
						|
    // If we have an empty string in the next field and we have only word chars before and after, merge | 
						|
    if (!tokens[i + 1] && tokens[i + 2] && extendedWordChars.test(tokens[i]) && extendedWordChars.test(tokens[i + 2])) { | 
						|
      tokens[i] += tokens[i + 2]; | 
						|
      tokens.splice(i + 1, 2); | 
						|
      i--; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return tokens; | 
						|
}; | 
						|
 | 
						|
function diffWords(oldStr, newStr, options) { | 
						|
  options = generateOptions(options, { | 
						|
    ignoreWhitespace: true | 
						|
  }); | 
						|
  return wordDiff.diff(oldStr, newStr, options); | 
						|
} | 
						|
 | 
						|
function diffWordsWithSpace(oldStr, newStr, options) { | 
						|
  return wordDiff.diff(oldStr, newStr, options); | 
						|
} | 
						|
 | 
						|
var lineDiff = new Diff(); | 
						|
 | 
						|
lineDiff.tokenize = function (value) { | 
						|
  var retLines = [], | 
						|
      linesAndNewlines = value.split(/(\n|\r\n)/); // Ignore the final empty token that occurs if the string ends with a new line | 
						|
 | 
						|
  if (!linesAndNewlines[linesAndNewlines.length - 1]) { | 
						|
    linesAndNewlines.pop(); | 
						|
  } // Merge the content and line separators into single tokens | 
						|
 | 
						|
 | 
						|
  for (var i = 0; i < linesAndNewlines.length; i++) { | 
						|
    var line = linesAndNewlines[i]; | 
						|
 | 
						|
    if (i % 2 && !this.options.newlineIsToken) { | 
						|
      retLines[retLines.length - 1] += line; | 
						|
    } else { | 
						|
      if (this.options.ignoreWhitespace) { | 
						|
        line = line.trim(); | 
						|
      } | 
						|
 | 
						|
      retLines.push(line); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return retLines; | 
						|
}; | 
						|
 | 
						|
function diffLines(oldStr, newStr, callback) { | 
						|
  return lineDiff.diff(oldStr, newStr, callback); | 
						|
} | 
						|
 | 
						|
function diffTrimmedLines(oldStr, newStr, callback) { | 
						|
  var options = generateOptions(callback, { | 
						|
    ignoreWhitespace: true | 
						|
  }); | 
						|
  return lineDiff.diff(oldStr, newStr, options); | 
						|
} | 
						|
 | 
						|
var sentenceDiff = new Diff(); | 
						|
 | 
						|
sentenceDiff.tokenize = function (value) { | 
						|
  return value.split(/(\S.+?[.!?])(?=\s+|$)/); | 
						|
}; | 
						|
 | 
						|
function diffSentences(oldStr, newStr, callback) { | 
						|
  return sentenceDiff.diff(oldStr, newStr, callback); | 
						|
} | 
						|
 | 
						|
var cssDiff = new Diff(); | 
						|
 | 
						|
cssDiff.tokenize = function (value) { | 
						|
  return value.split(/([{}:;,]|\s+)/); | 
						|
}; | 
						|
 | 
						|
function diffCss(oldStr, newStr, callback) { | 
						|
  return cssDiff.diff(oldStr, newStr, callback); | 
						|
} | 
						|
 | 
						|
function _typeof(obj) { | 
						|
  if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { | 
						|
    _typeof = function _typeof(obj) { | 
						|
      return typeof obj; | 
						|
    }; | 
						|
  } else { | 
						|
    _typeof = function _typeof(obj) { | 
						|
      return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  return _typeof(obj); | 
						|
} | 
						|
 | 
						|
function _toConsumableArray(arr) { | 
						|
  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); | 
						|
} | 
						|
 | 
						|
function _arrayWithoutHoles(arr) { | 
						|
  if (Array.isArray(arr)) { | 
						|
    for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { | 
						|
      arr2[i] = arr[i]; | 
						|
    } | 
						|
 | 
						|
    return arr2; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function _iterableToArray(iter) { | 
						|
  if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); | 
						|
} | 
						|
 | 
						|
function _nonIterableSpread() { | 
						|
  throw new TypeError("Invalid attempt to spread non-iterable instance"); | 
						|
} | 
						|
 | 
						|
var objectPrototypeToString = Object.prototype.toString; | 
						|
var jsonDiff = new Diff(); // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a | 
						|
// dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output: | 
						|
 | 
						|
jsonDiff.useLongestToken = true; | 
						|
jsonDiff.tokenize = lineDiff.tokenize; | 
						|
 | 
						|
jsonDiff.castInput = function (value) { | 
						|
  var _this$options = this.options, | 
						|
      undefinedReplacement = _this$options.undefinedReplacement, | 
						|
      _this$options$stringi = _this$options.stringifyReplacer, | 
						|
      stringifyReplacer = _this$options$stringi === void 0 ? function (k, v) { | 
						|
    return typeof v === 'undefined' ? undefinedReplacement : v; | 
						|
  } : _this$options$stringi; | 
						|
  return typeof value === 'string' ? value : JSON.stringify(canonicalize(value, null, null, stringifyReplacer), stringifyReplacer, '  '); | 
						|
}; | 
						|
 | 
						|
jsonDiff.equals = function (left, right) { | 
						|
  return Diff.prototype.equals.call(jsonDiff, left.replace(/,([\r\n])/g, '$1'), right.replace(/,([\r\n])/g, '$1')); | 
						|
}; | 
						|
 | 
						|
function diffJson(oldObj, newObj, options) { | 
						|
  return jsonDiff.diff(oldObj, newObj, options); | 
						|
} // This function handles the presence of circular references by bailing out when encountering an | 
						|
// object that is already on the "stack" of items being processed. Accepts an optional replacer | 
						|
 | 
						|
 | 
						|
function canonicalize(obj, stack, replacementStack, replacer, key) { | 
						|
  stack = stack || []; | 
						|
  replacementStack = replacementStack || []; | 
						|
 | 
						|
  if (replacer) { | 
						|
    obj = replacer(key, obj); | 
						|
  } | 
						|
 | 
						|
  var i; | 
						|
 | 
						|
  for (i = 0; i < stack.length; i += 1) { | 
						|
    if (stack[i] === obj) { | 
						|
      return replacementStack[i]; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  var canonicalizedObj; | 
						|
 | 
						|
  if ('[object Array]' === objectPrototypeToString.call(obj)) { | 
						|
    stack.push(obj); | 
						|
    canonicalizedObj = new Array(obj.length); | 
						|
    replacementStack.push(canonicalizedObj); | 
						|
 | 
						|
    for (i = 0; i < obj.length; i += 1) { | 
						|
      canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack, replacer, key); | 
						|
    } | 
						|
 | 
						|
    stack.pop(); | 
						|
    replacementStack.pop(); | 
						|
    return canonicalizedObj; | 
						|
  } | 
						|
 | 
						|
  if (obj && obj.toJSON) { | 
						|
    obj = obj.toJSON(); | 
						|
  } | 
						|
 | 
						|
  if (_typeof(obj) === 'object' && obj !== null) { | 
						|
    stack.push(obj); | 
						|
    canonicalizedObj = {}; | 
						|
    replacementStack.push(canonicalizedObj); | 
						|
 | 
						|
    var sortedKeys = [], | 
						|
        _key; | 
						|
 | 
						|
    for (_key in obj) { | 
						|
      /* istanbul ignore else */ | 
						|
      if (obj.hasOwnProperty(_key)) { | 
						|
        sortedKeys.push(_key); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    sortedKeys.sort(); | 
						|
 | 
						|
    for (i = 0; i < sortedKeys.length; i += 1) { | 
						|
      _key = sortedKeys[i]; | 
						|
      canonicalizedObj[_key] = canonicalize(obj[_key], stack, replacementStack, replacer, _key); | 
						|
    } | 
						|
 | 
						|
    stack.pop(); | 
						|
    replacementStack.pop(); | 
						|
  } else { | 
						|
    canonicalizedObj = obj; | 
						|
  } | 
						|
 | 
						|
  return canonicalizedObj; | 
						|
} | 
						|
 | 
						|
var arrayDiff = new Diff(); | 
						|
 | 
						|
arrayDiff.tokenize = function (value) { | 
						|
  return value.slice(); | 
						|
}; | 
						|
 | 
						|
arrayDiff.join = arrayDiff.removeEmpty = function (value) { | 
						|
  return value; | 
						|
}; | 
						|
 | 
						|
function diffArrays(oldArr, newArr, callback) { | 
						|
  return arrayDiff.diff(oldArr, newArr, callback); | 
						|
} | 
						|
 | 
						|
function parsePatch(uniDiff) { | 
						|
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; | 
						|
  var diffstr = uniDiff.split(/\r\n|[\n\v\f\r\x85]/), | 
						|
      delimiters = uniDiff.match(/\r\n|[\n\v\f\r\x85]/g) || [], | 
						|
      list = [], | 
						|
      i = 0; | 
						|
 | 
						|
  function parseIndex() { | 
						|
    var index = {}; | 
						|
    list.push(index); // Parse diff metadata | 
						|
 | 
						|
    while (i < diffstr.length) { | 
						|
      var line = diffstr[i]; // File header found, end parsing diff metadata | 
						|
 | 
						|
      if (/^(\-\-\-|\+\+\+|@@)\s/.test(line)) { | 
						|
        break; | 
						|
      } // Diff index | 
						|
 | 
						|
 | 
						|
      var header = /^(?:Index:|diff(?: -r \w+)+)\s+(.+?)\s*$/.exec(line); | 
						|
 | 
						|
      if (header) { | 
						|
        index.index = header[1]; | 
						|
      } | 
						|
 | 
						|
      i++; | 
						|
    } // Parse file headers if they are defined. Unified diff requires them, but | 
						|
    // there's no technical issues to have an isolated hunk without file header | 
						|
 | 
						|
 | 
						|
    parseFileHeader(index); | 
						|
    parseFileHeader(index); // Parse hunks | 
						|
 | 
						|
    index.hunks = []; | 
						|
 | 
						|
    while (i < diffstr.length) { | 
						|
      var _line = diffstr[i]; | 
						|
 | 
						|
      if (/^(Index:|diff|\-\-\-|\+\+\+)\s/.test(_line)) { | 
						|
        break; | 
						|
      } else if (/^@@/.test(_line)) { | 
						|
        index.hunks.push(parseHunk()); | 
						|
      } else if (_line && options.strict) { | 
						|
        // Ignore unexpected content unless in strict mode | 
						|
        throw new Error('Unknown line ' + (i + 1) + ' ' + JSON.stringify(_line)); | 
						|
      } else { | 
						|
        i++; | 
						|
      } | 
						|
    } | 
						|
  } // Parses the --- and +++ headers, if none are found, no lines | 
						|
  // are consumed. | 
						|
 | 
						|
 | 
						|
  function parseFileHeader(index) { | 
						|
    var fileHeader = /^(---|\+\+\+)\s+(.*)$/.exec(diffstr[i]); | 
						|
 | 
						|
    if (fileHeader) { | 
						|
      var keyPrefix = fileHeader[1] === '---' ? 'old' : 'new'; | 
						|
      var data = fileHeader[2].split('\t', 2); | 
						|
      var fileName = data[0].replace(/\\\\/g, '\\'); | 
						|
 | 
						|
      if (/^".*"$/.test(fileName)) { | 
						|
        fileName = fileName.substr(1, fileName.length - 2); | 
						|
      } | 
						|
 | 
						|
      index[keyPrefix + 'FileName'] = fileName; | 
						|
      index[keyPrefix + 'Header'] = (data[1] || '').trim(); | 
						|
      i++; | 
						|
    } | 
						|
  } // Parses a hunk | 
						|
  // This assumes that we are at the start of a hunk. | 
						|
 | 
						|
 | 
						|
  function parseHunk() { | 
						|
    var chunkHeaderIndex = i, | 
						|
        chunkHeaderLine = diffstr[i++], | 
						|
        chunkHeader = chunkHeaderLine.split(/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/); | 
						|
    var hunk = { | 
						|
      oldStart: +chunkHeader[1], | 
						|
      oldLines: +chunkHeader[2] || 1, | 
						|
      newStart: +chunkHeader[3], | 
						|
      newLines: +chunkHeader[4] || 1, | 
						|
      lines: [], | 
						|
      linedelimiters: [] | 
						|
    }; | 
						|
    var addCount = 0, | 
						|
        removeCount = 0; | 
						|
 | 
						|
    for (; i < diffstr.length; i++) { | 
						|
      // Lines starting with '---' could be mistaken for the "remove line" operation | 
						|
      // But they could be the header for the next file. Therefore prune such cases out. | 
						|
      if (diffstr[i].indexOf('--- ') === 0 && i + 2 < diffstr.length && diffstr[i + 1].indexOf('+++ ') === 0 && diffstr[i + 2].indexOf('@@') === 0) { | 
						|
        break; | 
						|
      } | 
						|
 | 
						|
      var operation = diffstr[i].length == 0 && i != diffstr.length - 1 ? ' ' : diffstr[i][0]; | 
						|
 | 
						|
      if (operation === '+' || operation === '-' || operation === ' ' || operation === '\\') { | 
						|
        hunk.lines.push(diffstr[i]); | 
						|
        hunk.linedelimiters.push(delimiters[i] || '\n'); | 
						|
 | 
						|
        if (operation === '+') { | 
						|
          addCount++; | 
						|
        } else if (operation === '-') { | 
						|
          removeCount++; | 
						|
        } else if (operation === ' ') { | 
						|
          addCount++; | 
						|
          removeCount++; | 
						|
        } | 
						|
      } else { | 
						|
        break; | 
						|
      } | 
						|
    } // Handle the empty block count case | 
						|
 | 
						|
 | 
						|
    if (!addCount && hunk.newLines === 1) { | 
						|
      hunk.newLines = 0; | 
						|
    } | 
						|
 | 
						|
    if (!removeCount && hunk.oldLines === 1) { | 
						|
      hunk.oldLines = 0; | 
						|
    } // Perform optional sanity checking | 
						|
 | 
						|
 | 
						|
    if (options.strict) { | 
						|
      if (addCount !== hunk.newLines) { | 
						|
        throw new Error('Added line count did not match for hunk at line ' + (chunkHeaderIndex + 1)); | 
						|
      } | 
						|
 | 
						|
      if (removeCount !== hunk.oldLines) { | 
						|
        throw new Error('Removed line count did not match for hunk at line ' + (chunkHeaderIndex + 1)); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return hunk; | 
						|
  } | 
						|
 | 
						|
  while (i < diffstr.length) { | 
						|
    parseIndex(); | 
						|
  } | 
						|
 | 
						|
  return list; | 
						|
} // Iterator that traverses in the range of [min, max], stepping | 
						|
// by distance from a given start position. I.e. for [0, 4], with | 
						|
// start of 2, this will iterate 2, 3, 1, 4, 0. | 
						|
 | 
						|
 | 
						|
function distanceIterator(start, minLine, maxLine) { | 
						|
  var wantForward = true, | 
						|
      backwardExhausted = false, | 
						|
      forwardExhausted = false, | 
						|
      localOffset = 1; | 
						|
  return function iterator() { | 
						|
    if (wantForward && !forwardExhausted) { | 
						|
      if (backwardExhausted) { | 
						|
        localOffset++; | 
						|
      } else { | 
						|
        wantForward = false; | 
						|
      } // Check if trying to fit beyond text length, and if not, check it fits | 
						|
      // after offset location (or desired location on first iteration) | 
						|
 | 
						|
 | 
						|
      if (start + localOffset <= maxLine) { | 
						|
        return localOffset; | 
						|
      } | 
						|
 | 
						|
      forwardExhausted = true; | 
						|
    } | 
						|
 | 
						|
    if (!backwardExhausted) { | 
						|
      if (!forwardExhausted) { | 
						|
        wantForward = true; | 
						|
      } // Check if trying to fit before text beginning, and if not, check it fits | 
						|
      // before offset location | 
						|
 | 
						|
 | 
						|
      if (minLine <= start - localOffset) { | 
						|
        return -localOffset++; | 
						|
      } | 
						|
 | 
						|
      backwardExhausted = true; | 
						|
      return iterator(); | 
						|
    } // We tried to fit hunk before text beginning and beyond text length, then | 
						|
    // hunk can't fit on the text. Return undefined | 
						|
 | 
						|
  }; | 
						|
} | 
						|
 | 
						|
function applyPatch(source, uniDiff) { | 
						|
  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; | 
						|
 | 
						|
  if (typeof uniDiff === 'string') { | 
						|
    uniDiff = parsePatch(uniDiff); | 
						|
  } | 
						|
 | 
						|
  if (Array.isArray(uniDiff)) { | 
						|
    if (uniDiff.length > 1) { | 
						|
      throw new Error('applyPatch only works with a single input.'); | 
						|
    } | 
						|
 | 
						|
    uniDiff = uniDiff[0]; | 
						|
  } // Apply the diff to the input | 
						|
 | 
						|
 | 
						|
  var lines = source.split(/\r\n|[\n\v\f\r\x85]/), | 
						|
      delimiters = source.match(/\r\n|[\n\v\f\r\x85]/g) || [], | 
						|
      hunks = uniDiff.hunks, | 
						|
      compareLine = options.compareLine || function (lineNumber, line, operation, patchContent) { | 
						|
    return line === patchContent; | 
						|
  }, | 
						|
      errorCount = 0, | 
						|
      fuzzFactor = options.fuzzFactor || 0, | 
						|
      minLine = 0, | 
						|
      offset = 0, | 
						|
      removeEOFNL, | 
						|
      addEOFNL; | 
						|
  /** | 
						|
   * Checks if the hunk exactly fits on the provided location | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function hunkFits(hunk, toPos) { | 
						|
    for (var j = 0; j < hunk.lines.length; j++) { | 
						|
      var line = hunk.lines[j], | 
						|
          operation = line.length > 0 ? line[0] : ' ', | 
						|
          content = line.length > 0 ? line.substr(1) : line; | 
						|
 | 
						|
      if (operation === ' ' || operation === '-') { | 
						|
        // Context sanity check | 
						|
        if (!compareLine(toPos + 1, lines[toPos], operation, content)) { | 
						|
          errorCount++; | 
						|
 | 
						|
          if (errorCount > fuzzFactor) { | 
						|
            return false; | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        toPos++; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return true; | 
						|
  } // Search best fit offsets for each hunk based on the previous ones | 
						|
 | 
						|
 | 
						|
  for (var i = 0; i < hunks.length; i++) { | 
						|
    var hunk = hunks[i], | 
						|
        maxLine = lines.length - hunk.oldLines, | 
						|
        localOffset = 0, | 
						|
        toPos = offset + hunk.oldStart - 1; | 
						|
    var iterator = distanceIterator(toPos, minLine, maxLine); | 
						|
 | 
						|
    for (; localOffset !== undefined; localOffset = iterator()) { | 
						|
      if (hunkFits(hunk, toPos + localOffset)) { | 
						|
        hunk.offset = offset += localOffset; | 
						|
        break; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    if (localOffset === undefined) { | 
						|
      return false; | 
						|
    } // Set lower text limit to end of the current hunk, so next ones don't try | 
						|
    // to fit over already patched text | 
						|
 | 
						|
 | 
						|
    minLine = hunk.offset + hunk.oldStart + hunk.oldLines; | 
						|
  } // Apply patch hunks | 
						|
 | 
						|
 | 
						|
  var diffOffset = 0; | 
						|
 | 
						|
  for (var _i = 0; _i < hunks.length; _i++) { | 
						|
    var _hunk = hunks[_i], | 
						|
        _toPos = _hunk.oldStart + _hunk.offset + diffOffset - 1; | 
						|
 | 
						|
    diffOffset += _hunk.newLines - _hunk.oldLines; | 
						|
 | 
						|
    if (_toPos < 0) { | 
						|
      // Creating a new file | 
						|
      _toPos = 0; | 
						|
    } | 
						|
 | 
						|
    for (var j = 0; j < _hunk.lines.length; j++) { | 
						|
      var line = _hunk.lines[j], | 
						|
          operation = line.length > 0 ? line[0] : ' ', | 
						|
          content = line.length > 0 ? line.substr(1) : line, | 
						|
          delimiter = _hunk.linedelimiters[j]; | 
						|
 | 
						|
      if (operation === ' ') { | 
						|
        _toPos++; | 
						|
      } else if (operation === '-') { | 
						|
        lines.splice(_toPos, 1); | 
						|
        delimiters.splice(_toPos, 1); | 
						|
        /* istanbul ignore else */ | 
						|
      } else if (operation === '+') { | 
						|
        lines.splice(_toPos, 0, content); | 
						|
        delimiters.splice(_toPos, 0, delimiter); | 
						|
        _toPos++; | 
						|
      } else if (operation === '\\') { | 
						|
        var previousOperation = _hunk.lines[j - 1] ? _hunk.lines[j - 1][0] : null; | 
						|
 | 
						|
        if (previousOperation === '+') { | 
						|
          removeEOFNL = true; | 
						|
        } else if (previousOperation === '-') { | 
						|
          addEOFNL = true; | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
  } // Handle EOFNL insertion/removal | 
						|
 | 
						|
 | 
						|
  if (removeEOFNL) { | 
						|
    while (!lines[lines.length - 1]) { | 
						|
      lines.pop(); | 
						|
      delimiters.pop(); | 
						|
    } | 
						|
  } else if (addEOFNL) { | 
						|
    lines.push(''); | 
						|
    delimiters.push('\n'); | 
						|
  } | 
						|
 | 
						|
  for (var _k = 0; _k < lines.length - 1; _k++) { | 
						|
    lines[_k] = lines[_k] + delimiters[_k]; | 
						|
  } | 
						|
 | 
						|
  return lines.join(''); | 
						|
} // Wrapper that supports multiple file patches via callbacks. | 
						|
 | 
						|
 | 
						|
function applyPatches(uniDiff, options) { | 
						|
  if (typeof uniDiff === 'string') { | 
						|
    uniDiff = parsePatch(uniDiff); | 
						|
  } | 
						|
 | 
						|
  var currentIndex = 0; | 
						|
 | 
						|
  function processIndex() { | 
						|
    var index = uniDiff[currentIndex++]; | 
						|
 | 
						|
    if (!index) { | 
						|
      return options.complete(); | 
						|
    } | 
						|
 | 
						|
    options.loadFile(index, function (err, data) { | 
						|
      if (err) { | 
						|
        return options.complete(err); | 
						|
      } | 
						|
 | 
						|
      var updatedContent = applyPatch(data, index, options); | 
						|
      options.patched(index, updatedContent, function (err) { | 
						|
        if (err) { | 
						|
          return options.complete(err); | 
						|
        } | 
						|
 | 
						|
        processIndex(); | 
						|
      }); | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  processIndex(); | 
						|
} | 
						|
 | 
						|
function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) { | 
						|
  if (!options) { | 
						|
    options = {}; | 
						|
  } | 
						|
 | 
						|
  if (typeof options.context === 'undefined') { | 
						|
    options.context = 4; | 
						|
  } | 
						|
 | 
						|
  var diff = diffLines(oldStr, newStr, options); | 
						|
  diff.push({ | 
						|
    value: '', | 
						|
    lines: [] | 
						|
  }); // Append an empty value to make cleanup easier | 
						|
 | 
						|
  function contextLines(lines) { | 
						|
    return lines.map(function (entry) { | 
						|
      return ' ' + entry; | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  var hunks = []; | 
						|
  var oldRangeStart = 0, | 
						|
      newRangeStart = 0, | 
						|
      curRange = [], | 
						|
      oldLine = 1, | 
						|
      newLine = 1; | 
						|
 | 
						|
  var _loop = function _loop(i) { | 
						|
    var current = diff[i], | 
						|
        lines = current.lines || current.value.replace(/\n$/, '').split('\n'); | 
						|
    current.lines = lines; | 
						|
 | 
						|
    if (current.added || current.removed) { | 
						|
      var _curRange; // If we have previous context, start with that | 
						|
 | 
						|
 | 
						|
      if (!oldRangeStart) { | 
						|
        var prev = diff[i - 1]; | 
						|
        oldRangeStart = oldLine; | 
						|
        newRangeStart = newLine; | 
						|
 | 
						|
        if (prev) { | 
						|
          curRange = options.context > 0 ? contextLines(prev.lines.slice(-options.context)) : []; | 
						|
          oldRangeStart -= curRange.length; | 
						|
          newRangeStart -= curRange.length; | 
						|
        } | 
						|
      } // Output our changes | 
						|
 | 
						|
 | 
						|
      (_curRange = curRange).push.apply(_curRange, _toConsumableArray(lines.map(function (entry) { | 
						|
        return (current.added ? '+' : '-') + entry; | 
						|
      }))); // Track the updated file position | 
						|
 | 
						|
 | 
						|
      if (current.added) { | 
						|
        newLine += lines.length; | 
						|
      } else { | 
						|
        oldLine += lines.length; | 
						|
      } | 
						|
    } else { | 
						|
      // Identical context lines. Track line changes | 
						|
      if (oldRangeStart) { | 
						|
        // Close out any changes that have been output (or join overlapping) | 
						|
        if (lines.length <= options.context * 2 && i < diff.length - 2) { | 
						|
          var _curRange2; // Overlapping | 
						|
 | 
						|
 | 
						|
          (_curRange2 = curRange).push.apply(_curRange2, _toConsumableArray(contextLines(lines))); | 
						|
        } else { | 
						|
          var _curRange3; // end the range and output | 
						|
 | 
						|
 | 
						|
          var contextSize = Math.min(lines.length, options.context); | 
						|
 | 
						|
          (_curRange3 = curRange).push.apply(_curRange3, _toConsumableArray(contextLines(lines.slice(0, contextSize)))); | 
						|
 | 
						|
          var hunk = { | 
						|
            oldStart: oldRangeStart, | 
						|
            oldLines: oldLine - oldRangeStart + contextSize, | 
						|
            newStart: newRangeStart, | 
						|
            newLines: newLine - newRangeStart + contextSize, | 
						|
            lines: curRange | 
						|
          }; | 
						|
 | 
						|
          if (i >= diff.length - 2 && lines.length <= options.context) { | 
						|
            // EOF is inside this hunk | 
						|
            var oldEOFNewline = /\n$/.test(oldStr); | 
						|
            var newEOFNewline = /\n$/.test(newStr); | 
						|
            var noNlBeforeAdds = lines.length == 0 && curRange.length > hunk.oldLines; | 
						|
 | 
						|
            if (!oldEOFNewline && noNlBeforeAdds) { | 
						|
              // special case: old has no eol and no trailing context; no-nl can end up before adds | 
						|
              curRange.splice(hunk.oldLines, 0, '\\ No newline at end of file'); | 
						|
            } | 
						|
 | 
						|
            if (!oldEOFNewline && !noNlBeforeAdds || !newEOFNewline) { | 
						|
              curRange.push('\\ No newline at end of file'); | 
						|
            } | 
						|
          } | 
						|
 | 
						|
          hunks.push(hunk); | 
						|
          oldRangeStart = 0; | 
						|
          newRangeStart = 0; | 
						|
          curRange = []; | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      oldLine += lines.length; | 
						|
      newLine += lines.length; | 
						|
    } | 
						|
  }; | 
						|
 | 
						|
  for (var i = 0; i < diff.length; i++) { | 
						|
    _loop(i); | 
						|
  } | 
						|
 | 
						|
  return { | 
						|
    oldFileName: oldFileName, | 
						|
    newFileName: newFileName, | 
						|
    oldHeader: oldHeader, | 
						|
    newHeader: newHeader, | 
						|
    hunks: hunks | 
						|
  }; | 
						|
} | 
						|
 | 
						|
function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) { | 
						|
  var diff = structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options); | 
						|
  var ret = []; | 
						|
 | 
						|
  if (oldFileName == newFileName) { | 
						|
    ret.push('Index: ' + oldFileName); | 
						|
  } | 
						|
 | 
						|
  ret.push('==================================================================='); | 
						|
  ret.push('--- ' + diff.oldFileName + (typeof diff.oldHeader === 'undefined' ? '' : '\t' + diff.oldHeader)); | 
						|
  ret.push('+++ ' + diff.newFileName + (typeof diff.newHeader === 'undefined' ? '' : '\t' + diff.newHeader)); | 
						|
 | 
						|
  for (var i = 0; i < diff.hunks.length; i++) { | 
						|
    var hunk = diff.hunks[i]; | 
						|
    ret.push('@@ -' + hunk.oldStart + ',' + hunk.oldLines + ' +' + hunk.newStart + ',' + hunk.newLines + ' @@'); | 
						|
    ret.push.apply(ret, hunk.lines); | 
						|
  } | 
						|
 | 
						|
  return ret.join('\n') + '\n'; | 
						|
} | 
						|
 | 
						|
function createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) { | 
						|
  return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options); | 
						|
} | 
						|
 | 
						|
function arrayEqual(a, b) { | 
						|
  if (a.length !== b.length) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  return arrayStartsWith(a, b); | 
						|
} | 
						|
 | 
						|
function arrayStartsWith(array, start) { | 
						|
  if (start.length > array.length) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  for (var i = 0; i < start.length; i++) { | 
						|
    if (start[i] !== array[i]) { | 
						|
      return false; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return true; | 
						|
} | 
						|
 | 
						|
function calcLineCount(hunk) { | 
						|
  var _calcOldNewLineCount = calcOldNewLineCount(hunk.lines), | 
						|
      oldLines = _calcOldNewLineCount.oldLines, | 
						|
      newLines = _calcOldNewLineCount.newLines; | 
						|
 | 
						|
  if (oldLines !== undefined) { | 
						|
    hunk.oldLines = oldLines; | 
						|
  } else { | 
						|
    delete hunk.oldLines; | 
						|
  } | 
						|
 | 
						|
  if (newLines !== undefined) { | 
						|
    hunk.newLines = newLines; | 
						|
  } else { | 
						|
    delete hunk.newLines; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function merge(mine, theirs, base) { | 
						|
  mine = loadPatch(mine, base); | 
						|
  theirs = loadPatch(theirs, base); | 
						|
  var ret = {}; // For index we just let it pass through as it doesn't have any necessary meaning. | 
						|
  // Leaving sanity checks on this to the API consumer that may know more about the | 
						|
  // meaning in their own context. | 
						|
 | 
						|
  if (mine.index || theirs.index) { | 
						|
    ret.index = mine.index || theirs.index; | 
						|
  } | 
						|
 | 
						|
  if (mine.newFileName || theirs.newFileName) { | 
						|
    if (!fileNameChanged(mine)) { | 
						|
      // No header or no change in ours, use theirs (and ours if theirs does not exist) | 
						|
      ret.oldFileName = theirs.oldFileName || mine.oldFileName; | 
						|
      ret.newFileName = theirs.newFileName || mine.newFileName; | 
						|
      ret.oldHeader = theirs.oldHeader || mine.oldHeader; | 
						|
      ret.newHeader = theirs.newHeader || mine.newHeader; | 
						|
    } else if (!fileNameChanged(theirs)) { | 
						|
      // No header or no change in theirs, use ours | 
						|
      ret.oldFileName = mine.oldFileName; | 
						|
      ret.newFileName = mine.newFileName; | 
						|
      ret.oldHeader = mine.oldHeader; | 
						|
      ret.newHeader = mine.newHeader; | 
						|
    } else { | 
						|
      // Both changed... figure it out | 
						|
      ret.oldFileName = selectField(ret, mine.oldFileName, theirs.oldFileName); | 
						|
      ret.newFileName = selectField(ret, mine.newFileName, theirs.newFileName); | 
						|
      ret.oldHeader = selectField(ret, mine.oldHeader, theirs.oldHeader); | 
						|
      ret.newHeader = selectField(ret, mine.newHeader, theirs.newHeader); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  ret.hunks = []; | 
						|
  var mineIndex = 0, | 
						|
      theirsIndex = 0, | 
						|
      mineOffset = 0, | 
						|
      theirsOffset = 0; | 
						|
 | 
						|
  while (mineIndex < mine.hunks.length || theirsIndex < theirs.hunks.length) { | 
						|
    var mineCurrent = mine.hunks[mineIndex] || { | 
						|
      oldStart: Infinity | 
						|
    }, | 
						|
        theirsCurrent = theirs.hunks[theirsIndex] || { | 
						|
      oldStart: Infinity | 
						|
    }; | 
						|
 | 
						|
    if (hunkBefore(mineCurrent, theirsCurrent)) { | 
						|
      // This patch does not overlap with any of the others, yay. | 
						|
      ret.hunks.push(cloneHunk(mineCurrent, mineOffset)); | 
						|
      mineIndex++; | 
						|
      theirsOffset += mineCurrent.newLines - mineCurrent.oldLines; | 
						|
    } else if (hunkBefore(theirsCurrent, mineCurrent)) { | 
						|
      // This patch does not overlap with any of the others, yay. | 
						|
      ret.hunks.push(cloneHunk(theirsCurrent, theirsOffset)); | 
						|
      theirsIndex++; | 
						|
      mineOffset += theirsCurrent.newLines - theirsCurrent.oldLines; | 
						|
    } else { | 
						|
      // Overlap, merge as best we can | 
						|
      var mergedHunk = { | 
						|
        oldStart: Math.min(mineCurrent.oldStart, theirsCurrent.oldStart), | 
						|
        oldLines: 0, | 
						|
        newStart: Math.min(mineCurrent.newStart + mineOffset, theirsCurrent.oldStart + theirsOffset), | 
						|
        newLines: 0, | 
						|
        lines: [] | 
						|
      }; | 
						|
      mergeLines(mergedHunk, mineCurrent.oldStart, mineCurrent.lines, theirsCurrent.oldStart, theirsCurrent.lines); | 
						|
      theirsIndex++; | 
						|
      mineIndex++; | 
						|
      ret.hunks.push(mergedHunk); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return ret; | 
						|
} | 
						|
 | 
						|
function loadPatch(param, base) { | 
						|
  if (typeof param === 'string') { | 
						|
    if (/^@@/m.test(param) || /^Index:/m.test(param)) { | 
						|
      return parsePatch(param)[0]; | 
						|
    } | 
						|
 | 
						|
    if (!base) { | 
						|
      throw new Error('Must provide a base reference or pass in a patch'); | 
						|
    } | 
						|
 | 
						|
    return structuredPatch(undefined, undefined, base, param); | 
						|
  } | 
						|
 | 
						|
  return param; | 
						|
} | 
						|
 | 
						|
function fileNameChanged(patch) { | 
						|
  return patch.newFileName && patch.newFileName !== patch.oldFileName; | 
						|
} | 
						|
 | 
						|
function selectField(index, mine, theirs) { | 
						|
  if (mine === theirs) { | 
						|
    return mine; | 
						|
  } else { | 
						|
    index.conflict = true; | 
						|
    return { | 
						|
      mine: mine, | 
						|
      theirs: theirs | 
						|
    }; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function hunkBefore(test, check) { | 
						|
  return test.oldStart < check.oldStart && test.oldStart + test.oldLines < check.oldStart; | 
						|
} | 
						|
 | 
						|
function cloneHunk(hunk, offset) { | 
						|
  return { | 
						|
    oldStart: hunk.oldStart, | 
						|
    oldLines: hunk.oldLines, | 
						|
    newStart: hunk.newStart + offset, | 
						|
    newLines: hunk.newLines, | 
						|
    lines: hunk.lines | 
						|
  }; | 
						|
} | 
						|
 | 
						|
function mergeLines(hunk, mineOffset, mineLines, theirOffset, theirLines) { | 
						|
  // This will generally result in a conflicted hunk, but there are cases where the context | 
						|
  // is the only overlap where we can successfully merge the content here. | 
						|
  var mine = { | 
						|
    offset: mineOffset, | 
						|
    lines: mineLines, | 
						|
    index: 0 | 
						|
  }, | 
						|
      their = { | 
						|
    offset: theirOffset, | 
						|
    lines: theirLines, | 
						|
    index: 0 | 
						|
  }; // Handle any leading content | 
						|
 | 
						|
  insertLeading(hunk, mine, their); | 
						|
  insertLeading(hunk, their, mine); // Now in the overlap content. Scan through and select the best changes from each. | 
						|
 | 
						|
  while (mine.index < mine.lines.length && their.index < their.lines.length) { | 
						|
    var mineCurrent = mine.lines[mine.index], | 
						|
        theirCurrent = their.lines[their.index]; | 
						|
 | 
						|
    if ((mineCurrent[0] === '-' || mineCurrent[0] === '+') && (theirCurrent[0] === '-' || theirCurrent[0] === '+')) { | 
						|
      // Both modified ... | 
						|
      mutualChange(hunk, mine, their); | 
						|
    } else if (mineCurrent[0] === '+' && theirCurrent[0] === ' ') { | 
						|
      var _hunk$lines; // Mine inserted | 
						|
 | 
						|
 | 
						|
      (_hunk$lines = hunk.lines).push.apply(_hunk$lines, _toConsumableArray(collectChange(mine))); | 
						|
    } else if (theirCurrent[0] === '+' && mineCurrent[0] === ' ') { | 
						|
      var _hunk$lines2; // Theirs inserted | 
						|
 | 
						|
 | 
						|
      (_hunk$lines2 = hunk.lines).push.apply(_hunk$lines2, _toConsumableArray(collectChange(their))); | 
						|
    } else if (mineCurrent[0] === '-' && theirCurrent[0] === ' ') { | 
						|
      // Mine removed or edited | 
						|
      removal(hunk, mine, their); | 
						|
    } else if (theirCurrent[0] === '-' && mineCurrent[0] === ' ') { | 
						|
      // Their removed or edited | 
						|
      removal(hunk, their, mine, true); | 
						|
    } else if (mineCurrent === theirCurrent) { | 
						|
      // Context identity | 
						|
      hunk.lines.push(mineCurrent); | 
						|
      mine.index++; | 
						|
      their.index++; | 
						|
    } else { | 
						|
      // Context mismatch | 
						|
      conflict(hunk, collectChange(mine), collectChange(their)); | 
						|
    } | 
						|
  } // Now push anything that may be remaining | 
						|
 | 
						|
 | 
						|
  insertTrailing(hunk, mine); | 
						|
  insertTrailing(hunk, their); | 
						|
  calcLineCount(hunk); | 
						|
} | 
						|
 | 
						|
function mutualChange(hunk, mine, their) { | 
						|
  var myChanges = collectChange(mine), | 
						|
      theirChanges = collectChange(their); | 
						|
 | 
						|
  if (allRemoves(myChanges) && allRemoves(theirChanges)) { | 
						|
    // Special case for remove changes that are supersets of one another | 
						|
    if (arrayStartsWith(myChanges, theirChanges) && skipRemoveSuperset(their, myChanges, myChanges.length - theirChanges.length)) { | 
						|
      var _hunk$lines3; | 
						|
 | 
						|
      (_hunk$lines3 = hunk.lines).push.apply(_hunk$lines3, _toConsumableArray(myChanges)); | 
						|
 | 
						|
      return; | 
						|
    } else if (arrayStartsWith(theirChanges, myChanges) && skipRemoveSuperset(mine, theirChanges, theirChanges.length - myChanges.length)) { | 
						|
      var _hunk$lines4; | 
						|
 | 
						|
      (_hunk$lines4 = hunk.lines).push.apply(_hunk$lines4, _toConsumableArray(theirChanges)); | 
						|
 | 
						|
      return; | 
						|
    } | 
						|
  } else if (arrayEqual(myChanges, theirChanges)) { | 
						|
    var _hunk$lines5; | 
						|
 | 
						|
    (_hunk$lines5 = hunk.lines).push.apply(_hunk$lines5, _toConsumableArray(myChanges)); | 
						|
 | 
						|
    return; | 
						|
  } | 
						|
 | 
						|
  conflict(hunk, myChanges, theirChanges); | 
						|
} | 
						|
 | 
						|
function removal(hunk, mine, their, swap) { | 
						|
  var myChanges = collectChange(mine), | 
						|
      theirChanges = collectContext(their, myChanges); | 
						|
 | 
						|
  if (theirChanges.merged) { | 
						|
    var _hunk$lines6; | 
						|
 | 
						|
    (_hunk$lines6 = hunk.lines).push.apply(_hunk$lines6, _toConsumableArray(theirChanges.merged)); | 
						|
  } else { | 
						|
    conflict(hunk, swap ? theirChanges : myChanges, swap ? myChanges : theirChanges); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function conflict(hunk, mine, their) { | 
						|
  hunk.conflict = true; | 
						|
  hunk.lines.push({ | 
						|
    conflict: true, | 
						|
    mine: mine, | 
						|
    theirs: their | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function insertLeading(hunk, insert, their) { | 
						|
  while (insert.offset < their.offset && insert.index < insert.lines.length) { | 
						|
    var line = insert.lines[insert.index++]; | 
						|
    hunk.lines.push(line); | 
						|
    insert.offset++; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function insertTrailing(hunk, insert) { | 
						|
  while (insert.index < insert.lines.length) { | 
						|
    var line = insert.lines[insert.index++]; | 
						|
    hunk.lines.push(line); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function collectChange(state) { | 
						|
  var ret = [], | 
						|
      operation = state.lines[state.index][0]; | 
						|
 | 
						|
  while (state.index < state.lines.length) { | 
						|
    var line = state.lines[state.index]; // Group additions that are immediately after subtractions and treat them as one "atomic" modify change. | 
						|
 | 
						|
    if (operation === '-' && line[0] === '+') { | 
						|
      operation = '+'; | 
						|
    } | 
						|
 | 
						|
    if (operation === line[0]) { | 
						|
      ret.push(line); | 
						|
      state.index++; | 
						|
    } else { | 
						|
      break; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return ret; | 
						|
} | 
						|
 | 
						|
function collectContext(state, matchChanges) { | 
						|
  var changes = [], | 
						|
      merged = [], | 
						|
      matchIndex = 0, | 
						|
      contextChanges = false, | 
						|
      conflicted = false; | 
						|
 | 
						|
  while (matchIndex < matchChanges.length && state.index < state.lines.length) { | 
						|
    var change = state.lines[state.index], | 
						|
        match = matchChanges[matchIndex]; // Once we've hit our add, then we are done | 
						|
 | 
						|
    if (match[0] === '+') { | 
						|
      break; | 
						|
    } | 
						|
 | 
						|
    contextChanges = contextChanges || change[0] !== ' '; | 
						|
    merged.push(match); | 
						|
    matchIndex++; // Consume any additions in the other block as a conflict to attempt | 
						|
    // to pull in the remaining context after this | 
						|
 | 
						|
    if (change[0] === '+') { | 
						|
      conflicted = true; | 
						|
 | 
						|
      while (change[0] === '+') { | 
						|
        changes.push(change); | 
						|
        change = state.lines[++state.index]; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    if (match.substr(1) === change.substr(1)) { | 
						|
      changes.push(change); | 
						|
      state.index++; | 
						|
    } else { | 
						|
      conflicted = true; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  if ((matchChanges[matchIndex] || '')[0] === '+' && contextChanges) { | 
						|
    conflicted = true; | 
						|
  } | 
						|
 | 
						|
  if (conflicted) { | 
						|
    return changes; | 
						|
  } | 
						|
 | 
						|
  while (matchIndex < matchChanges.length) { | 
						|
    merged.push(matchChanges[matchIndex++]); | 
						|
  } | 
						|
 | 
						|
  return { | 
						|
    merged: merged, | 
						|
    changes: changes | 
						|
  }; | 
						|
} | 
						|
 | 
						|
function allRemoves(changes) { | 
						|
  return changes.reduce(function (prev, change) { | 
						|
    return prev && change[0] === '-'; | 
						|
  }, true); | 
						|
} | 
						|
 | 
						|
function skipRemoveSuperset(state, removeChanges, delta) { | 
						|
  for (var i = 0; i < delta; i++) { | 
						|
    var changeContent = removeChanges[removeChanges.length - delta + i].substr(1); | 
						|
 | 
						|
    if (state.lines[state.index + i] !== ' ' + changeContent) { | 
						|
      return false; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  state.index += delta; | 
						|
  return true; | 
						|
} | 
						|
 | 
						|
function calcOldNewLineCount(lines) { | 
						|
  var oldLines = 0; | 
						|
  var newLines = 0; | 
						|
  lines.forEach(function (line) { | 
						|
    if (typeof line !== 'string') { | 
						|
      var myCount = calcOldNewLineCount(line.mine); | 
						|
      var theirCount = calcOldNewLineCount(line.theirs); | 
						|
 | 
						|
      if (oldLines !== undefined) { | 
						|
        if (myCount.oldLines === theirCount.oldLines) { | 
						|
          oldLines += myCount.oldLines; | 
						|
        } else { | 
						|
          oldLines = undefined; | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      if (newLines !== undefined) { | 
						|
        if (myCount.newLines === theirCount.newLines) { | 
						|
          newLines += myCount.newLines; | 
						|
        } else { | 
						|
          newLines = undefined; | 
						|
        } | 
						|
      } | 
						|
    } else { | 
						|
      if (newLines !== undefined && (line[0] === '+' || line[0] === ' ')) { | 
						|
        newLines++; | 
						|
      } | 
						|
 | 
						|
      if (oldLines !== undefined && (line[0] === '-' || line[0] === ' ')) { | 
						|
        oldLines++; | 
						|
      } | 
						|
    } | 
						|
  }); | 
						|
  return { | 
						|
    oldLines: oldLines, | 
						|
    newLines: newLines | 
						|
  }; | 
						|
} // See: http://code.google.com/p/google-diff-match-patch/wiki/API | 
						|
 | 
						|
 | 
						|
function convertChangesToDMP(changes) { | 
						|
  var ret = [], | 
						|
      change, | 
						|
      operation; | 
						|
 | 
						|
  for (var i = 0; i < changes.length; i++) { | 
						|
    change = changes[i]; | 
						|
 | 
						|
    if (change.added) { | 
						|
      operation = 1; | 
						|
    } else if (change.removed) { | 
						|
      operation = -1; | 
						|
    } else { | 
						|
      operation = 0; | 
						|
    } | 
						|
 | 
						|
    ret.push([operation, change.value]); | 
						|
  } | 
						|
 | 
						|
  return ret; | 
						|
} | 
						|
 | 
						|
function convertChangesToXML(changes) { | 
						|
  var ret = []; | 
						|
 | 
						|
  for (var i = 0; i < changes.length; i++) { | 
						|
    var change = changes[i]; | 
						|
 | 
						|
    if (change.added) { | 
						|
      ret.push('<ins>'); | 
						|
    } else if (change.removed) { | 
						|
      ret.push('<del>'); | 
						|
    } | 
						|
 | 
						|
    ret.push(escapeHTML(change.value)); | 
						|
 | 
						|
    if (change.added) { | 
						|
      ret.push('</ins>'); | 
						|
    } else if (change.removed) { | 
						|
      ret.push('</del>'); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return ret.join(''); | 
						|
} | 
						|
 | 
						|
function escapeHTML(s) { | 
						|
  var n = s; | 
						|
  n = n.replace(/&/g, '&'); | 
						|
  n = n.replace(/</g, '<'); | 
						|
  n = n.replace(/>/g, '>'); | 
						|
  n = n.replace(/"/g, '"'); | 
						|
  return n; | 
						|
} | 
						|
 | 
						|
var index_es6 = /*#__PURE__*/Object.freeze({ | 
						|
  __proto__: null, | 
						|
  Diff: Diff, | 
						|
  diffChars: diffChars, | 
						|
  diffWords: diffWords, | 
						|
  diffWordsWithSpace: diffWordsWithSpace, | 
						|
  diffLines: diffLines, | 
						|
  diffTrimmedLines: diffTrimmedLines, | 
						|
  diffSentences: diffSentences, | 
						|
  diffCss: diffCss, | 
						|
  diffJson: diffJson, | 
						|
  diffArrays: diffArrays, | 
						|
  structuredPatch: structuredPatch, | 
						|
  createTwoFilesPatch: createTwoFilesPatch, | 
						|
  createPatch: createPatch, | 
						|
  applyPatch: applyPatch, | 
						|
  applyPatches: applyPatches, | 
						|
  parsePatch: parsePatch, | 
						|
  merge: merge, | 
						|
  convertChangesToDMP: convertChangesToDMP, | 
						|
  convertChangesToXML: convertChangesToXML, | 
						|
  canonicalize: canonicalize | 
						|
}); | 
						|
 | 
						|
/*! | 
						|
 * normalize-path <https://github.com/jonschlinkert/normalize-path> | 
						|
 * | 
						|
 * Copyright (c) 2014-2018, Jon Schlinkert. | 
						|
 * Released under the MIT License. | 
						|
 */ | 
						|
var normalizePath = function normalizePath(path, stripTrailing) { | 
						|
  if (typeof path !== 'string') { | 
						|
    throw new TypeError('expected path to be a string'); | 
						|
  } | 
						|
 | 
						|
  if (path === '\\' || path === '/') return '/'; | 
						|
  var len = path.length; | 
						|
  if (len <= 1) return path; // ensure that win32 namespaces has two leading slashes, so that the path is | 
						|
  // handled properly by the win32 version of path.parse() after being normalized | 
						|
  // https://msdn.microsoft.com/library/windows/desktop/aa365247(v=vs.85).aspx#namespaces | 
						|
 | 
						|
  var prefix = ''; | 
						|
 | 
						|
  if (len > 4 && path[3] === '\\') { | 
						|
    var ch = path[2]; | 
						|
 | 
						|
    if ((ch === '?' || ch === '.') && path.slice(0, 2) === '\\\\') { | 
						|
      path = path.slice(2); | 
						|
      prefix = '//'; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  var segs = path.split(/[/\\]+/); | 
						|
 | 
						|
  if (stripTrailing !== false && segs[segs.length - 1] === '') { | 
						|
    segs.pop(); | 
						|
  } | 
						|
 | 
						|
  return prefix + segs.join('/'); | 
						|
}; | 
						|
 | 
						|
function _classCallCheck(instance, Constructor) { | 
						|
  if (!(instance instanceof Constructor)) { | 
						|
    throw new TypeError("Cannot call a class as a function"); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function _defineProperties(target, props) { | 
						|
  for (var i = 0; i < props.length; i++) { | 
						|
    var descriptor = props[i]; | 
						|
    descriptor.enumerable = descriptor.enumerable || false; | 
						|
    descriptor.configurable = true; | 
						|
    if ("value" in descriptor) descriptor.writable = true; | 
						|
    Object.defineProperty(target, descriptor.key, descriptor); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function _createClass(Constructor, protoProps, staticProps) { | 
						|
  if (protoProps) _defineProperties(Constructor.prototype, protoProps); | 
						|
  if (staticProps) _defineProperties(Constructor, staticProps); | 
						|
  return Constructor; | 
						|
} | 
						|
 | 
						|
function _inherits(subClass, superClass) { | 
						|
  if (typeof superClass !== "function" && superClass !== null) { | 
						|
    throw new TypeError("Super expression must either be null or a function"); | 
						|
  } | 
						|
 | 
						|
  subClass.prototype = Object.create(superClass && superClass.prototype, { | 
						|
    constructor: { | 
						|
      value: subClass, | 
						|
      writable: true, | 
						|
      configurable: true | 
						|
    } | 
						|
  }); | 
						|
  if (superClass) _setPrototypeOf(subClass, superClass); | 
						|
} | 
						|
 | 
						|
function _getPrototypeOf(o) { | 
						|
  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { | 
						|
    return o.__proto__ || Object.getPrototypeOf(o); | 
						|
  }; | 
						|
  return _getPrototypeOf(o); | 
						|
} | 
						|
 | 
						|
function _setPrototypeOf(o, p) { | 
						|
  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { | 
						|
    o.__proto__ = p; | 
						|
    return o; | 
						|
  }; | 
						|
 | 
						|
  return _setPrototypeOf(o, p); | 
						|
} | 
						|
 | 
						|
function isNativeReflectConstruct() { | 
						|
  if (typeof Reflect === "undefined" || !Reflect.construct) return false; | 
						|
  if (Reflect.construct.sham) return false; | 
						|
  if (typeof Proxy === "function") return true; | 
						|
 | 
						|
  try { | 
						|
    Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); | 
						|
    return true; | 
						|
  } catch (e) { | 
						|
    return false; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function _construct(Parent, args, Class) { | 
						|
  if (isNativeReflectConstruct()) { | 
						|
    _construct = Reflect.construct; | 
						|
  } else { | 
						|
    _construct = function _construct(Parent, args, Class) { | 
						|
      var a = [null]; | 
						|
      a.push.apply(a, args); | 
						|
      var Constructor = Function.bind.apply(Parent, a); | 
						|
      var instance = new Constructor(); | 
						|
      if (Class) _setPrototypeOf(instance, Class.prototype); | 
						|
      return instance; | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  return _construct.apply(null, arguments); | 
						|
} | 
						|
 | 
						|
function _isNativeFunction(fn) { | 
						|
  return Function.toString.call(fn).indexOf("[native code]") !== -1; | 
						|
} | 
						|
 | 
						|
function _wrapNativeSuper(Class) { | 
						|
  var _cache = typeof Map === "function" ? new Map() : undefined; | 
						|
 | 
						|
  _wrapNativeSuper = function _wrapNativeSuper(Class) { | 
						|
    if (Class === null || !_isNativeFunction(Class)) return Class; | 
						|
 | 
						|
    if (typeof Class !== "function") { | 
						|
      throw new TypeError("Super expression must either be null or a function"); | 
						|
    } | 
						|
 | 
						|
    if (typeof _cache !== "undefined") { | 
						|
      if (_cache.has(Class)) return _cache.get(Class); | 
						|
 | 
						|
      _cache.set(Class, Wrapper); | 
						|
    } | 
						|
 | 
						|
    function Wrapper() { | 
						|
      return _construct(Class, arguments, _getPrototypeOf(this).constructor); | 
						|
    } | 
						|
 | 
						|
    Wrapper.prototype = Object.create(Class.prototype, { | 
						|
      constructor: { | 
						|
        value: Wrapper, | 
						|
        enumerable: false, | 
						|
        writable: true, | 
						|
        configurable: true | 
						|
      } | 
						|
    }); | 
						|
    return _setPrototypeOf(Wrapper, Class); | 
						|
  }; | 
						|
 | 
						|
  return _wrapNativeSuper(Class); | 
						|
} | 
						|
 | 
						|
function _assertThisInitialized(self) { | 
						|
  if (self === void 0) { | 
						|
    throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); | 
						|
  } | 
						|
 | 
						|
  return self; | 
						|
} | 
						|
 | 
						|
function _possibleConstructorReturn(self, call) { | 
						|
  if (call && (typeof call === "object" || typeof call === "function")) { | 
						|
    return call; | 
						|
  } | 
						|
 | 
						|
  return _assertThisInitialized(self); | 
						|
} | 
						|
 | 
						|
function _superPropBase(object, property) { | 
						|
  while (!Object.prototype.hasOwnProperty.call(object, property)) { | 
						|
    object = _getPrototypeOf(object); | 
						|
    if (object === null) break; | 
						|
  } | 
						|
 | 
						|
  return object; | 
						|
} | 
						|
 | 
						|
function _get(target, property, receiver) { | 
						|
  if (typeof Reflect !== "undefined" && Reflect.get) { | 
						|
    _get = Reflect.get; | 
						|
  } else { | 
						|
    _get = function _get(target, property, receiver) { | 
						|
      var base = _superPropBase(target, property); | 
						|
 | 
						|
      if (!base) return; | 
						|
      var desc = Object.getOwnPropertyDescriptor(base, property); | 
						|
 | 
						|
      if (desc.get) { | 
						|
        return desc.get.call(receiver); | 
						|
      } | 
						|
 | 
						|
      return desc.value; | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  return _get(target, property, receiver || target); | 
						|
} | 
						|
 | 
						|
function _slicedToArray(arr, i) { | 
						|
  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); | 
						|
} | 
						|
 | 
						|
function _toConsumableArray$1(arr) { | 
						|
  return _arrayWithoutHoles$1(arr) || _iterableToArray$1(arr) || _nonIterableSpread$1(); | 
						|
} | 
						|
 | 
						|
function _arrayWithoutHoles$1(arr) { | 
						|
  if (Array.isArray(arr)) { | 
						|
    for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; | 
						|
 | 
						|
    return arr2; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function _arrayWithHoles(arr) { | 
						|
  if (Array.isArray(arr)) return arr; | 
						|
} | 
						|
 | 
						|
function _iterableToArray$1(iter) { | 
						|
  if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); | 
						|
} | 
						|
 | 
						|
function _iterableToArrayLimit(arr, i) { | 
						|
  if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { | 
						|
    return; | 
						|
  } | 
						|
 | 
						|
  var _arr = []; | 
						|
  var _n = true; | 
						|
  var _d = false; | 
						|
  var _e = undefined; | 
						|
 | 
						|
  try { | 
						|
    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { | 
						|
      _arr.push(_s.value); | 
						|
 | 
						|
      if (i && _arr.length === i) break; | 
						|
    } | 
						|
  } catch (err) { | 
						|
    _d = true; | 
						|
    _e = err; | 
						|
  } finally { | 
						|
    try { | 
						|
      if (!_n && _i["return"] != null) _i["return"](); | 
						|
    } finally { | 
						|
      if (_d) throw _e; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return _arr; | 
						|
} | 
						|
 | 
						|
function _nonIterableSpread$1() { | 
						|
  throw new TypeError("Invalid attempt to spread non-iterable instance"); | 
						|
} | 
						|
 | 
						|
function _nonIterableRest() { | 
						|
  throw new TypeError("Invalid attempt to destructure non-iterable instance"); | 
						|
} | 
						|
 | 
						|
/** | 
						|
 * @class | 
						|
 */ | 
						|
 | 
						|
 | 
						|
var LineByLine = | 
						|
/*#__PURE__*/ | 
						|
function () { | 
						|
  function LineByLine(file, options) { | 
						|
    _classCallCheck(this, LineByLine); | 
						|
 | 
						|
    options = options || {}; | 
						|
    if (!options.readChunk) options.readChunk = 1024; | 
						|
 | 
						|
    if (!options.newLineCharacter) { | 
						|
      options.newLineCharacter = 0x0a; //linux line ending | 
						|
    } else { | 
						|
      options.newLineCharacter = options.newLineCharacter.charCodeAt(0); | 
						|
    } | 
						|
 | 
						|
    if (typeof file === 'number') { | 
						|
      this.fd = file; | 
						|
    } else { | 
						|
      this.fd = fs$1.openSync(file, 'r'); | 
						|
    } | 
						|
 | 
						|
    this.options = options; | 
						|
    this.newLineCharacter = options.newLineCharacter; | 
						|
    this.reset(); | 
						|
  } | 
						|
 | 
						|
  _createClass(LineByLine, [{ | 
						|
    key: "_searchInBuffer", | 
						|
    value: function _searchInBuffer(buffer, hexNeedle) { | 
						|
      var found = -1; | 
						|
 | 
						|
      for (var i = 0; i <= buffer.length; i++) { | 
						|
        var b_byte = buffer[i]; | 
						|
 | 
						|
        if (b_byte === hexNeedle) { | 
						|
          found = i; | 
						|
          break; | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      return found; | 
						|
    } | 
						|
  }, { | 
						|
    key: "reset", | 
						|
    value: function reset() { | 
						|
      this.eofReached = false; | 
						|
      this.linesCache = []; | 
						|
      this.fdPosition = 0; | 
						|
    } | 
						|
  }, { | 
						|
    key: "close", | 
						|
    value: function close() { | 
						|
      fs$1.closeSync(this.fd); | 
						|
      this.fd = null; | 
						|
    } | 
						|
  }, { | 
						|
    key: "_extractLines", | 
						|
    value: function _extractLines(buffer) { | 
						|
      var line; | 
						|
      var lines = []; | 
						|
      var bufferPosition = 0; | 
						|
      var lastNewLineBufferPosition = 0; | 
						|
 | 
						|
      while (true) { | 
						|
        var bufferPositionValue = buffer[bufferPosition++]; | 
						|
 | 
						|
        if (bufferPositionValue === this.newLineCharacter) { | 
						|
          line = buffer.slice(lastNewLineBufferPosition, bufferPosition); | 
						|
          lines.push(line); | 
						|
          lastNewLineBufferPosition = bufferPosition; | 
						|
        } else if (!bufferPositionValue) { | 
						|
          break; | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      var leftovers = buffer.slice(lastNewLineBufferPosition, bufferPosition); | 
						|
 | 
						|
      if (leftovers.length) { | 
						|
        lines.push(leftovers); | 
						|
      } | 
						|
 | 
						|
      return lines; | 
						|
    } | 
						|
  }, { | 
						|
    key: "_readChunk", | 
						|
    value: function _readChunk(lineLeftovers) { | 
						|
      var totalBytesRead = 0; | 
						|
      var bytesRead; | 
						|
      var buffers = []; | 
						|
 | 
						|
      do { | 
						|
        var readBuffer = new Buffer(this.options.readChunk); | 
						|
        bytesRead = fs$1.readSync(this.fd, readBuffer, 0, this.options.readChunk, this.fdPosition); | 
						|
        totalBytesRead = totalBytesRead + bytesRead; | 
						|
        this.fdPosition = this.fdPosition + bytesRead; | 
						|
        buffers.push(readBuffer); | 
						|
      } while (bytesRead && this._searchInBuffer(buffers[buffers.length - 1], this.options.newLineCharacter) === -1); | 
						|
 | 
						|
      var bufferData = Buffer.concat(buffers); | 
						|
 | 
						|
      if (bytesRead < this.options.readChunk) { | 
						|
        this.eofReached = true; | 
						|
        bufferData = bufferData.slice(0, totalBytesRead); | 
						|
      } | 
						|
 | 
						|
      if (totalBytesRead) { | 
						|
        this.linesCache = this._extractLines(bufferData); | 
						|
 | 
						|
        if (lineLeftovers) { | 
						|
          this.linesCache[0] = Buffer.concat([lineLeftovers, this.linesCache[0]]); | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      return totalBytesRead; | 
						|
    } | 
						|
  }, { | 
						|
    key: "next", | 
						|
    value: function next() { | 
						|
      if (!this.fd) return false; | 
						|
      var line = false; | 
						|
 | 
						|
      if (this.eofReached && this.linesCache.length === 0) { | 
						|
        return line; | 
						|
      } | 
						|
 | 
						|
      var bytesRead; | 
						|
 | 
						|
      if (!this.linesCache.length) { | 
						|
        bytesRead = this._readChunk(); | 
						|
      } | 
						|
 | 
						|
      if (this.linesCache.length) { | 
						|
        line = this.linesCache.shift(); | 
						|
        var lastLineCharacter = line[line.length - 1]; | 
						|
 | 
						|
        if (lastLineCharacter !== 0x0a) { | 
						|
          bytesRead = this._readChunk(line); | 
						|
 | 
						|
          if (bytesRead) { | 
						|
            line = this.linesCache.shift(); | 
						|
          } | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      if (this.eofReached && this.linesCache.length === 0) { | 
						|
        this.close(); | 
						|
      } | 
						|
 | 
						|
      if (line && line[line.length - 1] === this.newLineCharacter) { | 
						|
        line = line.slice(0, line.length - 1); | 
						|
      } | 
						|
 | 
						|
      return line; | 
						|
    } | 
						|
  }]); | 
						|
 | 
						|
  return LineByLine; | 
						|
}(); | 
						|
 | 
						|
var readlines = LineByLine; | 
						|
 | 
						|
var ConfigError = | 
						|
/*#__PURE__*/ | 
						|
function (_Error) { | 
						|
  _inherits(ConfigError, _Error); | 
						|
 | 
						|
  function ConfigError() { | 
						|
    _classCallCheck(this, ConfigError); | 
						|
 | 
						|
    return _possibleConstructorReturn(this, _getPrototypeOf(ConfigError).apply(this, arguments)); | 
						|
  } | 
						|
 | 
						|
  return ConfigError; | 
						|
}(_wrapNativeSuper(Error)); | 
						|
 | 
						|
var DebugError = | 
						|
/*#__PURE__*/ | 
						|
function (_Error2) { | 
						|
  _inherits(DebugError, _Error2); | 
						|
 | 
						|
  function DebugError() { | 
						|
    _classCallCheck(this, DebugError); | 
						|
 | 
						|
    return _possibleConstructorReturn(this, _getPrototypeOf(DebugError).apply(this, arguments)); | 
						|
  } | 
						|
 | 
						|
  return DebugError; | 
						|
}(_wrapNativeSuper(Error)); | 
						|
 | 
						|
var UndefinedParserError = | 
						|
/*#__PURE__*/ | 
						|
function (_Error3) { | 
						|
  _inherits(UndefinedParserError, _Error3); | 
						|
 | 
						|
  function UndefinedParserError() { | 
						|
    _classCallCheck(this, UndefinedParserError); | 
						|
 | 
						|
    return _possibleConstructorReturn(this, _getPrototypeOf(UndefinedParserError).apply(this, arguments)); | 
						|
  } | 
						|
 | 
						|
  return UndefinedParserError; | 
						|
}(_wrapNativeSuper(Error)); | 
						|
 | 
						|
var errors = { | 
						|
  ConfigError, | 
						|
  DebugError, | 
						|
  UndefinedParserError | 
						|
}; | 
						|
 | 
						|
function unwrapExports (x) { | 
						|
	return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; | 
						|
} | 
						|
 | 
						|
function createCommonjsModule(fn, module) { | 
						|
	return module = { exports: {} }, fn(module, module.exports), module.exports; | 
						|
} | 
						|
 | 
						|
function getCjsExportFromNamespace (n) { | 
						|
	return n && n['default'] || n; | 
						|
} | 
						|
 | 
						|
var semver = createCommonjsModule(function (module, exports) { | 
						|
  exports = module.exports = SemVer; | 
						|
  var debug; | 
						|
  /* istanbul ignore next */ | 
						|
 | 
						|
  if (typeof process === 'object' && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG)) { | 
						|
    debug = function debug() { | 
						|
      var args = Array.prototype.slice.call(arguments, 0); | 
						|
      args.unshift('SEMVER'); | 
						|
      console.log.apply(console, args); | 
						|
    }; | 
						|
  } else { | 
						|
    debug = function debug() {}; | 
						|
  } // Note: this is the semver.org version of the spec that it implements | 
						|
  // Not necessarily the package version of this code. | 
						|
 | 
						|
 | 
						|
  exports.SEMVER_SPEC_VERSION = '2.0.0'; | 
						|
  var MAX_LENGTH = 256; | 
						|
  var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || | 
						|
  /* istanbul ignore next */ | 
						|
  9007199254740991; // Max safe segment length for coercion. | 
						|
 | 
						|
  var MAX_SAFE_COMPONENT_LENGTH = 16; // The actual regexps go on exports.re | 
						|
 | 
						|
  var re = exports.re = []; | 
						|
  var src = exports.src = []; | 
						|
  var t = exports.tokens = {}; | 
						|
  var R = 0; | 
						|
 | 
						|
  function tok(n) { | 
						|
    t[n] = R++; | 
						|
  } // The following Regular Expressions can be used for tokenizing, | 
						|
  // validating, and parsing SemVer version strings. | 
						|
  // ## Numeric Identifier | 
						|
  // A single `0`, or a non-zero digit followed by zero or more digits. | 
						|
 | 
						|
 | 
						|
  tok('NUMERICIDENTIFIER'); | 
						|
  src[t.NUMERICIDENTIFIER] = '0|[1-9]\\d*'; | 
						|
  tok('NUMERICIDENTIFIERLOOSE'); | 
						|
  src[t.NUMERICIDENTIFIERLOOSE] = '[0-9]+'; // ## Non-numeric Identifier | 
						|
  // Zero or more digits, followed by a letter or hyphen, and then zero or | 
						|
  // more letters, digits, or hyphens. | 
						|
 | 
						|
  tok('NONNUMERICIDENTIFIER'); | 
						|
  src[t.NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'; // ## Main Version | 
						|
  // Three dot-separated numeric identifiers. | 
						|
 | 
						|
  tok('MAINVERSION'); | 
						|
  src[t.MAINVERSION] = '(' + src[t.NUMERICIDENTIFIER] + ')\\.' + '(' + src[t.NUMERICIDENTIFIER] + ')\\.' + '(' + src[t.NUMERICIDENTIFIER] + ')'; | 
						|
  tok('MAINVERSIONLOOSE'); | 
						|
  src[t.MAINVERSIONLOOSE] = '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')\\.' + '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')\\.' + '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')'; // ## Pre-release Version Identifier | 
						|
  // A numeric identifier, or a non-numeric identifier. | 
						|
 | 
						|
  tok('PRERELEASEIDENTIFIER'); | 
						|
  src[t.PRERELEASEIDENTIFIER] = '(?:' + src[t.NUMERICIDENTIFIER] + '|' + src[t.NONNUMERICIDENTIFIER] + ')'; | 
						|
  tok('PRERELEASEIDENTIFIERLOOSE'); | 
						|
  src[t.PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[t.NUMERICIDENTIFIERLOOSE] + '|' + src[t.NONNUMERICIDENTIFIER] + ')'; // ## Pre-release Version | 
						|
  // Hyphen, followed by one or more dot-separated pre-release version | 
						|
  // identifiers. | 
						|
 | 
						|
  tok('PRERELEASE'); | 
						|
  src[t.PRERELEASE] = '(?:-(' + src[t.PRERELEASEIDENTIFIER] + '(?:\\.' + src[t.PRERELEASEIDENTIFIER] + ')*))'; | 
						|
  tok('PRERELEASELOOSE'); | 
						|
  src[t.PRERELEASELOOSE] = '(?:-?(' + src[t.PRERELEASEIDENTIFIERLOOSE] + '(?:\\.' + src[t.PRERELEASEIDENTIFIERLOOSE] + ')*))'; // ## Build Metadata Identifier | 
						|
  // Any combination of digits, letters, or hyphens. | 
						|
 | 
						|
  tok('BUILDIDENTIFIER'); | 
						|
  src[t.BUILDIDENTIFIER] = '[0-9A-Za-z-]+'; // ## Build Metadata | 
						|
  // Plus sign, followed by one or more period-separated build metadata | 
						|
  // identifiers. | 
						|
 | 
						|
  tok('BUILD'); | 
						|
  src[t.BUILD] = '(?:\\+(' + src[t.BUILDIDENTIFIER] + '(?:\\.' + src[t.BUILDIDENTIFIER] + ')*))'; // ## Full Version String | 
						|
  // A main version, followed optionally by a pre-release version and | 
						|
  // build metadata. | 
						|
  // Note that the only major, minor, patch, and pre-release sections of | 
						|
  // the version string are capturing groups.  The build metadata is not a | 
						|
  // capturing group, because it should not ever be used in version | 
						|
  // comparison. | 
						|
 | 
						|
  tok('FULL'); | 
						|
  tok('FULLPLAIN'); | 
						|
  src[t.FULLPLAIN] = 'v?' + src[t.MAINVERSION] + src[t.PRERELEASE] + '?' + src[t.BUILD] + '?'; | 
						|
  src[t.FULL] = '^' + src[t.FULLPLAIN] + '$'; // like full, but allows v1.2.3 and =1.2.3, which people do sometimes. | 
						|
  // also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty | 
						|
  // common in the npm registry. | 
						|
 | 
						|
  tok('LOOSEPLAIN'); | 
						|
  src[t.LOOSEPLAIN] = '[v=\\s]*' + src[t.MAINVERSIONLOOSE] + src[t.PRERELEASELOOSE] + '?' + src[t.BUILD] + '?'; | 
						|
  tok('LOOSE'); | 
						|
  src[t.LOOSE] = '^' + src[t.LOOSEPLAIN] + '$'; | 
						|
  tok('GTLT'); | 
						|
  src[t.GTLT] = '((?:<|>)?=?)'; // Something like "2.*" or "1.2.x". | 
						|
  // Note that "x.x" is a valid xRange identifer, meaning "any version" | 
						|
  // Only the first item is strictly required. | 
						|
 | 
						|
  tok('XRANGEIDENTIFIERLOOSE'); | 
						|
  src[t.XRANGEIDENTIFIERLOOSE] = src[t.NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'; | 
						|
  tok('XRANGEIDENTIFIER'); | 
						|
  src[t.XRANGEIDENTIFIER] = src[t.NUMERICIDENTIFIER] + '|x|X|\\*'; | 
						|
  tok('XRANGEPLAIN'); | 
						|
  src[t.XRANGEPLAIN] = '[v=\\s]*(' + src[t.XRANGEIDENTIFIER] + ')' + '(?:\\.(' + src[t.XRANGEIDENTIFIER] + ')' + '(?:\\.(' + src[t.XRANGEIDENTIFIER] + ')' + '(?:' + src[t.PRERELEASE] + ')?' + src[t.BUILD] + '?' + ')?)?'; | 
						|
  tok('XRANGEPLAINLOOSE'); | 
						|
  src[t.XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' + '(?:\\.(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' + '(?:\\.(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' + '(?:' + src[t.PRERELEASELOOSE] + ')?' + src[t.BUILD] + '?' + ')?)?'; | 
						|
  tok('XRANGE'); | 
						|
  src[t.XRANGE] = '^' + src[t.GTLT] + '\\s*' + src[t.XRANGEPLAIN] + '$'; | 
						|
  tok('XRANGELOOSE'); | 
						|
  src[t.XRANGELOOSE] = '^' + src[t.GTLT] + '\\s*' + src[t.XRANGEPLAINLOOSE] + '$'; // Coercion. | 
						|
  // Extract anything that could conceivably be a part of a valid semver | 
						|
 | 
						|
  tok('COERCE'); | 
						|
  src[t.COERCE] = '(^|[^\\d])' + '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + '(?:$|[^\\d])'; | 
						|
  tok('COERCERTL'); | 
						|
  re[t.COERCERTL] = new RegExp(src[t.COERCE], 'g'); // Tilde ranges. | 
						|
  // Meaning is "reasonably at or greater than" | 
						|
 | 
						|
  tok('LONETILDE'); | 
						|
  src[t.LONETILDE] = '(?:~>?)'; | 
						|
  tok('TILDETRIM'); | 
						|
  src[t.TILDETRIM] = '(\\s*)' + src[t.LONETILDE] + '\\s+'; | 
						|
  re[t.TILDETRIM] = new RegExp(src[t.TILDETRIM], 'g'); | 
						|
  var tildeTrimReplace = '$1~'; | 
						|
  tok('TILDE'); | 
						|
  src[t.TILDE] = '^' + src[t.LONETILDE] + src[t.XRANGEPLAIN] + '$'; | 
						|
  tok('TILDELOOSE'); | 
						|
  src[t.TILDELOOSE] = '^' + src[t.LONETILDE] + src[t.XRANGEPLAINLOOSE] + '$'; // Caret ranges. | 
						|
  // Meaning is "at least and backwards compatible with" | 
						|
 | 
						|
  tok('LONECARET'); | 
						|
  src[t.LONECARET] = '(?:\\^)'; | 
						|
  tok('CARETTRIM'); | 
						|
  src[t.CARETTRIM] = '(\\s*)' + src[t.LONECARET] + '\\s+'; | 
						|
  re[t.CARETTRIM] = new RegExp(src[t.CARETTRIM], 'g'); | 
						|
  var caretTrimReplace = '$1^'; | 
						|
  tok('CARET'); | 
						|
  src[t.CARET] = '^' + src[t.LONECARET] + src[t.XRANGEPLAIN] + '$'; | 
						|
  tok('CARETLOOSE'); | 
						|
  src[t.CARETLOOSE] = '^' + src[t.LONECARET] + src[t.XRANGEPLAINLOOSE] + '$'; // A simple gt/lt/eq thing, or just "" to indicate "any version" | 
						|
 | 
						|
  tok('COMPARATORLOOSE'); | 
						|
  src[t.COMPARATORLOOSE] = '^' + src[t.GTLT] + '\\s*(' + src[t.LOOSEPLAIN] + ')$|^$'; | 
						|
  tok('COMPARATOR'); | 
						|
  src[t.COMPARATOR] = '^' + src[t.GTLT] + '\\s*(' + src[t.FULLPLAIN] + ')$|^$'; // An expression to strip any whitespace between the gtlt and the thing | 
						|
  // it modifies, so that `> 1.2.3` ==> `>1.2.3` | 
						|
 | 
						|
  tok('COMPARATORTRIM'); | 
						|
  src[t.COMPARATORTRIM] = '(\\s*)' + src[t.GTLT] + '\\s*(' + src[t.LOOSEPLAIN] + '|' + src[t.XRANGEPLAIN] + ')'; // this one has to use the /g flag | 
						|
 | 
						|
  re[t.COMPARATORTRIM] = new RegExp(src[t.COMPARATORTRIM], 'g'); | 
						|
  var comparatorTrimReplace = '$1$2$3'; // Something like `1.2.3 - 1.2.4` | 
						|
  // Note that these all use the loose form, because they'll be | 
						|
  // checked against either the strict or loose comparator form | 
						|
  // later. | 
						|
 | 
						|
  tok('HYPHENRANGE'); | 
						|
  src[t.HYPHENRANGE] = '^\\s*(' + src[t.XRANGEPLAIN] + ')' + '\\s+-\\s+' + '(' + src[t.XRANGEPLAIN] + ')' + '\\s*$'; | 
						|
  tok('HYPHENRANGELOOSE'); | 
						|
  src[t.HYPHENRANGELOOSE] = '^\\s*(' + src[t.XRANGEPLAINLOOSE] + ')' + '\\s+-\\s+' + '(' + src[t.XRANGEPLAINLOOSE] + ')' + '\\s*$'; // Star ranges basically just allow anything at all. | 
						|
 | 
						|
  tok('STAR'); | 
						|
  src[t.STAR] = '(<|>)?=?\\s*\\*'; // Compile to actual regexp objects. | 
						|
  // All are flag-free, unless they were created above with a flag. | 
						|
 | 
						|
  for (var i = 0; i < R; i++) { | 
						|
    debug(i, src[i]); | 
						|
 | 
						|
    if (!re[i]) { | 
						|
      re[i] = new RegExp(src[i]); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  exports.parse = parse; | 
						|
 | 
						|
  function parse(version, options) { | 
						|
    if (!options || typeof options !== 'object') { | 
						|
      options = { | 
						|
        loose: !!options, | 
						|
        includePrerelease: false | 
						|
      }; | 
						|
    } | 
						|
 | 
						|
    if (version instanceof SemVer) { | 
						|
      return version; | 
						|
    } | 
						|
 | 
						|
    if (typeof version !== 'string') { | 
						|
      return null; | 
						|
    } | 
						|
 | 
						|
    if (version.length > MAX_LENGTH) { | 
						|
      return null; | 
						|
    } | 
						|
 | 
						|
    var r = options.loose ? re[t.LOOSE] : re[t.FULL]; | 
						|
 | 
						|
    if (!r.test(version)) { | 
						|
      return null; | 
						|
    } | 
						|
 | 
						|
    try { | 
						|
      return new SemVer(version, options); | 
						|
    } catch (er) { | 
						|
      return null; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  exports.valid = valid; | 
						|
 | 
						|
  function valid(version, options) { | 
						|
    var v = parse(version, options); | 
						|
    return v ? v.version : null; | 
						|
  } | 
						|
 | 
						|
  exports.clean = clean; | 
						|
 | 
						|
  function clean(version, options) { | 
						|
    var s = parse(version.trim().replace(/^[=v]+/, ''), options); | 
						|
    return s ? s.version : null; | 
						|
  } | 
						|
 | 
						|
  exports.SemVer = SemVer; | 
						|
 | 
						|
  function SemVer(version, options) { | 
						|
    if (!options || typeof options !== 'object') { | 
						|
      options = { | 
						|
        loose: !!options, | 
						|
        includePrerelease: false | 
						|
      }; | 
						|
    } | 
						|
 | 
						|
    if (version instanceof SemVer) { | 
						|
      if (version.loose === options.loose) { | 
						|
        return version; | 
						|
      } else { | 
						|
        version = version.version; | 
						|
      } | 
						|
    } else if (typeof version !== 'string') { | 
						|
      throw new TypeError('Invalid Version: ' + version); | 
						|
    } | 
						|
 | 
						|
    if (version.length > MAX_LENGTH) { | 
						|
      throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters'); | 
						|
    } | 
						|
 | 
						|
    if (!(this instanceof SemVer)) { | 
						|
      return new SemVer(version, options); | 
						|
    } | 
						|
 | 
						|
    debug('SemVer', version, options); | 
						|
    this.options = options; | 
						|
    this.loose = !!options.loose; | 
						|
    var m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]); | 
						|
 | 
						|
    if (!m) { | 
						|
      throw new TypeError('Invalid Version: ' + version); | 
						|
    } | 
						|
 | 
						|
    this.raw = version; // these are actually numbers | 
						|
 | 
						|
    this.major = +m[1]; | 
						|
    this.minor = +m[2]; | 
						|
    this.patch = +m[3]; | 
						|
 | 
						|
    if (this.major > MAX_SAFE_INTEGER || this.major < 0) { | 
						|
      throw new TypeError('Invalid major version'); | 
						|
    } | 
						|
 | 
						|
    if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { | 
						|
      throw new TypeError('Invalid minor version'); | 
						|
    } | 
						|
 | 
						|
    if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { | 
						|
      throw new TypeError('Invalid patch version'); | 
						|
    } // numberify any prerelease numeric ids | 
						|
 | 
						|
 | 
						|
    if (!m[4]) { | 
						|
      this.prerelease = []; | 
						|
    } else { | 
						|
      this.prerelease = m[4].split('.').map(function (id) { | 
						|
        if (/^[0-9]+$/.test(id)) { | 
						|
          var num = +id; | 
						|
 | 
						|
          if (num >= 0 && num < MAX_SAFE_INTEGER) { | 
						|
            return num; | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        return id; | 
						|
      }); | 
						|
    } | 
						|
 | 
						|
    this.build = m[5] ? m[5].split('.') : []; | 
						|
    this.format(); | 
						|
  } | 
						|
 | 
						|
  SemVer.prototype.format = function () { | 
						|
    this.version = this.major + '.' + this.minor + '.' + this.patch; | 
						|
 | 
						|
    if (this.prerelease.length) { | 
						|
      this.version += '-' + this.prerelease.join('.'); | 
						|
    } | 
						|
 | 
						|
    return this.version; | 
						|
  }; | 
						|
 | 
						|
  SemVer.prototype.toString = function () { | 
						|
    return this.version; | 
						|
  }; | 
						|
 | 
						|
  SemVer.prototype.compare = function (other) { | 
						|
    debug('SemVer.compare', this.version, this.options, other); | 
						|
 | 
						|
    if (!(other instanceof SemVer)) { | 
						|
      other = new SemVer(other, this.options); | 
						|
    } | 
						|
 | 
						|
    return this.compareMain(other) || this.comparePre(other); | 
						|
  }; | 
						|
 | 
						|
  SemVer.prototype.compareMain = function (other) { | 
						|
    if (!(other instanceof SemVer)) { | 
						|
      other = new SemVer(other, this.options); | 
						|
    } | 
						|
 | 
						|
    return compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch); | 
						|
  }; | 
						|
 | 
						|
  SemVer.prototype.comparePre = function (other) { | 
						|
    if (!(other instanceof SemVer)) { | 
						|
      other = new SemVer(other, this.options); | 
						|
    } // NOT having a prerelease is > having one | 
						|
 | 
						|
 | 
						|
    if (this.prerelease.length && !other.prerelease.length) { | 
						|
      return -1; | 
						|
    } else if (!this.prerelease.length && other.prerelease.length) { | 
						|
      return 1; | 
						|
    } else if (!this.prerelease.length && !other.prerelease.length) { | 
						|
      return 0; | 
						|
    } | 
						|
 | 
						|
    var i = 0; | 
						|
 | 
						|
    do { | 
						|
      var a = this.prerelease[i]; | 
						|
      var b = other.prerelease[i]; | 
						|
      debug('prerelease compare', i, a, b); | 
						|
 | 
						|
      if (a === undefined && b === undefined) { | 
						|
        return 0; | 
						|
      } else if (b === undefined) { | 
						|
        return 1; | 
						|
      } else if (a === undefined) { | 
						|
        return -1; | 
						|
      } else if (a === b) { | 
						|
        continue; | 
						|
      } else { | 
						|
        return compareIdentifiers(a, b); | 
						|
      } | 
						|
    } while (++i); | 
						|
  }; | 
						|
 | 
						|
  SemVer.prototype.compareBuild = function (other) { | 
						|
    if (!(other instanceof SemVer)) { | 
						|
      other = new SemVer(other, this.options); | 
						|
    } | 
						|
 | 
						|
    var i = 0; | 
						|
 | 
						|
    do { | 
						|
      var a = this.build[i]; | 
						|
      var b = other.build[i]; | 
						|
      debug('prerelease compare', i, a, b); | 
						|
 | 
						|
      if (a === undefined && b === undefined) { | 
						|
        return 0; | 
						|
      } else if (b === undefined) { | 
						|
        return 1; | 
						|
      } else if (a === undefined) { | 
						|
        return -1; | 
						|
      } else if (a === b) { | 
						|
        continue; | 
						|
      } else { | 
						|
        return compareIdentifiers(a, b); | 
						|
      } | 
						|
    } while (++i); | 
						|
  }; // preminor will bump the version up to the next minor release, and immediately | 
						|
  // down to pre-release. premajor and prepatch work the same way. | 
						|
 | 
						|
 | 
						|
  SemVer.prototype.inc = function (release, identifier) { | 
						|
    switch (release) { | 
						|
      case 'premajor': | 
						|
        this.prerelease.length = 0; | 
						|
        this.patch = 0; | 
						|
        this.minor = 0; | 
						|
        this.major++; | 
						|
        this.inc('pre', identifier); | 
						|
        break; | 
						|
 | 
						|
      case 'preminor': | 
						|
        this.prerelease.length = 0; | 
						|
        this.patch = 0; | 
						|
        this.minor++; | 
						|
        this.inc('pre', identifier); | 
						|
        break; | 
						|
 | 
						|
      case 'prepatch': | 
						|
        // If this is already a prerelease, it will bump to the next version | 
						|
        // drop any prereleases that might already exist, since they are not | 
						|
        // relevant at this point. | 
						|
        this.prerelease.length = 0; | 
						|
        this.inc('patch', identifier); | 
						|
        this.inc('pre', identifier); | 
						|
        break; | 
						|
      // If the input is a non-prerelease version, this acts the same as | 
						|
      // prepatch. | 
						|
 | 
						|
      case 'prerelease': | 
						|
        if (this.prerelease.length === 0) { | 
						|
          this.inc('patch', identifier); | 
						|
        } | 
						|
 | 
						|
        this.inc('pre', identifier); | 
						|
        break; | 
						|
 | 
						|
      case 'major': | 
						|
        // If this is a pre-major version, bump up to the same major version. | 
						|
        // Otherwise increment major. | 
						|
        // 1.0.0-5 bumps to 1.0.0 | 
						|
        // 1.1.0 bumps to 2.0.0 | 
						|
        if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) { | 
						|
          this.major++; | 
						|
        } | 
						|
 | 
						|
        this.minor = 0; | 
						|
        this.patch = 0; | 
						|
        this.prerelease = []; | 
						|
        break; | 
						|
 | 
						|
      case 'minor': | 
						|
        // If this is a pre-minor version, bump up to the same minor version. | 
						|
        // Otherwise increment minor. | 
						|
        // 1.2.0-5 bumps to 1.2.0 | 
						|
        // 1.2.1 bumps to 1.3.0 | 
						|
        if (this.patch !== 0 || this.prerelease.length === 0) { | 
						|
          this.minor++; | 
						|
        } | 
						|
 | 
						|
        this.patch = 0; | 
						|
        this.prerelease = []; | 
						|
        break; | 
						|
 | 
						|
      case 'patch': | 
						|
        // If this is not a pre-release version, it will increment the patch. | 
						|
        // If it is a pre-release it will bump up to the same patch version. | 
						|
        // 1.2.0-5 patches to 1.2.0 | 
						|
        // 1.2.0 patches to 1.2.1 | 
						|
        if (this.prerelease.length === 0) { | 
						|
          this.patch++; | 
						|
        } | 
						|
 | 
						|
        this.prerelease = []; | 
						|
        break; | 
						|
      // This probably shouldn't be used publicly. | 
						|
      // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. | 
						|
 | 
						|
      case 'pre': | 
						|
        if (this.prerelease.length === 0) { | 
						|
          this.prerelease = [0]; | 
						|
        } else { | 
						|
          var i = this.prerelease.length; | 
						|
 | 
						|
          while (--i >= 0) { | 
						|
            if (typeof this.prerelease[i] === 'number') { | 
						|
              this.prerelease[i]++; | 
						|
              i = -2; | 
						|
            } | 
						|
          } | 
						|
 | 
						|
          if (i === -1) { | 
						|
            // didn't increment anything | 
						|
            this.prerelease.push(0); | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        if (identifier) { | 
						|
          // 1.2.0-beta.1 bumps to 1.2.0-beta.2, | 
						|
          // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 | 
						|
          if (this.prerelease[0] === identifier) { | 
						|
            if (isNaN(this.prerelease[1])) { | 
						|
              this.prerelease = [identifier, 0]; | 
						|
            } | 
						|
          } else { | 
						|
            this.prerelease = [identifier, 0]; | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        break; | 
						|
 | 
						|
      default: | 
						|
        throw new Error('invalid increment argument: ' + release); | 
						|
    } | 
						|
 | 
						|
    this.format(); | 
						|
    this.raw = this.version; | 
						|
    return this; | 
						|
  }; | 
						|
 | 
						|
  exports.inc = inc; | 
						|
 | 
						|
  function inc(version, release, loose, identifier) { | 
						|
    if (typeof loose === 'string') { | 
						|
      identifier = loose; | 
						|
      loose = undefined; | 
						|
    } | 
						|
 | 
						|
    try { | 
						|
      return new SemVer(version, loose).inc(release, identifier).version; | 
						|
    } catch (er) { | 
						|
      return null; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  exports.diff = diff; | 
						|
 | 
						|
  function diff(version1, version2) { | 
						|
    if (eq(version1, version2)) { | 
						|
      return null; | 
						|
    } else { | 
						|
      var v1 = parse(version1); | 
						|
      var v2 = parse(version2); | 
						|
      var prefix = ''; | 
						|
 | 
						|
      if (v1.prerelease.length || v2.prerelease.length) { | 
						|
        prefix = 'pre'; | 
						|
        var defaultResult = 'prerelease'; | 
						|
      } | 
						|
 | 
						|
      for (var key in v1) { | 
						|
        if (key === 'major' || key === 'minor' || key === 'patch') { | 
						|
          if (v1[key] !== v2[key]) { | 
						|
            return prefix + key; | 
						|
          } | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      return defaultResult; // may be undefined | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  exports.compareIdentifiers = compareIdentifiers; | 
						|
  var numeric = /^[0-9]+$/; | 
						|
 | 
						|
  function compareIdentifiers(a, b) { | 
						|
    var anum = numeric.test(a); | 
						|
    var bnum = numeric.test(b); | 
						|
 | 
						|
    if (anum && bnum) { | 
						|
      a = +a; | 
						|
      b = +b; | 
						|
    } | 
						|
 | 
						|
    return a === b ? 0 : anum && !bnum ? -1 : bnum && !anum ? 1 : a < b ? -1 : 1; | 
						|
  } | 
						|
 | 
						|
  exports.rcompareIdentifiers = rcompareIdentifiers; | 
						|
 | 
						|
  function rcompareIdentifiers(a, b) { | 
						|
    return compareIdentifiers(b, a); | 
						|
  } | 
						|
 | 
						|
  exports.major = major; | 
						|
 | 
						|
  function major(a, loose) { | 
						|
    return new SemVer(a, loose).major; | 
						|
  } | 
						|
 | 
						|
  exports.minor = minor; | 
						|
 | 
						|
  function minor(a, loose) { | 
						|
    return new SemVer(a, loose).minor; | 
						|
  } | 
						|
 | 
						|
  exports.patch = patch; | 
						|
 | 
						|
  function patch(a, loose) { | 
						|
    return new SemVer(a, loose).patch; | 
						|
  } | 
						|
 | 
						|
  exports.compare = compare; | 
						|
 | 
						|
  function compare(a, b, loose) { | 
						|
    return new SemVer(a, loose).compare(new SemVer(b, loose)); | 
						|
  } | 
						|
 | 
						|
  exports.compareLoose = compareLoose; | 
						|
 | 
						|
  function compareLoose(a, b) { | 
						|
    return compare(a, b, true); | 
						|
  } | 
						|
 | 
						|
  exports.compareBuild = compareBuild; | 
						|
 | 
						|
  function compareBuild(a, b, loose) { | 
						|
    var versionA = new SemVer(a, loose); | 
						|
    var versionB = new SemVer(b, loose); | 
						|
    return versionA.compare(versionB) || versionA.compareBuild(versionB); | 
						|
  } | 
						|
 | 
						|
  exports.rcompare = rcompare; | 
						|
 | 
						|
  function rcompare(a, b, loose) { | 
						|
    return compare(b, a, loose); | 
						|
  } | 
						|
 | 
						|
  exports.sort = sort; | 
						|
 | 
						|
  function sort(list, loose) { | 
						|
    return list.sort(function (a, b) { | 
						|
      return exports.compareBuild(a, b, loose); | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  exports.rsort = rsort; | 
						|
 | 
						|
  function rsort(list, loose) { | 
						|
    return list.sort(function (a, b) { | 
						|
      return exports.compareBuild(b, a, loose); | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  exports.gt = gt; | 
						|
 | 
						|
  function gt(a, b, loose) { | 
						|
    return compare(a, b, loose) > 0; | 
						|
  } | 
						|
 | 
						|
  exports.lt = lt; | 
						|
 | 
						|
  function lt(a, b, loose) { | 
						|
    return compare(a, b, loose) < 0; | 
						|
  } | 
						|
 | 
						|
  exports.eq = eq; | 
						|
 | 
						|
  function eq(a, b, loose) { | 
						|
    return compare(a, b, loose) === 0; | 
						|
  } | 
						|
 | 
						|
  exports.neq = neq; | 
						|
 | 
						|
  function neq(a, b, loose) { | 
						|
    return compare(a, b, loose) !== 0; | 
						|
  } | 
						|
 | 
						|
  exports.gte = gte; | 
						|
 | 
						|
  function gte(a, b, loose) { | 
						|
    return compare(a, b, loose) >= 0; | 
						|
  } | 
						|
 | 
						|
  exports.lte = lte; | 
						|
 | 
						|
  function lte(a, b, loose) { | 
						|
    return compare(a, b, loose) <= 0; | 
						|
  } | 
						|
 | 
						|
  exports.cmp = cmp; | 
						|
 | 
						|
  function cmp(a, op, b, loose) { | 
						|
    switch (op) { | 
						|
      case '===': | 
						|
        if (typeof a === 'object') a = a.version; | 
						|
        if (typeof b === 'object') b = b.version; | 
						|
        return a === b; | 
						|
 | 
						|
      case '!==': | 
						|
        if (typeof a === 'object') a = a.version; | 
						|
        if (typeof b === 'object') b = b.version; | 
						|
        return a !== b; | 
						|
 | 
						|
      case '': | 
						|
      case '=': | 
						|
      case '==': | 
						|
        return eq(a, b, loose); | 
						|
 | 
						|
      case '!=': | 
						|
        return neq(a, b, loose); | 
						|
 | 
						|
      case '>': | 
						|
        return gt(a, b, loose); | 
						|
 | 
						|
      case '>=': | 
						|
        return gte(a, b, loose); | 
						|
 | 
						|
      case '<': | 
						|
        return lt(a, b, loose); | 
						|
 | 
						|
      case '<=': | 
						|
        return lte(a, b, loose); | 
						|
 | 
						|
      default: | 
						|
        throw new TypeError('Invalid operator: ' + op); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  exports.Comparator = Comparator; | 
						|
 | 
						|
  function Comparator(comp, options) { | 
						|
    if (!options || typeof options !== 'object') { | 
						|
      options = { | 
						|
        loose: !!options, | 
						|
        includePrerelease: false | 
						|
      }; | 
						|
    } | 
						|
 | 
						|
    if (comp instanceof Comparator) { | 
						|
      if (comp.loose === !!options.loose) { | 
						|
        return comp; | 
						|
      } else { | 
						|
        comp = comp.value; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    if (!(this instanceof Comparator)) { | 
						|
      return new Comparator(comp, options); | 
						|
    } | 
						|
 | 
						|
    debug('comparator', comp, options); | 
						|
    this.options = options; | 
						|
    this.loose = !!options.loose; | 
						|
    this.parse(comp); | 
						|
 | 
						|
    if (this.semver === ANY) { | 
						|
      this.value = ''; | 
						|
    } else { | 
						|
      this.value = this.operator + this.semver.version; | 
						|
    } | 
						|
 | 
						|
    debug('comp', this); | 
						|
  } | 
						|
 | 
						|
  var ANY = {}; | 
						|
 | 
						|
  Comparator.prototype.parse = function (comp) { | 
						|
    var r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]; | 
						|
    var m = comp.match(r); | 
						|
 | 
						|
    if (!m) { | 
						|
      throw new TypeError('Invalid comparator: ' + comp); | 
						|
    } | 
						|
 | 
						|
    this.operator = m[1] !== undefined ? m[1] : ''; | 
						|
 | 
						|
    if (this.operator === '=') { | 
						|
      this.operator = ''; | 
						|
    } // if it literally is just '>' or '' then allow anything. | 
						|
 | 
						|
 | 
						|
    if (!m[2]) { | 
						|
      this.semver = ANY; | 
						|
    } else { | 
						|
      this.semver = new SemVer(m[2], this.options.loose); | 
						|
    } | 
						|
  }; | 
						|
 | 
						|
  Comparator.prototype.toString = function () { | 
						|
    return this.value; | 
						|
  }; | 
						|
 | 
						|
  Comparator.prototype.test = function (version) { | 
						|
    debug('Comparator.test', version, this.options.loose); | 
						|
 | 
						|
    if (this.semver === ANY || version === ANY) { | 
						|
      return true; | 
						|
    } | 
						|
 | 
						|
    if (typeof version === 'string') { | 
						|
      try { | 
						|
        version = new SemVer(version, this.options); | 
						|
      } catch (er) { | 
						|
        return false; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return cmp(version, this.operator, this.semver, this.options); | 
						|
  }; | 
						|
 | 
						|
  Comparator.prototype.intersects = function (comp, options) { | 
						|
    if (!(comp instanceof Comparator)) { | 
						|
      throw new TypeError('a Comparator is required'); | 
						|
    } | 
						|
 | 
						|
    if (!options || typeof options !== 'object') { | 
						|
      options = { | 
						|
        loose: !!options, | 
						|
        includePrerelease: false | 
						|
      }; | 
						|
    } | 
						|
 | 
						|
    var rangeTmp; | 
						|
 | 
						|
    if (this.operator === '') { | 
						|
      if (this.value === '') { | 
						|
        return true; | 
						|
      } | 
						|
 | 
						|
      rangeTmp = new Range(comp.value, options); | 
						|
      return satisfies(this.value, rangeTmp, options); | 
						|
    } else if (comp.operator === '') { | 
						|
      if (comp.value === '') { | 
						|
        return true; | 
						|
      } | 
						|
 | 
						|
      rangeTmp = new Range(this.value, options); | 
						|
      return satisfies(comp.semver, rangeTmp, options); | 
						|
    } | 
						|
 | 
						|
    var sameDirectionIncreasing = (this.operator === '>=' || this.operator === '>') && (comp.operator === '>=' || comp.operator === '>'); | 
						|
    var sameDirectionDecreasing = (this.operator === '<=' || this.operator === '<') && (comp.operator === '<=' || comp.operator === '<'); | 
						|
    var sameSemVer = this.semver.version === comp.semver.version; | 
						|
    var differentDirectionsInclusive = (this.operator === '>=' || this.operator === '<=') && (comp.operator === '>=' || comp.operator === '<='); | 
						|
    var oppositeDirectionsLessThan = cmp(this.semver, '<', comp.semver, options) && (this.operator === '>=' || this.operator === '>') && (comp.operator === '<=' || comp.operator === '<'); | 
						|
    var oppositeDirectionsGreaterThan = cmp(this.semver, '>', comp.semver, options) && (this.operator === '<=' || this.operator === '<') && (comp.operator === '>=' || comp.operator === '>'); | 
						|
    return sameDirectionIncreasing || sameDirectionDecreasing || sameSemVer && differentDirectionsInclusive || oppositeDirectionsLessThan || oppositeDirectionsGreaterThan; | 
						|
  }; | 
						|
 | 
						|
  exports.Range = Range; | 
						|
 | 
						|
  function Range(range, options) { | 
						|
    if (!options || typeof options !== 'object') { | 
						|
      options = { | 
						|
        loose: !!options, | 
						|
        includePrerelease: false | 
						|
      }; | 
						|
    } | 
						|
 | 
						|
    if (range instanceof Range) { | 
						|
      if (range.loose === !!options.loose && range.includePrerelease === !!options.includePrerelease) { | 
						|
        return range; | 
						|
      } else { | 
						|
        return new Range(range.raw, options); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    if (range instanceof Comparator) { | 
						|
      return new Range(range.value, options); | 
						|
    } | 
						|
 | 
						|
    if (!(this instanceof Range)) { | 
						|
      return new Range(range, options); | 
						|
    } | 
						|
 | 
						|
    this.options = options; | 
						|
    this.loose = !!options.loose; | 
						|
    this.includePrerelease = !!options.includePrerelease; // First, split based on boolean or || | 
						|
 | 
						|
    this.raw = range; | 
						|
    this.set = range.split(/\s*\|\|\s*/).map(function (range) { | 
						|
      return this.parseRange(range.trim()); | 
						|
    }, this).filter(function (c) { | 
						|
      // throw out any that are not relevant for whatever reason | 
						|
      return c.length; | 
						|
    }); | 
						|
 | 
						|
    if (!this.set.length) { | 
						|
      throw new TypeError('Invalid SemVer Range: ' + range); | 
						|
    } | 
						|
 | 
						|
    this.format(); | 
						|
  } | 
						|
 | 
						|
  Range.prototype.format = function () { | 
						|
    this.range = this.set.map(function (comps) { | 
						|
      return comps.join(' ').trim(); | 
						|
    }).join('||').trim(); | 
						|
    return this.range; | 
						|
  }; | 
						|
 | 
						|
  Range.prototype.toString = function () { | 
						|
    return this.range; | 
						|
  }; | 
						|
 | 
						|
  Range.prototype.parseRange = function (range) { | 
						|
    var loose = this.options.loose; | 
						|
    range = range.trim(); // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` | 
						|
 | 
						|
    var hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]; | 
						|
    range = range.replace(hr, hyphenReplace); | 
						|
    debug('hyphen replace', range); // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` | 
						|
 | 
						|
    range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace); | 
						|
    debug('comparator trim', range, re[t.COMPARATORTRIM]); // `~ 1.2.3` => `~1.2.3` | 
						|
 | 
						|
    range = range.replace(re[t.TILDETRIM], tildeTrimReplace); // `^ 1.2.3` => `^1.2.3` | 
						|
 | 
						|
    range = range.replace(re[t.CARETTRIM], caretTrimReplace); // normalize spaces | 
						|
 | 
						|
    range = range.split(/\s+/).join(' '); // At this point, the range is completely trimmed and | 
						|
    // ready to be split into comparators. | 
						|
 | 
						|
    var compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]; | 
						|
    var set = range.split(' ').map(function (comp) { | 
						|
      return parseComparator(comp, this.options); | 
						|
    }, this).join(' ').split(/\s+/); | 
						|
 | 
						|
    if (this.options.loose) { | 
						|
      // in loose mode, throw out any that are not valid comparators | 
						|
      set = set.filter(function (comp) { | 
						|
        return !!comp.match(compRe); | 
						|
      }); | 
						|
    } | 
						|
 | 
						|
    set = set.map(function (comp) { | 
						|
      return new Comparator(comp, this.options); | 
						|
    }, this); | 
						|
    return set; | 
						|
  }; | 
						|
 | 
						|
  Range.prototype.intersects = function (range, options) { | 
						|
    if (!(range instanceof Range)) { | 
						|
      throw new TypeError('a Range is required'); | 
						|
    } | 
						|
 | 
						|
    return this.set.some(function (thisComparators) { | 
						|
      return isSatisfiable(thisComparators, options) && range.set.some(function (rangeComparators) { | 
						|
        return isSatisfiable(rangeComparators, options) && thisComparators.every(function (thisComparator) { | 
						|
          return rangeComparators.every(function (rangeComparator) { | 
						|
            return thisComparator.intersects(rangeComparator, options); | 
						|
          }); | 
						|
        }); | 
						|
      }); | 
						|
    }); | 
						|
  }; // take a set of comparators and determine whether there | 
						|
  // exists a version which can satisfy it | 
						|
 | 
						|
 | 
						|
  function isSatisfiable(comparators, options) { | 
						|
    var result = true; | 
						|
    var remainingComparators = comparators.slice(); | 
						|
    var testComparator = remainingComparators.pop(); | 
						|
 | 
						|
    while (result && remainingComparators.length) { | 
						|
      result = remainingComparators.every(function (otherComparator) { | 
						|
        return testComparator.intersects(otherComparator, options); | 
						|
      }); | 
						|
      testComparator = remainingComparators.pop(); | 
						|
    } | 
						|
 | 
						|
    return result; | 
						|
  } // Mostly just for testing and legacy API reasons | 
						|
 | 
						|
 | 
						|
  exports.toComparators = toComparators; | 
						|
 | 
						|
  function toComparators(range, options) { | 
						|
    return new Range(range, options).set.map(function (comp) { | 
						|
      return comp.map(function (c) { | 
						|
        return c.value; | 
						|
      }).join(' ').trim().split(' '); | 
						|
    }); | 
						|
  } // comprised of xranges, tildes, stars, and gtlt's at this point. | 
						|
  // already replaced the hyphen ranges | 
						|
  // turn into a set of JUST comparators. | 
						|
 | 
						|
 | 
						|
  function parseComparator(comp, options) { | 
						|
    debug('comp', comp, options); | 
						|
    comp = replaceCarets(comp, options); | 
						|
    debug('caret', comp); | 
						|
    comp = replaceTildes(comp, options); | 
						|
    debug('tildes', comp); | 
						|
    comp = replaceXRanges(comp, options); | 
						|
    debug('xrange', comp); | 
						|
    comp = replaceStars(comp, options); | 
						|
    debug('stars', comp); | 
						|
    return comp; | 
						|
  } | 
						|
 | 
						|
  function isX(id) { | 
						|
    return !id || id.toLowerCase() === 'x' || id === '*'; | 
						|
  } // ~, ~> --> * (any, kinda silly) | 
						|
  // ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 | 
						|
  // ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 | 
						|
  // ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 | 
						|
  // ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 | 
						|
  // ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 | 
						|
 | 
						|
 | 
						|
  function replaceTildes(comp, options) { | 
						|
    return comp.trim().split(/\s+/).map(function (comp) { | 
						|
      return replaceTilde(comp, options); | 
						|
    }).join(' '); | 
						|
  } | 
						|
 | 
						|
  function replaceTilde(comp, options) { | 
						|
    var r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]; | 
						|
    return comp.replace(r, function (_, M, m, p, pr) { | 
						|
      debug('tilde', comp, _, M, m, p, pr); | 
						|
      var ret; | 
						|
 | 
						|
      if (isX(M)) { | 
						|
        ret = ''; | 
						|
      } else if (isX(m)) { | 
						|
        ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; | 
						|
      } else if (isX(p)) { | 
						|
        // ~1.2 == >=1.2.0 <1.3.0 | 
						|
        ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; | 
						|
      } else if (pr) { | 
						|
        debug('replaceTilde pr', pr); | 
						|
        ret = '>=' + M + '.' + m + '.' + p + '-' + pr + ' <' + M + '.' + (+m + 1) + '.0'; | 
						|
      } else { | 
						|
        // ~1.2.3 == >=1.2.3 <1.3.0 | 
						|
        ret = '>=' + M + '.' + m + '.' + p + ' <' + M + '.' + (+m + 1) + '.0'; | 
						|
      } | 
						|
 | 
						|
      debug('tilde return', ret); | 
						|
      return ret; | 
						|
    }); | 
						|
  } // ^ --> * (any, kinda silly) | 
						|
  // ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 | 
						|
  // ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 | 
						|
  // ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 | 
						|
  // ^1.2.3 --> >=1.2.3 <2.0.0 | 
						|
  // ^1.2.0 --> >=1.2.0 <2.0.0 | 
						|
 | 
						|
 | 
						|
  function replaceCarets(comp, options) { | 
						|
    return comp.trim().split(/\s+/).map(function (comp) { | 
						|
      return replaceCaret(comp, options); | 
						|
    }).join(' '); | 
						|
  } | 
						|
 | 
						|
  function replaceCaret(comp, options) { | 
						|
    debug('caret', comp, options); | 
						|
    var r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]; | 
						|
    return comp.replace(r, function (_, M, m, p, pr) { | 
						|
      debug('caret', comp, _, M, m, p, pr); | 
						|
      var ret; | 
						|
 | 
						|
      if (isX(M)) { | 
						|
        ret = ''; | 
						|
      } else if (isX(m)) { | 
						|
        ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; | 
						|
      } else if (isX(p)) { | 
						|
        if (M === '0') { | 
						|
          ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; | 
						|
        } else { | 
						|
          ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'; | 
						|
        } | 
						|
      } else if (pr) { | 
						|
        debug('replaceCaret pr', pr); | 
						|
 | 
						|
        if (M === '0') { | 
						|
          if (m === '0') { | 
						|
            ret = '>=' + M + '.' + m + '.' + p + '-' + pr + ' <' + M + '.' + m + '.' + (+p + 1); | 
						|
          } else { | 
						|
            ret = '>=' + M + '.' + m + '.' + p + '-' + pr + ' <' + M + '.' + (+m + 1) + '.0'; | 
						|
          } | 
						|
        } else { | 
						|
          ret = '>=' + M + '.' + m + '.' + p + '-' + pr + ' <' + (+M + 1) + '.0.0'; | 
						|
        } | 
						|
      } else { | 
						|
        debug('no pr'); | 
						|
 | 
						|
        if (M === '0') { | 
						|
          if (m === '0') { | 
						|
            ret = '>=' + M + '.' + m + '.' + p + ' <' + M + '.' + m + '.' + (+p + 1); | 
						|
          } else { | 
						|
            ret = '>=' + M + '.' + m + '.' + p + ' <' + M + '.' + (+m + 1) + '.0'; | 
						|
          } | 
						|
        } else { | 
						|
          ret = '>=' + M + '.' + m + '.' + p + ' <' + (+M + 1) + '.0.0'; | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      debug('caret return', ret); | 
						|
      return ret; | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  function replaceXRanges(comp, options) { | 
						|
    debug('replaceXRanges', comp, options); | 
						|
    return comp.split(/\s+/).map(function (comp) { | 
						|
      return replaceXRange(comp, options); | 
						|
    }).join(' '); | 
						|
  } | 
						|
 | 
						|
  function replaceXRange(comp, options) { | 
						|
    comp = comp.trim(); | 
						|
    var r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]; | 
						|
    return comp.replace(r, function (ret, gtlt, M, m, p, pr) { | 
						|
      debug('xRange', comp, ret, gtlt, M, m, p, pr); | 
						|
      var xM = isX(M); | 
						|
      var xm = xM || isX(m); | 
						|
      var xp = xm || isX(p); | 
						|
      var anyX = xp; | 
						|
 | 
						|
      if (gtlt === '=' && anyX) { | 
						|
        gtlt = ''; | 
						|
      } // if we're including prereleases in the match, then we need | 
						|
      // to fix this to -0, the lowest possible prerelease value | 
						|
 | 
						|
 | 
						|
      pr = options.includePrerelease ? '-0' : ''; | 
						|
 | 
						|
      if (xM) { | 
						|
        if (gtlt === '>' || gtlt === '<') { | 
						|
          // nothing is allowed | 
						|
          ret = '<0.0.0-0'; | 
						|
        } else { | 
						|
          // nothing is forbidden | 
						|
          ret = '*'; | 
						|
        } | 
						|
      } else if (gtlt && anyX) { | 
						|
        // we know patch is an x, because we have any x at all. | 
						|
        // replace X with 0 | 
						|
        if (xm) { | 
						|
          m = 0; | 
						|
        } | 
						|
 | 
						|
        p = 0; | 
						|
 | 
						|
        if (gtlt === '>') { | 
						|
          // >1 => >=2.0.0 | 
						|
          // >1.2 => >=1.3.0 | 
						|
          // >1.2.3 => >= 1.2.4 | 
						|
          gtlt = '>='; | 
						|
 | 
						|
          if (xm) { | 
						|
            M = +M + 1; | 
						|
            m = 0; | 
						|
            p = 0; | 
						|
          } else { | 
						|
            m = +m + 1; | 
						|
            p = 0; | 
						|
          } | 
						|
        } else if (gtlt === '<=') { | 
						|
          // <=0.7.x is actually <0.8.0, since any 0.7.x should | 
						|
          // pass.  Similarly, <=7.x is actually <8.0.0, etc. | 
						|
          gtlt = '<'; | 
						|
 | 
						|
          if (xm) { | 
						|
            M = +M + 1; | 
						|
          } else { | 
						|
            m = +m + 1; | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        ret = gtlt + M + '.' + m + '.' + p + pr; | 
						|
      } else if (xm) { | 
						|
        ret = '>=' + M + '.0.0' + pr + ' <' + (+M + 1) + '.0.0' + pr; | 
						|
      } else if (xp) { | 
						|
        ret = '>=' + M + '.' + m + '.0' + pr + ' <' + M + '.' + (+m + 1) + '.0' + pr; | 
						|
      } | 
						|
 | 
						|
      debug('xRange return', ret); | 
						|
      return ret; | 
						|
    }); | 
						|
  } // Because * is AND-ed with everything else in the comparator, | 
						|
  // and '' means "any version", just remove the *s entirely. | 
						|
 | 
						|
 | 
						|
  function replaceStars(comp, options) { | 
						|
    debug('replaceStars', comp, options); // Looseness is ignored here.  star is always as loose as it gets! | 
						|
 | 
						|
    return comp.trim().replace(re[t.STAR], ''); | 
						|
  } // This function is passed to string.replace(re[t.HYPHENRANGE]) | 
						|
  // M, m, patch, prerelease, build | 
						|
  // 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 | 
						|
  // 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do | 
						|
  // 1.2 - 3.4 => >=1.2.0 <3.5.0 | 
						|
 | 
						|
 | 
						|
  function hyphenReplace($0, from, fM, fm, fp, fpr, fb, to, tM, tm, tp, tpr, tb) { | 
						|
    if (isX(fM)) { | 
						|
      from = ''; | 
						|
    } else if (isX(fm)) { | 
						|
      from = '>=' + fM + '.0.0'; | 
						|
    } else if (isX(fp)) { | 
						|
      from = '>=' + fM + '.' + fm + '.0'; | 
						|
    } else { | 
						|
      from = '>=' + from; | 
						|
    } | 
						|
 | 
						|
    if (isX(tM)) { | 
						|
      to = ''; | 
						|
    } else if (isX(tm)) { | 
						|
      to = '<' + (+tM + 1) + '.0.0'; | 
						|
    } else if (isX(tp)) { | 
						|
      to = '<' + tM + '.' + (+tm + 1) + '.0'; | 
						|
    } else if (tpr) { | 
						|
      to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr; | 
						|
    } else { | 
						|
      to = '<=' + to; | 
						|
    } | 
						|
 | 
						|
    return (from + ' ' + to).trim(); | 
						|
  } // if ANY of the sets match ALL of its comparators, then pass | 
						|
 | 
						|
 | 
						|
  Range.prototype.test = function (version) { | 
						|
    if (!version) { | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    if (typeof version === 'string') { | 
						|
      try { | 
						|
        version = new SemVer(version, this.options); | 
						|
      } catch (er) { | 
						|
        return false; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    for (var i = 0; i < this.set.length; i++) { | 
						|
      if (testSet(this.set[i], version, this.options)) { | 
						|
        return true; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return false; | 
						|
  }; | 
						|
 | 
						|
  function testSet(set, version, options) { | 
						|
    for (var i = 0; i < set.length; i++) { | 
						|
      if (!set[i].test(version)) { | 
						|
        return false; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    if (version.prerelease.length && !options.includePrerelease) { | 
						|
      // Find the set of versions that are allowed to have prereleases | 
						|
      // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 | 
						|
      // That should allow `1.2.3-pr.2` to pass. | 
						|
      // However, `1.2.4-alpha.notready` should NOT be allowed, | 
						|
      // even though it's within the range set by the comparators. | 
						|
      for (i = 0; i < set.length; i++) { | 
						|
        debug(set[i].semver); | 
						|
 | 
						|
        if (set[i].semver === ANY) { | 
						|
          continue; | 
						|
        } | 
						|
 | 
						|
        if (set[i].semver.prerelease.length > 0) { | 
						|
          var allowed = set[i].semver; | 
						|
 | 
						|
          if (allowed.major === version.major && allowed.minor === version.minor && allowed.patch === version.patch) { | 
						|
            return true; | 
						|
          } | 
						|
        } | 
						|
      } // Version has a -pre, but it's not one of the ones we like. | 
						|
 | 
						|
 | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  exports.satisfies = satisfies; | 
						|
 | 
						|
  function satisfies(version, range, options) { | 
						|
    try { | 
						|
      range = new Range(range, options); | 
						|
    } catch (er) { | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    return range.test(version); | 
						|
  } | 
						|
 | 
						|
  exports.maxSatisfying = maxSatisfying; | 
						|
 | 
						|
  function maxSatisfying(versions, range, options) { | 
						|
    var max = null; | 
						|
    var maxSV = null; | 
						|
 | 
						|
    try { | 
						|
      var rangeObj = new Range(range, options); | 
						|
    } catch (er) { | 
						|
      return null; | 
						|
    } | 
						|
 | 
						|
    versions.forEach(function (v) { | 
						|
      if (rangeObj.test(v)) { | 
						|
        // satisfies(v, range, options) | 
						|
        if (!max || maxSV.compare(v) === -1) { | 
						|
          // compare(max, v, true) | 
						|
          max = v; | 
						|
          maxSV = new SemVer(max, options); | 
						|
        } | 
						|
      } | 
						|
    }); | 
						|
    return max; | 
						|
  } | 
						|
 | 
						|
  exports.minSatisfying = minSatisfying; | 
						|
 | 
						|
  function minSatisfying(versions, range, options) { | 
						|
    var min = null; | 
						|
    var minSV = null; | 
						|
 | 
						|
    try { | 
						|
      var rangeObj = new Range(range, options); | 
						|
    } catch (er) { | 
						|
      return null; | 
						|
    } | 
						|
 | 
						|
    versions.forEach(function (v) { | 
						|
      if (rangeObj.test(v)) { | 
						|
        // satisfies(v, range, options) | 
						|
        if (!min || minSV.compare(v) === 1) { | 
						|
          // compare(min, v, true) | 
						|
          min = v; | 
						|
          minSV = new SemVer(min, options); | 
						|
        } | 
						|
      } | 
						|
    }); | 
						|
    return min; | 
						|
  } | 
						|
 | 
						|
  exports.minVersion = minVersion; | 
						|
 | 
						|
  function minVersion(range, loose) { | 
						|
    range = new Range(range, loose); | 
						|
    var minver = new SemVer('0.0.0'); | 
						|
 | 
						|
    if (range.test(minver)) { | 
						|
      return minver; | 
						|
    } | 
						|
 | 
						|
    minver = new SemVer('0.0.0-0'); | 
						|
 | 
						|
    if (range.test(minver)) { | 
						|
      return minver; | 
						|
    } | 
						|
 | 
						|
    minver = null; | 
						|
 | 
						|
    for (var i = 0; i < range.set.length; ++i) { | 
						|
      var comparators = range.set[i]; | 
						|
      comparators.forEach(function (comparator) { | 
						|
        // Clone to avoid manipulating the comparator's semver object. | 
						|
        var compver = new SemVer(comparator.semver.version); | 
						|
 | 
						|
        switch (comparator.operator) { | 
						|
          case '>': | 
						|
            if (compver.prerelease.length === 0) { | 
						|
              compver.patch++; | 
						|
            } else { | 
						|
              compver.prerelease.push(0); | 
						|
            } | 
						|
 | 
						|
            compver.raw = compver.format(); | 
						|
 | 
						|
          /* fallthrough */ | 
						|
 | 
						|
          case '': | 
						|
          case '>=': | 
						|
            if (!minver || gt(minver, compver)) { | 
						|
              minver = compver; | 
						|
            } | 
						|
 | 
						|
            break; | 
						|
 | 
						|
          case '<': | 
						|
          case '<=': | 
						|
            /* Ignore maximum versions */ | 
						|
            break; | 
						|
 | 
						|
          /* istanbul ignore next */ | 
						|
 | 
						|
          default: | 
						|
            throw new Error('Unexpected operation: ' + comparator.operator); | 
						|
        } | 
						|
      }); | 
						|
    } | 
						|
 | 
						|
    if (minver && range.test(minver)) { | 
						|
      return minver; | 
						|
    } | 
						|
 | 
						|
    return null; | 
						|
  } | 
						|
 | 
						|
  exports.validRange = validRange; | 
						|
 | 
						|
  function validRange(range, options) { | 
						|
    try { | 
						|
      // Return '*' instead of '' so that truthiness works. | 
						|
      // This will throw if it's invalid anyway | 
						|
      return new Range(range, options).range || '*'; | 
						|
    } catch (er) { | 
						|
      return null; | 
						|
    } | 
						|
  } // Determine if version is less than all the versions possible in the range | 
						|
 | 
						|
 | 
						|
  exports.ltr = ltr; | 
						|
 | 
						|
  function ltr(version, range, options) { | 
						|
    return outside(version, range, '<', options); | 
						|
  } // Determine if version is greater than all the versions possible in the range. | 
						|
 | 
						|
 | 
						|
  exports.gtr = gtr; | 
						|
 | 
						|
  function gtr(version, range, options) { | 
						|
    return outside(version, range, '>', options); | 
						|
  } | 
						|
 | 
						|
  exports.outside = outside; | 
						|
 | 
						|
  function outside(version, range, hilo, options) { | 
						|
    version = new SemVer(version, options); | 
						|
    range = new Range(range, options); | 
						|
    var gtfn, ltefn, ltfn, comp, ecomp; | 
						|
 | 
						|
    switch (hilo) { | 
						|
      case '>': | 
						|
        gtfn = gt; | 
						|
        ltefn = lte; | 
						|
        ltfn = lt; | 
						|
        comp = '>'; | 
						|
        ecomp = '>='; | 
						|
        break; | 
						|
 | 
						|
      case '<': | 
						|
        gtfn = lt; | 
						|
        ltefn = gte; | 
						|
        ltfn = gt; | 
						|
        comp = '<'; | 
						|
        ecomp = '<='; | 
						|
        break; | 
						|
 | 
						|
      default: | 
						|
        throw new TypeError('Must provide a hilo val of "<" or ">"'); | 
						|
    } // If it satisifes the range it is not outside | 
						|
 | 
						|
 | 
						|
    if (satisfies(version, range, options)) { | 
						|
      return false; | 
						|
    } // From now on, variable terms are as if we're in "gtr" mode. | 
						|
    // but note that everything is flipped for the "ltr" function. | 
						|
 | 
						|
 | 
						|
    for (var i = 0; i < range.set.length; ++i) { | 
						|
      var comparators = range.set[i]; | 
						|
      var high = null; | 
						|
      var low = null; | 
						|
      comparators.forEach(function (comparator) { | 
						|
        if (comparator.semver === ANY) { | 
						|
          comparator = new Comparator('>=0.0.0'); | 
						|
        } | 
						|
 | 
						|
        high = high || comparator; | 
						|
        low = low || comparator; | 
						|
 | 
						|
        if (gtfn(comparator.semver, high.semver, options)) { | 
						|
          high = comparator; | 
						|
        } else if (ltfn(comparator.semver, low.semver, options)) { | 
						|
          low = comparator; | 
						|
        } | 
						|
      }); // If the edge version comparator has a operator then our version | 
						|
      // isn't outside it | 
						|
 | 
						|
      if (high.operator === comp || high.operator === ecomp) { | 
						|
        return false; | 
						|
      } // If the lowest version comparator has an operator and our version | 
						|
      // is less than it then it isn't higher than the range | 
						|
 | 
						|
 | 
						|
      if ((!low.operator || low.operator === comp) && ltefn(version, low.semver)) { | 
						|
        return false; | 
						|
      } else if (low.operator === ecomp && ltfn(version, low.semver)) { | 
						|
        return false; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  exports.prerelease = prerelease; | 
						|
 | 
						|
  function prerelease(version, options) { | 
						|
    var parsed = parse(version, options); | 
						|
    return parsed && parsed.prerelease.length ? parsed.prerelease : null; | 
						|
  } | 
						|
 | 
						|
  exports.intersects = intersects; | 
						|
 | 
						|
  function intersects(r1, r2, options) { | 
						|
    r1 = new Range(r1, options); | 
						|
    r2 = new Range(r2, options); | 
						|
    return r1.intersects(r2); | 
						|
  } | 
						|
 | 
						|
  exports.coerce = coerce; | 
						|
 | 
						|
  function coerce(version, options) { | 
						|
    if (version instanceof SemVer) { | 
						|
      return version; | 
						|
    } | 
						|
 | 
						|
    if (typeof version === 'number') { | 
						|
      version = String(version); | 
						|
    } | 
						|
 | 
						|
    if (typeof version !== 'string') { | 
						|
      return null; | 
						|
    } | 
						|
 | 
						|
    options = options || {}; | 
						|
    var match = null; | 
						|
 | 
						|
    if (!options.rtl) { | 
						|
      match = version.match(re[t.COERCE]); | 
						|
    } else { | 
						|
      // Find the right-most coercible string that does not share | 
						|
      // a terminus with a more left-ward coercible string. | 
						|
      // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4' | 
						|
      // | 
						|
      // Walk through the string checking with a /g regexp | 
						|
      // Manually set the index so as to pick up overlapping matches. | 
						|
      // Stop when we get a match that ends at the string end, since no | 
						|
      // coercible string can be more right-ward without the same terminus. | 
						|
      var next; | 
						|
 | 
						|
      while ((next = re[t.COERCERTL].exec(version)) && (!match || match.index + match[0].length !== version.length)) { | 
						|
        if (!match || next.index + next[0].length !== match.index + match[0].length) { | 
						|
          match = next; | 
						|
        } | 
						|
 | 
						|
        re[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length; | 
						|
      } // leave it in a clean state | 
						|
 | 
						|
 | 
						|
      re[t.COERCERTL].lastIndex = -1; | 
						|
    } | 
						|
 | 
						|
    if (match === null) { | 
						|
      return null; | 
						|
    } | 
						|
 | 
						|
    return parse(match[2] + '.' + (match[3] || '0') + '.' + (match[4] || '0'), options); | 
						|
  } | 
						|
}); | 
						|
var semver_1 = semver.SEMVER_SPEC_VERSION; | 
						|
var semver_2 = semver.re; | 
						|
var semver_3 = semver.src; | 
						|
var semver_4 = semver.tokens; | 
						|
var semver_5 = semver.parse; | 
						|
var semver_6 = semver.valid; | 
						|
var semver_7 = semver.clean; | 
						|
var semver_8 = semver.SemVer; | 
						|
var semver_9 = semver.inc; | 
						|
var semver_10 = semver.diff; | 
						|
var semver_11 = semver.compareIdentifiers; | 
						|
var semver_12 = semver.rcompareIdentifiers; | 
						|
var semver_13 = semver.major; | 
						|
var semver_14 = semver.minor; | 
						|
var semver_15 = semver.patch; | 
						|
var semver_16 = semver.compare; | 
						|
var semver_17 = semver.compareLoose; | 
						|
var semver_18 = semver.compareBuild; | 
						|
var semver_19 = semver.rcompare; | 
						|
var semver_20 = semver.sort; | 
						|
var semver_21 = semver.rsort; | 
						|
var semver_22 = semver.gt; | 
						|
var semver_23 = semver.lt; | 
						|
var semver_24 = semver.eq; | 
						|
var semver_25 = semver.neq; | 
						|
var semver_26 = semver.gte; | 
						|
var semver_27 = semver.lte; | 
						|
var semver_28 = semver.cmp; | 
						|
var semver_29 = semver.Comparator; | 
						|
var semver_30 = semver.Range; | 
						|
var semver_31 = semver.toComparators; | 
						|
var semver_32 = semver.satisfies; | 
						|
var semver_33 = semver.maxSatisfying; | 
						|
var semver_34 = semver.minSatisfying; | 
						|
var semver_35 = semver.minVersion; | 
						|
var semver_36 = semver.validRange; | 
						|
var semver_37 = semver.ltr; | 
						|
var semver_38 = semver.gtr; | 
						|
var semver_39 = semver.outside; | 
						|
var semver_40 = semver.prerelease; | 
						|
var semver_41 = semver.intersects; | 
						|
var semver_42 = semver.coerce; | 
						|
 | 
						|
var arrayify = function arrayify(object, keyName) { | 
						|
  return Object.keys(object).reduce(function (array, key) { | 
						|
    return array.concat(Object.assign({ | 
						|
      [keyName]: key | 
						|
    }, object[key])); | 
						|
  }, []); | 
						|
}; | 
						|
 | 
						|
var dedent_1 = createCommonjsModule(function (module) { | 
						|
 | 
						|
  function dedent(strings) { | 
						|
    var raw = void 0; | 
						|
 | 
						|
    if (typeof strings === "string") { | 
						|
      // dedent can be used as a plain function | 
						|
      raw = [strings]; | 
						|
    } else { | 
						|
      raw = strings.raw; | 
						|
    } // first, perform interpolation | 
						|
 | 
						|
 | 
						|
    var result = ""; | 
						|
 | 
						|
    for (var i = 0; i < raw.length; i++) { | 
						|
      result += raw[i]. // join lines when there is a suppressed newline | 
						|
      replace(/\\\n[ \t]*/g, ""). // handle escaped backticks | 
						|
      replace(/\\`/g, "`"); | 
						|
 | 
						|
      if (i < (arguments.length <= 1 ? 0 : arguments.length - 1)) { | 
						|
        result += arguments.length <= i + 1 ? undefined : arguments[i + 1]; | 
						|
      } | 
						|
    } // now strip indentation | 
						|
 | 
						|
 | 
						|
    var lines = result.split("\n"); | 
						|
    var mindent = null; | 
						|
    lines.forEach(function (l) { | 
						|
      var m = l.match(/^(\s+)\S+/); | 
						|
 | 
						|
      if (m) { | 
						|
        var indent = m[1].length; | 
						|
 | 
						|
        if (!mindent) { | 
						|
          // this is the first indented line | 
						|
          mindent = indent; | 
						|
        } else { | 
						|
          mindent = Math.min(mindent, indent); | 
						|
        } | 
						|
      } | 
						|
    }); | 
						|
 | 
						|
    if (mindent !== null) { | 
						|
      result = lines.map(function (l) { | 
						|
        return l[0] === " " ? l.slice(mindent) : l; | 
						|
      }).join("\n"); | 
						|
    } // dedent eats leading and trailing whitespace too | 
						|
 | 
						|
 | 
						|
    result = result.trim(); // handle escaped newlines at the end to ensure they don't get stripped too | 
						|
 | 
						|
    return result.replace(/\\n/g, "\n"); | 
						|
  } | 
						|
 | 
						|
  { | 
						|
    module.exports = dedent; | 
						|
  } | 
						|
}); | 
						|
 | 
						|
var CATEGORY_CONFIG = "Config"; | 
						|
var CATEGORY_EDITOR = "Editor"; | 
						|
var CATEGORY_FORMAT = "Format"; | 
						|
var CATEGORY_OTHER = "Other"; | 
						|
var CATEGORY_OUTPUT = "Output"; | 
						|
var CATEGORY_GLOBAL = "Global"; | 
						|
var CATEGORY_SPECIAL = "Special"; | 
						|
/** | 
						|
 * @typedef {Object} OptionInfo | 
						|
 * @property {string} [since] - available since version | 
						|
 * @property {string} category | 
						|
 * @property {'int' | 'boolean' | 'choice' | 'path'} type | 
						|
 * @property {boolean} [array] - indicate it's an array of the specified type | 
						|
 * @property {OptionValueInfo} [default] | 
						|
 * @property {OptionRangeInfo} [range] - for type int | 
						|
 * @property {string} description | 
						|
 * @property {string} [deprecated] - deprecated since version | 
						|
 * @property {OptionRedirectInfo} [redirect] - redirect deprecated option | 
						|
 * @property {(value: any) => boolean} [exception] | 
						|
 * @property {OptionChoiceInfo[]} [choices] - for type choice | 
						|
 * @property {string} [cliName] | 
						|
 * @property {string} [cliCategory] | 
						|
 * @property {string} [cliDescription] | 
						|
 * | 
						|
 * @typedef {number | boolean | string} OptionValue | 
						|
 * @typedef {OptionValue | [{ value: OptionValue[] }] | Array<{ since: string, value: OptionValue}>} OptionValueInfo | 
						|
 * | 
						|
 * @typedef {Object} OptionRedirectInfo | 
						|
 * @property {string} option | 
						|
 * @property {OptionValue} value | 
						|
 * | 
						|
 * @typedef {Object} OptionRangeInfo | 
						|
 * @property {number} start - recommended range start | 
						|
 * @property {number} end - recommended range end | 
						|
 * @property {number} step - recommended range step | 
						|
 * | 
						|
 * @typedef {Object} OptionChoiceInfo | 
						|
 * @property {boolean | string} value - boolean for the option that is originally boolean type | 
						|
 * @property {string} description | 
						|
 * @property {string} [since] - undefined if available since the first version of the option | 
						|
 * @property {string} [deprecated] - deprecated since version | 
						|
 * @property {OptionValueInfo} [redirect] - redirect deprecated value | 
						|
 */ | 
						|
 | 
						|
/** @type {{ [name: string]: OptionInfo }} */ | 
						|
 | 
						|
var options = { | 
						|
  cursorOffset: { | 
						|
    since: "1.4.0", | 
						|
    category: CATEGORY_SPECIAL, | 
						|
    type: "int", | 
						|
    default: -1, | 
						|
    range: { | 
						|
      start: -1, | 
						|
      end: Infinity, | 
						|
      step: 1 | 
						|
    }, | 
						|
    description: dedent_1` | 
						|
      Print (to stderr) where a cursor at the given position would move to after formatting. | 
						|
      This option cannot be used with --range-start and --range-end. | 
						|
    `, | 
						|
    cliCategory: CATEGORY_EDITOR | 
						|
  }, | 
						|
  endOfLine: { | 
						|
    since: "1.15.0", | 
						|
    category: CATEGORY_GLOBAL, | 
						|
    type: "choice", | 
						|
    default: "auto", | 
						|
    description: "Which end of line characters to apply.", | 
						|
    choices: [{ | 
						|
      value: "auto", | 
						|
      description: dedent_1` | 
						|
          Maintain existing | 
						|
          (mixed values within one file are normalised by looking at what's used after the first line) | 
						|
        ` | 
						|
    }, { | 
						|
      value: "lf", | 
						|
      description: "Line Feed only (\\n), common on Linux and macOS as well as inside git repos" | 
						|
    }, { | 
						|
      value: "crlf", | 
						|
      description: "Carriage Return + Line Feed characters (\\r\\n), common on Windows" | 
						|
    }, { | 
						|
      value: "cr", | 
						|
      description: "Carriage Return character only (\\r), used very rarely" | 
						|
    }] | 
						|
  }, | 
						|
  filepath: { | 
						|
    since: "1.4.0", | 
						|
    category: CATEGORY_SPECIAL, | 
						|
    type: "path", | 
						|
    description: "Specify the input filepath. This will be used to do parser inference.", | 
						|
    cliName: "stdin-filepath", | 
						|
    cliCategory: CATEGORY_OTHER, | 
						|
    cliDescription: "Path to the file to pretend that stdin comes from." | 
						|
  }, | 
						|
  insertPragma: { | 
						|
    since: "1.8.0", | 
						|
    category: CATEGORY_SPECIAL, | 
						|
    type: "boolean", | 
						|
    default: false, | 
						|
    description: "Insert @format pragma into file's first docblock comment.", | 
						|
    cliCategory: CATEGORY_OTHER | 
						|
  }, | 
						|
  parser: { | 
						|
    since: "0.0.10", | 
						|
    category: CATEGORY_GLOBAL, | 
						|
    type: "choice", | 
						|
    default: [{ | 
						|
      since: "0.0.10", | 
						|
      value: "babylon" | 
						|
    }, { | 
						|
      since: "1.13.0", | 
						|
      value: undefined | 
						|
    }], | 
						|
    description: "Which parser to use.", | 
						|
    exception: function exception(value) { | 
						|
      return typeof value === "string" || typeof value === "function"; | 
						|
    }, | 
						|
    choices: [{ | 
						|
      value: "flow", | 
						|
      description: "Flow" | 
						|
    }, { | 
						|
      value: "babylon", | 
						|
      description: "JavaScript", | 
						|
      deprecated: "1.16.0", | 
						|
      redirect: "babel" | 
						|
    }, { | 
						|
      value: "babel", | 
						|
      since: "1.16.0", | 
						|
      description: "JavaScript" | 
						|
    }, { | 
						|
      value: "babel-flow", | 
						|
      since: "1.16.0", | 
						|
      description: "Flow" | 
						|
    }, { | 
						|
      value: "typescript", | 
						|
      since: "1.4.0", | 
						|
      description: "TypeScript" | 
						|
    }, { | 
						|
      value: "css", | 
						|
      since: "1.7.1", | 
						|
      description: "CSS" | 
						|
    }, { | 
						|
      value: "postcss", | 
						|
      since: "1.4.0", | 
						|
      description: "CSS/Less/SCSS", | 
						|
      deprecated: "1.7.1", | 
						|
      redirect: "css" | 
						|
    }, { | 
						|
      value: "less", | 
						|
      since: "1.7.1", | 
						|
      description: "Less" | 
						|
    }, { | 
						|
      value: "scss", | 
						|
      since: "1.7.1", | 
						|
      description: "SCSS" | 
						|
    }, { | 
						|
      value: "json", | 
						|
      since: "1.5.0", | 
						|
      description: "JSON" | 
						|
    }, { | 
						|
      value: "json5", | 
						|
      since: "1.13.0", | 
						|
      description: "JSON5" | 
						|
    }, { | 
						|
      value: "json-stringify", | 
						|
      since: "1.13.0", | 
						|
      description: "JSON.stringify" | 
						|
    }, { | 
						|
      value: "graphql", | 
						|
      since: "1.5.0", | 
						|
      description: "GraphQL" | 
						|
    }, { | 
						|
      value: "markdown", | 
						|
      since: "1.8.0", | 
						|
      description: "Markdown" | 
						|
    }, { | 
						|
      value: "mdx", | 
						|
      since: "1.15.0", | 
						|
      description: "MDX" | 
						|
    }, { | 
						|
      value: "vue", | 
						|
      since: "1.10.0", | 
						|
      description: "Vue" | 
						|
    }, { | 
						|
      value: "yaml", | 
						|
      since: "1.14.0", | 
						|
      description: "YAML" | 
						|
    }, { | 
						|
      value: "glimmer", | 
						|
      since: null, | 
						|
      description: "Handlebars" | 
						|
    }, { | 
						|
      value: "html", | 
						|
      since: "1.15.0", | 
						|
      description: "HTML" | 
						|
    }, { | 
						|
      value: "angular", | 
						|
      since: "1.15.0", | 
						|
      description: "Angular" | 
						|
    }, { | 
						|
      value: "lwc", | 
						|
      since: "1.17.0", | 
						|
      description: "Lightning Web Components" | 
						|
    }] | 
						|
  }, | 
						|
  plugins: { | 
						|
    since: "1.10.0", | 
						|
    type: "path", | 
						|
    array: true, | 
						|
    default: [{ | 
						|
      value: [] | 
						|
    }], | 
						|
    category: CATEGORY_GLOBAL, | 
						|
    description: "Add a plugin. Multiple plugins can be passed as separate `--plugin`s.", | 
						|
    exception: function exception(value) { | 
						|
      return typeof value === "string" || typeof value === "object"; | 
						|
    }, | 
						|
    cliName: "plugin", | 
						|
    cliCategory: CATEGORY_CONFIG | 
						|
  }, | 
						|
  pluginSearchDirs: { | 
						|
    since: "1.13.0", | 
						|
    type: "path", | 
						|
    array: true, | 
						|
    default: [{ | 
						|
      value: [] | 
						|
    }], | 
						|
    category: CATEGORY_GLOBAL, | 
						|
    description: dedent_1` | 
						|
      Custom directory that contains prettier plugins in node_modules subdirectory. | 
						|
      Overrides default behavior when plugins are searched relatively to the location of Prettier. | 
						|
      Multiple values are accepted. | 
						|
    `, | 
						|
    exception: function exception(value) { | 
						|
      return typeof value === "string" || typeof value === "object"; | 
						|
    }, | 
						|
    cliName: "plugin-search-dir", | 
						|
    cliCategory: CATEGORY_CONFIG | 
						|
  }, | 
						|
  printWidth: { | 
						|
    since: "0.0.0", | 
						|
    category: CATEGORY_GLOBAL, | 
						|
    type: "int", | 
						|
    default: 80, | 
						|
    description: "The line length where Prettier will try wrap.", | 
						|
    range: { | 
						|
      start: 0, | 
						|
      end: Infinity, | 
						|
      step: 1 | 
						|
    } | 
						|
  }, | 
						|
  rangeEnd: { | 
						|
    since: "1.4.0", | 
						|
    category: CATEGORY_SPECIAL, | 
						|
    type: "int", | 
						|
    default: Infinity, | 
						|
    range: { | 
						|
      start: 0, | 
						|
      end: Infinity, | 
						|
      step: 1 | 
						|
    }, | 
						|
    description: dedent_1` | 
						|
      Format code ending at a given character offset (exclusive). | 
						|
      The range will extend forwards to the end of the selected statement. | 
						|
      This option cannot be used with --cursor-offset. | 
						|
    `, | 
						|
    cliCategory: CATEGORY_EDITOR | 
						|
  }, | 
						|
  rangeStart: { | 
						|
    since: "1.4.0", | 
						|
    category: CATEGORY_SPECIAL, | 
						|
    type: "int", | 
						|
    default: 0, | 
						|
    range: { | 
						|
      start: 0, | 
						|
      end: Infinity, | 
						|
      step: 1 | 
						|
    }, | 
						|
    description: dedent_1` | 
						|
      Format code starting at a given character offset. | 
						|
      The range will extend backwards to the start of the first line containing the selected statement. | 
						|
      This option cannot be used with --cursor-offset. | 
						|
    `, | 
						|
    cliCategory: CATEGORY_EDITOR | 
						|
  }, | 
						|
  requirePragma: { | 
						|
    since: "1.7.0", | 
						|
    category: CATEGORY_SPECIAL, | 
						|
    type: "boolean", | 
						|
    default: false, | 
						|
    description: dedent_1` | 
						|
      Require either '@prettier' or '@format' to be present in the file's first docblock comment | 
						|
      in order for it to be formatted. | 
						|
    `, | 
						|
    cliCategory: CATEGORY_OTHER | 
						|
  }, | 
						|
  tabWidth: { | 
						|
    type: "int", | 
						|
    category: CATEGORY_GLOBAL, | 
						|
    default: 2, | 
						|
    description: "Number of spaces per indentation level.", | 
						|
    range: { | 
						|
      start: 0, | 
						|
      end: Infinity, | 
						|
      step: 1 | 
						|
    } | 
						|
  }, | 
						|
  useFlowParser: { | 
						|
    since: "0.0.0", | 
						|
    category: CATEGORY_GLOBAL, | 
						|
    type: "boolean", | 
						|
    default: [{ | 
						|
      since: "0.0.0", | 
						|
      value: false | 
						|
    }, { | 
						|
      since: "1.15.0", | 
						|
      value: undefined | 
						|
    }], | 
						|
    deprecated: "0.0.10", | 
						|
    description: "Use flow parser.", | 
						|
    redirect: { | 
						|
      option: "parser", | 
						|
      value: "flow" | 
						|
    }, | 
						|
    cliName: "flow-parser" | 
						|
  }, | 
						|
  useTabs: { | 
						|
    since: "1.0.0", | 
						|
    category: CATEGORY_GLOBAL, | 
						|
    type: "boolean", | 
						|
    default: false, | 
						|
    description: "Indent with tabs instead of spaces." | 
						|
  } | 
						|
}; | 
						|
var coreOptions = { | 
						|
  CATEGORY_CONFIG, | 
						|
  CATEGORY_EDITOR, | 
						|
  CATEGORY_FORMAT, | 
						|
  CATEGORY_OTHER, | 
						|
  CATEGORY_OUTPUT, | 
						|
  CATEGORY_GLOBAL, | 
						|
  CATEGORY_SPECIAL, | 
						|
  options | 
						|
}; | 
						|
 | 
						|
var require$$0 = getCjsExportFromNamespace(_package$1); | 
						|
 | 
						|
var currentVersion = require$$0.version; | 
						|
var coreOptions$1 = coreOptions.options; | 
						|
 | 
						|
function getSupportInfo(version, opts) { | 
						|
  opts = Object.assign({ | 
						|
    plugins: [], | 
						|
    showUnreleased: false, | 
						|
    showDeprecated: false, | 
						|
    showInternal: false | 
						|
  }, opts); | 
						|
 | 
						|
  if (!version) { | 
						|
    // pre-release version is smaller than the normal version in semver, | 
						|
    // we need to treat it as the normal one so as to test new features. | 
						|
    version = currentVersion.split("-", 1)[0]; | 
						|
  } | 
						|
 | 
						|
  var plugins = opts.plugins; | 
						|
  var options = arrayify(Object.assign(plugins.reduce(function (currentOptions, plugin) { | 
						|
    return Object.assign(currentOptions, plugin.options); | 
						|
  }, {}), coreOptions$1), "name").sort(function (a, b) { | 
						|
    return a.name === b.name ? 0 : a.name < b.name ? -1 : 1; | 
						|
  }).filter(filterSince).filter(filterDeprecated).map(mapDeprecated).map(mapInternal).map(function (option) { | 
						|
    var newOption = Object.assign({}, option); | 
						|
 | 
						|
    if (Array.isArray(newOption.default)) { | 
						|
      newOption.default = newOption.default.length === 1 ? newOption.default[0].value : newOption.default.filter(filterSince).sort(function (info1, info2) { | 
						|
        return semver.compare(info2.since, info1.since); | 
						|
      })[0].value; | 
						|
    } | 
						|
 | 
						|
    if (Array.isArray(newOption.choices)) { | 
						|
      newOption.choices = newOption.choices.filter(filterSince).filter(filterDeprecated).map(mapDeprecated); | 
						|
    } | 
						|
 | 
						|
    return newOption; | 
						|
  }).map(function (option) { | 
						|
    var filteredPlugins = plugins.filter(function (plugin) { | 
						|
      return plugin.defaultOptions && plugin.defaultOptions[option.name] !== undefined; | 
						|
    }); | 
						|
    var pluginDefaults = filteredPlugins.reduce(function (reduced, plugin) { | 
						|
      reduced[plugin.name] = plugin.defaultOptions[option.name]; | 
						|
      return reduced; | 
						|
    }, {}); | 
						|
    return Object.assign(option, { | 
						|
      pluginDefaults | 
						|
    }); | 
						|
  }); | 
						|
  var usePostCssParser = semver.lt(version, "1.7.1"); | 
						|
  var useBabylonParser = semver.lt(version, "1.16.0"); | 
						|
  var languages = plugins.reduce(function (all, plugin) { | 
						|
    return all.concat(plugin.languages || []); | 
						|
  }, []).filter(filterSince).map(function (language) { | 
						|
    // Prevent breaking changes | 
						|
    if (language.name === "Markdown") { | 
						|
      return Object.assign({}, language, { | 
						|
        parsers: ["markdown"] | 
						|
      }); | 
						|
    } | 
						|
 | 
						|
    if (language.name === "TypeScript") { | 
						|
      return Object.assign({}, language, { | 
						|
        parsers: ["typescript"] | 
						|
      }); | 
						|
    } // "babylon" was renamed to "babel" in 1.16.0 | 
						|
 | 
						|
 | 
						|
    if (useBabylonParser && language.parsers.indexOf("babel") !== -1) { | 
						|
      return Object.assign({}, language, { | 
						|
        parsers: language.parsers.map(function (parser) { | 
						|
          return parser === "babel" ? "babylon" : parser; | 
						|
        }) | 
						|
      }); | 
						|
    } | 
						|
 | 
						|
    if (usePostCssParser && (language.name === "CSS" || language.group === "CSS")) { | 
						|
      return Object.assign({}, language, { | 
						|
        parsers: ["postcss"] | 
						|
      }); | 
						|
    } | 
						|
 | 
						|
    return language; | 
						|
  }); | 
						|
  return { | 
						|
    languages, | 
						|
    options | 
						|
  }; | 
						|
 | 
						|
  function filterSince(object) { | 
						|
    return opts.showUnreleased || !("since" in object) || object.since && semver.gte(version, object.since); | 
						|
  } | 
						|
 | 
						|
  function filterDeprecated(object) { | 
						|
    return opts.showDeprecated || !("deprecated" in object) || object.deprecated && semver.lt(version, object.deprecated); | 
						|
  } | 
						|
 | 
						|
  function mapDeprecated(object) { | 
						|
    if (!object.deprecated || opts.showDeprecated) { | 
						|
      return object; | 
						|
    } | 
						|
 | 
						|
    var newObject = Object.assign({}, object); | 
						|
    delete newObject.deprecated; | 
						|
    delete newObject.redirect; | 
						|
    return newObject; | 
						|
  } | 
						|
 | 
						|
  function mapInternal(object) { | 
						|
    if (opts.showInternal) { | 
						|
      return object; | 
						|
    } | 
						|
 | 
						|
    var newObject = Object.assign({}, object); | 
						|
    delete newObject.cliName; | 
						|
    delete newObject.cliCategory; | 
						|
    delete newObject.cliDescription; | 
						|
    return newObject; | 
						|
  } | 
						|
} | 
						|
 | 
						|
var support = { | 
						|
  getSupportInfo | 
						|
}; | 
						|
 | 
						|
/*! ***************************************************************************** | 
						|
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. | 
						|
***************************************************************************** */ | 
						|
 | 
						|
/* global Reflect, Promise */ | 
						|
var _extendStatics = function extendStatics(d, b) { | 
						|
  _extendStatics = Object.setPrototypeOf || { | 
						|
    __proto__: [] | 
						|
  } instanceof Array && function (d, b) { | 
						|
    d.__proto__ = b; | 
						|
  } || function (d, b) { | 
						|
    for (var p in b) { | 
						|
      if (b.hasOwnProperty(p)) d[p] = b[p]; | 
						|
    } | 
						|
  }; | 
						|
 | 
						|
  return _extendStatics(d, b); | 
						|
}; | 
						|
 | 
						|
function __extends(d, b) { | 
						|
  _extendStatics(d, b); | 
						|
 | 
						|
  function __() { | 
						|
    this.constructor = d; | 
						|
  } | 
						|
 | 
						|
  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); | 
						|
} | 
						|
 | 
						|
var _assign = function __assign() { | 
						|
  _assign = Object.assign || function __assign(t) { | 
						|
    for (var s, i = 1, n = arguments.length; i < n; i++) { | 
						|
      s = arguments[i]; | 
						|
 | 
						|
      for (var p in s) { | 
						|
        if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return t; | 
						|
  }; | 
						|
 | 
						|
  return _assign.apply(this, arguments); | 
						|
}; | 
						|
function __rest(s, e) { | 
						|
  var t = {}; | 
						|
 | 
						|
  for (var p in s) { | 
						|
    if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; | 
						|
  } | 
						|
 | 
						|
  if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { | 
						|
    if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; | 
						|
  } | 
						|
  return t; | 
						|
} | 
						|
function __decorate(decorators, target, key, desc) { | 
						|
  var c = arguments.length, | 
						|
      r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, | 
						|
      d; | 
						|
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) { | 
						|
    if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; | 
						|
  } | 
						|
  return c > 3 && r && Object.defineProperty(target, key, r), r; | 
						|
} | 
						|
function __param(paramIndex, decorator) { | 
						|
  return function (target, key) { | 
						|
    decorator(target, key, paramIndex); | 
						|
  }; | 
						|
} | 
						|
function __metadata(metadataKey, metadataValue) { | 
						|
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); | 
						|
} | 
						|
function __awaiter(thisArg, _arguments, P, generator) { | 
						|
  return new (P || (P = Promise))(function (resolve, reject) { | 
						|
    function fulfilled(value) { | 
						|
      try { | 
						|
        step(generator.next(value)); | 
						|
      } catch (e) { | 
						|
        reject(e); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    function rejected(value) { | 
						|
      try { | 
						|
        step(generator["throw"](value)); | 
						|
      } catch (e) { | 
						|
        reject(e); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    function step(result) { | 
						|
      result.done ? resolve(result.value) : new P(function (resolve) { | 
						|
        resolve(result.value); | 
						|
      }).then(fulfilled, rejected); | 
						|
    } | 
						|
 | 
						|
    step((generator = generator.apply(thisArg, _arguments || [])).next()); | 
						|
  }); | 
						|
} | 
						|
function __generator(thisArg, body) { | 
						|
  var _ = { | 
						|
    label: 0, | 
						|
    sent: function sent() { | 
						|
      if (t[0] & 1) throw t[1]; | 
						|
      return t[1]; | 
						|
    }, | 
						|
    trys: [], | 
						|
    ops: [] | 
						|
  }, | 
						|
      f, | 
						|
      y, | 
						|
      t, | 
						|
      g; | 
						|
  return g = { | 
						|
    next: verb(0), | 
						|
    "throw": verb(1), | 
						|
    "return": verb(2) | 
						|
  }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { | 
						|
    return this; | 
						|
  }), g; | 
						|
 | 
						|
  function verb(n) { | 
						|
    return function (v) { | 
						|
      return step([n, v]); | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  function step(op) { | 
						|
    if (f) throw new TypeError("Generator is already executing."); | 
						|
 | 
						|
    while (_) { | 
						|
      try { | 
						|
        if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | 
						|
        if (y = 0, t) op = [op[0] & 2, t.value]; | 
						|
 | 
						|
        switch (op[0]) { | 
						|
          case 0: | 
						|
          case 1: | 
						|
            t = op; | 
						|
            break; | 
						|
 | 
						|
          case 4: | 
						|
            _.label++; | 
						|
            return { | 
						|
              value: op[1], | 
						|
              done: false | 
						|
            }; | 
						|
 | 
						|
          case 5: | 
						|
            _.label++; | 
						|
            y = op[1]; | 
						|
            op = [0]; | 
						|
            continue; | 
						|
 | 
						|
          case 7: | 
						|
            op = _.ops.pop(); | 
						|
 | 
						|
            _.trys.pop(); | 
						|
 | 
						|
            continue; | 
						|
 | 
						|
          default: | 
						|
            if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { | 
						|
              _ = 0; | 
						|
              continue; | 
						|
            } | 
						|
 | 
						|
            if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) { | 
						|
              _.label = op[1]; | 
						|
              break; | 
						|
            } | 
						|
 | 
						|
            if (op[0] === 6 && _.label < t[1]) { | 
						|
              _.label = t[1]; | 
						|
              t = op; | 
						|
              break; | 
						|
            } | 
						|
 | 
						|
            if (t && _.label < t[2]) { | 
						|
              _.label = t[2]; | 
						|
 | 
						|
              _.ops.push(op); | 
						|
 | 
						|
              break; | 
						|
            } | 
						|
 | 
						|
            if (t[2]) _.ops.pop(); | 
						|
 | 
						|
            _.trys.pop(); | 
						|
 | 
						|
            continue; | 
						|
        } | 
						|
 | 
						|
        op = body.call(thisArg, _); | 
						|
      } catch (e) { | 
						|
        op = [6, e]; | 
						|
        y = 0; | 
						|
      } finally { | 
						|
        f = t = 0; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    if (op[0] & 5) throw op[1]; | 
						|
    return { | 
						|
      value: op[0] ? op[1] : void 0, | 
						|
      done: true | 
						|
    }; | 
						|
  } | 
						|
} | 
						|
function __exportStar(m, exports) { | 
						|
  for (var p in m) { | 
						|
    if (!exports.hasOwnProperty(p)) exports[p] = m[p]; | 
						|
  } | 
						|
} | 
						|
function __values(o) { | 
						|
  var m = typeof Symbol === "function" && o[Symbol.iterator], | 
						|
      i = 0; | 
						|
  if (m) return m.call(o); | 
						|
  return { | 
						|
    next: function next() { | 
						|
      if (o && i >= o.length) o = void 0; | 
						|
      return { | 
						|
        value: o && o[i++], | 
						|
        done: !o | 
						|
      }; | 
						|
    } | 
						|
  }; | 
						|
} | 
						|
function __read(o, n) { | 
						|
  var m = typeof Symbol === "function" && o[Symbol.iterator]; | 
						|
  if (!m) return o; | 
						|
  var i = m.call(o), | 
						|
      r, | 
						|
      ar = [], | 
						|
      e; | 
						|
 | 
						|
  try { | 
						|
    while ((n === void 0 || n-- > 0) && !(r = i.next()).done) { | 
						|
      ar.push(r.value); | 
						|
    } | 
						|
  } catch (error) { | 
						|
    e = { | 
						|
      error: error | 
						|
    }; | 
						|
  } finally { | 
						|
    try { | 
						|
      if (r && !r.done && (m = i["return"])) m.call(i); | 
						|
    } finally { | 
						|
      if (e) throw e.error; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return ar; | 
						|
} | 
						|
function __spread() { | 
						|
  for (var ar = [], i = 0; i < arguments.length; i++) { | 
						|
    ar = ar.concat(__read(arguments[i])); | 
						|
  } | 
						|
 | 
						|
  return ar; | 
						|
} | 
						|
function __spreadArrays() { | 
						|
  for (var s = 0, i = 0, il = arguments.length; i < il; i++) { | 
						|
    s += arguments[i].length; | 
						|
  } | 
						|
 | 
						|
  for (var r = Array(s), k = 0, i = 0; i < il; i++) { | 
						|
    for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) { | 
						|
      r[k] = a[j]; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return r; | 
						|
} | 
						|
function __await(v) { | 
						|
  return this instanceof __await ? (this.v = v, this) : new __await(v); | 
						|
} | 
						|
function __asyncGenerator(thisArg, _arguments, generator) { | 
						|
  if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); | 
						|
  var g = generator.apply(thisArg, _arguments || []), | 
						|
      i, | 
						|
      q = []; | 
						|
  return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { | 
						|
    return this; | 
						|
  }, i; | 
						|
 | 
						|
  function verb(n) { | 
						|
    if (g[n]) i[n] = function (v) { | 
						|
      return new Promise(function (a, b) { | 
						|
        q.push([n, v, a, b]) > 1 || resume(n, v); | 
						|
      }); | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  function resume(n, v) { | 
						|
    try { | 
						|
      step(g[n](v)); | 
						|
    } catch (e) { | 
						|
      settle(q[0][3], e); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  function step(r) { | 
						|
    r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); | 
						|
  } | 
						|
 | 
						|
  function fulfill(value) { | 
						|
    resume("next", value); | 
						|
  } | 
						|
 | 
						|
  function reject(value) { | 
						|
    resume("throw", value); | 
						|
  } | 
						|
 | 
						|
  function settle(f, v) { | 
						|
    if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); | 
						|
  } | 
						|
} | 
						|
function __asyncDelegator(o) { | 
						|
  var i, p; | 
						|
  return i = {}, verb("next"), verb("throw", function (e) { | 
						|
    throw e; | 
						|
  }), verb("return"), i[Symbol.iterator] = function () { | 
						|
    return this; | 
						|
  }, i; | 
						|
 | 
						|
  function verb(n, f) { | 
						|
    i[n] = o[n] ? function (v) { | 
						|
      return (p = !p) ? { | 
						|
        value: __await(o[n](v)), | 
						|
        done: n === "return" | 
						|
      } : f ? f(v) : v; | 
						|
    } : f; | 
						|
  } | 
						|
} | 
						|
function __asyncValues(o) { | 
						|
  if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); | 
						|
  var m = o[Symbol.asyncIterator], | 
						|
      i; | 
						|
  return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { | 
						|
    return this; | 
						|
  }, i); | 
						|
 | 
						|
  function verb(n) { | 
						|
    i[n] = o[n] && function (v) { | 
						|
      return new Promise(function (resolve, reject) { | 
						|
        v = o[n](v), settle(resolve, reject, v.done, v.value); | 
						|
      }); | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  function settle(resolve, reject, d, v) { | 
						|
    Promise.resolve(v).then(function (v) { | 
						|
      resolve({ | 
						|
        value: v, | 
						|
        done: d | 
						|
      }); | 
						|
    }, reject); | 
						|
  } | 
						|
} | 
						|
function __makeTemplateObject(cooked, raw) { | 
						|
  if (Object.defineProperty) { | 
						|
    Object.defineProperty(cooked, "raw", { | 
						|
      value: raw | 
						|
    }); | 
						|
  } else { | 
						|
    cooked.raw = raw; | 
						|
  } | 
						|
 | 
						|
  return cooked; | 
						|
} | 
						|
function __importStar(mod) { | 
						|
  if (mod && mod.__esModule) return mod; | 
						|
  var result = {}; | 
						|
  if (mod != null) for (var k in mod) { | 
						|
    if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | 
						|
  } | 
						|
  result.default = mod; | 
						|
  return result; | 
						|
} | 
						|
function __importDefault(mod) { | 
						|
  return mod && mod.__esModule ? mod : { | 
						|
    default: mod | 
						|
  }; | 
						|
} | 
						|
 | 
						|
var tslib_es6 = /*#__PURE__*/Object.freeze({ | 
						|
  __proto__: null, | 
						|
  __extends: __extends, | 
						|
  get __assign () { return _assign; }, | 
						|
  __rest: __rest, | 
						|
  __decorate: __decorate, | 
						|
  __param: __param, | 
						|
  __metadata: __metadata, | 
						|
  __awaiter: __awaiter, | 
						|
  __generator: __generator, | 
						|
  __exportStar: __exportStar, | 
						|
  __values: __values, | 
						|
  __read: __read, | 
						|
  __spread: __spread, | 
						|
  __spreadArrays: __spreadArrays, | 
						|
  __await: __await, | 
						|
  __asyncGenerator: __asyncGenerator, | 
						|
  __asyncDelegator: __asyncDelegator, | 
						|
  __asyncValues: __asyncValues, | 
						|
  __makeTemplateObject: __makeTemplateObject, | 
						|
  __importStar: __importStar, | 
						|
  __importDefault: __importDefault | 
						|
}); | 
						|
 | 
						|
var api = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
  exports.apiDescriptor = { | 
						|
    key: function key(_key) { | 
						|
      return /^[$_a-zA-Z][$_a-zA-Z0-9]*$/.test(_key) ? _key : JSON.stringify(_key); | 
						|
    }, | 
						|
 | 
						|
    value(value) { | 
						|
      if (value === null || typeof value !== 'object') { | 
						|
        return JSON.stringify(value); | 
						|
      } | 
						|
 | 
						|
      if (Array.isArray(value)) { | 
						|
        return `[${value.map(function (subValue) { | 
						|
          return exports.apiDescriptor.value(subValue); | 
						|
        }).join(', ')}]`; | 
						|
      } | 
						|
 | 
						|
      var keys = Object.keys(value); | 
						|
      return keys.length === 0 ? '{}' : `{ ${keys.map(function (key) { | 
						|
        return `${exports.apiDescriptor.key(key)}: ${exports.apiDescriptor.value(value[key])}`; | 
						|
      }).join(', ')} }`; | 
						|
    }, | 
						|
 | 
						|
    pair: function pair(_ref) { | 
						|
      var key = _ref.key, | 
						|
          value = _ref.value; | 
						|
      return exports.apiDescriptor.value({ | 
						|
        [key]: value | 
						|
      }); | 
						|
    } | 
						|
  }; | 
						|
}); | 
						|
unwrapExports(api); | 
						|
var api_1 = api.apiDescriptor; | 
						|
 | 
						|
var descriptors = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
 | 
						|
  tslib_es6.__exportStar(api, exports); | 
						|
}); | 
						|
unwrapExports(descriptors); | 
						|
 | 
						|
var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; | 
						|
 | 
						|
var escapeStringRegexp = function escapeStringRegexp(str) { | 
						|
  if (typeof str !== 'string') { | 
						|
    throw new TypeError('Expected a string'); | 
						|
  } | 
						|
 | 
						|
  return str.replace(matchOperatorsRe, '\\$&'); | 
						|
}; | 
						|
 | 
						|
var colorName = { | 
						|
  "aliceblue": [240, 248, 255], | 
						|
  "antiquewhite": [250, 235, 215], | 
						|
  "aqua": [0, 255, 255], | 
						|
  "aquamarine": [127, 255, 212], | 
						|
  "azure": [240, 255, 255], | 
						|
  "beige": [245, 245, 220], | 
						|
  "bisque": [255, 228, 196], | 
						|
  "black": [0, 0, 0], | 
						|
  "blanchedalmond": [255, 235, 205], | 
						|
  "blue": [0, 0, 255], | 
						|
  "blueviolet": [138, 43, 226], | 
						|
  "brown": [165, 42, 42], | 
						|
  "burlywood": [222, 184, 135], | 
						|
  "cadetblue": [95, 158, 160], | 
						|
  "chartreuse": [127, 255, 0], | 
						|
  "chocolate": [210, 105, 30], | 
						|
  "coral": [255, 127, 80], | 
						|
  "cornflowerblue": [100, 149, 237], | 
						|
  "cornsilk": [255, 248, 220], | 
						|
  "crimson": [220, 20, 60], | 
						|
  "cyan": [0, 255, 255], | 
						|
  "darkblue": [0, 0, 139], | 
						|
  "darkcyan": [0, 139, 139], | 
						|
  "darkgoldenrod": [184, 134, 11], | 
						|
  "darkgray": [169, 169, 169], | 
						|
  "darkgreen": [0, 100, 0], | 
						|
  "darkgrey": [169, 169, 169], | 
						|
  "darkkhaki": [189, 183, 107], | 
						|
  "darkmagenta": [139, 0, 139], | 
						|
  "darkolivegreen": [85, 107, 47], | 
						|
  "darkorange": [255, 140, 0], | 
						|
  "darkorchid": [153, 50, 204], | 
						|
  "darkred": [139, 0, 0], | 
						|
  "darksalmon": [233, 150, 122], | 
						|
  "darkseagreen": [143, 188, 143], | 
						|
  "darkslateblue": [72, 61, 139], | 
						|
  "darkslategray": [47, 79, 79], | 
						|
  "darkslategrey": [47, 79, 79], | 
						|
  "darkturquoise": [0, 206, 209], | 
						|
  "darkviolet": [148, 0, 211], | 
						|
  "deeppink": [255, 20, 147], | 
						|
  "deepskyblue": [0, 191, 255], | 
						|
  "dimgray": [105, 105, 105], | 
						|
  "dimgrey": [105, 105, 105], | 
						|
  "dodgerblue": [30, 144, 255], | 
						|
  "firebrick": [178, 34, 34], | 
						|
  "floralwhite": [255, 250, 240], | 
						|
  "forestgreen": [34, 139, 34], | 
						|
  "fuchsia": [255, 0, 255], | 
						|
  "gainsboro": [220, 220, 220], | 
						|
  "ghostwhite": [248, 248, 255], | 
						|
  "gold": [255, 215, 0], | 
						|
  "goldenrod": [218, 165, 32], | 
						|
  "gray": [128, 128, 128], | 
						|
  "green": [0, 128, 0], | 
						|
  "greenyellow": [173, 255, 47], | 
						|
  "grey": [128, 128, 128], | 
						|
  "honeydew": [240, 255, 240], | 
						|
  "hotpink": [255, 105, 180], | 
						|
  "indianred": [205, 92, 92], | 
						|
  "indigo": [75, 0, 130], | 
						|
  "ivory": [255, 255, 240], | 
						|
  "khaki": [240, 230, 140], | 
						|
  "lavender": [230, 230, 250], | 
						|
  "lavenderblush": [255, 240, 245], | 
						|
  "lawngreen": [124, 252, 0], | 
						|
  "lemonchiffon": [255, 250, 205], | 
						|
  "lightblue": [173, 216, 230], | 
						|
  "lightcoral": [240, 128, 128], | 
						|
  "lightcyan": [224, 255, 255], | 
						|
  "lightgoldenrodyellow": [250, 250, 210], | 
						|
  "lightgray": [211, 211, 211], | 
						|
  "lightgreen": [144, 238, 144], | 
						|
  "lightgrey": [211, 211, 211], | 
						|
  "lightpink": [255, 182, 193], | 
						|
  "lightsalmon": [255, 160, 122], | 
						|
  "lightseagreen": [32, 178, 170], | 
						|
  "lightskyblue": [135, 206, 250], | 
						|
  "lightslategray": [119, 136, 153], | 
						|
  "lightslategrey": [119, 136, 153], | 
						|
  "lightsteelblue": [176, 196, 222], | 
						|
  "lightyellow": [255, 255, 224], | 
						|
  "lime": [0, 255, 0], | 
						|
  "limegreen": [50, 205, 50], | 
						|
  "linen": [250, 240, 230], | 
						|
  "magenta": [255, 0, 255], | 
						|
  "maroon": [128, 0, 0], | 
						|
  "mediumaquamarine": [102, 205, 170], | 
						|
  "mediumblue": [0, 0, 205], | 
						|
  "mediumorchid": [186, 85, 211], | 
						|
  "mediumpurple": [147, 112, 219], | 
						|
  "mediumseagreen": [60, 179, 113], | 
						|
  "mediumslateblue": [123, 104, 238], | 
						|
  "mediumspringgreen": [0, 250, 154], | 
						|
  "mediumturquoise": [72, 209, 204], | 
						|
  "mediumvioletred": [199, 21, 133], | 
						|
  "midnightblue": [25, 25, 112], | 
						|
  "mintcream": [245, 255, 250], | 
						|
  "mistyrose": [255, 228, 225], | 
						|
  "moccasin": [255, 228, 181], | 
						|
  "navajowhite": [255, 222, 173], | 
						|
  "navy": [0, 0, 128], | 
						|
  "oldlace": [253, 245, 230], | 
						|
  "olive": [128, 128, 0], | 
						|
  "olivedrab": [107, 142, 35], | 
						|
  "orange": [255, 165, 0], | 
						|
  "orangered": [255, 69, 0], | 
						|
  "orchid": [218, 112, 214], | 
						|
  "palegoldenrod": [238, 232, 170], | 
						|
  "palegreen": [152, 251, 152], | 
						|
  "paleturquoise": [175, 238, 238], | 
						|
  "palevioletred": [219, 112, 147], | 
						|
  "papayawhip": [255, 239, 213], | 
						|
  "peachpuff": [255, 218, 185], | 
						|
  "peru": [205, 133, 63], | 
						|
  "pink": [255, 192, 203], | 
						|
  "plum": [221, 160, 221], | 
						|
  "powderblue": [176, 224, 230], | 
						|
  "purple": [128, 0, 128], | 
						|
  "rebeccapurple": [102, 51, 153], | 
						|
  "red": [255, 0, 0], | 
						|
  "rosybrown": [188, 143, 143], | 
						|
  "royalblue": [65, 105, 225], | 
						|
  "saddlebrown": [139, 69, 19], | 
						|
  "salmon": [250, 128, 114], | 
						|
  "sandybrown": [244, 164, 96], | 
						|
  "seagreen": [46, 139, 87], | 
						|
  "seashell": [255, 245, 238], | 
						|
  "sienna": [160, 82, 45], | 
						|
  "silver": [192, 192, 192], | 
						|
  "skyblue": [135, 206, 235], | 
						|
  "slateblue": [106, 90, 205], | 
						|
  "slategray": [112, 128, 144], | 
						|
  "slategrey": [112, 128, 144], | 
						|
  "snow": [255, 250, 250], | 
						|
  "springgreen": [0, 255, 127], | 
						|
  "steelblue": [70, 130, 180], | 
						|
  "tan": [210, 180, 140], | 
						|
  "teal": [0, 128, 128], | 
						|
  "thistle": [216, 191, 216], | 
						|
  "tomato": [255, 99, 71], | 
						|
  "turquoise": [64, 224, 208], | 
						|
  "violet": [238, 130, 238], | 
						|
  "wheat": [245, 222, 179], | 
						|
  "white": [255, 255, 255], | 
						|
  "whitesmoke": [245, 245, 245], | 
						|
  "yellow": [255, 255, 0], | 
						|
  "yellowgreen": [154, 205, 50] | 
						|
}; | 
						|
 | 
						|
var conversions = createCommonjsModule(function (module) { | 
						|
  /* MIT license */ | 
						|
  // NOTE: conversions should only return primitive values (i.e. arrays, or | 
						|
  //       values that give correct `typeof` results). | 
						|
  //       do not use box values types (i.e. Number(), String(), etc.) | 
						|
  var reverseKeywords = {}; | 
						|
 | 
						|
  for (var key in colorName) { | 
						|
    if (colorName.hasOwnProperty(key)) { | 
						|
      reverseKeywords[colorName[key]] = key; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  var convert = module.exports = { | 
						|
    rgb: { | 
						|
      channels: 3, | 
						|
      labels: 'rgb' | 
						|
    }, | 
						|
    hsl: { | 
						|
      channels: 3, | 
						|
      labels: 'hsl' | 
						|
    }, | 
						|
    hsv: { | 
						|
      channels: 3, | 
						|
      labels: 'hsv' | 
						|
    }, | 
						|
    hwb: { | 
						|
      channels: 3, | 
						|
      labels: 'hwb' | 
						|
    }, | 
						|
    cmyk: { | 
						|
      channels: 4, | 
						|
      labels: 'cmyk' | 
						|
    }, | 
						|
    xyz: { | 
						|
      channels: 3, | 
						|
      labels: 'xyz' | 
						|
    }, | 
						|
    lab: { | 
						|
      channels: 3, | 
						|
      labels: 'lab' | 
						|
    }, | 
						|
    lch: { | 
						|
      channels: 3, | 
						|
      labels: 'lch' | 
						|
    }, | 
						|
    hex: { | 
						|
      channels: 1, | 
						|
      labels: ['hex'] | 
						|
    }, | 
						|
    keyword: { | 
						|
      channels: 1, | 
						|
      labels: ['keyword'] | 
						|
    }, | 
						|
    ansi16: { | 
						|
      channels: 1, | 
						|
      labels: ['ansi16'] | 
						|
    }, | 
						|
    ansi256: { | 
						|
      channels: 1, | 
						|
      labels: ['ansi256'] | 
						|
    }, | 
						|
    hcg: { | 
						|
      channels: 3, | 
						|
      labels: ['h', 'c', 'g'] | 
						|
    }, | 
						|
    apple: { | 
						|
      channels: 3, | 
						|
      labels: ['r16', 'g16', 'b16'] | 
						|
    }, | 
						|
    gray: { | 
						|
      channels: 1, | 
						|
      labels: ['gray'] | 
						|
    } | 
						|
  }; // hide .channels and .labels properties | 
						|
 | 
						|
  for (var model in convert) { | 
						|
    if (convert.hasOwnProperty(model)) { | 
						|
      if (!('channels' in convert[model])) { | 
						|
        throw new Error('missing channels property: ' + model); | 
						|
      } | 
						|
 | 
						|
      if (!('labels' in convert[model])) { | 
						|
        throw new Error('missing channel labels property: ' + model); | 
						|
      } | 
						|
 | 
						|
      if (convert[model].labels.length !== convert[model].channels) { | 
						|
        throw new Error('channel and label counts mismatch: ' + model); | 
						|
      } | 
						|
 | 
						|
      var channels = convert[model].channels; | 
						|
      var labels = convert[model].labels; | 
						|
      delete convert[model].channels; | 
						|
      delete convert[model].labels; | 
						|
      Object.defineProperty(convert[model], 'channels', { | 
						|
        value: channels | 
						|
      }); | 
						|
      Object.defineProperty(convert[model], 'labels', { | 
						|
        value: labels | 
						|
      }); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  convert.rgb.hsl = function (rgb) { | 
						|
    var r = rgb[0] / 255; | 
						|
    var g = rgb[1] / 255; | 
						|
    var b = rgb[2] / 255; | 
						|
    var min = Math.min(r, g, b); | 
						|
    var max = Math.max(r, g, b); | 
						|
    var delta = max - min; | 
						|
    var h; | 
						|
    var s; | 
						|
    var l; | 
						|
 | 
						|
    if (max === min) { | 
						|
      h = 0; | 
						|
    } else if (r === max) { | 
						|
      h = (g - b) / delta; | 
						|
    } else if (g === max) { | 
						|
      h = 2 + (b - r) / delta; | 
						|
    } else if (b === max) { | 
						|
      h = 4 + (r - g) / delta; | 
						|
    } | 
						|
 | 
						|
    h = Math.min(h * 60, 360); | 
						|
 | 
						|
    if (h < 0) { | 
						|
      h += 360; | 
						|
    } | 
						|
 | 
						|
    l = (min + max) / 2; | 
						|
 | 
						|
    if (max === min) { | 
						|
      s = 0; | 
						|
    } else if (l <= 0.5) { | 
						|
      s = delta / (max + min); | 
						|
    } else { | 
						|
      s = delta / (2 - max - min); | 
						|
    } | 
						|
 | 
						|
    return [h, s * 100, l * 100]; | 
						|
  }; | 
						|
 | 
						|
  convert.rgb.hsv = function (rgb) { | 
						|
    var r = rgb[0]; | 
						|
    var g = rgb[1]; | 
						|
    var b = rgb[2]; | 
						|
    var min = Math.min(r, g, b); | 
						|
    var max = Math.max(r, g, b); | 
						|
    var delta = max - min; | 
						|
    var h; | 
						|
    var s; | 
						|
    var v; | 
						|
 | 
						|
    if (max === 0) { | 
						|
      s = 0; | 
						|
    } else { | 
						|
      s = delta / max * 1000 / 10; | 
						|
    } | 
						|
 | 
						|
    if (max === min) { | 
						|
      h = 0; | 
						|
    } else if (r === max) { | 
						|
      h = (g - b) / delta; | 
						|
    } else if (g === max) { | 
						|
      h = 2 + (b - r) / delta; | 
						|
    } else if (b === max) { | 
						|
      h = 4 + (r - g) / delta; | 
						|
    } | 
						|
 | 
						|
    h = Math.min(h * 60, 360); | 
						|
 | 
						|
    if (h < 0) { | 
						|
      h += 360; | 
						|
    } | 
						|
 | 
						|
    v = max / 255 * 1000 / 10; | 
						|
    return [h, s, v]; | 
						|
  }; | 
						|
 | 
						|
  convert.rgb.hwb = function (rgb) { | 
						|
    var r = rgb[0]; | 
						|
    var g = rgb[1]; | 
						|
    var b = rgb[2]; | 
						|
    var h = convert.rgb.hsl(rgb)[0]; | 
						|
    var w = 1 / 255 * Math.min(r, Math.min(g, b)); | 
						|
    b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); | 
						|
    return [h, w * 100, b * 100]; | 
						|
  }; | 
						|
 | 
						|
  convert.rgb.cmyk = function (rgb) { | 
						|
    var r = rgb[0] / 255; | 
						|
    var g = rgb[1] / 255; | 
						|
    var b = rgb[2] / 255; | 
						|
    var c; | 
						|
    var m; | 
						|
    var y; | 
						|
    var k; | 
						|
    k = Math.min(1 - r, 1 - g, 1 - b); | 
						|
    c = (1 - r - k) / (1 - k) || 0; | 
						|
    m = (1 - g - k) / (1 - k) || 0; | 
						|
    y = (1 - b - k) / (1 - k) || 0; | 
						|
    return [c * 100, m * 100, y * 100, k * 100]; | 
						|
  }; | 
						|
  /** | 
						|
   * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance | 
						|
   * */ | 
						|
 | 
						|
 | 
						|
  function comparativeDistance(x, y) { | 
						|
    return Math.pow(x[0] - y[0], 2) + Math.pow(x[1] - y[1], 2) + Math.pow(x[2] - y[2], 2); | 
						|
  } | 
						|
 | 
						|
  convert.rgb.keyword = function (rgb) { | 
						|
    var reversed = reverseKeywords[rgb]; | 
						|
 | 
						|
    if (reversed) { | 
						|
      return reversed; | 
						|
    } | 
						|
 | 
						|
    var currentClosestDistance = Infinity; | 
						|
    var currentClosestKeyword; | 
						|
 | 
						|
    for (var keyword in colorName) { | 
						|
      if (colorName.hasOwnProperty(keyword)) { | 
						|
        var value = colorName[keyword]; // Compute comparative distance | 
						|
 | 
						|
        var distance = comparativeDistance(rgb, value); // Check if its less, if so set as closest | 
						|
 | 
						|
        if (distance < currentClosestDistance) { | 
						|
          currentClosestDistance = distance; | 
						|
          currentClosestKeyword = keyword; | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return currentClosestKeyword; | 
						|
  }; | 
						|
 | 
						|
  convert.keyword.rgb = function (keyword) { | 
						|
    return colorName[keyword]; | 
						|
  }; | 
						|
 | 
						|
  convert.rgb.xyz = function (rgb) { | 
						|
    var r = rgb[0] / 255; | 
						|
    var g = rgb[1] / 255; | 
						|
    var b = rgb[2] / 255; // assume sRGB | 
						|
 | 
						|
    r = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92; | 
						|
    g = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92; | 
						|
    b = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92; | 
						|
    var x = r * 0.4124 + g * 0.3576 + b * 0.1805; | 
						|
    var y = r * 0.2126 + g * 0.7152 + b * 0.0722; | 
						|
    var z = r * 0.0193 + g * 0.1192 + b * 0.9505; | 
						|
    return [x * 100, y * 100, z * 100]; | 
						|
  }; | 
						|
 | 
						|
  convert.rgb.lab = function (rgb) { | 
						|
    var xyz = convert.rgb.xyz(rgb); | 
						|
    var x = xyz[0]; | 
						|
    var y = xyz[1]; | 
						|
    var z = xyz[2]; | 
						|
    var l; | 
						|
    var a; | 
						|
    var b; | 
						|
    x /= 95.047; | 
						|
    y /= 100; | 
						|
    z /= 108.883; | 
						|
    x = x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787 * x + 16 / 116; | 
						|
    y = y > 0.008856 ? Math.pow(y, 1 / 3) : 7.787 * y + 16 / 116; | 
						|
    z = z > 0.008856 ? Math.pow(z, 1 / 3) : 7.787 * z + 16 / 116; | 
						|
    l = 116 * y - 16; | 
						|
    a = 500 * (x - y); | 
						|
    b = 200 * (y - z); | 
						|
    return [l, a, b]; | 
						|
  }; | 
						|
 | 
						|
  convert.hsl.rgb = function (hsl) { | 
						|
    var h = hsl[0] / 360; | 
						|
    var s = hsl[1] / 100; | 
						|
    var l = hsl[2] / 100; | 
						|
    var t1; | 
						|
    var t2; | 
						|
    var t3; | 
						|
    var rgb; | 
						|
    var val; | 
						|
 | 
						|
    if (s === 0) { | 
						|
      val = l * 255; | 
						|
      return [val, val, val]; | 
						|
    } | 
						|
 | 
						|
    if (l < 0.5) { | 
						|
      t2 = l * (1 + s); | 
						|
    } else { | 
						|
      t2 = l + s - l * s; | 
						|
    } | 
						|
 | 
						|
    t1 = 2 * l - t2; | 
						|
    rgb = [0, 0, 0]; | 
						|
 | 
						|
    for (var i = 0; i < 3; i++) { | 
						|
      t3 = h + 1 / 3 * -(i - 1); | 
						|
 | 
						|
      if (t3 < 0) { | 
						|
        t3++; | 
						|
      } | 
						|
 | 
						|
      if (t3 > 1) { | 
						|
        t3--; | 
						|
      } | 
						|
 | 
						|
      if (6 * t3 < 1) { | 
						|
        val = t1 + (t2 - t1) * 6 * t3; | 
						|
      } else if (2 * t3 < 1) { | 
						|
        val = t2; | 
						|
      } else if (3 * t3 < 2) { | 
						|
        val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; | 
						|
      } else { | 
						|
        val = t1; | 
						|
      } | 
						|
 | 
						|
      rgb[i] = val * 255; | 
						|
    } | 
						|
 | 
						|
    return rgb; | 
						|
  }; | 
						|
 | 
						|
  convert.hsl.hsv = function (hsl) { | 
						|
    var h = hsl[0]; | 
						|
    var s = hsl[1] / 100; | 
						|
    var l = hsl[2] / 100; | 
						|
    var smin = s; | 
						|
    var lmin = Math.max(l, 0.01); | 
						|
    var sv; | 
						|
    var v; | 
						|
    l *= 2; | 
						|
    s *= l <= 1 ? l : 2 - l; | 
						|
    smin *= lmin <= 1 ? lmin : 2 - lmin; | 
						|
    v = (l + s) / 2; | 
						|
    sv = l === 0 ? 2 * smin / (lmin + smin) : 2 * s / (l + s); | 
						|
    return [h, sv * 100, v * 100]; | 
						|
  }; | 
						|
 | 
						|
  convert.hsv.rgb = function (hsv) { | 
						|
    var h = hsv[0] / 60; | 
						|
    var s = hsv[1] / 100; | 
						|
    var v = hsv[2] / 100; | 
						|
    var hi = Math.floor(h) % 6; | 
						|
    var f = h - Math.floor(h); | 
						|
    var p = 255 * v * (1 - s); | 
						|
    var q = 255 * v * (1 - s * f); | 
						|
    var t = 255 * v * (1 - s * (1 - f)); | 
						|
    v *= 255; | 
						|
 | 
						|
    switch (hi) { | 
						|
      case 0: | 
						|
        return [v, t, p]; | 
						|
 | 
						|
      case 1: | 
						|
        return [q, v, p]; | 
						|
 | 
						|
      case 2: | 
						|
        return [p, v, t]; | 
						|
 | 
						|
      case 3: | 
						|
        return [p, q, v]; | 
						|
 | 
						|
      case 4: | 
						|
        return [t, p, v]; | 
						|
 | 
						|
      case 5: | 
						|
        return [v, p, q]; | 
						|
    } | 
						|
  }; | 
						|
 | 
						|
  convert.hsv.hsl = function (hsv) { | 
						|
    var h = hsv[0]; | 
						|
    var s = hsv[1] / 100; | 
						|
    var v = hsv[2] / 100; | 
						|
    var vmin = Math.max(v, 0.01); | 
						|
    var lmin; | 
						|
    var sl; | 
						|
    var l; | 
						|
    l = (2 - s) * v; | 
						|
    lmin = (2 - s) * vmin; | 
						|
    sl = s * vmin; | 
						|
    sl /= lmin <= 1 ? lmin : 2 - lmin; | 
						|
    sl = sl || 0; | 
						|
    l /= 2; | 
						|
    return [h, sl * 100, l * 100]; | 
						|
  }; // http://dev.w3.org/csswg/css-color/#hwb-to-rgb | 
						|
 | 
						|
 | 
						|
  convert.hwb.rgb = function (hwb) { | 
						|
    var h = hwb[0] / 360; | 
						|
    var wh = hwb[1] / 100; | 
						|
    var bl = hwb[2] / 100; | 
						|
    var ratio = wh + bl; | 
						|
    var i; | 
						|
    var v; | 
						|
    var f; | 
						|
    var n; // wh + bl cant be > 1 | 
						|
 | 
						|
    if (ratio > 1) { | 
						|
      wh /= ratio; | 
						|
      bl /= ratio; | 
						|
    } | 
						|
 | 
						|
    i = Math.floor(6 * h); | 
						|
    v = 1 - bl; | 
						|
    f = 6 * h - i; | 
						|
 | 
						|
    if ((i & 0x01) !== 0) { | 
						|
      f = 1 - f; | 
						|
    } | 
						|
 | 
						|
    n = wh + f * (v - wh); // linear interpolation | 
						|
 | 
						|
    var r; | 
						|
    var g; | 
						|
    var b; | 
						|
 | 
						|
    switch (i) { | 
						|
      default: | 
						|
      case 6: | 
						|
      case 0: | 
						|
        r = v; | 
						|
        g = n; | 
						|
        b = wh; | 
						|
        break; | 
						|
 | 
						|
      case 1: | 
						|
        r = n; | 
						|
        g = v; | 
						|
        b = wh; | 
						|
        break; | 
						|
 | 
						|
      case 2: | 
						|
        r = wh; | 
						|
        g = v; | 
						|
        b = n; | 
						|
        break; | 
						|
 | 
						|
      case 3: | 
						|
        r = wh; | 
						|
        g = n; | 
						|
        b = v; | 
						|
        break; | 
						|
 | 
						|
      case 4: | 
						|
        r = n; | 
						|
        g = wh; | 
						|
        b = v; | 
						|
        break; | 
						|
 | 
						|
      case 5: | 
						|
        r = v; | 
						|
        g = wh; | 
						|
        b = n; | 
						|
        break; | 
						|
    } | 
						|
 | 
						|
    return [r * 255, g * 255, b * 255]; | 
						|
  }; | 
						|
 | 
						|
  convert.cmyk.rgb = function (cmyk) { | 
						|
    var c = cmyk[0] / 100; | 
						|
    var m = cmyk[1] / 100; | 
						|
    var y = cmyk[2] / 100; | 
						|
    var k = cmyk[3] / 100; | 
						|
    var r; | 
						|
    var g; | 
						|
    var b; | 
						|
    r = 1 - Math.min(1, c * (1 - k) + k); | 
						|
    g = 1 - Math.min(1, m * (1 - k) + k); | 
						|
    b = 1 - Math.min(1, y * (1 - k) + k); | 
						|
    return [r * 255, g * 255, b * 255]; | 
						|
  }; | 
						|
 | 
						|
  convert.xyz.rgb = function (xyz) { | 
						|
    var x = xyz[0] / 100; | 
						|
    var y = xyz[1] / 100; | 
						|
    var z = xyz[2] / 100; | 
						|
    var r; | 
						|
    var g; | 
						|
    var b; | 
						|
    r = x * 3.2406 + y * -1.5372 + z * -0.4986; | 
						|
    g = x * -0.9689 + y * 1.8758 + z * 0.0415; | 
						|
    b = x * 0.0557 + y * -0.2040 + z * 1.0570; // assume sRGB | 
						|
 | 
						|
    r = r > 0.0031308 ? 1.055 * Math.pow(r, 1.0 / 2.4) - 0.055 : r * 12.92; | 
						|
    g = g > 0.0031308 ? 1.055 * Math.pow(g, 1.0 / 2.4) - 0.055 : g * 12.92; | 
						|
    b = b > 0.0031308 ? 1.055 * Math.pow(b, 1.0 / 2.4) - 0.055 : b * 12.92; | 
						|
    r = Math.min(Math.max(0, r), 1); | 
						|
    g = Math.min(Math.max(0, g), 1); | 
						|
    b = Math.min(Math.max(0, b), 1); | 
						|
    return [r * 255, g * 255, b * 255]; | 
						|
  }; | 
						|
 | 
						|
  convert.xyz.lab = function (xyz) { | 
						|
    var x = xyz[0]; | 
						|
    var y = xyz[1]; | 
						|
    var z = xyz[2]; | 
						|
    var l; | 
						|
    var a; | 
						|
    var b; | 
						|
    x /= 95.047; | 
						|
    y /= 100; | 
						|
    z /= 108.883; | 
						|
    x = x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787 * x + 16 / 116; | 
						|
    y = y > 0.008856 ? Math.pow(y, 1 / 3) : 7.787 * y + 16 / 116; | 
						|
    z = z > 0.008856 ? Math.pow(z, 1 / 3) : 7.787 * z + 16 / 116; | 
						|
    l = 116 * y - 16; | 
						|
    a = 500 * (x - y); | 
						|
    b = 200 * (y - z); | 
						|
    return [l, a, b]; | 
						|
  }; | 
						|
 | 
						|
  convert.lab.xyz = function (lab) { | 
						|
    var l = lab[0]; | 
						|
    var a = lab[1]; | 
						|
    var b = lab[2]; | 
						|
    var x; | 
						|
    var y; | 
						|
    var z; | 
						|
    y = (l + 16) / 116; | 
						|
    x = a / 500 + y; | 
						|
    z = y - b / 200; | 
						|
    var y2 = Math.pow(y, 3); | 
						|
    var x2 = Math.pow(x, 3); | 
						|
    var z2 = Math.pow(z, 3); | 
						|
    y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787; | 
						|
    x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787; | 
						|
    z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787; | 
						|
    x *= 95.047; | 
						|
    y *= 100; | 
						|
    z *= 108.883; | 
						|
    return [x, y, z]; | 
						|
  }; | 
						|
 | 
						|
  convert.lab.lch = function (lab) { | 
						|
    var l = lab[0]; | 
						|
    var a = lab[1]; | 
						|
    var b = lab[2]; | 
						|
    var hr; | 
						|
    var h; | 
						|
    var c; | 
						|
    hr = Math.atan2(b, a); | 
						|
    h = hr * 360 / 2 / Math.PI; | 
						|
 | 
						|
    if (h < 0) { | 
						|
      h += 360; | 
						|
    } | 
						|
 | 
						|
    c = Math.sqrt(a * a + b * b); | 
						|
    return [l, c, h]; | 
						|
  }; | 
						|
 | 
						|
  convert.lch.lab = function (lch) { | 
						|
    var l = lch[0]; | 
						|
    var c = lch[1]; | 
						|
    var h = lch[2]; | 
						|
    var a; | 
						|
    var b; | 
						|
    var hr; | 
						|
    hr = h / 360 * 2 * Math.PI; | 
						|
    a = c * Math.cos(hr); | 
						|
    b = c * Math.sin(hr); | 
						|
    return [l, a, b]; | 
						|
  }; | 
						|
 | 
						|
  convert.rgb.ansi16 = function (args) { | 
						|
    var r = args[0]; | 
						|
    var g = args[1]; | 
						|
    var b = args[2]; | 
						|
    var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization | 
						|
 | 
						|
    value = Math.round(value / 50); | 
						|
 | 
						|
    if (value === 0) { | 
						|
      return 30; | 
						|
    } | 
						|
 | 
						|
    var ansi = 30 + (Math.round(b / 255) << 2 | Math.round(g / 255) << 1 | Math.round(r / 255)); | 
						|
 | 
						|
    if (value === 2) { | 
						|
      ansi += 60; | 
						|
    } | 
						|
 | 
						|
    return ansi; | 
						|
  }; | 
						|
 | 
						|
  convert.hsv.ansi16 = function (args) { | 
						|
    // optimization here; we already know the value and don't need to get | 
						|
    // it converted for us. | 
						|
    return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]); | 
						|
  }; | 
						|
 | 
						|
  convert.rgb.ansi256 = function (args) { | 
						|
    var r = args[0]; | 
						|
    var g = args[1]; | 
						|
    var b = args[2]; // we use the extended greyscale palette here, with the exception of | 
						|
    // black and white. normal palette only has 4 greyscale shades. | 
						|
 | 
						|
    if (r === g && g === b) { | 
						|
      if (r < 8) { | 
						|
        return 16; | 
						|
      } | 
						|
 | 
						|
      if (r > 248) { | 
						|
        return 231; | 
						|
      } | 
						|
 | 
						|
      return Math.round((r - 8) / 247 * 24) + 232; | 
						|
    } | 
						|
 | 
						|
    var ansi = 16 + 36 * Math.round(r / 255 * 5) + 6 * Math.round(g / 255 * 5) + Math.round(b / 255 * 5); | 
						|
    return ansi; | 
						|
  }; | 
						|
 | 
						|
  convert.ansi16.rgb = function (args) { | 
						|
    var color = args % 10; // handle greyscale | 
						|
 | 
						|
    if (color === 0 || color === 7) { | 
						|
      if (args > 50) { | 
						|
        color += 3.5; | 
						|
      } | 
						|
 | 
						|
      color = color / 10.5 * 255; | 
						|
      return [color, color, color]; | 
						|
    } | 
						|
 | 
						|
    var mult = (~~(args > 50) + 1) * 0.5; | 
						|
    var r = (color & 1) * mult * 255; | 
						|
    var g = (color >> 1 & 1) * mult * 255; | 
						|
    var b = (color >> 2 & 1) * mult * 255; | 
						|
    return [r, g, b]; | 
						|
  }; | 
						|
 | 
						|
  convert.ansi256.rgb = function (args) { | 
						|
    // handle greyscale | 
						|
    if (args >= 232) { | 
						|
      var c = (args - 232) * 10 + 8; | 
						|
      return [c, c, c]; | 
						|
    } | 
						|
 | 
						|
    args -= 16; | 
						|
    var rem; | 
						|
    var r = Math.floor(args / 36) / 5 * 255; | 
						|
    var g = Math.floor((rem = args % 36) / 6) / 5 * 255; | 
						|
    var b = rem % 6 / 5 * 255; | 
						|
    return [r, g, b]; | 
						|
  }; | 
						|
 | 
						|
  convert.rgb.hex = function (args) { | 
						|
    var integer = ((Math.round(args[0]) & 0xFF) << 16) + ((Math.round(args[1]) & 0xFF) << 8) + (Math.round(args[2]) & 0xFF); | 
						|
    var string = integer.toString(16).toUpperCase(); | 
						|
    return '000000'.substring(string.length) + string; | 
						|
  }; | 
						|
 | 
						|
  convert.hex.rgb = function (args) { | 
						|
    var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); | 
						|
 | 
						|
    if (!match) { | 
						|
      return [0, 0, 0]; | 
						|
    } | 
						|
 | 
						|
    var colorString = match[0]; | 
						|
 | 
						|
    if (match[0].length === 3) { | 
						|
      colorString = colorString.split('').map(function (char) { | 
						|
        return char + char; | 
						|
      }).join(''); | 
						|
    } | 
						|
 | 
						|
    var integer = parseInt(colorString, 16); | 
						|
    var r = integer >> 16 & 0xFF; | 
						|
    var g = integer >> 8 & 0xFF; | 
						|
    var b = integer & 0xFF; | 
						|
    return [r, g, b]; | 
						|
  }; | 
						|
 | 
						|
  convert.rgb.hcg = function (rgb) { | 
						|
    var r = rgb[0] / 255; | 
						|
    var g = rgb[1] / 255; | 
						|
    var b = rgb[2] / 255; | 
						|
    var max = Math.max(Math.max(r, g), b); | 
						|
    var min = Math.min(Math.min(r, g), b); | 
						|
    var chroma = max - min; | 
						|
    var grayscale; | 
						|
    var hue; | 
						|
 | 
						|
    if (chroma < 1) { | 
						|
      grayscale = min / (1 - chroma); | 
						|
    } else { | 
						|
      grayscale = 0; | 
						|
    } | 
						|
 | 
						|
    if (chroma <= 0) { | 
						|
      hue = 0; | 
						|
    } else if (max === r) { | 
						|
      hue = (g - b) / chroma % 6; | 
						|
    } else if (max === g) { | 
						|
      hue = 2 + (b - r) / chroma; | 
						|
    } else { | 
						|
      hue = 4 + (r - g) / chroma + 4; | 
						|
    } | 
						|
 | 
						|
    hue /= 6; | 
						|
    hue %= 1; | 
						|
    return [hue * 360, chroma * 100, grayscale * 100]; | 
						|
  }; | 
						|
 | 
						|
  convert.hsl.hcg = function (hsl) { | 
						|
    var s = hsl[1] / 100; | 
						|
    var l = hsl[2] / 100; | 
						|
    var c = 1; | 
						|
    var f = 0; | 
						|
 | 
						|
    if (l < 0.5) { | 
						|
      c = 2.0 * s * l; | 
						|
    } else { | 
						|
      c = 2.0 * s * (1.0 - l); | 
						|
    } | 
						|
 | 
						|
    if (c < 1.0) { | 
						|
      f = (l - 0.5 * c) / (1.0 - c); | 
						|
    } | 
						|
 | 
						|
    return [hsl[0], c * 100, f * 100]; | 
						|
  }; | 
						|
 | 
						|
  convert.hsv.hcg = function (hsv) { | 
						|
    var s = hsv[1] / 100; | 
						|
    var v = hsv[2] / 100; | 
						|
    var c = s * v; | 
						|
    var f = 0; | 
						|
 | 
						|
    if (c < 1.0) { | 
						|
      f = (v - c) / (1 - c); | 
						|
    } | 
						|
 | 
						|
    return [hsv[0], c * 100, f * 100]; | 
						|
  }; | 
						|
 | 
						|
  convert.hcg.rgb = function (hcg) { | 
						|
    var h = hcg[0] / 360; | 
						|
    var c = hcg[1] / 100; | 
						|
    var g = hcg[2] / 100; | 
						|
 | 
						|
    if (c === 0.0) { | 
						|
      return [g * 255, g * 255, g * 255]; | 
						|
    } | 
						|
 | 
						|
    var pure = [0, 0, 0]; | 
						|
    var hi = h % 1 * 6; | 
						|
    var v = hi % 1; | 
						|
    var w = 1 - v; | 
						|
    var mg = 0; | 
						|
 | 
						|
    switch (Math.floor(hi)) { | 
						|
      case 0: | 
						|
        pure[0] = 1; | 
						|
        pure[1] = v; | 
						|
        pure[2] = 0; | 
						|
        break; | 
						|
 | 
						|
      case 1: | 
						|
        pure[0] = w; | 
						|
        pure[1] = 1; | 
						|
        pure[2] = 0; | 
						|
        break; | 
						|
 | 
						|
      case 2: | 
						|
        pure[0] = 0; | 
						|
        pure[1] = 1; | 
						|
        pure[2] = v; | 
						|
        break; | 
						|
 | 
						|
      case 3: | 
						|
        pure[0] = 0; | 
						|
        pure[1] = w; | 
						|
        pure[2] = 1; | 
						|
        break; | 
						|
 | 
						|
      case 4: | 
						|
        pure[0] = v; | 
						|
        pure[1] = 0; | 
						|
        pure[2] = 1; | 
						|
        break; | 
						|
 | 
						|
      default: | 
						|
        pure[0] = 1; | 
						|
        pure[1] = 0; | 
						|
        pure[2] = w; | 
						|
    } | 
						|
 | 
						|
    mg = (1.0 - c) * g; | 
						|
    return [(c * pure[0] + mg) * 255, (c * pure[1] + mg) * 255, (c * pure[2] + mg) * 255]; | 
						|
  }; | 
						|
 | 
						|
  convert.hcg.hsv = function (hcg) { | 
						|
    var c = hcg[1] / 100; | 
						|
    var g = hcg[2] / 100; | 
						|
    var v = c + g * (1.0 - c); | 
						|
    var f = 0; | 
						|
 | 
						|
    if (v > 0.0) { | 
						|
      f = c / v; | 
						|
    } | 
						|
 | 
						|
    return [hcg[0], f * 100, v * 100]; | 
						|
  }; | 
						|
 | 
						|
  convert.hcg.hsl = function (hcg) { | 
						|
    var c = hcg[1] / 100; | 
						|
    var g = hcg[2] / 100; | 
						|
    var l = g * (1.0 - c) + 0.5 * c; | 
						|
    var s = 0; | 
						|
 | 
						|
    if (l > 0.0 && l < 0.5) { | 
						|
      s = c / (2 * l); | 
						|
    } else if (l >= 0.5 && l < 1.0) { | 
						|
      s = c / (2 * (1 - l)); | 
						|
    } | 
						|
 | 
						|
    return [hcg[0], s * 100, l * 100]; | 
						|
  }; | 
						|
 | 
						|
  convert.hcg.hwb = function (hcg) { | 
						|
    var c = hcg[1] / 100; | 
						|
    var g = hcg[2] / 100; | 
						|
    var v = c + g * (1.0 - c); | 
						|
    return [hcg[0], (v - c) * 100, (1 - v) * 100]; | 
						|
  }; | 
						|
 | 
						|
  convert.hwb.hcg = function (hwb) { | 
						|
    var w = hwb[1] / 100; | 
						|
    var b = hwb[2] / 100; | 
						|
    var v = 1 - b; | 
						|
    var c = v - w; | 
						|
    var g = 0; | 
						|
 | 
						|
    if (c < 1) { | 
						|
      g = (v - c) / (1 - c); | 
						|
    } | 
						|
 | 
						|
    return [hwb[0], c * 100, g * 100]; | 
						|
  }; | 
						|
 | 
						|
  convert.apple.rgb = function (apple) { | 
						|
    return [apple[0] / 65535 * 255, apple[1] / 65535 * 255, apple[2] / 65535 * 255]; | 
						|
  }; | 
						|
 | 
						|
  convert.rgb.apple = function (rgb) { | 
						|
    return [rgb[0] / 255 * 65535, rgb[1] / 255 * 65535, rgb[2] / 255 * 65535]; | 
						|
  }; | 
						|
 | 
						|
  convert.gray.rgb = function (args) { | 
						|
    return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255]; | 
						|
  }; | 
						|
 | 
						|
  convert.gray.hsl = convert.gray.hsv = function (args) { | 
						|
    return [0, 0, args[0]]; | 
						|
  }; | 
						|
 | 
						|
  convert.gray.hwb = function (gray) { | 
						|
    return [0, 100, gray[0]]; | 
						|
  }; | 
						|
 | 
						|
  convert.gray.cmyk = function (gray) { | 
						|
    return [0, 0, 0, gray[0]]; | 
						|
  }; | 
						|
 | 
						|
  convert.gray.lab = function (gray) { | 
						|
    return [gray[0], 0, 0]; | 
						|
  }; | 
						|
 | 
						|
  convert.gray.hex = function (gray) { | 
						|
    var val = Math.round(gray[0] / 100 * 255) & 0xFF; | 
						|
    var integer = (val << 16) + (val << 8) + val; | 
						|
    var string = integer.toString(16).toUpperCase(); | 
						|
    return '000000'.substring(string.length) + string; | 
						|
  }; | 
						|
 | 
						|
  convert.rgb.gray = function (rgb) { | 
						|
    var val = (rgb[0] + rgb[1] + rgb[2]) / 3; | 
						|
    return [val / 255 * 100]; | 
						|
  }; | 
						|
}); | 
						|
var conversions_1 = conversions.rgb; | 
						|
var conversions_2 = conversions.hsl; | 
						|
var conversions_3 = conversions.hsv; | 
						|
var conversions_4 = conversions.hwb; | 
						|
var conversions_5 = conversions.cmyk; | 
						|
var conversions_6 = conversions.xyz; | 
						|
var conversions_7 = conversions.lab; | 
						|
var conversions_8 = conversions.lch; | 
						|
var conversions_9 = conversions.hex; | 
						|
var conversions_10 = conversions.keyword; | 
						|
var conversions_11 = conversions.ansi16; | 
						|
var conversions_12 = conversions.ansi256; | 
						|
var conversions_13 = conversions.hcg; | 
						|
var conversions_14 = conversions.apple; | 
						|
var conversions_15 = conversions.gray; | 
						|
 | 
						|
/* | 
						|
	this function routes a model to all other models. | 
						|
 | 
						|
	all functions that are routed have a property `.conversion` attached | 
						|
	to the returned synthetic function. This property is an array | 
						|
	of strings, each with the steps in between the 'from' and 'to' | 
						|
	color models (inclusive). | 
						|
 | 
						|
	conversions that are not possible simply are not included. | 
						|
*/ | 
						|
// https://jsperf.com/object-keys-vs-for-in-with-closure/3 | 
						|
 | 
						|
var models = Object.keys(conversions); | 
						|
 | 
						|
function buildGraph() { | 
						|
  var graph = {}; | 
						|
 | 
						|
  for (var len = models.length, i = 0; i < len; i++) { | 
						|
    graph[models[i]] = { | 
						|
      // http://jsperf.com/1-vs-infinity | 
						|
      // micro-opt, but this is simple. | 
						|
      distance: -1, | 
						|
      parent: null | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  return graph; | 
						|
} // https://en.wikipedia.org/wiki/Breadth-first_search | 
						|
 | 
						|
 | 
						|
function deriveBFS(fromModel) { | 
						|
  var graph = buildGraph(); | 
						|
  var queue = [fromModel]; // unshift -> queue -> pop | 
						|
 | 
						|
  graph[fromModel].distance = 0; | 
						|
 | 
						|
  while (queue.length) { | 
						|
    var current = queue.pop(); | 
						|
    var adjacents = Object.keys(conversions[current]); | 
						|
 | 
						|
    for (var len = adjacents.length, i = 0; i < len; i++) { | 
						|
      var adjacent = adjacents[i]; | 
						|
      var node = graph[adjacent]; | 
						|
 | 
						|
      if (node.distance === -1) { | 
						|
        node.distance = graph[current].distance + 1; | 
						|
        node.parent = current; | 
						|
        queue.unshift(adjacent); | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return graph; | 
						|
} | 
						|
 | 
						|
function link(from, to) { | 
						|
  return function (args) { | 
						|
    return to(from(args)); | 
						|
  }; | 
						|
} | 
						|
 | 
						|
function wrapConversion(toModel, graph) { | 
						|
  var path = [graph[toModel].parent, toModel]; | 
						|
  var fn = conversions[graph[toModel].parent][toModel]; | 
						|
  var cur = graph[toModel].parent; | 
						|
 | 
						|
  while (graph[cur].parent) { | 
						|
    path.unshift(graph[cur].parent); | 
						|
    fn = link(conversions[graph[cur].parent][cur], fn); | 
						|
    cur = graph[cur].parent; | 
						|
  } | 
						|
 | 
						|
  fn.conversion = path; | 
						|
  return fn; | 
						|
} | 
						|
 | 
						|
var route = function route(fromModel) { | 
						|
  var graph = deriveBFS(fromModel); | 
						|
  var conversion = {}; | 
						|
  var models = Object.keys(graph); | 
						|
 | 
						|
  for (var len = models.length, i = 0; i < len; i++) { | 
						|
    var toModel = models[i]; | 
						|
    var node = graph[toModel]; | 
						|
 | 
						|
    if (node.parent === null) { | 
						|
      // no possible conversion, or this node is the source model. | 
						|
      continue; | 
						|
    } | 
						|
 | 
						|
    conversion[toModel] = wrapConversion(toModel, graph); | 
						|
  } | 
						|
 | 
						|
  return conversion; | 
						|
}; | 
						|
 | 
						|
var convert = {}; | 
						|
var models$1 = Object.keys(conversions); | 
						|
 | 
						|
function wrapRaw(fn) { | 
						|
  var wrappedFn = function wrappedFn(args) { | 
						|
    if (args === undefined || args === null) { | 
						|
      return args; | 
						|
    } | 
						|
 | 
						|
    if (arguments.length > 1) { | 
						|
      args = Array.prototype.slice.call(arguments); | 
						|
    } | 
						|
 | 
						|
    return fn(args); | 
						|
  }; // preserve .conversion property if there is one | 
						|
 | 
						|
 | 
						|
  if ('conversion' in fn) { | 
						|
    wrappedFn.conversion = fn.conversion; | 
						|
  } | 
						|
 | 
						|
  return wrappedFn; | 
						|
} | 
						|
 | 
						|
function wrapRounded(fn) { | 
						|
  var wrappedFn = function wrappedFn(args) { | 
						|
    if (args === undefined || args === null) { | 
						|
      return args; | 
						|
    } | 
						|
 | 
						|
    if (arguments.length > 1) { | 
						|
      args = Array.prototype.slice.call(arguments); | 
						|
    } | 
						|
 | 
						|
    var result = fn(args); // we're assuming the result is an array here. | 
						|
    // see notice in conversions.js; don't use box types | 
						|
    // in conversion functions. | 
						|
 | 
						|
    if (typeof result === 'object') { | 
						|
      for (var len = result.length, i = 0; i < len; i++) { | 
						|
        result[i] = Math.round(result[i]); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return result; | 
						|
  }; // preserve .conversion property if there is one | 
						|
 | 
						|
 | 
						|
  if ('conversion' in fn) { | 
						|
    wrappedFn.conversion = fn.conversion; | 
						|
  } | 
						|
 | 
						|
  return wrappedFn; | 
						|
} | 
						|
 | 
						|
models$1.forEach(function (fromModel) { | 
						|
  convert[fromModel] = {}; | 
						|
  Object.defineProperty(convert[fromModel], 'channels', { | 
						|
    value: conversions[fromModel].channels | 
						|
  }); | 
						|
  Object.defineProperty(convert[fromModel], 'labels', { | 
						|
    value: conversions[fromModel].labels | 
						|
  }); | 
						|
  var routes = route(fromModel); | 
						|
  var routeModels = Object.keys(routes); | 
						|
  routeModels.forEach(function (toModel) { | 
						|
    var fn = routes[toModel]; | 
						|
    convert[fromModel][toModel] = wrapRounded(fn); | 
						|
    convert[fromModel][toModel].raw = wrapRaw(fn); | 
						|
  }); | 
						|
}); | 
						|
var colorConvert = convert; | 
						|
 | 
						|
var ansiStyles = createCommonjsModule(function (module) { | 
						|
 | 
						|
  var wrapAnsi16 = function wrapAnsi16(fn, offset) { | 
						|
    return function () { | 
						|
      var code = fn.apply(colorConvert, arguments); | 
						|
      return `\u001B[${code + offset}m`; | 
						|
    }; | 
						|
  }; | 
						|
 | 
						|
  var wrapAnsi256 = function wrapAnsi256(fn, offset) { | 
						|
    return function () { | 
						|
      var code = fn.apply(colorConvert, arguments); | 
						|
      return `\u001B[${38 + offset};5;${code}m`; | 
						|
    }; | 
						|
  }; | 
						|
 | 
						|
  var wrapAnsi16m = function wrapAnsi16m(fn, offset) { | 
						|
    return function () { | 
						|
      var rgb = fn.apply(colorConvert, arguments); | 
						|
      return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; | 
						|
    }; | 
						|
  }; | 
						|
 | 
						|
  function assembleStyles() { | 
						|
    var codes = new Map(); | 
						|
    var styles = { | 
						|
      modifier: { | 
						|
        reset: [0, 0], | 
						|
        // 21 isn't widely supported and 22 does the same thing | 
						|
        bold: [1, 22], | 
						|
        dim: [2, 22], | 
						|
        italic: [3, 23], | 
						|
        underline: [4, 24], | 
						|
        inverse: [7, 27], | 
						|
        hidden: [8, 28], | 
						|
        strikethrough: [9, 29] | 
						|
      }, | 
						|
      color: { | 
						|
        black: [30, 39], | 
						|
        red: [31, 39], | 
						|
        green: [32, 39], | 
						|
        yellow: [33, 39], | 
						|
        blue: [34, 39], | 
						|
        magenta: [35, 39], | 
						|
        cyan: [36, 39], | 
						|
        white: [37, 39], | 
						|
        gray: [90, 39], | 
						|
        // Bright color | 
						|
        redBright: [91, 39], | 
						|
        greenBright: [92, 39], | 
						|
        yellowBright: [93, 39], | 
						|
        blueBright: [94, 39], | 
						|
        magentaBright: [95, 39], | 
						|
        cyanBright: [96, 39], | 
						|
        whiteBright: [97, 39] | 
						|
      }, | 
						|
      bgColor: { | 
						|
        bgBlack: [40, 49], | 
						|
        bgRed: [41, 49], | 
						|
        bgGreen: [42, 49], | 
						|
        bgYellow: [43, 49], | 
						|
        bgBlue: [44, 49], | 
						|
        bgMagenta: [45, 49], | 
						|
        bgCyan: [46, 49], | 
						|
        bgWhite: [47, 49], | 
						|
        // Bright color | 
						|
        bgBlackBright: [100, 49], | 
						|
        bgRedBright: [101, 49], | 
						|
        bgGreenBright: [102, 49], | 
						|
        bgYellowBright: [103, 49], | 
						|
        bgBlueBright: [104, 49], | 
						|
        bgMagentaBright: [105, 49], | 
						|
        bgCyanBright: [106, 49], | 
						|
        bgWhiteBright: [107, 49] | 
						|
      } | 
						|
    }; // Fix humans | 
						|
 | 
						|
    styles.color.grey = styles.color.gray; | 
						|
 | 
						|
    for (var _i = 0, _Object$keys = Object.keys(styles); _i < _Object$keys.length; _i++) { | 
						|
      var groupName = _Object$keys[_i]; | 
						|
      var group = styles[groupName]; | 
						|
 | 
						|
      for (var _i3 = 0, _Object$keys3 = Object.keys(group); _i3 < _Object$keys3.length; _i3++) { | 
						|
        var styleName = _Object$keys3[_i3]; | 
						|
        var style = group[styleName]; | 
						|
        styles[styleName] = { | 
						|
          open: `\u001B[${style[0]}m`, | 
						|
          close: `\u001B[${style[1]}m` | 
						|
        }; | 
						|
        group[styleName] = styles[styleName]; | 
						|
        codes.set(style[0], style[1]); | 
						|
      } | 
						|
 | 
						|
      Object.defineProperty(styles, groupName, { | 
						|
        value: group, | 
						|
        enumerable: false | 
						|
      }); | 
						|
      Object.defineProperty(styles, 'codes', { | 
						|
        value: codes, | 
						|
        enumerable: false | 
						|
      }); | 
						|
    } | 
						|
 | 
						|
    var ansi2ansi = function ansi2ansi(n) { | 
						|
      return n; | 
						|
    }; | 
						|
 | 
						|
    var rgb2rgb = function rgb2rgb(r, g, b) { | 
						|
      return [r, g, b]; | 
						|
    }; | 
						|
 | 
						|
    styles.color.close = '\u001B[39m'; | 
						|
    styles.bgColor.close = '\u001B[49m'; | 
						|
    styles.color.ansi = { | 
						|
      ansi: wrapAnsi16(ansi2ansi, 0) | 
						|
    }; | 
						|
    styles.color.ansi256 = { | 
						|
      ansi256: wrapAnsi256(ansi2ansi, 0) | 
						|
    }; | 
						|
    styles.color.ansi16m = { | 
						|
      rgb: wrapAnsi16m(rgb2rgb, 0) | 
						|
    }; | 
						|
    styles.bgColor.ansi = { | 
						|
      ansi: wrapAnsi16(ansi2ansi, 10) | 
						|
    }; | 
						|
    styles.bgColor.ansi256 = { | 
						|
      ansi256: wrapAnsi256(ansi2ansi, 10) | 
						|
    }; | 
						|
    styles.bgColor.ansi16m = { | 
						|
      rgb: wrapAnsi16m(rgb2rgb, 10) | 
						|
    }; | 
						|
 | 
						|
    for (var _i2 = 0, _Object$keys2 = Object.keys(colorConvert); _i2 < _Object$keys2.length; _i2++) { | 
						|
      var key = _Object$keys2[_i2]; | 
						|
 | 
						|
      if (typeof colorConvert[key] !== 'object') { | 
						|
        continue; | 
						|
      } | 
						|
 | 
						|
      var suite = colorConvert[key]; | 
						|
 | 
						|
      if (key === 'ansi16') { | 
						|
        key = 'ansi'; | 
						|
      } | 
						|
 | 
						|
      if ('ansi16' in suite) { | 
						|
        styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); | 
						|
        styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); | 
						|
      } | 
						|
 | 
						|
      if ('ansi256' in suite) { | 
						|
        styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); | 
						|
        styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); | 
						|
      } | 
						|
 | 
						|
      if ('rgb' in suite) { | 
						|
        styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); | 
						|
        styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return styles; | 
						|
  } // Make the export immutable | 
						|
 | 
						|
 | 
						|
  Object.defineProperty(module, 'exports', { | 
						|
    enumerable: true, | 
						|
    get: assembleStyles | 
						|
  }); | 
						|
}); | 
						|
 | 
						|
var hasFlag = function hasFlag(flag, argv) { | 
						|
  argv = argv || process.argv; | 
						|
  var prefix = flag.startsWith('-') ? '' : flag.length === 1 ? '-' : '--'; | 
						|
  var pos = argv.indexOf(prefix + flag); | 
						|
  var terminatorPos = argv.indexOf('--'); | 
						|
  return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos); | 
						|
}; | 
						|
 | 
						|
var env = process.env; | 
						|
var forceColor; | 
						|
 | 
						|
if (hasFlag('no-color') || hasFlag('no-colors') || hasFlag('color=false')) { | 
						|
  forceColor = false; | 
						|
} else if (hasFlag('color') || hasFlag('colors') || hasFlag('color=true') || hasFlag('color=always')) { | 
						|
  forceColor = true; | 
						|
} | 
						|
 | 
						|
if ('FORCE_COLOR' in env) { | 
						|
  forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; | 
						|
} | 
						|
 | 
						|
function translateLevel(level) { | 
						|
  if (level === 0) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  return { | 
						|
    level, | 
						|
    hasBasic: true, | 
						|
    has256: level >= 2, | 
						|
    has16m: level >= 3 | 
						|
  }; | 
						|
} | 
						|
 | 
						|
function supportsColor(stream) { | 
						|
  if (forceColor === false) { | 
						|
    return 0; | 
						|
  } | 
						|
 | 
						|
  if (hasFlag('color=16m') || hasFlag('color=full') || hasFlag('color=truecolor')) { | 
						|
    return 3; | 
						|
  } | 
						|
 | 
						|
  if (hasFlag('color=256')) { | 
						|
    return 2; | 
						|
  } | 
						|
 | 
						|
  if (stream && !stream.isTTY && forceColor !== true) { | 
						|
    return 0; | 
						|
  } | 
						|
 | 
						|
  var min = forceColor ? 1 : 0; | 
						|
 | 
						|
  if (process.platform === 'win32') { | 
						|
    // Node.js 7.5.0 is the first version of Node.js to include a patch to | 
						|
    // libuv that enables 256 color output on Windows. Anything earlier and it | 
						|
    // won't work. However, here we target Node.js 8 at minimum as it is an LTS | 
						|
    // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows | 
						|
    // release that supports 256 colors. Windows 10 build 14931 is the first release | 
						|
    // that supports 16m/TrueColor. | 
						|
    var osRelease = os$1.release().split('.'); | 
						|
 | 
						|
    if (Number(process.versions.node.split('.')[0]) >= 8 && Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) { | 
						|
      return Number(osRelease[2]) >= 14931 ? 3 : 2; | 
						|
    } | 
						|
 | 
						|
    return 1; | 
						|
  } | 
						|
 | 
						|
  if ('CI' in env) { | 
						|
    if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(function (sign) { | 
						|
      return sign in env; | 
						|
    }) || env.CI_NAME === 'codeship') { | 
						|
      return 1; | 
						|
    } | 
						|
 | 
						|
    return min; | 
						|
  } | 
						|
 | 
						|
  if ('TEAMCITY_VERSION' in env) { | 
						|
    return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; | 
						|
  } | 
						|
 | 
						|
  if (env.COLORTERM === 'truecolor') { | 
						|
    return 3; | 
						|
  } | 
						|
 | 
						|
  if ('TERM_PROGRAM' in env) { | 
						|
    var version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); | 
						|
 | 
						|
    switch (env.TERM_PROGRAM) { | 
						|
      case 'iTerm.app': | 
						|
        return version >= 3 ? 3 : 2; | 
						|
 | 
						|
      case 'Apple_Terminal': | 
						|
        return 2; | 
						|
      // No default | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  if (/-256(color)?$/i.test(env.TERM)) { | 
						|
    return 2; | 
						|
  } | 
						|
 | 
						|
  if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { | 
						|
    return 1; | 
						|
  } | 
						|
 | 
						|
  if ('COLORTERM' in env) { | 
						|
    return 1; | 
						|
  } | 
						|
 | 
						|
  if (env.TERM === 'dumb') { | 
						|
    return min; | 
						|
  } | 
						|
 | 
						|
  return min; | 
						|
} | 
						|
 | 
						|
function getSupportLevel(stream) { | 
						|
  var level = supportsColor(stream); | 
						|
  return translateLevel(level); | 
						|
} | 
						|
 | 
						|
var supportsColor_1 = { | 
						|
  supportsColor: getSupportLevel, | 
						|
  stdout: getSupportLevel(process.stdout), | 
						|
  stderr: getSupportLevel(process.stderr) | 
						|
}; | 
						|
 | 
						|
var TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; | 
						|
var STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; | 
						|
var STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; | 
						|
var ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi; | 
						|
var ESCAPES = new Map([['n', '\n'], ['r', '\r'], ['t', '\t'], ['b', '\b'], ['f', '\f'], ['v', '\v'], ['0', '\0'], ['\\', '\\'], ['e', '\u001B'], ['a', '\u0007']]); | 
						|
 | 
						|
function unescape(c) { | 
						|
  if (c[0] === 'u' && c.length === 5 || c[0] === 'x' && c.length === 3) { | 
						|
    return String.fromCharCode(parseInt(c.slice(1), 16)); | 
						|
  } | 
						|
 | 
						|
  return ESCAPES.get(c) || c; | 
						|
} | 
						|
 | 
						|
function parseArguments(name, args) { | 
						|
  var results = []; | 
						|
  var chunks = args.trim().split(/\s*,\s*/g); | 
						|
  var matches; | 
						|
  var _iteratorNormalCompletion = true; | 
						|
  var _didIteratorError = false; | 
						|
  var _iteratorError = undefined; | 
						|
 | 
						|
  try { | 
						|
    for (var _iterator = chunks[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | 
						|
      var chunk = _step.value; | 
						|
 | 
						|
      if (!isNaN(chunk)) { | 
						|
        results.push(Number(chunk)); | 
						|
      } else if (matches = chunk.match(STRING_REGEX)) { | 
						|
        results.push(matches[2].replace(ESCAPE_REGEX, function (m, escape, chr) { | 
						|
          return escape ? unescape(escape) : chr; | 
						|
        })); | 
						|
      } else { | 
						|
        throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); | 
						|
      } | 
						|
    } | 
						|
  } catch (err) { | 
						|
    _didIteratorError = true; | 
						|
    _iteratorError = err; | 
						|
  } finally { | 
						|
    try { | 
						|
      if (!_iteratorNormalCompletion && _iterator.return != null) { | 
						|
        _iterator.return(); | 
						|
      } | 
						|
    } finally { | 
						|
      if (_didIteratorError) { | 
						|
        throw _iteratorError; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return results; | 
						|
} | 
						|
 | 
						|
function parseStyle(style) { | 
						|
  STYLE_REGEX.lastIndex = 0; | 
						|
  var results = []; | 
						|
  var matches; | 
						|
 | 
						|
  while ((matches = STYLE_REGEX.exec(style)) !== null) { | 
						|
    var name = matches[1]; | 
						|
 | 
						|
    if (matches[2]) { | 
						|
      var args = parseArguments(name, matches[2]); | 
						|
      results.push([name].concat(args)); | 
						|
    } else { | 
						|
      results.push([name]); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return results; | 
						|
} | 
						|
 | 
						|
function buildStyle(chalk, styles) { | 
						|
  var enabled = {}; | 
						|
  var _iteratorNormalCompletion2 = true; | 
						|
  var _didIteratorError2 = false; | 
						|
  var _iteratorError2 = undefined; | 
						|
 | 
						|
  try { | 
						|
    for (var _iterator2 = styles[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { | 
						|
      var layer = _step2.value; | 
						|
      var _iteratorNormalCompletion3 = true; | 
						|
      var _didIteratorError3 = false; | 
						|
      var _iteratorError3 = undefined; | 
						|
 | 
						|
      try { | 
						|
        for (var _iterator3 = layer.styles[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { | 
						|
          var style = _step3.value; | 
						|
          enabled[style[0]] = layer.inverse ? null : style.slice(1); | 
						|
        } | 
						|
      } catch (err) { | 
						|
        _didIteratorError3 = true; | 
						|
        _iteratorError3 = err; | 
						|
      } finally { | 
						|
        try { | 
						|
          if (!_iteratorNormalCompletion3 && _iterator3.return != null) { | 
						|
            _iterator3.return(); | 
						|
          } | 
						|
        } finally { | 
						|
          if (_didIteratorError3) { | 
						|
            throw _iteratorError3; | 
						|
          } | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
  } catch (err) { | 
						|
    _didIteratorError2 = true; | 
						|
    _iteratorError2 = err; | 
						|
  } finally { | 
						|
    try { | 
						|
      if (!_iteratorNormalCompletion2 && _iterator2.return != null) { | 
						|
        _iterator2.return(); | 
						|
      } | 
						|
    } finally { | 
						|
      if (_didIteratorError2) { | 
						|
        throw _iteratorError2; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  var current = chalk; | 
						|
 | 
						|
  for (var _i = 0, _Object$keys = Object.keys(enabled); _i < _Object$keys.length; _i++) { | 
						|
    var styleName = _Object$keys[_i]; | 
						|
 | 
						|
    if (Array.isArray(enabled[styleName])) { | 
						|
      if (!(styleName in current)) { | 
						|
        throw new Error(`Unknown Chalk style: ${styleName}`); | 
						|
      } | 
						|
 | 
						|
      if (enabled[styleName].length > 0) { | 
						|
        current = current[styleName].apply(current, enabled[styleName]); | 
						|
      } else { | 
						|
        current = current[styleName]; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return current; | 
						|
} | 
						|
 | 
						|
var templates = function templates(chalk, tmp) { | 
						|
  var styles = []; | 
						|
  var chunks = []; | 
						|
  var chunk = []; // eslint-disable-next-line max-params | 
						|
 | 
						|
  tmp.replace(TEMPLATE_REGEX, function (m, escapeChar, inverse, style, close, chr) { | 
						|
    if (escapeChar) { | 
						|
      chunk.push(unescape(escapeChar)); | 
						|
    } else if (style) { | 
						|
      var str = chunk.join(''); | 
						|
      chunk = []; | 
						|
      chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); | 
						|
      styles.push({ | 
						|
        inverse, | 
						|
        styles: parseStyle(style) | 
						|
      }); | 
						|
    } else if (close) { | 
						|
      if (styles.length === 0) { | 
						|
        throw new Error('Found extraneous } in Chalk template literal'); | 
						|
      } | 
						|
 | 
						|
      chunks.push(buildStyle(chalk, styles)(chunk.join(''))); | 
						|
      chunk = []; | 
						|
      styles.pop(); | 
						|
    } else { | 
						|
      chunk.push(chr); | 
						|
    } | 
						|
  }); | 
						|
  chunks.push(chunk.join('')); | 
						|
 | 
						|
  if (styles.length > 0) { | 
						|
    var errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; | 
						|
    throw new Error(errMsg); | 
						|
  } | 
						|
 | 
						|
  return chunks.join(''); | 
						|
}; | 
						|
 | 
						|
var chalk = createCommonjsModule(function (module) { | 
						|
 | 
						|
  var stdoutColor = supportsColor_1.stdout; | 
						|
  var isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); // `supportsColor.level` → `ansiStyles.color[name]` mapping | 
						|
 | 
						|
  var levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; // `color-convert` models to exclude from the Chalk API due to conflicts and such | 
						|
 | 
						|
  var skipModels = new Set(['gray']); | 
						|
  var styles = Object.create(null); | 
						|
 | 
						|
  function applyOptions(obj, options) { | 
						|
    options = options || {}; // Detect level if not set manually | 
						|
 | 
						|
    var scLevel = stdoutColor ? stdoutColor.level : 0; | 
						|
    obj.level = options.level === undefined ? scLevel : options.level; | 
						|
    obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; | 
						|
  } | 
						|
 | 
						|
  function Chalk(options) { | 
						|
    // We check for this.template here since calling `chalk.constructor()` | 
						|
    // by itself will have a `this` of a previously constructed chalk object | 
						|
    if (!this || !(this instanceof Chalk) || this.template) { | 
						|
      var _chalk = {}; | 
						|
      applyOptions(_chalk, options); | 
						|
 | 
						|
      _chalk.template = function () { | 
						|
        var args = [].slice.call(arguments); | 
						|
        return chalkTag.apply(null, [_chalk.template].concat(args)); | 
						|
      }; | 
						|
 | 
						|
      Object.setPrototypeOf(_chalk, Chalk.prototype); | 
						|
      Object.setPrototypeOf(_chalk.template, _chalk); | 
						|
      _chalk.template.constructor = Chalk; | 
						|
      return _chalk.template; | 
						|
    } | 
						|
 | 
						|
    applyOptions(this, options); | 
						|
  } // Use bright blue on Windows as the normal blue color is illegible | 
						|
 | 
						|
 | 
						|
  if (isSimpleWindowsTerm) { | 
						|
    ansiStyles.blue.open = '\u001B[94m'; | 
						|
  } | 
						|
 | 
						|
  var _loop = function _loop() { | 
						|
    var key = _Object$keys[_i]; | 
						|
    ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); | 
						|
    styles[key] = { | 
						|
      get() { | 
						|
        var codes = ansiStyles[key]; | 
						|
        return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); | 
						|
      } | 
						|
 | 
						|
    }; | 
						|
  }; | 
						|
 | 
						|
  for (var _i = 0, _Object$keys = Object.keys(ansiStyles); _i < _Object$keys.length; _i++) { | 
						|
    _loop(); | 
						|
  } | 
						|
 | 
						|
  styles.visible = { | 
						|
    get() { | 
						|
      return build.call(this, this._styles || [], true, 'visible'); | 
						|
    } | 
						|
 | 
						|
  }; | 
						|
  ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); | 
						|
 | 
						|
  var _loop2 = function _loop2() { | 
						|
    var model = _Object$keys2[_i2]; | 
						|
 | 
						|
    if (skipModels.has(model)) { | 
						|
      return "continue"; | 
						|
    } | 
						|
 | 
						|
    styles[model] = { | 
						|
      get() { | 
						|
        var level = this.level; | 
						|
        return function () { | 
						|
          var open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); | 
						|
          var codes = { | 
						|
            open, | 
						|
            close: ansiStyles.color.close, | 
						|
            closeRe: ansiStyles.color.closeRe | 
						|
          }; | 
						|
          return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); | 
						|
        }; | 
						|
      } | 
						|
 | 
						|
    }; | 
						|
  }; | 
						|
 | 
						|
  for (var _i2 = 0, _Object$keys2 = Object.keys(ansiStyles.color.ansi); _i2 < _Object$keys2.length; _i2++) { | 
						|
    var _ret = _loop2(); | 
						|
 | 
						|
    if (_ret === "continue") continue; | 
						|
  } | 
						|
 | 
						|
  ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); | 
						|
 | 
						|
  var _loop3 = function _loop3() { | 
						|
    var model = _Object$keys3[_i3]; | 
						|
 | 
						|
    if (skipModels.has(model)) { | 
						|
      return "continue"; | 
						|
    } | 
						|
 | 
						|
    var bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); | 
						|
    styles[bgModel] = { | 
						|
      get() { | 
						|
        var level = this.level; | 
						|
        return function () { | 
						|
          var open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); | 
						|
          var codes = { | 
						|
            open, | 
						|
            close: ansiStyles.bgColor.close, | 
						|
            closeRe: ansiStyles.bgColor.closeRe | 
						|
          }; | 
						|
          return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); | 
						|
        }; | 
						|
      } | 
						|
 | 
						|
    }; | 
						|
  }; | 
						|
 | 
						|
  for (var _i3 = 0, _Object$keys3 = Object.keys(ansiStyles.bgColor.ansi); _i3 < _Object$keys3.length; _i3++) { | 
						|
    var _ret2 = _loop3(); | 
						|
 | 
						|
    if (_ret2 === "continue") continue; | 
						|
  } | 
						|
 | 
						|
  var proto = Object.defineProperties(function () {}, styles); | 
						|
 | 
						|
  function build(_styles, _empty, key) { | 
						|
    var builder = function builder() { | 
						|
      return applyStyle.apply(builder, arguments); | 
						|
    }; | 
						|
 | 
						|
    builder._styles = _styles; | 
						|
    builder._empty = _empty; | 
						|
    var self = this; | 
						|
    Object.defineProperty(builder, 'level', { | 
						|
      enumerable: true, | 
						|
 | 
						|
      get() { | 
						|
        return self.level; | 
						|
      }, | 
						|
 | 
						|
      set(level) { | 
						|
        self.level = level; | 
						|
      } | 
						|
 | 
						|
    }); | 
						|
    Object.defineProperty(builder, 'enabled', { | 
						|
      enumerable: true, | 
						|
 | 
						|
      get() { | 
						|
        return self.enabled; | 
						|
      }, | 
						|
 | 
						|
      set(enabled) { | 
						|
        self.enabled = enabled; | 
						|
      } | 
						|
 | 
						|
    }); // See below for fix regarding invisible grey/dim combination on Windows | 
						|
 | 
						|
    builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; // `__proto__` is used because we must return a function, but there is | 
						|
    // no way to create a function with a different prototype | 
						|
 | 
						|
    builder.__proto__ = proto; // eslint-disable-line no-proto | 
						|
 | 
						|
    return builder; | 
						|
  } | 
						|
 | 
						|
  function applyStyle() { | 
						|
    // Support varags, but simply cast to string in case there's only one arg | 
						|
    var args = arguments; | 
						|
    var argsLen = args.length; | 
						|
    var str = String(arguments[0]); | 
						|
 | 
						|
    if (argsLen === 0) { | 
						|
      return ''; | 
						|
    } | 
						|
 | 
						|
    if (argsLen > 1) { | 
						|
      // Don't slice `arguments`, it prevents V8 optimizations | 
						|
      for (var a = 1; a < argsLen; a++) { | 
						|
        str += ' ' + args[a]; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    if (!this.enabled || this.level <= 0 || !str) { | 
						|
      return this._empty ? '' : str; | 
						|
    } // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, | 
						|
    // see https://github.com/chalk/chalk/issues/58 | 
						|
    // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. | 
						|
 | 
						|
 | 
						|
    var originalDim = ansiStyles.dim.open; | 
						|
 | 
						|
    if (isSimpleWindowsTerm && this.hasGrey) { | 
						|
      ansiStyles.dim.open = ''; | 
						|
    } | 
						|
 | 
						|
    var _iteratorNormalCompletion = true; | 
						|
    var _didIteratorError = false; | 
						|
    var _iteratorError = undefined; | 
						|
 | 
						|
    try { | 
						|
      for (var _iterator = this._styles.slice().reverse()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | 
						|
        var code = _step.value; | 
						|
        // Replace any instances already present with a re-opening code | 
						|
        // otherwise only the part of the string until said closing code | 
						|
        // will be colored, and the rest will simply be 'plain'. | 
						|
        str = code.open + str.replace(code.closeRe, code.open) + code.close; // Close the styling before a linebreak and reopen | 
						|
        // after next line to fix a bleed issue on macOS | 
						|
        // https://github.com/chalk/chalk/pull/92 | 
						|
 | 
						|
        str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); | 
						|
      } // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue | 
						|
 | 
						|
    } catch (err) { | 
						|
      _didIteratorError = true; | 
						|
      _iteratorError = err; | 
						|
    } finally { | 
						|
      try { | 
						|
        if (!_iteratorNormalCompletion && _iterator.return != null) { | 
						|
          _iterator.return(); | 
						|
        } | 
						|
      } finally { | 
						|
        if (_didIteratorError) { | 
						|
          throw _iteratorError; | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    ansiStyles.dim.open = originalDim; | 
						|
    return str; | 
						|
  } | 
						|
 | 
						|
  function chalkTag(chalk, strings) { | 
						|
    if (!Array.isArray(strings)) { | 
						|
      // If chalk() was called by itself or with a string, | 
						|
      // return the string itself as a string. | 
						|
      return [].slice.call(arguments, 1).join(' '); | 
						|
    } | 
						|
 | 
						|
    var args = [].slice.call(arguments, 2); | 
						|
    var parts = [strings.raw[0]]; | 
						|
 | 
						|
    for (var i = 1; i < strings.length; i++) { | 
						|
      parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); | 
						|
      parts.push(String(strings.raw[i])); | 
						|
    } | 
						|
 | 
						|
    return templates(chalk, parts.join('')); | 
						|
  } | 
						|
 | 
						|
  Object.defineProperties(Chalk.prototype, styles); | 
						|
  module.exports = Chalk(); // eslint-disable-line new-cap | 
						|
 | 
						|
  module.exports.supportsColor = stdoutColor; | 
						|
  module.exports.default = module.exports; // For TypeScript | 
						|
}); | 
						|
var chalk_1 = chalk.supportsColor; | 
						|
 | 
						|
var common = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
 | 
						|
  exports.commonDeprecatedHandler = function (keyOrPair, redirectTo, _ref) { | 
						|
    var descriptor = _ref.descriptor; | 
						|
    var messages = [`${chalk.default.yellow(typeof keyOrPair === 'string' ? descriptor.key(keyOrPair) : descriptor.pair(keyOrPair))} is deprecated`]; | 
						|
 | 
						|
    if (redirectTo) { | 
						|
      messages.push(`we now treat it as ${chalk.default.blue(typeof redirectTo === 'string' ? descriptor.key(redirectTo) : descriptor.pair(redirectTo))}`); | 
						|
    } | 
						|
 | 
						|
    return messages.join('; ') + '.'; | 
						|
  }; | 
						|
}); | 
						|
unwrapExports(common); | 
						|
var common_1 = common.commonDeprecatedHandler; | 
						|
 | 
						|
var deprecated = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
 | 
						|
  tslib_es6.__exportStar(common, exports); | 
						|
}); | 
						|
unwrapExports(deprecated); | 
						|
 | 
						|
var common$1 = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
 | 
						|
  exports.commonInvalidHandler = function (key, value, utils) { | 
						|
    return [`Invalid ${chalk.default.red(utils.descriptor.key(key))} value.`, `Expected ${chalk.default.blue(utils.schemas[key].expected(utils))},`, `but received ${chalk.default.red(utils.descriptor.value(value))}.`].join(' '); | 
						|
  }; | 
						|
}); | 
						|
unwrapExports(common$1); | 
						|
var common_1$1 = common$1.commonInvalidHandler; | 
						|
 | 
						|
var invalid = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
 | 
						|
  tslib_es6.__exportStar(common$1, exports); | 
						|
}); | 
						|
unwrapExports(invalid); | 
						|
 | 
						|
/* eslint-disable no-nested-ternary */ | 
						|
 | 
						|
var arr = []; | 
						|
var charCodeCache = []; | 
						|
 | 
						|
var leven = function leven(a, b) { | 
						|
  if (a === b) { | 
						|
    return 0; | 
						|
  } | 
						|
 | 
						|
  var swap = a; // Swapping the strings if `a` is longer than `b` so we know which one is the | 
						|
  // shortest & which one is the longest | 
						|
 | 
						|
  if (a.length > b.length) { | 
						|
    a = b; | 
						|
    b = swap; | 
						|
  } | 
						|
 | 
						|
  var aLen = a.length; | 
						|
  var bLen = b.length; | 
						|
 | 
						|
  if (aLen === 0) { | 
						|
    return bLen; | 
						|
  } | 
						|
 | 
						|
  if (bLen === 0) { | 
						|
    return aLen; | 
						|
  } // Performing suffix trimming: | 
						|
  // We can linearly drop suffix common to both strings since they | 
						|
  // don't increase distance at all | 
						|
  // Note: `~-` is the bitwise way to perform a `- 1` operation | 
						|
 | 
						|
 | 
						|
  while (aLen > 0 && a.charCodeAt(~-aLen) === b.charCodeAt(~-bLen)) { | 
						|
    aLen--; | 
						|
    bLen--; | 
						|
  } | 
						|
 | 
						|
  if (aLen === 0) { | 
						|
    return bLen; | 
						|
  } // Performing prefix trimming | 
						|
  // We can linearly drop prefix common to both strings since they | 
						|
  // don't increase distance at all | 
						|
 | 
						|
 | 
						|
  var start = 0; | 
						|
 | 
						|
  while (start < aLen && a.charCodeAt(start) === b.charCodeAt(start)) { | 
						|
    start++; | 
						|
  } | 
						|
 | 
						|
  aLen -= start; | 
						|
  bLen -= start; | 
						|
 | 
						|
  if (aLen === 0) { | 
						|
    return bLen; | 
						|
  } | 
						|
 | 
						|
  var bCharCode; | 
						|
  var ret; | 
						|
  var tmp; | 
						|
  var tmp2; | 
						|
  var i = 0; | 
						|
  var j = 0; | 
						|
 | 
						|
  while (i < aLen) { | 
						|
    charCodeCache[start + i] = a.charCodeAt(start + i); | 
						|
    arr[i] = ++i; | 
						|
  } | 
						|
 | 
						|
  while (j < bLen) { | 
						|
    bCharCode = b.charCodeAt(start + j); | 
						|
    tmp = j++; | 
						|
    ret = j; | 
						|
 | 
						|
    for (i = 0; i < aLen; i++) { | 
						|
      tmp2 = bCharCode === charCodeCache[start + i] ? tmp : tmp + 1; | 
						|
      tmp = arr[i]; | 
						|
      ret = arr[i] = tmp > ret ? tmp2 > ret ? ret + 1 : tmp2 : tmp2 > tmp ? tmp + 1 : tmp2; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return ret; | 
						|
}; | 
						|
 | 
						|
var leven_1 = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
 | 
						|
  exports.levenUnknownHandler = function (key, value, _ref) { | 
						|
    var descriptor = _ref.descriptor, | 
						|
        logger = _ref.logger, | 
						|
        schemas = _ref.schemas; | 
						|
    var messages = [`Ignored unknown option ${chalk.default.yellow(descriptor.pair({ | 
						|
      key, | 
						|
      value | 
						|
    }))}.`]; | 
						|
    var suggestion = Object.keys(schemas).sort().find(function (knownKey) { | 
						|
      return leven(key, knownKey) < 3; | 
						|
    }); | 
						|
 | 
						|
    if (suggestion) { | 
						|
      messages.push(`Did you mean ${chalk.default.blue(descriptor.key(suggestion))}?`); | 
						|
    } | 
						|
 | 
						|
    logger.warn(messages.join(' ')); | 
						|
  }; | 
						|
}); | 
						|
unwrapExports(leven_1); | 
						|
var leven_2 = leven_1.levenUnknownHandler; | 
						|
 | 
						|
var unknown = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
 | 
						|
  tslib_es6.__exportStar(leven_1, exports); | 
						|
}); | 
						|
unwrapExports(unknown); | 
						|
 | 
						|
var handlers = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
 | 
						|
  tslib_es6.__exportStar(deprecated, exports); | 
						|
 | 
						|
  tslib_es6.__exportStar(invalid, exports); | 
						|
 | 
						|
  tslib_es6.__exportStar(unknown, exports); | 
						|
}); | 
						|
unwrapExports(handlers); | 
						|
 | 
						|
var schema = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
  var HANDLER_KEYS = ['default', 'expected', 'validate', 'deprecated', 'forward', 'redirect', 'overlap', 'preprocess', 'postprocess']; | 
						|
 | 
						|
  function createSchema(SchemaConstructor, parameters) { | 
						|
    var schema = new SchemaConstructor(parameters); | 
						|
    var subSchema = Object.create(schema); | 
						|
    var _iteratorNormalCompletion = true; | 
						|
    var _didIteratorError = false; | 
						|
    var _iteratorError = undefined; | 
						|
 | 
						|
    try { | 
						|
      for (var _iterator = HANDLER_KEYS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | 
						|
        var handlerKey = _step.value; | 
						|
 | 
						|
        if (handlerKey in parameters) { | 
						|
          subSchema[handlerKey] = normalizeHandler(parameters[handlerKey], schema, Schema.prototype[handlerKey].length); | 
						|
        } | 
						|
      } | 
						|
    } catch (err) { | 
						|
      _didIteratorError = true; | 
						|
      _iteratorError = err; | 
						|
    } finally { | 
						|
      try { | 
						|
        if (!_iteratorNormalCompletion && _iterator.return != null) { | 
						|
          _iterator.return(); | 
						|
        } | 
						|
      } finally { | 
						|
        if (_didIteratorError) { | 
						|
          throw _iteratorError; | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return subSchema; | 
						|
  } | 
						|
 | 
						|
  exports.createSchema = createSchema; | 
						|
 | 
						|
  var Schema = | 
						|
  /*#__PURE__*/ | 
						|
  function () { | 
						|
    function Schema(parameters) { | 
						|
      _classCallCheck(this, Schema); | 
						|
 | 
						|
      this.name = parameters.name; | 
						|
    } | 
						|
 | 
						|
    _createClass(Schema, [{ | 
						|
      key: "default", | 
						|
      value: function _default(_utils) { | 
						|
        return undefined; | 
						|
      } // istanbul ignore next: this is actually an abstract method but we need a placeholder to get `function.length` | 
						|
 | 
						|
    }, { | 
						|
      key: "expected", | 
						|
      value: function expected(_utils) { | 
						|
        return 'nothing'; | 
						|
      } // istanbul ignore next: this is actually an abstract method but we need a placeholder to get `function.length` | 
						|
 | 
						|
    }, { | 
						|
      key: "validate", | 
						|
      value: function validate(_value, _utils) { | 
						|
        return false; | 
						|
      } | 
						|
    }, { | 
						|
      key: "deprecated", | 
						|
      value: function deprecated(_value, _utils) { | 
						|
        return false; | 
						|
      } | 
						|
    }, { | 
						|
      key: "forward", | 
						|
      value: function forward(_value, _utils) { | 
						|
        return undefined; | 
						|
      } | 
						|
    }, { | 
						|
      key: "redirect", | 
						|
      value: function redirect(_value, _utils) { | 
						|
        return undefined; | 
						|
      } | 
						|
    }, { | 
						|
      key: "overlap", | 
						|
      value: function overlap(currentValue, _newValue, _utils) { | 
						|
        return currentValue; | 
						|
      } | 
						|
    }, { | 
						|
      key: "preprocess", | 
						|
      value: function preprocess(value, _utils) { | 
						|
        return value; | 
						|
      } | 
						|
    }, { | 
						|
      key: "postprocess", | 
						|
      value: function postprocess(value, _utils) { | 
						|
        return value; | 
						|
      } | 
						|
    }], [{ | 
						|
      key: "create", | 
						|
      value: function create(parameters) { | 
						|
        // @ts-ignore: https://github.com/Microsoft/TypeScript/issues/5863 | 
						|
        return createSchema(this, parameters); | 
						|
      } | 
						|
    }]); | 
						|
 | 
						|
    return Schema; | 
						|
  }(); | 
						|
 | 
						|
  exports.Schema = Schema; | 
						|
 | 
						|
  function normalizeHandler(handler, superSchema, handlerArgumentsLength) { | 
						|
    return typeof handler === 'function' ? function () { | 
						|
      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { | 
						|
        args[_key] = arguments[_key]; | 
						|
      } | 
						|
 | 
						|
      return handler.apply(void 0, _toConsumableArray$1(args.slice(0, handlerArgumentsLength - 1)).concat([superSchema], _toConsumableArray$1(args.slice(handlerArgumentsLength - 1)))); | 
						|
    } : function () { | 
						|
      return handler; | 
						|
    }; | 
						|
  } | 
						|
}); | 
						|
unwrapExports(schema); | 
						|
var schema_1 = schema.createSchema; | 
						|
var schema_2 = schema.Schema; | 
						|
 | 
						|
var alias = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
 | 
						|
  var AliasSchema = | 
						|
  /*#__PURE__*/ | 
						|
  function (_schema_1$Schema) { | 
						|
    _inherits(AliasSchema, _schema_1$Schema); | 
						|
 | 
						|
    function AliasSchema(parameters) { | 
						|
      var _this; | 
						|
 | 
						|
      _classCallCheck(this, AliasSchema); | 
						|
 | 
						|
      _this = _possibleConstructorReturn(this, _getPrototypeOf(AliasSchema).call(this, parameters)); | 
						|
      _this._sourceName = parameters.sourceName; | 
						|
      return _this; | 
						|
    } | 
						|
 | 
						|
    _createClass(AliasSchema, [{ | 
						|
      key: "expected", | 
						|
      value: function expected(utils) { | 
						|
        return utils.schemas[this._sourceName].expected(utils); | 
						|
      } | 
						|
    }, { | 
						|
      key: "validate", | 
						|
      value: function validate(value, utils) { | 
						|
        return utils.schemas[this._sourceName].validate(value, utils); | 
						|
      } | 
						|
    }, { | 
						|
      key: "redirect", | 
						|
      value: function redirect(_value, _utils) { | 
						|
        return this._sourceName; | 
						|
      } | 
						|
    }]); | 
						|
 | 
						|
    return AliasSchema; | 
						|
  }(schema.Schema); | 
						|
 | 
						|
  exports.AliasSchema = AliasSchema; | 
						|
}); | 
						|
unwrapExports(alias); | 
						|
var alias_1 = alias.AliasSchema; | 
						|
 | 
						|
var any = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
 | 
						|
  var AnySchema = | 
						|
  /*#__PURE__*/ | 
						|
  function (_schema_1$Schema) { | 
						|
    _inherits(AnySchema, _schema_1$Schema); | 
						|
 | 
						|
    function AnySchema() { | 
						|
      _classCallCheck(this, AnySchema); | 
						|
 | 
						|
      return _possibleConstructorReturn(this, _getPrototypeOf(AnySchema).apply(this, arguments)); | 
						|
    } | 
						|
 | 
						|
    _createClass(AnySchema, [{ | 
						|
      key: "expected", | 
						|
      value: function expected() { | 
						|
        return 'anything'; | 
						|
      } | 
						|
    }, { | 
						|
      key: "validate", | 
						|
      value: function validate() { | 
						|
        return true; | 
						|
      } | 
						|
    }]); | 
						|
 | 
						|
    return AnySchema; | 
						|
  }(schema.Schema); | 
						|
 | 
						|
  exports.AnySchema = AnySchema; | 
						|
}); | 
						|
unwrapExports(any); | 
						|
var any_1 = any.AnySchema; | 
						|
 | 
						|
var array = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
 | 
						|
  var ArraySchema = | 
						|
  /*#__PURE__*/ | 
						|
  function (_schema_1$Schema) { | 
						|
    _inherits(ArraySchema, _schema_1$Schema); | 
						|
 | 
						|
    function ArraySchema(_a) { | 
						|
      var _this; | 
						|
 | 
						|
      _classCallCheck(this, ArraySchema); | 
						|
 | 
						|
      var valueSchema = _a.valueSchema, | 
						|
          _a$name = _a.name, | 
						|
          name = _a$name === void 0 ? valueSchema.name : _a$name, | 
						|
          handlers = tslib_es6.__rest(_a, ["valueSchema", "name"]); | 
						|
 | 
						|
      _this = _possibleConstructorReturn(this, _getPrototypeOf(ArraySchema).call(this, Object.assign({}, handlers, { | 
						|
        name | 
						|
      }))); | 
						|
      _this._valueSchema = valueSchema; | 
						|
      return _this; | 
						|
    } | 
						|
 | 
						|
    _createClass(ArraySchema, [{ | 
						|
      key: "expected", | 
						|
      value: function expected(utils) { | 
						|
        return `an array of ${this._valueSchema.expected(utils)}`; | 
						|
      } | 
						|
    }, { | 
						|
      key: "validate", | 
						|
      value: function validate(value, utils) { | 
						|
        if (!Array.isArray(value)) { | 
						|
          return false; | 
						|
        } | 
						|
 | 
						|
        var invalidValues = []; | 
						|
        var _iteratorNormalCompletion = true; | 
						|
        var _didIteratorError = false; | 
						|
        var _iteratorError = undefined; | 
						|
 | 
						|
        try { | 
						|
          for (var _iterator = value[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | 
						|
            var subValue = _step.value; | 
						|
            var subValidateResult = utils.normalizeValidateResult(this._valueSchema.validate(subValue, utils), subValue); | 
						|
 | 
						|
            if (subValidateResult !== true) { | 
						|
              invalidValues.push(subValidateResult.value); | 
						|
            } | 
						|
          } | 
						|
        } catch (err) { | 
						|
          _didIteratorError = true; | 
						|
          _iteratorError = err; | 
						|
        } finally { | 
						|
          try { | 
						|
            if (!_iteratorNormalCompletion && _iterator.return != null) { | 
						|
              _iterator.return(); | 
						|
            } | 
						|
          } finally { | 
						|
            if (_didIteratorError) { | 
						|
              throw _iteratorError; | 
						|
            } | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        return invalidValues.length === 0 ? true : { | 
						|
          value: invalidValues | 
						|
        }; | 
						|
      } | 
						|
    }, { | 
						|
      key: "deprecated", | 
						|
      value: function deprecated(value, utils) { | 
						|
        var deprecatedResult = []; | 
						|
        var _iteratorNormalCompletion2 = true; | 
						|
        var _didIteratorError2 = false; | 
						|
        var _iteratorError2 = undefined; | 
						|
 | 
						|
        try { | 
						|
          for (var _iterator2 = value[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { | 
						|
            var subValue = _step2.value; | 
						|
            var subDeprecatedResult = utils.normalizeDeprecatedResult(this._valueSchema.deprecated(subValue, utils), subValue); | 
						|
 | 
						|
            if (subDeprecatedResult !== false) { | 
						|
              deprecatedResult.push.apply(deprecatedResult, _toConsumableArray$1(subDeprecatedResult.map(function (_ref) { | 
						|
                var deprecatedValue = _ref.value; | 
						|
                return { | 
						|
                  value: [deprecatedValue] | 
						|
                }; | 
						|
              }))); | 
						|
            } | 
						|
          } | 
						|
        } catch (err) { | 
						|
          _didIteratorError2 = true; | 
						|
          _iteratorError2 = err; | 
						|
        } finally { | 
						|
          try { | 
						|
            if (!_iteratorNormalCompletion2 && _iterator2.return != null) { | 
						|
              _iterator2.return(); | 
						|
            } | 
						|
          } finally { | 
						|
            if (_didIteratorError2) { | 
						|
              throw _iteratorError2; | 
						|
            } | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        return deprecatedResult; | 
						|
      } | 
						|
    }, { | 
						|
      key: "forward", | 
						|
      value: function forward(value, utils) { | 
						|
        var forwardResult = []; | 
						|
        var _iteratorNormalCompletion3 = true; | 
						|
        var _didIteratorError3 = false; | 
						|
        var _iteratorError3 = undefined; | 
						|
 | 
						|
        try { | 
						|
          for (var _iterator3 = value[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { | 
						|
            var subValue = _step3.value; | 
						|
            var subForwardResult = utils.normalizeForwardResult(this._valueSchema.forward(subValue, utils), subValue); | 
						|
            forwardResult.push.apply(forwardResult, _toConsumableArray$1(subForwardResult.map(wrapTransferResult))); | 
						|
          } | 
						|
        } catch (err) { | 
						|
          _didIteratorError3 = true; | 
						|
          _iteratorError3 = err; | 
						|
        } finally { | 
						|
          try { | 
						|
            if (!_iteratorNormalCompletion3 && _iterator3.return != null) { | 
						|
              _iterator3.return(); | 
						|
            } | 
						|
          } finally { | 
						|
            if (_didIteratorError3) { | 
						|
              throw _iteratorError3; | 
						|
            } | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        return forwardResult; | 
						|
      } | 
						|
    }, { | 
						|
      key: "redirect", | 
						|
      value: function redirect(value, utils) { | 
						|
        var remain = []; | 
						|
        var redirect = []; | 
						|
        var _iteratorNormalCompletion4 = true; | 
						|
        var _didIteratorError4 = false; | 
						|
        var _iteratorError4 = undefined; | 
						|
 | 
						|
        try { | 
						|
          for (var _iterator4 = value[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { | 
						|
            var subValue = _step4.value; | 
						|
            var subRedirectResult = utils.normalizeRedirectResult(this._valueSchema.redirect(subValue, utils), subValue); | 
						|
 | 
						|
            if ('remain' in subRedirectResult) { | 
						|
              remain.push(subRedirectResult.remain); | 
						|
            } | 
						|
 | 
						|
            redirect.push.apply(redirect, _toConsumableArray$1(subRedirectResult.redirect.map(wrapTransferResult))); | 
						|
          } | 
						|
        } catch (err) { | 
						|
          _didIteratorError4 = true; | 
						|
          _iteratorError4 = err; | 
						|
        } finally { | 
						|
          try { | 
						|
            if (!_iteratorNormalCompletion4 && _iterator4.return != null) { | 
						|
              _iterator4.return(); | 
						|
            } | 
						|
          } finally { | 
						|
            if (_didIteratorError4) { | 
						|
              throw _iteratorError4; | 
						|
            } | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        return remain.length === 0 ? { | 
						|
          redirect | 
						|
        } : { | 
						|
          redirect, | 
						|
          remain | 
						|
        }; | 
						|
      } | 
						|
    }, { | 
						|
      key: "overlap", | 
						|
      value: function overlap(currentValue, newValue) { | 
						|
        return currentValue.concat(newValue); | 
						|
      } | 
						|
    }]); | 
						|
 | 
						|
    return ArraySchema; | 
						|
  }(schema.Schema); | 
						|
 | 
						|
  exports.ArraySchema = ArraySchema; | 
						|
 | 
						|
  function wrapTransferResult(_ref2) { | 
						|
    var from = _ref2.from, | 
						|
        to = _ref2.to; | 
						|
    return { | 
						|
      from: [from], | 
						|
      to | 
						|
    }; | 
						|
  } | 
						|
}); | 
						|
unwrapExports(array); | 
						|
var array_1 = array.ArraySchema; | 
						|
 | 
						|
var boolean_1 = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
 | 
						|
  var BooleanSchema = | 
						|
  /*#__PURE__*/ | 
						|
  function (_schema_1$Schema) { | 
						|
    _inherits(BooleanSchema, _schema_1$Schema); | 
						|
 | 
						|
    function BooleanSchema() { | 
						|
      _classCallCheck(this, BooleanSchema); | 
						|
 | 
						|
      return _possibleConstructorReturn(this, _getPrototypeOf(BooleanSchema).apply(this, arguments)); | 
						|
    } | 
						|
 | 
						|
    _createClass(BooleanSchema, [{ | 
						|
      key: "expected", | 
						|
      value: function expected() { | 
						|
        return 'true or false'; | 
						|
      } | 
						|
    }, { | 
						|
      key: "validate", | 
						|
      value: function validate(value) { | 
						|
        return typeof value === 'boolean'; | 
						|
      } | 
						|
    }]); | 
						|
 | 
						|
    return BooleanSchema; | 
						|
  }(schema.Schema); | 
						|
 | 
						|
  exports.BooleanSchema = BooleanSchema; | 
						|
}); | 
						|
unwrapExports(boolean_1); | 
						|
var boolean_2 = boolean_1.BooleanSchema; | 
						|
 | 
						|
var utils = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
 | 
						|
  function recordFromArray(array, mainKey) { | 
						|
    var record = Object.create(null); | 
						|
    var _iteratorNormalCompletion = true; | 
						|
    var _didIteratorError = false; | 
						|
    var _iteratorError = undefined; | 
						|
 | 
						|
    try { | 
						|
      for (var _iterator = array[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | 
						|
        var value = _step.value; | 
						|
        var key = value[mainKey]; // istanbul ignore next | 
						|
 | 
						|
        if (record[key]) { | 
						|
          throw new Error(`Duplicate ${mainKey} ${JSON.stringify(key)}`); | 
						|
        } // @ts-ignore | 
						|
 | 
						|
 | 
						|
        record[key] = value; | 
						|
      } | 
						|
    } catch (err) { | 
						|
      _didIteratorError = true; | 
						|
      _iteratorError = err; | 
						|
    } finally { | 
						|
      try { | 
						|
        if (!_iteratorNormalCompletion && _iterator.return != null) { | 
						|
          _iterator.return(); | 
						|
        } | 
						|
      } finally { | 
						|
        if (_didIteratorError) { | 
						|
          throw _iteratorError; | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return record; | 
						|
  } | 
						|
 | 
						|
  exports.recordFromArray = recordFromArray; | 
						|
 | 
						|
  function mapFromArray(array, mainKey) { | 
						|
    var map = new Map(); | 
						|
    var _iteratorNormalCompletion2 = true; | 
						|
    var _didIteratorError2 = false; | 
						|
    var _iteratorError2 = undefined; | 
						|
 | 
						|
    try { | 
						|
      for (var _iterator2 = array[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { | 
						|
        var value = _step2.value; | 
						|
        var key = value[mainKey]; // istanbul ignore next | 
						|
 | 
						|
        if (map.has(key)) { | 
						|
          throw new Error(`Duplicate ${mainKey} ${JSON.stringify(key)}`); | 
						|
        } | 
						|
 | 
						|
        map.set(key, value); | 
						|
      } | 
						|
    } catch (err) { | 
						|
      _didIteratorError2 = true; | 
						|
      _iteratorError2 = err; | 
						|
    } finally { | 
						|
      try { | 
						|
        if (!_iteratorNormalCompletion2 && _iterator2.return != null) { | 
						|
          _iterator2.return(); | 
						|
        } | 
						|
      } finally { | 
						|
        if (_didIteratorError2) { | 
						|
          throw _iteratorError2; | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return map; | 
						|
  } | 
						|
 | 
						|
  exports.mapFromArray = mapFromArray; | 
						|
 | 
						|
  function createAutoChecklist() { | 
						|
    var map = Object.create(null); | 
						|
    return function (id) { | 
						|
      var idString = JSON.stringify(id); | 
						|
 | 
						|
      if (map[idString]) { | 
						|
        return true; | 
						|
      } | 
						|
 | 
						|
      map[idString] = true; | 
						|
      return false; | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  exports.createAutoChecklist = createAutoChecklist; | 
						|
 | 
						|
  function partition(array, predicate) { | 
						|
    var trueArray = []; | 
						|
    var falseArray = []; | 
						|
    var _iteratorNormalCompletion3 = true; | 
						|
    var _didIteratorError3 = false; | 
						|
    var _iteratorError3 = undefined; | 
						|
 | 
						|
    try { | 
						|
      for (var _iterator3 = array[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { | 
						|
        var value = _step3.value; | 
						|
 | 
						|
        if (predicate(value)) { | 
						|
          trueArray.push(value); | 
						|
        } else { | 
						|
          falseArray.push(value); | 
						|
        } | 
						|
      } | 
						|
    } catch (err) { | 
						|
      _didIteratorError3 = true; | 
						|
      _iteratorError3 = err; | 
						|
    } finally { | 
						|
      try { | 
						|
        if (!_iteratorNormalCompletion3 && _iterator3.return != null) { | 
						|
          _iterator3.return(); | 
						|
        } | 
						|
      } finally { | 
						|
        if (_didIteratorError3) { | 
						|
          throw _iteratorError3; | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return [trueArray, falseArray]; | 
						|
  } | 
						|
 | 
						|
  exports.partition = partition; | 
						|
 | 
						|
  function isInt(value) { | 
						|
    return value === Math.floor(value); | 
						|
  } | 
						|
 | 
						|
  exports.isInt = isInt; | 
						|
 | 
						|
  function comparePrimitive(a, b) { | 
						|
    if (a === b) { | 
						|
      return 0; | 
						|
    } | 
						|
 | 
						|
    var typeofA = typeof a; | 
						|
    var typeofB = typeof b; | 
						|
    var orders = ['undefined', 'object', 'boolean', 'number', 'string']; | 
						|
 | 
						|
    if (typeofA !== typeofB) { | 
						|
      return orders.indexOf(typeofA) - orders.indexOf(typeofB); | 
						|
    } | 
						|
 | 
						|
    if (typeofA !== 'string') { | 
						|
      return Number(a) - Number(b); | 
						|
    } | 
						|
 | 
						|
    return a.localeCompare(b); | 
						|
  } | 
						|
 | 
						|
  exports.comparePrimitive = comparePrimitive; | 
						|
 | 
						|
  function normalizeDefaultResult(result) { | 
						|
    return result === undefined ? {} : result; | 
						|
  } | 
						|
 | 
						|
  exports.normalizeDefaultResult = normalizeDefaultResult; | 
						|
 | 
						|
  function normalizeValidateResult(result, value) { | 
						|
    return result === true ? true : result === false ? { | 
						|
      value | 
						|
    } : result; | 
						|
  } | 
						|
 | 
						|
  exports.normalizeValidateResult = normalizeValidateResult; | 
						|
 | 
						|
  function normalizeDeprecatedResult(result, value) { | 
						|
    var doNotNormalizeTrue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; | 
						|
    return result === false ? false : result === true ? doNotNormalizeTrue ? true : [{ | 
						|
      value | 
						|
    }] : 'value' in result ? [result] : result.length === 0 ? false : result; | 
						|
  } | 
						|
 | 
						|
  exports.normalizeDeprecatedResult = normalizeDeprecatedResult; | 
						|
 | 
						|
  function normalizeTransferResult(result, value) { | 
						|
    return typeof result === 'string' || 'key' in result ? { | 
						|
      from: value, | 
						|
      to: result | 
						|
    } : 'from' in result ? { | 
						|
      from: result.from, | 
						|
      to: result.to | 
						|
    } : { | 
						|
      from: value, | 
						|
      to: result.to | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  exports.normalizeTransferResult = normalizeTransferResult; | 
						|
 | 
						|
  function normalizeForwardResult(result, value) { | 
						|
    return result === undefined ? [] : Array.isArray(result) ? result.map(function (transferResult) { | 
						|
      return normalizeTransferResult(transferResult, value); | 
						|
    }) : [normalizeTransferResult(result, value)]; | 
						|
  } | 
						|
 | 
						|
  exports.normalizeForwardResult = normalizeForwardResult; | 
						|
 | 
						|
  function normalizeRedirectResult(result, value) { | 
						|
    var redirect = normalizeForwardResult(typeof result === 'object' && 'redirect' in result ? result.redirect : result, value); | 
						|
    return redirect.length === 0 ? { | 
						|
      remain: value, | 
						|
      redirect | 
						|
    } : typeof result === 'object' && 'remain' in result ? { | 
						|
      remain: result.remain, | 
						|
      redirect | 
						|
    } : { | 
						|
      redirect | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  exports.normalizeRedirectResult = normalizeRedirectResult; | 
						|
}); | 
						|
unwrapExports(utils); | 
						|
var utils_1 = utils.recordFromArray; | 
						|
var utils_2 = utils.mapFromArray; | 
						|
var utils_3 = utils.createAutoChecklist; | 
						|
var utils_4 = utils.partition; | 
						|
var utils_5 = utils.isInt; | 
						|
var utils_6 = utils.comparePrimitive; | 
						|
var utils_7 = utils.normalizeDefaultResult; | 
						|
var utils_8 = utils.normalizeValidateResult; | 
						|
var utils_9 = utils.normalizeDeprecatedResult; | 
						|
var utils_10 = utils.normalizeTransferResult; | 
						|
var utils_11 = utils.normalizeForwardResult; | 
						|
var utils_12 = utils.normalizeRedirectResult; | 
						|
 | 
						|
var choice = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
 | 
						|
  var ChoiceSchema = | 
						|
  /*#__PURE__*/ | 
						|
  function (_schema_1$Schema) { | 
						|
    _inherits(ChoiceSchema, _schema_1$Schema); | 
						|
 | 
						|
    function ChoiceSchema(parameters) { | 
						|
      var _this; | 
						|
 | 
						|
      _classCallCheck(this, ChoiceSchema); | 
						|
 | 
						|
      _this = _possibleConstructorReturn(this, _getPrototypeOf(ChoiceSchema).call(this, parameters)); | 
						|
      _this._choices = utils.mapFromArray(parameters.choices.map(function (choice) { | 
						|
        return choice && typeof choice === 'object' ? choice : { | 
						|
          value: choice | 
						|
        }; | 
						|
      }), 'value'); | 
						|
      return _this; | 
						|
    } | 
						|
 | 
						|
    _createClass(ChoiceSchema, [{ | 
						|
      key: "expected", | 
						|
      value: function expected(_ref) { | 
						|
        var _this2 = this; | 
						|
 | 
						|
        var descriptor = _ref.descriptor; | 
						|
        var choiceValues = Array.from(this._choices.keys()).map(function (value) { | 
						|
          return _this2._choices.get(value); | 
						|
        }).filter(function (choiceInfo) { | 
						|
          return !choiceInfo.deprecated; | 
						|
        }).map(function (choiceInfo) { | 
						|
          return choiceInfo.value; | 
						|
        }).sort(utils.comparePrimitive).map(descriptor.value); | 
						|
        var head = choiceValues.slice(0, -2); | 
						|
        var tail = choiceValues.slice(-2); | 
						|
        return head.concat(tail.join(' or ')).join(', '); | 
						|
      } | 
						|
    }, { | 
						|
      key: "validate", | 
						|
      value: function validate(value) { | 
						|
        return this._choices.has(value); | 
						|
      } | 
						|
    }, { | 
						|
      key: "deprecated", | 
						|
      value: function deprecated(value) { | 
						|
        var choiceInfo = this._choices.get(value); | 
						|
 | 
						|
        return choiceInfo && choiceInfo.deprecated ? { | 
						|
          value | 
						|
        } : false; | 
						|
      } | 
						|
    }, { | 
						|
      key: "forward", | 
						|
      value: function forward(value) { | 
						|
        var choiceInfo = this._choices.get(value); | 
						|
 | 
						|
        return choiceInfo ? choiceInfo.forward : undefined; | 
						|
      } | 
						|
    }, { | 
						|
      key: "redirect", | 
						|
      value: function redirect(value) { | 
						|
        var choiceInfo = this._choices.get(value); | 
						|
 | 
						|
        return choiceInfo ? choiceInfo.redirect : undefined; | 
						|
      } | 
						|
    }]); | 
						|
 | 
						|
    return ChoiceSchema; | 
						|
  }(schema.Schema); | 
						|
 | 
						|
  exports.ChoiceSchema = ChoiceSchema; | 
						|
}); | 
						|
unwrapExports(choice); | 
						|
var choice_1 = choice.ChoiceSchema; | 
						|
 | 
						|
var number = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
 | 
						|
  var NumberSchema = | 
						|
  /*#__PURE__*/ | 
						|
  function (_schema_1$Schema) { | 
						|
    _inherits(NumberSchema, _schema_1$Schema); | 
						|
 | 
						|
    function NumberSchema() { | 
						|
      _classCallCheck(this, NumberSchema); | 
						|
 | 
						|
      return _possibleConstructorReturn(this, _getPrototypeOf(NumberSchema).apply(this, arguments)); | 
						|
    } | 
						|
 | 
						|
    _createClass(NumberSchema, [{ | 
						|
      key: "expected", | 
						|
      value: function expected() { | 
						|
        return 'a number'; | 
						|
      } | 
						|
    }, { | 
						|
      key: "validate", | 
						|
      value: function validate(value, _utils) { | 
						|
        return typeof value === 'number'; | 
						|
      } | 
						|
    }]); | 
						|
 | 
						|
    return NumberSchema; | 
						|
  }(schema.Schema); | 
						|
 | 
						|
  exports.NumberSchema = NumberSchema; | 
						|
}); | 
						|
unwrapExports(number); | 
						|
var number_1 = number.NumberSchema; | 
						|
 | 
						|
var integer = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
 | 
						|
  var IntegerSchema = | 
						|
  /*#__PURE__*/ | 
						|
  function (_number_1$NumberSchem) { | 
						|
    _inherits(IntegerSchema, _number_1$NumberSchem); | 
						|
 | 
						|
    function IntegerSchema() { | 
						|
      _classCallCheck(this, IntegerSchema); | 
						|
 | 
						|
      return _possibleConstructorReturn(this, _getPrototypeOf(IntegerSchema).apply(this, arguments)); | 
						|
    } | 
						|
 | 
						|
    _createClass(IntegerSchema, [{ | 
						|
      key: "expected", | 
						|
      value: function expected() { | 
						|
        return 'an integer'; | 
						|
      } | 
						|
    }, { | 
						|
      key: "validate", | 
						|
      value: function validate(value, utils$1) { | 
						|
        return utils$1.normalizeValidateResult(_get(_getPrototypeOf(IntegerSchema.prototype), "validate", this).call(this, value, utils$1), value) === true && utils.isInt(value); | 
						|
      } | 
						|
    }]); | 
						|
 | 
						|
    return IntegerSchema; | 
						|
  }(number.NumberSchema); | 
						|
 | 
						|
  exports.IntegerSchema = IntegerSchema; | 
						|
}); | 
						|
unwrapExports(integer); | 
						|
var integer_1 = integer.IntegerSchema; | 
						|
 | 
						|
var string = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
 | 
						|
  var StringSchema = | 
						|
  /*#__PURE__*/ | 
						|
  function (_schema_1$Schema) { | 
						|
    _inherits(StringSchema, _schema_1$Schema); | 
						|
 | 
						|
    function StringSchema() { | 
						|
      _classCallCheck(this, StringSchema); | 
						|
 | 
						|
      return _possibleConstructorReturn(this, _getPrototypeOf(StringSchema).apply(this, arguments)); | 
						|
    } | 
						|
 | 
						|
    _createClass(StringSchema, [{ | 
						|
      key: "expected", | 
						|
      value: function expected() { | 
						|
        return 'a string'; | 
						|
      } | 
						|
    }, { | 
						|
      key: "validate", | 
						|
      value: function validate(value) { | 
						|
        return typeof value === 'string'; | 
						|
      } | 
						|
    }]); | 
						|
 | 
						|
    return StringSchema; | 
						|
  }(schema.Schema); | 
						|
 | 
						|
  exports.StringSchema = StringSchema; | 
						|
}); | 
						|
unwrapExports(string); | 
						|
var string_1 = string.StringSchema; | 
						|
 | 
						|
var schemas = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
 | 
						|
  tslib_es6.__exportStar(alias, exports); | 
						|
 | 
						|
  tslib_es6.__exportStar(any, exports); | 
						|
 | 
						|
  tslib_es6.__exportStar(array, exports); | 
						|
 | 
						|
  tslib_es6.__exportStar(boolean_1, exports); | 
						|
 | 
						|
  tslib_es6.__exportStar(choice, exports); | 
						|
 | 
						|
  tslib_es6.__exportStar(integer, exports); | 
						|
 | 
						|
  tslib_es6.__exportStar(number, exports); | 
						|
 | 
						|
  tslib_es6.__exportStar(string, exports); | 
						|
}); | 
						|
unwrapExports(schemas); | 
						|
 | 
						|
var defaults = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
  exports.defaultDescriptor = api.apiDescriptor; | 
						|
  exports.defaultUnknownHandler = leven_1.levenUnknownHandler; | 
						|
  exports.defaultInvalidHandler = invalid.commonInvalidHandler; | 
						|
  exports.defaultDeprecatedHandler = common.commonDeprecatedHandler; | 
						|
}); | 
						|
unwrapExports(defaults); | 
						|
var defaults_1 = defaults.defaultDescriptor; | 
						|
var defaults_2 = defaults.defaultUnknownHandler; | 
						|
var defaults_3 = defaults.defaultInvalidHandler; | 
						|
var defaults_4 = defaults.defaultDeprecatedHandler; | 
						|
 | 
						|
var normalize = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
 | 
						|
  exports.normalize = function (options, schemas, opts) { | 
						|
    return new Normalizer(schemas, opts).normalize(options); | 
						|
  }; | 
						|
 | 
						|
  var Normalizer = | 
						|
  /*#__PURE__*/ | 
						|
  function () { | 
						|
    function Normalizer(schemas, opts) { | 
						|
      _classCallCheck(this, Normalizer); | 
						|
 | 
						|
      // istanbul ignore next | 
						|
      var _ref = opts || {}, | 
						|
          _ref$logger = _ref.logger, | 
						|
          logger = _ref$logger === void 0 ? console : _ref$logger, | 
						|
          _ref$descriptor = _ref.descriptor, | 
						|
          descriptor = _ref$descriptor === void 0 ? defaults.defaultDescriptor : _ref$descriptor, | 
						|
          _ref$unknown = _ref.unknown, | 
						|
          unknown = _ref$unknown === void 0 ? defaults.defaultUnknownHandler : _ref$unknown, | 
						|
          _ref$invalid = _ref.invalid, | 
						|
          invalid = _ref$invalid === void 0 ? defaults.defaultInvalidHandler : _ref$invalid, | 
						|
          _ref$deprecated = _ref.deprecated, | 
						|
          deprecated = _ref$deprecated === void 0 ? defaults.defaultDeprecatedHandler : _ref$deprecated; | 
						|
 | 
						|
      this._utils = { | 
						|
        descriptor, | 
						|
        logger: | 
						|
        /* istanbul ignore next */ | 
						|
        logger || { | 
						|
          warn: function warn() {} | 
						|
        }, | 
						|
        schemas: utils.recordFromArray(schemas, 'name'), | 
						|
        normalizeDefaultResult: utils.normalizeDefaultResult, | 
						|
        normalizeDeprecatedResult: utils.normalizeDeprecatedResult, | 
						|
        normalizeForwardResult: utils.normalizeForwardResult, | 
						|
        normalizeRedirectResult: utils.normalizeRedirectResult, | 
						|
        normalizeValidateResult: utils.normalizeValidateResult | 
						|
      }; | 
						|
      this._unknownHandler = unknown; | 
						|
      this._invalidHandler = invalid; | 
						|
      this._deprecatedHandler = deprecated; | 
						|
      this.cleanHistory(); | 
						|
    } | 
						|
 | 
						|
    _createClass(Normalizer, [{ | 
						|
      key: "cleanHistory", | 
						|
      value: function cleanHistory() { | 
						|
        this._hasDeprecationWarned = utils.createAutoChecklist(); | 
						|
      } | 
						|
    }, { | 
						|
      key: "normalize", | 
						|
      value: function normalize(options) { | 
						|
        var _this = this; | 
						|
 | 
						|
        var normalized = {}; | 
						|
        var restOptionsArray = [options]; | 
						|
 | 
						|
        var applyNormalization = function applyNormalization() { | 
						|
          while (restOptionsArray.length !== 0) { | 
						|
            var currentOptions = restOptionsArray.shift(); | 
						|
 | 
						|
            var transferredOptionsArray = _this._applyNormalization(currentOptions, normalized); | 
						|
 | 
						|
            restOptionsArray.push.apply(restOptionsArray, _toConsumableArray$1(transferredOptionsArray)); | 
						|
          } | 
						|
        }; | 
						|
 | 
						|
        applyNormalization(); | 
						|
 | 
						|
        for (var _i = 0, _Object$keys = Object.keys(this._utils.schemas); _i < _Object$keys.length; _i++) { | 
						|
          var key = _Object$keys[_i]; | 
						|
          var schema = this._utils.schemas[key]; | 
						|
 | 
						|
          if (!(key in normalized)) { | 
						|
            var defaultResult = utils.normalizeDefaultResult(schema.default(this._utils)); | 
						|
 | 
						|
            if ('value' in defaultResult) { | 
						|
              restOptionsArray.push({ | 
						|
                [key]: defaultResult.value | 
						|
              }); | 
						|
            } | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        applyNormalization(); | 
						|
 | 
						|
        for (var _i2 = 0, _Object$keys2 = Object.keys(this._utils.schemas); _i2 < _Object$keys2.length; _i2++) { | 
						|
          var _key = _Object$keys2[_i2]; | 
						|
          var _schema = this._utils.schemas[_key]; | 
						|
 | 
						|
          if (_key in normalized) { | 
						|
            normalized[_key] = _schema.postprocess(normalized[_key], this._utils); | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        return normalized; | 
						|
      } | 
						|
    }, { | 
						|
      key: "_applyNormalization", | 
						|
      value: function _applyNormalization(options, normalized) { | 
						|
        var _this2 = this; | 
						|
 | 
						|
        var transferredOptionsArray = []; | 
						|
 | 
						|
        var _utils_1$partition = utils.partition(Object.keys(options), function (key) { | 
						|
          return key in _this2._utils.schemas; | 
						|
        }), | 
						|
            _utils_1$partition2 = _slicedToArray(_utils_1$partition, 2), | 
						|
            knownOptionNames = _utils_1$partition2[0], | 
						|
            unknownOptionNames = _utils_1$partition2[1]; | 
						|
 | 
						|
        var _iteratorNormalCompletion = true; | 
						|
        var _didIteratorError = false; | 
						|
        var _iteratorError = undefined; | 
						|
 | 
						|
        try { | 
						|
          var _loop = function _loop() { | 
						|
            var key = _step.value; | 
						|
            var schema = _this2._utils.schemas[key]; | 
						|
            var value = schema.preprocess(options[key], _this2._utils); | 
						|
            var validateResult = utils.normalizeValidateResult(schema.validate(value, _this2._utils), value); | 
						|
 | 
						|
            if (validateResult !== true) { | 
						|
              var invalidValue = validateResult.value; | 
						|
 | 
						|
              var errorMessageOrError = _this2._invalidHandler(key, invalidValue, _this2._utils); | 
						|
 | 
						|
              throw typeof errorMessageOrError === 'string' ? new Error(errorMessageOrError) : | 
						|
              /* istanbul ignore next*/ | 
						|
              errorMessageOrError; | 
						|
            } | 
						|
 | 
						|
            var appendTransferredOptions = function appendTransferredOptions(_ref2) { | 
						|
              var from = _ref2.from, | 
						|
                  to = _ref2.to; | 
						|
              transferredOptionsArray.push(typeof to === 'string' ? { | 
						|
                [to]: from | 
						|
              } : { | 
						|
                [to.key]: to.value | 
						|
              }); | 
						|
            }; | 
						|
 | 
						|
            var warnDeprecated = function warnDeprecated(_ref3) { | 
						|
              var currentValue = _ref3.value, | 
						|
                  redirectTo = _ref3.redirectTo; | 
						|
              var deprecatedResult = utils.normalizeDeprecatedResult(schema.deprecated(currentValue, _this2._utils), value, | 
						|
              /* doNotNormalizeTrue */ | 
						|
              true); | 
						|
 | 
						|
              if (deprecatedResult === false) { | 
						|
                return; | 
						|
              } | 
						|
 | 
						|
              if (deprecatedResult === true) { | 
						|
                if (!_this2._hasDeprecationWarned(key)) { | 
						|
                  _this2._utils.logger.warn(_this2._deprecatedHandler(key, redirectTo, _this2._utils)); | 
						|
                } | 
						|
              } else { | 
						|
                var _iteratorNormalCompletion3 = true; | 
						|
                var _didIteratorError3 = false; | 
						|
                var _iteratorError3 = undefined; | 
						|
 | 
						|
                try { | 
						|
                  for (var _iterator3 = deprecatedResult[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { | 
						|
                    var deprecatedValue = _step3.value.value; | 
						|
                    var pair = { | 
						|
                      key, | 
						|
                      value: deprecatedValue | 
						|
                    }; | 
						|
 | 
						|
                    if (!_this2._hasDeprecationWarned(pair)) { | 
						|
                      var redirectToPair = typeof redirectTo === 'string' ? { | 
						|
                        key: redirectTo, | 
						|
                        value: deprecatedValue | 
						|
                      } : redirectTo; | 
						|
 | 
						|
                      _this2._utils.logger.warn(_this2._deprecatedHandler(pair, redirectToPair, _this2._utils)); | 
						|
                    } | 
						|
                  } | 
						|
                } catch (err) { | 
						|
                  _didIteratorError3 = true; | 
						|
                  _iteratorError3 = err; | 
						|
                } finally { | 
						|
                  try { | 
						|
                    if (!_iteratorNormalCompletion3 && _iterator3.return != null) { | 
						|
                      _iterator3.return(); | 
						|
                    } | 
						|
                  } finally { | 
						|
                    if (_didIteratorError3) { | 
						|
                      throw _iteratorError3; | 
						|
                    } | 
						|
                  } | 
						|
                } | 
						|
              } | 
						|
            }; | 
						|
 | 
						|
            var forwardResult = utils.normalizeForwardResult(schema.forward(value, _this2._utils), value); | 
						|
            forwardResult.forEach(appendTransferredOptions); | 
						|
            var redirectResult = utils.normalizeRedirectResult(schema.redirect(value, _this2._utils), value); | 
						|
            redirectResult.redirect.forEach(appendTransferredOptions); | 
						|
 | 
						|
            if ('remain' in redirectResult) { | 
						|
              var remainingValue = redirectResult.remain; | 
						|
              normalized[key] = key in normalized ? schema.overlap(normalized[key], remainingValue, _this2._utils) : remainingValue; | 
						|
              warnDeprecated({ | 
						|
                value: remainingValue | 
						|
              }); | 
						|
            } | 
						|
 | 
						|
            var _iteratorNormalCompletion4 = true; | 
						|
            var _didIteratorError4 = false; | 
						|
            var _iteratorError4 = undefined; | 
						|
 | 
						|
            try { | 
						|
              for (var _iterator4 = redirectResult.redirect[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { | 
						|
                var _step4$value = _step4.value, | 
						|
                    from = _step4$value.from, | 
						|
                    to = _step4$value.to; | 
						|
                warnDeprecated({ | 
						|
                  value: from, | 
						|
                  redirectTo: to | 
						|
                }); | 
						|
              } | 
						|
            } catch (err) { | 
						|
              _didIteratorError4 = true; | 
						|
              _iteratorError4 = err; | 
						|
            } finally { | 
						|
              try { | 
						|
                if (!_iteratorNormalCompletion4 && _iterator4.return != null) { | 
						|
                  _iterator4.return(); | 
						|
                } | 
						|
              } finally { | 
						|
                if (_didIteratorError4) { | 
						|
                  throw _iteratorError4; | 
						|
                } | 
						|
              } | 
						|
            } | 
						|
          }; | 
						|
 | 
						|
          for (var _iterator = knownOptionNames[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | 
						|
            _loop(); | 
						|
          } | 
						|
        } catch (err) { | 
						|
          _didIteratorError = true; | 
						|
          _iteratorError = err; | 
						|
        } finally { | 
						|
          try { | 
						|
            if (!_iteratorNormalCompletion && _iterator.return != null) { | 
						|
              _iterator.return(); | 
						|
            } | 
						|
          } finally { | 
						|
            if (_didIteratorError) { | 
						|
              throw _iteratorError; | 
						|
            } | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        var _iteratorNormalCompletion2 = true; | 
						|
        var _didIteratorError2 = false; | 
						|
        var _iteratorError2 = undefined; | 
						|
 | 
						|
        try { | 
						|
          for (var _iterator2 = unknownOptionNames[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { | 
						|
            var key = _step2.value; | 
						|
            var value = options[key]; | 
						|
 | 
						|
            var unknownResult = this._unknownHandler(key, value, this._utils); | 
						|
 | 
						|
            if (unknownResult) { | 
						|
              for (var _i3 = 0, _Object$keys3 = Object.keys(unknownResult); _i3 < _Object$keys3.length; _i3++) { | 
						|
                var unknownKey = _Object$keys3[_i3]; | 
						|
                var unknownOption = { | 
						|
                  [unknownKey]: unknownResult[unknownKey] | 
						|
                }; | 
						|
 | 
						|
                if (unknownKey in this._utils.schemas) { | 
						|
                  transferredOptionsArray.push(unknownOption); | 
						|
                } else { | 
						|
                  Object.assign(normalized, unknownOption); | 
						|
                } | 
						|
              } | 
						|
            } | 
						|
          } | 
						|
        } catch (err) { | 
						|
          _didIteratorError2 = true; | 
						|
          _iteratorError2 = err; | 
						|
        } finally { | 
						|
          try { | 
						|
            if (!_iteratorNormalCompletion2 && _iterator2.return != null) { | 
						|
              _iterator2.return(); | 
						|
            } | 
						|
          } finally { | 
						|
            if (_didIteratorError2) { | 
						|
              throw _iteratorError2; | 
						|
            } | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        return transferredOptionsArray; | 
						|
      } | 
						|
    }]); | 
						|
 | 
						|
    return Normalizer; | 
						|
  }(); | 
						|
 | 
						|
  exports.Normalizer = Normalizer; | 
						|
}); | 
						|
unwrapExports(normalize); | 
						|
var normalize_1 = normalize.normalize; | 
						|
var normalize_2 = normalize.Normalizer; | 
						|
 | 
						|
var lib = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
 | 
						|
  tslib_es6.__exportStar(descriptors, exports); | 
						|
 | 
						|
  tslib_es6.__exportStar(handlers, exports); | 
						|
 | 
						|
  tslib_es6.__exportStar(schemas, exports); | 
						|
 | 
						|
  tslib_es6.__exportStar(normalize, exports); | 
						|
 | 
						|
  tslib_es6.__exportStar(schema, exports); | 
						|
}); | 
						|
unwrapExports(lib); | 
						|
 | 
						|
var array$1 = []; | 
						|
var charCodeCache$1 = []; | 
						|
 | 
						|
var leven$1 = function leven(left, right) { | 
						|
  if (left === right) { | 
						|
    return 0; | 
						|
  } | 
						|
 | 
						|
  var swap = left; // Swapping the strings if `a` is longer than `b` so we know which one is the | 
						|
  // shortest & which one is the longest | 
						|
 | 
						|
  if (left.length > right.length) { | 
						|
    left = right; | 
						|
    right = swap; | 
						|
  } | 
						|
 | 
						|
  var leftLength = left.length; | 
						|
  var rightLength = right.length; // Performing suffix trimming: | 
						|
  // We can linearly drop suffix common to both strings since they | 
						|
  // don't increase distance at all | 
						|
  // Note: `~-` is the bitwise way to perform a `- 1` operation | 
						|
 | 
						|
  while (leftLength > 0 && left.charCodeAt(~-leftLength) === right.charCodeAt(~-rightLength)) { | 
						|
    leftLength--; | 
						|
    rightLength--; | 
						|
  } // Performing prefix trimming | 
						|
  // We can linearly drop prefix common to both strings since they | 
						|
  // don't increase distance at all | 
						|
 | 
						|
 | 
						|
  var start = 0; | 
						|
 | 
						|
  while (start < leftLength && left.charCodeAt(start) === right.charCodeAt(start)) { | 
						|
    start++; | 
						|
  } | 
						|
 | 
						|
  leftLength -= start; | 
						|
  rightLength -= start; | 
						|
 | 
						|
  if (leftLength === 0) { | 
						|
    return rightLength; | 
						|
  } | 
						|
 | 
						|
  var bCharCode; | 
						|
  var result; | 
						|
  var temp; | 
						|
  var temp2; | 
						|
  var i = 0; | 
						|
  var j = 0; | 
						|
 | 
						|
  while (i < leftLength) { | 
						|
    charCodeCache$1[i] = left.charCodeAt(start + i); | 
						|
    array$1[i] = ++i; | 
						|
  } | 
						|
 | 
						|
  while (j < rightLength) { | 
						|
    bCharCode = right.charCodeAt(start + j); | 
						|
    temp = j++; | 
						|
    result = j; | 
						|
 | 
						|
    for (i = 0; i < leftLength; i++) { | 
						|
      temp2 = bCharCode === charCodeCache$1[i] ? temp : temp + 1; | 
						|
      temp = array$1[i]; // eslint-disable-next-line no-multi-assign | 
						|
 | 
						|
      result = array$1[i] = temp > result ? temp2 > result ? result + 1 : temp2 : temp2 > temp ? temp + 1 : temp2; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return result; | 
						|
}; | 
						|
 | 
						|
var leven_1$1 = leven$1; // TODO: Remove this for the next major release | 
						|
 | 
						|
var default_1 = leven$1; | 
						|
leven_1$1.default = default_1; | 
						|
 | 
						|
var cliDescriptor = { | 
						|
  key: function key(_key) { | 
						|
    return _key.length === 1 ? `-${_key}` : `--${_key}`; | 
						|
  }, | 
						|
  value: function value(_value) { | 
						|
    return lib.apiDescriptor.value(_value); | 
						|
  }, | 
						|
  pair: function pair(_ref) { | 
						|
    var key = _ref.key, | 
						|
        value = _ref.value; | 
						|
    return value === false ? `--no-${key}` : value === true ? cliDescriptor.key(key) : value === "" ? `${cliDescriptor.key(key)} without an argument` : `${cliDescriptor.key(key)}=${value}`; | 
						|
  } | 
						|
}; | 
						|
 | 
						|
var FlagSchema = | 
						|
/*#__PURE__*/ | 
						|
function (_vnopts$ChoiceSchema) { | 
						|
  _inherits(FlagSchema, _vnopts$ChoiceSchema); | 
						|
 | 
						|
  function FlagSchema(_ref2) { | 
						|
    var _this; | 
						|
 | 
						|
    var name = _ref2.name, | 
						|
        flags = _ref2.flags; | 
						|
 | 
						|
    _classCallCheck(this, FlagSchema); | 
						|
 | 
						|
    _this = _possibleConstructorReturn(this, _getPrototypeOf(FlagSchema).call(this, { | 
						|
      name, | 
						|
      choices: flags | 
						|
    })); | 
						|
    _this._flags = flags.slice().sort(); | 
						|
    return _this; | 
						|
  } | 
						|
 | 
						|
  _createClass(FlagSchema, [{ | 
						|
    key: "preprocess", | 
						|
    value: function preprocess(value, utils) { | 
						|
      if (typeof value === "string" && value.length !== 0 && this._flags.indexOf(value) === -1) { | 
						|
        var suggestion = this._flags.find(function (flag) { | 
						|
          return leven_1$1(flag, value) < 3; | 
						|
        }); | 
						|
 | 
						|
        if (suggestion) { | 
						|
          utils.logger.warn([`Unknown flag ${chalk.yellow(utils.descriptor.value(value))},`, `did you mean ${chalk.blue(utils.descriptor.value(suggestion))}?`].join(" ")); | 
						|
          return suggestion; | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      return value; | 
						|
    } | 
						|
  }, { | 
						|
    key: "expected", | 
						|
    value: function expected() { | 
						|
      return "a flag"; | 
						|
    } | 
						|
  }]); | 
						|
 | 
						|
  return FlagSchema; | 
						|
}(lib.ChoiceSchema); | 
						|
 | 
						|
var hasDeprecationWarned; | 
						|
 | 
						|
function normalizeOptions(options, optionInfos) { | 
						|
  var _ref3 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, | 
						|
      logger = _ref3.logger, | 
						|
      _ref3$isCLI = _ref3.isCLI, | 
						|
      isCLI = _ref3$isCLI === void 0 ? false : _ref3$isCLI, | 
						|
      _ref3$passThrough = _ref3.passThrough, | 
						|
      passThrough = _ref3$passThrough === void 0 ? false : _ref3$passThrough; | 
						|
 | 
						|
  var unknown = !passThrough ? lib.levenUnknownHandler : Array.isArray(passThrough) ? function (key, value) { | 
						|
    return passThrough.indexOf(key) === -1 ? undefined : { | 
						|
      [key]: value | 
						|
    }; | 
						|
  } : function (key, value) { | 
						|
    return { | 
						|
      [key]: value | 
						|
    }; | 
						|
  }; | 
						|
  var descriptor = isCLI ? cliDescriptor : lib.apiDescriptor; | 
						|
  var schemas = optionInfosToSchemas(optionInfos, { | 
						|
    isCLI | 
						|
  }); | 
						|
  var normalizer = new lib.Normalizer(schemas, { | 
						|
    logger, | 
						|
    unknown, | 
						|
    descriptor | 
						|
  }); | 
						|
  var shouldSuppressDuplicateDeprecationWarnings = logger !== false; | 
						|
 | 
						|
  if (shouldSuppressDuplicateDeprecationWarnings && hasDeprecationWarned) { | 
						|
    normalizer._hasDeprecationWarned = hasDeprecationWarned; | 
						|
  } | 
						|
 | 
						|
  var normalized = normalizer.normalize(options); | 
						|
 | 
						|
  if (shouldSuppressDuplicateDeprecationWarnings) { | 
						|
    hasDeprecationWarned = normalizer._hasDeprecationWarned; | 
						|
  } | 
						|
 | 
						|
  return normalized; | 
						|
} | 
						|
 | 
						|
function optionInfosToSchemas(optionInfos, _ref4) { | 
						|
  var isCLI = _ref4.isCLI; | 
						|
  var schemas = []; | 
						|
 | 
						|
  if (isCLI) { | 
						|
    schemas.push(lib.AnySchema.create({ | 
						|
      name: "_" | 
						|
    })); | 
						|
  } | 
						|
 | 
						|
  var _iteratorNormalCompletion = true; | 
						|
  var _didIteratorError = false; | 
						|
  var _iteratorError = undefined; | 
						|
 | 
						|
  try { | 
						|
    for (var _iterator = optionInfos[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | 
						|
      var optionInfo = _step.value; | 
						|
      schemas.push(optionInfoToSchema(optionInfo, { | 
						|
        isCLI, | 
						|
        optionInfos | 
						|
      })); | 
						|
 | 
						|
      if (optionInfo.alias && isCLI) { | 
						|
        schemas.push(lib.AliasSchema.create({ | 
						|
          name: optionInfo.alias, | 
						|
          sourceName: optionInfo.name | 
						|
        })); | 
						|
      } | 
						|
    } | 
						|
  } catch (err) { | 
						|
    _didIteratorError = true; | 
						|
    _iteratorError = err; | 
						|
  } finally { | 
						|
    try { | 
						|
      if (!_iteratorNormalCompletion && _iterator.return != null) { | 
						|
        _iterator.return(); | 
						|
      } | 
						|
    } finally { | 
						|
      if (_didIteratorError) { | 
						|
        throw _iteratorError; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return schemas; | 
						|
} | 
						|
 | 
						|
function optionInfoToSchema(optionInfo, _ref5) { | 
						|
  var isCLI = _ref5.isCLI, | 
						|
      optionInfos = _ref5.optionInfos; | 
						|
  var SchemaConstructor; | 
						|
  var parameters = { | 
						|
    name: optionInfo.name | 
						|
  }; | 
						|
  var handlers = {}; | 
						|
 | 
						|
  switch (optionInfo.type) { | 
						|
    case "int": | 
						|
      SchemaConstructor = lib.IntegerSchema; | 
						|
 | 
						|
      if (isCLI) { | 
						|
        parameters.preprocess = function (value) { | 
						|
          return Number(value); | 
						|
        }; | 
						|
      } | 
						|
 | 
						|
      break; | 
						|
 | 
						|
    case "string": | 
						|
      SchemaConstructor = lib.StringSchema; | 
						|
      break; | 
						|
 | 
						|
    case "choice": | 
						|
      SchemaConstructor = lib.ChoiceSchema; | 
						|
      parameters.choices = optionInfo.choices.map(function (choiceInfo) { | 
						|
        return typeof choiceInfo === "object" && choiceInfo.redirect ? Object.assign({}, choiceInfo, { | 
						|
          redirect: { | 
						|
            to: { | 
						|
              key: optionInfo.name, | 
						|
              value: choiceInfo.redirect | 
						|
            } | 
						|
          } | 
						|
        }) : choiceInfo; | 
						|
      }); | 
						|
      break; | 
						|
 | 
						|
    case "boolean": | 
						|
      SchemaConstructor = lib.BooleanSchema; | 
						|
      break; | 
						|
 | 
						|
    case "flag": | 
						|
      SchemaConstructor = FlagSchema; | 
						|
      parameters.flags = optionInfos.map(function (optionInfo) { | 
						|
        return [].concat(optionInfo.alias || [], optionInfo.description ? optionInfo.name : [], optionInfo.oppositeDescription ? `no-${optionInfo.name}` : []); | 
						|
      }).reduce(function (a, b) { | 
						|
        return a.concat(b); | 
						|
      }, []); | 
						|
      break; | 
						|
 | 
						|
    case "path": | 
						|
      SchemaConstructor = lib.StringSchema; | 
						|
      break; | 
						|
 | 
						|
    default: | 
						|
      throw new Error(`Unexpected type ${optionInfo.type}`); | 
						|
  } | 
						|
 | 
						|
  if (optionInfo.exception) { | 
						|
    parameters.validate = function (value, schema, utils) { | 
						|
      return optionInfo.exception(value) || schema.validate(value, utils); | 
						|
    }; | 
						|
  } else { | 
						|
    parameters.validate = function (value, schema, utils) { | 
						|
      return value === undefined || schema.validate(value, utils); | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  if (optionInfo.redirect) { | 
						|
    handlers.redirect = function (value) { | 
						|
      return !value ? undefined : { | 
						|
        to: { | 
						|
          key: optionInfo.redirect.option, | 
						|
          value: optionInfo.redirect.value | 
						|
        } | 
						|
      }; | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  if (optionInfo.deprecated) { | 
						|
    handlers.deprecated = true; | 
						|
  } // allow CLI overriding, e.g., prettier package.json --tab-width 1 --tab-width 2 | 
						|
 | 
						|
 | 
						|
  if (isCLI && !optionInfo.array) { | 
						|
    var originalPreprocess = parameters.preprocess || function (x) { | 
						|
      return x; | 
						|
    }; | 
						|
 | 
						|
    parameters.preprocess = function (value, schema, utils) { | 
						|
      return schema.preprocess(originalPreprocess(Array.isArray(value) ? value[value.length - 1] : value), utils); | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  return optionInfo.array ? lib.ArraySchema.create(Object.assign(isCLI ? { | 
						|
    preprocess: function preprocess(v) { | 
						|
      return [].concat(v); | 
						|
    } | 
						|
  } : {}, handlers, { | 
						|
    valueSchema: SchemaConstructor.create(parameters) | 
						|
  })) : SchemaConstructor.create(Object.assign({}, parameters, handlers)); | 
						|
} | 
						|
 | 
						|
function normalizeApiOptions(options, optionInfos, opts) { | 
						|
  return normalizeOptions(options, optionInfos, opts); | 
						|
} | 
						|
 | 
						|
function normalizeCliOptions(options, optionInfos, opts) { | 
						|
  return normalizeOptions(options, optionInfos, Object.assign({ | 
						|
    isCLI: true | 
						|
  }, opts)); | 
						|
} | 
						|
 | 
						|
var optionsNormalizer = { | 
						|
  normalizeApiOptions, | 
						|
  normalizeCliOptions | 
						|
}; | 
						|
 | 
						|
var getLast = function getLast(arr) { | 
						|
  return arr.length > 0 ? arr[arr.length - 1] : null; | 
						|
}; | 
						|
 | 
						|
function locStart(node, opts) { | 
						|
  opts = opts || {}; // Handle nodes with decorators. They should start at the first decorator | 
						|
 | 
						|
  if (!opts.ignoreDecorators && node.declaration && node.declaration.decorators && node.declaration.decorators.length > 0) { | 
						|
    return locStart(node.declaration.decorators[0]); | 
						|
  } | 
						|
 | 
						|
  if (!opts.ignoreDecorators && node.decorators && node.decorators.length > 0) { | 
						|
    return locStart(node.decorators[0]); | 
						|
  } | 
						|
 | 
						|
  if (node.__location) { | 
						|
    return node.__location.startOffset; | 
						|
  } | 
						|
 | 
						|
  if (node.range) { | 
						|
    return node.range[0]; | 
						|
  } | 
						|
 | 
						|
  if (typeof node.start === "number") { | 
						|
    return node.start; | 
						|
  } | 
						|
 | 
						|
  if (node.loc) { | 
						|
    return node.loc.start; | 
						|
  } | 
						|
 | 
						|
  return null; | 
						|
} | 
						|
 | 
						|
function locEnd(node) { | 
						|
  var endNode = node.nodes && getLast(node.nodes); | 
						|
 | 
						|
  if (endNode && node.source && !node.source.end) { | 
						|
    node = endNode; | 
						|
  } | 
						|
 | 
						|
  if (node.__location) { | 
						|
    return node.__location.endOffset; | 
						|
  } | 
						|
 | 
						|
  var loc = node.range ? node.range[1] : typeof node.end === "number" ? node.end : null; | 
						|
 | 
						|
  if (node.typeAnnotation) { | 
						|
    return Math.max(loc, locEnd(node.typeAnnotation)); | 
						|
  } | 
						|
 | 
						|
  if (node.loc && !loc) { | 
						|
    return node.loc.end; | 
						|
  } | 
						|
 | 
						|
  return loc; | 
						|
} | 
						|
 | 
						|
var loc = { | 
						|
  locStart, | 
						|
  locEnd | 
						|
}; | 
						|
 | 
						|
var jsTokens = createCommonjsModule(function (module, exports) { | 
						|
  // Copyright 2014, 2015, 2016, 2017, 2018 Simon Lydell | 
						|
  // License: MIT. (See LICENSE.) | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); // This regex comes from regex.coffee, and is inserted here by generate-index.js | 
						|
  // (run `npm run build`). | 
						|
 | 
						|
  exports.default = /((['"])(?:(?!\2|\\).|\\(?:\r\n|[\s\S]))*(\2)?|`(?:[^`\\$]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{[^}]*\}?)*\}?)*(`)?)|(\/\/.*)|(\/\*(?:[^*]|\*(?!\/))*(\*\/)?)|(\/(?!\*)(?:\[(?:(?![\]\\]).|\\.)*\]|(?![\/\]\\]).|\\.)+\/(?:(?!\s*(?:\b|[\u0080-\uFFFF$\\'"~({]|[+\-!](?!=)|\.?\d))|[gmiyus]{1,6}\b(?![\u0080-\uFFFF$\\]|\s*(?:[+\-*%&|^<>!=?({]|\/(?![\/*])))))|(0[xX][\da-fA-F]+|0[oO][0-7]+|0[bB][01]+|(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?)|((?!\d)(?:(?!\s)[$\w\u0080-\uFFFF]|\\u[\da-fA-F]{4}|\\u\{[\da-fA-F]+\})+)|(--|\+\+|&&|\|\||=>|\.{3}|(?:[+\-\/%&|^]|\*{1,2}|<{1,2}|>{1,3}|!=?|={1,2})=?|[?~.,:;[\](){}])|(\s+)|(^$|[\s\S])/g; | 
						|
 | 
						|
  exports.matchToToken = function (match) { | 
						|
    var token = { | 
						|
      type: "invalid", | 
						|
      value: match[0], | 
						|
      closed: undefined | 
						|
    }; | 
						|
    if (match[1]) token.type = "string", token.closed = !!(match[3] || match[4]);else if (match[5]) token.type = "comment";else if (match[6]) token.type = "comment", token.closed = !!match[7];else if (match[8]) token.type = "regex";else if (match[9]) token.type = "number";else if (match[10]) token.type = "name";else if (match[11]) token.type = "punctuator";else if (match[12]) token.type = "whitespace"; | 
						|
    return token; | 
						|
  }; | 
						|
}); | 
						|
unwrapExports(jsTokens); | 
						|
var jsTokens_1 = jsTokens.matchToToken; | 
						|
 | 
						|
var ast = createCommonjsModule(function (module) { | 
						|
  /* | 
						|
    Copyright (C) 2013 Yusuke Suzuki <utatane.tea@gmail.com> | 
						|
   | 
						|
    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. | 
						|
   | 
						|
    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 <COPYRIGHT HOLDER> 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. | 
						|
  */ | 
						|
  (function () { | 
						|
 | 
						|
    function isExpression(node) { | 
						|
      if (node == null) { | 
						|
        return false; | 
						|
      } | 
						|
 | 
						|
      switch (node.type) { | 
						|
        case 'ArrayExpression': | 
						|
        case 'AssignmentExpression': | 
						|
        case 'BinaryExpression': | 
						|
        case 'CallExpression': | 
						|
        case 'ConditionalExpression': | 
						|
        case 'FunctionExpression': | 
						|
        case 'Identifier': | 
						|
        case 'Literal': | 
						|
        case 'LogicalExpression': | 
						|
        case 'MemberExpression': | 
						|
        case 'NewExpression': | 
						|
        case 'ObjectExpression': | 
						|
        case 'SequenceExpression': | 
						|
        case 'ThisExpression': | 
						|
        case 'UnaryExpression': | 
						|
        case 'UpdateExpression': | 
						|
          return true; | 
						|
      } | 
						|
 | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    function isIterationStatement(node) { | 
						|
      if (node == null) { | 
						|
        return false; | 
						|
      } | 
						|
 | 
						|
      switch (node.type) { | 
						|
        case 'DoWhileStatement': | 
						|
        case 'ForInStatement': | 
						|
        case 'ForStatement': | 
						|
        case 'WhileStatement': | 
						|
          return true; | 
						|
      } | 
						|
 | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    function isStatement(node) { | 
						|
      if (node == null) { | 
						|
        return false; | 
						|
      } | 
						|
 | 
						|
      switch (node.type) { | 
						|
        case 'BlockStatement': | 
						|
        case 'BreakStatement': | 
						|
        case 'ContinueStatement': | 
						|
        case 'DebuggerStatement': | 
						|
        case 'DoWhileStatement': | 
						|
        case 'EmptyStatement': | 
						|
        case 'ExpressionStatement': | 
						|
        case 'ForInStatement': | 
						|
        case 'ForStatement': | 
						|
        case 'IfStatement': | 
						|
        case 'LabeledStatement': | 
						|
        case 'ReturnStatement': | 
						|
        case 'SwitchStatement': | 
						|
        case 'ThrowStatement': | 
						|
        case 'TryStatement': | 
						|
        case 'VariableDeclaration': | 
						|
        case 'WhileStatement': | 
						|
        case 'WithStatement': | 
						|
          return true; | 
						|
      } | 
						|
 | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    function isSourceElement(node) { | 
						|
      return isStatement(node) || node != null && node.type === 'FunctionDeclaration'; | 
						|
    } | 
						|
 | 
						|
    function trailingStatement(node) { | 
						|
      switch (node.type) { | 
						|
        case 'IfStatement': | 
						|
          if (node.alternate != null) { | 
						|
            return node.alternate; | 
						|
          } | 
						|
 | 
						|
          return node.consequent; | 
						|
 | 
						|
        case 'LabeledStatement': | 
						|
        case 'ForStatement': | 
						|
        case 'ForInStatement': | 
						|
        case 'WhileStatement': | 
						|
        case 'WithStatement': | 
						|
          return node.body; | 
						|
      } | 
						|
 | 
						|
      return null; | 
						|
    } | 
						|
 | 
						|
    function isProblematicIfStatement(node) { | 
						|
      var current; | 
						|
 | 
						|
      if (node.type !== 'IfStatement') { | 
						|
        return false; | 
						|
      } | 
						|
 | 
						|
      if (node.alternate == null) { | 
						|
        return false; | 
						|
      } | 
						|
 | 
						|
      current = node.consequent; | 
						|
 | 
						|
      do { | 
						|
        if (current.type === 'IfStatement') { | 
						|
          if (current.alternate == null) { | 
						|
            return true; | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        current = trailingStatement(current); | 
						|
      } while (current); | 
						|
 | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    module.exports = { | 
						|
      isExpression: isExpression, | 
						|
      isStatement: isStatement, | 
						|
      isIterationStatement: isIterationStatement, | 
						|
      isSourceElement: isSourceElement, | 
						|
      isProblematicIfStatement: isProblematicIfStatement, | 
						|
      trailingStatement: trailingStatement | 
						|
    }; | 
						|
  })(); | 
						|
  /* vim: set sw=4 ts=4 et tw=80 : */ | 
						|
 | 
						|
}); | 
						|
var ast_1 = ast.isExpression; | 
						|
var ast_2 = ast.isStatement; | 
						|
var ast_3 = ast.isIterationStatement; | 
						|
var ast_4 = ast.isSourceElement; | 
						|
var ast_5 = ast.isProblematicIfStatement; | 
						|
var ast_6 = ast.trailingStatement; | 
						|
 | 
						|
var code = createCommonjsModule(function (module) { | 
						|
  /* | 
						|
    Copyright (C) 2013-2014 Yusuke Suzuki <utatane.tea@gmail.com> | 
						|
    Copyright (C) 2014 Ivan Nikulin <ifaaan@gmail.com> | 
						|
   | 
						|
    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. | 
						|
   | 
						|
    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 <COPYRIGHT HOLDER> 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. | 
						|
  */ | 
						|
  (function () { | 
						|
 | 
						|
    var ES6Regex, ES5Regex, NON_ASCII_WHITESPACES, IDENTIFIER_START, IDENTIFIER_PART, ch; // See `tools/generate-identifier-regex.js`. | 
						|
 | 
						|
    ES5Regex = { | 
						|
      // ECMAScript 5.1/Unicode v9.0.0 NonAsciiIdentifierStart: | 
						|
      NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/, | 
						|
      // ECMAScript 5.1/Unicode v9.0.0 NonAsciiIdentifierPart: | 
						|
      NonAsciiIdentifierPart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/ | 
						|
    }; | 
						|
    ES6Regex = { | 
						|
      // ECMAScript 6/Unicode v9.0.0 NonAsciiIdentifierStart: | 
						|
      NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]/, | 
						|
      // ECMAScript 6/Unicode v9.0.0 NonAsciiIdentifierPart: | 
						|
      NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/ | 
						|
    }; | 
						|
 | 
						|
    function isDecimalDigit(ch) { | 
						|
      return 0x30 <= ch && ch <= 0x39; // 0..9 | 
						|
    } | 
						|
 | 
						|
    function isHexDigit(ch) { | 
						|
      return 0x30 <= ch && ch <= 0x39 || // 0..9 | 
						|
      0x61 <= ch && ch <= 0x66 || // a..f | 
						|
      0x41 <= ch && ch <= 0x46; // A..F | 
						|
    } | 
						|
 | 
						|
    function isOctalDigit(ch) { | 
						|
      return ch >= 0x30 && ch <= 0x37; // 0..7 | 
						|
    } // 7.2 White Space | 
						|
 | 
						|
 | 
						|
    NON_ASCII_WHITESPACES = [0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF]; | 
						|
 | 
						|
    function isWhiteSpace(ch) { | 
						|
      return ch === 0x20 || ch === 0x09 || ch === 0x0B || ch === 0x0C || ch === 0xA0 || ch >= 0x1680 && NON_ASCII_WHITESPACES.indexOf(ch) >= 0; | 
						|
    } // 7.3 Line Terminators | 
						|
 | 
						|
 | 
						|
    function isLineTerminator(ch) { | 
						|
      return ch === 0x0A || ch === 0x0D || ch === 0x2028 || ch === 0x2029; | 
						|
    } // 7.6 Identifier Names and Identifiers | 
						|
 | 
						|
 | 
						|
    function fromCodePoint(cp) { | 
						|
      if (cp <= 0xFFFF) { | 
						|
        return String.fromCharCode(cp); | 
						|
      } | 
						|
 | 
						|
      var cu1 = String.fromCharCode(Math.floor((cp - 0x10000) / 0x400) + 0xD800); | 
						|
      var cu2 = String.fromCharCode((cp - 0x10000) % 0x400 + 0xDC00); | 
						|
      return cu1 + cu2; | 
						|
    } | 
						|
 | 
						|
    IDENTIFIER_START = new Array(0x80); | 
						|
 | 
						|
    for (ch = 0; ch < 0x80; ++ch) { | 
						|
      IDENTIFIER_START[ch] = ch >= 0x61 && ch <= 0x7A || // a..z | 
						|
      ch >= 0x41 && ch <= 0x5A || // A..Z | 
						|
      ch === 0x24 || ch === 0x5F; // $ (dollar) and _ (underscore) | 
						|
    } | 
						|
 | 
						|
    IDENTIFIER_PART = new Array(0x80); | 
						|
 | 
						|
    for (ch = 0; ch < 0x80; ++ch) { | 
						|
      IDENTIFIER_PART[ch] = ch >= 0x61 && ch <= 0x7A || // a..z | 
						|
      ch >= 0x41 && ch <= 0x5A || // A..Z | 
						|
      ch >= 0x30 && ch <= 0x39 || // 0..9 | 
						|
      ch === 0x24 || ch === 0x5F; // $ (dollar) and _ (underscore) | 
						|
    } | 
						|
 | 
						|
    function isIdentifierStartES5(ch) { | 
						|
      return ch < 0x80 ? IDENTIFIER_START[ch] : ES5Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch)); | 
						|
    } | 
						|
 | 
						|
    function isIdentifierPartES5(ch) { | 
						|
      return ch < 0x80 ? IDENTIFIER_PART[ch] : ES5Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch)); | 
						|
    } | 
						|
 | 
						|
    function isIdentifierStartES6(ch) { | 
						|
      return ch < 0x80 ? IDENTIFIER_START[ch] : ES6Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch)); | 
						|
    } | 
						|
 | 
						|
    function isIdentifierPartES6(ch) { | 
						|
      return ch < 0x80 ? IDENTIFIER_PART[ch] : ES6Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch)); | 
						|
    } | 
						|
 | 
						|
    module.exports = { | 
						|
      isDecimalDigit: isDecimalDigit, | 
						|
      isHexDigit: isHexDigit, | 
						|
      isOctalDigit: isOctalDigit, | 
						|
      isWhiteSpace: isWhiteSpace, | 
						|
      isLineTerminator: isLineTerminator, | 
						|
      isIdentifierStartES5: isIdentifierStartES5, | 
						|
      isIdentifierPartES5: isIdentifierPartES5, | 
						|
      isIdentifierStartES6: isIdentifierStartES6, | 
						|
      isIdentifierPartES6: isIdentifierPartES6 | 
						|
    }; | 
						|
  })(); | 
						|
  /* vim: set sw=4 ts=4 et tw=80 : */ | 
						|
 | 
						|
}); | 
						|
var code_1 = code.isDecimalDigit; | 
						|
var code_2 = code.isHexDigit; | 
						|
var code_3 = code.isOctalDigit; | 
						|
var code_4 = code.isWhiteSpace; | 
						|
var code_5 = code.isLineTerminator; | 
						|
var code_6 = code.isIdentifierStartES5; | 
						|
var code_7 = code.isIdentifierPartES5; | 
						|
var code_8 = code.isIdentifierStartES6; | 
						|
var code_9 = code.isIdentifierPartES6; | 
						|
 | 
						|
var keyword = createCommonjsModule(function (module) { | 
						|
  /* | 
						|
    Copyright (C) 2013 Yusuke Suzuki <utatane.tea@gmail.com> | 
						|
   | 
						|
    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. | 
						|
   | 
						|
    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 <COPYRIGHT HOLDER> 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. | 
						|
  */ | 
						|
  (function () { | 
						|
 | 
						|
    var code$1 = code; | 
						|
 | 
						|
    function isStrictModeReservedWordES6(id) { | 
						|
      switch (id) { | 
						|
        case 'implements': | 
						|
        case 'interface': | 
						|
        case 'package': | 
						|
        case 'private': | 
						|
        case 'protected': | 
						|
        case 'public': | 
						|
        case 'static': | 
						|
        case 'let': | 
						|
          return true; | 
						|
 | 
						|
        default: | 
						|
          return false; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    function isKeywordES5(id, strict) { | 
						|
      // yield should not be treated as keyword under non-strict mode. | 
						|
      if (!strict && id === 'yield') { | 
						|
        return false; | 
						|
      } | 
						|
 | 
						|
      return isKeywordES6(id, strict); | 
						|
    } | 
						|
 | 
						|
    function isKeywordES6(id, strict) { | 
						|
      if (strict && isStrictModeReservedWordES6(id)) { | 
						|
        return true; | 
						|
      } | 
						|
 | 
						|
      switch (id.length) { | 
						|
        case 2: | 
						|
          return id === 'if' || id === 'in' || id === 'do'; | 
						|
 | 
						|
        case 3: | 
						|
          return id === 'var' || id === 'for' || id === 'new' || id === 'try'; | 
						|
 | 
						|
        case 4: | 
						|
          return id === 'this' || id === 'else' || id === 'case' || id === 'void' || id === 'with' || id === 'enum'; | 
						|
 | 
						|
        case 5: | 
						|
          return id === 'while' || id === 'break' || id === 'catch' || id === 'throw' || id === 'const' || id === 'yield' || id === 'class' || id === 'super'; | 
						|
 | 
						|
        case 6: | 
						|
          return id === 'return' || id === 'typeof' || id === 'delete' || id === 'switch' || id === 'export' || id === 'import'; | 
						|
 | 
						|
        case 7: | 
						|
          return id === 'default' || id === 'finally' || id === 'extends'; | 
						|
 | 
						|
        case 8: | 
						|
          return id === 'function' || id === 'continue' || id === 'debugger'; | 
						|
 | 
						|
        case 10: | 
						|
          return id === 'instanceof'; | 
						|
 | 
						|
        default: | 
						|
          return false; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    function isReservedWordES5(id, strict) { | 
						|
      return id === 'null' || id === 'true' || id === 'false' || isKeywordES5(id, strict); | 
						|
    } | 
						|
 | 
						|
    function isReservedWordES6(id, strict) { | 
						|
      return id === 'null' || id === 'true' || id === 'false' || isKeywordES6(id, strict); | 
						|
    } | 
						|
 | 
						|
    function isRestrictedWord(id) { | 
						|
      return id === 'eval' || id === 'arguments'; | 
						|
    } | 
						|
 | 
						|
    function isIdentifierNameES5(id) { | 
						|
      var i, iz, ch; | 
						|
 | 
						|
      if (id.length === 0) { | 
						|
        return false; | 
						|
      } | 
						|
 | 
						|
      ch = id.charCodeAt(0); | 
						|
 | 
						|
      if (!code$1.isIdentifierStartES5(ch)) { | 
						|
        return false; | 
						|
      } | 
						|
 | 
						|
      for (i = 1, iz = id.length; i < iz; ++i) { | 
						|
        ch = id.charCodeAt(i); | 
						|
 | 
						|
        if (!code$1.isIdentifierPartES5(ch)) { | 
						|
          return false; | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      return true; | 
						|
    } | 
						|
 | 
						|
    function decodeUtf16(lead, trail) { | 
						|
      return (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000; | 
						|
    } | 
						|
 | 
						|
    function isIdentifierNameES6(id) { | 
						|
      var i, iz, ch, lowCh, check; | 
						|
 | 
						|
      if (id.length === 0) { | 
						|
        return false; | 
						|
      } | 
						|
 | 
						|
      check = code$1.isIdentifierStartES6; | 
						|
 | 
						|
      for (i = 0, iz = id.length; i < iz; ++i) { | 
						|
        ch = id.charCodeAt(i); | 
						|
 | 
						|
        if (0xD800 <= ch && ch <= 0xDBFF) { | 
						|
          ++i; | 
						|
 | 
						|
          if (i >= iz) { | 
						|
            return false; | 
						|
          } | 
						|
 | 
						|
          lowCh = id.charCodeAt(i); | 
						|
 | 
						|
          if (!(0xDC00 <= lowCh && lowCh <= 0xDFFF)) { | 
						|
            return false; | 
						|
          } | 
						|
 | 
						|
          ch = decodeUtf16(ch, lowCh); | 
						|
        } | 
						|
 | 
						|
        if (!check(ch)) { | 
						|
          return false; | 
						|
        } | 
						|
 | 
						|
        check = code$1.isIdentifierPartES6; | 
						|
      } | 
						|
 | 
						|
      return true; | 
						|
    } | 
						|
 | 
						|
    function isIdentifierES5(id, strict) { | 
						|
      return isIdentifierNameES5(id) && !isReservedWordES5(id, strict); | 
						|
    } | 
						|
 | 
						|
    function isIdentifierES6(id, strict) { | 
						|
      return isIdentifierNameES6(id) && !isReservedWordES6(id, strict); | 
						|
    } | 
						|
 | 
						|
    module.exports = { | 
						|
      isKeywordES5: isKeywordES5, | 
						|
      isKeywordES6: isKeywordES6, | 
						|
      isReservedWordES5: isReservedWordES5, | 
						|
      isReservedWordES6: isReservedWordES6, | 
						|
      isRestrictedWord: isRestrictedWord, | 
						|
      isIdentifierNameES5: isIdentifierNameES5, | 
						|
      isIdentifierNameES6: isIdentifierNameES6, | 
						|
      isIdentifierES5: isIdentifierES5, | 
						|
      isIdentifierES6: isIdentifierES6 | 
						|
    }; | 
						|
  })(); | 
						|
  /* vim: set sw=4 ts=4 et tw=80 : */ | 
						|
 | 
						|
}); | 
						|
var keyword_1 = keyword.isKeywordES5; | 
						|
var keyword_2 = keyword.isKeywordES6; | 
						|
var keyword_3 = keyword.isReservedWordES5; | 
						|
var keyword_4 = keyword.isReservedWordES6; | 
						|
var keyword_5 = keyword.isRestrictedWord; | 
						|
var keyword_6 = keyword.isIdentifierNameES5; | 
						|
var keyword_7 = keyword.isIdentifierNameES6; | 
						|
var keyword_8 = keyword.isIdentifierES5; | 
						|
var keyword_9 = keyword.isIdentifierES6; | 
						|
 | 
						|
var utils$1 = createCommonjsModule(function (module, exports) { | 
						|
  /* | 
						|
    Copyright (C) 2013 Yusuke Suzuki <utatane.tea@gmail.com> | 
						|
   | 
						|
    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. | 
						|
   | 
						|
    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 <COPYRIGHT HOLDER> 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. | 
						|
  */ | 
						|
  (function () { | 
						|
 | 
						|
    exports.ast = ast; | 
						|
    exports.code = code; | 
						|
    exports.keyword = keyword; | 
						|
  })(); | 
						|
  /* vim: set sw=4 ts=4 et tw=80 : */ | 
						|
 | 
						|
}); | 
						|
var utils_1$1 = utils$1.ast; | 
						|
var utils_2$1 = utils$1.code; | 
						|
var utils_3$1 = utils$1.keyword; | 
						|
 | 
						|
var lib$1 = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
  exports.shouldHighlight = shouldHighlight; | 
						|
  exports.getChalk = getChalk; | 
						|
  exports.default = highlight; | 
						|
 | 
						|
  function _jsTokens() { | 
						|
    var data = _interopRequireWildcard(jsTokens); | 
						|
 | 
						|
    _jsTokens = function _jsTokens() { | 
						|
      return data; | 
						|
    }; | 
						|
 | 
						|
    return data; | 
						|
  } | 
						|
 | 
						|
  function _esutils() { | 
						|
    var data = _interopRequireDefault(utils$1); | 
						|
 | 
						|
    _esutils = function _esutils() { | 
						|
      return data; | 
						|
    }; | 
						|
 | 
						|
    return data; | 
						|
  } | 
						|
 | 
						|
  function _chalk() { | 
						|
    var data = _interopRequireDefault(chalk); | 
						|
 | 
						|
    _chalk = function _chalk() { | 
						|
      return data; | 
						|
    }; | 
						|
 | 
						|
    return data; | 
						|
  } | 
						|
 | 
						|
  function _interopRequireDefault(obj) { | 
						|
    return obj && obj.__esModule ? obj : { | 
						|
      default: obj | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  function _interopRequireWildcard(obj) { | 
						|
    if (obj && obj.__esModule) { | 
						|
      return obj; | 
						|
    } else { | 
						|
      var newObj = {}; | 
						|
 | 
						|
      if (obj != null) { | 
						|
        for (var key in obj) { | 
						|
          if (Object.prototype.hasOwnProperty.call(obj, key)) { | 
						|
            var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; | 
						|
 | 
						|
            if (desc.get || desc.set) { | 
						|
              Object.defineProperty(newObj, key, desc); | 
						|
            } else { | 
						|
              newObj[key] = obj[key]; | 
						|
            } | 
						|
          } | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      newObj.default = obj; | 
						|
      return newObj; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  function getDefs(chalk) { | 
						|
    return { | 
						|
      keyword: chalk.cyan, | 
						|
      capitalized: chalk.yellow, | 
						|
      jsx_tag: chalk.yellow, | 
						|
      punctuator: chalk.yellow, | 
						|
      number: chalk.magenta, | 
						|
      string: chalk.green, | 
						|
      regex: chalk.magenta, | 
						|
      comment: chalk.grey, | 
						|
      invalid: chalk.white.bgRed.bold | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  var NEWLINE = /\r\n|[\n\r\u2028\u2029]/; | 
						|
  var JSX_TAG = /^[a-z][\w-]*$/i; | 
						|
  var BRACKET = /^[()[\]{}]$/; | 
						|
 | 
						|
  function getTokenType(match) { | 
						|
    var _match$slice = match.slice(-2), | 
						|
        _match$slice2 = _slicedToArray(_match$slice, 2), | 
						|
        offset = _match$slice2[0], | 
						|
        text = _match$slice2[1]; | 
						|
 | 
						|
    var token = (0, _jsTokens().matchToToken)(match); | 
						|
 | 
						|
    if (token.type === "name") { | 
						|
      if (_esutils().default.keyword.isReservedWordES6(token.value)) { | 
						|
        return "keyword"; | 
						|
      } | 
						|
 | 
						|
      if (JSX_TAG.test(token.value) && (text[offset - 1] === "<" || text.substr(offset - 2, 2) == "</")) { | 
						|
        return "jsx_tag"; | 
						|
      } | 
						|
 | 
						|
      if (token.value[0] !== token.value[0].toLowerCase()) { | 
						|
        return "capitalized"; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    if (token.type === "punctuator" && BRACKET.test(token.value)) { | 
						|
      return "bracket"; | 
						|
    } | 
						|
 | 
						|
    if (token.type === "invalid" && (token.value === "@" || token.value === "#")) { | 
						|
      return "punctuator"; | 
						|
    } | 
						|
 | 
						|
    return token.type; | 
						|
  } | 
						|
 | 
						|
  function highlightTokens(defs, text) { | 
						|
    return text.replace(_jsTokens().default, function () { | 
						|
      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { | 
						|
        args[_key] = arguments[_key]; | 
						|
      } | 
						|
 | 
						|
      var type = getTokenType(args); | 
						|
      var colorize = defs[type]; | 
						|
 | 
						|
      if (colorize) { | 
						|
        return args[0].split(NEWLINE).map(function (str) { | 
						|
          return colorize(str); | 
						|
        }).join("\n"); | 
						|
      } else { | 
						|
        return args[0]; | 
						|
      } | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  function shouldHighlight(options) { | 
						|
    return _chalk().default.supportsColor || options.forceColor; | 
						|
  } | 
						|
 | 
						|
  function getChalk(options) { | 
						|
    var chalk = _chalk().default; | 
						|
 | 
						|
    if (options.forceColor) { | 
						|
      chalk = new (_chalk().default.constructor)({ | 
						|
        enabled: true, | 
						|
        level: 1 | 
						|
      }); | 
						|
    } | 
						|
 | 
						|
    return chalk; | 
						|
  } | 
						|
 | 
						|
  function highlight(code) { | 
						|
    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; | 
						|
 | 
						|
    if (shouldHighlight(options)) { | 
						|
      var chalk = getChalk(options); | 
						|
      var defs = getDefs(chalk); | 
						|
      return highlightTokens(defs, code); | 
						|
    } else { | 
						|
      return code; | 
						|
    } | 
						|
  } | 
						|
}); | 
						|
unwrapExports(lib$1); | 
						|
var lib_1 = lib$1.shouldHighlight; | 
						|
var lib_2 = lib$1.getChalk; | 
						|
 | 
						|
var lib$2 = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
  exports.codeFrameColumns = codeFrameColumns; | 
						|
  exports.default = _default; | 
						|
 | 
						|
  function _highlight() { | 
						|
    var data = _interopRequireWildcard(lib$1); | 
						|
 | 
						|
    _highlight = function _highlight() { | 
						|
      return data; | 
						|
    }; | 
						|
 | 
						|
    return data; | 
						|
  } | 
						|
 | 
						|
  function _interopRequireWildcard(obj) { | 
						|
    if (obj && obj.__esModule) { | 
						|
      return obj; | 
						|
    } else { | 
						|
      var newObj = {}; | 
						|
 | 
						|
      if (obj != null) { | 
						|
        for (var key in obj) { | 
						|
          if (Object.prototype.hasOwnProperty.call(obj, key)) { | 
						|
            var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; | 
						|
 | 
						|
            if (desc.get || desc.set) { | 
						|
              Object.defineProperty(newObj, key, desc); | 
						|
            } else { | 
						|
              newObj[key] = obj[key]; | 
						|
            } | 
						|
          } | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      newObj.default = obj; | 
						|
      return newObj; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  var deprecationWarningShown = false; | 
						|
 | 
						|
  function getDefs(chalk) { | 
						|
    return { | 
						|
      gutter: chalk.grey, | 
						|
      marker: chalk.red.bold, | 
						|
      message: chalk.red.bold | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  var NEWLINE = /\r\n|[\n\r\u2028\u2029]/; | 
						|
 | 
						|
  function getMarkerLines(loc, source, opts) { | 
						|
    var startLoc = Object.assign({ | 
						|
      column: 0, | 
						|
      line: -1 | 
						|
    }, loc.start); | 
						|
    var endLoc = Object.assign({}, startLoc, loc.end); | 
						|
 | 
						|
    var _ref = opts || {}, | 
						|
        _ref$linesAbove = _ref.linesAbove, | 
						|
        linesAbove = _ref$linesAbove === void 0 ? 2 : _ref$linesAbove, | 
						|
        _ref$linesBelow = _ref.linesBelow, | 
						|
        linesBelow = _ref$linesBelow === void 0 ? 3 : _ref$linesBelow; | 
						|
 | 
						|
    var startLine = startLoc.line; | 
						|
    var startColumn = startLoc.column; | 
						|
    var endLine = endLoc.line; | 
						|
    var endColumn = endLoc.column; | 
						|
    var start = Math.max(startLine - (linesAbove + 1), 0); | 
						|
    var end = Math.min(source.length, endLine + linesBelow); | 
						|
 | 
						|
    if (startLine === -1) { | 
						|
      start = 0; | 
						|
    } | 
						|
 | 
						|
    if (endLine === -1) { | 
						|
      end = source.length; | 
						|
    } | 
						|
 | 
						|
    var lineDiff = endLine - startLine; | 
						|
    var markerLines = {}; | 
						|
 | 
						|
    if (lineDiff) { | 
						|
      for (var i = 0; i <= lineDiff; i++) { | 
						|
        var lineNumber = i + startLine; | 
						|
 | 
						|
        if (!startColumn) { | 
						|
          markerLines[lineNumber] = true; | 
						|
        } else if (i === 0) { | 
						|
          var sourceLength = source[lineNumber - 1].length; | 
						|
          markerLines[lineNumber] = [startColumn, sourceLength - startColumn + 1]; | 
						|
        } else if (i === lineDiff) { | 
						|
          markerLines[lineNumber] = [0, endColumn]; | 
						|
        } else { | 
						|
          var _sourceLength = source[lineNumber - i].length; | 
						|
          markerLines[lineNumber] = [0, _sourceLength]; | 
						|
        } | 
						|
      } | 
						|
    } else { | 
						|
      if (startColumn === endColumn) { | 
						|
        if (startColumn) { | 
						|
          markerLines[startLine] = [startColumn, 0]; | 
						|
        } else { | 
						|
          markerLines[startLine] = true; | 
						|
        } | 
						|
      } else { | 
						|
        markerLines[startLine] = [startColumn, endColumn - startColumn]; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return { | 
						|
      start, | 
						|
      end, | 
						|
      markerLines | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  function codeFrameColumns(rawLines, loc) { | 
						|
    var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; | 
						|
    var highlighted = (opts.highlightCode || opts.forceColor) && (0, _highlight().shouldHighlight)(opts); | 
						|
    var chalk = (0, _highlight().getChalk)(opts); | 
						|
    var defs = getDefs(chalk); | 
						|
 | 
						|
    var maybeHighlight = function maybeHighlight(chalkFn, string) { | 
						|
      return highlighted ? chalkFn(string) : string; | 
						|
    }; | 
						|
 | 
						|
    var lines = rawLines.split(NEWLINE); | 
						|
 | 
						|
    var _getMarkerLines = getMarkerLines(loc, lines, opts), | 
						|
        start = _getMarkerLines.start, | 
						|
        end = _getMarkerLines.end, | 
						|
        markerLines = _getMarkerLines.markerLines; | 
						|
 | 
						|
    var hasColumns = loc.start && typeof loc.start.column === "number"; | 
						|
    var numberMaxWidth = String(end).length; | 
						|
    var highlightedLines = highlighted ? (0, _highlight().default)(rawLines, opts) : rawLines; | 
						|
    var frame = highlightedLines.split(NEWLINE).slice(start, end).map(function (line, index) { | 
						|
      var number = start + 1 + index; | 
						|
      var paddedNumber = ` ${number}`.slice(-numberMaxWidth); | 
						|
      var gutter = ` ${paddedNumber} | `; | 
						|
      var hasMarker = markerLines[number]; | 
						|
      var lastMarkerLine = !markerLines[number + 1]; | 
						|
 | 
						|
      if (hasMarker) { | 
						|
        var markerLine = ""; | 
						|
 | 
						|
        if (Array.isArray(hasMarker)) { | 
						|
          var markerSpacing = line.slice(0, Math.max(hasMarker[0] - 1, 0)).replace(/[^\t]/g, " "); | 
						|
          var numberOfMarkers = hasMarker[1] || 1; | 
						|
          markerLine = ["\n ", maybeHighlight(defs.gutter, gutter.replace(/\d/g, " ")), markerSpacing, maybeHighlight(defs.marker, "^").repeat(numberOfMarkers)].join(""); | 
						|
 | 
						|
          if (lastMarkerLine && opts.message) { | 
						|
            markerLine += " " + maybeHighlight(defs.message, opts.message); | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        return [maybeHighlight(defs.marker, ">"), maybeHighlight(defs.gutter, gutter), line, markerLine].join(""); | 
						|
      } else { | 
						|
        return ` ${maybeHighlight(defs.gutter, gutter)}${line}`; | 
						|
      } | 
						|
    }).join("\n"); | 
						|
 | 
						|
    if (opts.message && !hasColumns) { | 
						|
      frame = `${" ".repeat(numberMaxWidth + 1)}${opts.message}\n${frame}`; | 
						|
    } | 
						|
 | 
						|
    if (highlighted) { | 
						|
      return chalk.reset(frame); | 
						|
    } else { | 
						|
      return frame; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  function _default(rawLines, lineNumber, colNumber) { | 
						|
    var opts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; | 
						|
 | 
						|
    if (!deprecationWarningShown) { | 
						|
      deprecationWarningShown = true; | 
						|
      var message = "Passing lineNumber and colNumber is deprecated to @babel/code-frame. Please use `codeFrameColumns`."; | 
						|
 | 
						|
      if (process.emitWarning) { | 
						|
        process.emitWarning(message, "DeprecationWarning"); | 
						|
      } else { | 
						|
        var deprecationError = new Error(message); | 
						|
        deprecationError.name = "DeprecationWarning"; | 
						|
        console.warn(new Error(message)); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    colNumber = Math.max(colNumber, 0); | 
						|
    var location = { | 
						|
      start: { | 
						|
        column: colNumber, | 
						|
        line: lineNumber | 
						|
      } | 
						|
    }; | 
						|
    return codeFrameColumns(rawLines, location, opts); | 
						|
  } | 
						|
}); | 
						|
unwrapExports(lib$2); | 
						|
var lib_1$1 = lib$2.codeFrameColumns; | 
						|
 | 
						|
var ConfigError$1 = errors.ConfigError; | 
						|
var locStart$1 = loc.locStart, | 
						|
    locEnd$1 = loc.locEnd; // Use defineProperties()/getOwnPropertyDescriptor() to prevent | 
						|
// triggering the parsers getters. | 
						|
 | 
						|
var ownNames = Object.getOwnPropertyNames; | 
						|
var ownDescriptor = Object.getOwnPropertyDescriptor; | 
						|
 | 
						|
function getParsers(options) { | 
						|
  var parsers = {}; | 
						|
  var _iteratorNormalCompletion = true; | 
						|
  var _didIteratorError = false; | 
						|
  var _iteratorError = undefined; | 
						|
 | 
						|
  try { | 
						|
    for (var _iterator = options.plugins[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | 
						|
      var plugin = _step.value; | 
						|
 | 
						|
      if (!plugin.parsers) { | 
						|
        continue; | 
						|
      } | 
						|
 | 
						|
      var _iteratorNormalCompletion2 = true; | 
						|
      var _didIteratorError2 = false; | 
						|
      var _iteratorError2 = undefined; | 
						|
 | 
						|
      try { | 
						|
        for (var _iterator2 = ownNames(plugin.parsers)[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { | 
						|
          var name = _step2.value; | 
						|
          Object.defineProperty(parsers, name, ownDescriptor(plugin.parsers, name)); | 
						|
        } | 
						|
      } catch (err) { | 
						|
        _didIteratorError2 = true; | 
						|
        _iteratorError2 = err; | 
						|
      } finally { | 
						|
        try { | 
						|
          if (!_iteratorNormalCompletion2 && _iterator2.return != null) { | 
						|
            _iterator2.return(); | 
						|
          } | 
						|
        } finally { | 
						|
          if (_didIteratorError2) { | 
						|
            throw _iteratorError2; | 
						|
          } | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
  } catch (err) { | 
						|
    _didIteratorError = true; | 
						|
    _iteratorError = err; | 
						|
  } finally { | 
						|
    try { | 
						|
      if (!_iteratorNormalCompletion && _iterator.return != null) { | 
						|
        _iterator.return(); | 
						|
      } | 
						|
    } finally { | 
						|
      if (_didIteratorError) { | 
						|
        throw _iteratorError; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return parsers; | 
						|
} | 
						|
 | 
						|
function resolveParser(opts, parsers) { | 
						|
  parsers = parsers || getParsers(opts); | 
						|
 | 
						|
  if (typeof opts.parser === "function") { | 
						|
    // Custom parser API always works with JavaScript. | 
						|
    return { | 
						|
      parse: opts.parser, | 
						|
      astFormat: "estree", | 
						|
      locStart: locStart$1, | 
						|
      locEnd: locEnd$1 | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  if (typeof opts.parser === "string") { | 
						|
    if (Object.prototype.hasOwnProperty.call(parsers, opts.parser)) { | 
						|
      return parsers[opts.parser]; | 
						|
    } | 
						|
    /* istanbul ignore next */ | 
						|
 | 
						|
 | 
						|
    { | 
						|
      try { | 
						|
        return { | 
						|
          parse: require(path$2.resolve(process.cwd(), opts.parser)), | 
						|
          astFormat: "estree", | 
						|
          locStart: locStart$1, | 
						|
          locEnd: locEnd$1 | 
						|
        }; | 
						|
      } catch (err) { | 
						|
        /* istanbul ignore next */ | 
						|
        throw new ConfigError$1(`Couldn't resolve parser "${opts.parser}"`); | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
} | 
						|
 | 
						|
function parse(text, opts) { | 
						|
  var parsers = getParsers(opts); // Create a new object {parserName: parseFn}. Uses defineProperty() to only call | 
						|
  // the parsers getters when actually calling the parser `parse` function. | 
						|
 | 
						|
  var parsersForCustomParserApi = Object.keys(parsers).reduce(function (object, parserName) { | 
						|
    return Object.defineProperty(object, parserName, { | 
						|
      enumerable: true, | 
						|
 | 
						|
      get() { | 
						|
        return parsers[parserName].parse; | 
						|
      } | 
						|
 | 
						|
    }); | 
						|
  }, {}); | 
						|
  var parser = resolveParser(opts, parsers); | 
						|
 | 
						|
  try { | 
						|
    if (parser.preprocess) { | 
						|
      text = parser.preprocess(text, opts); | 
						|
    } | 
						|
 | 
						|
    return { | 
						|
      text, | 
						|
      ast: parser.parse(text, parsersForCustomParserApi, opts) | 
						|
    }; | 
						|
  } catch (error) { | 
						|
    var loc = error.loc; | 
						|
 | 
						|
    if (loc) { | 
						|
      var codeFrame = lib$2; | 
						|
      error.codeFrame = codeFrame.codeFrameColumns(text, loc, { | 
						|
        highlightCode: true | 
						|
      }); | 
						|
      error.message += "\n" + error.codeFrame; | 
						|
      throw error; | 
						|
    } | 
						|
    /* istanbul ignore next */ | 
						|
 | 
						|
 | 
						|
    throw error.stack; | 
						|
  } | 
						|
} | 
						|
 | 
						|
var parser = { | 
						|
  parse, | 
						|
  resolveParser | 
						|
}; | 
						|
 | 
						|
var UndefinedParserError$1 = errors.UndefinedParserError; | 
						|
var getSupportInfo$1 = support.getSupportInfo; | 
						|
var resolveParser$1 = parser.resolveParser; | 
						|
var hiddenDefaults = { | 
						|
  astFormat: "estree", | 
						|
  printer: {}, | 
						|
  originalText: undefined, | 
						|
  locStart: null, | 
						|
  locEnd: null | 
						|
}; // Copy options and fill in default values. | 
						|
 | 
						|
function normalize$1(options, opts) { | 
						|
  opts = opts || {}; | 
						|
  var rawOptions = Object.assign({}, options); | 
						|
  var supportOptions = getSupportInfo$1(null, { | 
						|
    plugins: options.plugins, | 
						|
    showUnreleased: true, | 
						|
    showDeprecated: true | 
						|
  }).options; | 
						|
  var defaults = supportOptions.reduce(function (reduced, optionInfo) { | 
						|
    return optionInfo.default !== undefined ? Object.assign(reduced, { | 
						|
      [optionInfo.name]: optionInfo.default | 
						|
    }) : reduced; | 
						|
  }, Object.assign({}, hiddenDefaults)); | 
						|
 | 
						|
  if (!rawOptions.parser) { | 
						|
    if (!rawOptions.filepath) { | 
						|
      var logger = opts.logger || console; | 
						|
      logger.warn("No parser and no filepath given, using 'babel' the parser now " + "but this will throw an error in the future. " + "Please specify a parser or a filepath so one can be inferred."); | 
						|
      rawOptions.parser = "babel"; | 
						|
    } else { | 
						|
      rawOptions.parser = inferParser(rawOptions.filepath, rawOptions.plugins); | 
						|
 | 
						|
      if (!rawOptions.parser) { | 
						|
        throw new UndefinedParserError$1(`No parser could be inferred for file: ${rawOptions.filepath}`); | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  var parser = resolveParser$1(optionsNormalizer.normalizeApiOptions(rawOptions, [supportOptions.find(function (x) { | 
						|
    return x.name === "parser"; | 
						|
  })], { | 
						|
    passThrough: true, | 
						|
    logger: false | 
						|
  })); | 
						|
  rawOptions.astFormat = parser.astFormat; | 
						|
  rawOptions.locEnd = parser.locEnd; | 
						|
  rawOptions.locStart = parser.locStart; | 
						|
  var plugin = getPlugin(rawOptions); | 
						|
  rawOptions.printer = plugin.printers[rawOptions.astFormat]; | 
						|
  var pluginDefaults = supportOptions.filter(function (optionInfo) { | 
						|
    return optionInfo.pluginDefaults && optionInfo.pluginDefaults[plugin.name] !== undefined; | 
						|
  }).reduce(function (reduced, optionInfo) { | 
						|
    return Object.assign(reduced, { | 
						|
      [optionInfo.name]: optionInfo.pluginDefaults[plugin.name] | 
						|
    }); | 
						|
  }, {}); | 
						|
  var mixedDefaults = Object.assign({}, defaults, pluginDefaults); | 
						|
  Object.keys(mixedDefaults).forEach(function (k) { | 
						|
    if (rawOptions[k] == null) { | 
						|
      rawOptions[k] = mixedDefaults[k]; | 
						|
    } | 
						|
  }); | 
						|
 | 
						|
  if (rawOptions.parser === "json") { | 
						|
    rawOptions.trailingComma = "none"; | 
						|
  } | 
						|
 | 
						|
  return optionsNormalizer.normalizeApiOptions(rawOptions, supportOptions, Object.assign({ | 
						|
    passThrough: Object.keys(hiddenDefaults) | 
						|
  }, opts)); | 
						|
} | 
						|
 | 
						|
function getPlugin(options) { | 
						|
  var astFormat = options.astFormat; | 
						|
 | 
						|
  if (!astFormat) { | 
						|
    throw new Error("getPlugin() requires astFormat to be set"); | 
						|
  } | 
						|
 | 
						|
  var printerPlugin = options.plugins.find(function (plugin) { | 
						|
    return plugin.printers && plugin.printers[astFormat]; | 
						|
  }); | 
						|
 | 
						|
  if (!printerPlugin) { | 
						|
    throw new Error(`Couldn't find plugin for AST format "${astFormat}"`); | 
						|
  } | 
						|
 | 
						|
  return printerPlugin; | 
						|
} | 
						|
 | 
						|
function getInterpreter(filepath) { | 
						|
  if (typeof filepath !== "string") { | 
						|
    return ""; | 
						|
  } | 
						|
 | 
						|
  var fd; | 
						|
 | 
						|
  try { | 
						|
    fd = fs$1.openSync(filepath, "r"); | 
						|
  } catch (err) { | 
						|
    return ""; | 
						|
  } | 
						|
 | 
						|
  try { | 
						|
    var liner = new readlines(fd); | 
						|
    var firstLine = liner.next().toString("utf8"); // #!/bin/env node, #!/usr/bin/env node | 
						|
 | 
						|
    var m1 = firstLine.match(/^#!\/(?:usr\/)?bin\/env\s+(\S+)/); | 
						|
 | 
						|
    if (m1) { | 
						|
      return m1[1]; | 
						|
    } // #!/bin/node, #!/usr/bin/node, #!/usr/local/bin/node | 
						|
 | 
						|
 | 
						|
    var m2 = firstLine.match(/^#!\/(?:usr\/(?:local\/)?)?bin\/(\S+)/); | 
						|
 | 
						|
    if (m2) { | 
						|
      return m2[1]; | 
						|
    } | 
						|
 | 
						|
    return ""; | 
						|
  } catch (err) { | 
						|
    // There are some weird cases where paths are missing, causing Jest | 
						|
    // failures. It's unclear what these correspond to in the real world. | 
						|
    return ""; | 
						|
  } finally { | 
						|
    try { | 
						|
      // There are some weird cases where paths are missing, causing Jest | 
						|
      // failures. It's unclear what these correspond to in the real world. | 
						|
      fs$1.closeSync(fd); | 
						|
    } catch (err) {// nop | 
						|
    } | 
						|
  } | 
						|
} | 
						|
 | 
						|
function inferParser(filepath, plugins) { | 
						|
  var filepathParts = normalizePath(filepath).split("/"); | 
						|
  var filename = filepathParts[filepathParts.length - 1].toLowerCase(); // If the file has no extension, we can try to infer the language from the | 
						|
  // interpreter in the shebang line, if any; but since this requires FS access, | 
						|
  // do it last. | 
						|
 | 
						|
  var language = getSupportInfo$1(null, { | 
						|
    plugins | 
						|
  }).languages.find(function (language) { | 
						|
    return language.since !== null && (language.extensions && language.extensions.some(function (extension) { | 
						|
      return filename.endsWith(extension); | 
						|
    }) || language.filenames && language.filenames.find(function (name) { | 
						|
      return name.toLowerCase() === filename; | 
						|
    }) || filename.indexOf(".") === -1 && language.interpreters && language.interpreters.indexOf(getInterpreter(filepath)) !== -1); | 
						|
  }); | 
						|
  return language && language.parsers[0]; | 
						|
} | 
						|
 | 
						|
var options$1 = { | 
						|
  normalize: normalize$1, | 
						|
  hiddenDefaults, | 
						|
  inferParser | 
						|
}; | 
						|
 | 
						|
function massageAST(ast, options, parent) { | 
						|
  if (Array.isArray(ast)) { | 
						|
    return ast.map(function (e) { | 
						|
      return massageAST(e, options, parent); | 
						|
    }).filter(function (e) { | 
						|
      return e; | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  if (!ast || typeof ast !== "object") { | 
						|
    return ast; | 
						|
  } | 
						|
 | 
						|
  var newObj = {}; | 
						|
 | 
						|
  for (var _i = 0, _Object$keys = Object.keys(ast); _i < _Object$keys.length; _i++) { | 
						|
    var key = _Object$keys[_i]; | 
						|
 | 
						|
    if (typeof ast[key] !== "function") { | 
						|
      newObj[key] = massageAST(ast[key], options, ast); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  if (options.printer.massageAstNode) { | 
						|
    var result = options.printer.massageAstNode(ast, newObj, parent); | 
						|
 | 
						|
    if (result === null) { | 
						|
      return undefined; | 
						|
    } | 
						|
 | 
						|
    if (result) { | 
						|
      return result; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return newObj; | 
						|
} | 
						|
 | 
						|
var massageAst = massageAST; | 
						|
 | 
						|
/** | 
						|
 * @param {Doc[]} parts | 
						|
 * @returns Doc | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function concat(parts) { | 
						|
  // access the internals of a document directly. | 
						|
  // if(parts.length === 1) { | 
						|
  //   // If it's a single document, no need to concat it. | 
						|
  //   return parts[0]; | 
						|
  // } | 
						|
 | 
						|
 | 
						|
  return { | 
						|
    type: "concat", | 
						|
    parts | 
						|
  }; | 
						|
} | 
						|
/** | 
						|
 * @param {Doc} contents | 
						|
 * @returns Doc | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function indent(contents) { | 
						|
 | 
						|
  return { | 
						|
    type: "indent", | 
						|
    contents | 
						|
  }; | 
						|
} | 
						|
/** | 
						|
 * @param {number} n | 
						|
 * @param {Doc} contents | 
						|
 * @returns Doc | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function align(n, contents) { | 
						|
 | 
						|
  return { | 
						|
    type: "align", | 
						|
    contents, | 
						|
    n | 
						|
  }; | 
						|
} | 
						|
/** | 
						|
 * @param {Doc} contents | 
						|
 * @param {object} [opts] - TBD ??? | 
						|
 * @returns Doc | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function group(contents, opts) { | 
						|
  opts = opts || {}; | 
						|
 | 
						|
  return { | 
						|
    type: "group", | 
						|
    id: opts.id, | 
						|
    contents: contents, | 
						|
    break: !!opts.shouldBreak, | 
						|
    expandedStates: opts.expandedStates | 
						|
  }; | 
						|
} | 
						|
/** | 
						|
 * @param {Doc} contents | 
						|
 * @returns Doc | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function dedentToRoot(contents) { | 
						|
  return align(-Infinity, contents); | 
						|
} | 
						|
/** | 
						|
 * @param {Doc} contents | 
						|
 * @returns Doc | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function markAsRoot(contents) { | 
						|
  // @ts-ignore - TBD ???: | 
						|
  return align({ | 
						|
    type: "root" | 
						|
  }, contents); | 
						|
} | 
						|
/** | 
						|
 * @param {Doc} contents | 
						|
 * @returns Doc | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function dedent(contents) { | 
						|
  return align(-1, contents); | 
						|
} | 
						|
/** | 
						|
 * @param {Doc[]} states | 
						|
 * @param {object} [opts] - TBD ??? | 
						|
 * @returns Doc | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function conditionalGroup(states, opts) { | 
						|
  return group(states[0], Object.assign(opts || {}, { | 
						|
    expandedStates: states | 
						|
  })); | 
						|
} | 
						|
/** | 
						|
 * @param {Doc[]} parts | 
						|
 * @returns Doc | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function fill(parts) { | 
						|
 | 
						|
  return { | 
						|
    type: "fill", | 
						|
    parts | 
						|
  }; | 
						|
} | 
						|
/** | 
						|
 * @param {Doc} [breakContents] | 
						|
 * @param {Doc} [flatContents] | 
						|
 * @param {object} [opts] - TBD ??? | 
						|
 * @returns Doc | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function ifBreak(breakContents, flatContents, opts) { | 
						|
  opts = opts || {}; | 
						|
 | 
						|
  return { | 
						|
    type: "if-break", | 
						|
    breakContents, | 
						|
    flatContents, | 
						|
    groupId: opts.groupId | 
						|
  }; | 
						|
} | 
						|
/** | 
						|
 * @param {Doc} contents | 
						|
 * @returns Doc | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function lineSuffix(contents) { | 
						|
 | 
						|
  return { | 
						|
    type: "line-suffix", | 
						|
    contents | 
						|
  }; | 
						|
} | 
						|
 | 
						|
var lineSuffixBoundary = { | 
						|
  type: "line-suffix-boundary" | 
						|
}; | 
						|
var breakParent = { | 
						|
  type: "break-parent" | 
						|
}; | 
						|
var trim = { | 
						|
  type: "trim" | 
						|
}; | 
						|
var line = { | 
						|
  type: "line" | 
						|
}; | 
						|
var softline = { | 
						|
  type: "line", | 
						|
  soft: true | 
						|
}; | 
						|
var hardline = concat([{ | 
						|
  type: "line", | 
						|
  hard: true | 
						|
}, breakParent]); | 
						|
var literalline = concat([{ | 
						|
  type: "line", | 
						|
  hard: true, | 
						|
  literal: true | 
						|
}, breakParent]); | 
						|
var cursor = { | 
						|
  type: "cursor", | 
						|
  placeholder: Symbol("cursor") | 
						|
}; | 
						|
/** | 
						|
 * @param {Doc} sep | 
						|
 * @param {Doc[]} arr | 
						|
 * @returns Doc | 
						|
 */ | 
						|
 | 
						|
function join(sep, arr) { | 
						|
  var res = []; | 
						|
 | 
						|
  for (var i = 0; i < arr.length; i++) { | 
						|
    if (i !== 0) { | 
						|
      res.push(sep); | 
						|
    } | 
						|
 | 
						|
    res.push(arr[i]); | 
						|
  } | 
						|
 | 
						|
  return concat(res); | 
						|
} | 
						|
/** | 
						|
 * @param {Doc} doc | 
						|
 * @param {number} size | 
						|
 * @param {number} tabWidth | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function addAlignmentToDoc(doc, size, tabWidth) { | 
						|
  var aligned = doc; | 
						|
 | 
						|
  if (size > 0) { | 
						|
    // Use indent to add tabs for all the levels of tabs we need | 
						|
    for (var i = 0; i < Math.floor(size / tabWidth); ++i) { | 
						|
      aligned = indent(aligned); | 
						|
    } // Use align for all the spaces that are needed | 
						|
 | 
						|
 | 
						|
    aligned = align(size % tabWidth, aligned); // size is absolute from 0 and not relative to the current | 
						|
    // indentation, so we use -Infinity to reset the indentation to 0 | 
						|
 | 
						|
    aligned = align(-Infinity, aligned); | 
						|
  } | 
						|
 | 
						|
  return aligned; | 
						|
} | 
						|
 | 
						|
var docBuilders = { | 
						|
  concat, | 
						|
  join, | 
						|
  line, | 
						|
  softline, | 
						|
  hardline, | 
						|
  literalline, | 
						|
  group, | 
						|
  conditionalGroup, | 
						|
  fill, | 
						|
  lineSuffix, | 
						|
  lineSuffixBoundary, | 
						|
  cursor, | 
						|
  breakParent, | 
						|
  ifBreak, | 
						|
  trim, | 
						|
  indent, | 
						|
  align, | 
						|
  addAlignmentToDoc, | 
						|
  markAsRoot, | 
						|
  dedentToRoot, | 
						|
  dedent | 
						|
}; | 
						|
 | 
						|
var ansiRegex = function ansiRegex(options) { | 
						|
  options = Object.assign({ | 
						|
    onlyFirst: false | 
						|
  }, options); | 
						|
  var pattern = ['[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)', '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))'].join('|'); | 
						|
  return new RegExp(pattern, options.onlyFirst ? undefined : 'g'); | 
						|
}; | 
						|
 | 
						|
var stripAnsi = function stripAnsi(string) { | 
						|
  return typeof string === 'string' ? string.replace(ansiRegex(), '') : string; | 
						|
}; | 
						|
 | 
						|
var stripAnsi_1 = stripAnsi; | 
						|
var default_1$1 = stripAnsi; | 
						|
stripAnsi_1.default = default_1$1; | 
						|
 | 
						|
/* eslint-disable yoda */ | 
						|
 | 
						|
var isFullwidthCodePoint = function isFullwidthCodePoint(codePoint) { | 
						|
  if (Number.isNaN(codePoint)) { | 
						|
    return false; | 
						|
  } // Code points are derived from: | 
						|
  // http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt | 
						|
 | 
						|
 | 
						|
  if (codePoint >= 0x1100 && (codePoint <= 0x115F || // Hangul Jamo | 
						|
  codePoint === 0x2329 || // LEFT-POINTING ANGLE BRACKET | 
						|
  codePoint === 0x232A || // RIGHT-POINTING ANGLE BRACKET | 
						|
  // CJK Radicals Supplement .. Enclosed CJK Letters and Months | 
						|
  0x2E80 <= codePoint && codePoint <= 0x3247 && codePoint !== 0x303F || // Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A | 
						|
  0x3250 <= codePoint && codePoint <= 0x4DBF || // CJK Unified Ideographs .. Yi Radicals | 
						|
  0x4E00 <= codePoint && codePoint <= 0xA4C6 || // Hangul Jamo Extended-A | 
						|
  0xA960 <= codePoint && codePoint <= 0xA97C || // Hangul Syllables | 
						|
  0xAC00 <= codePoint && codePoint <= 0xD7A3 || // CJK Compatibility Ideographs | 
						|
  0xF900 <= codePoint && codePoint <= 0xFAFF || // Vertical Forms | 
						|
  0xFE10 <= codePoint && codePoint <= 0xFE19 || // CJK Compatibility Forms .. Small Form Variants | 
						|
  0xFE30 <= codePoint && codePoint <= 0xFE6B || // Halfwidth and Fullwidth Forms | 
						|
  0xFF01 <= codePoint && codePoint <= 0xFF60 || 0xFFE0 <= codePoint && codePoint <= 0xFFE6 || // Kana Supplement | 
						|
  0x1B000 <= codePoint && codePoint <= 0x1B001 || // Enclosed Ideographic Supplement | 
						|
  0x1F200 <= codePoint && codePoint <= 0x1F251 || // CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane | 
						|
  0x20000 <= codePoint && codePoint <= 0x3FFFD)) { | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
}; | 
						|
 | 
						|
var isFullwidthCodePoint_1 = isFullwidthCodePoint; | 
						|
var default_1$2 = isFullwidthCodePoint; | 
						|
isFullwidthCodePoint_1.default = default_1$2; | 
						|
 | 
						|
var emojiRegex = function emojiRegex() { | 
						|
  // https://mths.be/emoji | 
						|
  return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g; | 
						|
}; | 
						|
 | 
						|
var stringWidth = function stringWidth(string) { | 
						|
  string = string.replace(emojiRegex(), '  '); | 
						|
 | 
						|
  if (typeof string !== 'string' || string.length === 0) { | 
						|
    return 0; | 
						|
  } | 
						|
 | 
						|
  string = stripAnsi_1(string); | 
						|
  var width = 0; | 
						|
 | 
						|
  for (var i = 0; i < string.length; i++) { | 
						|
    var code = string.codePointAt(i); // Ignore control characters | 
						|
 | 
						|
    if (code <= 0x1F || code >= 0x7F && code <= 0x9F) { | 
						|
      continue; | 
						|
    } // Ignore combining characters | 
						|
 | 
						|
 | 
						|
    if (code >= 0x300 && code <= 0x36F) { | 
						|
      continue; | 
						|
    } // Surrogates | 
						|
 | 
						|
 | 
						|
    if (code > 0xFFFF) { | 
						|
      i++; | 
						|
    } | 
						|
 | 
						|
    width += isFullwidthCodePoint_1(code) ? 2 : 1; | 
						|
  } | 
						|
 | 
						|
  return width; | 
						|
}; | 
						|
 | 
						|
var stringWidth_1 = stringWidth; // TODO: remove this in the next major version | 
						|
 | 
						|
var default_1$3 = stringWidth; | 
						|
stringWidth_1.default = default_1$3; | 
						|
 | 
						|
var notAsciiRegex = /[^\x20-\x7F]/; | 
						|
 | 
						|
function isExportDeclaration(node) { | 
						|
  if (node) { | 
						|
    switch (node.type) { | 
						|
      case "ExportDefaultDeclaration": | 
						|
      case "ExportDefaultSpecifier": | 
						|
      case "DeclareExportDeclaration": | 
						|
      case "ExportNamedDeclaration": | 
						|
      case "ExportAllDeclaration": | 
						|
        return true; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function getParentExportDeclaration(path) { | 
						|
  var parentNode = path.getParentNode(); | 
						|
 | 
						|
  if (path.getName() === "declaration" && isExportDeclaration(parentNode)) { | 
						|
    return parentNode; | 
						|
  } | 
						|
 | 
						|
  return null; | 
						|
} | 
						|
 | 
						|
function getPenultimate(arr) { | 
						|
  if (arr.length > 1) { | 
						|
    return arr[arr.length - 2]; | 
						|
  } | 
						|
 | 
						|
  return null; | 
						|
} | 
						|
/** | 
						|
 * @typedef {{backwards?: boolean}} SkipOptions | 
						|
 */ | 
						|
 | 
						|
/** | 
						|
 * @param {string | RegExp} chars | 
						|
 * @returns {(text: string, index: number | false, opts?: SkipOptions) => number | false} | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function skip(chars) { | 
						|
  return function (text, index, opts) { | 
						|
    var backwards = opts && opts.backwards; // Allow `skip` functions to be threaded together without having | 
						|
    // to check for failures (did someone say monads?). | 
						|
 | 
						|
    if (index === false) { | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    var length = text.length; | 
						|
    var cursor = index; | 
						|
 | 
						|
    while (cursor >= 0 && cursor < length) { | 
						|
      var c = text.charAt(cursor); | 
						|
 | 
						|
      if (chars instanceof RegExp) { | 
						|
        if (!chars.test(c)) { | 
						|
          return cursor; | 
						|
        } | 
						|
      } else if (chars.indexOf(c) === -1) { | 
						|
        return cursor; | 
						|
      } | 
						|
 | 
						|
      backwards ? cursor-- : cursor++; | 
						|
    } | 
						|
 | 
						|
    if (cursor === -1 || cursor === length) { | 
						|
      // If we reached the beginning or end of the file, return the | 
						|
      // out-of-bounds cursor. It's up to the caller to handle this | 
						|
      // correctly. We don't want to indicate `false` though if it | 
						|
      // actually skipped valid characters. | 
						|
      return cursor; | 
						|
    } | 
						|
 | 
						|
    return false; | 
						|
  }; | 
						|
} | 
						|
/** | 
						|
 * @type {(text: string, index: number | false, opts?: SkipOptions) => number | false} | 
						|
 */ | 
						|
 | 
						|
 | 
						|
var skipWhitespace = skip(/\s/); | 
						|
/** | 
						|
 * @type {(text: string, index: number | false, opts?: SkipOptions) => number | false} | 
						|
 */ | 
						|
 | 
						|
var skipSpaces = skip(" \t"); | 
						|
/** | 
						|
 * @type {(text: string, index: number | false, opts?: SkipOptions) => number | false} | 
						|
 */ | 
						|
 | 
						|
var skipToLineEnd = skip(",; \t"); | 
						|
/** | 
						|
 * @type {(text: string, index: number | false, opts?: SkipOptions) => number | false} | 
						|
 */ | 
						|
 | 
						|
var skipEverythingButNewLine = skip(/[^\r\n]/); | 
						|
/** | 
						|
 * @param {string} text | 
						|
 * @param {number | false} index | 
						|
 * @returns {number | false} | 
						|
 */ | 
						|
 | 
						|
function skipInlineComment(text, index) { | 
						|
  if (index === false) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  if (text.charAt(index) === "/" && text.charAt(index + 1) === "*") { | 
						|
    for (var i = index + 2; i < text.length; ++i) { | 
						|
      if (text.charAt(i) === "*" && text.charAt(i + 1) === "/") { | 
						|
        return i + 2; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return index; | 
						|
} | 
						|
/** | 
						|
 * @param {string} text | 
						|
 * @param {number | false} index | 
						|
 * @returns {number | false} | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function skipTrailingComment(text, index) { | 
						|
  if (index === false) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  if (text.charAt(index) === "/" && text.charAt(index + 1) === "/") { | 
						|
    return skipEverythingButNewLine(text, index); | 
						|
  } | 
						|
 | 
						|
  return index; | 
						|
} // This one doesn't use the above helper function because it wants to | 
						|
// test \r\n in order and `skip` doesn't support ordering and we only | 
						|
// want to skip one newline. It's simple to implement. | 
						|
 | 
						|
/** | 
						|
 * @param {string} text | 
						|
 * @param {number | false} index | 
						|
 * @param {SkipOptions=} opts | 
						|
 * @returns {number | false} | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function skipNewline(text, index, opts) { | 
						|
  var backwards = opts && opts.backwards; | 
						|
 | 
						|
  if (index === false) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  var atIndex = text.charAt(index); | 
						|
 | 
						|
  if (backwards) { | 
						|
    if (text.charAt(index - 1) === "\r" && atIndex === "\n") { | 
						|
      return index - 2; | 
						|
    } | 
						|
 | 
						|
    if (atIndex === "\n" || atIndex === "\r" || atIndex === "\u2028" || atIndex === "\u2029") { | 
						|
      return index - 1; | 
						|
    } | 
						|
  } else { | 
						|
    if (atIndex === "\r" && text.charAt(index + 1) === "\n") { | 
						|
      return index + 2; | 
						|
    } | 
						|
 | 
						|
    if (atIndex === "\n" || atIndex === "\r" || atIndex === "\u2028" || atIndex === "\u2029") { | 
						|
      return index + 1; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return index; | 
						|
} | 
						|
/** | 
						|
 * @param {string} text | 
						|
 * @param {number} index | 
						|
 * @param {SkipOptions=} opts | 
						|
 * @returns {boolean} | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function hasNewline(text, index, opts) { | 
						|
  opts = opts || {}; | 
						|
  var idx = skipSpaces(text, opts.backwards ? index - 1 : index, opts); | 
						|
  var idx2 = skipNewline(text, idx, opts); | 
						|
  return idx !== idx2; | 
						|
} | 
						|
/** | 
						|
 * @param {string} text | 
						|
 * @param {number} start | 
						|
 * @param {number} end | 
						|
 * @returns {boolean} | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function hasNewlineInRange(text, start, end) { | 
						|
  for (var i = start; i < end; ++i) { | 
						|
    if (text.charAt(i) === "\n") { | 
						|
      return true; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} // Note: this function doesn't ignore leading comments unlike isNextLineEmpty | 
						|
 | 
						|
/** | 
						|
 * @template N | 
						|
 * @param {string} text | 
						|
 * @param {N} node | 
						|
 * @param {(node: N) => number} locStart | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function isPreviousLineEmpty(text, node, locStart) { | 
						|
  /** @type {number | false} */ | 
						|
  var idx = locStart(node) - 1; | 
						|
  idx = skipSpaces(text, idx, { | 
						|
    backwards: true | 
						|
  }); | 
						|
  idx = skipNewline(text, idx, { | 
						|
    backwards: true | 
						|
  }); | 
						|
  idx = skipSpaces(text, idx, { | 
						|
    backwards: true | 
						|
  }); | 
						|
  var idx2 = skipNewline(text, idx, { | 
						|
    backwards: true | 
						|
  }); | 
						|
  return idx !== idx2; | 
						|
} | 
						|
/** | 
						|
 * @param {string} text | 
						|
 * @param {number} index | 
						|
 * @returns {boolean} | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function isNextLineEmptyAfterIndex(text, index) { | 
						|
  /** @type {number | false} */ | 
						|
  var oldIdx = null; | 
						|
  /** @type {number | false} */ | 
						|
 | 
						|
  var idx = index; | 
						|
 | 
						|
  while (idx !== oldIdx) { | 
						|
    // We need to skip all the potential trailing inline comments | 
						|
    oldIdx = idx; | 
						|
    idx = skipToLineEnd(text, idx); | 
						|
    idx = skipInlineComment(text, idx); | 
						|
    idx = skipSpaces(text, idx); | 
						|
  } | 
						|
 | 
						|
  idx = skipTrailingComment(text, idx); | 
						|
  idx = skipNewline(text, idx); | 
						|
  return idx !== false && hasNewline(text, idx); | 
						|
} | 
						|
/** | 
						|
 * @template N | 
						|
 * @param {string} text | 
						|
 * @param {N} node | 
						|
 * @param {(node: N) => number} locEnd | 
						|
 * @returns {boolean} | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function isNextLineEmpty(text, node, locEnd) { | 
						|
  return isNextLineEmptyAfterIndex(text, locEnd(node)); | 
						|
} | 
						|
/** | 
						|
 * @param {string} text | 
						|
 * @param {number} idx | 
						|
 * @returns {number | false} | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function getNextNonSpaceNonCommentCharacterIndexWithStartIndex(text, idx) { | 
						|
  /** @type {number | false} */ | 
						|
  var oldIdx = null; | 
						|
  /** @type {number | false} */ | 
						|
 | 
						|
  var nextIdx = idx; | 
						|
 | 
						|
  while (nextIdx !== oldIdx) { | 
						|
    oldIdx = nextIdx; | 
						|
    nextIdx = skipSpaces(text, nextIdx); | 
						|
    nextIdx = skipInlineComment(text, nextIdx); | 
						|
    nextIdx = skipTrailingComment(text, nextIdx); | 
						|
    nextIdx = skipNewline(text, nextIdx); | 
						|
  } | 
						|
 | 
						|
  return nextIdx; | 
						|
} | 
						|
/** | 
						|
 * @template N | 
						|
 * @param {string} text | 
						|
 * @param {N} node | 
						|
 * @param {(node: N) => number} locEnd | 
						|
 * @returns {number | false} | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function getNextNonSpaceNonCommentCharacterIndex(text, node, locEnd) { | 
						|
  return getNextNonSpaceNonCommentCharacterIndexWithStartIndex(text, locEnd(node)); | 
						|
} | 
						|
/** | 
						|
 * @template N | 
						|
 * @param {string} text | 
						|
 * @param {N} node | 
						|
 * @param {(node: N) => number} locEnd | 
						|
 * @returns {string} | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function getNextNonSpaceNonCommentCharacter(text, node, locEnd) { | 
						|
  return text.charAt( // @ts-ignore => TBD: can return false, should we define a fallback? | 
						|
  getNextNonSpaceNonCommentCharacterIndex(text, node, locEnd)); | 
						|
} | 
						|
/** | 
						|
 * @param {string} text | 
						|
 * @param {number} index | 
						|
 * @param {SkipOptions=} opts | 
						|
 * @returns {boolean} | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function hasSpaces(text, index, opts) { | 
						|
  opts = opts || {}; | 
						|
  var idx = skipSpaces(text, opts.backwards ? index - 1 : index, opts); | 
						|
  return idx !== index; | 
						|
} | 
						|
/** | 
						|
 * @param {{range?: [number, number], start?: number}} node | 
						|
 * @param {number} index | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function setLocStart(node, index) { | 
						|
  if (node.range) { | 
						|
    node.range[0] = index; | 
						|
  } else { | 
						|
    node.start = index; | 
						|
  } | 
						|
} | 
						|
/** | 
						|
 * @param {{range?: [number, number], end?: number}} node | 
						|
 * @param {number} index | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function setLocEnd(node, index) { | 
						|
  if (node.range) { | 
						|
    node.range[1] = index; | 
						|
  } else { | 
						|
    node.end = index; | 
						|
  } | 
						|
} | 
						|
 | 
						|
var PRECEDENCE = {}; | 
						|
[["|>"], ["??"], ["||"], ["&&"], ["|"], ["^"], ["&"], ["==", "===", "!=", "!=="], ["<", ">", "<=", ">=", "in", "instanceof"], [">>", "<<", ">>>"], ["+", "-"], ["*", "/", "%"], ["**"]].forEach(function (tier, i) { | 
						|
  tier.forEach(function (op) { | 
						|
    PRECEDENCE[op] = i; | 
						|
  }); | 
						|
}); | 
						|
 | 
						|
function getPrecedence(op) { | 
						|
  return PRECEDENCE[op]; | 
						|
} | 
						|
 | 
						|
var equalityOperators = { | 
						|
  "==": true, | 
						|
  "!=": true, | 
						|
  "===": true, | 
						|
  "!==": true | 
						|
}; | 
						|
var multiplicativeOperators = { | 
						|
  "*": true, | 
						|
  "/": true, | 
						|
  "%": true | 
						|
}; | 
						|
var bitshiftOperators = { | 
						|
  ">>": true, | 
						|
  ">>>": true, | 
						|
  "<<": true | 
						|
}; | 
						|
 | 
						|
function shouldFlatten(parentOp, nodeOp) { | 
						|
  if (getPrecedence(nodeOp) !== getPrecedence(parentOp)) { | 
						|
    return false; | 
						|
  } // ** is right-associative | 
						|
  // x ** y ** z --> x ** (y ** z) | 
						|
 | 
						|
 | 
						|
  if (parentOp === "**") { | 
						|
    return false; | 
						|
  } // x == y == z --> (x == y) == z | 
						|
 | 
						|
 | 
						|
  if (equalityOperators[parentOp] && equalityOperators[nodeOp]) { | 
						|
    return false; | 
						|
  } // x * y % z --> (x * y) % z | 
						|
 | 
						|
 | 
						|
  if (nodeOp === "%" && multiplicativeOperators[parentOp] || parentOp === "%" && multiplicativeOperators[nodeOp]) { | 
						|
    return false; | 
						|
  } // x * y / z --> (x * y) / z | 
						|
  // x / y * z --> (x / y) * z | 
						|
 | 
						|
 | 
						|
  if (nodeOp !== parentOp && multiplicativeOperators[nodeOp] && multiplicativeOperators[parentOp]) { | 
						|
    return false; | 
						|
  } // x << y << z --> (x << y) << z | 
						|
 | 
						|
 | 
						|
  if (bitshiftOperators[parentOp] && bitshiftOperators[nodeOp]) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  return true; | 
						|
} | 
						|
 | 
						|
function isBitwiseOperator(operator) { | 
						|
  return !!bitshiftOperators[operator] || operator === "|" || operator === "^" || operator === "&"; | 
						|
} // Tests if an expression starts with `{`, or (if forbidFunctionClassAndDoExpr | 
						|
// holds) `function`, `class`, or `do {}`. Will be overzealous if there's | 
						|
// already necessary grouping parentheses. | 
						|
 | 
						|
 | 
						|
function startsWithNoLookaheadToken(node, forbidFunctionClassAndDoExpr) { | 
						|
  node = getLeftMost(node); | 
						|
 | 
						|
  switch (node.type) { | 
						|
    case "FunctionExpression": | 
						|
    case "ClassExpression": | 
						|
    case "DoExpression": | 
						|
      return forbidFunctionClassAndDoExpr; | 
						|
 | 
						|
    case "ObjectExpression": | 
						|
      return true; | 
						|
 | 
						|
    case "MemberExpression": | 
						|
    case "OptionalMemberExpression": | 
						|
      return startsWithNoLookaheadToken(node.object, forbidFunctionClassAndDoExpr); | 
						|
 | 
						|
    case "TaggedTemplateExpression": | 
						|
      if (node.tag.type === "FunctionExpression") { | 
						|
        // IIFEs are always already parenthesized | 
						|
        return false; | 
						|
      } | 
						|
 | 
						|
      return startsWithNoLookaheadToken(node.tag, forbidFunctionClassAndDoExpr); | 
						|
 | 
						|
    case "CallExpression": | 
						|
    case "OptionalCallExpression": | 
						|
      if (node.callee.type === "FunctionExpression") { | 
						|
        // IIFEs are always already parenthesized | 
						|
        return false; | 
						|
      } | 
						|
 | 
						|
      return startsWithNoLookaheadToken(node.callee, forbidFunctionClassAndDoExpr); | 
						|
 | 
						|
    case "ConditionalExpression": | 
						|
      return startsWithNoLookaheadToken(node.test, forbidFunctionClassAndDoExpr); | 
						|
 | 
						|
    case "UpdateExpression": | 
						|
      return !node.prefix && startsWithNoLookaheadToken(node.argument, forbidFunctionClassAndDoExpr); | 
						|
 | 
						|
    case "BindExpression": | 
						|
      return node.object && startsWithNoLookaheadToken(node.object, forbidFunctionClassAndDoExpr); | 
						|
 | 
						|
    case "SequenceExpression": | 
						|
      return startsWithNoLookaheadToken(node.expressions[0], forbidFunctionClassAndDoExpr); | 
						|
 | 
						|
    case "TSAsExpression": | 
						|
      return startsWithNoLookaheadToken(node.expression, forbidFunctionClassAndDoExpr); | 
						|
 | 
						|
    default: | 
						|
      return false; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function getLeftMost(node) { | 
						|
  if (node.left) { | 
						|
    return getLeftMost(node.left); | 
						|
  } | 
						|
 | 
						|
  return node; | 
						|
} | 
						|
/** | 
						|
 * @param {string} value | 
						|
 * @param {number} tabWidth | 
						|
 * @param {number=} startIndex | 
						|
 * @returns {number} | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function getAlignmentSize(value, tabWidth, startIndex) { | 
						|
  startIndex = startIndex || 0; | 
						|
  var size = 0; | 
						|
 | 
						|
  for (var i = startIndex; i < value.length; ++i) { | 
						|
    if (value[i] === "\t") { | 
						|
      // Tabs behave in a way that they are aligned to the nearest | 
						|
      // multiple of tabWidth: | 
						|
      // 0 -> 4, 1 -> 4, 2 -> 4, 3 -> 4 | 
						|
      // 4 -> 8, 5 -> 8, 6 -> 8, 7 -> 8 ... | 
						|
      size = size + tabWidth - size % tabWidth; | 
						|
    } else { | 
						|
      size++; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return size; | 
						|
} | 
						|
/** | 
						|
 * @param {string} value | 
						|
 * @param {number} tabWidth | 
						|
 * @returns {number} | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function getIndentSize(value, tabWidth) { | 
						|
  var lastNewlineIndex = value.lastIndexOf("\n"); | 
						|
 | 
						|
  if (lastNewlineIndex === -1) { | 
						|
    return 0; | 
						|
  } | 
						|
 | 
						|
  return getAlignmentSize( // All the leading whitespaces | 
						|
  value.slice(lastNewlineIndex + 1).match(/^[ \t]*/)[0], tabWidth); | 
						|
} | 
						|
/** | 
						|
 * @typedef {'"' | "'"} Quote | 
						|
 */ | 
						|
 | 
						|
/** | 
						|
 * | 
						|
 * @param {string} raw | 
						|
 * @param {Quote} preferredQuote | 
						|
 * @returns {Quote} | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function getPreferredQuote(raw, preferredQuote) { | 
						|
  // `rawContent` is the string exactly like it appeared in the input source | 
						|
  // code, without its enclosing quotes. | 
						|
  var rawContent = raw.slice(1, -1); | 
						|
  /** @type {{ quote: '"', regex: RegExp }} */ | 
						|
 | 
						|
  var double = { | 
						|
    quote: '"', | 
						|
    regex: /"/g | 
						|
  }; | 
						|
  /** @type {{ quote: "'", regex: RegExp }} */ | 
						|
 | 
						|
  var single = { | 
						|
    quote: "'", | 
						|
    regex: /'/g | 
						|
  }; | 
						|
  var preferred = preferredQuote === "'" ? single : double; | 
						|
  var alternate = preferred === single ? double : single; | 
						|
  var result = preferred.quote; // If `rawContent` contains at least one of the quote preferred for enclosing | 
						|
  // the string, we might want to enclose with the alternate quote instead, to | 
						|
  // minimize the number of escaped quotes. | 
						|
 | 
						|
  if (rawContent.includes(preferred.quote) || rawContent.includes(alternate.quote)) { | 
						|
    var numPreferredQuotes = (rawContent.match(preferred.regex) || []).length; | 
						|
    var numAlternateQuotes = (rawContent.match(alternate.regex) || []).length; | 
						|
    result = numPreferredQuotes > numAlternateQuotes ? alternate.quote : preferred.quote; | 
						|
  } | 
						|
 | 
						|
  return result; | 
						|
} | 
						|
 | 
						|
function printString(raw, options, isDirectiveLiteral) { | 
						|
  // `rawContent` is the string exactly like it appeared in the input source | 
						|
  // code, without its enclosing quotes. | 
						|
  var rawContent = raw.slice(1, -1); // Check for the alternate quote, to determine if we're allowed to swap | 
						|
  // the quotes on a DirectiveLiteral. | 
						|
 | 
						|
  var canChangeDirectiveQuotes = !rawContent.includes('"') && !rawContent.includes("'"); | 
						|
  /** @type {Quote} */ | 
						|
 | 
						|
  var enclosingQuote = options.parser === "json" ? '"' : options.__isInHtmlAttribute ? "'" : getPreferredQuote(raw, options.singleQuote ? "'" : '"'); // Directives are exact code unit sequences, which means that you can't | 
						|
  // change the escape sequences they use. | 
						|
  // See https://github.com/prettier/prettier/issues/1555 | 
						|
  // and https://tc39.github.io/ecma262/#directive-prologue | 
						|
 | 
						|
  if (isDirectiveLiteral) { | 
						|
    if (canChangeDirectiveQuotes) { | 
						|
      return enclosingQuote + rawContent + enclosingQuote; | 
						|
    } | 
						|
 | 
						|
    return raw; | 
						|
  } // It might sound unnecessary to use `makeString` even if the string already | 
						|
  // is enclosed with `enclosingQuote`, but it isn't. The string could contain | 
						|
  // unnecessary escapes (such as in `"\'"`). Always using `makeString` makes | 
						|
  // sure that we consistently output the minimum amount of escaped quotes. | 
						|
 | 
						|
 | 
						|
  return makeString(rawContent, enclosingQuote, !(options.parser === "css" || options.parser === "less" || options.parser === "scss" || options.embeddedInHtml)); | 
						|
} | 
						|
/** | 
						|
 * @param {string} rawContent | 
						|
 * @param {Quote} enclosingQuote | 
						|
 * @param {boolean=} unescapeUnnecessaryEscapes | 
						|
 * @returns {string} | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function makeString(rawContent, enclosingQuote, unescapeUnnecessaryEscapes) { | 
						|
  var otherQuote = enclosingQuote === '"' ? "'" : '"'; // Matches _any_ escape and unescaped quotes (both single and double). | 
						|
 | 
						|
  var regex = /\\([\s\S])|(['"])/g; // Escape and unescape single and double quotes as needed to be able to | 
						|
  // enclose `rawContent` with `enclosingQuote`. | 
						|
 | 
						|
  var newContent = rawContent.replace(regex, function (match, escaped, quote) { | 
						|
    // If we matched an escape, and the escaped character is a quote of the | 
						|
    // other type than we intend to enclose the string with, there's no need for | 
						|
    // it to be escaped, so return it _without_ the backslash. | 
						|
    if (escaped === otherQuote) { | 
						|
      return escaped; | 
						|
    } // If we matched an unescaped quote and it is of the _same_ type as we | 
						|
    // intend to enclose the string with, it must be escaped, so return it with | 
						|
    // a backslash. | 
						|
 | 
						|
 | 
						|
    if (quote === enclosingQuote) { | 
						|
      return "\\" + quote; | 
						|
    } | 
						|
 | 
						|
    if (quote) { | 
						|
      return quote; | 
						|
    } // Unescape any unnecessarily escaped character. | 
						|
    // Adapted from https://github.com/eslint/eslint/blob/de0b4ad7bd820ade41b1f606008bea68683dc11a/lib/rules/no-useless-escape.js#L27 | 
						|
 | 
						|
 | 
						|
    return unescapeUnnecessaryEscapes && /^[^\\nrvtbfux\r\n\u2028\u2029"'0-7]$/.test(escaped) ? escaped : "\\" + escaped; | 
						|
  }); | 
						|
  return enclosingQuote + newContent + enclosingQuote; | 
						|
} | 
						|
 | 
						|
function printNumber(rawNumber) { | 
						|
  return rawNumber.toLowerCase() // Remove unnecessary plus and zeroes from scientific notation. | 
						|
  .replace(/^([+-]?[\d.]+e)(?:\+|(-))?0*(\d)/, "$1$2$3") // Remove unnecessary scientific notation (1e0). | 
						|
  .replace(/^([+-]?[\d.]+)e[+-]?0+$/, "$1") // Make sure numbers always start with a digit. | 
						|
  .replace(/^([+-])?\./, "$10.") // Remove extraneous trailing decimal zeroes. | 
						|
  .replace(/(\.\d+?)0+(?=e|$)/, "$1") // Remove trailing dot. | 
						|
  .replace(/\.(?=e|$)/, ""); | 
						|
} | 
						|
/** | 
						|
 * @param {string} str | 
						|
 * @param {string} target | 
						|
 * @returns {number} | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function getMaxContinuousCount(str, target) { | 
						|
  var results = str.match(new RegExp(`(${escapeStringRegexp(target)})+`, "g")); | 
						|
 | 
						|
  if (results === null) { | 
						|
    return 0; | 
						|
  } | 
						|
 | 
						|
  return results.reduce(function (maxCount, result) { | 
						|
    return Math.max(maxCount, result.length / target.length); | 
						|
  }, 0); | 
						|
} | 
						|
 | 
						|
function getMinNotPresentContinuousCount(str, target) { | 
						|
  var matches = str.match(new RegExp(`(${escapeStringRegexp(target)})+`, "g")); | 
						|
 | 
						|
  if (matches === null) { | 
						|
    return 0; | 
						|
  } | 
						|
 | 
						|
  var countPresent = new Map(); | 
						|
  var max = 0; | 
						|
  var _iteratorNormalCompletion = true; | 
						|
  var _didIteratorError = false; | 
						|
  var _iteratorError = undefined; | 
						|
 | 
						|
  try { | 
						|
    for (var _iterator = matches[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | 
						|
      var match = _step.value; | 
						|
      var count = match.length / target.length; | 
						|
      countPresent.set(count, true); | 
						|
 | 
						|
      if (count > max) { | 
						|
        max = count; | 
						|
      } | 
						|
    } | 
						|
  } catch (err) { | 
						|
    _didIteratorError = true; | 
						|
    _iteratorError = err; | 
						|
  } finally { | 
						|
    try { | 
						|
      if (!_iteratorNormalCompletion && _iterator.return != null) { | 
						|
        _iterator.return(); | 
						|
      } | 
						|
    } finally { | 
						|
      if (_didIteratorError) { | 
						|
        throw _iteratorError; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  for (var i = 1; i < max; i++) { | 
						|
    if (!countPresent.get(i)) { | 
						|
      return i; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return max + 1; | 
						|
} | 
						|
/** | 
						|
 * @param {string} text | 
						|
 * @returns {number} | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function getStringWidth(text) { | 
						|
  if (!text) { | 
						|
    return 0; | 
						|
  } // shortcut to avoid needless string `RegExp`s, replacements, and allocations within `string-width` | 
						|
 | 
						|
 | 
						|
  if (!notAsciiRegex.test(text)) { | 
						|
    return text.length; | 
						|
  } | 
						|
 | 
						|
  return stringWidth_1(text); | 
						|
} | 
						|
 | 
						|
function hasIgnoreComment(path) { | 
						|
  var node = path.getValue(); | 
						|
  return hasNodeIgnoreComment(node); | 
						|
} | 
						|
 | 
						|
function hasNodeIgnoreComment(node) { | 
						|
  return node && node.comments && node.comments.length > 0 && node.comments.some(function (comment) { | 
						|
    return comment.value.trim() === "prettier-ignore"; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function matchAncestorTypes(path, types, index) { | 
						|
  index = index || 0; | 
						|
  types = types.slice(); | 
						|
 | 
						|
  while (types.length) { | 
						|
    var parent = path.getParentNode(index); | 
						|
    var type = types.shift(); | 
						|
 | 
						|
    if (!parent || parent.type !== type) { | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    index++; | 
						|
  } | 
						|
 | 
						|
  return true; | 
						|
} | 
						|
 | 
						|
function addCommentHelper(node, comment) { | 
						|
  var comments = node.comments || (node.comments = []); | 
						|
  comments.push(comment); | 
						|
  comment.printed = false; // For some reason, TypeScript parses `// x` inside of JSXText as a comment | 
						|
  // We already "print" it via the raw text, we don't need to re-print it as a | 
						|
  // comment | 
						|
 | 
						|
  if (node.type === "JSXText") { | 
						|
    comment.printed = true; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function addLeadingComment(node, comment) { | 
						|
  comment.leading = true; | 
						|
  comment.trailing = false; | 
						|
  addCommentHelper(node, comment); | 
						|
} | 
						|
 | 
						|
function addDanglingComment(node, comment) { | 
						|
  comment.leading = false; | 
						|
  comment.trailing = false; | 
						|
  addCommentHelper(node, comment); | 
						|
} | 
						|
 | 
						|
function addTrailingComment(node, comment) { | 
						|
  comment.leading = false; | 
						|
  comment.trailing = true; | 
						|
  addCommentHelper(node, comment); | 
						|
} | 
						|
 | 
						|
function isWithinParentArrayProperty(path, propertyName) { | 
						|
  var node = path.getValue(); | 
						|
  var parent = path.getParentNode(); | 
						|
 | 
						|
  if (parent == null) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  if (!Array.isArray(parent[propertyName])) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  var key = path.getName(); | 
						|
  return parent[propertyName][key] === node; | 
						|
} | 
						|
 | 
						|
function replaceEndOfLineWith(text, replacement) { | 
						|
  var parts = []; | 
						|
  var _iteratorNormalCompletion2 = true; | 
						|
  var _didIteratorError2 = false; | 
						|
  var _iteratorError2 = undefined; | 
						|
 | 
						|
  try { | 
						|
    for (var _iterator2 = text.split("\n")[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { | 
						|
      var part = _step2.value; | 
						|
 | 
						|
      if (parts.length !== 0) { | 
						|
        parts.push(replacement); | 
						|
      } | 
						|
 | 
						|
      parts.push(part); | 
						|
    } | 
						|
  } catch (err) { | 
						|
    _didIteratorError2 = true; | 
						|
    _iteratorError2 = err; | 
						|
  } finally { | 
						|
    try { | 
						|
      if (!_iteratorNormalCompletion2 && _iterator2.return != null) { | 
						|
        _iterator2.return(); | 
						|
      } | 
						|
    } finally { | 
						|
      if (_didIteratorError2) { | 
						|
        throw _iteratorError2; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return parts; | 
						|
} | 
						|
 | 
						|
var util = { | 
						|
  replaceEndOfLineWith, | 
						|
  getStringWidth, | 
						|
  getMaxContinuousCount, | 
						|
  getMinNotPresentContinuousCount, | 
						|
  getPrecedence, | 
						|
  shouldFlatten, | 
						|
  isBitwiseOperator, | 
						|
  isExportDeclaration, | 
						|
  getParentExportDeclaration, | 
						|
  getPenultimate, | 
						|
  getLast, | 
						|
  getNextNonSpaceNonCommentCharacterIndexWithStartIndex, | 
						|
  getNextNonSpaceNonCommentCharacterIndex, | 
						|
  getNextNonSpaceNonCommentCharacter, | 
						|
  skip, | 
						|
  skipWhitespace, | 
						|
  skipSpaces, | 
						|
  skipToLineEnd, | 
						|
  skipEverythingButNewLine, | 
						|
  skipInlineComment, | 
						|
  skipTrailingComment, | 
						|
  skipNewline, | 
						|
  isNextLineEmptyAfterIndex, | 
						|
  isNextLineEmpty, | 
						|
  isPreviousLineEmpty, | 
						|
  hasNewline, | 
						|
  hasNewlineInRange, | 
						|
  hasSpaces, | 
						|
  setLocStart, | 
						|
  setLocEnd, | 
						|
  startsWithNoLookaheadToken, | 
						|
  getAlignmentSize, | 
						|
  getIndentSize, | 
						|
  getPreferredQuote, | 
						|
  printString, | 
						|
  printNumber, | 
						|
  hasIgnoreComment, | 
						|
  hasNodeIgnoreComment, | 
						|
  makeString, | 
						|
  matchAncestorTypes, | 
						|
  addLeadingComment, | 
						|
  addDanglingComment, | 
						|
  addTrailingComment, | 
						|
  isWithinParentArrayProperty | 
						|
}; | 
						|
 | 
						|
function guessEndOfLine(text) { | 
						|
  var index = text.indexOf("\r"); | 
						|
 | 
						|
  if (index >= 0) { | 
						|
    return text.charAt(index + 1) === "\n" ? "crlf" : "cr"; | 
						|
  } | 
						|
 | 
						|
  return "lf"; | 
						|
} | 
						|
 | 
						|
function convertEndOfLineToChars(value) { | 
						|
  switch (value) { | 
						|
    case "cr": | 
						|
      return "\r"; | 
						|
 | 
						|
    case "crlf": | 
						|
      return "\r\n"; | 
						|
 | 
						|
    default: | 
						|
      return "\n"; | 
						|
  } | 
						|
} | 
						|
 | 
						|
var endOfLine = { | 
						|
  guessEndOfLine, | 
						|
  convertEndOfLineToChars | 
						|
}; | 
						|
 | 
						|
var getStringWidth$1 = util.getStringWidth; | 
						|
var convertEndOfLineToChars$1 = endOfLine.convertEndOfLineToChars; | 
						|
var concat$1 = docBuilders.concat, | 
						|
    fill$1 = docBuilders.fill, | 
						|
    cursor$1 = docBuilders.cursor; | 
						|
/** @type {Record<symbol, typeof MODE_BREAK | typeof MODE_FLAT>} */ | 
						|
 | 
						|
var groupModeMap; | 
						|
var MODE_BREAK = 1; | 
						|
var MODE_FLAT = 2; | 
						|
 | 
						|
function rootIndent() { | 
						|
  return { | 
						|
    value: "", | 
						|
    length: 0, | 
						|
    queue: [] | 
						|
  }; | 
						|
} | 
						|
 | 
						|
function makeIndent(ind, options) { | 
						|
  return generateInd(ind, { | 
						|
    type: "indent" | 
						|
  }, options); | 
						|
} | 
						|
 | 
						|
function makeAlign(ind, n, options) { | 
						|
  return n === -Infinity ? ind.root || rootIndent() : n < 0 ? generateInd(ind, { | 
						|
    type: "dedent" | 
						|
  }, options) : !n ? ind : n.type === "root" ? Object.assign({}, ind, { | 
						|
    root: ind | 
						|
  }) : typeof n === "string" ? generateInd(ind, { | 
						|
    type: "stringAlign", | 
						|
    n | 
						|
  }, options) : generateInd(ind, { | 
						|
    type: "numberAlign", | 
						|
    n | 
						|
  }, options); | 
						|
} | 
						|
 | 
						|
function generateInd(ind, newPart, options) { | 
						|
  var queue = newPart.type === "dedent" ? ind.queue.slice(0, -1) : ind.queue.concat(newPart); | 
						|
  var value = ""; | 
						|
  var length = 0; | 
						|
  var lastTabs = 0; | 
						|
  var lastSpaces = 0; | 
						|
  var _iteratorNormalCompletion = true; | 
						|
  var _didIteratorError = false; | 
						|
  var _iteratorError = undefined; | 
						|
 | 
						|
  try { | 
						|
    for (var _iterator = queue[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | 
						|
      var part = _step.value; | 
						|
 | 
						|
      switch (part.type) { | 
						|
        case "indent": | 
						|
          flush(); | 
						|
 | 
						|
          if (options.useTabs) { | 
						|
            addTabs(1); | 
						|
          } else { | 
						|
            addSpaces(options.tabWidth); | 
						|
          } | 
						|
 | 
						|
          break; | 
						|
 | 
						|
        case "stringAlign": | 
						|
          flush(); | 
						|
          value += part.n; | 
						|
          length += part.n.length; | 
						|
          break; | 
						|
 | 
						|
        case "numberAlign": | 
						|
          lastTabs += 1; | 
						|
          lastSpaces += part.n; | 
						|
          break; | 
						|
 | 
						|
        /* istanbul ignore next */ | 
						|
 | 
						|
        default: | 
						|
          throw new Error(`Unexpected type '${part.type}'`); | 
						|
      } | 
						|
    } | 
						|
  } catch (err) { | 
						|
    _didIteratorError = true; | 
						|
    _iteratorError = err; | 
						|
  } finally { | 
						|
    try { | 
						|
      if (!_iteratorNormalCompletion && _iterator.return != null) { | 
						|
        _iterator.return(); | 
						|
      } | 
						|
    } finally { | 
						|
      if (_didIteratorError) { | 
						|
        throw _iteratorError; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  flushSpaces(); | 
						|
  return Object.assign({}, ind, { | 
						|
    value, | 
						|
    length, | 
						|
    queue | 
						|
  }); | 
						|
 | 
						|
  function addTabs(count) { | 
						|
    value += "\t".repeat(count); | 
						|
    length += options.tabWidth * count; | 
						|
  } | 
						|
 | 
						|
  function addSpaces(count) { | 
						|
    value += " ".repeat(count); | 
						|
    length += count; | 
						|
  } | 
						|
 | 
						|
  function flush() { | 
						|
    if (options.useTabs) { | 
						|
      flushTabs(); | 
						|
    } else { | 
						|
      flushSpaces(); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  function flushTabs() { | 
						|
    if (lastTabs > 0) { | 
						|
      addTabs(lastTabs); | 
						|
    } | 
						|
 | 
						|
    resetLast(); | 
						|
  } | 
						|
 | 
						|
  function flushSpaces() { | 
						|
    if (lastSpaces > 0) { | 
						|
      addSpaces(lastSpaces); | 
						|
    } | 
						|
 | 
						|
    resetLast(); | 
						|
  } | 
						|
 | 
						|
  function resetLast() { | 
						|
    lastTabs = 0; | 
						|
    lastSpaces = 0; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function trim$1(out) { | 
						|
  if (out.length === 0) { | 
						|
    return 0; | 
						|
  } | 
						|
 | 
						|
  var trimCount = 0; // Trim whitespace at the end of line | 
						|
 | 
						|
  while (out.length > 0 && typeof out[out.length - 1] === "string" && out[out.length - 1].match(/^[ \t]*$/)) { | 
						|
    trimCount += out.pop().length; | 
						|
  } | 
						|
 | 
						|
  if (out.length && typeof out[out.length - 1] === "string") { | 
						|
    var trimmed = out[out.length - 1].replace(/[ \t]*$/, ""); | 
						|
    trimCount += out[out.length - 1].length - trimmed.length; | 
						|
    out[out.length - 1] = trimmed; | 
						|
  } | 
						|
 | 
						|
  return trimCount; | 
						|
} | 
						|
 | 
						|
function fits(next, restCommands, width, options, mustBeFlat) { | 
						|
  var restIdx = restCommands.length; | 
						|
  var cmds = [next]; // `out` is only used for width counting because `trim` requires to look | 
						|
  // backwards for space characters. | 
						|
 | 
						|
  var out = []; | 
						|
 | 
						|
  while (width >= 0) { | 
						|
    if (cmds.length === 0) { | 
						|
      if (restIdx === 0) { | 
						|
        return true; | 
						|
      } | 
						|
 | 
						|
      cmds.push(restCommands[restIdx - 1]); | 
						|
      restIdx--; | 
						|
      continue; | 
						|
    } | 
						|
 | 
						|
    var x = cmds.pop(); | 
						|
    var ind = x[0]; | 
						|
    var mode = x[1]; | 
						|
    var doc = x[2]; | 
						|
 | 
						|
    if (typeof doc === "string") { | 
						|
      out.push(doc); | 
						|
      width -= getStringWidth$1(doc); | 
						|
    } else { | 
						|
      switch (doc.type) { | 
						|
        case "concat": | 
						|
          for (var i = doc.parts.length - 1; i >= 0; i--) { | 
						|
            cmds.push([ind, mode, doc.parts[i]]); | 
						|
          } | 
						|
 | 
						|
          break; | 
						|
 | 
						|
        case "indent": | 
						|
          cmds.push([makeIndent(ind, options), mode, doc.contents]); | 
						|
          break; | 
						|
 | 
						|
        case "align": | 
						|
          cmds.push([makeAlign(ind, doc.n, options), mode, doc.contents]); | 
						|
          break; | 
						|
 | 
						|
        case "trim": | 
						|
          width += trim$1(out); | 
						|
          break; | 
						|
 | 
						|
        case "group": | 
						|
          if (mustBeFlat && doc.break) { | 
						|
            return false; | 
						|
          } | 
						|
 | 
						|
          cmds.push([ind, doc.break ? MODE_BREAK : mode, doc.contents]); | 
						|
 | 
						|
          if (doc.id) { | 
						|
            groupModeMap[doc.id] = cmds[cmds.length - 1][1]; | 
						|
          } | 
						|
 | 
						|
          break; | 
						|
 | 
						|
        case "fill": | 
						|
          for (var _i = doc.parts.length - 1; _i >= 0; _i--) { | 
						|
            cmds.push([ind, mode, doc.parts[_i]]); | 
						|
          } | 
						|
 | 
						|
          break; | 
						|
 | 
						|
        case "if-break": | 
						|
          { | 
						|
            var groupMode = doc.groupId ? groupModeMap[doc.groupId] : mode; | 
						|
 | 
						|
            if (groupMode === MODE_BREAK) { | 
						|
              if (doc.breakContents) { | 
						|
                cmds.push([ind, mode, doc.breakContents]); | 
						|
              } | 
						|
            } | 
						|
 | 
						|
            if (groupMode === MODE_FLAT) { | 
						|
              if (doc.flatContents) { | 
						|
                cmds.push([ind, mode, doc.flatContents]); | 
						|
              } | 
						|
            } | 
						|
 | 
						|
            break; | 
						|
          } | 
						|
 | 
						|
        case "line": | 
						|
          switch (mode) { | 
						|
            // fallthrough | 
						|
            case MODE_FLAT: | 
						|
              if (!doc.hard) { | 
						|
                if (!doc.soft) { | 
						|
                  out.push(" "); | 
						|
                  width -= 1; | 
						|
                } | 
						|
 | 
						|
                break; | 
						|
              } | 
						|
 | 
						|
              return true; | 
						|
 | 
						|
            case MODE_BREAK: | 
						|
              return true; | 
						|
          } | 
						|
 | 
						|
          break; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function printDocToString(doc, options) { | 
						|
  groupModeMap = {}; | 
						|
  var width = options.printWidth; | 
						|
  var newLine = convertEndOfLineToChars$1(options.endOfLine); | 
						|
  var pos = 0; // cmds is basically a stack. We've turned a recursive call into a | 
						|
  // while loop which is much faster. The while loop below adds new | 
						|
  // cmds to the array instead of recursively calling `print`. | 
						|
 | 
						|
  var cmds = [[rootIndent(), MODE_BREAK, doc]]; | 
						|
  var out = []; | 
						|
  var shouldRemeasure = false; | 
						|
  var lineSuffix = []; | 
						|
 | 
						|
  while (cmds.length !== 0) { | 
						|
    var x = cmds.pop(); | 
						|
    var ind = x[0]; | 
						|
    var mode = x[1]; | 
						|
    var _doc = x[2]; | 
						|
 | 
						|
    if (typeof _doc === "string") { | 
						|
      out.push(_doc); | 
						|
      pos += getStringWidth$1(_doc); | 
						|
    } else { | 
						|
      switch (_doc.type) { | 
						|
        case "cursor": | 
						|
          out.push(cursor$1.placeholder); | 
						|
          break; | 
						|
 | 
						|
        case "concat": | 
						|
          for (var i = _doc.parts.length - 1; i >= 0; i--) { | 
						|
            cmds.push([ind, mode, _doc.parts[i]]); | 
						|
          } | 
						|
 | 
						|
          break; | 
						|
 | 
						|
        case "indent": | 
						|
          cmds.push([makeIndent(ind, options), mode, _doc.contents]); | 
						|
          break; | 
						|
 | 
						|
        case "align": | 
						|
          cmds.push([makeAlign(ind, _doc.n, options), mode, _doc.contents]); | 
						|
          break; | 
						|
 | 
						|
        case "trim": | 
						|
          pos -= trim$1(out); | 
						|
          break; | 
						|
 | 
						|
        case "group": | 
						|
          switch (mode) { | 
						|
            case MODE_FLAT: | 
						|
              if (!shouldRemeasure) { | 
						|
                cmds.push([ind, _doc.break ? MODE_BREAK : MODE_FLAT, _doc.contents]); | 
						|
                break; | 
						|
              } | 
						|
 | 
						|
            // fallthrough | 
						|
 | 
						|
            case MODE_BREAK: | 
						|
              { | 
						|
                shouldRemeasure = false; | 
						|
                var next = [ind, MODE_FLAT, _doc.contents]; | 
						|
                var rem = width - pos; | 
						|
 | 
						|
                if (!_doc.break && fits(next, cmds, rem, options)) { | 
						|
                  cmds.push(next); | 
						|
                } else { | 
						|
                  // Expanded states are a rare case where a document | 
						|
                  // can manually provide multiple representations of | 
						|
                  // itself. It provides an array of documents | 
						|
                  // going from the least expanded (most flattened) | 
						|
                  // representation first to the most expanded. If a | 
						|
                  // group has these, we need to manually go through | 
						|
                  // these states and find the first one that fits. | 
						|
                  if (_doc.expandedStates) { | 
						|
                    var mostExpanded = _doc.expandedStates[_doc.expandedStates.length - 1]; | 
						|
 | 
						|
                    if (_doc.break) { | 
						|
                      cmds.push([ind, MODE_BREAK, mostExpanded]); | 
						|
                      break; | 
						|
                    } else { | 
						|
                      for (var _i2 = 1; _i2 < _doc.expandedStates.length + 1; _i2++) { | 
						|
                        if (_i2 >= _doc.expandedStates.length) { | 
						|
                          cmds.push([ind, MODE_BREAK, mostExpanded]); | 
						|
                          break; | 
						|
                        } else { | 
						|
                          var state = _doc.expandedStates[_i2]; | 
						|
                          var cmd = [ind, MODE_FLAT, state]; | 
						|
 | 
						|
                          if (fits(cmd, cmds, rem, options)) { | 
						|
                            cmds.push(cmd); | 
						|
                            break; | 
						|
                          } | 
						|
                        } | 
						|
                      } | 
						|
                    } | 
						|
                  } else { | 
						|
                    cmds.push([ind, MODE_BREAK, _doc.contents]); | 
						|
                  } | 
						|
                } | 
						|
 | 
						|
                break; | 
						|
              } | 
						|
          } | 
						|
 | 
						|
          if (_doc.id) { | 
						|
            groupModeMap[_doc.id] = cmds[cmds.length - 1][1]; | 
						|
          } | 
						|
 | 
						|
          break; | 
						|
        // Fills each line with as much code as possible before moving to a new | 
						|
        // line with the same indentation. | 
						|
        // | 
						|
        // Expects doc.parts to be an array of alternating content and | 
						|
        // whitespace. The whitespace contains the linebreaks. | 
						|
        // | 
						|
        // For example: | 
						|
        //   ["I", line, "love", line, "monkeys"] | 
						|
        // or | 
						|
        //   [{ type: group, ... }, softline, { type: group, ... }] | 
						|
        // | 
						|
        // It uses this parts structure to handle three main layout cases: | 
						|
        // * The first two content items fit on the same line without | 
						|
        //   breaking | 
						|
        //   -> output the first content item and the whitespace "flat". | 
						|
        // * Only the first content item fits on the line without breaking | 
						|
        //   -> output the first content item "flat" and the whitespace with | 
						|
        //   "break". | 
						|
        // * Neither content item fits on the line without breaking | 
						|
        //   -> output the first content item and the whitespace with "break". | 
						|
 | 
						|
        case "fill": | 
						|
          { | 
						|
            var _rem = width - pos; | 
						|
 | 
						|
            var parts = _doc.parts; | 
						|
 | 
						|
            if (parts.length === 0) { | 
						|
              break; | 
						|
            } | 
						|
 | 
						|
            var content = parts[0]; | 
						|
            var contentFlatCmd = [ind, MODE_FLAT, content]; | 
						|
            var contentBreakCmd = [ind, MODE_BREAK, content]; | 
						|
            var contentFits = fits(contentFlatCmd, [], _rem, options, true); | 
						|
 | 
						|
            if (parts.length === 1) { | 
						|
              if (contentFits) { | 
						|
                cmds.push(contentFlatCmd); | 
						|
              } else { | 
						|
                cmds.push(contentBreakCmd); | 
						|
              } | 
						|
 | 
						|
              break; | 
						|
            } | 
						|
 | 
						|
            var whitespace = parts[1]; | 
						|
            var whitespaceFlatCmd = [ind, MODE_FLAT, whitespace]; | 
						|
            var whitespaceBreakCmd = [ind, MODE_BREAK, whitespace]; | 
						|
 | 
						|
            if (parts.length === 2) { | 
						|
              if (contentFits) { | 
						|
                cmds.push(whitespaceFlatCmd); | 
						|
                cmds.push(contentFlatCmd); | 
						|
              } else { | 
						|
                cmds.push(whitespaceBreakCmd); | 
						|
                cmds.push(contentBreakCmd); | 
						|
              } | 
						|
 | 
						|
              break; | 
						|
            } // At this point we've handled the first pair (context, separator) | 
						|
            // and will create a new fill doc for the rest of the content. | 
						|
            // Ideally we wouldn't mutate the array here but coping all the | 
						|
            // elements to a new array would make this algorithm quadratic, | 
						|
            // which is unusable for large arrays (e.g. large texts in JSX). | 
						|
 | 
						|
 | 
						|
            parts.splice(0, 2); | 
						|
            var remainingCmd = [ind, mode, fill$1(parts)]; | 
						|
            var secondContent = parts[0]; | 
						|
            var firstAndSecondContentFlatCmd = [ind, MODE_FLAT, concat$1([content, whitespace, secondContent])]; | 
						|
            var firstAndSecondContentFits = fits(firstAndSecondContentFlatCmd, [], _rem, options, true); | 
						|
 | 
						|
            if (firstAndSecondContentFits) { | 
						|
              cmds.push(remainingCmd); | 
						|
              cmds.push(whitespaceFlatCmd); | 
						|
              cmds.push(contentFlatCmd); | 
						|
            } else if (contentFits) { | 
						|
              cmds.push(remainingCmd); | 
						|
              cmds.push(whitespaceBreakCmd); | 
						|
              cmds.push(contentFlatCmd); | 
						|
            } else { | 
						|
              cmds.push(remainingCmd); | 
						|
              cmds.push(whitespaceBreakCmd); | 
						|
              cmds.push(contentBreakCmd); | 
						|
            } | 
						|
 | 
						|
            break; | 
						|
          } | 
						|
 | 
						|
        case "if-break": | 
						|
          { | 
						|
            var groupMode = _doc.groupId ? groupModeMap[_doc.groupId] : mode; | 
						|
 | 
						|
            if (groupMode === MODE_BREAK) { | 
						|
              if (_doc.breakContents) { | 
						|
                cmds.push([ind, mode, _doc.breakContents]); | 
						|
              } | 
						|
            } | 
						|
 | 
						|
            if (groupMode === MODE_FLAT) { | 
						|
              if (_doc.flatContents) { | 
						|
                cmds.push([ind, mode, _doc.flatContents]); | 
						|
              } | 
						|
            } | 
						|
 | 
						|
            break; | 
						|
          } | 
						|
 | 
						|
        case "line-suffix": | 
						|
          lineSuffix.push([ind, mode, _doc.contents]); | 
						|
          break; | 
						|
 | 
						|
        case "line-suffix-boundary": | 
						|
          if (lineSuffix.length > 0) { | 
						|
            cmds.push([ind, mode, { | 
						|
              type: "line", | 
						|
              hard: true | 
						|
            }]); | 
						|
          } | 
						|
 | 
						|
          break; | 
						|
 | 
						|
        case "line": | 
						|
          switch (mode) { | 
						|
            case MODE_FLAT: | 
						|
              if (!_doc.hard) { | 
						|
                if (!_doc.soft) { | 
						|
                  out.push(" "); | 
						|
                  pos += 1; | 
						|
                } | 
						|
 | 
						|
                break; | 
						|
              } else { | 
						|
                // This line was forced into the output even if we | 
						|
                // were in flattened mode, so we need to tell the next | 
						|
                // group that no matter what, it needs to remeasure | 
						|
                // because the previous measurement didn't accurately | 
						|
                // capture the entire expression (this is necessary | 
						|
                // for nested groups) | 
						|
                shouldRemeasure = true; | 
						|
              } | 
						|
 | 
						|
            // fallthrough | 
						|
 | 
						|
            case MODE_BREAK: | 
						|
              if (lineSuffix.length) { | 
						|
                cmds.push([ind, mode, _doc]); | 
						|
                [].push.apply(cmds, lineSuffix.reverse()); | 
						|
                lineSuffix = []; | 
						|
                break; | 
						|
              } | 
						|
 | 
						|
              if (_doc.literal) { | 
						|
                if (ind.root) { | 
						|
                  out.push(newLine, ind.root.value); | 
						|
                  pos = ind.root.length; | 
						|
                } else { | 
						|
                  out.push(newLine); | 
						|
                  pos = 0; | 
						|
                } | 
						|
              } else { | 
						|
                pos -= trim$1(out); | 
						|
                out.push(newLine + ind.value); | 
						|
                pos = ind.length; | 
						|
              } | 
						|
 | 
						|
              break; | 
						|
          } | 
						|
 | 
						|
          break; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  var cursorPlaceholderIndex = out.indexOf(cursor$1.placeholder); | 
						|
 | 
						|
  if (cursorPlaceholderIndex !== -1) { | 
						|
    var otherCursorPlaceholderIndex = out.indexOf(cursor$1.placeholder, cursorPlaceholderIndex + 1); | 
						|
    var beforeCursor = out.slice(0, cursorPlaceholderIndex).join(""); | 
						|
    var aroundCursor = out.slice(cursorPlaceholderIndex + 1, otherCursorPlaceholderIndex).join(""); | 
						|
    var afterCursor = out.slice(otherCursorPlaceholderIndex + 1).join(""); | 
						|
    return { | 
						|
      formatted: beforeCursor + aroundCursor + afterCursor, | 
						|
      cursorNodeStart: beforeCursor.length, | 
						|
      cursorNodeText: aroundCursor | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  return { | 
						|
    formatted: out.join("") | 
						|
  }; | 
						|
} | 
						|
 | 
						|
var docPrinter = { | 
						|
  printDocToString | 
						|
}; | 
						|
 | 
						|
var traverseDocOnExitStackMarker = {}; | 
						|
 | 
						|
function traverseDoc(doc, onEnter, onExit, shouldTraverseConditionalGroups) { | 
						|
  var docsStack = [doc]; | 
						|
 | 
						|
  while (docsStack.length !== 0) { | 
						|
    var _doc = docsStack.pop(); | 
						|
 | 
						|
    if (_doc === traverseDocOnExitStackMarker) { | 
						|
      onExit(docsStack.pop()); | 
						|
      continue; | 
						|
    } | 
						|
 | 
						|
    var shouldRecurse = true; | 
						|
 | 
						|
    if (onEnter) { | 
						|
      if (onEnter(_doc) === false) { | 
						|
        shouldRecurse = false; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    if (onExit) { | 
						|
      docsStack.push(_doc); | 
						|
      docsStack.push(traverseDocOnExitStackMarker); | 
						|
    } | 
						|
 | 
						|
    if (shouldRecurse) { | 
						|
      // When there are multiple parts to process, | 
						|
      // the parts need to be pushed onto the stack in reverse order, | 
						|
      // so that they are processed in the original order | 
						|
      // when the stack is popped. | 
						|
      if (_doc.type === "concat" || _doc.type === "fill") { | 
						|
        for (var ic = _doc.parts.length, i = ic - 1; i >= 0; --i) { | 
						|
          docsStack.push(_doc.parts[i]); | 
						|
        } | 
						|
      } else if (_doc.type === "if-break") { | 
						|
        if (_doc.flatContents) { | 
						|
          docsStack.push(_doc.flatContents); | 
						|
        } | 
						|
 | 
						|
        if (_doc.breakContents) { | 
						|
          docsStack.push(_doc.breakContents); | 
						|
        } | 
						|
      } else if (_doc.type === "group" && _doc.expandedStates) { | 
						|
        if (shouldTraverseConditionalGroups) { | 
						|
          for (var _ic = _doc.expandedStates.length, _i = _ic - 1; _i >= 0; --_i) { | 
						|
            docsStack.push(_doc.expandedStates[_i]); | 
						|
          } | 
						|
        } else { | 
						|
          docsStack.push(_doc.contents); | 
						|
        } | 
						|
      } else if (_doc.contents) { | 
						|
        docsStack.push(_doc.contents); | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
} | 
						|
 | 
						|
function mapDoc(doc, cb) { | 
						|
  if (doc.type === "concat" || doc.type === "fill") { | 
						|
    var parts = doc.parts.map(function (part) { | 
						|
      return mapDoc(part, cb); | 
						|
    }); | 
						|
    return cb(Object.assign({}, doc, { | 
						|
      parts | 
						|
    })); | 
						|
  } else if (doc.type === "if-break") { | 
						|
    var breakContents = doc.breakContents && mapDoc(doc.breakContents, cb); | 
						|
    var flatContents = doc.flatContents && mapDoc(doc.flatContents, cb); | 
						|
    return cb(Object.assign({}, doc, { | 
						|
      breakContents, | 
						|
      flatContents | 
						|
    })); | 
						|
  } else if (doc.contents) { | 
						|
    var contents = mapDoc(doc.contents, cb); | 
						|
    return cb(Object.assign({}, doc, { | 
						|
      contents | 
						|
    })); | 
						|
  } | 
						|
 | 
						|
  return cb(doc); | 
						|
} | 
						|
 | 
						|
function findInDoc(doc, fn, defaultValue) { | 
						|
  var result = defaultValue; | 
						|
  var hasStopped = false; | 
						|
 | 
						|
  function findInDocOnEnterFn(doc) { | 
						|
    var maybeResult = fn(doc); | 
						|
 | 
						|
    if (maybeResult !== undefined) { | 
						|
      hasStopped = true; | 
						|
      result = maybeResult; | 
						|
    } | 
						|
 | 
						|
    if (hasStopped) { | 
						|
      return false; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  traverseDoc(doc, findInDocOnEnterFn); | 
						|
  return result; | 
						|
} | 
						|
 | 
						|
function isEmpty(n) { | 
						|
  return typeof n === "string" && n.length === 0; | 
						|
} | 
						|
 | 
						|
function isLineNextFn(doc) { | 
						|
  if (typeof doc === "string") { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  if (doc.type === "line") { | 
						|
    return true; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function isLineNext(doc) { | 
						|
  return findInDoc(doc, isLineNextFn, false); | 
						|
} | 
						|
 | 
						|
function willBreakFn(doc) { | 
						|
  if (doc.type === "group" && doc.break) { | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  if (doc.type === "line" && doc.hard) { | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  if (doc.type === "break-parent") { | 
						|
    return true; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function willBreak(doc) { | 
						|
  return findInDoc(doc, willBreakFn, false); | 
						|
} | 
						|
 | 
						|
function breakParentGroup(groupStack) { | 
						|
  if (groupStack.length > 0) { | 
						|
    var parentGroup = groupStack[groupStack.length - 1]; // Breaks are not propagated through conditional groups because | 
						|
    // the user is expected to manually handle what breaks. | 
						|
 | 
						|
    if (!parentGroup.expandedStates) { | 
						|
      parentGroup.break = true; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return null; | 
						|
} | 
						|
 | 
						|
function propagateBreaks(doc) { | 
						|
  var alreadyVisitedSet = new Set(); | 
						|
  var groupStack = []; | 
						|
 | 
						|
  function propagateBreaksOnEnterFn(doc) { | 
						|
    if (doc.type === "break-parent") { | 
						|
      breakParentGroup(groupStack); | 
						|
    } | 
						|
 | 
						|
    if (doc.type === "group") { | 
						|
      groupStack.push(doc); | 
						|
 | 
						|
      if (alreadyVisitedSet.has(doc)) { | 
						|
        return false; | 
						|
      } | 
						|
 | 
						|
      alreadyVisitedSet.add(doc); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  function propagateBreaksOnExitFn(doc) { | 
						|
    if (doc.type === "group") { | 
						|
      var group = groupStack.pop(); | 
						|
 | 
						|
      if (group.break) { | 
						|
        breakParentGroup(groupStack); | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  traverseDoc(doc, propagateBreaksOnEnterFn, propagateBreaksOnExitFn, | 
						|
  /* shouldTraverseConditionalGroups */ | 
						|
  true); | 
						|
} | 
						|
 | 
						|
function removeLinesFn(doc) { | 
						|
  // Force this doc into flat mode by statically converting all | 
						|
  // lines into spaces (or soft lines into nothing). Hard lines | 
						|
  // should still output because there's too great of a chance | 
						|
  // of breaking existing assumptions otherwise. | 
						|
  if (doc.type === "line" && !doc.hard) { | 
						|
    return doc.soft ? "" : " "; | 
						|
  } else if (doc.type === "if-break") { | 
						|
    return doc.flatContents || ""; | 
						|
  } | 
						|
 | 
						|
  return doc; | 
						|
} | 
						|
 | 
						|
function removeLines(doc) { | 
						|
  return mapDoc(doc, removeLinesFn); | 
						|
} | 
						|
 | 
						|
function stripTrailingHardline(doc) { | 
						|
  // HACK remove ending hardline, original PR: #1984 | 
						|
  if (doc.type === "concat" && doc.parts.length !== 0) { | 
						|
    var lastPart = doc.parts[doc.parts.length - 1]; | 
						|
 | 
						|
    if (lastPart.type === "concat") { | 
						|
      if (lastPart.parts.length === 2 && lastPart.parts[0].hard && lastPart.parts[1].type === "break-parent") { | 
						|
        return { | 
						|
          type: "concat", | 
						|
          parts: doc.parts.slice(0, -1) | 
						|
        }; | 
						|
      } | 
						|
 | 
						|
      return { | 
						|
        type: "concat", | 
						|
        parts: doc.parts.slice(0, -1).concat(stripTrailingHardline(lastPart)) | 
						|
      }; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return doc; | 
						|
} | 
						|
 | 
						|
var docUtils = { | 
						|
  isEmpty, | 
						|
  willBreak, | 
						|
  isLineNext, | 
						|
  traverseDoc, | 
						|
  findInDoc, | 
						|
  mapDoc, | 
						|
  propagateBreaks, | 
						|
  removeLines, | 
						|
  stripTrailingHardline | 
						|
}; | 
						|
 | 
						|
function flattenDoc(doc) { | 
						|
  if (doc.type === "concat") { | 
						|
    var res = []; | 
						|
 | 
						|
    for (var i = 0; i < doc.parts.length; ++i) { | 
						|
      var doc2 = doc.parts[i]; | 
						|
 | 
						|
      if (typeof doc2 !== "string" && doc2.type === "concat") { | 
						|
        [].push.apply(res, flattenDoc(doc2).parts); | 
						|
      } else { | 
						|
        var flattened = flattenDoc(doc2); | 
						|
 | 
						|
        if (flattened !== "") { | 
						|
          res.push(flattened); | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return Object.assign({}, doc, { | 
						|
      parts: res | 
						|
    }); | 
						|
  } else if (doc.type === "if-break") { | 
						|
    return Object.assign({}, doc, { | 
						|
      breakContents: doc.breakContents != null ? flattenDoc(doc.breakContents) : null, | 
						|
      flatContents: doc.flatContents != null ? flattenDoc(doc.flatContents) : null | 
						|
    }); | 
						|
  } else if (doc.type === "group") { | 
						|
    return Object.assign({}, doc, { | 
						|
      contents: flattenDoc(doc.contents), | 
						|
      expandedStates: doc.expandedStates ? doc.expandedStates.map(flattenDoc) : doc.expandedStates | 
						|
    }); | 
						|
  } else if (doc.contents) { | 
						|
    return Object.assign({}, doc, { | 
						|
      contents: flattenDoc(doc.contents) | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  return doc; | 
						|
} | 
						|
 | 
						|
function printDoc(doc) { | 
						|
  if (typeof doc === "string") { | 
						|
    return JSON.stringify(doc); | 
						|
  } | 
						|
 | 
						|
  if (doc.type === "line") { | 
						|
    if (doc.literal) { | 
						|
      return "literalline"; | 
						|
    } | 
						|
 | 
						|
    if (doc.hard) { | 
						|
      return "hardline"; | 
						|
    } | 
						|
 | 
						|
    if (doc.soft) { | 
						|
      return "softline"; | 
						|
    } | 
						|
 | 
						|
    return "line"; | 
						|
  } | 
						|
 | 
						|
  if (doc.type === "break-parent") { | 
						|
    return "breakParent"; | 
						|
  } | 
						|
 | 
						|
  if (doc.type === "trim") { | 
						|
    return "trim"; | 
						|
  } | 
						|
 | 
						|
  if (doc.type === "concat") { | 
						|
    return "[" + doc.parts.map(printDoc).join(", ") + "]"; | 
						|
  } | 
						|
 | 
						|
  if (doc.type === "indent") { | 
						|
    return "indent(" + printDoc(doc.contents) + ")"; | 
						|
  } | 
						|
 | 
						|
  if (doc.type === "align") { | 
						|
    return doc.n === -Infinity ? "dedentToRoot(" + printDoc(doc.contents) + ")" : doc.n < 0 ? "dedent(" + printDoc(doc.contents) + ")" : doc.n.type === "root" ? "markAsRoot(" + printDoc(doc.contents) + ")" : "align(" + JSON.stringify(doc.n) + ", " + printDoc(doc.contents) + ")"; | 
						|
  } | 
						|
 | 
						|
  if (doc.type === "if-break") { | 
						|
    return "ifBreak(" + printDoc(doc.breakContents) + (doc.flatContents ? ", " + printDoc(doc.flatContents) : "") + ")"; | 
						|
  } | 
						|
 | 
						|
  if (doc.type === "group") { | 
						|
    if (doc.expandedStates) { | 
						|
      return "conditionalGroup(" + "[" + doc.expandedStates.map(printDoc).join(",") + "])"; | 
						|
    } | 
						|
 | 
						|
    return (doc.break ? "wrappedGroup" : "group") + "(" + printDoc(doc.contents) + ")"; | 
						|
  } | 
						|
 | 
						|
  if (doc.type === "fill") { | 
						|
    return "fill" + "(" + doc.parts.map(printDoc).join(", ") + ")"; | 
						|
  } | 
						|
 | 
						|
  if (doc.type === "line-suffix") { | 
						|
    return "lineSuffix(" + printDoc(doc.contents) + ")"; | 
						|
  } | 
						|
 | 
						|
  if (doc.type === "line-suffix-boundary") { | 
						|
    return "lineSuffixBoundary"; | 
						|
  } | 
						|
 | 
						|
  throw new Error("Unknown doc type " + doc.type); | 
						|
} | 
						|
 | 
						|
var docDebug = { | 
						|
  printDocToDebug: function printDocToDebug(doc) { | 
						|
    return printDoc(flattenDoc(doc)); | 
						|
  } | 
						|
}; | 
						|
 | 
						|
var doc = { | 
						|
  builders: docBuilders, | 
						|
  printer: docPrinter, | 
						|
  utils: docUtils, | 
						|
  debug: docDebug | 
						|
}; | 
						|
 | 
						|
var mapDoc$1 = doc.utils.mapDoc; | 
						|
 | 
						|
function isNextLineEmpty$1(text, node, options) { | 
						|
  return util.isNextLineEmpty(text, node, options.locEnd); | 
						|
} | 
						|
 | 
						|
function isPreviousLineEmpty$1(text, node, options) { | 
						|
  return util.isPreviousLineEmpty(text, node, options.locStart); | 
						|
} | 
						|
 | 
						|
function getNextNonSpaceNonCommentCharacterIndex$1(text, node, options) { | 
						|
  return util.getNextNonSpaceNonCommentCharacterIndex(text, node, options.locEnd); | 
						|
} | 
						|
 | 
						|
var utilShared = { | 
						|
  getMaxContinuousCount: util.getMaxContinuousCount, | 
						|
  getStringWidth: util.getStringWidth, | 
						|
  getAlignmentSize: util.getAlignmentSize, | 
						|
  getIndentSize: util.getIndentSize, | 
						|
  skip: util.skip, | 
						|
  skipWhitespace: util.skipWhitespace, | 
						|
  skipSpaces: util.skipSpaces, | 
						|
  skipNewline: util.skipNewline, | 
						|
  skipToLineEnd: util.skipToLineEnd, | 
						|
  skipEverythingButNewLine: util.skipEverythingButNewLine, | 
						|
  skipInlineComment: util.skipInlineComment, | 
						|
  skipTrailingComment: util.skipTrailingComment, | 
						|
  hasNewline: util.hasNewline, | 
						|
  hasNewlineInRange: util.hasNewlineInRange, | 
						|
  hasSpaces: util.hasSpaces, | 
						|
  isNextLineEmpty: isNextLineEmpty$1, | 
						|
  isNextLineEmptyAfterIndex: util.isNextLineEmptyAfterIndex, | 
						|
  isPreviousLineEmpty: isPreviousLineEmpty$1, | 
						|
  getNextNonSpaceNonCommentCharacterIndex: getNextNonSpaceNonCommentCharacterIndex$1, | 
						|
  mapDoc: mapDoc$1, | 
						|
  // TODO: remove in 2.0, we already exposed it in docUtils | 
						|
  makeString: util.makeString, | 
						|
  addLeadingComment: util.addLeadingComment, | 
						|
  addDanglingComment: util.addDanglingComment, | 
						|
  addTrailingComment: util.addTrailingComment | 
						|
}; | 
						|
 | 
						|
var _require$$0$builders = doc.builders, | 
						|
    concat$2 = _require$$0$builders.concat, | 
						|
    hardline$1 = _require$$0$builders.hardline, | 
						|
    breakParent$1 = _require$$0$builders.breakParent, | 
						|
    indent$1 = _require$$0$builders.indent, | 
						|
    lineSuffix$1 = _require$$0$builders.lineSuffix, | 
						|
    join$1 = _require$$0$builders.join, | 
						|
    cursor$2 = _require$$0$builders.cursor; | 
						|
var hasNewline$1 = util.hasNewline, | 
						|
    skipNewline$1 = util.skipNewline, | 
						|
    isPreviousLineEmpty$2 = util.isPreviousLineEmpty; | 
						|
var addLeadingComment$1 = utilShared.addLeadingComment, | 
						|
    addDanglingComment$1 = utilShared.addDanglingComment, | 
						|
    addTrailingComment$1 = utilShared.addTrailingComment; | 
						|
var childNodesCacheKey = Symbol("child-nodes"); | 
						|
 | 
						|
function getSortedChildNodes(node, options, resultArray) { | 
						|
  if (!node) { | 
						|
    return; | 
						|
  } | 
						|
 | 
						|
  var printer = options.printer, | 
						|
      locStart = options.locStart, | 
						|
      locEnd = options.locEnd; | 
						|
 | 
						|
  if (resultArray) { | 
						|
    if (node && printer.canAttachComment && printer.canAttachComment(node)) { | 
						|
      // This reverse insertion sort almost always takes constant | 
						|
      // time because we almost always (maybe always?) append the | 
						|
      // nodes in order anyway. | 
						|
      var i; | 
						|
 | 
						|
      for (i = resultArray.length - 1; i >= 0; --i) { | 
						|
        if (locStart(resultArray[i]) <= locStart(node) && locEnd(resultArray[i]) <= locEnd(node)) { | 
						|
          break; | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      resultArray.splice(i + 1, 0, node); | 
						|
      return; | 
						|
    } | 
						|
  } else if (node[childNodesCacheKey]) { | 
						|
    return node[childNodesCacheKey]; | 
						|
  } | 
						|
 | 
						|
  var childNodes; | 
						|
 | 
						|
  if (printer.getCommentChildNodes) { | 
						|
    childNodes = printer.getCommentChildNodes(node); | 
						|
  } else if (node && typeof node === "object") { | 
						|
    childNodes = Object.keys(node).filter(function (n) { | 
						|
      return n !== "enclosingNode" && n !== "precedingNode" && n !== "followingNode"; | 
						|
    }).map(function (n) { | 
						|
      return node[n]; | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  if (!childNodes) { | 
						|
    return; | 
						|
  } | 
						|
 | 
						|
  if (!resultArray) { | 
						|
    Object.defineProperty(node, childNodesCacheKey, { | 
						|
      value: resultArray = [], | 
						|
      enumerable: false | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  childNodes.forEach(function (childNode) { | 
						|
    getSortedChildNodes(childNode, options, resultArray); | 
						|
  }); | 
						|
  return resultArray; | 
						|
} // As efficiently as possible, decorate the comment object with | 
						|
// .precedingNode, .enclosingNode, and/or .followingNode properties, at | 
						|
// least one of which is guaranteed to be defined. | 
						|
 | 
						|
 | 
						|
function decorateComment(node, comment, options) { | 
						|
  var locStart = options.locStart, | 
						|
      locEnd = options.locEnd; | 
						|
  var childNodes = getSortedChildNodes(node, options); | 
						|
  var precedingNode; | 
						|
  var followingNode; // Time to dust off the old binary search robes and wizard hat. | 
						|
 | 
						|
  var left = 0; | 
						|
  var right = childNodes.length; | 
						|
 | 
						|
  while (left < right) { | 
						|
    var middle = left + right >> 1; | 
						|
    var child = childNodes[middle]; | 
						|
 | 
						|
    if (locStart(child) - locStart(comment) <= 0 && locEnd(comment) - locEnd(child) <= 0) { | 
						|
      // The comment is completely contained by this child node. | 
						|
      comment.enclosingNode = child; | 
						|
      decorateComment(child, comment, options); | 
						|
      return; // Abandon the binary search at this level. | 
						|
    } | 
						|
 | 
						|
    if (locEnd(child) - locStart(comment) <= 0) { | 
						|
      // This child node falls completely before the comment. | 
						|
      // Because we will never consider this node or any nodes | 
						|
      // before it again, this node must be the closest preceding | 
						|
      // node we have encountered so far. | 
						|
      precedingNode = child; | 
						|
      left = middle + 1; | 
						|
      continue; | 
						|
    } | 
						|
 | 
						|
    if (locEnd(comment) - locStart(child) <= 0) { | 
						|
      // This child node falls completely after the comment. | 
						|
      // Because we will never consider this node or any nodes after | 
						|
      // it again, this node must be the closest following node we | 
						|
      // have encountered so far. | 
						|
      followingNode = child; | 
						|
      right = middle; | 
						|
      continue; | 
						|
    } | 
						|
    /* istanbul ignore next */ | 
						|
 | 
						|
 | 
						|
    throw new Error("Comment location overlaps with node location"); | 
						|
  } // We don't want comments inside of different expressions inside of the same | 
						|
  // template literal to move to another expression. | 
						|
 | 
						|
 | 
						|
  if (comment.enclosingNode && comment.enclosingNode.type === "TemplateLiteral") { | 
						|
    var quasis = comment.enclosingNode.quasis; | 
						|
    var commentIndex = findExpressionIndexForComment(quasis, comment, options); | 
						|
 | 
						|
    if (precedingNode && findExpressionIndexForComment(quasis, precedingNode, options) !== commentIndex) { | 
						|
      precedingNode = null; | 
						|
    } | 
						|
 | 
						|
    if (followingNode && findExpressionIndexForComment(quasis, followingNode, options) !== commentIndex) { | 
						|
      followingNode = null; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  if (precedingNode) { | 
						|
    comment.precedingNode = precedingNode; | 
						|
  } | 
						|
 | 
						|
  if (followingNode) { | 
						|
    comment.followingNode = followingNode; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function attach(comments, ast, text, options) { | 
						|
  if (!Array.isArray(comments)) { | 
						|
    return; | 
						|
  } | 
						|
 | 
						|
  var tiesToBreak = []; | 
						|
  var locStart = options.locStart, | 
						|
      locEnd = options.locEnd; | 
						|
  comments.forEach(function (comment, i) { | 
						|
    if (options.parser === "json" || options.parser === "json5" || options.parser === "__js_expression" || options.parser === "__vue_expression") { | 
						|
      if (locStart(comment) - locStart(ast) <= 0) { | 
						|
        addLeadingComment$1(ast, comment); | 
						|
        return; | 
						|
      } | 
						|
 | 
						|
      if (locEnd(comment) - locEnd(ast) >= 0) { | 
						|
        addTrailingComment$1(ast, comment); | 
						|
        return; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    decorateComment(ast, comment, options); | 
						|
    var precedingNode = comment.precedingNode, | 
						|
        enclosingNode = comment.enclosingNode, | 
						|
        followingNode = comment.followingNode; | 
						|
    var pluginHandleOwnLineComment = options.printer.handleComments && options.printer.handleComments.ownLine ? options.printer.handleComments.ownLine : function () { | 
						|
      return false; | 
						|
    }; | 
						|
    var pluginHandleEndOfLineComment = options.printer.handleComments && options.printer.handleComments.endOfLine ? options.printer.handleComments.endOfLine : function () { | 
						|
      return false; | 
						|
    }; | 
						|
    var pluginHandleRemainingComment = options.printer.handleComments && options.printer.handleComments.remaining ? options.printer.handleComments.remaining : function () { | 
						|
      return false; | 
						|
    }; | 
						|
    var isLastComment = comments.length - 1 === i; | 
						|
 | 
						|
    if (hasNewline$1(text, locStart(comment), { | 
						|
      backwards: true | 
						|
    })) { | 
						|
      // If a comment exists on its own line, prefer a leading comment. | 
						|
      // We also need to check if it's the first line of the file. | 
						|
      if (pluginHandleOwnLineComment(comment, text, options, ast, isLastComment)) ; else if (followingNode) { | 
						|
        // Always a leading comment. | 
						|
        addLeadingComment$1(followingNode, comment); | 
						|
      } else if (precedingNode) { | 
						|
        addTrailingComment$1(precedingNode, comment); | 
						|
      } else if (enclosingNode) { | 
						|
        addDanglingComment$1(enclosingNode, comment); | 
						|
      } else { | 
						|
        // There are no nodes, let's attach it to the root of the ast | 
						|
 | 
						|
        /* istanbul ignore next */ | 
						|
        addDanglingComment$1(ast, comment); | 
						|
      } | 
						|
    } else if (hasNewline$1(text, locEnd(comment))) { | 
						|
      if (pluginHandleEndOfLineComment(comment, text, options, ast, isLastComment)) ; else if (precedingNode) { | 
						|
        // There is content before this comment on the same line, but | 
						|
        // none after it, so prefer a trailing comment of the previous node. | 
						|
        addTrailingComment$1(precedingNode, comment); | 
						|
      } else if (followingNode) { | 
						|
        addLeadingComment$1(followingNode, comment); | 
						|
      } else if (enclosingNode) { | 
						|
        addDanglingComment$1(enclosingNode, comment); | 
						|
      } else { | 
						|
        // There are no nodes, let's attach it to the root of the ast | 
						|
 | 
						|
        /* istanbul ignore next */ | 
						|
        addDanglingComment$1(ast, comment); | 
						|
      } | 
						|
    } else { | 
						|
      if (pluginHandleRemainingComment(comment, text, options, ast, isLastComment)) ; else if (precedingNode && followingNode) { | 
						|
        // Otherwise, text exists both before and after the comment on | 
						|
        // the same line. If there is both a preceding and following | 
						|
        // node, use a tie-breaking algorithm to determine if it should | 
						|
        // be attached to the next or previous node. In the last case, | 
						|
        // simply attach the right node; | 
						|
        var tieCount = tiesToBreak.length; | 
						|
 | 
						|
        if (tieCount > 0) { | 
						|
          var lastTie = tiesToBreak[tieCount - 1]; | 
						|
 | 
						|
          if (lastTie.followingNode !== comment.followingNode) { | 
						|
            breakTies(tiesToBreak, text, options); | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        tiesToBreak.push(comment); | 
						|
      } else if (precedingNode) { | 
						|
        addTrailingComment$1(precedingNode, comment); | 
						|
      } else if (followingNode) { | 
						|
        addLeadingComment$1(followingNode, comment); | 
						|
      } else if (enclosingNode) { | 
						|
        addDanglingComment$1(enclosingNode, comment); | 
						|
      } else { | 
						|
        // There are no nodes, let's attach it to the root of the ast | 
						|
 | 
						|
        /* istanbul ignore next */ | 
						|
        addDanglingComment$1(ast, comment); | 
						|
      } | 
						|
    } | 
						|
  }); | 
						|
  breakTies(tiesToBreak, text, options); | 
						|
  comments.forEach(function (comment) { | 
						|
    // These node references were useful for breaking ties, but we | 
						|
    // don't need them anymore, and they create cycles in the AST that | 
						|
    // may lead to infinite recursion if we don't delete them here. | 
						|
    delete comment.precedingNode; | 
						|
    delete comment.enclosingNode; | 
						|
    delete comment.followingNode; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function breakTies(tiesToBreak, text, options) { | 
						|
  var tieCount = tiesToBreak.length; | 
						|
 | 
						|
  if (tieCount === 0) { | 
						|
    return; | 
						|
  } | 
						|
 | 
						|
  var _tiesToBreak$ = tiesToBreak[0], | 
						|
      precedingNode = _tiesToBreak$.precedingNode, | 
						|
      followingNode = _tiesToBreak$.followingNode; | 
						|
  var gapEndPos = options.locStart(followingNode); // Iterate backwards through tiesToBreak, examining the gaps | 
						|
  // between the tied comments. In order to qualify as leading, a | 
						|
  // comment must be separated from followingNode by an unbroken series of | 
						|
  // gaps (or other comments). Gaps should only contain whitespace or open | 
						|
  // parentheses. | 
						|
 | 
						|
  var indexOfFirstLeadingComment; | 
						|
 | 
						|
  for (indexOfFirstLeadingComment = tieCount; indexOfFirstLeadingComment > 0; --indexOfFirstLeadingComment) { | 
						|
    var comment = tiesToBreak[indexOfFirstLeadingComment - 1]; | 
						|
    assert$1.strictEqual(comment.precedingNode, precedingNode); | 
						|
    assert$1.strictEqual(comment.followingNode, followingNode); | 
						|
    var gap = text.slice(options.locEnd(comment), gapEndPos); | 
						|
 | 
						|
    if (/^[\s(]*$/.test(gap)) { | 
						|
      gapEndPos = options.locStart(comment); | 
						|
    } else { | 
						|
      // The gap string contained something other than whitespace or open | 
						|
      // parentheses. | 
						|
      break; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  tiesToBreak.forEach(function (comment, i) { | 
						|
    if (i < indexOfFirstLeadingComment) { | 
						|
      addTrailingComment$1(precedingNode, comment); | 
						|
    } else { | 
						|
      addLeadingComment$1(followingNode, comment); | 
						|
    } | 
						|
  }); | 
						|
  tiesToBreak.length = 0; | 
						|
} | 
						|
 | 
						|
function printComment(commentPath, options) { | 
						|
  var comment = commentPath.getValue(); | 
						|
  comment.printed = true; | 
						|
  return options.printer.printComment(commentPath, options); | 
						|
} | 
						|
 | 
						|
function findExpressionIndexForComment(quasis, comment, options) { | 
						|
  var startPos = options.locStart(comment) - 1; | 
						|
 | 
						|
  for (var i = 1; i < quasis.length; ++i) { | 
						|
    if (startPos < getQuasiRange(quasis[i]).start) { | 
						|
      return i - 1; | 
						|
    } | 
						|
  } // We haven't found it, it probably means that some of the locations are off. | 
						|
  // Let's just return the first one. | 
						|
 | 
						|
  /* istanbul ignore next */ | 
						|
 | 
						|
 | 
						|
  return 0; | 
						|
} | 
						|
 | 
						|
function getQuasiRange(expr) { | 
						|
  if (expr.start !== undefined) { | 
						|
    // Babel | 
						|
    return { | 
						|
      start: expr.start, | 
						|
      end: expr.end | 
						|
    }; | 
						|
  } // Flow | 
						|
 | 
						|
 | 
						|
  return { | 
						|
    start: expr.range[0], | 
						|
    end: expr.range[1] | 
						|
  }; | 
						|
} | 
						|
 | 
						|
function printLeadingComment(commentPath, print, options) { | 
						|
  var comment = commentPath.getValue(); | 
						|
  var contents = printComment(commentPath, options); | 
						|
 | 
						|
  if (!contents) { | 
						|
    return ""; | 
						|
  } | 
						|
 | 
						|
  var isBlock = options.printer.isBlockComment && options.printer.isBlockComment(comment); // Leading block comments should see if they need to stay on the | 
						|
  // same line or not. | 
						|
 | 
						|
  if (isBlock) { | 
						|
    return concat$2([contents, hasNewline$1(options.originalText, options.locEnd(comment)) ? hardline$1 : " "]); | 
						|
  } | 
						|
 | 
						|
  return concat$2([contents, hardline$1]); | 
						|
} | 
						|
 | 
						|
function printTrailingComment(commentPath, print, options) { | 
						|
  var comment = commentPath.getValue(); | 
						|
  var contents = printComment(commentPath, options); | 
						|
 | 
						|
  if (!contents) { | 
						|
    return ""; | 
						|
  } | 
						|
 | 
						|
  var isBlock = options.printer.isBlockComment && options.printer.isBlockComment(comment); // We don't want the line to break | 
						|
  // when the parentParentNode is a ClassDeclaration/-Expression | 
						|
  // And the parentNode is in the superClass property | 
						|
 | 
						|
  var parentNode = commentPath.getNode(1); | 
						|
  var parentParentNode = commentPath.getNode(2); | 
						|
  var isParentSuperClass = parentParentNode && (parentParentNode.type === "ClassDeclaration" || parentParentNode.type === "ClassExpression") && parentParentNode.superClass === parentNode; | 
						|
 | 
						|
  if (hasNewline$1(options.originalText, options.locStart(comment), { | 
						|
    backwards: true | 
						|
  })) { | 
						|
    // This allows comments at the end of nested structures: | 
						|
    // { | 
						|
    //   x: 1, | 
						|
    //   y: 2 | 
						|
    //   // A comment | 
						|
    // } | 
						|
    // Those kinds of comments are almost always leading comments, but | 
						|
    // here it doesn't go "outside" the block and turns it into a | 
						|
    // trailing comment for `2`. We can simulate the above by checking | 
						|
    // if this a comment on its own line; normal trailing comments are | 
						|
    // always at the end of another expression. | 
						|
    var isLineBeforeEmpty = isPreviousLineEmpty$2(options.originalText, comment, options.locStart); | 
						|
    return lineSuffix$1(concat$2([hardline$1, isLineBeforeEmpty ? hardline$1 : "", contents])); | 
						|
  } else if (isBlock || isParentSuperClass) { | 
						|
    // Trailing block comments never need a newline | 
						|
    return concat$2([" ", contents]); | 
						|
  } | 
						|
 | 
						|
  return concat$2([lineSuffix$1(concat$2([" ", contents])), !isBlock ? breakParent$1 : ""]); | 
						|
} | 
						|
 | 
						|
function printDanglingComments(path, options, sameIndent, filter) { | 
						|
  var parts = []; | 
						|
  var node = path.getValue(); | 
						|
 | 
						|
  if (!node || !node.comments) { | 
						|
    return ""; | 
						|
  } | 
						|
 | 
						|
  path.each(function (commentPath) { | 
						|
    var comment = commentPath.getValue(); | 
						|
 | 
						|
    if (comment && !comment.leading && !comment.trailing && (!filter || filter(comment))) { | 
						|
      parts.push(printComment(commentPath, options)); | 
						|
    } | 
						|
  }, "comments"); | 
						|
 | 
						|
  if (parts.length === 0) { | 
						|
    return ""; | 
						|
  } | 
						|
 | 
						|
  if (sameIndent) { | 
						|
    return join$1(hardline$1, parts); | 
						|
  } | 
						|
 | 
						|
  return indent$1(concat$2([hardline$1, join$1(hardline$1, parts)])); | 
						|
} | 
						|
 | 
						|
function prependCursorPlaceholder(path, options, printed) { | 
						|
  if (path.getNode() === options.cursorNode && path.getValue()) { | 
						|
    return concat$2([cursor$2, printed, cursor$2]); | 
						|
  } | 
						|
 | 
						|
  return printed; | 
						|
} | 
						|
 | 
						|
function printComments(path, print, options, needsSemi) { | 
						|
  var value = path.getValue(); | 
						|
  var printed = print(path); | 
						|
  var comments = value && value.comments; | 
						|
 | 
						|
  if (!comments || comments.length === 0) { | 
						|
    return prependCursorPlaceholder(path, options, printed); | 
						|
  } | 
						|
 | 
						|
  var leadingParts = []; | 
						|
  var trailingParts = [needsSemi ? ";" : "", printed]; | 
						|
  path.each(function (commentPath) { | 
						|
    var comment = commentPath.getValue(); | 
						|
    var leading = comment.leading, | 
						|
        trailing = comment.trailing; | 
						|
 | 
						|
    if (leading) { | 
						|
      var contents = printLeadingComment(commentPath, print, options); | 
						|
 | 
						|
      if (!contents) { | 
						|
        return; | 
						|
      } | 
						|
 | 
						|
      leadingParts.push(contents); | 
						|
      var text = options.originalText; | 
						|
      var index = skipNewline$1(text, options.locEnd(comment)); | 
						|
 | 
						|
      if (index !== false && hasNewline$1(text, index)) { | 
						|
        leadingParts.push(hardline$1); | 
						|
      } | 
						|
    } else if (trailing) { | 
						|
      trailingParts.push(printTrailingComment(commentPath, print, options)); | 
						|
    } | 
						|
  }, "comments"); | 
						|
  return prependCursorPlaceholder(path, options, concat$2(leadingParts.concat(trailingParts))); | 
						|
} | 
						|
 | 
						|
var comments = { | 
						|
  attach, | 
						|
  printComments, | 
						|
  printDanglingComments, | 
						|
  getSortedChildNodes | 
						|
}; | 
						|
 | 
						|
function FastPath(value) { | 
						|
  assert$1.ok(this instanceof FastPath); | 
						|
  this.stack = [value]; | 
						|
} // The name of the current property is always the penultimate element of | 
						|
// this.stack, and always a String. | 
						|
 | 
						|
 | 
						|
FastPath.prototype.getName = function getName() { | 
						|
  var s = this.stack; | 
						|
  var len = s.length; | 
						|
 | 
						|
  if (len > 1) { | 
						|
    return s[len - 2]; | 
						|
  } // Since the name is always a string, null is a safe sentinel value to | 
						|
  // return if we do not know the name of the (root) value. | 
						|
 | 
						|
  /* istanbul ignore next */ | 
						|
 | 
						|
 | 
						|
  return null; | 
						|
}; // The value of the current property is always the final element of | 
						|
// this.stack. | 
						|
 | 
						|
 | 
						|
FastPath.prototype.getValue = function getValue() { | 
						|
  var s = this.stack; | 
						|
  return s[s.length - 1]; | 
						|
}; | 
						|
 | 
						|
function getNodeHelper(path, count) { | 
						|
  var stackIndex = getNodeStackIndexHelper(path.stack, count); | 
						|
  return stackIndex === -1 ? null : path.stack[stackIndex]; | 
						|
} | 
						|
 | 
						|
function getNodeStackIndexHelper(stack, count) { | 
						|
  for (var i = stack.length - 1; i >= 0; i -= 2) { | 
						|
    var value = stack[i]; | 
						|
 | 
						|
    if (value && !Array.isArray(value) && --count < 0) { | 
						|
      return i; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return -1; | 
						|
} | 
						|
 | 
						|
FastPath.prototype.getNode = function getNode(count) { | 
						|
  return getNodeHelper(this, ~~count); | 
						|
}; | 
						|
 | 
						|
FastPath.prototype.getParentNode = function getParentNode(count) { | 
						|
  return getNodeHelper(this, ~~count + 1); | 
						|
}; // Temporarily push properties named by string arguments given after the | 
						|
// callback function onto this.stack, then call the callback with a | 
						|
// reference to this (modified) FastPath object. Note that the stack will | 
						|
// be restored to its original state after the callback is finished, so it | 
						|
// is probably a mistake to retain a reference to the path. | 
						|
 | 
						|
 | 
						|
FastPath.prototype.call = function call(callback | 
						|
/*, name1, name2, ... */ | 
						|
) { | 
						|
  var s = this.stack; | 
						|
  var origLen = s.length; | 
						|
  var value = s[origLen - 1]; | 
						|
  var argc = arguments.length; | 
						|
 | 
						|
  for (var i = 1; i < argc; ++i) { | 
						|
    var name = arguments[i]; | 
						|
    value = value[name]; | 
						|
    s.push(name, value); | 
						|
  } | 
						|
 | 
						|
  var result = callback(this); | 
						|
  s.length = origLen; | 
						|
  return result; | 
						|
}; | 
						|
 | 
						|
FastPath.prototype.callParent = function callParent(callback, count) { | 
						|
  var stackIndex = getNodeStackIndexHelper(this.stack, ~~count + 1); | 
						|
  var parentValues = this.stack.splice(stackIndex + 1); | 
						|
  var result = callback(this); | 
						|
  Array.prototype.push.apply(this.stack, parentValues); | 
						|
  return result; | 
						|
}; // Similar to FastPath.prototype.call, except that the value obtained by | 
						|
// accessing this.getValue()[name1][name2]... should be array-like. The | 
						|
// callback will be called with a reference to this path object for each | 
						|
// element of the array. | 
						|
 | 
						|
 | 
						|
FastPath.prototype.each = function each(callback | 
						|
/*, name1, name2, ... */ | 
						|
) { | 
						|
  var s = this.stack; | 
						|
  var origLen = s.length; | 
						|
  var value = s[origLen - 1]; | 
						|
  var argc = arguments.length; | 
						|
 | 
						|
  for (var i = 1; i < argc; ++i) { | 
						|
    var name = arguments[i]; | 
						|
    value = value[name]; | 
						|
    s.push(name, value); | 
						|
  } | 
						|
 | 
						|
  for (var _i = 0; _i < value.length; ++_i) { | 
						|
    if (_i in value) { | 
						|
      s.push(_i, value[_i]); // If the callback needs to know the value of i, call | 
						|
      // path.getName(), assuming path is the parameter name. | 
						|
 | 
						|
      callback(this); | 
						|
      s.length -= 2; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  s.length = origLen; | 
						|
}; // Similar to FastPath.prototype.each, except that the results of the | 
						|
// callback function invocations are stored in an array and returned at | 
						|
// the end of the iteration. | 
						|
 | 
						|
 | 
						|
FastPath.prototype.map = function map(callback | 
						|
/*, name1, name2, ... */ | 
						|
) { | 
						|
  var s = this.stack; | 
						|
  var origLen = s.length; | 
						|
  var value = s[origLen - 1]; | 
						|
  var argc = arguments.length; | 
						|
 | 
						|
  for (var i = 1; i < argc; ++i) { | 
						|
    var name = arguments[i]; | 
						|
    value = value[name]; | 
						|
    s.push(name, value); | 
						|
  } | 
						|
 | 
						|
  var result = new Array(value.length); | 
						|
 | 
						|
  for (var _i2 = 0; _i2 < value.length; ++_i2) { | 
						|
    if (_i2 in value) { | 
						|
      s.push(_i2, value[_i2]); | 
						|
      result[_i2] = callback(this, _i2); | 
						|
      s.length -= 2; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  s.length = origLen; | 
						|
  return result; | 
						|
}; | 
						|
 | 
						|
var fastPath = FastPath; | 
						|
 | 
						|
var normalize$2 = options$1.normalize; | 
						|
 | 
						|
function printSubtree(path, print, options, printAstToDoc) { | 
						|
  if (options.printer.embed) { | 
						|
    return options.printer.embed(path, print, function (text, partialNextOptions) { | 
						|
      return textToDoc(text, partialNextOptions, options, printAstToDoc); | 
						|
    }, options); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function textToDoc(text, partialNextOptions, parentOptions, printAstToDoc) { | 
						|
  var nextOptions = normalize$2(Object.assign({}, parentOptions, partialNextOptions, { | 
						|
    parentParser: parentOptions.parser, | 
						|
    embeddedInHtml: !!(parentOptions.embeddedInHtml || parentOptions.parser === "html" || parentOptions.parser === "vue" || parentOptions.parser === "angular" || parentOptions.parser === "lwc"), | 
						|
    originalText: text | 
						|
  }), { | 
						|
    passThrough: true | 
						|
  }); | 
						|
  var result = parser.parse(text, nextOptions); | 
						|
  var ast = result.ast; | 
						|
  text = result.text; | 
						|
  var astComments = ast.comments; | 
						|
  delete ast.comments; | 
						|
  comments.attach(astComments, ast, text, nextOptions); | 
						|
  return printAstToDoc(ast, nextOptions); | 
						|
} | 
						|
 | 
						|
var multiparser = { | 
						|
  printSubtree | 
						|
}; | 
						|
 | 
						|
var doc$1 = doc; | 
						|
var docBuilders$1 = doc$1.builders; | 
						|
var concat$3 = docBuilders$1.concat; | 
						|
var hardline$2 = docBuilders$1.hardline; | 
						|
var addAlignmentToDoc$1 = docBuilders$1.addAlignmentToDoc; | 
						|
var docUtils$1 = doc$1.utils; | 
						|
/** | 
						|
 * Takes an abstract syntax tree (AST) and recursively converts it to a | 
						|
 * document (series of printing primitives). | 
						|
 * | 
						|
 * This is done by descending down the AST recursively. The recursion | 
						|
 * involves two functions that call each other: | 
						|
 * | 
						|
 * 1. printGenerically(), which is defined as an inner function here. | 
						|
 *    It basically takes care of node caching. | 
						|
 * 2. callPluginPrintFunction(), which checks for some options, and | 
						|
 *    ultimately calls the print() function provided by the plugin. | 
						|
 * | 
						|
 * The plugin function will call printGenerically() again for child nodes | 
						|
 * of the current node, which will do its housekeeping, then call the | 
						|
 * plugin function again, and so on. | 
						|
 * | 
						|
 * All the while, these functions pass a "path" variable around, which | 
						|
 * is a stack-like data structure (FastPath) that maintains the current | 
						|
 * state of the recursion. It is called "path", because it represents | 
						|
 * the path to the current node through the Abstract Syntax Tree. | 
						|
 */ | 
						|
 | 
						|
function printAstToDoc(ast, options) { | 
						|
  var alignmentSize = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; | 
						|
  var printer = options.printer; | 
						|
 | 
						|
  if (printer.preprocess) { | 
						|
    ast = printer.preprocess(ast, options); | 
						|
  } | 
						|
 | 
						|
  var cache = new Map(); | 
						|
 | 
						|
  function printGenerically(path, args) { | 
						|
    var node = path.getValue(); | 
						|
    var shouldCache = node && typeof node === "object" && args === undefined; | 
						|
 | 
						|
    if (shouldCache && cache.has(node)) { | 
						|
      return cache.get(node); | 
						|
    } // We let JSXElement print its comments itself because it adds () around | 
						|
    // UnionTypeAnnotation has to align the child without the comments | 
						|
 | 
						|
 | 
						|
    var res; | 
						|
 | 
						|
    if (printer.willPrintOwnComments && printer.willPrintOwnComments(path, options)) { | 
						|
      res = callPluginPrintFunction(path, options, printGenerically, args); | 
						|
    } else { | 
						|
      // printComments will call the plugin print function and check for | 
						|
      // comments to print | 
						|
      res = comments.printComments(path, function (p) { | 
						|
        return callPluginPrintFunction(p, options, printGenerically, args); | 
						|
      }, options, args && args.needsSemi); | 
						|
    } | 
						|
 | 
						|
    if (shouldCache) { | 
						|
      cache.set(node, res); | 
						|
    } | 
						|
 | 
						|
    return res; | 
						|
  } | 
						|
 | 
						|
  var doc = printGenerically(new fastPath(ast)); | 
						|
 | 
						|
  if (alignmentSize > 0) { | 
						|
    // Add a hardline to make the indents take effect | 
						|
    // It should be removed in index.js format() | 
						|
    doc = addAlignmentToDoc$1(concat$3([hardline$2, doc]), alignmentSize, options.tabWidth); | 
						|
  } | 
						|
 | 
						|
  docUtils$1.propagateBreaks(doc); | 
						|
  return doc; | 
						|
} | 
						|
 | 
						|
function callPluginPrintFunction(path, options, printPath, args) { | 
						|
  assert$1.ok(path instanceof fastPath); | 
						|
  var node = path.getValue(); | 
						|
  var printer = options.printer; // Escape hatch | 
						|
 | 
						|
  if (printer.hasPrettierIgnore && printer.hasPrettierIgnore(path)) { | 
						|
    return options.originalText.slice(options.locStart(node), options.locEnd(node)); | 
						|
  } | 
						|
 | 
						|
  if (node) { | 
						|
    try { | 
						|
      // Potentially switch to a different parser | 
						|
      var sub = multiparser.printSubtree(path, printPath, options, printAstToDoc); | 
						|
 | 
						|
      if (sub) { | 
						|
        return sub; | 
						|
      } | 
						|
    } catch (error) { | 
						|
      /* istanbul ignore if */ | 
						|
      if (process.env.PRETTIER_DEBUG) { | 
						|
        throw error; | 
						|
      } // Continue with current parser | 
						|
 | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return printer.print(path, options, printPath, args); | 
						|
} | 
						|
 | 
						|
var astToDoc = printAstToDoc; | 
						|
 | 
						|
function findSiblingAncestors(startNodeAndParents, endNodeAndParents, opts) { | 
						|
  var resultStartNode = startNodeAndParents.node; | 
						|
  var resultEndNode = endNodeAndParents.node; | 
						|
 | 
						|
  if (resultStartNode === resultEndNode) { | 
						|
    return { | 
						|
      startNode: resultStartNode, | 
						|
      endNode: resultEndNode | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  var _iteratorNormalCompletion = true; | 
						|
  var _didIteratorError = false; | 
						|
  var _iteratorError = undefined; | 
						|
 | 
						|
  try { | 
						|
    for (var _iterator = endNodeAndParents.parentNodes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | 
						|
      var endParent = _step.value; | 
						|
 | 
						|
      if (endParent.type !== "Program" && endParent.type !== "File" && opts.locStart(endParent) >= opts.locStart(startNodeAndParents.node)) { | 
						|
        resultEndNode = endParent; | 
						|
      } else { | 
						|
        break; | 
						|
      } | 
						|
    } | 
						|
  } catch (err) { | 
						|
    _didIteratorError = true; | 
						|
    _iteratorError = err; | 
						|
  } finally { | 
						|
    try { | 
						|
      if (!_iteratorNormalCompletion && _iterator.return != null) { | 
						|
        _iterator.return(); | 
						|
      } | 
						|
    } finally { | 
						|
      if (_didIteratorError) { | 
						|
        throw _iteratorError; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  var _iteratorNormalCompletion2 = true; | 
						|
  var _didIteratorError2 = false; | 
						|
  var _iteratorError2 = undefined; | 
						|
 | 
						|
  try { | 
						|
    for (var _iterator2 = startNodeAndParents.parentNodes[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { | 
						|
      var startParent = _step2.value; | 
						|
 | 
						|
      if (startParent.type !== "Program" && startParent.type !== "File" && opts.locEnd(startParent) <= opts.locEnd(endNodeAndParents.node)) { | 
						|
        resultStartNode = startParent; | 
						|
      } else { | 
						|
        break; | 
						|
      } | 
						|
    } | 
						|
  } catch (err) { | 
						|
    _didIteratorError2 = true; | 
						|
    _iteratorError2 = err; | 
						|
  } finally { | 
						|
    try { | 
						|
      if (!_iteratorNormalCompletion2 && _iterator2.return != null) { | 
						|
        _iterator2.return(); | 
						|
      } | 
						|
    } finally { | 
						|
      if (_didIteratorError2) { | 
						|
        throw _iteratorError2; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return { | 
						|
    startNode: resultStartNode, | 
						|
    endNode: resultEndNode | 
						|
  }; | 
						|
} | 
						|
 | 
						|
function findNodeAtOffset(node, offset, options, predicate, parentNodes) { | 
						|
  predicate = predicate || function () { | 
						|
    return true; | 
						|
  }; | 
						|
 | 
						|
  parentNodes = parentNodes || []; | 
						|
  var start = options.locStart(node, options.locStart); | 
						|
  var end = options.locEnd(node, options.locEnd); | 
						|
 | 
						|
  if (start <= offset && offset <= end) { | 
						|
    var _iteratorNormalCompletion3 = true; | 
						|
    var _didIteratorError3 = false; | 
						|
    var _iteratorError3 = undefined; | 
						|
 | 
						|
    try { | 
						|
      for (var _iterator3 = comments.getSortedChildNodes(node, options)[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { | 
						|
        var childNode = _step3.value; | 
						|
        var childResult = findNodeAtOffset(childNode, offset, options, predicate, [node].concat(parentNodes)); | 
						|
 | 
						|
        if (childResult) { | 
						|
          return childResult; | 
						|
        } | 
						|
      } | 
						|
    } catch (err) { | 
						|
      _didIteratorError3 = true; | 
						|
      _iteratorError3 = err; | 
						|
    } finally { | 
						|
      try { | 
						|
        if (!_iteratorNormalCompletion3 && _iterator3.return != null) { | 
						|
          _iterator3.return(); | 
						|
        } | 
						|
      } finally { | 
						|
        if (_didIteratorError3) { | 
						|
          throw _iteratorError3; | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    if (predicate(node)) { | 
						|
      return { | 
						|
        node: node, | 
						|
        parentNodes: parentNodes | 
						|
      }; | 
						|
    } | 
						|
  } | 
						|
} // See https://www.ecma-international.org/ecma-262/5.1/#sec-A.5 | 
						|
 | 
						|
 | 
						|
function isSourceElement(opts, node) { | 
						|
  if (node == null) { | 
						|
    return false; | 
						|
  } // JS and JS like to avoid repetitions | 
						|
 | 
						|
 | 
						|
  var jsSourceElements = ["FunctionDeclaration", "BlockStatement", "BreakStatement", "ContinueStatement", "DebuggerStatement", "DoWhileStatement", "EmptyStatement", "ExpressionStatement", "ForInStatement", "ForStatement", "IfStatement", "LabeledStatement", "ReturnStatement", "SwitchStatement", "ThrowStatement", "TryStatement", "VariableDeclaration", "WhileStatement", "WithStatement", "ClassDeclaration", // ES 2015 | 
						|
  "ImportDeclaration", // Module | 
						|
  "ExportDefaultDeclaration", // Module | 
						|
  "ExportNamedDeclaration", // Module | 
						|
  "ExportAllDeclaration", // Module | 
						|
  "TypeAlias", // Flow | 
						|
  "InterfaceDeclaration", // Flow, TypeScript | 
						|
  "TypeAliasDeclaration", // TypeScript | 
						|
  "ExportAssignment", // TypeScript | 
						|
  "ExportDeclaration" // TypeScript | 
						|
  ]; | 
						|
  var jsonSourceElements = ["ObjectExpression", "ArrayExpression", "StringLiteral", "NumericLiteral", "BooleanLiteral", "NullLiteral"]; | 
						|
  var graphqlSourceElements = ["OperationDefinition", "FragmentDefinition", "VariableDefinition", "TypeExtensionDefinition", "ObjectTypeDefinition", "FieldDefinition", "DirectiveDefinition", "EnumTypeDefinition", "EnumValueDefinition", "InputValueDefinition", "InputObjectTypeDefinition", "SchemaDefinition", "OperationTypeDefinition", "InterfaceTypeDefinition", "UnionTypeDefinition", "ScalarTypeDefinition"]; | 
						|
 | 
						|
  switch (opts.parser) { | 
						|
    case "flow": | 
						|
    case "babel": | 
						|
    case "typescript": | 
						|
      return jsSourceElements.indexOf(node.type) > -1; | 
						|
 | 
						|
    case "json": | 
						|
      return jsonSourceElements.indexOf(node.type) > -1; | 
						|
 | 
						|
    case "graphql": | 
						|
      return graphqlSourceElements.indexOf(node.kind) > -1; | 
						|
 | 
						|
    case "vue": | 
						|
      return node.tag !== "root"; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function calculateRange(text, opts, ast) { | 
						|
  // Contract the range so that it has non-whitespace characters at its endpoints. | 
						|
  // This ensures we can format a range that doesn't end on a node. | 
						|
  var rangeStringOrig = text.slice(opts.rangeStart, opts.rangeEnd); | 
						|
  var startNonWhitespace = Math.max(opts.rangeStart + rangeStringOrig.search(/\S/), opts.rangeStart); | 
						|
  var endNonWhitespace; | 
						|
 | 
						|
  for (endNonWhitespace = opts.rangeEnd; endNonWhitespace > opts.rangeStart; --endNonWhitespace) { | 
						|
    if (text[endNonWhitespace - 1].match(/\S/)) { | 
						|
      break; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  var startNodeAndParents = findNodeAtOffset(ast, startNonWhitespace, opts, function (node) { | 
						|
    return isSourceElement(opts, node); | 
						|
  }); | 
						|
  var endNodeAndParents = findNodeAtOffset(ast, endNonWhitespace, opts, function (node) { | 
						|
    return isSourceElement(opts, node); | 
						|
  }); | 
						|
 | 
						|
  if (!startNodeAndParents || !endNodeAndParents) { | 
						|
    return { | 
						|
      rangeStart: 0, | 
						|
      rangeEnd: 0 | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  var siblingAncestors = findSiblingAncestors(startNodeAndParents, endNodeAndParents, opts); | 
						|
  var startNode = siblingAncestors.startNode, | 
						|
      endNode = siblingAncestors.endNode; | 
						|
  var rangeStart = Math.min(opts.locStart(startNode, opts.locStart), opts.locStart(endNode, opts.locStart)); | 
						|
  var rangeEnd = Math.max(opts.locEnd(startNode, opts.locEnd), opts.locEnd(endNode, opts.locEnd)); | 
						|
  return { | 
						|
    rangeStart: rangeStart, | 
						|
    rangeEnd: rangeEnd | 
						|
  }; | 
						|
} | 
						|
 | 
						|
var rangeUtil = { | 
						|
  calculateRange, | 
						|
  findNodeAtOffset | 
						|
}; | 
						|
 | 
						|
var normalizeOptions$1 = options$1.normalize; | 
						|
var guessEndOfLine$1 = endOfLine.guessEndOfLine, | 
						|
    convertEndOfLineToChars$2 = endOfLine.convertEndOfLineToChars; | 
						|
var mapDoc$2 = doc.utils.mapDoc, | 
						|
    printDocToString$1 = doc.printer.printDocToString, | 
						|
    printDocToDebug = doc.debug.printDocToDebug; | 
						|
var UTF8BOM = 0xfeff; | 
						|
var CURSOR = Symbol("cursor"); | 
						|
var PLACEHOLDERS = { | 
						|
  cursorOffset: "<<<PRETTIER_CURSOR>>>", | 
						|
  rangeStart: "<<<PRETTIER_RANGE_START>>>", | 
						|
  rangeEnd: "<<<PRETTIER_RANGE_END>>>" | 
						|
}; | 
						|
 | 
						|
function ensureAllCommentsPrinted(astComments) { | 
						|
  if (!astComments) { | 
						|
    return; | 
						|
  } | 
						|
 | 
						|
  for (var i = 0; i < astComments.length; ++i) { | 
						|
    if (astComments[i].value.trim() === "prettier-ignore") { | 
						|
      // If there's a prettier-ignore, we're not printing that sub-tree so we | 
						|
      // don't know if the comments was printed or not. | 
						|
      return; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  astComments.forEach(function (comment) { | 
						|
    if (!comment.printed) { | 
						|
      throw new Error('Comment "' + comment.value.trim() + '" was not printed. Please report this error!'); | 
						|
    } | 
						|
 | 
						|
    delete comment.printed; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function attachComments(text, ast, opts) { | 
						|
  var astComments = ast.comments; | 
						|
 | 
						|
  if (astComments) { | 
						|
    delete ast.comments; | 
						|
    comments.attach(astComments, ast, text, opts); | 
						|
  } | 
						|
 | 
						|
  ast.tokens = []; | 
						|
  opts.originalText = opts.parser === "yaml" ? text : text.trimRight(); | 
						|
  return astComments; | 
						|
} | 
						|
 | 
						|
function coreFormat(text, opts, addAlignmentSize) { | 
						|
  if (!text || !text.trim().length) { | 
						|
    return { | 
						|
      formatted: "", | 
						|
      cursorOffset: 0 | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  addAlignmentSize = addAlignmentSize || 0; | 
						|
  var parsed = parser.parse(text, opts); | 
						|
  var ast = parsed.ast; | 
						|
  text = parsed.text; | 
						|
 | 
						|
  if (opts.cursorOffset >= 0) { | 
						|
    var nodeResult = rangeUtil.findNodeAtOffset(ast, opts.cursorOffset, opts); | 
						|
 | 
						|
    if (nodeResult && nodeResult.node) { | 
						|
      opts.cursorNode = nodeResult.node; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  var astComments = attachComments(text, ast, opts); | 
						|
  var doc = astToDoc(ast, opts, addAlignmentSize); | 
						|
  var eol = convertEndOfLineToChars$2(opts.endOfLine); | 
						|
  var result = printDocToString$1(opts.endOfLine === "lf" ? doc : mapDoc$2(doc, function (currentDoc) { | 
						|
    return typeof currentDoc === "string" && currentDoc.indexOf("\n") !== -1 ? currentDoc.replace(/\n/g, eol) : currentDoc; | 
						|
  }), opts); | 
						|
  ensureAllCommentsPrinted(astComments); // Remove extra leading indentation as well as the added indentation after last newline | 
						|
 | 
						|
  if (addAlignmentSize > 0) { | 
						|
    var trimmed = result.formatted.trim(); | 
						|
 | 
						|
    if (result.cursorNodeStart !== undefined) { | 
						|
      result.cursorNodeStart -= result.formatted.indexOf(trimmed); | 
						|
    } | 
						|
 | 
						|
    result.formatted = trimmed + convertEndOfLineToChars$2(opts.endOfLine); | 
						|
  } | 
						|
 | 
						|
  if (opts.cursorOffset >= 0) { | 
						|
    var oldCursorNodeStart; | 
						|
    var oldCursorNodeText; | 
						|
    var cursorOffsetRelativeToOldCursorNode; | 
						|
    var newCursorNodeStart; | 
						|
    var newCursorNodeText; | 
						|
 | 
						|
    if (opts.cursorNode && result.cursorNodeText) { | 
						|
      oldCursorNodeStart = opts.locStart(opts.cursorNode); | 
						|
      oldCursorNodeText = text.slice(oldCursorNodeStart, opts.locEnd(opts.cursorNode)); | 
						|
      cursorOffsetRelativeToOldCursorNode = opts.cursorOffset - oldCursorNodeStart; | 
						|
      newCursorNodeStart = result.cursorNodeStart; | 
						|
      newCursorNodeText = result.cursorNodeText; | 
						|
    } else { | 
						|
      oldCursorNodeStart = 0; | 
						|
      oldCursorNodeText = text; | 
						|
      cursorOffsetRelativeToOldCursorNode = opts.cursorOffset; | 
						|
      newCursorNodeStart = 0; | 
						|
      newCursorNodeText = result.formatted; | 
						|
    } | 
						|
 | 
						|
    if (oldCursorNodeText === newCursorNodeText) { | 
						|
      return { | 
						|
        formatted: result.formatted, | 
						|
        cursorOffset: newCursorNodeStart + cursorOffsetRelativeToOldCursorNode | 
						|
      }; | 
						|
    } // diff old and new cursor node texts, with a special cursor | 
						|
    // symbol inserted to find out where it moves to | 
						|
 | 
						|
 | 
						|
    var oldCursorNodeCharArray = oldCursorNodeText.split(""); | 
						|
    oldCursorNodeCharArray.splice(cursorOffsetRelativeToOldCursorNode, 0, CURSOR); | 
						|
    var newCursorNodeCharArray = newCursorNodeText.split(""); | 
						|
    var cursorNodeDiff = index_es6.diffArrays(oldCursorNodeCharArray, newCursorNodeCharArray); | 
						|
    var cursorOffset = newCursorNodeStart; | 
						|
    var _iteratorNormalCompletion = true; | 
						|
    var _didIteratorError = false; | 
						|
    var _iteratorError = undefined; | 
						|
 | 
						|
    try { | 
						|
      for (var _iterator = cursorNodeDiff[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | 
						|
        var entry = _step.value; | 
						|
 | 
						|
        if (entry.removed) { | 
						|
          if (entry.value.indexOf(CURSOR) > -1) { | 
						|
            break; | 
						|
          } | 
						|
        } else { | 
						|
          cursorOffset += entry.count; | 
						|
        } | 
						|
      } | 
						|
    } catch (err) { | 
						|
      _didIteratorError = true; | 
						|
      _iteratorError = err; | 
						|
    } finally { | 
						|
      try { | 
						|
        if (!_iteratorNormalCompletion && _iterator.return != null) { | 
						|
          _iterator.return(); | 
						|
        } | 
						|
      } finally { | 
						|
        if (_didIteratorError) { | 
						|
          throw _iteratorError; | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return { | 
						|
      formatted: result.formatted, | 
						|
      cursorOffset | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  return { | 
						|
    formatted: result.formatted | 
						|
  }; | 
						|
} | 
						|
 | 
						|
function formatRange(text, opts) { | 
						|
  var parsed = parser.parse(text, opts); | 
						|
  var ast = parsed.ast; | 
						|
  text = parsed.text; | 
						|
  var range = rangeUtil.calculateRange(text, opts, ast); | 
						|
  var rangeStart = range.rangeStart; | 
						|
  var rangeEnd = range.rangeEnd; | 
						|
  var rangeString = text.slice(rangeStart, rangeEnd); // Try to extend the range backwards to the beginning of the line. | 
						|
  // This is so we can detect indentation correctly and restore it. | 
						|
  // Use `Math.min` since `lastIndexOf` returns 0 when `rangeStart` is 0 | 
						|
 | 
						|
  var rangeStart2 = Math.min(rangeStart, text.lastIndexOf("\n", rangeStart) + 1); | 
						|
  var indentString = text.slice(rangeStart2, rangeStart); | 
						|
  var alignmentSize = util.getAlignmentSize(indentString, opts.tabWidth); | 
						|
  var rangeResult = coreFormat(rangeString, Object.assign({}, opts, { | 
						|
    rangeStart: 0, | 
						|
    rangeEnd: Infinity, | 
						|
    // track the cursor offset only if it's within our range | 
						|
    cursorOffset: opts.cursorOffset >= rangeStart && opts.cursorOffset < rangeEnd ? opts.cursorOffset - rangeStart : -1 | 
						|
  }), alignmentSize); // Since the range contracts to avoid trailing whitespace, | 
						|
  // we need to remove the newline that was inserted by the `format` call. | 
						|
 | 
						|
  var rangeTrimmed = rangeResult.formatted.trimRight(); | 
						|
  var rangeLeft = text.slice(0, rangeStart); | 
						|
  var rangeRight = text.slice(rangeEnd); | 
						|
  var cursorOffset = opts.cursorOffset; | 
						|
 | 
						|
  if (opts.cursorOffset >= rangeEnd) { | 
						|
    // handle the case where the cursor was past the end of the range | 
						|
    cursorOffset = opts.cursorOffset - rangeEnd + (rangeStart + rangeTrimmed.length); | 
						|
  } else if (rangeResult.cursorOffset !== undefined) { | 
						|
    // handle the case where the cursor was in the range | 
						|
    cursorOffset = rangeResult.cursorOffset + rangeStart; | 
						|
  } // keep the cursor as it was if it was before the start of the range | 
						|
 | 
						|
 | 
						|
  var formatted; | 
						|
 | 
						|
  if (opts.endOfLine === "lf") { | 
						|
    formatted = rangeLeft + rangeTrimmed + rangeRight; | 
						|
  } else { | 
						|
    var eol = convertEndOfLineToChars$2(opts.endOfLine); | 
						|
 | 
						|
    if (cursorOffset >= 0) { | 
						|
      var parts = [rangeLeft, rangeTrimmed, rangeRight]; | 
						|
      var partIndex = 0; | 
						|
      var partOffset = cursorOffset; | 
						|
 | 
						|
      while (partIndex < parts.length) { | 
						|
        var part = parts[partIndex]; | 
						|
 | 
						|
        if (partOffset < part.length) { | 
						|
          parts[partIndex] = parts[partIndex].slice(0, partOffset) + PLACEHOLDERS.cursorOffset + parts[partIndex].slice(partOffset); | 
						|
          break; | 
						|
        } | 
						|
 | 
						|
        partIndex++; | 
						|
        partOffset -= part.length; | 
						|
      } | 
						|
 | 
						|
      var newRangeLeft = parts[0], | 
						|
          newRangeTrimmed = parts[1], | 
						|
          newRangeRight = parts[2]; | 
						|
      formatted = (newRangeLeft.replace(/\n/g, eol) + newRangeTrimmed + newRangeRight.replace(/\n/g, eol)).replace(PLACEHOLDERS.cursorOffset, function (_, index) { | 
						|
        cursorOffset = index; | 
						|
        return ""; | 
						|
      }); | 
						|
    } else { | 
						|
      formatted = rangeLeft.replace(/\n/g, eol) + rangeTrimmed + rangeRight.replace(/\n/g, eol); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return { | 
						|
    formatted, | 
						|
    cursorOffset | 
						|
  }; | 
						|
} | 
						|
 | 
						|
function format(text, opts) { | 
						|
  var selectedParser = parser.resolveParser(opts); | 
						|
  var hasPragma = !selectedParser.hasPragma || selectedParser.hasPragma(text); | 
						|
 | 
						|
  if (opts.requirePragma && !hasPragma) { | 
						|
    return { | 
						|
      formatted: text | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  if (opts.endOfLine === "auto") { | 
						|
    opts.endOfLine = guessEndOfLine$1(text); | 
						|
  } | 
						|
 | 
						|
  var hasCursor = opts.cursorOffset >= 0; | 
						|
  var hasRangeStart = opts.rangeStart > 0; | 
						|
  var hasRangeEnd = opts.rangeEnd < text.length; // get rid of CR/CRLF parsing | 
						|
 | 
						|
  if (text.indexOf("\r") !== -1) { | 
						|
    var offsetKeys = [hasCursor && "cursorOffset", hasRangeStart && "rangeStart", hasRangeEnd && "rangeEnd"].filter(Boolean).sort(function (aKey, bKey) { | 
						|
      return opts[aKey] - opts[bKey]; | 
						|
    }); | 
						|
 | 
						|
    for (var i = offsetKeys.length - 1; i >= 0; i--) { | 
						|
      var key = offsetKeys[i]; | 
						|
      text = text.slice(0, opts[key]) + PLACEHOLDERS[key] + text.slice(opts[key]); | 
						|
    } | 
						|
 | 
						|
    text = text.replace(/\r\n?/g, "\n"); | 
						|
 | 
						|
    var _loop = function _loop(_i) { | 
						|
      var key = offsetKeys[_i]; | 
						|
      text = text.replace(PLACEHOLDERS[key], function (_, index) { | 
						|
        opts[key] = index; | 
						|
        return ""; | 
						|
      }); | 
						|
    }; | 
						|
 | 
						|
    for (var _i = 0; _i < offsetKeys.length; _i++) { | 
						|
      _loop(_i); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  var hasUnicodeBOM = text.charCodeAt(0) === UTF8BOM; | 
						|
 | 
						|
  if (hasUnicodeBOM) { | 
						|
    text = text.substring(1); | 
						|
 | 
						|
    if (hasCursor) { | 
						|
      opts.cursorOffset++; | 
						|
    } | 
						|
 | 
						|
    if (hasRangeStart) { | 
						|
      opts.rangeStart++; | 
						|
    } | 
						|
 | 
						|
    if (hasRangeEnd) { | 
						|
      opts.rangeEnd++; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  if (!hasCursor) { | 
						|
    opts.cursorOffset = -1; | 
						|
  } | 
						|
 | 
						|
  if (opts.rangeStart < 0) { | 
						|
    opts.rangeStart = 0; | 
						|
  } | 
						|
 | 
						|
  if (opts.rangeEnd > text.length) { | 
						|
    opts.rangeEnd = text.length; | 
						|
  } | 
						|
 | 
						|
  var result = hasRangeStart || hasRangeEnd ? formatRange(text, opts) : coreFormat(opts.insertPragma && opts.printer.insertPragma && !hasPragma ? opts.printer.insertPragma(text) : text, opts); | 
						|
 | 
						|
  if (hasUnicodeBOM) { | 
						|
    result.formatted = String.fromCharCode(UTF8BOM) + result.formatted; | 
						|
 | 
						|
    if (hasCursor) { | 
						|
      result.cursorOffset++; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return result; | 
						|
} | 
						|
 | 
						|
var core = { | 
						|
  formatWithCursor(text, opts) { | 
						|
    opts = normalizeOptions$1(opts); | 
						|
    return format(text, opts); | 
						|
  }, | 
						|
 | 
						|
  parse(text, opts, massage) { | 
						|
    opts = normalizeOptions$1(opts); | 
						|
 | 
						|
    if (text.indexOf("\r") !== -1) { | 
						|
      text = text.replace(/\r\n?/g, "\n"); | 
						|
    } | 
						|
 | 
						|
    var parsed = parser.parse(text, opts); | 
						|
 | 
						|
    if (massage) { | 
						|
      parsed.ast = massageAst(parsed.ast, opts); | 
						|
    } | 
						|
 | 
						|
    return parsed; | 
						|
  }, | 
						|
 | 
						|
  formatAST(ast, opts) { | 
						|
    opts = normalizeOptions$1(opts); | 
						|
    var doc = astToDoc(ast, opts); | 
						|
    return printDocToString$1(doc, opts); | 
						|
  }, | 
						|
 | 
						|
  // Doesn't handle shebang for now | 
						|
  formatDoc(doc, opts) { | 
						|
    var debug = printDocToDebug(doc); | 
						|
    opts = normalizeOptions$1(Object.assign({}, opts, { | 
						|
      parser: "babel" | 
						|
    })); | 
						|
    return format(debug, opts).formatted; | 
						|
  }, | 
						|
 | 
						|
  printToDoc(text, opts) { | 
						|
    opts = normalizeOptions$1(opts); | 
						|
    var parsed = parser.parse(text, opts); | 
						|
    var ast = parsed.ast; | 
						|
    text = parsed.text; | 
						|
    attachComments(text, ast, opts); | 
						|
    return astToDoc(ast, opts); | 
						|
  }, | 
						|
 | 
						|
  printDocToString(doc, opts) { | 
						|
    return printDocToString$1(doc, normalizeOptions$1(opts)); | 
						|
  } | 
						|
 | 
						|
}; | 
						|
 | 
						|
// A simple implementation of make-array | 
						|
function make_array(subject) { | 
						|
  return Array.isArray(subject) ? subject : [subject]; | 
						|
} | 
						|
 | 
						|
var REGEX_BLANK_LINE = /^\s+$/; | 
						|
var REGEX_LEADING_EXCAPED_EXCLAMATION = /^\\!/; | 
						|
var REGEX_LEADING_EXCAPED_HASH = /^\\#/; | 
						|
var SLASH = '/'; | 
						|
var KEY_IGNORE = typeof Symbol !== 'undefined' ? Symbol.for('node-ignore') | 
						|
/* istanbul ignore next */ | 
						|
: 'node-ignore'; | 
						|
 | 
						|
var define = function define(object, key, value) { | 
						|
  return Object.defineProperty(object, key, { | 
						|
    value | 
						|
  }); | 
						|
}; | 
						|
 | 
						|
var REGEX_REGEXP_RANGE = /([0-z])-([0-z])/g; // Sanitize the range of a regular expression | 
						|
// The cases are complicated, see test cases for details | 
						|
 | 
						|
var sanitizeRange = function sanitizeRange(range) { | 
						|
  return range.replace(REGEX_REGEXP_RANGE, function (match, from, to) { | 
						|
    return from.charCodeAt(0) <= to.charCodeAt(0) ? match // Invalid range (out of order) which is ok for gitignore rules but | 
						|
    //   fatal for JavaScript regular expression, so eliminate it. | 
						|
    : ''; | 
						|
  }); | 
						|
}; // > If the pattern ends with a slash, | 
						|
// > it is removed for the purpose of the following description, | 
						|
// > but it would only find a match with a directory. | 
						|
// > In other words, foo/ will match a directory foo and paths underneath it, | 
						|
// > but will not match a regular file or a symbolic link foo | 
						|
// >  (this is consistent with the way how pathspec works in general in Git). | 
						|
// '`foo/`' will not match regular file '`foo`' or symbolic link '`foo`' | 
						|
// -> ignore-rules will not deal with it, because it costs extra `fs.stat` call | 
						|
//      you could use option `mark: true` with `glob` | 
						|
// '`foo/`' should not continue with the '`..`' | 
						|
 | 
						|
 | 
						|
var DEFAULT_REPLACER_PREFIX = [// > Trailing spaces are ignored unless they are quoted with backslash ("\") | 
						|
[// (a\ ) -> (a ) | 
						|
// (a  ) -> (a) | 
						|
// (a \ ) -> (a  ) | 
						|
/\\?\s+$/, function (match) { | 
						|
  return match.indexOf('\\') === 0 ? ' ' : ''; | 
						|
}], // replace (\ ) with ' ' | 
						|
[/\\\s/g, function () { | 
						|
  return ' '; | 
						|
}], // Escape metacharacters | 
						|
// which is written down by users but means special for regular expressions. | 
						|
// > There are 12 characters with special meanings: | 
						|
// > - the backslash \, | 
						|
// > - the caret ^, | 
						|
// > - the dollar sign $, | 
						|
// > - the period or dot ., | 
						|
// > - the vertical bar or pipe symbol |, | 
						|
// > - the question mark ?, | 
						|
// > - the asterisk or star *, | 
						|
// > - the plus sign +, | 
						|
// > - the opening parenthesis (, | 
						|
// > - the closing parenthesis ), | 
						|
// > - and the opening square bracket [, | 
						|
// > - the opening curly brace {, | 
						|
// > These special characters are often called "metacharacters". | 
						|
[/[\\^$.|*+(){]/g, function (match) { | 
						|
  return `\\${match}`; | 
						|
}], [// > [abc] matches any character inside the brackets | 
						|
// >    (in this case a, b, or c); | 
						|
/\[([^\]/]*)($|\])/g, function (match, p1, p2) { | 
						|
  return p2 === ']' ? `[${sanitizeRange(p1)}]` : `\\${match}`; | 
						|
}], [// > a question mark (?) matches a single character | 
						|
/(?!\\)\?/g, function () { | 
						|
  return '[^/]'; | 
						|
}], // leading slash | 
						|
[// > A leading slash matches the beginning of the pathname. | 
						|
// > For example, "/*.c" matches "cat-file.c" but not "mozilla-sha1/sha1.c". | 
						|
// A leading slash matches the beginning of the pathname | 
						|
/^\//, function () { | 
						|
  return '^'; | 
						|
}], // replace special metacharacter slash after the leading slash | 
						|
[/\//g, function () { | 
						|
  return '\\/'; | 
						|
}], [// > A leading "**" followed by a slash means match in all directories. | 
						|
// > For example, "**/foo" matches file or directory "foo" anywhere, | 
						|
// > the same as pattern "foo". | 
						|
// > "**/foo/bar" matches file or directory "bar" anywhere that is directly | 
						|
// >   under directory "foo". | 
						|
// Notice that the '*'s have been replaced as '\\*' | 
						|
/^\^*\\\*\\\*\\\//, // '**/foo' <-> 'foo' | 
						|
function () { | 
						|
  return '^(?:.*\\/)?'; | 
						|
}]]; | 
						|
var DEFAULT_REPLACER_SUFFIX = [// starting | 
						|
[// there will be no leading '/' | 
						|
//   (which has been replaced by section "leading slash") | 
						|
// If starts with '**', adding a '^' to the regular expression also works | 
						|
/^(?=[^^])/, function startingReplacer() { | 
						|
  return !/\/(?!$)/.test(this) // > If the pattern does not contain a slash /, | 
						|
  // >   Git treats it as a shell glob pattern | 
						|
  // Actually, if there is only a trailing slash, | 
						|
  //   git also treats it as a shell glob pattern | 
						|
  ? '(?:^|\\/)' // > Otherwise, Git treats the pattern as a shell glob suitable for | 
						|
  // >   consumption by fnmatch(3) | 
						|
  : '^'; | 
						|
}], // two globstars | 
						|
[// Use lookahead assertions so that we could match more than one `'/**'` | 
						|
/\\\/\\\*\\\*(?=\\\/|$)/g, // Zero, one or several directories | 
						|
// should not use '*', or it will be replaced by the next replacer | 
						|
// Check if it is not the last `'/**'` | 
						|
function (match, index, str) { | 
						|
  return index + 6 < str.length // case: /**/ | 
						|
  // > A slash followed by two consecutive asterisks then a slash matches | 
						|
  // >   zero or more directories. | 
						|
  // > For example, "a/**/b" matches "a/b", "a/x/b", "a/x/y/b" and so on. | 
						|
  // '/**/' | 
						|
  ? '(?:\\/[^\\/]+)*' // case: /** | 
						|
  // > A trailing `"/**"` matches everything inside. | 
						|
  // #21: everything inside but it should not include the current folder | 
						|
  : '\\/.+'; | 
						|
}], // intermediate wildcards | 
						|
[// Never replace escaped '*' | 
						|
// ignore rule '\*' will match the path '*' | 
						|
// 'abc.*/' -> go | 
						|
// 'abc.*'  -> skip this rule | 
						|
/(^|[^\\]+)\\\*(?=.+)/g, // '*.js' matches '.js' | 
						|
// '*.js' doesn't match 'abc' | 
						|
function (match, p1) { | 
						|
  return `${p1}[^\\/]*`; | 
						|
}], // trailing wildcard | 
						|
[/(\^|\\\/)?\\\*$/, function (match, p1) { | 
						|
  var prefix = p1 // '\^': | 
						|
  // '/*' does not match '' | 
						|
  // '/*' does not match everything | 
						|
  // '\\\/': | 
						|
  // 'abc/*' does not match 'abc/' | 
						|
  ? `${p1}[^/]+` // 'a*' matches 'a' | 
						|
  // 'a*' matches 'aa' | 
						|
  : '[^/]*'; | 
						|
  return `${prefix}(?=$|\\/$)`; | 
						|
}], [// unescape | 
						|
/\\\\\\/g, function () { | 
						|
  return '\\'; | 
						|
}]]; | 
						|
var POSITIVE_REPLACERS = [].concat(DEFAULT_REPLACER_PREFIX, [// 'f' | 
						|
// matches | 
						|
// - /f(end) | 
						|
// - /f/ | 
						|
// - (start)f(end) | 
						|
// - (start)f/ | 
						|
// doesn't match | 
						|
// - oof | 
						|
// - foo | 
						|
// pseudo: | 
						|
// -> (^|/)f(/|$) | 
						|
// ending | 
						|
[// 'js' will not match 'js.' | 
						|
// 'ab' will not match 'abc' | 
						|
/(?:[^*/])$/, // 'js*' will not match 'a.js' | 
						|
// 'js/' will not match 'a.js' | 
						|
// 'js' will match 'a.js' and 'a.js/' | 
						|
function (match) { | 
						|
  return `${match}(?=$|\\/)`; | 
						|
}]], DEFAULT_REPLACER_SUFFIX); | 
						|
var NEGATIVE_REPLACERS = [].concat(DEFAULT_REPLACER_PREFIX, [// #24, #38 | 
						|
// The MISSING rule of [gitignore docs](https://git-scm.com/docs/gitignore) | 
						|
// A negative pattern without a trailing wildcard should not | 
						|
// re-include the things inside that directory. | 
						|
// eg: | 
						|
// ['node_modules/*', '!node_modules'] | 
						|
// should ignore `node_modules/a.js` | 
						|
[/(?:[^*])$/, function (match) { | 
						|
  return `${match}(?=$|\\/$)`; | 
						|
}]], DEFAULT_REPLACER_SUFFIX); // A simple cache, because an ignore rule only has only one certain meaning | 
						|
 | 
						|
var cache = Object.create(null); // @param {pattern} | 
						|
 | 
						|
var make_regex = function make_regex(pattern, negative, ignorecase) { | 
						|
  var r = cache[pattern]; | 
						|
 | 
						|
  if (r) { | 
						|
    return r; | 
						|
  } | 
						|
 | 
						|
  var replacers = negative ? NEGATIVE_REPLACERS : POSITIVE_REPLACERS; | 
						|
  var source = replacers.reduce(function (prev, current) { | 
						|
    return prev.replace(current[0], current[1].bind(pattern)); | 
						|
  }, pattern); | 
						|
  return cache[pattern] = ignorecase ? new RegExp(source, 'i') : new RegExp(source); | 
						|
}; // > A blank line matches no files, so it can serve as a separator for readability. | 
						|
 | 
						|
 | 
						|
var checkPattern = function checkPattern(pattern) { | 
						|
  return pattern && typeof pattern === 'string' && !REGEX_BLANK_LINE.test(pattern) // > A line starting with # serves as a comment. | 
						|
  && pattern.indexOf('#') !== 0; | 
						|
}; | 
						|
 | 
						|
var createRule = function createRule(pattern, ignorecase) { | 
						|
  var origin = pattern; | 
						|
  var negative = false; // > An optional prefix "!" which negates the pattern; | 
						|
 | 
						|
  if (pattern.indexOf('!') === 0) { | 
						|
    negative = true; | 
						|
    pattern = pattern.substr(1); | 
						|
  } | 
						|
 | 
						|
  pattern = pattern // > Put a backslash ("\") in front of the first "!" for patterns that | 
						|
  // >   begin with a literal "!", for example, `"\!important!.txt"`. | 
						|
  .replace(REGEX_LEADING_EXCAPED_EXCLAMATION, '!') // > Put a backslash ("\") in front of the first hash for patterns that | 
						|
  // >   begin with a hash. | 
						|
  .replace(REGEX_LEADING_EXCAPED_HASH, '#'); | 
						|
  var regex = make_regex(pattern, negative, ignorecase); | 
						|
  return { | 
						|
    origin, | 
						|
    pattern, | 
						|
    negative, | 
						|
    regex | 
						|
  }; | 
						|
}; | 
						|
 | 
						|
var IgnoreBase = | 
						|
/*#__PURE__*/ | 
						|
function () { | 
						|
  function IgnoreBase() { | 
						|
    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, | 
						|
        _ref$ignorecase = _ref.ignorecase, | 
						|
        ignorecase = _ref$ignorecase === void 0 ? true : _ref$ignorecase; | 
						|
 | 
						|
    _classCallCheck(this, IgnoreBase); | 
						|
 | 
						|
    this._rules = []; | 
						|
    this._ignorecase = ignorecase; | 
						|
    define(this, KEY_IGNORE, true); | 
						|
 | 
						|
    this._initCache(); | 
						|
  } | 
						|
 | 
						|
  _createClass(IgnoreBase, [{ | 
						|
    key: "_initCache", | 
						|
    value: function _initCache() { | 
						|
      this._cache = Object.create(null); | 
						|
    } // @param {Array.<string>|string|Ignore} pattern | 
						|
 | 
						|
  }, { | 
						|
    key: "add", | 
						|
    value: function add(pattern) { | 
						|
      this._added = false; | 
						|
 | 
						|
      if (typeof pattern === 'string') { | 
						|
        pattern = pattern.split(/\r?\n/g); | 
						|
      } | 
						|
 | 
						|
      make_array(pattern).forEach(this._addPattern, this); // Some rules have just added to the ignore, | 
						|
      // making the behavior changed. | 
						|
 | 
						|
      if (this._added) { | 
						|
        this._initCache(); | 
						|
      } | 
						|
 | 
						|
      return this; | 
						|
    } // legacy | 
						|
 | 
						|
  }, { | 
						|
    key: "addPattern", | 
						|
    value: function addPattern(pattern) { | 
						|
      return this.add(pattern); | 
						|
    } | 
						|
  }, { | 
						|
    key: "_addPattern", | 
						|
    value: function _addPattern(pattern) { | 
						|
      // #32 | 
						|
      if (pattern && pattern[KEY_IGNORE]) { | 
						|
        this._rules = this._rules.concat(pattern._rules); | 
						|
        this._added = true; | 
						|
        return; | 
						|
      } | 
						|
 | 
						|
      if (checkPattern(pattern)) { | 
						|
        var rule = createRule(pattern, this._ignorecase); | 
						|
        this._added = true; | 
						|
 | 
						|
        this._rules.push(rule); | 
						|
      } | 
						|
    } | 
						|
  }, { | 
						|
    key: "filter", | 
						|
    value: function filter(paths) { | 
						|
      var _this = this; | 
						|
 | 
						|
      return make_array(paths).filter(function (path) { | 
						|
        return _this._filter(path); | 
						|
      }); | 
						|
    } | 
						|
  }, { | 
						|
    key: "createFilter", | 
						|
    value: function createFilter() { | 
						|
      var _this2 = this; | 
						|
 | 
						|
      return function (path) { | 
						|
        return _this2._filter(path); | 
						|
      }; | 
						|
    } | 
						|
  }, { | 
						|
    key: "ignores", | 
						|
    value: function ignores(path) { | 
						|
      return !this._filter(path); | 
						|
    } // @returns `Boolean` true if the `path` is NOT ignored | 
						|
 | 
						|
  }, { | 
						|
    key: "_filter", | 
						|
    value: function _filter(path, slices) { | 
						|
      if (!path) { | 
						|
        return false; | 
						|
      } | 
						|
 | 
						|
      if (path in this._cache) { | 
						|
        return this._cache[path]; | 
						|
      } | 
						|
 | 
						|
      if (!slices) { | 
						|
        // path/to/a.js | 
						|
        // ['path', 'to', 'a.js'] | 
						|
        slices = path.split(SLASH); | 
						|
      } | 
						|
 | 
						|
      slices.pop(); | 
						|
      return this._cache[path] = slices.length // > It is not possible to re-include a file if a parent directory of | 
						|
      // >   that file is excluded. | 
						|
      // If the path contains a parent directory, check the parent first | 
						|
      ? this._filter(slices.join(SLASH) + SLASH, slices) && this._test(path) // Or only test the path | 
						|
      : this._test(path); | 
						|
    } // @returns {Boolean} true if a file is NOT ignored | 
						|
 | 
						|
  }, { | 
						|
    key: "_test", | 
						|
    value: function _test(path) { | 
						|
      // Explicitly define variable type by setting matched to `0` | 
						|
      var matched = 0; | 
						|
 | 
						|
      this._rules.forEach(function (rule) { | 
						|
        // if matched = true, then we only test negative rules | 
						|
        // if matched = false, then we test non-negative rules | 
						|
        if (!(matched ^ rule.negative)) { | 
						|
          matched = rule.negative ^ rule.regex.test(path); | 
						|
        } | 
						|
      }); | 
						|
 | 
						|
      return !matched; | 
						|
    } | 
						|
  }]); | 
						|
 | 
						|
  return IgnoreBase; | 
						|
}(); // Windows | 
						|
// -------------------------------------------------------------- | 
						|
 | 
						|
/* istanbul ignore if  */ | 
						|
 | 
						|
 | 
						|
if ( // Detect `process` so that it can run in browsers. | 
						|
typeof process !== 'undefined' && (process.env && process.env.IGNORE_TEST_WIN32 || process.platform === 'win32')) { | 
						|
  var filter = IgnoreBase.prototype._filter; | 
						|
  /* eslint no-control-regex: "off" */ | 
						|
 | 
						|
  var make_posix = function make_posix(str) { | 
						|
    return /^\\\\\?\\/.test(str) || /[^\x00-\x80]+/.test(str) ? str : str.replace(/\\/g, '/'); | 
						|
  }; | 
						|
 | 
						|
  IgnoreBase.prototype._filter = function filterWin32(path, slices) { | 
						|
    path = make_posix(path); | 
						|
    return filter.call(this, path, slices); | 
						|
  }; | 
						|
} | 
						|
 | 
						|
var ignore = function ignore(options) { | 
						|
  return new IgnoreBase(options); | 
						|
}; | 
						|
 | 
						|
/** | 
						|
 * @param {string} filename | 
						|
 * @returns {Promise<null | string>} | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function getFileContentOrNull(filename) { | 
						|
  return new Promise(function (resolve, reject) { | 
						|
    fs$1.readFile(filename, "utf8", function (error, data) { | 
						|
      if (error && error.code !== "ENOENT") { | 
						|
        reject(createError(filename, error)); | 
						|
      } else { | 
						|
        resolve(error ? null : data); | 
						|
      } | 
						|
    }); | 
						|
  }); | 
						|
} | 
						|
/** | 
						|
 * @param {string} filename | 
						|
 * @returns {null | string} | 
						|
 */ | 
						|
 | 
						|
 | 
						|
getFileContentOrNull.sync = function (filename) { | 
						|
  try { | 
						|
    return fs$1.readFileSync(filename, "utf8"); | 
						|
  } catch (error) { | 
						|
    if (error && error.code === "ENOENT") { | 
						|
      return null; | 
						|
    } | 
						|
 | 
						|
    throw createError(filename, error); | 
						|
  } | 
						|
}; | 
						|
 | 
						|
function createError(filename, error) { | 
						|
  return new Error(`Unable to read ${filename}: ${error.message}`); | 
						|
} | 
						|
 | 
						|
var getFileContentOrNull_1 = getFileContentOrNull; | 
						|
 | 
						|
/** | 
						|
 * @param {undefined | string} ignorePath | 
						|
 * @param {undefined | boolean} withNodeModules | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function createIgnorer(ignorePath, withNodeModules) { | 
						|
  return (!ignorePath ? Promise.resolve(null) : getFileContentOrNull_1(path$2.resolve(ignorePath))).then(function (ignoreContent) { | 
						|
    return _createIgnorer(ignoreContent, withNodeModules); | 
						|
  }); | 
						|
} | 
						|
/** | 
						|
 * @param {undefined | string} ignorePath | 
						|
 * @param {undefined | boolean} withNodeModules | 
						|
 */ | 
						|
 | 
						|
 | 
						|
createIgnorer.sync = function (ignorePath, withNodeModules) { | 
						|
  var ignoreContent = !ignorePath ? null : getFileContentOrNull_1.sync(path$2.resolve(ignorePath)); | 
						|
  return _createIgnorer(ignoreContent, withNodeModules); | 
						|
}; | 
						|
/** | 
						|
 * @param {null | string} ignoreContent | 
						|
 * @param {undefined | boolean} withNodeModules | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function _createIgnorer(ignoreContent, withNodeModules) { | 
						|
  var ignorer = ignore().add(ignoreContent || ""); | 
						|
 | 
						|
  if (!withNodeModules) { | 
						|
    ignorer.add("node_modules"); | 
						|
  } | 
						|
 | 
						|
  return ignorer; | 
						|
} | 
						|
 | 
						|
var createIgnorer_1 = createIgnorer; | 
						|
 | 
						|
var thirdParty = require("./third-party"); | 
						|
 | 
						|
var concatMap = function concatMap(xs, fn) { | 
						|
  var res = []; | 
						|
 | 
						|
  for (var i = 0; i < xs.length; i++) { | 
						|
    var x = fn(xs[i], i); | 
						|
    if (isArray(x)) res.push.apply(res, x);else res.push(x); | 
						|
  } | 
						|
 | 
						|
  return res; | 
						|
}; | 
						|
 | 
						|
var isArray = Array.isArray || function (xs) { | 
						|
  return Object.prototype.toString.call(xs) === '[object Array]'; | 
						|
}; | 
						|
 | 
						|
var balancedMatch = balanced; | 
						|
 | 
						|
function balanced(a, b, str) { | 
						|
  if (a instanceof RegExp) a = maybeMatch(a, str); | 
						|
  if (b instanceof RegExp) b = maybeMatch(b, str); | 
						|
  var r = range(a, b, str); | 
						|
  return r && { | 
						|
    start: r[0], | 
						|
    end: r[1], | 
						|
    pre: str.slice(0, r[0]), | 
						|
    body: str.slice(r[0] + a.length, r[1]), | 
						|
    post: str.slice(r[1] + b.length) | 
						|
  }; | 
						|
} | 
						|
 | 
						|
function maybeMatch(reg, str) { | 
						|
  var m = str.match(reg); | 
						|
  return m ? m[0] : null; | 
						|
} | 
						|
 | 
						|
balanced.range = range; | 
						|
 | 
						|
function range(a, b, str) { | 
						|
  var begs, beg, left, right, result; | 
						|
  var ai = str.indexOf(a); | 
						|
  var bi = str.indexOf(b, ai + 1); | 
						|
  var i = ai; | 
						|
 | 
						|
  if (ai >= 0 && bi > 0) { | 
						|
    begs = []; | 
						|
    left = str.length; | 
						|
 | 
						|
    while (i >= 0 && !result) { | 
						|
      if (i == ai) { | 
						|
        begs.push(i); | 
						|
        ai = str.indexOf(a, i + 1); | 
						|
      } else if (begs.length == 1) { | 
						|
        result = [begs.pop(), bi]; | 
						|
      } else { | 
						|
        beg = begs.pop(); | 
						|
 | 
						|
        if (beg < left) { | 
						|
          left = beg; | 
						|
          right = bi; | 
						|
        } | 
						|
 | 
						|
        bi = str.indexOf(b, i + 1); | 
						|
      } | 
						|
 | 
						|
      i = ai < bi && ai >= 0 ? ai : bi; | 
						|
    } | 
						|
 | 
						|
    if (begs.length) { | 
						|
      result = [left, right]; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return result; | 
						|
} | 
						|
 | 
						|
var braceExpansion = expandTop; | 
						|
var escSlash = '\0SLASH' + Math.random() + '\0'; | 
						|
var escOpen = '\0OPEN' + Math.random() + '\0'; | 
						|
var escClose = '\0CLOSE' + Math.random() + '\0'; | 
						|
var escComma = '\0COMMA' + Math.random() + '\0'; | 
						|
var escPeriod = '\0PERIOD' + Math.random() + '\0'; | 
						|
 | 
						|
function numeric(str) { | 
						|
  return parseInt(str, 10) == str ? parseInt(str, 10) : str.charCodeAt(0); | 
						|
} | 
						|
 | 
						|
function escapeBraces(str) { | 
						|
  return str.split('\\\\').join(escSlash).split('\\{').join(escOpen).split('\\}').join(escClose).split('\\,').join(escComma).split('\\.').join(escPeriod); | 
						|
} | 
						|
 | 
						|
function unescapeBraces(str) { | 
						|
  return str.split(escSlash).join('\\').split(escOpen).join('{').split(escClose).join('}').split(escComma).join(',').split(escPeriod).join('.'); | 
						|
} // Basically just str.split(","), but handling cases | 
						|
// where we have nested braced sections, which should be | 
						|
// treated as individual members, like {a,{b,c},d} | 
						|
 | 
						|
 | 
						|
function parseCommaParts(str) { | 
						|
  if (!str) return ['']; | 
						|
  var parts = []; | 
						|
  var m = balancedMatch('{', '}', str); | 
						|
  if (!m) return str.split(','); | 
						|
  var pre = m.pre; | 
						|
  var body = m.body; | 
						|
  var post = m.post; | 
						|
  var p = pre.split(','); | 
						|
  p[p.length - 1] += '{' + body + '}'; | 
						|
  var postParts = parseCommaParts(post); | 
						|
 | 
						|
  if (post.length) { | 
						|
    p[p.length - 1] += postParts.shift(); | 
						|
    p.push.apply(p, postParts); | 
						|
  } | 
						|
 | 
						|
  parts.push.apply(parts, p); | 
						|
  return parts; | 
						|
} | 
						|
 | 
						|
function expandTop(str) { | 
						|
  if (!str) return []; // I don't know why Bash 4.3 does this, but it does. | 
						|
  // Anything starting with {} will have the first two bytes preserved | 
						|
  // but *only* at the top level, so {},a}b will not expand to anything, | 
						|
  // but a{},b}c will be expanded to [a}c,abc]. | 
						|
  // One could argue that this is a bug in Bash, but since the goal of | 
						|
  // this module is to match Bash's rules, we escape a leading {} | 
						|
 | 
						|
  if (str.substr(0, 2) === '{}') { | 
						|
    str = '\\{\\}' + str.substr(2); | 
						|
  } | 
						|
 | 
						|
  return expand(escapeBraces(str), true).map(unescapeBraces); | 
						|
} | 
						|
 | 
						|
function embrace(str) { | 
						|
  return '{' + str + '}'; | 
						|
} | 
						|
 | 
						|
function isPadded(el) { | 
						|
  return /^-?0\d/.test(el); | 
						|
} | 
						|
 | 
						|
function lte(i, y) { | 
						|
  return i <= y; | 
						|
} | 
						|
 | 
						|
function gte(i, y) { | 
						|
  return i >= y; | 
						|
} | 
						|
 | 
						|
function expand(str, isTop) { | 
						|
  var expansions = []; | 
						|
  var m = balancedMatch('{', '}', str); | 
						|
  if (!m || /\$$/.test(m.pre)) return [str]; | 
						|
  var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); | 
						|
  var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); | 
						|
  var isSequence = isNumericSequence || isAlphaSequence; | 
						|
  var isOptions = m.body.indexOf(',') >= 0; | 
						|
 | 
						|
  if (!isSequence && !isOptions) { | 
						|
    // {a},b} | 
						|
    if (m.post.match(/,.*\}/)) { | 
						|
      str = m.pre + '{' + m.body + escClose + m.post; | 
						|
      return expand(str); | 
						|
    } | 
						|
 | 
						|
    return [str]; | 
						|
  } | 
						|
 | 
						|
  var n; | 
						|
 | 
						|
  if (isSequence) { | 
						|
    n = m.body.split(/\.\./); | 
						|
  } else { | 
						|
    n = parseCommaParts(m.body); | 
						|
 | 
						|
    if (n.length === 1) { | 
						|
      // x{{a,b}}y ==> x{a}y x{b}y | 
						|
      n = expand(n[0], false).map(embrace); | 
						|
 | 
						|
      if (n.length === 1) { | 
						|
        var post = m.post.length ? expand(m.post, false) : ['']; | 
						|
        return post.map(function (p) { | 
						|
          return m.pre + n[0] + p; | 
						|
        }); | 
						|
      } | 
						|
    } | 
						|
  } // at this point, n is the parts, and we know it's not a comma set | 
						|
  // with a single entry. | 
						|
  // no need to expand pre, since it is guaranteed to be free of brace-sets | 
						|
 | 
						|
 | 
						|
  var pre = m.pre; | 
						|
  var post = m.post.length ? expand(m.post, false) : ['']; | 
						|
  var N; | 
						|
 | 
						|
  if (isSequence) { | 
						|
    var x = numeric(n[0]); | 
						|
    var y = numeric(n[1]); | 
						|
    var width = Math.max(n[0].length, n[1].length); | 
						|
    var incr = n.length == 3 ? Math.abs(numeric(n[2])) : 1; | 
						|
    var test = lte; | 
						|
    var reverse = y < x; | 
						|
 | 
						|
    if (reverse) { | 
						|
      incr *= -1; | 
						|
      test = gte; | 
						|
    } | 
						|
 | 
						|
    var pad = n.some(isPadded); | 
						|
    N = []; | 
						|
 | 
						|
    for (var i = x; test(i, y); i += incr) { | 
						|
      var c; | 
						|
 | 
						|
      if (isAlphaSequence) { | 
						|
        c = String.fromCharCode(i); | 
						|
        if (c === '\\') c = ''; | 
						|
      } else { | 
						|
        c = String(i); | 
						|
 | 
						|
        if (pad) { | 
						|
          var need = width - c.length; | 
						|
 | 
						|
          if (need > 0) { | 
						|
            var z = new Array(need + 1).join('0'); | 
						|
            if (i < 0) c = '-' + z + c.slice(1);else c = z + c; | 
						|
          } | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      N.push(c); | 
						|
    } | 
						|
  } else { | 
						|
    N = concatMap(n, function (el) { | 
						|
      return expand(el, false); | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  for (var j = 0; j < N.length; j++) { | 
						|
    for (var k = 0; k < post.length; k++) { | 
						|
      var expansion = pre + N[j] + post[k]; | 
						|
      if (!isTop || isSequence || expansion) expansions.push(expansion); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return expansions; | 
						|
} | 
						|
 | 
						|
var minimatch_1 = minimatch; | 
						|
minimatch.Minimatch = Minimatch; | 
						|
var path = { | 
						|
  sep: '/' | 
						|
}; | 
						|
 | 
						|
try { | 
						|
  path = path$2; | 
						|
} catch (er) {} | 
						|
 | 
						|
var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}; | 
						|
var plTypes = { | 
						|
  '!': { | 
						|
    open: '(?:(?!(?:', | 
						|
    close: '))[^/]*?)' | 
						|
  }, | 
						|
  '?': { | 
						|
    open: '(?:', | 
						|
    close: ')?' | 
						|
  }, | 
						|
  '+': { | 
						|
    open: '(?:', | 
						|
    close: ')+' | 
						|
  }, | 
						|
  '*': { | 
						|
    open: '(?:', | 
						|
    close: ')*' | 
						|
  }, | 
						|
  '@': { | 
						|
    open: '(?:', | 
						|
    close: ')' | 
						|
  } | 
						|
}; // any single thing other than / | 
						|
// don't need to escape / when using new RegExp() | 
						|
 | 
						|
var qmark = '[^/]'; // * => any number of characters | 
						|
 | 
						|
var star = qmark + '*?'; // ** when dots are allowed.  Anything goes, except .. and . | 
						|
// not (^ or / followed by one or two dots followed by $ or /), | 
						|
// followed by anything, any number of times. | 
						|
 | 
						|
var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?'; // not a ^ or / followed by a dot, | 
						|
// followed by anything, any number of times. | 
						|
 | 
						|
var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?'; // characters that need to be escaped in RegExp. | 
						|
 | 
						|
var reSpecials = charSet('().*{}+?[]^$\\!'); // "abc" -> { a:true, b:true, c:true } | 
						|
 | 
						|
function charSet(s) { | 
						|
  return s.split('').reduce(function (set, c) { | 
						|
    set[c] = true; | 
						|
    return set; | 
						|
  }, {}); | 
						|
} // normalizes slashes. | 
						|
 | 
						|
 | 
						|
var slashSplit = /\/+/; | 
						|
minimatch.filter = filter$1; | 
						|
 | 
						|
function filter$1(pattern, options) { | 
						|
  options = options || {}; | 
						|
  return function (p, i, list) { | 
						|
    return minimatch(p, pattern, options); | 
						|
  }; | 
						|
} | 
						|
 | 
						|
function ext(a, b) { | 
						|
  a = a || {}; | 
						|
  b = b || {}; | 
						|
  var t = {}; | 
						|
  Object.keys(b).forEach(function (k) { | 
						|
    t[k] = b[k]; | 
						|
  }); | 
						|
  Object.keys(a).forEach(function (k) { | 
						|
    t[k] = a[k]; | 
						|
  }); | 
						|
  return t; | 
						|
} | 
						|
 | 
						|
minimatch.defaults = function (def) { | 
						|
  if (!def || !Object.keys(def).length) return minimatch; | 
						|
  var orig = minimatch; | 
						|
 | 
						|
  var m = function minimatch(p, pattern, options) { | 
						|
    return orig.minimatch(p, pattern, ext(def, options)); | 
						|
  }; | 
						|
 | 
						|
  m.Minimatch = function Minimatch(pattern, options) { | 
						|
    return new orig.Minimatch(pattern, ext(def, options)); | 
						|
  }; | 
						|
 | 
						|
  return m; | 
						|
}; | 
						|
 | 
						|
Minimatch.defaults = function (def) { | 
						|
  if (!def || !Object.keys(def).length) return Minimatch; | 
						|
  return minimatch.defaults(def).Minimatch; | 
						|
}; | 
						|
 | 
						|
function minimatch(p, pattern, options) { | 
						|
  if (typeof pattern !== 'string') { | 
						|
    throw new TypeError('glob pattern string required'); | 
						|
  } | 
						|
 | 
						|
  if (!options) options = {}; // shortcut: comments match nothing. | 
						|
 | 
						|
  if (!options.nocomment && pattern.charAt(0) === '#') { | 
						|
    return false; | 
						|
  } // "" only matches "" | 
						|
 | 
						|
 | 
						|
  if (pattern.trim() === '') return p === ''; | 
						|
  return new Minimatch(pattern, options).match(p); | 
						|
} | 
						|
 | 
						|
function Minimatch(pattern, options) { | 
						|
  if (!(this instanceof Minimatch)) { | 
						|
    return new Minimatch(pattern, options); | 
						|
  } | 
						|
 | 
						|
  if (typeof pattern !== 'string') { | 
						|
    throw new TypeError('glob pattern string required'); | 
						|
  } | 
						|
 | 
						|
  if (!options) options = {}; | 
						|
  pattern = pattern.trim(); // windows support: need to use /, not \ | 
						|
 | 
						|
  if (path.sep !== '/') { | 
						|
    pattern = pattern.split(path.sep).join('/'); | 
						|
  } | 
						|
 | 
						|
  this.options = options; | 
						|
  this.set = []; | 
						|
  this.pattern = pattern; | 
						|
  this.regexp = null; | 
						|
  this.negate = false; | 
						|
  this.comment = false; | 
						|
  this.empty = false; // make the set of regexps etc. | 
						|
 | 
						|
  this.make(); | 
						|
} | 
						|
 | 
						|
Minimatch.prototype.debug = function () {}; | 
						|
 | 
						|
Minimatch.prototype.make = make; | 
						|
 | 
						|
function make() { | 
						|
  // don't do it more than once. | 
						|
  if (this._made) return; | 
						|
  var pattern = this.pattern; | 
						|
  var options = this.options; // empty patterns and comments match nothing. | 
						|
 | 
						|
  if (!options.nocomment && pattern.charAt(0) === '#') { | 
						|
    this.comment = true; | 
						|
    return; | 
						|
  } | 
						|
 | 
						|
  if (!pattern) { | 
						|
    this.empty = true; | 
						|
    return; | 
						|
  } // step 1: figure out negation, etc. | 
						|
 | 
						|
 | 
						|
  this.parseNegate(); // step 2: expand braces | 
						|
 | 
						|
  var set = this.globSet = this.braceExpand(); | 
						|
  if (options.debug) this.debug = console.error; | 
						|
  this.debug(this.pattern, set); // step 3: now we have a set, so turn each one into a series of path-portion | 
						|
  // matching patterns. | 
						|
  // These will be regexps, except in the case of "**", which is | 
						|
  // set to the GLOBSTAR object for globstar behavior, | 
						|
  // and will not contain any / characters | 
						|
 | 
						|
  set = this.globParts = set.map(function (s) { | 
						|
    return s.split(slashSplit); | 
						|
  }); | 
						|
  this.debug(this.pattern, set); // glob --> regexps | 
						|
 | 
						|
  set = set.map(function (s, si, set) { | 
						|
    return s.map(this.parse, this); | 
						|
  }, this); | 
						|
  this.debug(this.pattern, set); // filter out everything that didn't compile properly. | 
						|
 | 
						|
  set = set.filter(function (s) { | 
						|
    return s.indexOf(false) === -1; | 
						|
  }); | 
						|
  this.debug(this.pattern, set); | 
						|
  this.set = set; | 
						|
} | 
						|
 | 
						|
Minimatch.prototype.parseNegate = parseNegate; | 
						|
 | 
						|
function parseNegate() { | 
						|
  var pattern = this.pattern; | 
						|
  var negate = false; | 
						|
  var options = this.options; | 
						|
  var negateOffset = 0; | 
						|
  if (options.nonegate) return; | 
						|
 | 
						|
  for (var i = 0, l = pattern.length; i < l && pattern.charAt(i) === '!'; i++) { | 
						|
    negate = !negate; | 
						|
    negateOffset++; | 
						|
  } | 
						|
 | 
						|
  if (negateOffset) this.pattern = pattern.substr(negateOffset); | 
						|
  this.negate = negate; | 
						|
} // Brace expansion: | 
						|
// a{b,c}d -> abd acd | 
						|
// a{b,}c -> abc ac | 
						|
// a{0..3}d -> a0d a1d a2d a3d | 
						|
// a{b,c{d,e}f}g -> abg acdfg acefg | 
						|
// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg | 
						|
// | 
						|
// Invalid sets are not expanded. | 
						|
// a{2..}b -> a{2..}b | 
						|
// a{b}c -> a{b}c | 
						|
 | 
						|
 | 
						|
minimatch.braceExpand = function (pattern, options) { | 
						|
  return braceExpand(pattern, options); | 
						|
}; | 
						|
 | 
						|
Minimatch.prototype.braceExpand = braceExpand; | 
						|
 | 
						|
function braceExpand(pattern, options) { | 
						|
  if (!options) { | 
						|
    if (this instanceof Minimatch) { | 
						|
      options = this.options; | 
						|
    } else { | 
						|
      options = {}; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  pattern = typeof pattern === 'undefined' ? this.pattern : pattern; | 
						|
 | 
						|
  if (typeof pattern === 'undefined') { | 
						|
    throw new TypeError('undefined pattern'); | 
						|
  } | 
						|
 | 
						|
  if (options.nobrace || !pattern.match(/\{.*\}/)) { | 
						|
    // shortcut. no need to expand. | 
						|
    return [pattern]; | 
						|
  } | 
						|
 | 
						|
  return braceExpansion(pattern); | 
						|
} // parse a component of the expanded set. | 
						|
// At this point, no pattern may contain "/" in it | 
						|
// so we're going to return a 2d array, where each entry is the full | 
						|
// pattern, split on '/', and then turned into a regular expression. | 
						|
// A regexp is made at the end which joins each array with an | 
						|
// escaped /, and another full one which joins each regexp with |. | 
						|
// | 
						|
// Following the lead of Bash 4.1, note that "**" only has special meaning | 
						|
// when it is the *only* thing in a path portion.  Otherwise, any series | 
						|
// of * is equivalent to a single *.  Globstar behavior is enabled by | 
						|
// default, and can be disabled by setting options.noglobstar. | 
						|
 | 
						|
 | 
						|
Minimatch.prototype.parse = parse$1; | 
						|
var SUBPARSE = {}; | 
						|
 | 
						|
function parse$1(pattern, isSub) { | 
						|
  if (pattern.length > 1024 * 64) { | 
						|
    throw new TypeError('pattern is too long'); | 
						|
  } | 
						|
 | 
						|
  var options = this.options; // shortcuts | 
						|
 | 
						|
  if (!options.noglobstar && pattern === '**') return GLOBSTAR; | 
						|
  if (pattern === '') return ''; | 
						|
  var re = ''; | 
						|
  var hasMagic = !!options.nocase; | 
						|
  var escaping = false; // ? => one single character | 
						|
 | 
						|
  var patternListStack = []; | 
						|
  var negativeLists = []; | 
						|
  var stateChar; | 
						|
  var inClass = false; | 
						|
  var reClassStart = -1; | 
						|
  var classStart = -1; // . and .. never match anything that doesn't start with ., | 
						|
  // even when options.dot is set. | 
						|
 | 
						|
  var patternStart = pattern.charAt(0) === '.' ? '' // anything | 
						|
  // not (start or / followed by . or .. followed by / or end) | 
						|
  : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' : '(?!\\.)'; | 
						|
  var self = this; | 
						|
 | 
						|
  function clearStateChar() { | 
						|
    if (stateChar) { | 
						|
      // we had some state-tracking character | 
						|
      // that wasn't consumed by this pass. | 
						|
      switch (stateChar) { | 
						|
        case '*': | 
						|
          re += star; | 
						|
          hasMagic = true; | 
						|
          break; | 
						|
 | 
						|
        case '?': | 
						|
          re += qmark; | 
						|
          hasMagic = true; | 
						|
          break; | 
						|
 | 
						|
        default: | 
						|
          re += '\\' + stateChar; | 
						|
          break; | 
						|
      } | 
						|
 | 
						|
      self.debug('clearStateChar %j %j', stateChar, re); | 
						|
      stateChar = false; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  for (var i = 0, len = pattern.length, c; i < len && (c = pattern.charAt(i)); i++) { | 
						|
    this.debug('%s\t%s %s %j', pattern, i, re, c); // skip over any that are escaped. | 
						|
 | 
						|
    if (escaping && reSpecials[c]) { | 
						|
      re += '\\' + c; | 
						|
      escaping = false; | 
						|
      continue; | 
						|
    } | 
						|
 | 
						|
    switch (c) { | 
						|
      case '/': | 
						|
        // completely not allowed, even escaped. | 
						|
        // Should already be path-split by now. | 
						|
        return false; | 
						|
 | 
						|
      case '\\': | 
						|
        clearStateChar(); | 
						|
        escaping = true; | 
						|
        continue; | 
						|
      // the various stateChar values | 
						|
      // for the "extglob" stuff. | 
						|
 | 
						|
      case '?': | 
						|
      case '*': | 
						|
      case '+': | 
						|
      case '@': | 
						|
      case '!': | 
						|
        this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c); // all of those are literals inside a class, except that | 
						|
        // the glob [!a] means [^a] in regexp | 
						|
 | 
						|
        if (inClass) { | 
						|
          this.debug('  in class'); | 
						|
          if (c === '!' && i === classStart + 1) c = '^'; | 
						|
          re += c; | 
						|
          continue; | 
						|
        } // if we already have a stateChar, then it means | 
						|
        // that there was something like ** or +? in there. | 
						|
        // Handle the stateChar, then proceed with this one. | 
						|
 | 
						|
 | 
						|
        self.debug('call clearStateChar %j', stateChar); | 
						|
        clearStateChar(); | 
						|
        stateChar = c; // if extglob is disabled, then +(asdf|foo) isn't a thing. | 
						|
        // just clear the statechar *now*, rather than even diving into | 
						|
        // the patternList stuff. | 
						|
 | 
						|
        if (options.noext) clearStateChar(); | 
						|
        continue; | 
						|
 | 
						|
      case '(': | 
						|
        if (inClass) { | 
						|
          re += '('; | 
						|
          continue; | 
						|
        } | 
						|
 | 
						|
        if (!stateChar) { | 
						|
          re += '\\('; | 
						|
          continue; | 
						|
        } | 
						|
 | 
						|
        patternListStack.push({ | 
						|
          type: stateChar, | 
						|
          start: i - 1, | 
						|
          reStart: re.length, | 
						|
          open: plTypes[stateChar].open, | 
						|
          close: plTypes[stateChar].close | 
						|
        }); // negation is (?:(?!js)[^/]*) | 
						|
 | 
						|
        re += stateChar === '!' ? '(?:(?!(?:' : '(?:'; | 
						|
        this.debug('plType %j %j', stateChar, re); | 
						|
        stateChar = false; | 
						|
        continue; | 
						|
 | 
						|
      case ')': | 
						|
        if (inClass || !patternListStack.length) { | 
						|
          re += '\\)'; | 
						|
          continue; | 
						|
        } | 
						|
 | 
						|
        clearStateChar(); | 
						|
        hasMagic = true; | 
						|
        var pl = patternListStack.pop(); // negation is (?:(?!js)[^/]*) | 
						|
        // The others are (?:<pattern>)<type> | 
						|
 | 
						|
        re += pl.close; | 
						|
 | 
						|
        if (pl.type === '!') { | 
						|
          negativeLists.push(pl); | 
						|
        } | 
						|
 | 
						|
        pl.reEnd = re.length; | 
						|
        continue; | 
						|
 | 
						|
      case '|': | 
						|
        if (inClass || !patternListStack.length || escaping) { | 
						|
          re += '\\|'; | 
						|
          escaping = false; | 
						|
          continue; | 
						|
        } | 
						|
 | 
						|
        clearStateChar(); | 
						|
        re += '|'; | 
						|
        continue; | 
						|
      // these are mostly the same in regexp and glob | 
						|
 | 
						|
      case '[': | 
						|
        // swallow any state-tracking char before the [ | 
						|
        clearStateChar(); | 
						|
 | 
						|
        if (inClass) { | 
						|
          re += '\\' + c; | 
						|
          continue; | 
						|
        } | 
						|
 | 
						|
        inClass = true; | 
						|
        classStart = i; | 
						|
        reClassStart = re.length; | 
						|
        re += c; | 
						|
        continue; | 
						|
 | 
						|
      case ']': | 
						|
        //  a right bracket shall lose its special | 
						|
        //  meaning and represent itself in | 
						|
        //  a bracket expression if it occurs | 
						|
        //  first in the list.  -- POSIX.2 2.8.3.2 | 
						|
        if (i === classStart + 1 || !inClass) { | 
						|
          re += '\\' + c; | 
						|
          escaping = false; | 
						|
          continue; | 
						|
        } // handle the case where we left a class open. | 
						|
        // "[z-a]" is valid, equivalent to "\[z-a\]" | 
						|
 | 
						|
 | 
						|
        if (inClass) { | 
						|
          // split where the last [ was, make sure we don't have | 
						|
          // an invalid re. if so, re-walk the contents of the | 
						|
          // would-be class to re-translate any characters that | 
						|
          // were passed through as-is | 
						|
          // TODO: It would probably be faster to determine this | 
						|
          // without a try/catch and a new RegExp, but it's tricky | 
						|
          // to do safely.  For now, this is safe and works. | 
						|
          var cs = pattern.substring(classStart + 1, i); | 
						|
 | 
						|
          try { | 
						|
            RegExp('[' + cs + ']'); | 
						|
          } catch (er) { | 
						|
            // not a valid class! | 
						|
            var sp = this.parse(cs, SUBPARSE); | 
						|
            re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'; | 
						|
            hasMagic = hasMagic || sp[1]; | 
						|
            inClass = false; | 
						|
            continue; | 
						|
          } | 
						|
        } // finish up the class. | 
						|
 | 
						|
 | 
						|
        hasMagic = true; | 
						|
        inClass = false; | 
						|
        re += c; | 
						|
        continue; | 
						|
 | 
						|
      default: | 
						|
        // swallow any state char that wasn't consumed | 
						|
        clearStateChar(); | 
						|
 | 
						|
        if (escaping) { | 
						|
          // no need | 
						|
          escaping = false; | 
						|
        } else if (reSpecials[c] && !(c === '^' && inClass)) { | 
						|
          re += '\\'; | 
						|
        } | 
						|
 | 
						|
        re += c; | 
						|
    } // switch | 
						|
 | 
						|
  } // for | 
						|
  // handle the case where we left a class open. | 
						|
  // "[abc" is valid, equivalent to "\[abc" | 
						|
 | 
						|
 | 
						|
  if (inClass) { | 
						|
    // split where the last [ was, and escape it | 
						|
    // this is a huge pita.  We now have to re-walk | 
						|
    // the contents of the would-be class to re-translate | 
						|
    // any characters that were passed through as-is | 
						|
    cs = pattern.substr(classStart + 1); | 
						|
    sp = this.parse(cs, SUBPARSE); | 
						|
    re = re.substr(0, reClassStart) + '\\[' + sp[0]; | 
						|
    hasMagic = hasMagic || sp[1]; | 
						|
  } // handle the case where we had a +( thing at the *end* | 
						|
  // of the pattern. | 
						|
  // each pattern list stack adds 3 chars, and we need to go through | 
						|
  // and escape any | chars that were passed through as-is for the regexp. | 
						|
  // Go through and escape them, taking care not to double-escape any | 
						|
  // | chars that were already escaped. | 
						|
 | 
						|
 | 
						|
  for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { | 
						|
    var tail = re.slice(pl.reStart + pl.open.length); | 
						|
    this.debug('setting tail', re, pl); // maybe some even number of \, then maybe 1 \, followed by a | | 
						|
 | 
						|
    tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) { | 
						|
      if (!$2) { | 
						|
        // the | isn't already escaped, so escape it. | 
						|
        $2 = '\\'; | 
						|
      } // need to escape all those slashes *again*, without escaping the | 
						|
      // one that we need for escaping the | character.  As it works out, | 
						|
      // escaping an even number of slashes can be done by simply repeating | 
						|
      // it exactly after itself.  That's why this trick works. | 
						|
      // | 
						|
      // I am sorry that you have to see this. | 
						|
 | 
						|
 | 
						|
      return $1 + $1 + $2 + '|'; | 
						|
    }); | 
						|
    this.debug('tail=%j\n   %s', tail, tail, pl, re); | 
						|
    var t = pl.type === '*' ? star : pl.type === '?' ? qmark : '\\' + pl.type; | 
						|
    hasMagic = true; | 
						|
    re = re.slice(0, pl.reStart) + t + '\\(' + tail; | 
						|
  } // handle trailing things that only matter at the very end. | 
						|
 | 
						|
 | 
						|
  clearStateChar(); | 
						|
 | 
						|
  if (escaping) { | 
						|
    // trailing \\ | 
						|
    re += '\\\\'; | 
						|
  } // only need to apply the nodot start if the re starts with | 
						|
  // something that could conceivably capture a dot | 
						|
 | 
						|
 | 
						|
  var addPatternStart = false; | 
						|
 | 
						|
  switch (re.charAt(0)) { | 
						|
    case '.': | 
						|
    case '[': | 
						|
    case '(': | 
						|
      addPatternStart = true; | 
						|
  } // Hack to work around lack of negative lookbehind in JS | 
						|
  // A pattern like: *.!(x).!(y|z) needs to ensure that a name | 
						|
  // like 'a.xyz.yz' doesn't match.  So, the first negative | 
						|
  // lookahead, has to look ALL the way ahead, to the end of | 
						|
  // the pattern. | 
						|
 | 
						|
 | 
						|
  for (var n = negativeLists.length - 1; n > -1; n--) { | 
						|
    var nl = negativeLists[n]; | 
						|
    var nlBefore = re.slice(0, nl.reStart); | 
						|
    var nlFirst = re.slice(nl.reStart, nl.reEnd - 8); | 
						|
    var nlLast = re.slice(nl.reEnd - 8, nl.reEnd); | 
						|
    var nlAfter = re.slice(nl.reEnd); | 
						|
    nlLast += nlAfter; // Handle nested stuff like *(*.js|!(*.json)), where open parens | 
						|
    // mean that we should *not* include the ) in the bit that is considered | 
						|
    // "after" the negated section. | 
						|
 | 
						|
    var openParensBefore = nlBefore.split('(').length - 1; | 
						|
    var cleanAfter = nlAfter; | 
						|
 | 
						|
    for (i = 0; i < openParensBefore; i++) { | 
						|
      cleanAfter = cleanAfter.replace(/\)[+*?]?/, ''); | 
						|
    } | 
						|
 | 
						|
    nlAfter = cleanAfter; | 
						|
    var dollar = ''; | 
						|
 | 
						|
    if (nlAfter === '' && isSub !== SUBPARSE) { | 
						|
      dollar = '$'; | 
						|
    } | 
						|
 | 
						|
    var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast; | 
						|
    re = newRe; | 
						|
  } // if the re is not "" at this point, then we need to make sure | 
						|
  // it doesn't match against an empty path part. | 
						|
  // Otherwise a/* will match a/, which it should not. | 
						|
 | 
						|
 | 
						|
  if (re !== '' && hasMagic) { | 
						|
    re = '(?=.)' + re; | 
						|
  } | 
						|
 | 
						|
  if (addPatternStart) { | 
						|
    re = patternStart + re; | 
						|
  } // parsing just a piece of a larger pattern. | 
						|
 | 
						|
 | 
						|
  if (isSub === SUBPARSE) { | 
						|
    return [re, hasMagic]; | 
						|
  } // skip the regexp for non-magical patterns | 
						|
  // unescape anything in it, though, so that it'll be | 
						|
  // an exact match against a file etc. | 
						|
 | 
						|
 | 
						|
  if (!hasMagic) { | 
						|
    return globUnescape(pattern); | 
						|
  } | 
						|
 | 
						|
  var flags = options.nocase ? 'i' : ''; | 
						|
 | 
						|
  try { | 
						|
    var regExp = new RegExp('^' + re + '$', flags); | 
						|
  } catch (er) { | 
						|
    // If it was an invalid regular expression, then it can't match | 
						|
    // anything.  This trick looks for a character after the end of | 
						|
    // the string, which is of course impossible, except in multi-line | 
						|
    // mode, but it's not a /m regex. | 
						|
    return new RegExp('$.'); | 
						|
  } | 
						|
 | 
						|
  regExp._glob = pattern; | 
						|
  regExp._src = re; | 
						|
  return regExp; | 
						|
} | 
						|
 | 
						|
minimatch.makeRe = function (pattern, options) { | 
						|
  return new Minimatch(pattern, options || {}).makeRe(); | 
						|
}; | 
						|
 | 
						|
Minimatch.prototype.makeRe = makeRe; | 
						|
 | 
						|
function makeRe() { | 
						|
  if (this.regexp || this.regexp === false) return this.regexp; // at this point, this.set is a 2d array of partial | 
						|
  // pattern strings, or "**". | 
						|
  // | 
						|
  // It's better to use .match().  This function shouldn't | 
						|
  // be used, really, but it's pretty convenient sometimes, | 
						|
  // when you just want to work with a regex. | 
						|
 | 
						|
  var set = this.set; | 
						|
 | 
						|
  if (!set.length) { | 
						|
    this.regexp = false; | 
						|
    return this.regexp; | 
						|
  } | 
						|
 | 
						|
  var options = this.options; | 
						|
  var twoStar = options.noglobstar ? star : options.dot ? twoStarDot : twoStarNoDot; | 
						|
  var flags = options.nocase ? 'i' : ''; | 
						|
  var re = set.map(function (pattern) { | 
						|
    return pattern.map(function (p) { | 
						|
      return p === GLOBSTAR ? twoStar : typeof p === 'string' ? regExpEscape(p) : p._src; | 
						|
    }).join('\\\/'); | 
						|
  }).join('|'); // must match entire pattern | 
						|
  // ending in a * or ** will make it less strict. | 
						|
 | 
						|
  re = '^(?:' + re + ')$'; // can match anything, as long as it's not this. | 
						|
 | 
						|
  if (this.negate) re = '^(?!' + re + ').*$'; | 
						|
 | 
						|
  try { | 
						|
    this.regexp = new RegExp(re, flags); | 
						|
  } catch (ex) { | 
						|
    this.regexp = false; | 
						|
  } | 
						|
 | 
						|
  return this.regexp; | 
						|
} | 
						|
 | 
						|
minimatch.match = function (list, pattern, options) { | 
						|
  options = options || {}; | 
						|
  var mm = new Minimatch(pattern, options); | 
						|
  list = list.filter(function (f) { | 
						|
    return mm.match(f); | 
						|
  }); | 
						|
 | 
						|
  if (mm.options.nonull && !list.length) { | 
						|
    list.push(pattern); | 
						|
  } | 
						|
 | 
						|
  return list; | 
						|
}; | 
						|
 | 
						|
Minimatch.prototype.match = match; | 
						|
 | 
						|
function match(f, partial) { | 
						|
  this.debug('match', f, this.pattern); // short-circuit in the case of busted things. | 
						|
  // comments, etc. | 
						|
 | 
						|
  if (this.comment) return false; | 
						|
  if (this.empty) return f === ''; | 
						|
  if (f === '/' && partial) return true; | 
						|
  var options = this.options; // windows: need to use /, not \ | 
						|
 | 
						|
  if (path.sep !== '/') { | 
						|
    f = f.split(path.sep).join('/'); | 
						|
  } // treat the test path as a set of pathparts. | 
						|
 | 
						|
 | 
						|
  f = f.split(slashSplit); | 
						|
  this.debug(this.pattern, 'split', f); // just ONE of the pattern sets in this.set needs to match | 
						|
  // in order for it to be valid.  If negating, then just one | 
						|
  // match means that we have failed. | 
						|
  // Either way, return on the first hit. | 
						|
 | 
						|
  var set = this.set; | 
						|
  this.debug(this.pattern, 'set', set); // Find the basename of the path by looking for the last non-empty segment | 
						|
 | 
						|
  var filename; | 
						|
  var i; | 
						|
 | 
						|
  for (i = f.length - 1; i >= 0; i--) { | 
						|
    filename = f[i]; | 
						|
    if (filename) break; | 
						|
  } | 
						|
 | 
						|
  for (i = 0; i < set.length; i++) { | 
						|
    var pattern = set[i]; | 
						|
    var file = f; | 
						|
 | 
						|
    if (options.matchBase && pattern.length === 1) { | 
						|
      file = [filename]; | 
						|
    } | 
						|
 | 
						|
    var hit = this.matchOne(file, pattern, partial); | 
						|
 | 
						|
    if (hit) { | 
						|
      if (options.flipNegate) return true; | 
						|
      return !this.negate; | 
						|
    } | 
						|
  } // didn't get any hits.  this is success if it's a negative | 
						|
  // pattern, failure otherwise. | 
						|
 | 
						|
 | 
						|
  if (options.flipNegate) return false; | 
						|
  return this.negate; | 
						|
} // set partial to true to test if, for example, | 
						|
// "/a/b" matches the start of "/*/b/*/d" | 
						|
// Partial means, if you run out of file before you run | 
						|
// out of pattern, then that's fine, as long as all | 
						|
// the parts match. | 
						|
 | 
						|
 | 
						|
Minimatch.prototype.matchOne = function (file, pattern, partial) { | 
						|
  var options = this.options; | 
						|
  this.debug('matchOne', { | 
						|
    'this': this, | 
						|
    file: file, | 
						|
    pattern: pattern | 
						|
  }); | 
						|
  this.debug('matchOne', file.length, pattern.length); | 
						|
 | 
						|
  for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) { | 
						|
    this.debug('matchOne loop'); | 
						|
    var p = pattern[pi]; | 
						|
    var f = file[fi]; | 
						|
    this.debug(pattern, p, f); // should be impossible. | 
						|
    // some invalid regexp stuff in the set. | 
						|
 | 
						|
    if (p === false) return false; | 
						|
 | 
						|
    if (p === GLOBSTAR) { | 
						|
      this.debug('GLOBSTAR', [pattern, p, f]); // "**" | 
						|
      // a/**/b/**/c would match the following: | 
						|
      // a/b/x/y/z/c | 
						|
      // a/x/y/z/b/c | 
						|
      // a/b/x/b/x/c | 
						|
      // a/b/c | 
						|
      // To do this, take the rest of the pattern after | 
						|
      // the **, and see if it would match the file remainder. | 
						|
      // If so, return success. | 
						|
      // If not, the ** "swallows" a segment, and try again. | 
						|
      // This is recursively awful. | 
						|
      // | 
						|
      // a/**/b/**/c matching a/b/x/y/z/c | 
						|
      // - a matches a | 
						|
      // - doublestar | 
						|
      //   - matchOne(b/x/y/z/c, b/**/c) | 
						|
      //     - b matches b | 
						|
      //     - doublestar | 
						|
      //       - matchOne(x/y/z/c, c) -> no | 
						|
      //       - matchOne(y/z/c, c) -> no | 
						|
      //       - matchOne(z/c, c) -> no | 
						|
      //       - matchOne(c, c) yes, hit | 
						|
 | 
						|
      var fr = fi; | 
						|
      var pr = pi + 1; | 
						|
 | 
						|
      if (pr === pl) { | 
						|
        this.debug('** at the end'); // a ** at the end will just swallow the rest. | 
						|
        // We have found a match. | 
						|
        // however, it will not swallow /.x, unless | 
						|
        // options.dot is set. | 
						|
        // . and .. are *never* matched by **, for explosively | 
						|
        // exponential reasons. | 
						|
 | 
						|
        for (; fi < fl; fi++) { | 
						|
          if (file[fi] === '.' || file[fi] === '..' || !options.dot && file[fi].charAt(0) === '.') return false; | 
						|
        } | 
						|
 | 
						|
        return true; | 
						|
      } // ok, let's see if we can swallow whatever we can. | 
						|
 | 
						|
 | 
						|
      while (fr < fl) { | 
						|
        var swallowee = file[fr]; | 
						|
        this.debug('\nglobstar while', file, fr, pattern, pr, swallowee); // XXX remove this slice.  Just pass the start index. | 
						|
 | 
						|
        if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { | 
						|
          this.debug('globstar found match!', fr, fl, swallowee); // found a match. | 
						|
 | 
						|
          return true; | 
						|
        } else { | 
						|
          // can't swallow "." or ".." ever. | 
						|
          // can only swallow ".foo" when explicitly asked. | 
						|
          if (swallowee === '.' || swallowee === '..' || !options.dot && swallowee.charAt(0) === '.') { | 
						|
            this.debug('dot detected!', file, fr, pattern, pr); | 
						|
            break; | 
						|
          } // ** swallows a segment, and continue. | 
						|
 | 
						|
 | 
						|
          this.debug('globstar swallow a segment, and continue'); | 
						|
          fr++; | 
						|
        } | 
						|
      } // no match was found. | 
						|
      // However, in partial mode, we can't say this is necessarily over. | 
						|
      // If there's more *pattern* left, then | 
						|
 | 
						|
 | 
						|
      if (partial) { | 
						|
        // ran out of file | 
						|
        this.debug('\n>>> no match, partial?', file, fr, pattern, pr); | 
						|
        if (fr === fl) return true; | 
						|
      } | 
						|
 | 
						|
      return false; | 
						|
    } // something other than ** | 
						|
    // non-magic patterns just have to match exactly | 
						|
    // patterns with magic have been turned into regexps. | 
						|
 | 
						|
 | 
						|
    var hit; | 
						|
 | 
						|
    if (typeof p === 'string') { | 
						|
      if (options.nocase) { | 
						|
        hit = f.toLowerCase() === p.toLowerCase(); | 
						|
      } else { | 
						|
        hit = f === p; | 
						|
      } | 
						|
 | 
						|
      this.debug('string match', p, f, hit); | 
						|
    } else { | 
						|
      hit = f.match(p); | 
						|
      this.debug('pattern match', p, f, hit); | 
						|
    } | 
						|
 | 
						|
    if (!hit) return false; | 
						|
  } // Note: ending in / means that we'll get a final "" | 
						|
  // at the end of the pattern.  This can only match a | 
						|
  // corresponding "" at the end of the file. | 
						|
  // If the file ends in /, then it can only match a | 
						|
  // a pattern that ends in /, unless the pattern just | 
						|
  // doesn't have any more for it. But, a/b/ should *not* | 
						|
  // match "a/b/*", even though "" matches against the | 
						|
  // [^/]*? pattern, except in partial mode, where it might | 
						|
  // simply not be reached yet. | 
						|
  // However, a/b/ should still satisfy a/* | 
						|
  // now either we fell off the end of the pattern, or we're done. | 
						|
 | 
						|
 | 
						|
  if (fi === fl && pi === pl) { | 
						|
    // ran out of pattern and filename at the same time. | 
						|
    // an exact hit! | 
						|
    return true; | 
						|
  } else if (fi === fl) { | 
						|
    // ran out of file, but still had pattern left. | 
						|
    // this is ok if we're doing the match as part of | 
						|
    // a glob fs traversal. | 
						|
    return partial; | 
						|
  } else if (pi === pl) { | 
						|
    // ran out of pattern, still have file left. | 
						|
    // this is only acceptable if we're on the very last | 
						|
    // empty segment of a file with a trailing slash. | 
						|
    // a/* should match a/b/ | 
						|
    var emptyFileEnd = fi === fl - 1 && file[fi] === ''; | 
						|
    return emptyFileEnd; | 
						|
  } // should be unreachable. | 
						|
 | 
						|
 | 
						|
  throw new Error('wtf?'); | 
						|
}; // replace stuff like \* with * | 
						|
 | 
						|
 | 
						|
function globUnescape(s) { | 
						|
  return s.replace(/\\(.)/g, '$1'); | 
						|
} | 
						|
 | 
						|
function regExpEscape(s) { | 
						|
  return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); | 
						|
} | 
						|
 | 
						|
var assert = true; | 
						|
var async_hooks = ">= 8"; | 
						|
var buffer_ieee754 = "< 0.9.7"; | 
						|
var buffer = true; | 
						|
var child_process = true; | 
						|
var cluster = true; | 
						|
var console$1 = true; | 
						|
var constants = true; | 
						|
var crypto = true; | 
						|
var _debug_agent = ">= 1 && < 8"; | 
						|
var _debugger = "< 8"; | 
						|
var dgram = true; | 
						|
var dns = true; | 
						|
var domain = true; | 
						|
var events = true; | 
						|
var freelist = "< 6"; | 
						|
var fs = true; | 
						|
var _http_agent = ">= 0.11.1"; | 
						|
var _http_client = ">= 0.11.1"; | 
						|
var _http_common = ">= 0.11.1"; | 
						|
var _http_incoming = ">= 0.11.1"; | 
						|
var _http_outgoing = ">= 0.11.1"; | 
						|
var _http_server = ">= 0.11.1"; | 
						|
var http = true; | 
						|
var http2 = ">= 8.8"; | 
						|
var https = true; | 
						|
var inspector = ">= 8.0.0"; | 
						|
var _linklist = "< 8"; | 
						|
var module$1 = true; | 
						|
var net = true; | 
						|
var os = true; | 
						|
var path$1 = true; | 
						|
var perf_hooks = ">= 8.5"; | 
						|
var process$1 = ">= 1"; | 
						|
var punycode = true; | 
						|
var querystring = true; | 
						|
var readline = true; | 
						|
var repl = true; | 
						|
var smalloc = ">= 0.11.5 && < 3"; | 
						|
var _stream_duplex = ">= 0.9.4"; | 
						|
var _stream_transform = ">= 0.9.4"; | 
						|
var _stream_wrap = ">= 1.4.1"; | 
						|
var _stream_passthrough = ">= 0.9.4"; | 
						|
var _stream_readable = ">= 0.9.4"; | 
						|
var _stream_writable = ">= 0.9.4"; | 
						|
var stream = true; | 
						|
var string_decoder = true; | 
						|
var sys = true; | 
						|
var timers = true; | 
						|
var _tls_common = ">= 0.11.13"; | 
						|
var _tls_legacy = ">= 0.11.3 && < 10"; | 
						|
var _tls_wrap = ">= 0.11.3"; | 
						|
var tls = true; | 
						|
var trace_events = ">= 10"; | 
						|
var tty = true; | 
						|
var url = true; | 
						|
var util$1 = true; | 
						|
var v8 = ">= 1"; | 
						|
var vm = true; | 
						|
var worker_threads = ">= 11.7"; | 
						|
var zlib = true; | 
						|
var core$1 = { | 
						|
	assert: assert, | 
						|
	async_hooks: async_hooks, | 
						|
	buffer_ieee754: buffer_ieee754, | 
						|
	buffer: buffer, | 
						|
	child_process: child_process, | 
						|
	cluster: cluster, | 
						|
	console: console$1, | 
						|
	constants: constants, | 
						|
	crypto: crypto, | 
						|
	_debug_agent: _debug_agent, | 
						|
	_debugger: _debugger, | 
						|
	dgram: dgram, | 
						|
	dns: dns, | 
						|
	domain: domain, | 
						|
	events: events, | 
						|
	freelist: freelist, | 
						|
	fs: fs, | 
						|
	"fs/promises": ">= 10 && < 10.1", | 
						|
	_http_agent: _http_agent, | 
						|
	_http_client: _http_client, | 
						|
	_http_common: _http_common, | 
						|
	_http_incoming: _http_incoming, | 
						|
	_http_outgoing: _http_outgoing, | 
						|
	_http_server: _http_server, | 
						|
	http: http, | 
						|
	http2: http2, | 
						|
	https: https, | 
						|
	inspector: inspector, | 
						|
	_linklist: _linklist, | 
						|
	module: module$1, | 
						|
	net: net, | 
						|
	"node-inspect/lib/_inspect": ">= 7.6.0 && < 12", | 
						|
	"node-inspect/lib/internal/inspect_client": ">= 7.6.0 && < 12", | 
						|
	"node-inspect/lib/internal/inspect_repl": ">= 7.6.0 && < 12", | 
						|
	os: os, | 
						|
	path: path$1, | 
						|
	perf_hooks: perf_hooks, | 
						|
	process: process$1, | 
						|
	punycode: punycode, | 
						|
	querystring: querystring, | 
						|
	readline: readline, | 
						|
	repl: repl, | 
						|
	smalloc: smalloc, | 
						|
	_stream_duplex: _stream_duplex, | 
						|
	_stream_transform: _stream_transform, | 
						|
	_stream_wrap: _stream_wrap, | 
						|
	_stream_passthrough: _stream_passthrough, | 
						|
	_stream_readable: _stream_readable, | 
						|
	_stream_writable: _stream_writable, | 
						|
	stream: stream, | 
						|
	string_decoder: string_decoder, | 
						|
	sys: sys, | 
						|
	timers: timers, | 
						|
	_tls_common: _tls_common, | 
						|
	_tls_legacy: _tls_legacy, | 
						|
	_tls_wrap: _tls_wrap, | 
						|
	tls: tls, | 
						|
	trace_events: trace_events, | 
						|
	tty: tty, | 
						|
	url: url, | 
						|
	util: util$1, | 
						|
	"v8/tools/arguments": ">= 10 && < 12", | 
						|
	"v8/tools/codemap": [ | 
						|
	">= 4.4.0 && < 5", | 
						|
	">= 5.2.0 && < 12" | 
						|
], | 
						|
	"v8/tools/consarray": [ | 
						|
	">= 4.4.0 && < 5", | 
						|
	">= 5.2.0 && < 12" | 
						|
], | 
						|
	"v8/tools/csvparser": [ | 
						|
	">= 4.4.0 && < 5", | 
						|
	">= 5.2.0 && < 12" | 
						|
], | 
						|
	"v8/tools/logreader": [ | 
						|
	">= 4.4.0 && < 5", | 
						|
	">= 5.2.0 && < 12" | 
						|
], | 
						|
	"v8/tools/profile_view": [ | 
						|
	">= 4.4.0 && < 5", | 
						|
	">= 5.2.0 && < 12" | 
						|
], | 
						|
	"v8/tools/splaytree": [ | 
						|
	">= 4.4.0 && < 5", | 
						|
	">= 5.2.0 && < 12" | 
						|
], | 
						|
	v8: v8, | 
						|
	vm: vm, | 
						|
	worker_threads: worker_threads, | 
						|
	zlib: zlib | 
						|
}; | 
						|
 | 
						|
var core$2 = /*#__PURE__*/Object.freeze({ | 
						|
  __proto__: null, | 
						|
  assert: assert, | 
						|
  async_hooks: async_hooks, | 
						|
  buffer_ieee754: buffer_ieee754, | 
						|
  buffer: buffer, | 
						|
  child_process: child_process, | 
						|
  cluster: cluster, | 
						|
  console: console$1, | 
						|
  constants: constants, | 
						|
  crypto: crypto, | 
						|
  _debug_agent: _debug_agent, | 
						|
  _debugger: _debugger, | 
						|
  dgram: dgram, | 
						|
  dns: dns, | 
						|
  domain: domain, | 
						|
  events: events, | 
						|
  freelist: freelist, | 
						|
  fs: fs, | 
						|
  _http_agent: _http_agent, | 
						|
  _http_client: _http_client, | 
						|
  _http_common: _http_common, | 
						|
  _http_incoming: _http_incoming, | 
						|
  _http_outgoing: _http_outgoing, | 
						|
  _http_server: _http_server, | 
						|
  http: http, | 
						|
  http2: http2, | 
						|
  https: https, | 
						|
  inspector: inspector, | 
						|
  _linklist: _linklist, | 
						|
  module: module$1, | 
						|
  net: net, | 
						|
  os: os, | 
						|
  path: path$1, | 
						|
  perf_hooks: perf_hooks, | 
						|
  process: process$1, | 
						|
  punycode: punycode, | 
						|
  querystring: querystring, | 
						|
  readline: readline, | 
						|
  repl: repl, | 
						|
  smalloc: smalloc, | 
						|
  _stream_duplex: _stream_duplex, | 
						|
  _stream_transform: _stream_transform, | 
						|
  _stream_wrap: _stream_wrap, | 
						|
  _stream_passthrough: _stream_passthrough, | 
						|
  _stream_readable: _stream_readable, | 
						|
  _stream_writable: _stream_writable, | 
						|
  stream: stream, | 
						|
  string_decoder: string_decoder, | 
						|
  sys: sys, | 
						|
  timers: timers, | 
						|
  _tls_common: _tls_common, | 
						|
  _tls_legacy: _tls_legacy, | 
						|
  _tls_wrap: _tls_wrap, | 
						|
  tls: tls, | 
						|
  trace_events: trace_events, | 
						|
  tty: tty, | 
						|
  url: url, | 
						|
  util: util$1, | 
						|
  v8: v8, | 
						|
  vm: vm, | 
						|
  worker_threads: worker_threads, | 
						|
  zlib: zlib, | 
						|
  'default': core$1 | 
						|
}); | 
						|
 | 
						|
var data = getCjsExportFromNamespace(core$2); | 
						|
 | 
						|
var current = process.versions && process.versions.node && process.versions.node.split('.') || []; | 
						|
 | 
						|
function specifierIncluded(specifier) { | 
						|
  var parts = specifier.split(' '); | 
						|
  var op = parts.length > 1 ? parts[0] : '='; | 
						|
  var versionParts = (parts.length > 1 ? parts[1] : parts[0]).split('.'); | 
						|
 | 
						|
  for (var i = 0; i < 3; ++i) { | 
						|
    var cur = Number(current[i] || 0); | 
						|
    var ver = Number(versionParts[i] || 0); | 
						|
 | 
						|
    if (cur === ver) { | 
						|
      continue; // eslint-disable-line no-restricted-syntax, no-continue | 
						|
    } | 
						|
 | 
						|
    if (op === '<') { | 
						|
      return cur < ver; | 
						|
    } else if (op === '>=') { | 
						|
      return cur >= ver; | 
						|
    } else { | 
						|
      return false; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return op === '>='; | 
						|
} | 
						|
 | 
						|
function matchesRange(range) { | 
						|
  var specifiers = range.split(/ ?&& ?/); | 
						|
 | 
						|
  if (specifiers.length === 0) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  for (var i = 0; i < specifiers.length; ++i) { | 
						|
    if (!specifierIncluded(specifiers[i])) { | 
						|
      return false; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return true; | 
						|
} | 
						|
 | 
						|
function versionIncluded(specifierValue) { | 
						|
  if (typeof specifierValue === 'boolean') { | 
						|
    return specifierValue; | 
						|
  } | 
						|
 | 
						|
  if (specifierValue && typeof specifierValue === 'object') { | 
						|
    for (var i = 0; i < specifierValue.length; ++i) { | 
						|
      if (matchesRange(specifierValue[i])) { | 
						|
        return true; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  return matchesRange(specifierValue); | 
						|
} | 
						|
 | 
						|
var core$3 = {}; | 
						|
 | 
						|
for (var mod in data) { | 
						|
  // eslint-disable-line no-restricted-syntax | 
						|
  if (Object.prototype.hasOwnProperty.call(data, mod)) { | 
						|
    core$3[mod] = versionIncluded(data[mod]); | 
						|
  } | 
						|
} | 
						|
 | 
						|
var core_1 = core$3; | 
						|
 | 
						|
var caller = function caller() { | 
						|
  // see https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi | 
						|
  var origPrepareStackTrace = Error.prepareStackTrace; | 
						|
 | 
						|
  Error.prepareStackTrace = function (_, stack) { | 
						|
    return stack; | 
						|
  }; | 
						|
 | 
						|
  var stack = new Error().stack; | 
						|
  Error.prepareStackTrace = origPrepareStackTrace; | 
						|
  return stack[2].getFileName(); | 
						|
}; | 
						|
 | 
						|
var pathParse = createCommonjsModule(function (module) { | 
						|
 | 
						|
  var isWindows = process.platform === 'win32'; // Regex to split a windows path into three parts: [*, device, slash, | 
						|
  // tail] windows-only | 
						|
 | 
						|
  var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; // Regex to split the tail part of the above into [*, dir, basename, ext] | 
						|
 | 
						|
  var splitTailRe = /^([\s\S]*?)((?:\.{1,2}|[^\\\/]+?|)(\.[^.\/\\]*|))(?:[\\\/]*)$/; | 
						|
  var win32 = {}; // Function to split a filename into [root, dir, basename, ext] | 
						|
 | 
						|
  function win32SplitPath(filename) { | 
						|
    // Separate device+slash from tail | 
						|
    var result = splitDeviceRe.exec(filename), | 
						|
        device = (result[1] || '') + (result[2] || ''), | 
						|
        tail = result[3] || ''; // Split the tail into dir, basename and extension | 
						|
 | 
						|
    var result2 = splitTailRe.exec(tail), | 
						|
        dir = result2[1], | 
						|
        basename = result2[2], | 
						|
        ext = result2[3]; | 
						|
    return [device, dir, basename, ext]; | 
						|
  } | 
						|
 | 
						|
  win32.parse = function (pathString) { | 
						|
    if (typeof pathString !== 'string') { | 
						|
      throw new TypeError("Parameter 'pathString' must be a string, not " + typeof pathString); | 
						|
    } | 
						|
 | 
						|
    var allParts = win32SplitPath(pathString); | 
						|
 | 
						|
    if (!allParts || allParts.length !== 4) { | 
						|
      throw new TypeError("Invalid path '" + pathString + "'"); | 
						|
    } | 
						|
 | 
						|
    return { | 
						|
      root: allParts[0], | 
						|
      dir: allParts[0] + allParts[1].slice(0, -1), | 
						|
      base: allParts[2], | 
						|
      ext: allParts[3], | 
						|
      name: allParts[2].slice(0, allParts[2].length - allParts[3].length) | 
						|
    }; | 
						|
  }; // Split a filename into [root, dir, basename, ext], unix version | 
						|
  // 'root' is just a slash, or nothing. | 
						|
 | 
						|
 | 
						|
  var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; | 
						|
  var posix = {}; | 
						|
 | 
						|
  function posixSplitPath(filename) { | 
						|
    return splitPathRe.exec(filename).slice(1); | 
						|
  } | 
						|
 | 
						|
  posix.parse = function (pathString) { | 
						|
    if (typeof pathString !== 'string') { | 
						|
      throw new TypeError("Parameter 'pathString' must be a string, not " + typeof pathString); | 
						|
    } | 
						|
 | 
						|
    var allParts = posixSplitPath(pathString); | 
						|
 | 
						|
    if (!allParts || allParts.length !== 4) { | 
						|
      throw new TypeError("Invalid path '" + pathString + "'"); | 
						|
    } | 
						|
 | 
						|
    allParts[1] = allParts[1] || ''; | 
						|
    allParts[2] = allParts[2] || ''; | 
						|
    allParts[3] = allParts[3] || ''; | 
						|
    return { | 
						|
      root: allParts[0], | 
						|
      dir: allParts[0] + allParts[1].slice(0, -1), | 
						|
      base: allParts[2], | 
						|
      ext: allParts[3], | 
						|
      name: allParts[2].slice(0, allParts[2].length - allParts[3].length) | 
						|
    }; | 
						|
  }; | 
						|
 | 
						|
  if (isWindows) module.exports = win32.parse;else | 
						|
    /* posix */ | 
						|
    module.exports = posix.parse; | 
						|
  module.exports.posix = posix.parse; | 
						|
  module.exports.win32 = win32.parse; | 
						|
}); | 
						|
var pathParse_1 = pathParse.posix; | 
						|
var pathParse_2 = pathParse.win32; | 
						|
 | 
						|
var parse$2 = path$2.parse || pathParse; | 
						|
 | 
						|
var getNodeModulesDirs = function getNodeModulesDirs(absoluteStart, modules) { | 
						|
  var prefix = '/'; | 
						|
 | 
						|
  if (/^([A-Za-z]:)/.test(absoluteStart)) { | 
						|
    prefix = ''; | 
						|
  } else if (/^\\\\/.test(absoluteStart)) { | 
						|
    prefix = '\\\\'; | 
						|
  } | 
						|
 | 
						|
  var paths = [absoluteStart]; | 
						|
  var parsed = parse$2(absoluteStart); | 
						|
 | 
						|
  while (parsed.dir !== paths[paths.length - 1]) { | 
						|
    paths.push(parsed.dir); | 
						|
    parsed = parse$2(parsed.dir); | 
						|
  } | 
						|
 | 
						|
  return paths.reduce(function (dirs, aPath) { | 
						|
    return dirs.concat(modules.map(function (moduleDir) { | 
						|
      return path$2.resolve(prefix, aPath, moduleDir); | 
						|
    })); | 
						|
  }, []); | 
						|
}; | 
						|
 | 
						|
var nodeModulesPaths = function nodeModulesPaths(start, opts, request) { | 
						|
  var modules = opts && opts.moduleDirectory ? [].concat(opts.moduleDirectory) : ['node_modules']; | 
						|
 | 
						|
  if (opts && typeof opts.paths === 'function') { | 
						|
    return opts.paths(request, start, function () { | 
						|
      return getNodeModulesDirs(start, modules); | 
						|
    }, opts); | 
						|
  } | 
						|
 | 
						|
  var dirs = getNodeModulesDirs(start, modules); | 
						|
  return opts && opts.paths ? dirs.concat(opts.paths) : dirs; | 
						|
}; | 
						|
 | 
						|
var normalizeOptions$2 = function normalizeOptions(x, opts) { | 
						|
  /** | 
						|
   * This file is purposefully a passthrough. It's expected that third-party | 
						|
   * environments will override it at runtime in order to inject special logic | 
						|
   * into `resolve` (by manipulating the options). One such example is the PnP | 
						|
   * code path in Yarn. | 
						|
   */ | 
						|
  return opts || {}; | 
						|
}; | 
						|
 | 
						|
var defaultIsFile = function isFile(file, cb) { | 
						|
  fs$1.stat(file, function (err, stat) { | 
						|
    if (!err) { | 
						|
      return cb(null, stat.isFile() || stat.isFIFO()); | 
						|
    } | 
						|
 | 
						|
    if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false); | 
						|
    return cb(err); | 
						|
  }); | 
						|
}; | 
						|
 | 
						|
var defaultIsDir = function isDirectory(dir, cb) { | 
						|
  fs$1.stat(dir, function (err, stat) { | 
						|
    if (!err) { | 
						|
      return cb(null, stat.isDirectory()); | 
						|
    } | 
						|
 | 
						|
    if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false); | 
						|
    return cb(err); | 
						|
  }); | 
						|
}; | 
						|
 | 
						|
var maybeUnwrapSymlink = function maybeUnwrapSymlink(x, opts, cb) { | 
						|
  if (opts && opts.preserveSymlinks === false) { | 
						|
    fs$1.realpath(x, function (realPathErr, realPath) { | 
						|
      if (realPathErr && realPathErr.code !== 'ENOENT') cb(realPathErr);else cb(null, realPathErr ? x : realPath); | 
						|
    }); | 
						|
  } else { | 
						|
    cb(null, x); | 
						|
  } | 
						|
}; | 
						|
 | 
						|
var async = function resolve(x, options, callback) { | 
						|
  var cb = callback; | 
						|
  var opts = options; | 
						|
 | 
						|
  if (typeof options === 'function') { | 
						|
    cb = opts; | 
						|
    opts = {}; | 
						|
  } | 
						|
 | 
						|
  if (typeof x !== 'string') { | 
						|
    var err = new TypeError('Path must be a string.'); | 
						|
    return process.nextTick(function () { | 
						|
      cb(err); | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  opts = normalizeOptions$2(x, opts); | 
						|
  var isFile = opts.isFile || defaultIsFile; | 
						|
  var isDirectory = opts.isDirectory || defaultIsDir; | 
						|
  var readFile = opts.readFile || fs$1.readFile; | 
						|
  var extensions = opts.extensions || ['.js']; | 
						|
  var basedir = opts.basedir || path$2.dirname(caller()); | 
						|
  var parent = opts.filename || basedir; | 
						|
  opts.paths = opts.paths || []; // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory | 
						|
 | 
						|
  var absoluteStart = path$2.resolve(basedir); | 
						|
  maybeUnwrapSymlink(absoluteStart, opts, function (err, realStart) { | 
						|
    if (err) cb(err);else init(realStart); | 
						|
  }); | 
						|
  var res; | 
						|
 | 
						|
  function init(basedir) { | 
						|
    if (/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/.test(x)) { | 
						|
      res = path$2.resolve(basedir, x); | 
						|
      if (x === '..' || x.slice(-1) === '/') res += '/'; | 
						|
 | 
						|
      if (/\/$/.test(x) && res === basedir) { | 
						|
        loadAsDirectory(res, opts.package, onfile); | 
						|
      } else loadAsFile(res, opts.package, onfile); | 
						|
    } else loadNodeModules(x, basedir, function (err, n, pkg) { | 
						|
      if (err) cb(err);else if (core_1[x]) return cb(null, x);else if (n) { | 
						|
        return maybeUnwrapSymlink(n, opts, function (err, realN) { | 
						|
          if (err) { | 
						|
            cb(err); | 
						|
          } else { | 
						|
            cb(null, realN, pkg); | 
						|
          } | 
						|
        }); | 
						|
      } else { | 
						|
        var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'"); | 
						|
        moduleError.code = 'MODULE_NOT_FOUND'; | 
						|
        cb(moduleError); | 
						|
      } | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  function onfile(err, m, pkg) { | 
						|
    if (err) cb(err);else if (m) cb(null, m, pkg);else loadAsDirectory(res, function (err, d, pkg) { | 
						|
      if (err) cb(err);else if (d) { | 
						|
        maybeUnwrapSymlink(d, opts, function (err, realD) { | 
						|
          if (err) { | 
						|
            cb(err); | 
						|
          } else { | 
						|
            cb(null, realD, pkg); | 
						|
          } | 
						|
        }); | 
						|
      } else { | 
						|
        var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'"); | 
						|
        moduleError.code = 'MODULE_NOT_FOUND'; | 
						|
        cb(moduleError); | 
						|
      } | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  function loadAsFile(x, thePackage, callback) { | 
						|
    var loadAsFilePackage = thePackage; | 
						|
    var cb = callback; | 
						|
 | 
						|
    if (typeof loadAsFilePackage === 'function') { | 
						|
      cb = loadAsFilePackage; | 
						|
      loadAsFilePackage = undefined; | 
						|
    } | 
						|
 | 
						|
    var exts = [''].concat(extensions); | 
						|
    load(exts, x, loadAsFilePackage); | 
						|
 | 
						|
    function load(exts, x, loadPackage) { | 
						|
      if (exts.length === 0) return cb(null, undefined, loadPackage); | 
						|
      var file = x + exts[0]; | 
						|
      var pkg = loadPackage; | 
						|
      if (pkg) onpkg(null, pkg);else loadpkg(path$2.dirname(file), onpkg); | 
						|
 | 
						|
      function onpkg(err, pkg_, dir) { | 
						|
        pkg = pkg_; | 
						|
        if (err) return cb(err); | 
						|
 | 
						|
        if (dir && pkg && opts.pathFilter) { | 
						|
          var rfile = path$2.relative(dir, file); | 
						|
          var rel = rfile.slice(0, rfile.length - exts[0].length); | 
						|
          var r = opts.pathFilter(pkg, x, rel); | 
						|
          if (r) return load([''].concat(extensions.slice()), path$2.resolve(dir, r), pkg); | 
						|
        } | 
						|
 | 
						|
        isFile(file, onex); | 
						|
      } | 
						|
 | 
						|
      function onex(err, ex) { | 
						|
        if (err) return cb(err); | 
						|
        if (ex) return cb(null, file, pkg); | 
						|
        load(exts.slice(1), x, pkg); | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  function loadpkg(dir, cb) { | 
						|
    if (dir === '' || dir === '/') return cb(null); | 
						|
 | 
						|
    if (process.platform === 'win32' && /^\w:[/\\]*$/.test(dir)) { | 
						|
      return cb(null); | 
						|
    } | 
						|
 | 
						|
    if (/[/\\]node_modules[/\\]*$/.test(dir)) return cb(null); | 
						|
    var pkgfile = path$2.join(dir, 'package.json'); | 
						|
    isFile(pkgfile, function (err, ex) { | 
						|
      // on err, ex is false | 
						|
      if (!ex) return loadpkg(path$2.dirname(dir), cb); | 
						|
      readFile(pkgfile, function (err, body) { | 
						|
        if (err) cb(err); | 
						|
 | 
						|
        try { | 
						|
          var pkg = JSON.parse(body); | 
						|
        } catch (jsonErr) {} | 
						|
 | 
						|
        if (pkg && opts.packageFilter) { | 
						|
          pkg = opts.packageFilter(pkg, pkgfile); | 
						|
        } | 
						|
 | 
						|
        cb(null, pkg, dir); | 
						|
      }); | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  function loadAsDirectory(x, loadAsDirectoryPackage, callback) { | 
						|
    var cb = callback; | 
						|
    var fpkg = loadAsDirectoryPackage; | 
						|
 | 
						|
    if (typeof fpkg === 'function') { | 
						|
      cb = fpkg; | 
						|
      fpkg = opts.package; | 
						|
    } | 
						|
 | 
						|
    var pkgfile = path$2.join(x, 'package.json'); | 
						|
    isFile(pkgfile, function (err, ex) { | 
						|
      if (err) return cb(err); | 
						|
      if (!ex) return loadAsFile(path$2.join(x, 'index'), fpkg, cb); | 
						|
      readFile(pkgfile, function (err, body) { | 
						|
        if (err) return cb(err); | 
						|
 | 
						|
        try { | 
						|
          var pkg = JSON.parse(body); | 
						|
        } catch (jsonErr) {} | 
						|
 | 
						|
        if (opts.packageFilter) { | 
						|
          pkg = opts.packageFilter(pkg, pkgfile); | 
						|
        } | 
						|
 | 
						|
        if (pkg.main) { | 
						|
          if (typeof pkg.main !== 'string') { | 
						|
            var mainError = new TypeError('package “' + pkg.name + '” `main` must be a string'); | 
						|
            mainError.code = 'INVALID_PACKAGE_MAIN'; | 
						|
            return cb(mainError); | 
						|
          } | 
						|
 | 
						|
          if (pkg.main === '.' || pkg.main === './') { | 
						|
            pkg.main = 'index'; | 
						|
          } | 
						|
 | 
						|
          loadAsFile(path$2.resolve(x, pkg.main), pkg, function (err, m, pkg) { | 
						|
            if (err) return cb(err); | 
						|
            if (m) return cb(null, m, pkg); | 
						|
            if (!pkg) return loadAsFile(path$2.join(x, 'index'), pkg, cb); | 
						|
            var dir = path$2.resolve(x, pkg.main); | 
						|
            loadAsDirectory(dir, pkg, function (err, n, pkg) { | 
						|
              if (err) return cb(err); | 
						|
              if (n) return cb(null, n, pkg); | 
						|
              loadAsFile(path$2.join(x, 'index'), pkg, cb); | 
						|
            }); | 
						|
          }); | 
						|
          return; | 
						|
        } | 
						|
 | 
						|
        loadAsFile(path$2.join(x, '/index'), pkg, cb); | 
						|
      }); | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  function processDirs(cb, dirs) { | 
						|
    if (dirs.length === 0) return cb(null, undefined); | 
						|
    var dir = dirs[0]; | 
						|
    isDirectory(dir, isdir); | 
						|
 | 
						|
    function isdir(err, isdir) { | 
						|
      if (err) return cb(err); | 
						|
      if (!isdir) return processDirs(cb, dirs.slice(1)); | 
						|
      var file = path$2.join(dir, x); | 
						|
      loadAsFile(file, opts.package, onfile); | 
						|
    } | 
						|
 | 
						|
    function onfile(err, m, pkg) { | 
						|
      if (err) return cb(err); | 
						|
      if (m) return cb(null, m, pkg); | 
						|
      loadAsDirectory(path$2.join(dir, x), opts.package, ondir); | 
						|
    } | 
						|
 | 
						|
    function ondir(err, n, pkg) { | 
						|
      if (err) return cb(err); | 
						|
      if (n) return cb(null, n, pkg); | 
						|
      processDirs(cb, dirs.slice(1)); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  function loadNodeModules(x, start, cb) { | 
						|
    processDirs(cb, nodeModulesPaths(start, opts, x)); | 
						|
  } | 
						|
}; | 
						|
 | 
						|
var defaultIsFile$1 = function isFile(file) { | 
						|
  try { | 
						|
    var stat = fs$1.statSync(file); | 
						|
  } catch (e) { | 
						|
    if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; | 
						|
    throw e; | 
						|
  } | 
						|
 | 
						|
  return stat.isFile() || stat.isFIFO(); | 
						|
}; | 
						|
 | 
						|
var defaultIsDir$1 = function isDirectory(dir) { | 
						|
  try { | 
						|
    var stat = fs$1.statSync(dir); | 
						|
  } catch (e) { | 
						|
    if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; | 
						|
    throw e; | 
						|
  } | 
						|
 | 
						|
  return stat.isDirectory(); | 
						|
}; | 
						|
 | 
						|
var maybeUnwrapSymlink$1 = function maybeUnwrapSymlink(x, opts) { | 
						|
  if (opts && opts.preserveSymlinks === false) { | 
						|
    try { | 
						|
      return fs$1.realpathSync(x); | 
						|
    } catch (realPathErr) { | 
						|
      if (realPathErr.code !== 'ENOENT') { | 
						|
        throw realPathErr; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return x; | 
						|
}; | 
						|
 | 
						|
var sync = function sync(x, options) { | 
						|
  if (typeof x !== 'string') { | 
						|
    throw new TypeError('Path must be a string.'); | 
						|
  } | 
						|
 | 
						|
  var opts = normalizeOptions$2(x, options); | 
						|
  var isFile = opts.isFile || defaultIsFile$1; | 
						|
  var readFileSync = opts.readFileSync || fs$1.readFileSync; | 
						|
  var isDirectory = opts.isDirectory || defaultIsDir$1; | 
						|
  var extensions = opts.extensions || ['.js']; | 
						|
  var basedir = opts.basedir || path$2.dirname(caller()); | 
						|
  var parent = opts.filename || basedir; | 
						|
  opts.paths = opts.paths || []; // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory | 
						|
 | 
						|
  var absoluteStart = maybeUnwrapSymlink$1(path$2.resolve(basedir), opts); | 
						|
 | 
						|
  if (/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/.test(x)) { | 
						|
    var res = path$2.resolve(absoluteStart, x); | 
						|
    if (x === '..' || x.slice(-1) === '/') res += '/'; | 
						|
    var m = loadAsFileSync(res) || loadAsDirectorySync(res); | 
						|
    if (m) return maybeUnwrapSymlink$1(m, opts); | 
						|
  } else if (core_1[x]) { | 
						|
    return x; | 
						|
  } else { | 
						|
    var n = loadNodeModulesSync(x, absoluteStart); | 
						|
    if (n) return maybeUnwrapSymlink$1(n, opts); | 
						|
  } | 
						|
 | 
						|
  if (core_1[x]) return x; | 
						|
  var err = new Error("Cannot find module '" + x + "' from '" + parent + "'"); | 
						|
  err.code = 'MODULE_NOT_FOUND'; | 
						|
  throw err; | 
						|
 | 
						|
  function loadAsFileSync(x) { | 
						|
    var pkg = loadpkg(path$2.dirname(x)); | 
						|
 | 
						|
    if (pkg && pkg.dir && pkg.pkg && opts.pathFilter) { | 
						|
      var rfile = path$2.relative(pkg.dir, x); | 
						|
      var r = opts.pathFilter(pkg.pkg, x, rfile); | 
						|
 | 
						|
      if (r) { | 
						|
        x = path$2.resolve(pkg.dir, r); // eslint-disable-line no-param-reassign | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    if (isFile(x)) { | 
						|
      return x; | 
						|
    } | 
						|
 | 
						|
    for (var i = 0; i < extensions.length; i++) { | 
						|
      var file = x + extensions[i]; | 
						|
 | 
						|
      if (isFile(file)) { | 
						|
        return file; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  function loadpkg(dir) { | 
						|
    if (dir === '' || dir === '/') return; | 
						|
 | 
						|
    if (process.platform === 'win32' && /^\w:[/\\]*$/.test(dir)) { | 
						|
      return; | 
						|
    } | 
						|
 | 
						|
    if (/[/\\]node_modules[/\\]*$/.test(dir)) return; | 
						|
    var pkgfile = path$2.join(dir, 'package.json'); | 
						|
 | 
						|
    if (!isFile(pkgfile)) { | 
						|
      return loadpkg(path$2.dirname(dir)); | 
						|
    } | 
						|
 | 
						|
    var body = readFileSync(pkgfile); | 
						|
 | 
						|
    try { | 
						|
      var pkg = JSON.parse(body); | 
						|
    } catch (jsonErr) {} | 
						|
 | 
						|
    if (pkg && opts.packageFilter) { | 
						|
      pkg = opts.packageFilter(pkg, dir); | 
						|
    } | 
						|
 | 
						|
    return { | 
						|
      pkg: pkg, | 
						|
      dir: dir | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  function loadAsDirectorySync(x) { | 
						|
    var pkgfile = path$2.join(x, '/package.json'); | 
						|
 | 
						|
    if (isFile(pkgfile)) { | 
						|
      try { | 
						|
        var body = readFileSync(pkgfile, 'UTF8'); | 
						|
        var pkg = JSON.parse(body); | 
						|
      } catch (e) {} | 
						|
 | 
						|
      if (opts.packageFilter) { | 
						|
        pkg = opts.packageFilter(pkg, x); | 
						|
      } | 
						|
 | 
						|
      if (pkg.main) { | 
						|
        if (typeof pkg.main !== 'string') { | 
						|
          var mainError = new TypeError('package “' + pkg.name + '” `main` must be a string'); | 
						|
          mainError.code = 'INVALID_PACKAGE_MAIN'; | 
						|
          throw mainError; | 
						|
        } | 
						|
 | 
						|
        if (pkg.main === '.' || pkg.main === './') { | 
						|
          pkg.main = 'index'; | 
						|
        } | 
						|
 | 
						|
        try { | 
						|
          var m = loadAsFileSync(path$2.resolve(x, pkg.main)); | 
						|
          if (m) return m; | 
						|
          var n = loadAsDirectorySync(path$2.resolve(x, pkg.main)); | 
						|
          if (n) return n; | 
						|
        } catch (e) {} | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return loadAsFileSync(path$2.join(x, '/index')); | 
						|
  } | 
						|
 | 
						|
  function loadNodeModulesSync(x, start) { | 
						|
    var dirs = nodeModulesPaths(start, opts, x); | 
						|
 | 
						|
    for (var i = 0; i < dirs.length; i++) { | 
						|
      var dir = dirs[i]; | 
						|
 | 
						|
      if (isDirectory(dir)) { | 
						|
        var m = loadAsFileSync(path$2.join(dir, '/', x)); | 
						|
        if (m) return m; | 
						|
        var n = loadAsDirectorySync(path$2.join(dir, '/', x)); | 
						|
        if (n) return n; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
}; | 
						|
 | 
						|
var resolve = createCommonjsModule(function (module, exports) { | 
						|
  async.core = core_1; | 
						|
 | 
						|
  async.isCore = function isCore(x) { | 
						|
    return core_1[x]; | 
						|
  }; | 
						|
 | 
						|
  async.sync = sync; | 
						|
  module.exports = async; | 
						|
}); | 
						|
 | 
						|
var mimicFn = function mimicFn(to, from) { | 
						|
  var _iteratorNormalCompletion = true; | 
						|
  var _didIteratorError = false; | 
						|
  var _iteratorError = undefined; | 
						|
 | 
						|
  try { | 
						|
    for (var _iterator = Reflect.ownKeys(from)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | 
						|
      var prop = _step.value; | 
						|
      Object.defineProperty(to, prop, Object.getOwnPropertyDescriptor(from, prop)); | 
						|
    } | 
						|
  } catch (err) { | 
						|
    _didIteratorError = true; | 
						|
    _iteratorError = err; | 
						|
  } finally { | 
						|
    try { | 
						|
      if (!_iteratorNormalCompletion && _iterator.return != null) { | 
						|
        _iterator.return(); | 
						|
      } | 
						|
    } finally { | 
						|
      if (_didIteratorError) { | 
						|
        throw _iteratorError; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return to; | 
						|
}; | 
						|
 | 
						|
var mimicFn_1 = mimicFn; // TODO: Remove this for the next major release | 
						|
 | 
						|
var default_1$4 = mimicFn; | 
						|
mimicFn_1.default = default_1$4; | 
						|
 | 
						|
var isPromise = function isPromise(input) { | 
						|
  return input instanceof Promise || input !== null && typeof input === 'object' && typeof input.then === 'function' && typeof input.catch === 'function'; | 
						|
}; | 
						|
 | 
						|
var pIsPromise = isPromise; // TODO: Remove this for the next major release | 
						|
 | 
						|
var default_1$5 = isPromise; | 
						|
pIsPromise.default = default_1$5; | 
						|
 | 
						|
var pDefer = function pDefer() { | 
						|
  var ret = {}; | 
						|
  ret.promise = new Promise(function (resolve, reject) { | 
						|
    ret.resolve = resolve; | 
						|
    ret.reject = reject; | 
						|
  }); | 
						|
  return ret; | 
						|
}; | 
						|
 | 
						|
var dist = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  var __awaiter = this && this.__awaiter || function (thisArg, _arguments, P, generator) { | 
						|
    return new (P || (P = Promise))(function (resolve, reject) { | 
						|
      function fulfilled(value) { | 
						|
        try { | 
						|
          step(generator.next(value)); | 
						|
        } catch (e) { | 
						|
          reject(e); | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      function rejected(value) { | 
						|
        try { | 
						|
          step(generator["throw"](value)); | 
						|
        } catch (e) { | 
						|
          reject(e); | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      function step(result) { | 
						|
        result.done ? resolve(result.value) : new P(function (resolve) { | 
						|
          resolve(result.value); | 
						|
        }).then(fulfilled, rejected); | 
						|
      } | 
						|
 | 
						|
      step((generator = generator.apply(thisArg, _arguments || [])).next()); | 
						|
    }); | 
						|
  }; | 
						|
 | 
						|
  var __importDefault = this && this.__importDefault || function (mod) { | 
						|
    return mod && mod.__esModule ? mod : { | 
						|
      "default": mod | 
						|
    }; | 
						|
  }; | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
 | 
						|
  var p_defer_1 = __importDefault(pDefer); | 
						|
 | 
						|
  function mapAgeCleaner(map) { | 
						|
    var _this = this; | 
						|
 | 
						|
    var property = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'maxAge'; | 
						|
    var processingKey; | 
						|
    var processingTimer; | 
						|
    var processingDeferred; | 
						|
 | 
						|
    var cleanup = function cleanup() { | 
						|
      return __awaiter(_this, void 0, void 0, | 
						|
      /*#__PURE__*/ | 
						|
      regeneratorRuntime.mark(function _callee2() { | 
						|
        var _this2 = this; | 
						|
 | 
						|
        var setupTimer, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, entry; | 
						|
 | 
						|
        return regeneratorRuntime.wrap(function _callee2$(_context2) { | 
						|
          while (1) { | 
						|
            switch (_context2.prev = _context2.next) { | 
						|
              case 0: | 
						|
                if (!(processingKey !== undefined)) { | 
						|
                  _context2.next = 2; | 
						|
                  break; | 
						|
                } | 
						|
 | 
						|
                return _context2.abrupt("return"); | 
						|
 | 
						|
              case 2: | 
						|
                setupTimer = function setupTimer(item) { | 
						|
                  return __awaiter(_this2, void 0, void 0, | 
						|
                  /*#__PURE__*/ | 
						|
                  regeneratorRuntime.mark(function _callee() { | 
						|
                    var delay; | 
						|
                    return regeneratorRuntime.wrap(function _callee$(_context) { | 
						|
                      while (1) { | 
						|
                        switch (_context.prev = _context.next) { | 
						|
                          case 0: | 
						|
                            processingDeferred = p_defer_1.default(); | 
						|
                            delay = item[1][property] - Date.now(); | 
						|
 | 
						|
                            if (!(delay <= 0)) { | 
						|
                              _context.next = 6; | 
						|
                              break; | 
						|
                            } | 
						|
 | 
						|
                            // Remove the item immediately if the delay is equal to or below 0 | 
						|
                            map.delete(item[0]); | 
						|
                            processingDeferred.resolve(); | 
						|
                            return _context.abrupt("return"); | 
						|
 | 
						|
                          case 6: | 
						|
                            // Keep track of the current processed key | 
						|
                            processingKey = item[0]; | 
						|
                            processingTimer = setTimeout(function () { | 
						|
                              // Remove the item when the timeout fires | 
						|
                              map.delete(item[0]); | 
						|
 | 
						|
                              if (processingDeferred) { | 
						|
                                processingDeferred.resolve(); | 
						|
                              } | 
						|
                            }, delay); // tslint:disable-next-line:strict-type-predicates | 
						|
 | 
						|
                            if (typeof processingTimer.unref === 'function') { | 
						|
                              // Don't hold up the process from exiting | 
						|
                              processingTimer.unref(); | 
						|
                            } | 
						|
 | 
						|
                            return _context.abrupt("return", processingDeferred.promise); | 
						|
 | 
						|
                          case 10: | 
						|
                          case "end": | 
						|
                            return _context.stop(); | 
						|
                        } | 
						|
                      } | 
						|
                    }, _callee); | 
						|
                  })); | 
						|
                }; | 
						|
 | 
						|
                _context2.prev = 3; | 
						|
                _iteratorNormalCompletion = true; | 
						|
                _didIteratorError = false; | 
						|
                _iteratorError = undefined; | 
						|
                _context2.prev = 7; | 
						|
                _iterator = map[Symbol.iterator](); | 
						|
 | 
						|
              case 9: | 
						|
                if (_iteratorNormalCompletion = (_step = _iterator.next()).done) { | 
						|
                  _context2.next = 16; | 
						|
                  break; | 
						|
                } | 
						|
 | 
						|
                entry = _step.value; | 
						|
                _context2.next = 13; | 
						|
                return setupTimer(entry); | 
						|
 | 
						|
              case 13: | 
						|
                _iteratorNormalCompletion = true; | 
						|
                _context2.next = 9; | 
						|
                break; | 
						|
 | 
						|
              case 16: | 
						|
                _context2.next = 22; | 
						|
                break; | 
						|
 | 
						|
              case 18: | 
						|
                _context2.prev = 18; | 
						|
                _context2.t0 = _context2["catch"](7); | 
						|
                _didIteratorError = true; | 
						|
                _iteratorError = _context2.t0; | 
						|
 | 
						|
              case 22: | 
						|
                _context2.prev = 22; | 
						|
                _context2.prev = 23; | 
						|
 | 
						|
                if (!_iteratorNormalCompletion && _iterator.return != null) { | 
						|
                  _iterator.return(); | 
						|
                } | 
						|
 | 
						|
              case 25: | 
						|
                _context2.prev = 25; | 
						|
 | 
						|
                if (!_didIteratorError) { | 
						|
                  _context2.next = 28; | 
						|
                  break; | 
						|
                } | 
						|
 | 
						|
                throw _iteratorError; | 
						|
 | 
						|
              case 28: | 
						|
                return _context2.finish(25); | 
						|
 | 
						|
              case 29: | 
						|
                return _context2.finish(22); | 
						|
 | 
						|
              case 30: | 
						|
                _context2.next = 34; | 
						|
                break; | 
						|
 | 
						|
              case 32: | 
						|
                _context2.prev = 32; | 
						|
                _context2.t1 = _context2["catch"](3); | 
						|
 | 
						|
              case 34: | 
						|
                processingKey = undefined; | 
						|
 | 
						|
              case 35: | 
						|
              case "end": | 
						|
                return _context2.stop(); | 
						|
            } | 
						|
          } | 
						|
        }, _callee2, null, [[3, 32], [7, 18, 22, 30], [23,, 25, 29]]); | 
						|
      })); | 
						|
    }; | 
						|
 | 
						|
    var reset = function reset() { | 
						|
      processingKey = undefined; | 
						|
 | 
						|
      if (processingTimer !== undefined) { | 
						|
        clearTimeout(processingTimer); | 
						|
        processingTimer = undefined; | 
						|
      } | 
						|
 | 
						|
      if (processingDeferred !== undefined) { | 
						|
        // tslint:disable-line:early-exit | 
						|
        processingDeferred.reject(undefined); | 
						|
        processingDeferred = undefined; | 
						|
      } | 
						|
    }; | 
						|
 | 
						|
    var originalSet = map.set.bind(map); | 
						|
 | 
						|
    map.set = function (key, value) { | 
						|
      if (map.has(key)) { | 
						|
        // If the key already exist, remove it so we can add it back at the end of the map. | 
						|
        map.delete(key); | 
						|
      } // Call the original `map.set` | 
						|
 | 
						|
 | 
						|
      var result = originalSet(key, value); // If we are already processing a key and the key added is the current processed key, stop processing it | 
						|
 | 
						|
      if (processingKey && processingKey === key) { | 
						|
        reset(); | 
						|
      } // Always run the cleanup method in case it wasn't started yet | 
						|
 | 
						|
 | 
						|
      cleanup(); // tslint:disable-line:no-floating-promises | 
						|
 | 
						|
      return result; | 
						|
    }; | 
						|
 | 
						|
    cleanup(); // tslint:disable-line:no-floating-promises | 
						|
 | 
						|
    return map; | 
						|
  } | 
						|
 | 
						|
  exports.default = mapAgeCleaner; // Add support for CJS | 
						|
 | 
						|
  module.exports = mapAgeCleaner; | 
						|
  module.exports.default = mapAgeCleaner; | 
						|
}); | 
						|
unwrapExports(dist); | 
						|
 | 
						|
var cacheStore = new WeakMap(); | 
						|
 | 
						|
var defaultCacheKey = function defaultCacheKey() { | 
						|
  for (var _len = arguments.length, arguments_ = new Array(_len), _key = 0; _key < _len; _key++) { | 
						|
    arguments_[_key] = arguments[_key]; | 
						|
  } | 
						|
 | 
						|
  if (arguments_.length === 0) { | 
						|
    return '__defaultKey'; | 
						|
  } | 
						|
 | 
						|
  if (arguments_.length === 1) { | 
						|
    var firstArgument = arguments_[0]; | 
						|
    var isObject = typeof firstArgument === 'object' && firstArgument !== null; | 
						|
    var isPrimitive = !isObject; | 
						|
 | 
						|
    if (isPrimitive) { | 
						|
      return firstArgument; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return JSON.stringify(arguments_); | 
						|
}; | 
						|
 | 
						|
var mem = function mem(fn) { | 
						|
  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, | 
						|
      _ref$cacheKey = _ref.cacheKey, | 
						|
      cacheKey = _ref$cacheKey === void 0 ? defaultCacheKey : _ref$cacheKey, | 
						|
      _ref$cache = _ref.cache, | 
						|
      cache = _ref$cache === void 0 ? new Map() : _ref$cache, | 
						|
      _ref$cachePromiseReje = _ref.cachePromiseRejection, | 
						|
      cachePromiseRejection = _ref$cachePromiseReje === void 0 ? true : _ref$cachePromiseReje, | 
						|
      maxAge = _ref.maxAge; | 
						|
 | 
						|
  if (typeof maxAge === 'number') { | 
						|
    dist(cache); | 
						|
  } | 
						|
 | 
						|
  var memoized = function memoized() { | 
						|
    for (var _len2 = arguments.length, arguments_ = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { | 
						|
      arguments_[_key2] = arguments[_key2]; | 
						|
    } | 
						|
 | 
						|
    var key = cacheKey.apply(void 0, arguments_); | 
						|
 | 
						|
    if (cache.has(key)) { | 
						|
      return cache.get(key).data; | 
						|
    } | 
						|
 | 
						|
    var cacheItem = fn.apply(this, arguments_); | 
						|
    cache.set(key, { | 
						|
      data: cacheItem, | 
						|
      maxAge: maxAge ? Date.now() + maxAge : Infinity | 
						|
    }); | 
						|
 | 
						|
    if (pIsPromise(cacheItem) && cachePromiseRejection === false) { | 
						|
      cacheItem.catch(function () { | 
						|
        return cache.delete(key); | 
						|
      }); | 
						|
    } | 
						|
 | 
						|
    return cacheItem; | 
						|
  }; | 
						|
 | 
						|
  try { | 
						|
    // The below call will throw in some host environments | 
						|
    // See https://github.com/sindresorhus/mimic-fn/issues/10 | 
						|
    mimicFn_1(memoized, fn); | 
						|
  } catch (_) {} | 
						|
 | 
						|
  cacheStore.set(memoized, cache); | 
						|
  return memoized; | 
						|
}; | 
						|
 | 
						|
var mem_1 = mem; | 
						|
 | 
						|
var clear = function clear(fn) { | 
						|
  var cache = cacheStore.get(fn); | 
						|
 | 
						|
  if (cache && typeof cache.clear === 'function') { | 
						|
    cache.clear(); | 
						|
  } | 
						|
}; | 
						|
mem_1.clear = clear; | 
						|
 | 
						|
var semver$1 = createCommonjsModule(function (module, exports) { | 
						|
  exports = module.exports = SemVer; // The debug function is excluded entirely from the minified version. | 
						|
 | 
						|
  /* nomin */ | 
						|
 | 
						|
  var debug; | 
						|
  /* nomin */ | 
						|
 | 
						|
  if (typeof process === 'object' && | 
						|
  /* nomin */ | 
						|
  process.env && | 
						|
  /* nomin */ | 
						|
  process.env.NODE_DEBUG && | 
						|
  /* nomin */ | 
						|
  /\bsemver\b/i.test(process.env.NODE_DEBUG)) | 
						|
    /* nomin */ | 
						|
    debug = function debug() { | 
						|
      /* nomin */ | 
						|
      var args = Array.prototype.slice.call(arguments, 0); | 
						|
      /* nomin */ | 
						|
 | 
						|
      args.unshift('SEMVER'); | 
						|
      /* nomin */ | 
						|
 | 
						|
      console.log.apply(console, args); | 
						|
      /* nomin */ | 
						|
    }; | 
						|
    /* nomin */ | 
						|
  else | 
						|
    /* nomin */ | 
						|
    debug = function debug() {}; // Note: this is the semver.org version of the spec that it implements | 
						|
  // Not necessarily the package version of this code. | 
						|
 | 
						|
  exports.SEMVER_SPEC_VERSION = '2.0.0'; | 
						|
  var MAX_LENGTH = 256; | 
						|
  var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; // Max safe segment length for coercion. | 
						|
 | 
						|
  var MAX_SAFE_COMPONENT_LENGTH = 16; // The actual regexps go on exports.re | 
						|
 | 
						|
  var re = exports.re = []; | 
						|
  var src = exports.src = []; | 
						|
  var R = 0; // The following Regular Expressions can be used for tokenizing, | 
						|
  // validating, and parsing SemVer version strings. | 
						|
  // ## Numeric Identifier | 
						|
  // A single `0`, or a non-zero digit followed by zero or more digits. | 
						|
 | 
						|
  var NUMERICIDENTIFIER = R++; | 
						|
  src[NUMERICIDENTIFIER] = '0|[1-9]\\d*'; | 
						|
  var NUMERICIDENTIFIERLOOSE = R++; | 
						|
  src[NUMERICIDENTIFIERLOOSE] = '[0-9]+'; // ## Non-numeric Identifier | 
						|
  // Zero or more digits, followed by a letter or hyphen, and then zero or | 
						|
  // more letters, digits, or hyphens. | 
						|
 | 
						|
  var NONNUMERICIDENTIFIER = R++; | 
						|
  src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'; // ## Main Version | 
						|
  // Three dot-separated numeric identifiers. | 
						|
 | 
						|
  var MAINVERSION = R++; | 
						|
  src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' + '(' + src[NUMERICIDENTIFIER] + ')\\.' + '(' + src[NUMERICIDENTIFIER] + ')'; | 
						|
  var MAINVERSIONLOOSE = R++; | 
						|
  src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + '(' + src[NUMERICIDENTIFIERLOOSE] + ')'; // ## Pre-release Version Identifier | 
						|
  // A numeric identifier, or a non-numeric identifier. | 
						|
 | 
						|
  var PRERELEASEIDENTIFIER = R++; | 
						|
  src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] + '|' + src[NONNUMERICIDENTIFIER] + ')'; | 
						|
  var PRERELEASEIDENTIFIERLOOSE = R++; | 
						|
  src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] + '|' + src[NONNUMERICIDENTIFIER] + ')'; // ## Pre-release Version | 
						|
  // Hyphen, followed by one or more dot-separated pre-release version | 
						|
  // identifiers. | 
						|
 | 
						|
  var PRERELEASE = R++; | 
						|
  src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] + '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))'; | 
						|
  var PRERELEASELOOSE = R++; | 
						|
  src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] + '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))'; // ## Build Metadata Identifier | 
						|
  // Any combination of digits, letters, or hyphens. | 
						|
 | 
						|
  var BUILDIDENTIFIER = R++; | 
						|
  src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+'; // ## Build Metadata | 
						|
  // Plus sign, followed by one or more period-separated build metadata | 
						|
  // identifiers. | 
						|
 | 
						|
  var BUILD = R++; | 
						|
  src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] + '(?:\\.' + src[BUILDIDENTIFIER] + ')*))'; // ## Full Version String | 
						|
  // A main version, followed optionally by a pre-release version and | 
						|
  // build metadata. | 
						|
  // Note that the only major, minor, patch, and pre-release sections of | 
						|
  // the version string are capturing groups.  The build metadata is not a | 
						|
  // capturing group, because it should not ever be used in version | 
						|
  // comparison. | 
						|
 | 
						|
  var FULL = R++; | 
						|
  var FULLPLAIN = 'v?' + src[MAINVERSION] + src[PRERELEASE] + '?' + src[BUILD] + '?'; | 
						|
  src[FULL] = '^' + FULLPLAIN + '$'; // like full, but allows v1.2.3 and =1.2.3, which people do sometimes. | 
						|
  // also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty | 
						|
  // common in the npm registry. | 
						|
 | 
						|
  var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] + src[PRERELEASELOOSE] + '?' + src[BUILD] + '?'; | 
						|
  var LOOSE = R++; | 
						|
  src[LOOSE] = '^' + LOOSEPLAIN + '$'; | 
						|
  var GTLT = R++; | 
						|
  src[GTLT] = '((?:<|>)?=?)'; // Something like "2.*" or "1.2.x". | 
						|
  // Note that "x.x" is a valid xRange identifer, meaning "any version" | 
						|
  // Only the first item is strictly required. | 
						|
 | 
						|
  var XRANGEIDENTIFIERLOOSE = R++; | 
						|
  src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'; | 
						|
  var XRANGEIDENTIFIER = R++; | 
						|
  src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*'; | 
						|
  var XRANGEPLAIN = R++; | 
						|
  src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + '(?:' + src[PRERELEASE] + ')?' + src[BUILD] + '?' + ')?)?'; | 
						|
  var XRANGEPLAINLOOSE = R++; | 
						|
  src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + '(?:' + src[PRERELEASELOOSE] + ')?' + src[BUILD] + '?' + ')?)?'; | 
						|
  var XRANGE = R++; | 
						|
  src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$'; | 
						|
  var XRANGELOOSE = R++; | 
						|
  src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$'; // Coercion. | 
						|
  // Extract anything that could conceivably be a part of a valid semver | 
						|
 | 
						|
  var COERCE = R++; | 
						|
  src[COERCE] = '(?:^|[^\\d])' + '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + '(?:$|[^\\d])'; // Tilde ranges. | 
						|
  // Meaning is "reasonably at or greater than" | 
						|
 | 
						|
  var LONETILDE = R++; | 
						|
  src[LONETILDE] = '(?:~>?)'; | 
						|
  var TILDETRIM = R++; | 
						|
  src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+'; | 
						|
  re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g'); | 
						|
  var tildeTrimReplace = '$1~'; | 
						|
  var TILDE = R++; | 
						|
  src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$'; | 
						|
  var TILDELOOSE = R++; | 
						|
  src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$'; // Caret ranges. | 
						|
  // Meaning is "at least and backwards compatible with" | 
						|
 | 
						|
  var LONECARET = R++; | 
						|
  src[LONECARET] = '(?:\\^)'; | 
						|
  var CARETTRIM = R++; | 
						|
  src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+'; | 
						|
  re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g'); | 
						|
  var caretTrimReplace = '$1^'; | 
						|
  var CARET = R++; | 
						|
  src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$'; | 
						|
  var CARETLOOSE = R++; | 
						|
  src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$'; // A simple gt/lt/eq thing, or just "" to indicate "any version" | 
						|
 | 
						|
  var COMPARATORLOOSE = R++; | 
						|
  src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$'; | 
						|
  var COMPARATOR = R++; | 
						|
  src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$'; // An expression to strip any whitespace between the gtlt and the thing | 
						|
  // it modifies, so that `> 1.2.3` ==> `>1.2.3` | 
						|
 | 
						|
  var COMPARATORTRIM = R++; | 
						|
  src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] + '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')'; // this one has to use the /g flag | 
						|
 | 
						|
  re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g'); | 
						|
  var comparatorTrimReplace = '$1$2$3'; // Something like `1.2.3 - 1.2.4` | 
						|
  // Note that these all use the loose form, because they'll be | 
						|
  // checked against either the strict or loose comparator form | 
						|
  // later. | 
						|
 | 
						|
  var HYPHENRANGE = R++; | 
						|
  src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' + '\\s+-\\s+' + '(' + src[XRANGEPLAIN] + ')' + '\\s*$'; | 
						|
  var HYPHENRANGELOOSE = R++; | 
						|
  src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' + '\\s+-\\s+' + '(' + src[XRANGEPLAINLOOSE] + ')' + '\\s*$'; // Star ranges basically just allow anything at all. | 
						|
 | 
						|
  var STAR = R++; | 
						|
  src[STAR] = '(<|>)?=?\\s*\\*'; // Compile to actual regexp objects. | 
						|
  // All are flag-free, unless they were created above with a flag. | 
						|
 | 
						|
  for (var i = 0; i < R; i++) { | 
						|
    debug(i, src[i]); | 
						|
    if (!re[i]) re[i] = new RegExp(src[i]); | 
						|
  } | 
						|
 | 
						|
  exports.parse = parse; | 
						|
 | 
						|
  function parse(version, options) { | 
						|
    if (!options || typeof options !== 'object') options = { | 
						|
      loose: !!options, | 
						|
      includePrerelease: false | 
						|
    }; | 
						|
    if (version instanceof SemVer) return version; | 
						|
    if (typeof version !== 'string') return null; | 
						|
    if (version.length > MAX_LENGTH) return null; | 
						|
    var r = options.loose ? re[LOOSE] : re[FULL]; | 
						|
    if (!r.test(version)) return null; | 
						|
 | 
						|
    try { | 
						|
      return new SemVer(version, options); | 
						|
    } catch (er) { | 
						|
      return null; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  exports.valid = valid; | 
						|
 | 
						|
  function valid(version, options) { | 
						|
    var v = parse(version, options); | 
						|
    return v ? v.version : null; | 
						|
  } | 
						|
 | 
						|
  exports.clean = clean; | 
						|
 | 
						|
  function clean(version, options) { | 
						|
    var s = parse(version.trim().replace(/^[=v]+/, ''), options); | 
						|
    return s ? s.version : null; | 
						|
  } | 
						|
 | 
						|
  exports.SemVer = SemVer; | 
						|
 | 
						|
  function SemVer(version, options) { | 
						|
    if (!options || typeof options !== 'object') options = { | 
						|
      loose: !!options, | 
						|
      includePrerelease: false | 
						|
    }; | 
						|
 | 
						|
    if (version instanceof SemVer) { | 
						|
      if (version.loose === options.loose) return version;else version = version.version; | 
						|
    } else if (typeof version !== 'string') { | 
						|
      throw new TypeError('Invalid Version: ' + version); | 
						|
    } | 
						|
 | 
						|
    if (version.length > MAX_LENGTH) throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters'); | 
						|
    if (!(this instanceof SemVer)) return new SemVer(version, options); | 
						|
    debug('SemVer', version, options); | 
						|
    this.options = options; | 
						|
    this.loose = !!options.loose; | 
						|
    var m = version.trim().match(options.loose ? re[LOOSE] : re[FULL]); | 
						|
    if (!m) throw new TypeError('Invalid Version: ' + version); | 
						|
    this.raw = version; // these are actually numbers | 
						|
 | 
						|
    this.major = +m[1]; | 
						|
    this.minor = +m[2]; | 
						|
    this.patch = +m[3]; | 
						|
    if (this.major > MAX_SAFE_INTEGER || this.major < 0) throw new TypeError('Invalid major version'); | 
						|
    if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) throw new TypeError('Invalid minor version'); | 
						|
    if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) throw new TypeError('Invalid patch version'); // numberify any prerelease numeric ids | 
						|
 | 
						|
    if (!m[4]) this.prerelease = [];else this.prerelease = m[4].split('.').map(function (id) { | 
						|
      if (/^[0-9]+$/.test(id)) { | 
						|
        var num = +id; | 
						|
        if (num >= 0 && num < MAX_SAFE_INTEGER) return num; | 
						|
      } | 
						|
 | 
						|
      return id; | 
						|
    }); | 
						|
    this.build = m[5] ? m[5].split('.') : []; | 
						|
    this.format(); | 
						|
  } | 
						|
 | 
						|
  SemVer.prototype.format = function () { | 
						|
    this.version = this.major + '.' + this.minor + '.' + this.patch; | 
						|
    if (this.prerelease.length) this.version += '-' + this.prerelease.join('.'); | 
						|
    return this.version; | 
						|
  }; | 
						|
 | 
						|
  SemVer.prototype.toString = function () { | 
						|
    return this.version; | 
						|
  }; | 
						|
 | 
						|
  SemVer.prototype.compare = function (other) { | 
						|
    debug('SemVer.compare', this.version, this.options, other); | 
						|
    if (!(other instanceof SemVer)) other = new SemVer(other, this.options); | 
						|
    return this.compareMain(other) || this.comparePre(other); | 
						|
  }; | 
						|
 | 
						|
  SemVer.prototype.compareMain = function (other) { | 
						|
    if (!(other instanceof SemVer)) other = new SemVer(other, this.options); | 
						|
    return compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch); | 
						|
  }; | 
						|
 | 
						|
  SemVer.prototype.comparePre = function (other) { | 
						|
    if (!(other instanceof SemVer)) other = new SemVer(other, this.options); // NOT having a prerelease is > having one | 
						|
 | 
						|
    if (this.prerelease.length && !other.prerelease.length) return -1;else if (!this.prerelease.length && other.prerelease.length) return 1;else if (!this.prerelease.length && !other.prerelease.length) return 0; | 
						|
    var i = 0; | 
						|
 | 
						|
    do { | 
						|
      var a = this.prerelease[i]; | 
						|
      var b = other.prerelease[i]; | 
						|
      debug('prerelease compare', i, a, b); | 
						|
      if (a === undefined && b === undefined) return 0;else if (b === undefined) return 1;else if (a === undefined) return -1;else if (a === b) continue;else return compareIdentifiers(a, b); | 
						|
    } while (++i); | 
						|
  }; // preminor will bump the version up to the next minor release, and immediately | 
						|
  // down to pre-release. premajor and prepatch work the same way. | 
						|
 | 
						|
 | 
						|
  SemVer.prototype.inc = function (release, identifier) { | 
						|
    switch (release) { | 
						|
      case 'premajor': | 
						|
        this.prerelease.length = 0; | 
						|
        this.patch = 0; | 
						|
        this.minor = 0; | 
						|
        this.major++; | 
						|
        this.inc('pre', identifier); | 
						|
        break; | 
						|
 | 
						|
      case 'preminor': | 
						|
        this.prerelease.length = 0; | 
						|
        this.patch = 0; | 
						|
        this.minor++; | 
						|
        this.inc('pre', identifier); | 
						|
        break; | 
						|
 | 
						|
      case 'prepatch': | 
						|
        // If this is already a prerelease, it will bump to the next version | 
						|
        // drop any prereleases that might already exist, since they are not | 
						|
        // relevant at this point. | 
						|
        this.prerelease.length = 0; | 
						|
        this.inc('patch', identifier); | 
						|
        this.inc('pre', identifier); | 
						|
        break; | 
						|
      // If the input is a non-prerelease version, this acts the same as | 
						|
      // prepatch. | 
						|
 | 
						|
      case 'prerelease': | 
						|
        if (this.prerelease.length === 0) this.inc('patch', identifier); | 
						|
        this.inc('pre', identifier); | 
						|
        break; | 
						|
 | 
						|
      case 'major': | 
						|
        // If this is a pre-major version, bump up to the same major version. | 
						|
        // Otherwise increment major. | 
						|
        // 1.0.0-5 bumps to 1.0.0 | 
						|
        // 1.1.0 bumps to 2.0.0 | 
						|
        if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) this.major++; | 
						|
        this.minor = 0; | 
						|
        this.patch = 0; | 
						|
        this.prerelease = []; | 
						|
        break; | 
						|
 | 
						|
      case 'minor': | 
						|
        // If this is a pre-minor version, bump up to the same minor version. | 
						|
        // Otherwise increment minor. | 
						|
        // 1.2.0-5 bumps to 1.2.0 | 
						|
        // 1.2.1 bumps to 1.3.0 | 
						|
        if (this.patch !== 0 || this.prerelease.length === 0) this.minor++; | 
						|
        this.patch = 0; | 
						|
        this.prerelease = []; | 
						|
        break; | 
						|
 | 
						|
      case 'patch': | 
						|
        // If this is not a pre-release version, it will increment the patch. | 
						|
        // If it is a pre-release it will bump up to the same patch version. | 
						|
        // 1.2.0-5 patches to 1.2.0 | 
						|
        // 1.2.0 patches to 1.2.1 | 
						|
        if (this.prerelease.length === 0) this.patch++; | 
						|
        this.prerelease = []; | 
						|
        break; | 
						|
      // This probably shouldn't be used publicly. | 
						|
      // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. | 
						|
 | 
						|
      case 'pre': | 
						|
        if (this.prerelease.length === 0) this.prerelease = [0];else { | 
						|
          var i = this.prerelease.length; | 
						|
 | 
						|
          while (--i >= 0) { | 
						|
            if (typeof this.prerelease[i] === 'number') { | 
						|
              this.prerelease[i]++; | 
						|
              i = -2; | 
						|
            } | 
						|
          } | 
						|
 | 
						|
          if (i === -1) // didn't increment anything | 
						|
            this.prerelease.push(0); | 
						|
        } | 
						|
 | 
						|
        if (identifier) { | 
						|
          // 1.2.0-beta.1 bumps to 1.2.0-beta.2, | 
						|
          // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 | 
						|
          if (this.prerelease[0] === identifier) { | 
						|
            if (isNaN(this.prerelease[1])) this.prerelease = [identifier, 0]; | 
						|
          } else this.prerelease = [identifier, 0]; | 
						|
        } | 
						|
 | 
						|
        break; | 
						|
 | 
						|
      default: | 
						|
        throw new Error('invalid increment argument: ' + release); | 
						|
    } | 
						|
 | 
						|
    this.format(); | 
						|
    this.raw = this.version; | 
						|
    return this; | 
						|
  }; | 
						|
 | 
						|
  exports.inc = inc; | 
						|
 | 
						|
  function inc(version, release, loose, identifier) { | 
						|
    if (typeof loose === 'string') { | 
						|
      identifier = loose; | 
						|
      loose = undefined; | 
						|
    } | 
						|
 | 
						|
    try { | 
						|
      return new SemVer(version, loose).inc(release, identifier).version; | 
						|
    } catch (er) { | 
						|
      return null; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  exports.diff = diff; | 
						|
 | 
						|
  function diff(version1, version2) { | 
						|
    if (eq(version1, version2)) { | 
						|
      return null; | 
						|
    } else { | 
						|
      var v1 = parse(version1); | 
						|
      var v2 = parse(version2); | 
						|
 | 
						|
      if (v1.prerelease.length || v2.prerelease.length) { | 
						|
        for (var key in v1) { | 
						|
          if (key === 'major' || key === 'minor' || key === 'patch') { | 
						|
            if (v1[key] !== v2[key]) { | 
						|
              return 'pre' + key; | 
						|
            } | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        return 'prerelease'; | 
						|
      } | 
						|
 | 
						|
      for (var key in v1) { | 
						|
        if (key === 'major' || key === 'minor' || key === 'patch') { | 
						|
          if (v1[key] !== v2[key]) { | 
						|
            return key; | 
						|
          } | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  exports.compareIdentifiers = compareIdentifiers; | 
						|
  var numeric = /^[0-9]+$/; | 
						|
 | 
						|
  function compareIdentifiers(a, b) { | 
						|
    var anum = numeric.test(a); | 
						|
    var bnum = numeric.test(b); | 
						|
 | 
						|
    if (anum && bnum) { | 
						|
      a = +a; | 
						|
      b = +b; | 
						|
    } | 
						|
 | 
						|
    return anum && !bnum ? -1 : bnum && !anum ? 1 : a < b ? -1 : a > b ? 1 : 0; | 
						|
  } | 
						|
 | 
						|
  exports.rcompareIdentifiers = rcompareIdentifiers; | 
						|
 | 
						|
  function rcompareIdentifiers(a, b) { | 
						|
    return compareIdentifiers(b, a); | 
						|
  } | 
						|
 | 
						|
  exports.major = major; | 
						|
 | 
						|
  function major(a, loose) { | 
						|
    return new SemVer(a, loose).major; | 
						|
  } | 
						|
 | 
						|
  exports.minor = minor; | 
						|
 | 
						|
  function minor(a, loose) { | 
						|
    return new SemVer(a, loose).minor; | 
						|
  } | 
						|
 | 
						|
  exports.patch = patch; | 
						|
 | 
						|
  function patch(a, loose) { | 
						|
    return new SemVer(a, loose).patch; | 
						|
  } | 
						|
 | 
						|
  exports.compare = compare; | 
						|
 | 
						|
  function compare(a, b, loose) { | 
						|
    return new SemVer(a, loose).compare(new SemVer(b, loose)); | 
						|
  } | 
						|
 | 
						|
  exports.compareLoose = compareLoose; | 
						|
 | 
						|
  function compareLoose(a, b) { | 
						|
    return compare(a, b, true); | 
						|
  } | 
						|
 | 
						|
  exports.rcompare = rcompare; | 
						|
 | 
						|
  function rcompare(a, b, loose) { | 
						|
    return compare(b, a, loose); | 
						|
  } | 
						|
 | 
						|
  exports.sort = sort; | 
						|
 | 
						|
  function sort(list, loose) { | 
						|
    return list.sort(function (a, b) { | 
						|
      return exports.compare(a, b, loose); | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  exports.rsort = rsort; | 
						|
 | 
						|
  function rsort(list, loose) { | 
						|
    return list.sort(function (a, b) { | 
						|
      return exports.rcompare(a, b, loose); | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  exports.gt = gt; | 
						|
 | 
						|
  function gt(a, b, loose) { | 
						|
    return compare(a, b, loose) > 0; | 
						|
  } | 
						|
 | 
						|
  exports.lt = lt; | 
						|
 | 
						|
  function lt(a, b, loose) { | 
						|
    return compare(a, b, loose) < 0; | 
						|
  } | 
						|
 | 
						|
  exports.eq = eq; | 
						|
 | 
						|
  function eq(a, b, loose) { | 
						|
    return compare(a, b, loose) === 0; | 
						|
  } | 
						|
 | 
						|
  exports.neq = neq; | 
						|
 | 
						|
  function neq(a, b, loose) { | 
						|
    return compare(a, b, loose) !== 0; | 
						|
  } | 
						|
 | 
						|
  exports.gte = gte; | 
						|
 | 
						|
  function gte(a, b, loose) { | 
						|
    return compare(a, b, loose) >= 0; | 
						|
  } | 
						|
 | 
						|
  exports.lte = lte; | 
						|
 | 
						|
  function lte(a, b, loose) { | 
						|
    return compare(a, b, loose) <= 0; | 
						|
  } | 
						|
 | 
						|
  exports.cmp = cmp; | 
						|
 | 
						|
  function cmp(a, op, b, loose) { | 
						|
    var ret; | 
						|
 | 
						|
    switch (op) { | 
						|
      case '===': | 
						|
        if (typeof a === 'object') a = a.version; | 
						|
        if (typeof b === 'object') b = b.version; | 
						|
        ret = a === b; | 
						|
        break; | 
						|
 | 
						|
      case '!==': | 
						|
        if (typeof a === 'object') a = a.version; | 
						|
        if (typeof b === 'object') b = b.version; | 
						|
        ret = a !== b; | 
						|
        break; | 
						|
 | 
						|
      case '': | 
						|
      case '=': | 
						|
      case '==': | 
						|
        ret = eq(a, b, loose); | 
						|
        break; | 
						|
 | 
						|
      case '!=': | 
						|
        ret = neq(a, b, loose); | 
						|
        break; | 
						|
 | 
						|
      case '>': | 
						|
        ret = gt(a, b, loose); | 
						|
        break; | 
						|
 | 
						|
      case '>=': | 
						|
        ret = gte(a, b, loose); | 
						|
        break; | 
						|
 | 
						|
      case '<': | 
						|
        ret = lt(a, b, loose); | 
						|
        break; | 
						|
 | 
						|
      case '<=': | 
						|
        ret = lte(a, b, loose); | 
						|
        break; | 
						|
 | 
						|
      default: | 
						|
        throw new TypeError('Invalid operator: ' + op); | 
						|
    } | 
						|
 | 
						|
    return ret; | 
						|
  } | 
						|
 | 
						|
  exports.Comparator = Comparator; | 
						|
 | 
						|
  function Comparator(comp, options) { | 
						|
    if (!options || typeof options !== 'object') options = { | 
						|
      loose: !!options, | 
						|
      includePrerelease: false | 
						|
    }; | 
						|
 | 
						|
    if (comp instanceof Comparator) { | 
						|
      if (comp.loose === !!options.loose) return comp;else comp = comp.value; | 
						|
    } | 
						|
 | 
						|
    if (!(this instanceof Comparator)) return new Comparator(comp, options); | 
						|
    debug('comparator', comp, options); | 
						|
    this.options = options; | 
						|
    this.loose = !!options.loose; | 
						|
    this.parse(comp); | 
						|
    if (this.semver === ANY) this.value = '';else this.value = this.operator + this.semver.version; | 
						|
    debug('comp', this); | 
						|
  } | 
						|
 | 
						|
  var ANY = {}; | 
						|
 | 
						|
  Comparator.prototype.parse = function (comp) { | 
						|
    var r = this.options.loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; | 
						|
    var m = comp.match(r); | 
						|
    if (!m) throw new TypeError('Invalid comparator: ' + comp); | 
						|
    this.operator = m[1]; | 
						|
    if (this.operator === '=') this.operator = ''; // if it literally is just '>' or '' then allow anything. | 
						|
 | 
						|
    if (!m[2]) this.semver = ANY;else this.semver = new SemVer(m[2], this.options.loose); | 
						|
  }; | 
						|
 | 
						|
  Comparator.prototype.toString = function () { | 
						|
    return this.value; | 
						|
  }; | 
						|
 | 
						|
  Comparator.prototype.test = function (version) { | 
						|
    debug('Comparator.test', version, this.options.loose); | 
						|
    if (this.semver === ANY) return true; | 
						|
    if (typeof version === 'string') version = new SemVer(version, this.options); | 
						|
    return cmp(version, this.operator, this.semver, this.options); | 
						|
  }; | 
						|
 | 
						|
  Comparator.prototype.intersects = function (comp, options) { | 
						|
    if (!(comp instanceof Comparator)) { | 
						|
      throw new TypeError('a Comparator is required'); | 
						|
    } | 
						|
 | 
						|
    if (!options || typeof options !== 'object') options = { | 
						|
      loose: !!options, | 
						|
      includePrerelease: false | 
						|
    }; | 
						|
    var rangeTmp; | 
						|
 | 
						|
    if (this.operator === '') { | 
						|
      rangeTmp = new Range(comp.value, options); | 
						|
      return satisfies(this.value, rangeTmp, options); | 
						|
    } else if (comp.operator === '') { | 
						|
      rangeTmp = new Range(this.value, options); | 
						|
      return satisfies(comp.semver, rangeTmp, options); | 
						|
    } | 
						|
 | 
						|
    var sameDirectionIncreasing = (this.operator === '>=' || this.operator === '>') && (comp.operator === '>=' || comp.operator === '>'); | 
						|
    var sameDirectionDecreasing = (this.operator === '<=' || this.operator === '<') && (comp.operator === '<=' || comp.operator === '<'); | 
						|
    var sameSemVer = this.semver.version === comp.semver.version; | 
						|
    var differentDirectionsInclusive = (this.operator === '>=' || this.operator === '<=') && (comp.operator === '>=' || comp.operator === '<='); | 
						|
    var oppositeDirectionsLessThan = cmp(this.semver, '<', comp.semver, options) && (this.operator === '>=' || this.operator === '>') && (comp.operator === '<=' || comp.operator === '<'); | 
						|
    var oppositeDirectionsGreaterThan = cmp(this.semver, '>', comp.semver, options) && (this.operator === '<=' || this.operator === '<') && (comp.operator === '>=' || comp.operator === '>'); | 
						|
    return sameDirectionIncreasing || sameDirectionDecreasing || sameSemVer && differentDirectionsInclusive || oppositeDirectionsLessThan || oppositeDirectionsGreaterThan; | 
						|
  }; | 
						|
 | 
						|
  exports.Range = Range; | 
						|
 | 
						|
  function Range(range, options) { | 
						|
    if (!options || typeof options !== 'object') options = { | 
						|
      loose: !!options, | 
						|
      includePrerelease: false | 
						|
    }; | 
						|
 | 
						|
    if (range instanceof Range) { | 
						|
      if (range.loose === !!options.loose && range.includePrerelease === !!options.includePrerelease) { | 
						|
        return range; | 
						|
      } else { | 
						|
        return new Range(range.raw, options); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    if (range instanceof Comparator) { | 
						|
      return new Range(range.value, options); | 
						|
    } | 
						|
 | 
						|
    if (!(this instanceof Range)) return new Range(range, options); | 
						|
    this.options = options; | 
						|
    this.loose = !!options.loose; | 
						|
    this.includePrerelease = !!options.includePrerelease; // First, split based on boolean or || | 
						|
 | 
						|
    this.raw = range; | 
						|
    this.set = range.split(/\s*\|\|\s*/).map(function (range) { | 
						|
      return this.parseRange(range.trim()); | 
						|
    }, this).filter(function (c) { | 
						|
      // throw out any that are not relevant for whatever reason | 
						|
      return c.length; | 
						|
    }); | 
						|
 | 
						|
    if (!this.set.length) { | 
						|
      throw new TypeError('Invalid SemVer Range: ' + range); | 
						|
    } | 
						|
 | 
						|
    this.format(); | 
						|
  } | 
						|
 | 
						|
  Range.prototype.format = function () { | 
						|
    this.range = this.set.map(function (comps) { | 
						|
      return comps.join(' ').trim(); | 
						|
    }).join('||').trim(); | 
						|
    return this.range; | 
						|
  }; | 
						|
 | 
						|
  Range.prototype.toString = function () { | 
						|
    return this.range; | 
						|
  }; | 
						|
 | 
						|
  Range.prototype.parseRange = function (range) { | 
						|
    var loose = this.options.loose; | 
						|
    range = range.trim(); // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` | 
						|
 | 
						|
    var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE]; | 
						|
    range = range.replace(hr, hyphenReplace); | 
						|
    debug('hyphen replace', range); // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` | 
						|
 | 
						|
    range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace); | 
						|
    debug('comparator trim', range, re[COMPARATORTRIM]); // `~ 1.2.3` => `~1.2.3` | 
						|
 | 
						|
    range = range.replace(re[TILDETRIM], tildeTrimReplace); // `^ 1.2.3` => `^1.2.3` | 
						|
 | 
						|
    range = range.replace(re[CARETTRIM], caretTrimReplace); // normalize spaces | 
						|
 | 
						|
    range = range.split(/\s+/).join(' '); // At this point, the range is completely trimmed and | 
						|
    // ready to be split into comparators. | 
						|
 | 
						|
    var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; | 
						|
    var set = range.split(' ').map(function (comp) { | 
						|
      return parseComparator(comp, this.options); | 
						|
    }, this).join(' ').split(/\s+/); | 
						|
 | 
						|
    if (this.options.loose) { | 
						|
      // in loose mode, throw out any that are not valid comparators | 
						|
      set = set.filter(function (comp) { | 
						|
        return !!comp.match(compRe); | 
						|
      }); | 
						|
    } | 
						|
 | 
						|
    set = set.map(function (comp) { | 
						|
      return new Comparator(comp, this.options); | 
						|
    }, this); | 
						|
    return set; | 
						|
  }; | 
						|
 | 
						|
  Range.prototype.intersects = function (range, options) { | 
						|
    if (!(range instanceof Range)) { | 
						|
      throw new TypeError('a Range is required'); | 
						|
    } | 
						|
 | 
						|
    return this.set.some(function (thisComparators) { | 
						|
      return thisComparators.every(function (thisComparator) { | 
						|
        return range.set.some(function (rangeComparators) { | 
						|
          return rangeComparators.every(function (rangeComparator) { | 
						|
            return thisComparator.intersects(rangeComparator, options); | 
						|
          }); | 
						|
        }); | 
						|
      }); | 
						|
    }); | 
						|
  }; // Mostly just for testing and legacy API reasons | 
						|
 | 
						|
 | 
						|
  exports.toComparators = toComparators; | 
						|
 | 
						|
  function toComparators(range, options) { | 
						|
    return new Range(range, options).set.map(function (comp) { | 
						|
      return comp.map(function (c) { | 
						|
        return c.value; | 
						|
      }).join(' ').trim().split(' '); | 
						|
    }); | 
						|
  } // comprised of xranges, tildes, stars, and gtlt's at this point. | 
						|
  // already replaced the hyphen ranges | 
						|
  // turn into a set of JUST comparators. | 
						|
 | 
						|
 | 
						|
  function parseComparator(comp, options) { | 
						|
    debug('comp', comp, options); | 
						|
    comp = replaceCarets(comp, options); | 
						|
    debug('caret', comp); | 
						|
    comp = replaceTildes(comp, options); | 
						|
    debug('tildes', comp); | 
						|
    comp = replaceXRanges(comp, options); | 
						|
    debug('xrange', comp); | 
						|
    comp = replaceStars(comp, options); | 
						|
    debug('stars', comp); | 
						|
    return comp; | 
						|
  } | 
						|
 | 
						|
  function isX(id) { | 
						|
    return !id || id.toLowerCase() === 'x' || id === '*'; | 
						|
  } // ~, ~> --> * (any, kinda silly) | 
						|
  // ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 | 
						|
  // ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 | 
						|
  // ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 | 
						|
  // ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 | 
						|
  // ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 | 
						|
 | 
						|
 | 
						|
  function replaceTildes(comp, options) { | 
						|
    return comp.trim().split(/\s+/).map(function (comp) { | 
						|
      return replaceTilde(comp, options); | 
						|
    }).join(' '); | 
						|
  } | 
						|
 | 
						|
  function replaceTilde(comp, options) { | 
						|
    if (!options || typeof options !== 'object') options = { | 
						|
      loose: !!options, | 
						|
      includePrerelease: false | 
						|
    }; | 
						|
    var r = options.loose ? re[TILDELOOSE] : re[TILDE]; | 
						|
    return comp.replace(r, function (_, M, m, p, pr) { | 
						|
      debug('tilde', comp, _, M, m, p, pr); | 
						|
      var ret; | 
						|
      if (isX(M)) ret = '';else if (isX(m)) ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';else if (isX(p)) // ~1.2 == >=1.2.0 <1.3.0 | 
						|
        ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';else if (pr) { | 
						|
        debug('replaceTilde pr', pr); | 
						|
        if (pr.charAt(0) !== '-') pr = '-' + pr; | 
						|
        ret = '>=' + M + '.' + m + '.' + p + pr + ' <' + M + '.' + (+m + 1) + '.0'; | 
						|
      } else // ~1.2.3 == >=1.2.3 <1.3.0 | 
						|
        ret = '>=' + M + '.' + m + '.' + p + ' <' + M + '.' + (+m + 1) + '.0'; | 
						|
      debug('tilde return', ret); | 
						|
      return ret; | 
						|
    }); | 
						|
  } // ^ --> * (any, kinda silly) | 
						|
  // ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 | 
						|
  // ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 | 
						|
  // ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 | 
						|
  // ^1.2.3 --> >=1.2.3 <2.0.0 | 
						|
  // ^1.2.0 --> >=1.2.0 <2.0.0 | 
						|
 | 
						|
 | 
						|
  function replaceCarets(comp, options) { | 
						|
    return comp.trim().split(/\s+/).map(function (comp) { | 
						|
      return replaceCaret(comp, options); | 
						|
    }).join(' '); | 
						|
  } | 
						|
 | 
						|
  function replaceCaret(comp, options) { | 
						|
    debug('caret', comp, options); | 
						|
    if (!options || typeof options !== 'object') options = { | 
						|
      loose: !!options, | 
						|
      includePrerelease: false | 
						|
    }; | 
						|
    var r = options.loose ? re[CARETLOOSE] : re[CARET]; | 
						|
    return comp.replace(r, function (_, M, m, p, pr) { | 
						|
      debug('caret', comp, _, M, m, p, pr); | 
						|
      var ret; | 
						|
      if (isX(M)) ret = '';else if (isX(m)) ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';else if (isX(p)) { | 
						|
        if (M === '0') ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';else ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'; | 
						|
      } else if (pr) { | 
						|
        debug('replaceCaret pr', pr); | 
						|
        if (pr.charAt(0) !== '-') pr = '-' + pr; | 
						|
 | 
						|
        if (M === '0') { | 
						|
          if (m === '0') ret = '>=' + M + '.' + m + '.' + p + pr + ' <' + M + '.' + m + '.' + (+p + 1);else ret = '>=' + M + '.' + m + '.' + p + pr + ' <' + M + '.' + (+m + 1) + '.0'; | 
						|
        } else ret = '>=' + M + '.' + m + '.' + p + pr + ' <' + (+M + 1) + '.0.0'; | 
						|
      } else { | 
						|
        debug('no pr'); | 
						|
 | 
						|
        if (M === '0') { | 
						|
          if (m === '0') ret = '>=' + M + '.' + m + '.' + p + ' <' + M + '.' + m + '.' + (+p + 1);else ret = '>=' + M + '.' + m + '.' + p + ' <' + M + '.' + (+m + 1) + '.0'; | 
						|
        } else ret = '>=' + M + '.' + m + '.' + p + ' <' + (+M + 1) + '.0.0'; | 
						|
      } | 
						|
      debug('caret return', ret); | 
						|
      return ret; | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  function replaceXRanges(comp, options) { | 
						|
    debug('replaceXRanges', comp, options); | 
						|
    return comp.split(/\s+/).map(function (comp) { | 
						|
      return replaceXRange(comp, options); | 
						|
    }).join(' '); | 
						|
  } | 
						|
 | 
						|
  function replaceXRange(comp, options) { | 
						|
    comp = comp.trim(); | 
						|
    if (!options || typeof options !== 'object') options = { | 
						|
      loose: !!options, | 
						|
      includePrerelease: false | 
						|
    }; | 
						|
    var r = options.loose ? re[XRANGELOOSE] : re[XRANGE]; | 
						|
    return comp.replace(r, function (ret, gtlt, M, m, p, pr) { | 
						|
      debug('xRange', comp, ret, gtlt, M, m, p, pr); | 
						|
      var xM = isX(M); | 
						|
      var xm = xM || isX(m); | 
						|
      var xp = xm || isX(p); | 
						|
      var anyX = xp; | 
						|
      if (gtlt === '=' && anyX) gtlt = ''; | 
						|
 | 
						|
      if (xM) { | 
						|
        if (gtlt === '>' || gtlt === '<') { | 
						|
          // nothing is allowed | 
						|
          ret = '<0.0.0'; | 
						|
        } else { | 
						|
          // nothing is forbidden | 
						|
          ret = '*'; | 
						|
        } | 
						|
      } else if (gtlt && anyX) { | 
						|
        // replace X with 0 | 
						|
        if (xm) m = 0; | 
						|
        if (xp) p = 0; | 
						|
 | 
						|
        if (gtlt === '>') { | 
						|
          // >1 => >=2.0.0 | 
						|
          // >1.2 => >=1.3.0 | 
						|
          // >1.2.3 => >= 1.2.4 | 
						|
          gtlt = '>='; | 
						|
 | 
						|
          if (xm) { | 
						|
            M = +M + 1; | 
						|
            m = 0; | 
						|
            p = 0; | 
						|
          } else if (xp) { | 
						|
            m = +m + 1; | 
						|
            p = 0; | 
						|
          } | 
						|
        } else if (gtlt === '<=') { | 
						|
          // <=0.7.x is actually <0.8.0, since any 0.7.x should | 
						|
          // pass.  Similarly, <=7.x is actually <8.0.0, etc. | 
						|
          gtlt = '<'; | 
						|
          if (xm) M = +M + 1;else m = +m + 1; | 
						|
        } | 
						|
 | 
						|
        ret = gtlt + M + '.' + m + '.' + p; | 
						|
      } else if (xm) { | 
						|
        ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; | 
						|
      } else if (xp) { | 
						|
        ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; | 
						|
      } | 
						|
 | 
						|
      debug('xRange return', ret); | 
						|
      return ret; | 
						|
    }); | 
						|
  } // Because * is AND-ed with everything else in the comparator, | 
						|
  // and '' means "any version", just remove the *s entirely. | 
						|
 | 
						|
 | 
						|
  function replaceStars(comp, options) { | 
						|
    debug('replaceStars', comp, options); // Looseness is ignored here.  star is always as loose as it gets! | 
						|
 | 
						|
    return comp.trim().replace(re[STAR], ''); | 
						|
  } // This function is passed to string.replace(re[HYPHENRANGE]) | 
						|
  // M, m, patch, prerelease, build | 
						|
  // 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 | 
						|
  // 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do | 
						|
  // 1.2 - 3.4 => >=1.2.0 <3.5.0 | 
						|
 | 
						|
 | 
						|
  function hyphenReplace($0, from, fM, fm, fp, fpr, fb, to, tM, tm, tp, tpr, tb) { | 
						|
    if (isX(fM)) from = '';else if (isX(fm)) from = '>=' + fM + '.0.0';else if (isX(fp)) from = '>=' + fM + '.' + fm + '.0';else from = '>=' + from; | 
						|
    if (isX(tM)) to = '';else if (isX(tm)) to = '<' + (+tM + 1) + '.0.0';else if (isX(tp)) to = '<' + tM + '.' + (+tm + 1) + '.0';else if (tpr) to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr;else to = '<=' + to; | 
						|
    return (from + ' ' + to).trim(); | 
						|
  } // if ANY of the sets match ALL of its comparators, then pass | 
						|
 | 
						|
 | 
						|
  Range.prototype.test = function (version) { | 
						|
    if (!version) return false; | 
						|
    if (typeof version === 'string') version = new SemVer(version, this.options); | 
						|
 | 
						|
    for (var i = 0; i < this.set.length; i++) { | 
						|
      if (testSet(this.set[i], version, this.options)) return true; | 
						|
    } | 
						|
 | 
						|
    return false; | 
						|
  }; | 
						|
 | 
						|
  function testSet(set, version, options) { | 
						|
    for (var i = 0; i < set.length; i++) { | 
						|
      if (!set[i].test(version)) return false; | 
						|
    } | 
						|
 | 
						|
    if (!options) options = {}; | 
						|
 | 
						|
    if (version.prerelease.length && !options.includePrerelease) { | 
						|
      // Find the set of versions that are allowed to have prereleases | 
						|
      // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 | 
						|
      // That should allow `1.2.3-pr.2` to pass. | 
						|
      // However, `1.2.4-alpha.notready` should NOT be allowed, | 
						|
      // even though it's within the range set by the comparators. | 
						|
      for (var i = 0; i < set.length; i++) { | 
						|
        debug(set[i].semver); | 
						|
        if (set[i].semver === ANY) continue; | 
						|
 | 
						|
        if (set[i].semver.prerelease.length > 0) { | 
						|
          var allowed = set[i].semver; | 
						|
          if (allowed.major === version.major && allowed.minor === version.minor && allowed.patch === version.patch) return true; | 
						|
        } | 
						|
      } // Version has a -pre, but it's not one of the ones we like. | 
						|
 | 
						|
 | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  exports.satisfies = satisfies; | 
						|
 | 
						|
  function satisfies(version, range, options) { | 
						|
    try { | 
						|
      range = new Range(range, options); | 
						|
    } catch (er) { | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    return range.test(version); | 
						|
  } | 
						|
 | 
						|
  exports.maxSatisfying = maxSatisfying; | 
						|
 | 
						|
  function maxSatisfying(versions, range, options) { | 
						|
    var max = null; | 
						|
    var maxSV = null; | 
						|
 | 
						|
    try { | 
						|
      var rangeObj = new Range(range, options); | 
						|
    } catch (er) { | 
						|
      return null; | 
						|
    } | 
						|
 | 
						|
    versions.forEach(function (v) { | 
						|
      if (rangeObj.test(v)) { | 
						|
        // satisfies(v, range, options) | 
						|
        if (!max || maxSV.compare(v) === -1) { | 
						|
          // compare(max, v, true) | 
						|
          max = v; | 
						|
          maxSV = new SemVer(max, options); | 
						|
        } | 
						|
      } | 
						|
    }); | 
						|
    return max; | 
						|
  } | 
						|
 | 
						|
  exports.minSatisfying = minSatisfying; | 
						|
 | 
						|
  function minSatisfying(versions, range, options) { | 
						|
    var min = null; | 
						|
    var minSV = null; | 
						|
 | 
						|
    try { | 
						|
      var rangeObj = new Range(range, options); | 
						|
    } catch (er) { | 
						|
      return null; | 
						|
    } | 
						|
 | 
						|
    versions.forEach(function (v) { | 
						|
      if (rangeObj.test(v)) { | 
						|
        // satisfies(v, range, options) | 
						|
        if (!min || minSV.compare(v) === 1) { | 
						|
          // compare(min, v, true) | 
						|
          min = v; | 
						|
          minSV = new SemVer(min, options); | 
						|
        } | 
						|
      } | 
						|
    }); | 
						|
    return min; | 
						|
  } | 
						|
 | 
						|
  exports.validRange = validRange; | 
						|
 | 
						|
  function validRange(range, options) { | 
						|
    try { | 
						|
      // Return '*' instead of '' so that truthiness works. | 
						|
      // This will throw if it's invalid anyway | 
						|
      return new Range(range, options).range || '*'; | 
						|
    } catch (er) { | 
						|
      return null; | 
						|
    } | 
						|
  } // Determine if version is less than all the versions possible in the range | 
						|
 | 
						|
 | 
						|
  exports.ltr = ltr; | 
						|
 | 
						|
  function ltr(version, range, options) { | 
						|
    return outside(version, range, '<', options); | 
						|
  } // Determine if version is greater than all the versions possible in the range. | 
						|
 | 
						|
 | 
						|
  exports.gtr = gtr; | 
						|
 | 
						|
  function gtr(version, range, options) { | 
						|
    return outside(version, range, '>', options); | 
						|
  } | 
						|
 | 
						|
  exports.outside = outside; | 
						|
 | 
						|
  function outside(version, range, hilo, options) { | 
						|
    version = new SemVer(version, options); | 
						|
    range = new Range(range, options); | 
						|
    var gtfn, ltefn, ltfn, comp, ecomp; | 
						|
 | 
						|
    switch (hilo) { | 
						|
      case '>': | 
						|
        gtfn = gt; | 
						|
        ltefn = lte; | 
						|
        ltfn = lt; | 
						|
        comp = '>'; | 
						|
        ecomp = '>='; | 
						|
        break; | 
						|
 | 
						|
      case '<': | 
						|
        gtfn = lt; | 
						|
        ltefn = gte; | 
						|
        ltfn = gt; | 
						|
        comp = '<'; | 
						|
        ecomp = '<='; | 
						|
        break; | 
						|
 | 
						|
      default: | 
						|
        throw new TypeError('Must provide a hilo val of "<" or ">"'); | 
						|
    } // If it satisifes the range it is not outside | 
						|
 | 
						|
 | 
						|
    if (satisfies(version, range, options)) { | 
						|
      return false; | 
						|
    } // From now on, variable terms are as if we're in "gtr" mode. | 
						|
    // but note that everything is flipped for the "ltr" function. | 
						|
 | 
						|
 | 
						|
    for (var i = 0; i < range.set.length; ++i) { | 
						|
      var comparators = range.set[i]; | 
						|
      var high = null; | 
						|
      var low = null; | 
						|
      comparators.forEach(function (comparator) { | 
						|
        if (comparator.semver === ANY) { | 
						|
          comparator = new Comparator('>=0.0.0'); | 
						|
        } | 
						|
 | 
						|
        high = high || comparator; | 
						|
        low = low || comparator; | 
						|
 | 
						|
        if (gtfn(comparator.semver, high.semver, options)) { | 
						|
          high = comparator; | 
						|
        } else if (ltfn(comparator.semver, low.semver, options)) { | 
						|
          low = comparator; | 
						|
        } | 
						|
      }); // If the edge version comparator has a operator then our version | 
						|
      // isn't outside it | 
						|
 | 
						|
      if (high.operator === comp || high.operator === ecomp) { | 
						|
        return false; | 
						|
      } // If the lowest version comparator has an operator and our version | 
						|
      // is less than it then it isn't higher than the range | 
						|
 | 
						|
 | 
						|
      if ((!low.operator || low.operator === comp) && ltefn(version, low.semver)) { | 
						|
        return false; | 
						|
      } else if (low.operator === ecomp && ltfn(version, low.semver)) { | 
						|
        return false; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  exports.prerelease = prerelease; | 
						|
 | 
						|
  function prerelease(version, options) { | 
						|
    var parsed = parse(version, options); | 
						|
    return parsed && parsed.prerelease.length ? parsed.prerelease : null; | 
						|
  } | 
						|
 | 
						|
  exports.intersects = intersects; | 
						|
 | 
						|
  function intersects(r1, r2, options) { | 
						|
    r1 = new Range(r1, options); | 
						|
    r2 = new Range(r2, options); | 
						|
    return r1.intersects(r2); | 
						|
  } | 
						|
 | 
						|
  exports.coerce = coerce; | 
						|
 | 
						|
  function coerce(version) { | 
						|
    if (version instanceof SemVer) return version; | 
						|
    if (typeof version !== 'string') return null; | 
						|
    var match = version.match(re[COERCE]); | 
						|
    if (match == null) return null; | 
						|
    return parse((match[1] || '0') + '.' + (match[2] || '0') + '.' + (match[3] || '0')); | 
						|
  } | 
						|
}); | 
						|
var semver_1$1 = semver$1.SEMVER_SPEC_VERSION; | 
						|
var semver_2$1 = semver$1.re; | 
						|
var semver_3$1 = semver$1.src; | 
						|
var semver_4$1 = semver$1.parse; | 
						|
var semver_5$1 = semver$1.valid; | 
						|
var semver_6$1 = semver$1.clean; | 
						|
var semver_7$1 = semver$1.SemVer; | 
						|
var semver_8$1 = semver$1.inc; | 
						|
var semver_9$1 = semver$1.diff; | 
						|
var semver_10$1 = semver$1.compareIdentifiers; | 
						|
var semver_11$1 = semver$1.rcompareIdentifiers; | 
						|
var semver_12$1 = semver$1.major; | 
						|
var semver_13$1 = semver$1.minor; | 
						|
var semver_14$1 = semver$1.patch; | 
						|
var semver_15$1 = semver$1.compare; | 
						|
var semver_16$1 = semver$1.compareLoose; | 
						|
var semver_17$1 = semver$1.rcompare; | 
						|
var semver_18$1 = semver$1.sort; | 
						|
var semver_19$1 = semver$1.rsort; | 
						|
var semver_20$1 = semver$1.gt; | 
						|
var semver_21$1 = semver$1.lt; | 
						|
var semver_22$1 = semver$1.eq; | 
						|
var semver_23$1 = semver$1.neq; | 
						|
var semver_24$1 = semver$1.gte; | 
						|
var semver_25$1 = semver$1.lte; | 
						|
var semver_26$1 = semver$1.cmp; | 
						|
var semver_27$1 = semver$1.Comparator; | 
						|
var semver_28$1 = semver$1.Range; | 
						|
var semver_29$1 = semver$1.toComparators; | 
						|
var semver_30$1 = semver$1.satisfies; | 
						|
var semver_31$1 = semver$1.maxSatisfying; | 
						|
var semver_32$1 = semver$1.minSatisfying; | 
						|
var semver_33$1 = semver$1.validRange; | 
						|
var semver_34$1 = semver$1.ltr; | 
						|
var semver_35$1 = semver$1.gtr; | 
						|
var semver_36$1 = semver$1.outside; | 
						|
var semver_37$1 = semver$1.prerelease; | 
						|
var semver_38$1 = semver$1.intersects; | 
						|
var semver_39$1 = semver$1.coerce; | 
						|
 | 
						|
var hasOwnProperty = Object.prototype.hasOwnProperty; | 
						|
var pseudomap = PseudoMap; | 
						|
 | 
						|
function PseudoMap(set) { | 
						|
  if (!(this instanceof PseudoMap)) // whyyyyyyy | 
						|
    throw new TypeError("Constructor PseudoMap requires 'new'"); | 
						|
  this.clear(); | 
						|
 | 
						|
  if (set) { | 
						|
    if (set instanceof PseudoMap || typeof Map === 'function' && set instanceof Map) set.forEach(function (value, key) { | 
						|
      this.set(key, value); | 
						|
    }, this);else if (Array.isArray(set)) set.forEach(function (kv) { | 
						|
      this.set(kv[0], kv[1]); | 
						|
    }, this);else throw new TypeError('invalid argument'); | 
						|
  } | 
						|
} | 
						|
 | 
						|
PseudoMap.prototype.forEach = function (fn, thisp) { | 
						|
  thisp = thisp || this; | 
						|
  Object.keys(this._data).forEach(function (k) { | 
						|
    if (k !== 'size') fn.call(thisp, this._data[k].value, this._data[k].key); | 
						|
  }, this); | 
						|
}; | 
						|
 | 
						|
PseudoMap.prototype.has = function (k) { | 
						|
  return !!find(this._data, k); | 
						|
}; | 
						|
 | 
						|
PseudoMap.prototype.get = function (k) { | 
						|
  var res = find(this._data, k); | 
						|
  return res && res.value; | 
						|
}; | 
						|
 | 
						|
PseudoMap.prototype.set = function (k, v) { | 
						|
  set(this._data, k, v); | 
						|
}; | 
						|
 | 
						|
PseudoMap.prototype.delete = function (k) { | 
						|
  var res = find(this._data, k); | 
						|
 | 
						|
  if (res) { | 
						|
    delete this._data[res._index]; | 
						|
    this._data.size--; | 
						|
  } | 
						|
}; | 
						|
 | 
						|
PseudoMap.prototype.clear = function () { | 
						|
  var data = Object.create(null); | 
						|
  data.size = 0; | 
						|
  Object.defineProperty(this, '_data', { | 
						|
    value: data, | 
						|
    enumerable: false, | 
						|
    configurable: true, | 
						|
    writable: false | 
						|
  }); | 
						|
}; | 
						|
 | 
						|
Object.defineProperty(PseudoMap.prototype, 'size', { | 
						|
  get: function get() { | 
						|
    return this._data.size; | 
						|
  }, | 
						|
  set: function set(n) {}, | 
						|
  enumerable: true, | 
						|
  configurable: true | 
						|
}); | 
						|
 | 
						|
PseudoMap.prototype.values = PseudoMap.prototype.keys = PseudoMap.prototype.entries = function () { | 
						|
  throw new Error('iterators are not implemented in this version'); | 
						|
}; // Either identical, or both NaN | 
						|
 | 
						|
 | 
						|
function same(a, b) { | 
						|
  return a === b || a !== a && b !== b; | 
						|
} | 
						|
 | 
						|
function Entry(k, v, i) { | 
						|
  this.key = k; | 
						|
  this.value = v; | 
						|
  this._index = i; | 
						|
} | 
						|
 | 
						|
function find(data, k) { | 
						|
  for (var i = 0, s = '_' + k, key = s; hasOwnProperty.call(data, key); key = s + i++) { | 
						|
    if (same(data[key].key, k)) return data[key]; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function set(data, k, v) { | 
						|
  for (var i = 0, s = '_' + k, key = s; hasOwnProperty.call(data, key); key = s + i++) { | 
						|
    if (same(data[key].key, k)) { | 
						|
      data[key].value = v; | 
						|
      return; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  data.size++; | 
						|
  data[key] = new Entry(k, v, key); | 
						|
} | 
						|
 | 
						|
var map = createCommonjsModule(function (module) { | 
						|
  if (process.env.npm_package_name === 'pseudomap' && process.env.npm_lifecycle_script === 'test') process.env.TEST_PSEUDOMAP = 'true'; | 
						|
 | 
						|
  if (typeof Map === 'function' && !process.env.TEST_PSEUDOMAP) { | 
						|
    module.exports = Map; | 
						|
  } else { | 
						|
    module.exports = pseudomap; | 
						|
  } | 
						|
}); | 
						|
 | 
						|
var yallist = Yallist; | 
						|
Yallist.Node = Node; | 
						|
Yallist.create = Yallist; | 
						|
 | 
						|
function Yallist(list) { | 
						|
  var self = this; | 
						|
 | 
						|
  if (!(self instanceof Yallist)) { | 
						|
    self = new Yallist(); | 
						|
  } | 
						|
 | 
						|
  self.tail = null; | 
						|
  self.head = null; | 
						|
  self.length = 0; | 
						|
 | 
						|
  if (list && typeof list.forEach === 'function') { | 
						|
    list.forEach(function (item) { | 
						|
      self.push(item); | 
						|
    }); | 
						|
  } else if (arguments.length > 0) { | 
						|
    for (var i = 0, l = arguments.length; i < l; i++) { | 
						|
      self.push(arguments[i]); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return self; | 
						|
} | 
						|
 | 
						|
Yallist.prototype.removeNode = function (node) { | 
						|
  if (node.list !== this) { | 
						|
    throw new Error('removing node which does not belong to this list'); | 
						|
  } | 
						|
 | 
						|
  var next = node.next; | 
						|
  var prev = node.prev; | 
						|
 | 
						|
  if (next) { | 
						|
    next.prev = prev; | 
						|
  } | 
						|
 | 
						|
  if (prev) { | 
						|
    prev.next = next; | 
						|
  } | 
						|
 | 
						|
  if (node === this.head) { | 
						|
    this.head = next; | 
						|
  } | 
						|
 | 
						|
  if (node === this.tail) { | 
						|
    this.tail = prev; | 
						|
  } | 
						|
 | 
						|
  node.list.length--; | 
						|
  node.next = null; | 
						|
  node.prev = null; | 
						|
  node.list = null; | 
						|
}; | 
						|
 | 
						|
Yallist.prototype.unshiftNode = function (node) { | 
						|
  if (node === this.head) { | 
						|
    return; | 
						|
  } | 
						|
 | 
						|
  if (node.list) { | 
						|
    node.list.removeNode(node); | 
						|
  } | 
						|
 | 
						|
  var head = this.head; | 
						|
  node.list = this; | 
						|
  node.next = head; | 
						|
 | 
						|
  if (head) { | 
						|
    head.prev = node; | 
						|
  } | 
						|
 | 
						|
  this.head = node; | 
						|
 | 
						|
  if (!this.tail) { | 
						|
    this.tail = node; | 
						|
  } | 
						|
 | 
						|
  this.length++; | 
						|
}; | 
						|
 | 
						|
Yallist.prototype.pushNode = function (node) { | 
						|
  if (node === this.tail) { | 
						|
    return; | 
						|
  } | 
						|
 | 
						|
  if (node.list) { | 
						|
    node.list.removeNode(node); | 
						|
  } | 
						|
 | 
						|
  var tail = this.tail; | 
						|
  node.list = this; | 
						|
  node.prev = tail; | 
						|
 | 
						|
  if (tail) { | 
						|
    tail.next = node; | 
						|
  } | 
						|
 | 
						|
  this.tail = node; | 
						|
 | 
						|
  if (!this.head) { | 
						|
    this.head = node; | 
						|
  } | 
						|
 | 
						|
  this.length++; | 
						|
}; | 
						|
 | 
						|
Yallist.prototype.push = function () { | 
						|
  for (var i = 0, l = arguments.length; i < l; i++) { | 
						|
    push(this, arguments[i]); | 
						|
  } | 
						|
 | 
						|
  return this.length; | 
						|
}; | 
						|
 | 
						|
Yallist.prototype.unshift = function () { | 
						|
  for (var i = 0, l = arguments.length; i < l; i++) { | 
						|
    unshift(this, arguments[i]); | 
						|
  } | 
						|
 | 
						|
  return this.length; | 
						|
}; | 
						|
 | 
						|
Yallist.prototype.pop = function () { | 
						|
  if (!this.tail) { | 
						|
    return undefined; | 
						|
  } | 
						|
 | 
						|
  var res = this.tail.value; | 
						|
  this.tail = this.tail.prev; | 
						|
 | 
						|
  if (this.tail) { | 
						|
    this.tail.next = null; | 
						|
  } else { | 
						|
    this.head = null; | 
						|
  } | 
						|
 | 
						|
  this.length--; | 
						|
  return res; | 
						|
}; | 
						|
 | 
						|
Yallist.prototype.shift = function () { | 
						|
  if (!this.head) { | 
						|
    return undefined; | 
						|
  } | 
						|
 | 
						|
  var res = this.head.value; | 
						|
  this.head = this.head.next; | 
						|
 | 
						|
  if (this.head) { | 
						|
    this.head.prev = null; | 
						|
  } else { | 
						|
    this.tail = null; | 
						|
  } | 
						|
 | 
						|
  this.length--; | 
						|
  return res; | 
						|
}; | 
						|
 | 
						|
Yallist.prototype.forEach = function (fn, thisp) { | 
						|
  thisp = thisp || this; | 
						|
 | 
						|
  for (var walker = this.head, i = 0; walker !== null; i++) { | 
						|
    fn.call(thisp, walker.value, i, this); | 
						|
    walker = walker.next; | 
						|
  } | 
						|
}; | 
						|
 | 
						|
Yallist.prototype.forEachReverse = function (fn, thisp) { | 
						|
  thisp = thisp || this; | 
						|
 | 
						|
  for (var walker = this.tail, i = this.length - 1; walker !== null; i--) { | 
						|
    fn.call(thisp, walker.value, i, this); | 
						|
    walker = walker.prev; | 
						|
  } | 
						|
}; | 
						|
 | 
						|
Yallist.prototype.get = function (n) { | 
						|
  for (var i = 0, walker = this.head; walker !== null && i < n; i++) { | 
						|
    // abort out of the list early if we hit a cycle | 
						|
    walker = walker.next; | 
						|
  } | 
						|
 | 
						|
  if (i === n && walker !== null) { | 
						|
    return walker.value; | 
						|
  } | 
						|
}; | 
						|
 | 
						|
Yallist.prototype.getReverse = function (n) { | 
						|
  for (var i = 0, walker = this.tail; walker !== null && i < n; i++) { | 
						|
    // abort out of the list early if we hit a cycle | 
						|
    walker = walker.prev; | 
						|
  } | 
						|
 | 
						|
  if (i === n && walker !== null) { | 
						|
    return walker.value; | 
						|
  } | 
						|
}; | 
						|
 | 
						|
Yallist.prototype.map = function (fn, thisp) { | 
						|
  thisp = thisp || this; | 
						|
  var res = new Yallist(); | 
						|
 | 
						|
  for (var walker = this.head; walker !== null;) { | 
						|
    res.push(fn.call(thisp, walker.value, this)); | 
						|
    walker = walker.next; | 
						|
  } | 
						|
 | 
						|
  return res; | 
						|
}; | 
						|
 | 
						|
Yallist.prototype.mapReverse = function (fn, thisp) { | 
						|
  thisp = thisp || this; | 
						|
  var res = new Yallist(); | 
						|
 | 
						|
  for (var walker = this.tail; walker !== null;) { | 
						|
    res.push(fn.call(thisp, walker.value, this)); | 
						|
    walker = walker.prev; | 
						|
  } | 
						|
 | 
						|
  return res; | 
						|
}; | 
						|
 | 
						|
Yallist.prototype.reduce = function (fn, initial) { | 
						|
  var acc; | 
						|
  var walker = this.head; | 
						|
 | 
						|
  if (arguments.length > 1) { | 
						|
    acc = initial; | 
						|
  } else if (this.head) { | 
						|
    walker = this.head.next; | 
						|
    acc = this.head.value; | 
						|
  } else { | 
						|
    throw new TypeError('Reduce of empty list with no initial value'); | 
						|
  } | 
						|
 | 
						|
  for (var i = 0; walker !== null; i++) { | 
						|
    acc = fn(acc, walker.value, i); | 
						|
    walker = walker.next; | 
						|
  } | 
						|
 | 
						|
  return acc; | 
						|
}; | 
						|
 | 
						|
Yallist.prototype.reduceReverse = function (fn, initial) { | 
						|
  var acc; | 
						|
  var walker = this.tail; | 
						|
 | 
						|
  if (arguments.length > 1) { | 
						|
    acc = initial; | 
						|
  } else if (this.tail) { | 
						|
    walker = this.tail.prev; | 
						|
    acc = this.tail.value; | 
						|
  } else { | 
						|
    throw new TypeError('Reduce of empty list with no initial value'); | 
						|
  } | 
						|
 | 
						|
  for (var i = this.length - 1; walker !== null; i--) { | 
						|
    acc = fn(acc, walker.value, i); | 
						|
    walker = walker.prev; | 
						|
  } | 
						|
 | 
						|
  return acc; | 
						|
}; | 
						|
 | 
						|
Yallist.prototype.toArray = function () { | 
						|
  var arr = new Array(this.length); | 
						|
 | 
						|
  for (var i = 0, walker = this.head; walker !== null; i++) { | 
						|
    arr[i] = walker.value; | 
						|
    walker = walker.next; | 
						|
  } | 
						|
 | 
						|
  return arr; | 
						|
}; | 
						|
 | 
						|
Yallist.prototype.toArrayReverse = function () { | 
						|
  var arr = new Array(this.length); | 
						|
 | 
						|
  for (var i = 0, walker = this.tail; walker !== null; i++) { | 
						|
    arr[i] = walker.value; | 
						|
    walker = walker.prev; | 
						|
  } | 
						|
 | 
						|
  return arr; | 
						|
}; | 
						|
 | 
						|
Yallist.prototype.slice = function (from, to) { | 
						|
  to = to || this.length; | 
						|
 | 
						|
  if (to < 0) { | 
						|
    to += this.length; | 
						|
  } | 
						|
 | 
						|
  from = from || 0; | 
						|
 | 
						|
  if (from < 0) { | 
						|
    from += this.length; | 
						|
  } | 
						|
 | 
						|
  var ret = new Yallist(); | 
						|
 | 
						|
  if (to < from || to < 0) { | 
						|
    return ret; | 
						|
  } | 
						|
 | 
						|
  if (from < 0) { | 
						|
    from = 0; | 
						|
  } | 
						|
 | 
						|
  if (to > this.length) { | 
						|
    to = this.length; | 
						|
  } | 
						|
 | 
						|
  for (var i = 0, walker = this.head; walker !== null && i < from; i++) { | 
						|
    walker = walker.next; | 
						|
  } | 
						|
 | 
						|
  for (; walker !== null && i < to; i++, walker = walker.next) { | 
						|
    ret.push(walker.value); | 
						|
  } | 
						|
 | 
						|
  return ret; | 
						|
}; | 
						|
 | 
						|
Yallist.prototype.sliceReverse = function (from, to) { | 
						|
  to = to || this.length; | 
						|
 | 
						|
  if (to < 0) { | 
						|
    to += this.length; | 
						|
  } | 
						|
 | 
						|
  from = from || 0; | 
						|
 | 
						|
  if (from < 0) { | 
						|
    from += this.length; | 
						|
  } | 
						|
 | 
						|
  var ret = new Yallist(); | 
						|
 | 
						|
  if (to < from || to < 0) { | 
						|
    return ret; | 
						|
  } | 
						|
 | 
						|
  if (from < 0) { | 
						|
    from = 0; | 
						|
  } | 
						|
 | 
						|
  if (to > this.length) { | 
						|
    to = this.length; | 
						|
  } | 
						|
 | 
						|
  for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) { | 
						|
    walker = walker.prev; | 
						|
  } | 
						|
 | 
						|
  for (; walker !== null && i > from; i--, walker = walker.prev) { | 
						|
    ret.push(walker.value); | 
						|
  } | 
						|
 | 
						|
  return ret; | 
						|
}; | 
						|
 | 
						|
Yallist.prototype.reverse = function () { | 
						|
  var head = this.head; | 
						|
  var tail = this.tail; | 
						|
 | 
						|
  for (var walker = head; walker !== null; walker = walker.prev) { | 
						|
    var p = walker.prev; | 
						|
    walker.prev = walker.next; | 
						|
    walker.next = p; | 
						|
  } | 
						|
 | 
						|
  this.head = tail; | 
						|
  this.tail = head; | 
						|
  return this; | 
						|
}; | 
						|
 | 
						|
function push(self, item) { | 
						|
  self.tail = new Node(item, self.tail, null, self); | 
						|
 | 
						|
  if (!self.head) { | 
						|
    self.head = self.tail; | 
						|
  } | 
						|
 | 
						|
  self.length++; | 
						|
} | 
						|
 | 
						|
function unshift(self, item) { | 
						|
  self.head = new Node(item, null, self.head, self); | 
						|
 | 
						|
  if (!self.tail) { | 
						|
    self.tail = self.head; | 
						|
  } | 
						|
 | 
						|
  self.length++; | 
						|
} | 
						|
 | 
						|
function Node(value, prev, next, list) { | 
						|
  if (!(this instanceof Node)) { | 
						|
    return new Node(value, prev, next, list); | 
						|
  } | 
						|
 | 
						|
  this.list = list; | 
						|
  this.value = value; | 
						|
 | 
						|
  if (prev) { | 
						|
    prev.next = this; | 
						|
    this.prev = prev; | 
						|
  } else { | 
						|
    this.prev = null; | 
						|
  } | 
						|
 | 
						|
  if (next) { | 
						|
    next.prev = this; | 
						|
    this.next = next; | 
						|
  } else { | 
						|
    this.next = null; | 
						|
  } | 
						|
} | 
						|
 | 
						|
var lruCache = LRUCache; // This will be a proper iterable 'Map' in engines that support it, | 
						|
// or a fakey-fake PseudoMap in older versions. | 
						|
// A linked list to keep track of recently-used-ness | 
						|
// use symbols if possible, otherwise just _props | 
						|
 | 
						|
var hasSymbol = typeof Symbol === 'function' && process.env._nodeLRUCacheForceNoSymbol !== '1'; | 
						|
var makeSymbol; | 
						|
 | 
						|
if (hasSymbol) { | 
						|
  makeSymbol = function makeSymbol(key) { | 
						|
    return Symbol(key); | 
						|
  }; | 
						|
} else { | 
						|
  makeSymbol = function makeSymbol(key) { | 
						|
    return '_' + key; | 
						|
  }; | 
						|
} | 
						|
 | 
						|
var MAX = makeSymbol('max'); | 
						|
var LENGTH = makeSymbol('length'); | 
						|
var LENGTH_CALCULATOR = makeSymbol('lengthCalculator'); | 
						|
var ALLOW_STALE = makeSymbol('allowStale'); | 
						|
var MAX_AGE = makeSymbol('maxAge'); | 
						|
var DISPOSE = makeSymbol('dispose'); | 
						|
var NO_DISPOSE_ON_SET = makeSymbol('noDisposeOnSet'); | 
						|
var LRU_LIST = makeSymbol('lruList'); | 
						|
var CACHE = makeSymbol('cache'); | 
						|
 | 
						|
function naiveLength() { | 
						|
  return 1; | 
						|
} // lruList is a yallist where the head is the youngest | 
						|
// item, and the tail is the oldest.  the list contains the Hit | 
						|
// objects as the entries. | 
						|
// Each Hit object has a reference to its Yallist.Node.  This | 
						|
// never changes. | 
						|
// | 
						|
// cache is a Map (or PseudoMap) that matches the keys to | 
						|
// the Yallist.Node object. | 
						|
 | 
						|
 | 
						|
function LRUCache(options) { | 
						|
  if (!(this instanceof LRUCache)) { | 
						|
    return new LRUCache(options); | 
						|
  } | 
						|
 | 
						|
  if (typeof options === 'number') { | 
						|
    options = { | 
						|
      max: options | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  if (!options) { | 
						|
    options = {}; | 
						|
  } | 
						|
 | 
						|
  var max = this[MAX] = options.max; // Kind of weird to have a default max of Infinity, but oh well. | 
						|
 | 
						|
  if (!max || !(typeof max === 'number') || max <= 0) { | 
						|
    this[MAX] = Infinity; | 
						|
  } | 
						|
 | 
						|
  var lc = options.length || naiveLength; | 
						|
 | 
						|
  if (typeof lc !== 'function') { | 
						|
    lc = naiveLength; | 
						|
  } | 
						|
 | 
						|
  this[LENGTH_CALCULATOR] = lc; | 
						|
  this[ALLOW_STALE] = options.stale || false; | 
						|
  this[MAX_AGE] = options.maxAge || 0; | 
						|
  this[DISPOSE] = options.dispose; | 
						|
  this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false; | 
						|
  this.reset(); | 
						|
} // resize the cache when the max changes. | 
						|
 | 
						|
 | 
						|
Object.defineProperty(LRUCache.prototype, 'max', { | 
						|
  set: function set(mL) { | 
						|
    if (!mL || !(typeof mL === 'number') || mL <= 0) { | 
						|
      mL = Infinity; | 
						|
    } | 
						|
 | 
						|
    this[MAX] = mL; | 
						|
    trim$2(this); | 
						|
  }, | 
						|
  get: function get() { | 
						|
    return this[MAX]; | 
						|
  }, | 
						|
  enumerable: true | 
						|
}); | 
						|
Object.defineProperty(LRUCache.prototype, 'allowStale', { | 
						|
  set: function set(allowStale) { | 
						|
    this[ALLOW_STALE] = !!allowStale; | 
						|
  }, | 
						|
  get: function get() { | 
						|
    return this[ALLOW_STALE]; | 
						|
  }, | 
						|
  enumerable: true | 
						|
}); | 
						|
Object.defineProperty(LRUCache.prototype, 'maxAge', { | 
						|
  set: function set(mA) { | 
						|
    if (!mA || !(typeof mA === 'number') || mA < 0) { | 
						|
      mA = 0; | 
						|
    } | 
						|
 | 
						|
    this[MAX_AGE] = mA; | 
						|
    trim$2(this); | 
						|
  }, | 
						|
  get: function get() { | 
						|
    return this[MAX_AGE]; | 
						|
  }, | 
						|
  enumerable: true | 
						|
}); // resize the cache when the lengthCalculator changes. | 
						|
 | 
						|
Object.defineProperty(LRUCache.prototype, 'lengthCalculator', { | 
						|
  set: function set(lC) { | 
						|
    if (typeof lC !== 'function') { | 
						|
      lC = naiveLength; | 
						|
    } | 
						|
 | 
						|
    if (lC !== this[LENGTH_CALCULATOR]) { | 
						|
      this[LENGTH_CALCULATOR] = lC; | 
						|
      this[LENGTH] = 0; | 
						|
      this[LRU_LIST].forEach(function (hit) { | 
						|
        hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key); | 
						|
        this[LENGTH] += hit.length; | 
						|
      }, this); | 
						|
    } | 
						|
 | 
						|
    trim$2(this); | 
						|
  }, | 
						|
  get: function get() { | 
						|
    return this[LENGTH_CALCULATOR]; | 
						|
  }, | 
						|
  enumerable: true | 
						|
}); | 
						|
Object.defineProperty(LRUCache.prototype, 'length', { | 
						|
  get: function get() { | 
						|
    return this[LENGTH]; | 
						|
  }, | 
						|
  enumerable: true | 
						|
}); | 
						|
Object.defineProperty(LRUCache.prototype, 'itemCount', { | 
						|
  get: function get() { | 
						|
    return this[LRU_LIST].length; | 
						|
  }, | 
						|
  enumerable: true | 
						|
}); | 
						|
 | 
						|
LRUCache.prototype.rforEach = function (fn, thisp) { | 
						|
  thisp = thisp || this; | 
						|
 | 
						|
  for (var walker = this[LRU_LIST].tail; walker !== null;) { | 
						|
    var prev = walker.prev; | 
						|
    forEachStep(this, fn, walker, thisp); | 
						|
    walker = prev; | 
						|
  } | 
						|
}; | 
						|
 | 
						|
function forEachStep(self, fn, node, thisp) { | 
						|
  var hit = node.value; | 
						|
 | 
						|
  if (isStale(self, hit)) { | 
						|
    del(self, node); | 
						|
 | 
						|
    if (!self[ALLOW_STALE]) { | 
						|
      hit = undefined; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  if (hit) { | 
						|
    fn.call(thisp, hit.value, hit.key, self); | 
						|
  } | 
						|
} | 
						|
 | 
						|
LRUCache.prototype.forEach = function (fn, thisp) { | 
						|
  thisp = thisp || this; | 
						|
 | 
						|
  for (var walker = this[LRU_LIST].head; walker !== null;) { | 
						|
    var next = walker.next; | 
						|
    forEachStep(this, fn, walker, thisp); | 
						|
    walker = next; | 
						|
  } | 
						|
}; | 
						|
 | 
						|
LRUCache.prototype.keys = function () { | 
						|
  return this[LRU_LIST].toArray().map(function (k) { | 
						|
    return k.key; | 
						|
  }, this); | 
						|
}; | 
						|
 | 
						|
LRUCache.prototype.values = function () { | 
						|
  return this[LRU_LIST].toArray().map(function (k) { | 
						|
    return k.value; | 
						|
  }, this); | 
						|
}; | 
						|
 | 
						|
LRUCache.prototype.reset = function () { | 
						|
  if (this[DISPOSE] && this[LRU_LIST] && this[LRU_LIST].length) { | 
						|
    this[LRU_LIST].forEach(function (hit) { | 
						|
      this[DISPOSE](hit.key, hit.value); | 
						|
    }, this); | 
						|
  } | 
						|
 | 
						|
  this[CACHE] = new map(); // hash of items by key | 
						|
 | 
						|
  this[LRU_LIST] = new yallist(); // list of items in order of use recency | 
						|
 | 
						|
  this[LENGTH] = 0; // length of items in the list | 
						|
}; | 
						|
 | 
						|
LRUCache.prototype.dump = function () { | 
						|
  return this[LRU_LIST].map(function (hit) { | 
						|
    if (!isStale(this, hit)) { | 
						|
      return { | 
						|
        k: hit.key, | 
						|
        v: hit.value, | 
						|
        e: hit.now + (hit.maxAge || 0) | 
						|
      }; | 
						|
    } | 
						|
  }, this).toArray().filter(function (h) { | 
						|
    return h; | 
						|
  }); | 
						|
}; | 
						|
 | 
						|
LRUCache.prototype.dumpLru = function () { | 
						|
  return this[LRU_LIST]; | 
						|
}; | 
						|
/* istanbul ignore next */ | 
						|
 | 
						|
 | 
						|
LRUCache.prototype.inspect = function (n, opts) { | 
						|
  var str = 'LRUCache {'; | 
						|
  var extras = false; | 
						|
  var as = this[ALLOW_STALE]; | 
						|
 | 
						|
  if (as) { | 
						|
    str += '\n  allowStale: true'; | 
						|
    extras = true; | 
						|
  } | 
						|
 | 
						|
  var max = this[MAX]; | 
						|
 | 
						|
  if (max && max !== Infinity) { | 
						|
    if (extras) { | 
						|
      str += ','; | 
						|
    } | 
						|
 | 
						|
    str += '\n  max: ' + util$2.inspect(max, opts); | 
						|
    extras = true; | 
						|
  } | 
						|
 | 
						|
  var maxAge = this[MAX_AGE]; | 
						|
 | 
						|
  if (maxAge) { | 
						|
    if (extras) { | 
						|
      str += ','; | 
						|
    } | 
						|
 | 
						|
    str += '\n  maxAge: ' + util$2.inspect(maxAge, opts); | 
						|
    extras = true; | 
						|
  } | 
						|
 | 
						|
  var lc = this[LENGTH_CALCULATOR]; | 
						|
 | 
						|
  if (lc && lc !== naiveLength) { | 
						|
    if (extras) { | 
						|
      str += ','; | 
						|
    } | 
						|
 | 
						|
    str += '\n  length: ' + util$2.inspect(this[LENGTH], opts); | 
						|
    extras = true; | 
						|
  } | 
						|
 | 
						|
  var didFirst = false; | 
						|
  this[LRU_LIST].forEach(function (item) { | 
						|
    if (didFirst) { | 
						|
      str += ',\n  '; | 
						|
    } else { | 
						|
      if (extras) { | 
						|
        str += ',\n'; | 
						|
      } | 
						|
 | 
						|
      didFirst = true; | 
						|
      str += '\n  '; | 
						|
    } | 
						|
 | 
						|
    var key = util$2.inspect(item.key).split('\n').join('\n  '); | 
						|
    var val = { | 
						|
      value: item.value | 
						|
    }; | 
						|
 | 
						|
    if (item.maxAge !== maxAge) { | 
						|
      val.maxAge = item.maxAge; | 
						|
    } | 
						|
 | 
						|
    if (lc !== naiveLength) { | 
						|
      val.length = item.length; | 
						|
    } | 
						|
 | 
						|
    if (isStale(this, item)) { | 
						|
      val.stale = true; | 
						|
    } | 
						|
 | 
						|
    val = util$2.inspect(val, opts).split('\n').join('\n  '); | 
						|
    str += key + ' => ' + val; | 
						|
  }); | 
						|
 | 
						|
  if (didFirst || extras) { | 
						|
    str += '\n'; | 
						|
  } | 
						|
 | 
						|
  str += '}'; | 
						|
  return str; | 
						|
}; | 
						|
 | 
						|
LRUCache.prototype.set = function (key, value, maxAge) { | 
						|
  maxAge = maxAge || this[MAX_AGE]; | 
						|
  var now = maxAge ? Date.now() : 0; | 
						|
  var len = this[LENGTH_CALCULATOR](value, key); | 
						|
 | 
						|
  if (this[CACHE].has(key)) { | 
						|
    if (len > this[MAX]) { | 
						|
      del(this, this[CACHE].get(key)); | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    var node = this[CACHE].get(key); | 
						|
    var item = node.value; // dispose of the old one before overwriting | 
						|
    // split out into 2 ifs for better coverage tracking | 
						|
 | 
						|
    if (this[DISPOSE]) { | 
						|
      if (!this[NO_DISPOSE_ON_SET]) { | 
						|
        this[DISPOSE](key, item.value); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    item.now = now; | 
						|
    item.maxAge = maxAge; | 
						|
    item.value = value; | 
						|
    this[LENGTH] += len - item.length; | 
						|
    item.length = len; | 
						|
    this.get(key); | 
						|
    trim$2(this); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  var hit = new Entry$1(key, value, len, now, maxAge); // oversized objects fall out of cache automatically. | 
						|
 | 
						|
  if (hit.length > this[MAX]) { | 
						|
    if (this[DISPOSE]) { | 
						|
      this[DISPOSE](key, value); | 
						|
    } | 
						|
 | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  this[LENGTH] += hit.length; | 
						|
  this[LRU_LIST].unshift(hit); | 
						|
  this[CACHE].set(key, this[LRU_LIST].head); | 
						|
  trim$2(this); | 
						|
  return true; | 
						|
}; | 
						|
 | 
						|
LRUCache.prototype.has = function (key) { | 
						|
  if (!this[CACHE].has(key)) return false; | 
						|
  var hit = this[CACHE].get(key).value; | 
						|
 | 
						|
  if (isStale(this, hit)) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  return true; | 
						|
}; | 
						|
 | 
						|
LRUCache.prototype.get = function (key) { | 
						|
  return get(this, key, true); | 
						|
}; | 
						|
 | 
						|
LRUCache.prototype.peek = function (key) { | 
						|
  return get(this, key, false); | 
						|
}; | 
						|
 | 
						|
LRUCache.prototype.pop = function () { | 
						|
  var node = this[LRU_LIST].tail; | 
						|
  if (!node) return null; | 
						|
  del(this, node); | 
						|
  return node.value; | 
						|
}; | 
						|
 | 
						|
LRUCache.prototype.del = function (key) { | 
						|
  del(this, this[CACHE].get(key)); | 
						|
}; | 
						|
 | 
						|
LRUCache.prototype.load = function (arr) { | 
						|
  // reset the cache | 
						|
  this.reset(); | 
						|
  var now = Date.now(); // A previous serialized cache has the most recent items first | 
						|
 | 
						|
  for (var l = arr.length - 1; l >= 0; l--) { | 
						|
    var hit = arr[l]; | 
						|
    var expiresAt = hit.e || 0; | 
						|
 | 
						|
    if (expiresAt === 0) { | 
						|
      // the item was created without expiration in a non aged cache | 
						|
      this.set(hit.k, hit.v); | 
						|
    } else { | 
						|
      var maxAge = expiresAt - now; // dont add already expired items | 
						|
 | 
						|
      if (maxAge > 0) { | 
						|
        this.set(hit.k, hit.v, maxAge); | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
}; | 
						|
 | 
						|
LRUCache.prototype.prune = function () { | 
						|
  var self = this; | 
						|
  this[CACHE].forEach(function (value, key) { | 
						|
    get(self, key, false); | 
						|
  }); | 
						|
}; | 
						|
 | 
						|
function get(self, key, doUse) { | 
						|
  var node = self[CACHE].get(key); | 
						|
 | 
						|
  if (node) { | 
						|
    var hit = node.value; | 
						|
 | 
						|
    if (isStale(self, hit)) { | 
						|
      del(self, node); | 
						|
      if (!self[ALLOW_STALE]) hit = undefined; | 
						|
    } else { | 
						|
      if (doUse) { | 
						|
        self[LRU_LIST].unshiftNode(node); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    if (hit) hit = hit.value; | 
						|
  } | 
						|
 | 
						|
  return hit; | 
						|
} | 
						|
 | 
						|
function isStale(self, hit) { | 
						|
  if (!hit || !hit.maxAge && !self[MAX_AGE]) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  var stale = false; | 
						|
  var diff = Date.now() - hit.now; | 
						|
 | 
						|
  if (hit.maxAge) { | 
						|
    stale = diff > hit.maxAge; | 
						|
  } else { | 
						|
    stale = self[MAX_AGE] && diff > self[MAX_AGE]; | 
						|
  } | 
						|
 | 
						|
  return stale; | 
						|
} | 
						|
 | 
						|
function trim$2(self) { | 
						|
  if (self[LENGTH] > self[MAX]) { | 
						|
    for (var walker = self[LRU_LIST].tail; self[LENGTH] > self[MAX] && walker !== null;) { | 
						|
      // We know that we're about to delete this one, and also | 
						|
      // what the next least recently used key will be, so just | 
						|
      // go ahead and set it now. | 
						|
      var prev = walker.prev; | 
						|
      del(self, walker); | 
						|
      walker = prev; | 
						|
    } | 
						|
  } | 
						|
} | 
						|
 | 
						|
function del(self, node) { | 
						|
  if (node) { | 
						|
    var hit = node.value; | 
						|
 | 
						|
    if (self[DISPOSE]) { | 
						|
      self[DISPOSE](hit.key, hit.value); | 
						|
    } | 
						|
 | 
						|
    self[LENGTH] -= hit.length; | 
						|
    self[CACHE].delete(hit.key); | 
						|
    self[LRU_LIST].removeNode(node); | 
						|
  } | 
						|
} // classy, since V8 prefers predictable objects. | 
						|
 | 
						|
 | 
						|
function Entry$1(key, value, length, now, maxAge) { | 
						|
  this.key = key; | 
						|
  this.value = value; | 
						|
  this.length = length; | 
						|
  this.now = now; | 
						|
  this.maxAge = maxAge || 0; | 
						|
} | 
						|
 | 
						|
var sigmund_1 = sigmund; | 
						|
 | 
						|
function sigmund(subject, maxSessions) { | 
						|
  maxSessions = maxSessions || 10; | 
						|
  var notes = []; | 
						|
  var analysis = ''; | 
						|
  var RE = RegExp; | 
						|
 | 
						|
  function psychoAnalyze(subject, session) { | 
						|
    if (session > maxSessions) return; | 
						|
 | 
						|
    if (typeof subject === 'function' || typeof subject === 'undefined') { | 
						|
      return; | 
						|
    } | 
						|
 | 
						|
    if (typeof subject !== 'object' || !subject || subject instanceof RE) { | 
						|
      analysis += subject; | 
						|
      return; | 
						|
    } | 
						|
 | 
						|
    if (notes.indexOf(subject) !== -1 || session === maxSessions) return; | 
						|
    notes.push(subject); | 
						|
    analysis += '{'; | 
						|
    Object.keys(subject).forEach(function (issue, _, __) { | 
						|
      // pseudo-private values.  skip those. | 
						|
      if (issue.charAt(0) === '_') return; | 
						|
      var to = typeof subject[issue]; | 
						|
      if (to === 'function' || to === 'undefined') return; | 
						|
      analysis += issue; | 
						|
      psychoAnalyze(subject[issue], session + 1); | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  psychoAnalyze(subject, 0); | 
						|
  return analysis; | 
						|
} // vim: set softtabstop=4 shiftwidth=4: | 
						|
 | 
						|
var fnmatch = createCommonjsModule(function (module, exports) { | 
						|
  // Based on minimatch.js by isaacs <https://npmjs.org/package/minimatch> | 
						|
  var platform = typeof process === "object" ? process.platform : "win32"; | 
						|
  if (module) module.exports = minimatch;else exports.minimatch = minimatch; | 
						|
  minimatch.Minimatch = Minimatch; | 
						|
  var cache = minimatch.cache = new lruCache({ | 
						|
    max: 100 | 
						|
  }), | 
						|
      GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}; | 
						|
  var qmark = "[^/]" // * => any number of characters | 
						|
  , | 
						|
      star = qmark + "*?" // ** when dots are allowed.  Anything goes, except .. and . | 
						|
  // not (^ or / followed by one or two dots followed by $ or /), | 
						|
  // followed by anything, any number of times. | 
						|
  , | 
						|
      twoStarDot = "(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?" // not a ^ or / followed by a dot, | 
						|
  // followed by anything, any number of times. | 
						|
  , | 
						|
      twoStarNoDot = "(?:(?!(?:\\\/|^)\\.).)*?" // characters that need to be escaped in RegExp. | 
						|
  , | 
						|
      reSpecials = charSet("().*{}+?[]^$\\!"); // "abc" -> { a:true, b:true, c:true } | 
						|
 | 
						|
  function charSet(s) { | 
						|
    return s.split("").reduce(function (set, c) { | 
						|
      set[c] = true; | 
						|
      return set; | 
						|
    }, {}); | 
						|
  } // normalizes slashes. | 
						|
 | 
						|
 | 
						|
  var slashSplit = /\/+/; | 
						|
  minimatch.monkeyPatch = monkeyPatch; | 
						|
 | 
						|
  function monkeyPatch() { | 
						|
    var desc = Object.getOwnPropertyDescriptor(String.prototype, "match"); | 
						|
    var orig = desc.value; | 
						|
 | 
						|
    desc.value = function (p) { | 
						|
      if (p instanceof Minimatch) return p.match(this); | 
						|
      return orig.call(this, p); | 
						|
    }; | 
						|
 | 
						|
    Object.defineProperty(String.prototype, desc); | 
						|
  } | 
						|
 | 
						|
  minimatch.filter = filter; | 
						|
 | 
						|
  function filter(pattern, options) { | 
						|
    options = options || {}; | 
						|
    return function (p, i, list) { | 
						|
      return minimatch(p, pattern, options); | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  function ext(a, b) { | 
						|
    a = a || {}; | 
						|
    b = b || {}; | 
						|
    var t = {}; | 
						|
    Object.keys(b).forEach(function (k) { | 
						|
      t[k] = b[k]; | 
						|
    }); | 
						|
    Object.keys(a).forEach(function (k) { | 
						|
      t[k] = a[k]; | 
						|
    }); | 
						|
    return t; | 
						|
  } | 
						|
 | 
						|
  minimatch.defaults = function (def) { | 
						|
    if (!def || !Object.keys(def).length) return minimatch; | 
						|
    var orig = minimatch; | 
						|
 | 
						|
    var m = function minimatch(p, pattern, options) { | 
						|
      return orig.minimatch(p, pattern, ext(def, options)); | 
						|
    }; | 
						|
 | 
						|
    m.Minimatch = function Minimatch(pattern, options) { | 
						|
      return new orig.Minimatch(pattern, ext(def, options)); | 
						|
    }; | 
						|
 | 
						|
    return m; | 
						|
  }; | 
						|
 | 
						|
  Minimatch.defaults = function (def) { | 
						|
    if (!def || !Object.keys(def).length) return Minimatch; | 
						|
    return minimatch.defaults(def).Minimatch; | 
						|
  }; | 
						|
 | 
						|
  function minimatch(p, pattern, options) { | 
						|
    if (typeof pattern !== "string") { | 
						|
      throw new TypeError("glob pattern string required"); | 
						|
    } | 
						|
 | 
						|
    if (!options) options = {}; // shortcut: comments match nothing. | 
						|
 | 
						|
    if (!options.nocomment && pattern.charAt(0) === "#") { | 
						|
      return false; | 
						|
    } // "" only matches "" | 
						|
 | 
						|
 | 
						|
    if (pattern.trim() === "") return p === ""; | 
						|
    return new Minimatch(pattern, options).match(p); | 
						|
  } | 
						|
 | 
						|
  function Minimatch(pattern, options) { | 
						|
    if (!(this instanceof Minimatch)) { | 
						|
      return new Minimatch(pattern, options, cache); | 
						|
    } | 
						|
 | 
						|
    if (typeof pattern !== "string") { | 
						|
      throw new TypeError("glob pattern string required"); | 
						|
    } | 
						|
 | 
						|
    if (!options) options = {}; // windows: need to use /, not \ | 
						|
    // On other platforms, \ is a valid (albeit bad) filename char. | 
						|
 | 
						|
    if (platform === "win32") { | 
						|
      pattern = pattern.split("\\").join("/"); | 
						|
    } // lru storage. | 
						|
    // these things aren't particularly big, but walking down the string | 
						|
    // and turning it into a regexp can get pretty costly. | 
						|
 | 
						|
 | 
						|
    var cacheKey = pattern + "\n" + sigmund_1(options); | 
						|
    var cached = minimatch.cache.get(cacheKey); | 
						|
    if (cached) return cached; | 
						|
    minimatch.cache.set(cacheKey, this); | 
						|
    this.options = options; | 
						|
    this.set = []; | 
						|
    this.pattern = pattern; | 
						|
    this.regexp = null; | 
						|
    this.negate = false; | 
						|
    this.comment = false; | 
						|
    this.empty = false; // make the set of regexps etc. | 
						|
 | 
						|
    this.make(); | 
						|
  } | 
						|
 | 
						|
  Minimatch.prototype.make = make; | 
						|
 | 
						|
  function make() { | 
						|
    // don't do it more than once. | 
						|
    if (this._made) return; | 
						|
    var pattern = this.pattern; | 
						|
    var options = this.options; // empty patterns and comments match nothing. | 
						|
 | 
						|
    if (!options.nocomment && pattern.charAt(0) === "#") { | 
						|
      this.comment = true; | 
						|
      return; | 
						|
    } | 
						|
 | 
						|
    if (!pattern) { | 
						|
      this.empty = true; | 
						|
      return; | 
						|
    } // step 1: figure out negation, etc. | 
						|
 | 
						|
 | 
						|
    this.parseNegate(); // step 2: expand braces | 
						|
 | 
						|
    var set = this.globSet = this.braceExpand(); | 
						|
    if (options.debug) console.error(this.pattern, set); // step 3: now we have a set, so turn each one into a series of path-portion | 
						|
    // matching patterns. | 
						|
    // These will be regexps, except in the case of "**", which is | 
						|
    // set to the GLOBSTAR object for globstar behavior, | 
						|
    // and will not contain any / characters | 
						|
 | 
						|
    set = this.globParts = set.map(function (s) { | 
						|
      return s.split(slashSplit); | 
						|
    }); | 
						|
    if (options.debug) console.error(this.pattern, set); // glob --> regexps | 
						|
 | 
						|
    set = set.map(function (s, si, set) { | 
						|
      return s.map(this.parse, this); | 
						|
    }, this); | 
						|
    if (options.debug) console.error(this.pattern, set); // filter out everything that didn't compile properly. | 
						|
 | 
						|
    set = set.filter(function (s) { | 
						|
      return -1 === s.indexOf(false); | 
						|
    }); | 
						|
    if (options.debug) console.error(this.pattern, set); | 
						|
    this.set = set; | 
						|
  } | 
						|
 | 
						|
  Minimatch.prototype.parseNegate = parseNegate; | 
						|
 | 
						|
  function parseNegate() { | 
						|
    var pattern = this.pattern, | 
						|
        negate = false, | 
						|
        options = this.options, | 
						|
        negateOffset = 0; | 
						|
    if (options.nonegate) return; | 
						|
 | 
						|
    for (var i = 0, l = pattern.length; i < l && pattern.charAt(i) === "!"; i++) { | 
						|
      negate = !negate; | 
						|
      negateOffset++; | 
						|
    } | 
						|
 | 
						|
    if (negateOffset) this.pattern = pattern.substr(negateOffset); | 
						|
    this.negate = negate; | 
						|
  } // Brace expansion: | 
						|
  // a{b,c}d -> abd acd | 
						|
  // a{b,}c -> abc ac | 
						|
  // a{0..3}d -> a0d a1d a2d a3d | 
						|
  // a{b,c{d,e}f}g -> abg acdfg acefg | 
						|
  // a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg | 
						|
  // | 
						|
  // Invalid sets are not expanded. | 
						|
  // a{2..}b -> a{2..}b | 
						|
  // a{b}c -> a{b}c | 
						|
 | 
						|
 | 
						|
  minimatch.braceExpand = function (pattern, options) { | 
						|
    return new Minimatch(pattern, options).braceExpand(); | 
						|
  }; | 
						|
 | 
						|
  Minimatch.prototype.braceExpand = braceExpand; | 
						|
 | 
						|
  function braceExpand(pattern, options) { | 
						|
    options = options || this.options; | 
						|
    pattern = typeof pattern === "undefined" ? this.pattern : pattern; | 
						|
 | 
						|
    if (typeof pattern === "undefined") { | 
						|
      throw new Error("undefined pattern"); | 
						|
    } | 
						|
 | 
						|
    if (options.nobrace || !pattern.match(/\{.*\}/)) { | 
						|
      // shortcut. no need to expand. | 
						|
      return [pattern]; | 
						|
    } | 
						|
 | 
						|
    var escaping = false; // examples and comments refer to this crazy pattern: | 
						|
    // a{b,c{d,e},{f,g}h}x{y,z} | 
						|
    // expected: | 
						|
    // abxy | 
						|
    // abxz | 
						|
    // acdxy | 
						|
    // acdxz | 
						|
    // acexy | 
						|
    // acexz | 
						|
    // afhxy | 
						|
    // afhxz | 
						|
    // aghxy | 
						|
    // aghxz | 
						|
    // everything before the first \{ is just a prefix. | 
						|
    // So, we pluck that off, and work with the rest, | 
						|
    // and then prepend it to everything we find. | 
						|
 | 
						|
    if (pattern.charAt(0) !== "{") { | 
						|
      // console.error(pattern) | 
						|
      var prefix = null; | 
						|
 | 
						|
      for (var i = 0, l = pattern.length; i < l; i++) { | 
						|
        var c = pattern.charAt(i); // console.error(i, c) | 
						|
 | 
						|
        if (c === "\\") { | 
						|
          escaping = !escaping; | 
						|
        } else if (c === "{" && !escaping) { | 
						|
          prefix = pattern.substr(0, i); | 
						|
          break; | 
						|
        } | 
						|
      } // actually no sets, all { were escaped. | 
						|
 | 
						|
 | 
						|
      if (prefix === null) { | 
						|
        // console.error("no sets") | 
						|
        return [pattern]; | 
						|
      } | 
						|
 | 
						|
      var tail = braceExpand(pattern.substr(i), options); | 
						|
      return tail.map(function (t) { | 
						|
        return prefix + t; | 
						|
      }); | 
						|
    } // now we have something like: | 
						|
    // {b,c{d,e},{f,g}h}x{y,z} | 
						|
    // walk through the set, expanding each part, until | 
						|
    // the set ends.  then, we'll expand the suffix. | 
						|
    // If the set only has a single member, then'll put the {} back | 
						|
    // first, handle numeric sets, since they're easier | 
						|
 | 
						|
 | 
						|
    var numset = pattern.match(/^\{(-?[0-9]+)\.\.(-?[0-9]+)\}/); | 
						|
 | 
						|
    if (numset) { | 
						|
      // console.error("numset", numset[1], numset[2]) | 
						|
      var suf = braceExpand(pattern.substr(numset[0].length), options), | 
						|
          start = +numset[1], | 
						|
          end = +numset[2], | 
						|
          inc = start > end ? -1 : 1, | 
						|
          set = []; | 
						|
 | 
						|
      for (var i = start; i != end + inc; i += inc) { | 
						|
        // append all the suffixes | 
						|
        for (var ii = 0, ll = suf.length; ii < ll; ii++) { | 
						|
          set.push(i + suf[ii]); | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      return set; | 
						|
    } // ok, walk through the set | 
						|
    // We hope, somewhat optimistically, that there | 
						|
    // will be a } at the end. | 
						|
    // If the closing brace isn't found, then the pattern is | 
						|
    // interpreted as braceExpand("\\" + pattern) so that | 
						|
    // the leading \{ will be interpreted literally. | 
						|
 | 
						|
 | 
						|
    var i = 1 // skip the \{ | 
						|
    , | 
						|
        depth = 1, | 
						|
        set = [], | 
						|
        member = "", | 
						|
        escaping = false; | 
						|
 | 
						|
    function addMember() { | 
						|
      set.push(member); | 
						|
      member = ""; | 
						|
    } // console.error("Entering for") | 
						|
 | 
						|
 | 
						|
    FOR: for (i = 1, l = pattern.length; i < l; i++) { | 
						|
      var c = pattern.charAt(i); // console.error("", i, c) | 
						|
 | 
						|
      if (escaping) { | 
						|
        escaping = false; | 
						|
        member += "\\" + c; | 
						|
      } else { | 
						|
        switch (c) { | 
						|
          case "\\": | 
						|
            escaping = true; | 
						|
            continue; | 
						|
 | 
						|
          case "{": | 
						|
            depth++; | 
						|
            member += "{"; | 
						|
            continue; | 
						|
 | 
						|
          case "}": | 
						|
            depth--; // if this closes the actual set, then we're done | 
						|
 | 
						|
            if (depth === 0) { | 
						|
              addMember(); // pluck off the close-brace | 
						|
 | 
						|
              i++; | 
						|
              break FOR; | 
						|
            } else { | 
						|
              member += c; | 
						|
              continue; | 
						|
            } | 
						|
 | 
						|
          case ",": | 
						|
            if (depth === 1) { | 
						|
              addMember(); | 
						|
            } else { | 
						|
              member += c; | 
						|
            } | 
						|
 | 
						|
            continue; | 
						|
 | 
						|
          default: | 
						|
            member += c; | 
						|
            continue; | 
						|
        } // switch | 
						|
 | 
						|
      } // else | 
						|
 | 
						|
    } // for | 
						|
    // now we've either finished the set, and the suffix is | 
						|
    // pattern.substr(i), or we have *not* closed the set, | 
						|
    // and need to escape the leading brace | 
						|
 | 
						|
 | 
						|
    if (depth !== 0) { | 
						|
      // console.error("didn't close", pattern) | 
						|
      return braceExpand("\\" + pattern, options); | 
						|
    } // x{y,z} -> ["xy", "xz"] | 
						|
    // console.error("set", set) | 
						|
    // console.error("suffix", pattern.substr(i)) | 
						|
 | 
						|
 | 
						|
    var suf = braceExpand(pattern.substr(i), options); // ["b", "c{d,e}","{f,g}h"] -> | 
						|
    //   [["b"], ["cd", "ce"], ["fh", "gh"]] | 
						|
 | 
						|
    var addBraces = set.length === 1; // console.error("set pre-expanded", set) | 
						|
 | 
						|
    set = set.map(function (p) { | 
						|
      return braceExpand(p, options); | 
						|
    }); // console.error("set expanded", set) | 
						|
    // [["b"], ["cd", "ce"], ["fh", "gh"]] -> | 
						|
    //   ["b", "cd", "ce", "fh", "gh"] | 
						|
 | 
						|
    set = set.reduce(function (l, r) { | 
						|
      return l.concat(r); | 
						|
    }); | 
						|
 | 
						|
    if (addBraces) { | 
						|
      set = set.map(function (s) { | 
						|
        return "{" + s + "}"; | 
						|
      }); | 
						|
    } // now attach the suffixes. | 
						|
 | 
						|
 | 
						|
    var ret = []; | 
						|
 | 
						|
    for (var i = 0, l = set.length; i < l; i++) { | 
						|
      for (var ii = 0, ll = suf.length; ii < ll; ii++) { | 
						|
        ret.push(set[i] + suf[ii]); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return ret; | 
						|
  } // parse a component of the expanded set. | 
						|
  // At this point, no pattern may contain "/" in it | 
						|
  // so we're going to return a 2d array, where each entry is the full | 
						|
  // pattern, split on '/', and then turned into a regular expression. | 
						|
  // A regexp is made at the end which joins each array with an | 
						|
  // escaped /, and another full one which joins each regexp with |. | 
						|
  // | 
						|
  // Following the lead of Bash 4.1, note that "**" only has special meaning | 
						|
  // when it is the *only* thing in a path portion.  Otherwise, any series | 
						|
  // of * is equivalent to a single *.  Globstar behavior is enabled by | 
						|
  // default, and can be disabled by setting options.noglobstar. | 
						|
 | 
						|
 | 
						|
  Minimatch.prototype.parse = parse; | 
						|
  var SUBPARSE = {}; | 
						|
 | 
						|
  function parse(pattern, isSub) { | 
						|
    var options = this.options; // shortcuts | 
						|
 | 
						|
    if (!options.noglobstar && pattern === "**") return GLOBSTAR; | 
						|
    if (pattern === "") return ""; | 
						|
    var re = "", | 
						|
        hasMagic = !!options.nocase, | 
						|
        escaping = false // ? => one single character | 
						|
    , | 
						|
        patternListStack = [], | 
						|
        plType, | 
						|
        stateChar, | 
						|
        inClass = false, | 
						|
        reClassStart = -1, | 
						|
        classStart = -1 // . and .. never match anything that doesn't start with ., | 
						|
    // even when options.dot is set. | 
						|
    , | 
						|
        patternStart = pattern.charAt(0) === "." ? "" // anything | 
						|
    // not (start or / followed by . or .. followed by / or end) | 
						|
    : options.dot ? "(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))" : "(?!\\.)"; | 
						|
 | 
						|
    function clearStateChar() { | 
						|
      if (stateChar) { | 
						|
        // we had some state-tracking character | 
						|
        // that wasn't consumed by this pass. | 
						|
        switch (stateChar) { | 
						|
          case "*": | 
						|
            re += star; | 
						|
            hasMagic = true; | 
						|
            break; | 
						|
 | 
						|
          case "?": | 
						|
            re += qmark; | 
						|
            hasMagic = true; | 
						|
            break; | 
						|
 | 
						|
          default: | 
						|
            re += "\\" + stateChar; | 
						|
            break; | 
						|
        } | 
						|
 | 
						|
        stateChar = false; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    for (var i = 0, len = pattern.length, c; i < len && (c = pattern.charAt(i)); i++) { | 
						|
      if (options.debug) { | 
						|
        console.error("%s\t%s %s %j", pattern, i, re, c); | 
						|
      } // skip over any that are escaped. | 
						|
 | 
						|
 | 
						|
      if (escaping && reSpecials[c]) { | 
						|
        re += "\\" + c; | 
						|
        escaping = false; | 
						|
        continue; | 
						|
      } | 
						|
 | 
						|
       switch (c) { | 
						|
        case "/": | 
						|
          // completely not allowed, even escaped. | 
						|
          // Should already be path-split by now. | 
						|
          return false; | 
						|
 | 
						|
        case "\\": | 
						|
          clearStateChar(); | 
						|
          escaping = true; | 
						|
          continue; | 
						|
        // the various stateChar values | 
						|
        // for the "extglob" stuff. | 
						|
 | 
						|
        case "?": | 
						|
        case "*": | 
						|
        case "+": | 
						|
        case "@": | 
						|
        case "!": | 
						|
          if (options.debug) { | 
						|
            console.error("%s\t%s %s %j <-- stateChar", pattern, i, re, c); | 
						|
          } // all of those are literals inside a class, except that | 
						|
          // the glob [!a] means [^a] in regexp | 
						|
 | 
						|
 | 
						|
          if (inClass) { | 
						|
            if (c === "!" && i === classStart + 1) c = "^"; | 
						|
            re += c; | 
						|
            continue; | 
						|
          } // if we already have a stateChar, then it means | 
						|
          // that there was something like ** or +? in there. | 
						|
          // Handle the stateChar, then proceed with this one. | 
						|
 | 
						|
 | 
						|
          clearStateChar(); | 
						|
          stateChar = c; // if extglob is disabled, then +(asdf|foo) isn't a thing. | 
						|
          // just clear the statechar *now*, rather than even diving into | 
						|
          // the patternList stuff. | 
						|
 | 
						|
          if (options.noext) clearStateChar(); | 
						|
          continue; | 
						|
 | 
						|
        case "(": | 
						|
          if (inClass) { | 
						|
            re += "("; | 
						|
            continue; | 
						|
          } | 
						|
 | 
						|
          if (!stateChar) { | 
						|
            re += "\\("; | 
						|
            continue; | 
						|
          } | 
						|
 | 
						|
          plType = stateChar; | 
						|
          patternListStack.push({ | 
						|
            type: plType, | 
						|
            start: i - 1, | 
						|
            reStart: re.length | 
						|
          }); // negation is (?:(?!js)[^/]*) | 
						|
 | 
						|
          re += stateChar === "!" ? "(?:(?!" : "(?:"; | 
						|
          stateChar = false; | 
						|
          continue; | 
						|
 | 
						|
        case ")": | 
						|
          if (inClass || !patternListStack.length) { | 
						|
            re += "\\)"; | 
						|
            continue; | 
						|
          } | 
						|
 | 
						|
          hasMagic = true; | 
						|
          re += ")"; | 
						|
          plType = patternListStack.pop().type; // negation is (?:(?!js)[^/]*) | 
						|
          // The others are (?:<pattern>)<type> | 
						|
 | 
						|
          switch (plType) { | 
						|
            case "!": | 
						|
              re += "[^/]*?)"; | 
						|
              break; | 
						|
 | 
						|
            case "?": | 
						|
            case "+": | 
						|
            case "*": | 
						|
              re += plType; | 
						|
            // the default anyway | 
						|
          } | 
						|
 | 
						|
          continue; | 
						|
 | 
						|
        case "|": | 
						|
          if (inClass || !patternListStack.length || escaping) { | 
						|
            re += "\\|"; | 
						|
            escaping = false; | 
						|
            continue; | 
						|
          } | 
						|
 | 
						|
          re += "|"; | 
						|
          continue; | 
						|
        // these are mostly the same in regexp and glob | 
						|
 | 
						|
        case "[": | 
						|
          // swallow any state-tracking char before the [ | 
						|
          clearStateChar(); | 
						|
 | 
						|
          if (inClass) { | 
						|
            re += "\\" + c; | 
						|
            continue; | 
						|
          } | 
						|
 | 
						|
          inClass = true; | 
						|
          classStart = i; | 
						|
          reClassStart = re.length; | 
						|
          re += c; | 
						|
          continue; | 
						|
 | 
						|
        case "]": | 
						|
          //  a right bracket shall lose its special | 
						|
          //  meaning and represent itself in | 
						|
          //  a bracket expression if it occurs | 
						|
          //  first in the list.  -- POSIX.2 2.8.3.2 | 
						|
          if (i === classStart + 1 || !inClass) { | 
						|
            re += "\\" + c; | 
						|
            escaping = false; | 
						|
            continue; | 
						|
          } // finish up the class. | 
						|
 | 
						|
 | 
						|
          hasMagic = true; | 
						|
          inClass = false; | 
						|
          re += c; | 
						|
          continue; | 
						|
 | 
						|
        default: | 
						|
          // swallow any state char that wasn't consumed | 
						|
          clearStateChar(); | 
						|
 | 
						|
          if (escaping) { | 
						|
            // no need | 
						|
            escaping = false; | 
						|
          } else if (reSpecials[c] && !(c === "^" && inClass)) { | 
						|
            re += "\\"; | 
						|
          } | 
						|
 | 
						|
          re += c; | 
						|
      } // switch | 
						|
 | 
						|
    } // for | 
						|
    // handle the case where we left a class open. | 
						|
    // "[abc" is valid, equivalent to "\[abc" | 
						|
 | 
						|
 | 
						|
    if (inClass) { | 
						|
      // split where the last [ was, and escape it | 
						|
      // this is a huge pita.  We now have to re-walk | 
						|
      // the contents of the would-be class to re-translate | 
						|
      // any characters that were passed through as-is | 
						|
      var cs = pattern.substr(classStart + 1), | 
						|
          sp = this.parse(cs, SUBPARSE); | 
						|
      re = re.substr(0, reClassStart) + "\\[" + sp[0]; | 
						|
      hasMagic = hasMagic || sp[1]; | 
						|
    } // handle the case where we had a +( thing at the *end* | 
						|
    // of the pattern. | 
						|
    // each pattern list stack adds 3 chars, and we need to go through | 
						|
    // and escape any | chars that were passed through as-is for the regexp. | 
						|
    // Go through and escape them, taking care not to double-escape any | 
						|
    // | chars that were already escaped. | 
						|
 | 
						|
 | 
						|
    var pl; | 
						|
 | 
						|
    while (pl = patternListStack.pop()) { | 
						|
      var tail = re.slice(pl.reStart + 3); // maybe some even number of \, then maybe 1 \, followed by a | | 
						|
 | 
						|
      tail = tail.replace(/((?:\\{2})*)(\\?)\|/g, function (_, $1, $2) { | 
						|
        if (!$2) { | 
						|
          // the | isn't already escaped, so escape it. | 
						|
          $2 = "\\"; | 
						|
        } // need to escape all those slashes *again*, without escaping the | 
						|
        // one that we need for escaping the | character.  As it works out, | 
						|
        // escaping an even number of slashes can be done by simply repeating | 
						|
        // it exactly after itself.  That's why this trick works. | 
						|
        // | 
						|
        // I am sorry that you have to see this. | 
						|
 | 
						|
 | 
						|
        return $1 + $1 + $2 + "|"; | 
						|
      }); // console.error("tail=%j\n   %s", tail, tail) | 
						|
 | 
						|
      var t = pl.type === "*" ? star : pl.type === "?" ? qmark : "\\" + pl.type; | 
						|
      hasMagic = true; | 
						|
      re = re.slice(0, pl.reStart) + t + "\\(" + tail; | 
						|
    } // handle trailing things that only matter at the very end. | 
						|
 | 
						|
 | 
						|
    clearStateChar(); | 
						|
 | 
						|
    if (escaping) { | 
						|
      // trailing \\ | 
						|
      re += "\\\\"; | 
						|
    } // only need to apply the nodot start if the re starts with | 
						|
    // something that could conceivably capture a dot | 
						|
 | 
						|
 | 
						|
    var addPatternStart = false; | 
						|
 | 
						|
    switch (re.charAt(0)) { | 
						|
      case ".": | 
						|
      case "[": | 
						|
      case "(": | 
						|
        addPatternStart = true; | 
						|
    } // if the re is not "" at this point, then we need to make sure | 
						|
    // it doesn't match against an empty path part. | 
						|
    // Otherwise a/* will match a/, which it should not. | 
						|
 | 
						|
 | 
						|
    if (re !== "" && hasMagic) re = "(?=.)" + re; | 
						|
    if (addPatternStart) re = patternStart + re; // parsing just a piece of a larger pattern. | 
						|
 | 
						|
    if (isSub === SUBPARSE) { | 
						|
      return [re, hasMagic]; | 
						|
    } // skip the regexp for non-magical patterns | 
						|
    // unescape anything in it, though, so that it'll be | 
						|
    // an exact match against a file etc. | 
						|
 | 
						|
 | 
						|
    if (!hasMagic) { | 
						|
      return globUnescape(pattern); | 
						|
    } | 
						|
 | 
						|
    var flags = options.nocase ? "i" : "", | 
						|
        regExp = new RegExp("^" + re + "$", flags); | 
						|
    regExp._glob = pattern; | 
						|
    regExp._src = re; | 
						|
    return regExp; | 
						|
  } | 
						|
 | 
						|
  minimatch.makeRe = function (pattern, options) { | 
						|
    return new Minimatch(pattern, options || {}).makeRe(); | 
						|
  }; | 
						|
 | 
						|
  Minimatch.prototype.makeRe = makeRe; | 
						|
 | 
						|
  function makeRe() { | 
						|
    if (this.regexp || this.regexp === false) return this.regexp; // at this point, this.set is a 2d array of partial | 
						|
    // pattern strings, or "**". | 
						|
    // | 
						|
    // It's better to use .match().  This function shouldn't | 
						|
    // be used, really, but it's pretty convenient sometimes, | 
						|
    // when you just want to work with a regex. | 
						|
 | 
						|
    var set = this.set; | 
						|
    if (!set.length) return this.regexp = false; | 
						|
    var options = this.options; | 
						|
    var twoStar = options.noglobstar ? star : options.dot ? twoStarDot : twoStarNoDot, | 
						|
        flags = options.nocase ? "i" : ""; | 
						|
    var re = set.map(function (pattern) { | 
						|
      return pattern.map(function (p) { | 
						|
        return p === GLOBSTAR ? twoStar : typeof p === "string" ? regExpEscape(p) : p._src; | 
						|
      }).join("\\\/"); | 
						|
    }).join("|"); // must match entire pattern | 
						|
    // ending in a * or ** will make it less strict. | 
						|
 | 
						|
    re = "^(?:" + re + ")$"; // can match anything, as long as it's not this. | 
						|
 | 
						|
    if (this.negate) re = "^(?!" + re + ").*$"; | 
						|
 | 
						|
    try { | 
						|
      return this.regexp = new RegExp(re, flags); | 
						|
    } catch (ex) { | 
						|
      return this.regexp = false; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  minimatch.match = function (list, pattern, options) { | 
						|
    var mm = new Minimatch(pattern, options); | 
						|
    list = list.filter(function (f) { | 
						|
      return mm.match(f); | 
						|
    }); | 
						|
 | 
						|
    if (options.nonull && !list.length) { | 
						|
      list.push(pattern); | 
						|
    } | 
						|
 | 
						|
    return list; | 
						|
  }; | 
						|
 | 
						|
  Minimatch.prototype.match = match; | 
						|
 | 
						|
  function match(f, partial) { | 
						|
    // console.error("match", f, this.pattern) | 
						|
    // short-circuit in the case of busted things. | 
						|
    // comments, etc. | 
						|
    if (this.comment) return false; | 
						|
    if (this.empty) return f === ""; | 
						|
    if (f === "/" && partial) return true; | 
						|
    var options = this.options; // windows: need to use /, not \ | 
						|
    // On other platforms, \ is a valid (albeit bad) filename char. | 
						|
 | 
						|
    if (platform === "win32") { | 
						|
      f = f.split("\\").join("/"); | 
						|
    } // treat the test path as a set of pathparts. | 
						|
 | 
						|
 | 
						|
    f = f.split(slashSplit); | 
						|
 | 
						|
    if (options.debug) { | 
						|
      console.error(this.pattern, "split", f); | 
						|
    } // just ONE of the pattern sets in this.set needs to match | 
						|
    // in order for it to be valid.  If negating, then just one | 
						|
    // match means that we have failed. | 
						|
    // Either way, return on the first hit. | 
						|
 | 
						|
 | 
						|
    var set = this.set; // console.error(this.pattern, "set", set) | 
						|
 | 
						|
    for (var i = 0, l = set.length; i < l; i++) { | 
						|
      var pattern = set[i]; | 
						|
      var hit = this.matchOne(f, pattern, partial); | 
						|
 | 
						|
      if (hit) { | 
						|
        if (options.flipNegate) return true; | 
						|
        return !this.negate; | 
						|
      } | 
						|
    } // didn't get any hits.  this is success if it's a negative | 
						|
    // pattern, failure otherwise. | 
						|
 | 
						|
 | 
						|
    if (options.flipNegate) return false; | 
						|
    return this.negate; | 
						|
  } // set partial to true to test if, for example, | 
						|
  // "/a/b" matches the start of "/*/b/*/d" | 
						|
  // Partial means, if you run out of file before you run | 
						|
  // out of pattern, then that's fine, as long as all | 
						|
  // the parts match. | 
						|
 | 
						|
 | 
						|
  Minimatch.prototype.matchOne = function (file, pattern, partial) { | 
						|
    var options = this.options; | 
						|
 | 
						|
    if (options.debug) { | 
						|
      console.error("matchOne", { | 
						|
        "this": this, | 
						|
        file: file, | 
						|
        pattern: pattern | 
						|
      }); | 
						|
    } | 
						|
 | 
						|
    if (options.matchBase && pattern.length === 1) { | 
						|
      file = path$2.basename(file.join("/")).split("/"); | 
						|
    } | 
						|
 | 
						|
    if (options.debug) { | 
						|
      console.error("matchOne", file.length, pattern.length); | 
						|
    } | 
						|
 | 
						|
    for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) { | 
						|
      if (options.debug) { | 
						|
        console.error("matchOne loop"); | 
						|
      } | 
						|
 | 
						|
      var p = pattern[pi], | 
						|
          f = file[fi]; | 
						|
 | 
						|
      if (options.debug) { | 
						|
        console.error(pattern, p, f); | 
						|
      } // should be impossible. | 
						|
      // some invalid regexp stuff in the set. | 
						|
 | 
						|
 | 
						|
      if (p === false) return false; | 
						|
 | 
						|
      if (p === GLOBSTAR) { | 
						|
        if (options.debug) console.error('GLOBSTAR', [pattern, p, f]); // "**" | 
						|
        // a/**/b/**/c would match the following: | 
						|
        // a/b/x/y/z/c | 
						|
        // a/x/y/z/b/c | 
						|
        // a/b/x/b/x/c | 
						|
        // a/b/c | 
						|
        // To do this, take the rest of the pattern after | 
						|
        // the **, and see if it would match the file remainder. | 
						|
        // If so, return success. | 
						|
        // If not, the ** "swallows" a segment, and try again. | 
						|
        // This is recursively awful. | 
						|
        // | 
						|
        // a/**/b/**/c matching a/b/x/y/z/c | 
						|
        // - a matches a | 
						|
        // - doublestar | 
						|
        //   - matchOne(b/x/y/z/c, b/**/c) | 
						|
        //     - b matches b | 
						|
        //     - doublestar | 
						|
        //       - matchOne(x/y/z/c, c) -> no | 
						|
        //       - matchOne(y/z/c, c) -> no | 
						|
        //       - matchOne(z/c, c) -> no | 
						|
        //       - matchOne(c, c) yes, hit | 
						|
 | 
						|
        var fr = fi, | 
						|
            pr = pi + 1; | 
						|
 | 
						|
        if (pr === pl) { | 
						|
          if (options.debug) console.error('** at the end'); // a ** at the end will just swallow the rest. | 
						|
          // We have found a match. | 
						|
          // however, it will not swallow /.x, unless | 
						|
          // options.dot is set. | 
						|
          // . and .. are *never* matched by **, for explosively | 
						|
          // exponential reasons. | 
						|
 | 
						|
          for (; fi < fl; fi++) { | 
						|
            if (file[fi] === "." || file[fi] === ".." || !options.dot && file[fi].charAt(0) === ".") return false; | 
						|
          } | 
						|
 | 
						|
          return true; | 
						|
        } // ok, let's see if we can swallow whatever we can. | 
						|
 | 
						|
 | 
						|
        WHILE: while (fr < fl) { | 
						|
          var swallowee = file[fr]; | 
						|
 | 
						|
          if (options.debug) { | 
						|
            console.error('\nglobstar while', file, fr, pattern, pr, swallowee); | 
						|
          } // XXX remove this slice.  Just pass the start index. | 
						|
 | 
						|
 | 
						|
          if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { | 
						|
            if (options.debug) console.error('globstar found match!', fr, fl, swallowee); // found a match. | 
						|
 | 
						|
            return true; | 
						|
          } else { | 
						|
            // can't swallow "." or ".." ever. | 
						|
            // can only swallow ".foo" when explicitly asked. | 
						|
            if (swallowee === "." || swallowee === ".." || !options.dot && swallowee.charAt(0) === ".") { | 
						|
              if (options.debug) console.error("dot detected!", file, fr, pattern, pr); | 
						|
              break WHILE; | 
						|
            } // ** swallows a segment, and continue. | 
						|
 | 
						|
 | 
						|
            if (options.debug) console.error('globstar swallow a segment, and continue'); | 
						|
            fr++; | 
						|
          } | 
						|
        } // no match was found. | 
						|
        // However, in partial mode, we can't say this is necessarily over. | 
						|
        // If there's more *pattern* left, then | 
						|
 | 
						|
 | 
						|
        if (partial) { | 
						|
          // ran out of file | 
						|
          // console.error("\n>>> no match, partial?", file, fr, pattern, pr) | 
						|
          if (fr === fl) return true; | 
						|
        } | 
						|
 | 
						|
        return false; | 
						|
      } // something other than ** | 
						|
      // non-magic patterns just have to match exactly | 
						|
      // patterns with magic have been turned into regexps. | 
						|
 | 
						|
 | 
						|
      var hit; | 
						|
 | 
						|
      if (typeof p === "string") { | 
						|
        if (options.nocase) { | 
						|
          hit = f.toLowerCase() === p.toLowerCase(); | 
						|
        } else { | 
						|
          hit = f === p; | 
						|
        } | 
						|
 | 
						|
        if (options.debug) { | 
						|
          console.error("string match", p, f, hit); | 
						|
        } | 
						|
      } else { | 
						|
        hit = f.match(p); | 
						|
 | 
						|
        if (options.debug) { | 
						|
          console.error("pattern match", p, f, hit); | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      if (!hit) return false; | 
						|
    } // Note: ending in / means that we'll get a final "" | 
						|
    // at the end of the pattern.  This can only match a | 
						|
    // corresponding "" at the end of the file. | 
						|
    // If the file ends in /, then it can only match a | 
						|
    // a pattern that ends in /, unless the pattern just | 
						|
    // doesn't have any more for it. But, a/b/ should *not* | 
						|
    // match "a/b/*", even though "" matches against the | 
						|
    // [^/]*? pattern, except in partial mode, where it might | 
						|
    // simply not be reached yet. | 
						|
    // However, a/b/ should still satisfy a/* | 
						|
    // now either we fell off the end of the pattern, or we're done. | 
						|
 | 
						|
 | 
						|
    if (fi === fl && pi === pl) { | 
						|
      // ran out of pattern and filename at the same time. | 
						|
      // an exact hit! | 
						|
      return true; | 
						|
    } else if (fi === fl) { | 
						|
      // ran out of file, but still had pattern left. | 
						|
      // this is ok if we're doing the match as part of | 
						|
      // a glob fs traversal. | 
						|
      return partial; | 
						|
    } else if (pi === pl) { | 
						|
      // ran out of pattern, still have file left. | 
						|
      // this is only acceptable if we're on the very last | 
						|
      // empty segment of a file with a trailing slash. | 
						|
      // a/* should match a/b/ | 
						|
      var emptyFileEnd = fi === fl - 1 && file[fi] === ""; | 
						|
      return emptyFileEnd; | 
						|
    } // should be unreachable. | 
						|
 | 
						|
 | 
						|
    throw new Error("wtf?"); | 
						|
  }; // replace stuff like \* with * | 
						|
 | 
						|
 | 
						|
  function globUnescape(s) { | 
						|
    return s.replace(/\\(.)/g, "$1"); | 
						|
  } | 
						|
 | 
						|
  function regExpEscape(s) { | 
						|
    return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); | 
						|
  } | 
						|
}); | 
						|
var fnmatch_1 = fnmatch.minimatch; | 
						|
 | 
						|
var ini = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  var __awaiter = this && this.__awaiter || function (thisArg, _arguments, P, generator) { | 
						|
    return new (P || (P = Promise))(function (resolve, reject) { | 
						|
      function fulfilled(value) { | 
						|
        try { | 
						|
          step(generator.next(value)); | 
						|
        } catch (e) { | 
						|
          reject(e); | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      function rejected(value) { | 
						|
        try { | 
						|
          step(generator["throw"](value)); | 
						|
        } catch (e) { | 
						|
          reject(e); | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      function step(result) { | 
						|
        result.done ? resolve(result.value) : new P(function (resolve) { | 
						|
          resolve(result.value); | 
						|
        }).then(fulfilled, rejected); | 
						|
      } | 
						|
 | 
						|
      step((generator = generator.apply(thisArg, _arguments || [])).next()); | 
						|
    }); | 
						|
  }; | 
						|
 | 
						|
  var __generator = this && this.__generator || function (thisArg, body) { | 
						|
    var _ = { | 
						|
      label: 0, | 
						|
      sent: function sent() { | 
						|
        if (t[0] & 1) throw t[1]; | 
						|
        return t[1]; | 
						|
      }, | 
						|
      trys: [], | 
						|
      ops: [] | 
						|
    }, | 
						|
        f, | 
						|
        y, | 
						|
        t, | 
						|
        g; | 
						|
    return g = { | 
						|
      next: verb(0), | 
						|
      "throw": verb(1), | 
						|
      "return": verb(2) | 
						|
    }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { | 
						|
      return this; | 
						|
    }), g; | 
						|
 | 
						|
    function verb(n) { | 
						|
      return function (v) { | 
						|
        return step([n, v]); | 
						|
      }; | 
						|
    } | 
						|
 | 
						|
    function step(op) { | 
						|
      if (f) throw new TypeError("Generator is already executing."); | 
						|
 | 
						|
      while (_) { | 
						|
        try { | 
						|
          if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | 
						|
          if (y = 0, t) op = [op[0] & 2, t.value]; | 
						|
 | 
						|
          switch (op[0]) { | 
						|
            case 0: | 
						|
            case 1: | 
						|
              t = op; | 
						|
              break; | 
						|
 | 
						|
            case 4: | 
						|
              _.label++; | 
						|
              return { | 
						|
                value: op[1], | 
						|
                done: false | 
						|
              }; | 
						|
 | 
						|
            case 5: | 
						|
              _.label++; | 
						|
              y = op[1]; | 
						|
              op = [0]; | 
						|
              continue; | 
						|
 | 
						|
            case 7: | 
						|
              op = _.ops.pop(); | 
						|
 | 
						|
              _.trys.pop(); | 
						|
 | 
						|
              continue; | 
						|
 | 
						|
            default: | 
						|
              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { | 
						|
                _ = 0; | 
						|
                continue; | 
						|
              } | 
						|
 | 
						|
              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) { | 
						|
                _.label = op[1]; | 
						|
                break; | 
						|
              } | 
						|
 | 
						|
              if (op[0] === 6 && _.label < t[1]) { | 
						|
                _.label = t[1]; | 
						|
                t = op; | 
						|
                break; | 
						|
              } | 
						|
 | 
						|
              if (t && _.label < t[2]) { | 
						|
                _.label = t[2]; | 
						|
 | 
						|
                _.ops.push(op); | 
						|
 | 
						|
                break; | 
						|
              } | 
						|
 | 
						|
              if (t[2]) _.ops.pop(); | 
						|
 | 
						|
              _.trys.pop(); | 
						|
 | 
						|
              continue; | 
						|
          } | 
						|
 | 
						|
          op = body.call(thisArg, _); | 
						|
        } catch (e) { | 
						|
          op = [6, e]; | 
						|
          y = 0; | 
						|
        } finally { | 
						|
          f = t = 0; | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      if (op[0] & 5) throw op[1]; | 
						|
      return { | 
						|
        value: op[0] ? op[1] : void 0, | 
						|
        done: true | 
						|
      }; | 
						|
    } | 
						|
  }; | 
						|
 | 
						|
  var __importStar = this && this.__importStar || function (mod) { | 
						|
    if (mod && mod.__esModule) return mod; | 
						|
    var result = {}; | 
						|
    if (mod != null) for (var k in mod) { | 
						|
      if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | 
						|
    } | 
						|
    result["default"] = mod; | 
						|
    return result; | 
						|
  }; | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
 | 
						|
  var fs = __importStar(fs$1); | 
						|
  /** | 
						|
   * define the possible values: | 
						|
   * section: [section] | 
						|
   * param: key=value | 
						|
   * comment: ;this is a comment | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  var regex = { | 
						|
    section: /^\s*\[(([^#;]|\\#|\\;)+)\]\s*([#;].*)?$/, | 
						|
    param: /^\s*([\w\.\-\_]+)\s*[=:]\s*(.*?)\s*([#;].*)?$/, | 
						|
    comment: /^\s*[#;].*$/ | 
						|
  }; | 
						|
  /** | 
						|
   * Parses an .ini file | 
						|
   * @param file The location of the .ini file | 
						|
   */ | 
						|
 | 
						|
  function parse(file) { | 
						|
    return __awaiter(this, void 0, void 0, function () { | 
						|
      return __generator(this, function (_a) { | 
						|
        return [2 | 
						|
        /*return*/ | 
						|
        , new Promise(function (resolve, reject) { | 
						|
          fs.readFile(file, 'utf8', function (err, data) { | 
						|
            if (err) { | 
						|
              reject(err); | 
						|
              return; | 
						|
            } | 
						|
 | 
						|
            resolve(parseString(data)); | 
						|
          }); | 
						|
        })]; | 
						|
      }); | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  exports.parse = parse; | 
						|
 | 
						|
  function parseSync(file) { | 
						|
    return parseString(fs.readFileSync(file, 'utf8')); | 
						|
  } | 
						|
 | 
						|
  exports.parseSync = parseSync; | 
						|
 | 
						|
  function parseString(data) { | 
						|
    var sectionBody = {}; | 
						|
    var sectionName = null; | 
						|
    var value = [[sectionName, sectionBody]]; | 
						|
    var lines = data.split(/\r\n|\r|\n/); | 
						|
    lines.forEach(function (line) { | 
						|
      var match; | 
						|
 | 
						|
      if (regex.comment.test(line)) { | 
						|
        return; | 
						|
      } | 
						|
 | 
						|
      if (regex.param.test(line)) { | 
						|
        match = line.match(regex.param); | 
						|
        sectionBody[match[1]] = match[2]; | 
						|
      } else if (regex.section.test(line)) { | 
						|
        match = line.match(regex.section); | 
						|
        sectionName = match[1]; | 
						|
        sectionBody = {}; | 
						|
        value.push([sectionName, sectionBody]); | 
						|
      } | 
						|
    }); | 
						|
    return value; | 
						|
  } | 
						|
 | 
						|
  exports.parseString = parseString; | 
						|
}); | 
						|
unwrapExports(ini); | 
						|
var ini_1 = ini.parse; | 
						|
var ini_2 = ini.parseSync; | 
						|
var ini_3 = ini.parseString; | 
						|
 | 
						|
var name$1 = "editorconfig"; | 
						|
var version$1 = "0.15.3"; | 
						|
var description$1 = "EditorConfig File Locator and Interpreter for Node.js"; | 
						|
var keywords = [ | 
						|
	"editorconfig", | 
						|
	"core" | 
						|
]; | 
						|
var main$1 = "src/index.js"; | 
						|
var contributors = [ | 
						|
	"Hong Xu (topbug.net)", | 
						|
	"Jed Mao (https://github.com/jedmao/)", | 
						|
	"Trey Hunner (http://treyhunner.com)" | 
						|
]; | 
						|
var directories = { | 
						|
	bin: "./bin", | 
						|
	lib: "./lib" | 
						|
}; | 
						|
var scripts$1 = { | 
						|
	clean: "rimraf dist", | 
						|
	prebuild: "npm run clean", | 
						|
	build: "tsc", | 
						|
	pretest: "npm run lint && npm run build && npm run copy && cmake .", | 
						|
	test: "ctest .", | 
						|
	"pretest:ci": "npm run pretest", | 
						|
	"test:ci": "ctest -VV --output-on-failure .", | 
						|
	lint: "npm run eclint && npm run tslint", | 
						|
	eclint: "eclint check --indent_size ignore \"src/**\"", | 
						|
	tslint: "tslint --project tsconfig.json --exclude package.json", | 
						|
	copy: "cpy .npmignore LICENSE README.md CHANGELOG.md dist && cpy bin/* dist/bin && cpy src/lib/fnmatch*.* dist/src/lib", | 
						|
	prepub: "npm run lint && npm run build && npm run copy", | 
						|
	pub: "npm publish ./dist" | 
						|
}; | 
						|
var repository$1 = { | 
						|
	type: "git", | 
						|
	url: "git://github.com/editorconfig/editorconfig-core-js.git" | 
						|
}; | 
						|
var bugs = "https://github.com/editorconfig/editorconfig-core-js/issues"; | 
						|
var author$1 = "EditorConfig Team"; | 
						|
var license$1 = "MIT"; | 
						|
var dependencies$1 = { | 
						|
	commander: "^2.19.0", | 
						|
	"lru-cache": "^4.1.5", | 
						|
	semver: "^5.6.0", | 
						|
	sigmund: "^1.0.1" | 
						|
}; | 
						|
var devDependencies$1 = { | 
						|
	"@types/mocha": "^5.2.6", | 
						|
	"@types/node": "^10.12.29", | 
						|
	"@types/semver": "^5.5.0", | 
						|
	"cpy-cli": "^2.0.0", | 
						|
	eclint: "^2.8.1", | 
						|
	mocha: "^5.2.0", | 
						|
	rimraf: "^2.6.3", | 
						|
	should: "^13.2.3", | 
						|
	tslint: "^5.13.1", | 
						|
	typescript: "^3.3.3333" | 
						|
}; | 
						|
var _package$2 = { | 
						|
	name: name$1, | 
						|
	version: version$1, | 
						|
	description: description$1, | 
						|
	keywords: keywords, | 
						|
	main: main$1, | 
						|
	contributors: contributors, | 
						|
	directories: directories, | 
						|
	scripts: scripts$1, | 
						|
	repository: repository$1, | 
						|
	bugs: bugs, | 
						|
	author: author$1, | 
						|
	license: license$1, | 
						|
	dependencies: dependencies$1, | 
						|
	devDependencies: devDependencies$1 | 
						|
}; | 
						|
 | 
						|
var _package$3 = /*#__PURE__*/Object.freeze({ | 
						|
  __proto__: null, | 
						|
  name: name$1, | 
						|
  version: version$1, | 
						|
  description: description$1, | 
						|
  keywords: keywords, | 
						|
  main: main$1, | 
						|
  contributors: contributors, | 
						|
  directories: directories, | 
						|
  scripts: scripts$1, | 
						|
  repository: repository$1, | 
						|
  bugs: bugs, | 
						|
  author: author$1, | 
						|
  license: license$1, | 
						|
  dependencies: dependencies$1, | 
						|
  devDependencies: devDependencies$1, | 
						|
  'default': _package$2 | 
						|
}); | 
						|
 | 
						|
var require$$4 = getCjsExportFromNamespace(_package$3); | 
						|
 | 
						|
var src = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  var __awaiter = this && this.__awaiter || function (thisArg, _arguments, P, generator) { | 
						|
    return new (P || (P = Promise))(function (resolve, reject) { | 
						|
      function fulfilled(value) { | 
						|
        try { | 
						|
          step(generator.next(value)); | 
						|
        } catch (e) { | 
						|
          reject(e); | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      function rejected(value) { | 
						|
        try { | 
						|
          step(generator["throw"](value)); | 
						|
        } catch (e) { | 
						|
          reject(e); | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      function step(result) { | 
						|
        result.done ? resolve(result.value) : new P(function (resolve) { | 
						|
          resolve(result.value); | 
						|
        }).then(fulfilled, rejected); | 
						|
      } | 
						|
 | 
						|
      step((generator = generator.apply(thisArg, _arguments || [])).next()); | 
						|
    }); | 
						|
  }; | 
						|
 | 
						|
  var __generator = this && this.__generator || function (thisArg, body) { | 
						|
    var _ = { | 
						|
      label: 0, | 
						|
      sent: function sent() { | 
						|
        if (t[0] & 1) throw t[1]; | 
						|
        return t[1]; | 
						|
      }, | 
						|
      trys: [], | 
						|
      ops: [] | 
						|
    }, | 
						|
        f, | 
						|
        y, | 
						|
        t, | 
						|
        g; | 
						|
    return g = { | 
						|
      next: verb(0), | 
						|
      "throw": verb(1), | 
						|
      "return": verb(2) | 
						|
    }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { | 
						|
      return this; | 
						|
    }), g; | 
						|
 | 
						|
    function verb(n) { | 
						|
      return function (v) { | 
						|
        return step([n, v]); | 
						|
      }; | 
						|
    } | 
						|
 | 
						|
    function step(op) { | 
						|
      if (f) throw new TypeError("Generator is already executing."); | 
						|
 | 
						|
      while (_) { | 
						|
        try { | 
						|
          if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | 
						|
          if (y = 0, t) op = [op[0] & 2, t.value]; | 
						|
 | 
						|
          switch (op[0]) { | 
						|
            case 0: | 
						|
            case 1: | 
						|
              t = op; | 
						|
              break; | 
						|
 | 
						|
            case 4: | 
						|
              _.label++; | 
						|
              return { | 
						|
                value: op[1], | 
						|
                done: false | 
						|
              }; | 
						|
 | 
						|
            case 5: | 
						|
              _.label++; | 
						|
              y = op[1]; | 
						|
              op = [0]; | 
						|
              continue; | 
						|
 | 
						|
            case 7: | 
						|
              op = _.ops.pop(); | 
						|
 | 
						|
              _.trys.pop(); | 
						|
 | 
						|
              continue; | 
						|
 | 
						|
            default: | 
						|
              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { | 
						|
                _ = 0; | 
						|
                continue; | 
						|
              } | 
						|
 | 
						|
              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) { | 
						|
                _.label = op[1]; | 
						|
                break; | 
						|
              } | 
						|
 | 
						|
              if (op[0] === 6 && _.label < t[1]) { | 
						|
                _.label = t[1]; | 
						|
                t = op; | 
						|
                break; | 
						|
              } | 
						|
 | 
						|
              if (t && _.label < t[2]) { | 
						|
                _.label = t[2]; | 
						|
 | 
						|
                _.ops.push(op); | 
						|
 | 
						|
                break; | 
						|
              } | 
						|
 | 
						|
              if (t[2]) _.ops.pop(); | 
						|
 | 
						|
              _.trys.pop(); | 
						|
 | 
						|
              continue; | 
						|
          } | 
						|
 | 
						|
          op = body.call(thisArg, _); | 
						|
        } catch (e) { | 
						|
          op = [6, e]; | 
						|
          y = 0; | 
						|
        } finally { | 
						|
          f = t = 0; | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      if (op[0] & 5) throw op[1]; | 
						|
      return { | 
						|
        value: op[0] ? op[1] : void 0, | 
						|
        done: true | 
						|
      }; | 
						|
    } | 
						|
  }; | 
						|
 | 
						|
  var __importStar = this && this.__importStar || function (mod) { | 
						|
    if (mod && mod.__esModule) return mod; | 
						|
    var result = {}; | 
						|
    if (mod != null) for (var k in mod) { | 
						|
      if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | 
						|
    } | 
						|
    result["default"] = mod; | 
						|
    return result; | 
						|
  }; | 
						|
 | 
						|
  var __importDefault = this && this.__importDefault || function (mod) { | 
						|
    return mod && mod.__esModule ? mod : { | 
						|
      "default": mod | 
						|
    }; | 
						|
  }; | 
						|
 | 
						|
  Object.defineProperty(exports, "__esModule", { | 
						|
    value: true | 
						|
  }); | 
						|
 | 
						|
  var fs = __importStar(fs$1); | 
						|
 | 
						|
  var path = __importStar(path$2); | 
						|
 | 
						|
  var semver = __importStar(semver$1); | 
						|
 | 
						|
  var fnmatch_1 = __importDefault(fnmatch); | 
						|
 | 
						|
  exports.parseString = ini.parseString; | 
						|
 | 
						|
  var package_json_1 = __importDefault(require$$4); | 
						|
 | 
						|
  var knownProps = { | 
						|
    end_of_line: true, | 
						|
    indent_style: true, | 
						|
    indent_size: true, | 
						|
    insert_final_newline: true, | 
						|
    trim_trailing_whitespace: true, | 
						|
    charset: true | 
						|
  }; | 
						|
 | 
						|
  function fnmatch$1(filepath, glob) { | 
						|
    var matchOptions = { | 
						|
      matchBase: true, | 
						|
      dot: true, | 
						|
      noext: true | 
						|
    }; | 
						|
    glob = glob.replace(/\*\*/g, '{*,**/**/**}'); | 
						|
    return fnmatch_1.default(filepath, glob, matchOptions); | 
						|
  } | 
						|
 | 
						|
  function getConfigFileNames(filepath, options) { | 
						|
    var paths = []; | 
						|
 | 
						|
    do { | 
						|
      filepath = path.dirname(filepath); | 
						|
      paths.push(path.join(filepath, options.config)); | 
						|
    } while (filepath !== options.root); | 
						|
 | 
						|
    return paths; | 
						|
  } | 
						|
 | 
						|
  function processMatches(matches, version) { | 
						|
    // Set indent_size to 'tab' if indent_size is unspecified and | 
						|
    // indent_style is set to 'tab'. | 
						|
    if ('indent_style' in matches && matches.indent_style === 'tab' && !('indent_size' in matches) && semver.gte(version, '0.10.0')) { | 
						|
      matches.indent_size = 'tab'; | 
						|
    } // Set tab_width to indent_size if indent_size is specified and | 
						|
    // tab_width is unspecified | 
						|
 | 
						|
 | 
						|
    if ('indent_size' in matches && !('tab_width' in matches) && matches.indent_size !== 'tab') { | 
						|
      matches.tab_width = matches.indent_size; | 
						|
    } // Set indent_size to tab_width if indent_size is 'tab' | 
						|
 | 
						|
 | 
						|
    if ('indent_size' in matches && 'tab_width' in matches && matches.indent_size === 'tab') { | 
						|
      matches.indent_size = matches.tab_width; | 
						|
    } | 
						|
 | 
						|
    return matches; | 
						|
  } | 
						|
 | 
						|
  function processOptions(options, filepath) { | 
						|
    if (options === void 0) { | 
						|
      options = {}; | 
						|
    } | 
						|
 | 
						|
    return { | 
						|
      config: options.config || '.editorconfig', | 
						|
      version: options.version || package_json_1.default.version, | 
						|
      root: path.resolve(options.root || path.parse(filepath).root) | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  function buildFullGlob(pathPrefix, glob) { | 
						|
    switch (glob.indexOf('/')) { | 
						|
      case -1: | 
						|
        glob = '**/' + glob; | 
						|
        break; | 
						|
 | 
						|
      case 0: | 
						|
        glob = glob.substring(1); | 
						|
        break; | 
						|
    } | 
						|
 | 
						|
    return path.join(pathPrefix, glob); | 
						|
  } | 
						|
 | 
						|
  function extendProps(props, options) { | 
						|
    if (props === void 0) { | 
						|
      props = {}; | 
						|
    } | 
						|
 | 
						|
    if (options === void 0) { | 
						|
      options = {}; | 
						|
    } | 
						|
 | 
						|
    for (var key in options) { | 
						|
      if (options.hasOwnProperty(key)) { | 
						|
        var value = options[key]; | 
						|
        var key2 = key.toLowerCase(); | 
						|
        var value2 = value; | 
						|
 | 
						|
        if (knownProps[key2]) { | 
						|
          value2 = value.toLowerCase(); | 
						|
        } | 
						|
 | 
						|
        try { | 
						|
          value2 = JSON.parse(value); | 
						|
        } catch (e) {} | 
						|
 | 
						|
        if (typeof value === 'undefined' || value === null) { | 
						|
          // null and undefined are values specific to JSON (no special meaning | 
						|
          // in editorconfig) & should just be returned as regular strings. | 
						|
          value2 = String(value); | 
						|
        } | 
						|
 | 
						|
        props[key2] = value2; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return props; | 
						|
  } | 
						|
 | 
						|
  function parseFromConfigs(configs, filepath, options) { | 
						|
    return processMatches(configs.reverse().reduce(function (matches, file) { | 
						|
      var pathPrefix = path.dirname(file.name); | 
						|
      file.contents.forEach(function (section) { | 
						|
        var glob = section[0]; | 
						|
        var options2 = section[1]; | 
						|
 | 
						|
        if (!glob) { | 
						|
          return; | 
						|
        } | 
						|
 | 
						|
        var fullGlob = buildFullGlob(pathPrefix, glob); | 
						|
 | 
						|
        if (!fnmatch$1(filepath, fullGlob)) { | 
						|
          return; | 
						|
        } | 
						|
 | 
						|
        matches = extendProps(matches, options2); | 
						|
      }); | 
						|
      return matches; | 
						|
    }, {}), options.version); | 
						|
  } | 
						|
 | 
						|
  function getConfigsForFiles(files) { | 
						|
    var configs = []; | 
						|
 | 
						|
    for (var i in files) { | 
						|
      if (files.hasOwnProperty(i)) { | 
						|
        var file = files[i]; | 
						|
        var contents = ini.parseString(file.contents); | 
						|
        configs.push({ | 
						|
          name: file.name, | 
						|
          contents: contents | 
						|
        }); | 
						|
 | 
						|
        if ((contents[0][1].root || '').toLowerCase() === 'true') { | 
						|
          break; | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return configs; | 
						|
  } | 
						|
 | 
						|
  function readConfigFiles(filepaths) { | 
						|
    return __awaiter(this, void 0, void 0, function () { | 
						|
      return __generator(this, function (_a) { | 
						|
        return [2 | 
						|
        /*return*/ | 
						|
        , Promise.all(filepaths.map(function (name) { | 
						|
          return new Promise(function (resolve) { | 
						|
            fs.readFile(name, 'utf8', function (err, data) { | 
						|
              resolve({ | 
						|
                name: name, | 
						|
                contents: err ? '' : data | 
						|
              }); | 
						|
            }); | 
						|
          }); | 
						|
        }))]; | 
						|
      }); | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  function readConfigFilesSync(filepaths) { | 
						|
    var files = []; | 
						|
    var file; | 
						|
    filepaths.forEach(function (filepath) { | 
						|
      try { | 
						|
        file = fs.readFileSync(filepath, 'utf8'); | 
						|
      } catch (e) { | 
						|
        file = ''; | 
						|
      } | 
						|
 | 
						|
      files.push({ | 
						|
        name: filepath, | 
						|
        contents: file | 
						|
      }); | 
						|
    }); | 
						|
    return files; | 
						|
  } | 
						|
 | 
						|
  function opts(filepath, options) { | 
						|
    if (options === void 0) { | 
						|
      options = {}; | 
						|
    } | 
						|
 | 
						|
    var resolvedFilePath = path.resolve(filepath); | 
						|
    return [resolvedFilePath, processOptions(options, resolvedFilePath)]; | 
						|
  } | 
						|
 | 
						|
  function parseFromFiles(filepath, files, options) { | 
						|
    if (options === void 0) { | 
						|
      options = {}; | 
						|
    } | 
						|
 | 
						|
    return __awaiter(this, void 0, void 0, function () { | 
						|
      var _a, resolvedFilePath, processedOptions; | 
						|
 | 
						|
      return __generator(this, function (_b) { | 
						|
        _a = opts(filepath, options), resolvedFilePath = _a[0], processedOptions = _a[1]; | 
						|
        return [2 | 
						|
        /*return*/ | 
						|
        , files.then(getConfigsForFiles).then(function (configs) { | 
						|
          return parseFromConfigs(configs, resolvedFilePath, processedOptions); | 
						|
        })]; | 
						|
      }); | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  exports.parseFromFiles = parseFromFiles; | 
						|
 | 
						|
  function parseFromFilesSync(filepath, files, options) { | 
						|
    if (options === void 0) { | 
						|
      options = {}; | 
						|
    } | 
						|
 | 
						|
    var _a = opts(filepath, options), | 
						|
        resolvedFilePath = _a[0], | 
						|
        processedOptions = _a[1]; | 
						|
 | 
						|
    return parseFromConfigs(getConfigsForFiles(files), resolvedFilePath, processedOptions); | 
						|
  } | 
						|
 | 
						|
  exports.parseFromFilesSync = parseFromFilesSync; | 
						|
 | 
						|
  function parse(_filepath, _options) { | 
						|
    if (_options === void 0) { | 
						|
      _options = {}; | 
						|
    } | 
						|
 | 
						|
    return __awaiter(this, void 0, void 0, function () { | 
						|
      var _a, resolvedFilePath, processedOptions, filepaths; | 
						|
 | 
						|
      return __generator(this, function (_b) { | 
						|
        _a = opts(_filepath, _options), resolvedFilePath = _a[0], processedOptions = _a[1]; | 
						|
        filepaths = getConfigFileNames(resolvedFilePath, processedOptions); | 
						|
        return [2 | 
						|
        /*return*/ | 
						|
        , readConfigFiles(filepaths).then(getConfigsForFiles).then(function (configs) { | 
						|
          return parseFromConfigs(configs, resolvedFilePath, processedOptions); | 
						|
        })]; | 
						|
      }); | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  exports.parse = parse; | 
						|
 | 
						|
  function parseSync(_filepath, _options) { | 
						|
    if (_options === void 0) { | 
						|
      _options = {}; | 
						|
    } | 
						|
 | 
						|
    var _a = opts(_filepath, _options), | 
						|
        resolvedFilePath = _a[0], | 
						|
        processedOptions = _a[1]; | 
						|
 | 
						|
    var filepaths = getConfigFileNames(resolvedFilePath, processedOptions); | 
						|
    var files = readConfigFilesSync(filepaths); | 
						|
    return parseFromConfigs(getConfigsForFiles(files), resolvedFilePath, processedOptions); | 
						|
  } | 
						|
 | 
						|
  exports.parseSync = parseSync; | 
						|
}); | 
						|
unwrapExports(src); | 
						|
var src_1 = src.parseString; | 
						|
var src_2 = src.parseFromFiles; | 
						|
var src_3 = src.parseFromFilesSync; | 
						|
var src_4 = src.parse; | 
						|
var src_5 = src.parseSync; | 
						|
 | 
						|
var editorconfigToPrettier = editorConfigToPrettier; | 
						|
 | 
						|
function removeUnset(editorConfig) { | 
						|
  var result = {}; | 
						|
  var keys = Object.keys(editorConfig); | 
						|
 | 
						|
  for (var i = 0; i < keys.length; i++) { | 
						|
    var key = keys[i]; | 
						|
 | 
						|
    if (editorConfig[key] === "unset") { | 
						|
      continue; | 
						|
    } | 
						|
 | 
						|
    result[key] = editorConfig[key]; | 
						|
  } | 
						|
 | 
						|
  return result; | 
						|
} | 
						|
 | 
						|
function editorConfigToPrettier(editorConfig) { | 
						|
  if (!editorConfig) { | 
						|
    return null; | 
						|
  } | 
						|
 | 
						|
  editorConfig = removeUnset(editorConfig); | 
						|
 | 
						|
  if (Object.keys(editorConfig).length === 0) { | 
						|
    return null; | 
						|
  } | 
						|
 | 
						|
  var result = {}; | 
						|
 | 
						|
  if (editorConfig.indent_style) { | 
						|
    result.useTabs = editorConfig.indent_style === "tab"; | 
						|
  } | 
						|
 | 
						|
  if (editorConfig.indent_size === "tab") { | 
						|
    result.useTabs = true; | 
						|
  } | 
						|
 | 
						|
  if (result.useTabs && editorConfig.tab_width) { | 
						|
    result.tabWidth = editorConfig.tab_width; | 
						|
  } else if (editorConfig.indent_style === "space" && editorConfig.indent_size && editorConfig.indent_size !== "tab") { | 
						|
    result.tabWidth = editorConfig.indent_size; | 
						|
  } else if (editorConfig.tab_width !== undefined) { | 
						|
    result.tabWidth = editorConfig.tab_width; | 
						|
  } | 
						|
 | 
						|
  if (editorConfig.max_line_length && editorConfig.max_line_length !== "off") { | 
						|
    result.printWidth = editorConfig.max_line_length; | 
						|
  } | 
						|
 | 
						|
  if (editorConfig.quote_type === "single") { | 
						|
    result.singleQuote = true; | 
						|
  } else if (editorConfig.quote_type === "double") { | 
						|
    result.singleQuote = false; | 
						|
  } | 
						|
 | 
						|
  if (["cr", "crlf", "lf"].indexOf(editorConfig.end_of_line) !== -1) { | 
						|
    result.endOfLine = editorConfig.end_of_line; | 
						|
  } | 
						|
 | 
						|
  return result; | 
						|
} | 
						|
 | 
						|
function markerExists(files, markers) { | 
						|
  return markers.some(function (marker) { | 
						|
    return files.some(function (file) { | 
						|
      return file === marker; | 
						|
    }); | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function traverseFolder(directory, levels, markers) { | 
						|
  var files = fs$1.readdirSync(directory); | 
						|
 | 
						|
  if (levels === 0) { | 
						|
    return null; | 
						|
  } else if (markerExists(files, markers)) { | 
						|
    return directory; | 
						|
  } else { | 
						|
    return traverseFolder(path$2.resolve(directory, '..'), levels - 1, markers); | 
						|
  } | 
						|
} | 
						|
 | 
						|
var findProjectRoot = function findRoot(dir, opts) { | 
						|
  if (!dir) throw new Error("Directory not defined"); | 
						|
  opts = opts || {}; | 
						|
  var levels = opts.maxDepth || findRoot.MAX_DEPTH; | 
						|
  var markers = opts.markers || findRoot.MARKERS; | 
						|
  return traverseFolder(dir, levels, markers); | 
						|
}; | 
						|
 | 
						|
var MAX_DEPTH = 9; | 
						|
var MARKERS = ['.git', '.hg']; | 
						|
findProjectRoot.MAX_DEPTH = MAX_DEPTH; | 
						|
findProjectRoot.MARKERS = MARKERS; | 
						|
 | 
						|
var maybeParse = function maybeParse(filePath, config, parse) { | 
						|
  // findProjectRoot will throw an error if we pass a nonexistent directory to | 
						|
  // it, which is possible, for example, when the path is given via | 
						|
  // --stdin-filepath. So, first, traverse up until we find an existing | 
						|
  // directory. | 
						|
  var dirPath = path$2.dirname(path$2.resolve(filePath)); | 
						|
  var fsRoot = path$2.parse(dirPath).root; | 
						|
 | 
						|
  while (dirPath !== fsRoot && !fs$1.existsSync(dirPath)) { | 
						|
    dirPath = path$2.dirname(dirPath); | 
						|
  } | 
						|
 | 
						|
  var root = findProjectRoot(dirPath); | 
						|
  return filePath && parse(filePath, { | 
						|
    root | 
						|
  }); | 
						|
}; | 
						|
 | 
						|
var editorconfigAsyncNoCache = function editorconfigAsyncNoCache(filePath, config) { | 
						|
  return Promise.resolve(maybeParse(filePath, config, src.parse)).then(editorconfigToPrettier); | 
						|
}; | 
						|
 | 
						|
var editorconfigAsyncWithCache = mem_1(editorconfigAsyncNoCache); | 
						|
 | 
						|
var editorconfigSyncNoCache = function editorconfigSyncNoCache(filePath, config) { | 
						|
  return editorconfigToPrettier(maybeParse(filePath, config, src.parseSync)); | 
						|
}; | 
						|
 | 
						|
var editorconfigSyncWithCache = mem_1(editorconfigSyncNoCache); | 
						|
 | 
						|
function getLoadFunction(opts) { | 
						|
  if (!opts.editorconfig) { | 
						|
    return function () { | 
						|
      return null; | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  if (opts.sync) { | 
						|
    return opts.cache ? editorconfigSyncWithCache : editorconfigSyncNoCache; | 
						|
  } | 
						|
 | 
						|
  return opts.cache ? editorconfigAsyncWithCache : editorconfigAsyncNoCache; | 
						|
} | 
						|
 | 
						|
function clearCache() { | 
						|
  mem_1.clear(editorconfigSyncWithCache); | 
						|
  mem_1.clear(editorconfigAsyncWithCache); | 
						|
} | 
						|
 | 
						|
var resolveConfigEditorconfig = { | 
						|
  getLoadFunction, | 
						|
  clearCache | 
						|
}; | 
						|
 | 
						|
var ParserEND = 0x110000; | 
						|
 | 
						|
var ParserError = | 
						|
/*#__PURE__*/ | 
						|
function (_Error) { | 
						|
  _inherits(ParserError, _Error); | 
						|
 | 
						|
  /* istanbul ignore next */ | 
						|
  function ParserError(msg, filename, linenumber) { | 
						|
    var _this; | 
						|
 | 
						|
    _classCallCheck(this, ParserError); | 
						|
 | 
						|
    _this = _possibleConstructorReturn(this, _getPrototypeOf(ParserError).call(this, '[ParserError] ' + msg, filename, linenumber)); | 
						|
    _this.name = 'ParserError'; | 
						|
    _this.code = 'ParserError'; | 
						|
    if (Error.captureStackTrace) Error.captureStackTrace(_assertThisInitialized(_this), ParserError); | 
						|
    return _this; | 
						|
  } | 
						|
 | 
						|
  return ParserError; | 
						|
}(_wrapNativeSuper(Error)); | 
						|
 | 
						|
var State = function State(parser) { | 
						|
  _classCallCheck(this, State); | 
						|
 | 
						|
  this.parser = parser; | 
						|
  this.buf = ''; | 
						|
  this.returned = null; | 
						|
  this.result = null; | 
						|
  this.resultTable = null; | 
						|
  this.resultArr = null; | 
						|
}; | 
						|
 | 
						|
var Parser = | 
						|
/*#__PURE__*/ | 
						|
function () { | 
						|
  function Parser() { | 
						|
    _classCallCheck(this, Parser); | 
						|
 | 
						|
    this.pos = 0; | 
						|
    this.col = 0; | 
						|
    this.line = 0; | 
						|
    this.obj = {}; | 
						|
    this.ctx = this.obj; | 
						|
    this.stack = []; | 
						|
    this._buf = ''; | 
						|
    this.char = null; | 
						|
    this.ii = 0; | 
						|
    this.state = new State(this.parseStart); | 
						|
  } | 
						|
 | 
						|
  _createClass(Parser, [{ | 
						|
    key: "parse", | 
						|
    value: function parse(str) { | 
						|
      /* istanbul ignore next */ | 
						|
      if (str.length === 0 || str.length == null) return; | 
						|
      this._buf = String(str); | 
						|
      this.ii = -1; | 
						|
      this.char = -1; | 
						|
      var getNext; | 
						|
 | 
						|
      while (getNext === false || this.nextChar()) { | 
						|
        getNext = this.runOne(); | 
						|
      } | 
						|
 | 
						|
      this._buf = null; | 
						|
    } | 
						|
  }, { | 
						|
    key: "nextChar", | 
						|
    value: function nextChar() { | 
						|
      if (this.char === 0x0A) { | 
						|
        ++this.line; | 
						|
        this.col = -1; | 
						|
      } | 
						|
 | 
						|
      ++this.ii; | 
						|
      this.char = this._buf.codePointAt(this.ii); | 
						|
      ++this.pos; | 
						|
      ++this.col; | 
						|
      return this.haveBuffer(); | 
						|
    } | 
						|
  }, { | 
						|
    key: "haveBuffer", | 
						|
    value: function haveBuffer() { | 
						|
      return this.ii < this._buf.length; | 
						|
    } | 
						|
  }, { | 
						|
    key: "runOne", | 
						|
    value: function runOne() { | 
						|
      return this.state.parser.call(this, this.state.returned); | 
						|
    } | 
						|
  }, { | 
						|
    key: "finish", | 
						|
    value: function finish() { | 
						|
      this.char = ParserEND; | 
						|
      var last; | 
						|
 | 
						|
      do { | 
						|
        last = this.state.parser; | 
						|
        this.runOne(); | 
						|
      } while (this.state.parser !== last); | 
						|
 | 
						|
      this.ctx = null; | 
						|
      this.state = null; | 
						|
      this._buf = null; | 
						|
      return this.obj; | 
						|
    } | 
						|
  }, { | 
						|
    key: "next", | 
						|
    value: function next(fn) { | 
						|
      /* istanbul ignore next */ | 
						|
      if (typeof fn !== 'function') throw new ParserError('Tried to set state to non-existent state: ' + JSON.stringify(fn)); | 
						|
      this.state.parser = fn; | 
						|
    } | 
						|
  }, { | 
						|
    key: "goto", | 
						|
    value: function goto(fn) { | 
						|
      this.next(fn); | 
						|
      return this.runOne(); | 
						|
    } | 
						|
  }, { | 
						|
    key: "call", | 
						|
    value: function call(fn, returnWith) { | 
						|
      if (returnWith) this.next(returnWith); | 
						|
      this.stack.push(this.state); | 
						|
      this.state = new State(fn); | 
						|
    } | 
						|
  }, { | 
						|
    key: "callNow", | 
						|
    value: function callNow(fn, returnWith) { | 
						|
      this.call(fn, returnWith); | 
						|
      return this.runOne(); | 
						|
    } | 
						|
  }, { | 
						|
    key: "return", | 
						|
    value: function _return(value) { | 
						|
      /* istanbul ignore next */ | 
						|
      if (this.stack.length === 0) throw this.error(new ParserError('Stack underflow')); | 
						|
      if (value === undefined) value = this.state.buf; | 
						|
      this.state = this.stack.pop(); | 
						|
      this.state.returned = value; | 
						|
    } | 
						|
  }, { | 
						|
    key: "returnNow", | 
						|
    value: function returnNow(value) { | 
						|
      this.return(value); | 
						|
      return this.runOne(); | 
						|
    } | 
						|
  }, { | 
						|
    key: "consume", | 
						|
    value: function consume() { | 
						|
      /* istanbul ignore next */ | 
						|
      if (this.char === ParserEND) throw this.error(new ParserError('Unexpected end-of-buffer')); | 
						|
      this.state.buf += this._buf[this.ii]; | 
						|
    } | 
						|
  }, { | 
						|
    key: "error", | 
						|
    value: function error(err) { | 
						|
      err.line = this.line; | 
						|
      err.col = this.col; | 
						|
      err.pos = this.pos; | 
						|
      return err; | 
						|
    } | 
						|
    /* istanbul ignore next */ | 
						|
 | 
						|
  }, { | 
						|
    key: "parseStart", | 
						|
    value: function parseStart() { | 
						|
      throw new ParserError('Must declare a parseStart method'); | 
						|
    } | 
						|
  }]); | 
						|
 | 
						|
  return Parser; | 
						|
}(); | 
						|
 | 
						|
Parser.END = ParserEND; | 
						|
Parser.Error = ParserError; | 
						|
var parser$1 = Parser; | 
						|
 | 
						|
var createDatetime = function createDatetime(value) { | 
						|
  var date = new Date(value); | 
						|
  /* istanbul ignore if */ | 
						|
 | 
						|
  if (isNaN(date)) { | 
						|
    throw new TypeError('Invalid Datetime'); | 
						|
  } else { | 
						|
    return date; | 
						|
  } | 
						|
}; | 
						|
 | 
						|
var formatNum = function formatNum(d, num) { | 
						|
  num = String(num); | 
						|
 | 
						|
  while (num.length < d) { | 
						|
    num = '0' + num; | 
						|
  } | 
						|
 | 
						|
  return num; | 
						|
}; | 
						|
 | 
						|
var FloatingDateTime = | 
						|
/*#__PURE__*/ | 
						|
function (_Date) { | 
						|
  _inherits(FloatingDateTime, _Date); | 
						|
 | 
						|
  function FloatingDateTime(value) { | 
						|
    var _this; | 
						|
 | 
						|
    _classCallCheck(this, FloatingDateTime); | 
						|
 | 
						|
    _this = _possibleConstructorReturn(this, _getPrototypeOf(FloatingDateTime).call(this, value + 'Z')); | 
						|
    _this.isFloating = true; | 
						|
    return _this; | 
						|
  } | 
						|
 | 
						|
  _createClass(FloatingDateTime, [{ | 
						|
    key: "toISOString", | 
						|
    value: function toISOString() { | 
						|
      var date = `${this.getUTCFullYear()}-${formatNum(2, this.getUTCMonth() + 1)}-${formatNum(2, this.getUTCDate())}`; | 
						|
      var time = `${formatNum(2, this.getUTCHours())}:${formatNum(2, this.getUTCMinutes())}:${formatNum(2, this.getUTCSeconds())}.${formatNum(3, this.getUTCMilliseconds())}`; | 
						|
      return `${date}T${time}`; | 
						|
    } | 
						|
  }]); | 
						|
 | 
						|
  return FloatingDateTime; | 
						|
}(_wrapNativeSuper(Date)); | 
						|
 | 
						|
var createDatetimeFloat = function createDatetimeFloat(value) { | 
						|
  var date = new FloatingDateTime(value); | 
						|
  /* istanbul ignore if */ | 
						|
 | 
						|
  if (isNaN(date)) { | 
						|
    throw new TypeError('Invalid Datetime'); | 
						|
  } else { | 
						|
    return date; | 
						|
  } | 
						|
}; | 
						|
 | 
						|
var DateTime = global.Date; | 
						|
 | 
						|
var Date$1 = | 
						|
/*#__PURE__*/ | 
						|
function (_DateTime) { | 
						|
  _inherits(Date, _DateTime); | 
						|
 | 
						|
  function Date(value) { | 
						|
    var _this; | 
						|
 | 
						|
    _classCallCheck(this, Date); | 
						|
 | 
						|
    _this = _possibleConstructorReturn(this, _getPrototypeOf(Date).call(this, value)); | 
						|
    _this.isDate = true; | 
						|
    return _this; | 
						|
  } | 
						|
 | 
						|
  _createClass(Date, [{ | 
						|
    key: "toISOString", | 
						|
    value: function toISOString() { | 
						|
      return `${this.getUTCFullYear()}-${formatNum(2, this.getUTCMonth() + 1)}-${formatNum(2, this.getUTCDate())}`; | 
						|
    } | 
						|
  }]); | 
						|
 | 
						|
  return Date; | 
						|
}(DateTime); | 
						|
 | 
						|
var createDate = function createDate(value) { | 
						|
  var date = new Date$1(value); | 
						|
  /* istanbul ignore if */ | 
						|
 | 
						|
  if (isNaN(date)) { | 
						|
    throw new TypeError('Invalid Datetime'); | 
						|
  } else { | 
						|
    return date; | 
						|
  } | 
						|
}; | 
						|
 | 
						|
var Time = | 
						|
/*#__PURE__*/ | 
						|
function (_Date) { | 
						|
  _inherits(Time, _Date); | 
						|
 | 
						|
  function Time(value) { | 
						|
    var _this; | 
						|
 | 
						|
    _classCallCheck(this, Time); | 
						|
 | 
						|
    _this = _possibleConstructorReturn(this, _getPrototypeOf(Time).call(this, `0000-01-01T${value}Z`)); | 
						|
    _this.isTime = true; | 
						|
    return _this; | 
						|
  } | 
						|
 | 
						|
  _createClass(Time, [{ | 
						|
    key: "toISOString", | 
						|
    value: function toISOString() { | 
						|
      return `${formatNum(2, this.getUTCHours())}:${formatNum(2, this.getUTCMinutes())}:${formatNum(2, this.getUTCSeconds())}.${formatNum(3, this.getUTCMilliseconds())}`; | 
						|
    } | 
						|
  }]); | 
						|
 | 
						|
  return Time; | 
						|
}(_wrapNativeSuper(Date)); | 
						|
 | 
						|
var createTime = function createTime(value) { | 
						|
  var date = new Time(value); | 
						|
  /* istanbul ignore if */ | 
						|
 | 
						|
  if (isNaN(date)) { | 
						|
    throw new TypeError('Invalid Datetime'); | 
						|
  } else { | 
						|
    return date; | 
						|
  } | 
						|
}; | 
						|
 | 
						|
/* eslint-disable no-new-wrappers, no-eval, camelcase, operator-linebreak */ | 
						|
 | 
						|
 | 
						|
var tomlParser = makeParserClass(parser$1); | 
						|
var makeParserClass_1 = makeParserClass; | 
						|
 | 
						|
var TomlError = | 
						|
/*#__PURE__*/ | 
						|
function (_Error) { | 
						|
  _inherits(TomlError, _Error); | 
						|
 | 
						|
  function TomlError(msg) { | 
						|
    var _this; | 
						|
 | 
						|
    _classCallCheck(this, TomlError); | 
						|
 | 
						|
    _this = _possibleConstructorReturn(this, _getPrototypeOf(TomlError).call(this, msg)); | 
						|
    _this.name = 'TomlError'; | 
						|
    /* istanbul ignore next */ | 
						|
 | 
						|
    if (Error.captureStackTrace) Error.captureStackTrace(_assertThisInitialized(_this), TomlError); | 
						|
    _this.fromTOML = true; | 
						|
    _this.wrapped = null; | 
						|
    return _this; | 
						|
  } | 
						|
 | 
						|
  return TomlError; | 
						|
}(_wrapNativeSuper(Error)); | 
						|
 | 
						|
TomlError.wrap = function (err) { | 
						|
  var terr = new TomlError(err.message); | 
						|
  terr.code = err.code; | 
						|
  terr.wrapped = err; | 
						|
  return terr; | 
						|
}; | 
						|
 | 
						|
var TomlError_1 = TomlError; | 
						|
var CTRL_I = 0x09; | 
						|
var CTRL_J = 0x0A; | 
						|
var CTRL_M = 0x0D; | 
						|
var CTRL_CHAR_BOUNDARY = 0x1F; // the last non-character in the latin1 region of unicode, except DEL | 
						|
 | 
						|
var CHAR_SP = 0x20; | 
						|
var CHAR_QUOT = 0x22; | 
						|
var CHAR_NUM = 0x23; | 
						|
var CHAR_APOS = 0x27; | 
						|
var CHAR_PLUS = 0x2B; | 
						|
var CHAR_COMMA = 0x2C; | 
						|
var CHAR_HYPHEN = 0x2D; | 
						|
var CHAR_PERIOD = 0x2E; | 
						|
var CHAR_0 = 0x30; | 
						|
var CHAR_1 = 0x31; | 
						|
var CHAR_7 = 0x37; | 
						|
var CHAR_9 = 0x39; | 
						|
var CHAR_COLON = 0x3A; | 
						|
var CHAR_EQUALS = 0x3D; | 
						|
var CHAR_A = 0x41; | 
						|
var CHAR_E = 0x45; | 
						|
var CHAR_F = 0x46; | 
						|
var CHAR_T = 0x54; | 
						|
var CHAR_U = 0x55; | 
						|
var CHAR_Z = 0x5A; | 
						|
var CHAR_LOWBAR = 0x5F; | 
						|
var CHAR_a = 0x61; | 
						|
var CHAR_b = 0x62; | 
						|
var CHAR_e = 0x65; | 
						|
var CHAR_f = 0x66; | 
						|
var CHAR_i = 0x69; | 
						|
var CHAR_l = 0x6C; | 
						|
var CHAR_n = 0x6E; | 
						|
var CHAR_o = 0x6F; | 
						|
var CHAR_r = 0x72; | 
						|
var CHAR_s = 0x73; | 
						|
var CHAR_t = 0x74; | 
						|
var CHAR_u = 0x75; | 
						|
var CHAR_x = 0x78; | 
						|
var CHAR_z = 0x7A; | 
						|
var CHAR_LCUB = 0x7B; | 
						|
var CHAR_RCUB = 0x7D; | 
						|
var CHAR_LSQB = 0x5B; | 
						|
var CHAR_BSOL = 0x5C; | 
						|
var CHAR_RSQB = 0x5D; | 
						|
var CHAR_DEL = 0x7F; | 
						|
var SURROGATE_FIRST = 0xD800; | 
						|
var SURROGATE_LAST = 0xDFFF; | 
						|
var escapes = { | 
						|
  [CHAR_b]: '\u0008', | 
						|
  [CHAR_t]: '\u0009', | 
						|
  [CHAR_n]: '\u000A', | 
						|
  [CHAR_f]: '\u000C', | 
						|
  [CHAR_r]: '\u000D', | 
						|
  [CHAR_QUOT]: '\u0022', | 
						|
  [CHAR_BSOL]: '\u005C' | 
						|
}; | 
						|
 | 
						|
function isDigit(cp) { | 
						|
  return cp >= CHAR_0 && cp <= CHAR_9; | 
						|
} | 
						|
 | 
						|
function isHexit(cp) { | 
						|
  return cp >= CHAR_A && cp <= CHAR_F || cp >= CHAR_a && cp <= CHAR_f || cp >= CHAR_0 && cp <= CHAR_9; | 
						|
} | 
						|
 | 
						|
function isBit(cp) { | 
						|
  return cp === CHAR_1 || cp === CHAR_0; | 
						|
} | 
						|
 | 
						|
function isOctit(cp) { | 
						|
  return cp >= CHAR_0 && cp <= CHAR_7; | 
						|
} | 
						|
 | 
						|
function isAlphaNumQuoteHyphen(cp) { | 
						|
  return cp >= CHAR_A && cp <= CHAR_Z || cp >= CHAR_a && cp <= CHAR_z || cp >= CHAR_0 && cp <= CHAR_9 || cp === CHAR_APOS || cp === CHAR_QUOT || cp === CHAR_LOWBAR || cp === CHAR_HYPHEN; | 
						|
} | 
						|
 | 
						|
function isAlphaNumHyphen(cp) { | 
						|
  return cp >= CHAR_A && cp <= CHAR_Z || cp >= CHAR_a && cp <= CHAR_z || cp >= CHAR_0 && cp <= CHAR_9 || cp === CHAR_LOWBAR || cp === CHAR_HYPHEN; | 
						|
} | 
						|
 | 
						|
var _type = Symbol('type'); | 
						|
 | 
						|
var _declared = Symbol('declared'); | 
						|
 | 
						|
var hasOwnProperty$1 = Object.prototype.hasOwnProperty; | 
						|
var defineProperty = Object.defineProperty; | 
						|
var descriptor = { | 
						|
  configurable: true, | 
						|
  enumerable: true, | 
						|
  writable: true, | 
						|
  value: undefined | 
						|
}; | 
						|
 | 
						|
function hasKey(obj, key) { | 
						|
  if (hasOwnProperty$1.call(obj, key)) return true; | 
						|
  if (key === '__proto__') defineProperty(obj, '__proto__', descriptor); | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
var INLINE_TABLE = Symbol('inline-table'); | 
						|
 | 
						|
function InlineTable() { | 
						|
  return Object.defineProperties({}, { | 
						|
    [_type]: { | 
						|
      value: INLINE_TABLE | 
						|
    } | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function isInlineTable(obj) { | 
						|
  if (obj === null || typeof obj !== 'object') return false; | 
						|
  return obj[_type] === INLINE_TABLE; | 
						|
} | 
						|
 | 
						|
var TABLE = Symbol('table'); | 
						|
 | 
						|
function Table() { | 
						|
  return Object.defineProperties({}, { | 
						|
    [_type]: { | 
						|
      value: TABLE | 
						|
    }, | 
						|
    [_declared]: { | 
						|
      value: false, | 
						|
      writable: true | 
						|
    } | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function isTable(obj) { | 
						|
  if (obj === null || typeof obj !== 'object') return false; | 
						|
  return obj[_type] === TABLE; | 
						|
} | 
						|
 | 
						|
var _contentType = Symbol('content-type'); | 
						|
 | 
						|
var INLINE_LIST = Symbol('inline-list'); | 
						|
 | 
						|
function InlineList(type) { | 
						|
  return Object.defineProperties([], { | 
						|
    [_type]: { | 
						|
      value: INLINE_LIST | 
						|
    }, | 
						|
    [_contentType]: { | 
						|
      value: type | 
						|
    } | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function isInlineList(obj) { | 
						|
  if (obj === null || typeof obj !== 'object') return false; | 
						|
  return obj[_type] === INLINE_LIST; | 
						|
} | 
						|
 | 
						|
var LIST = Symbol('list'); | 
						|
 | 
						|
function List() { | 
						|
  return Object.defineProperties([], { | 
						|
    [_type]: { | 
						|
      value: LIST | 
						|
    } | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function isList(obj) { | 
						|
  if (obj === null || typeof obj !== 'object') return false; | 
						|
  return obj[_type] === LIST; | 
						|
} // in an eval, to let bundlers not slurp in a util proxy | 
						|
 | 
						|
 | 
						|
var _custom; | 
						|
 | 
						|
try { | 
						|
  var utilInspect = util$2.inspect; | 
						|
  _custom = utilInspect.custom; | 
						|
} catch (_) {} | 
						|
/* eval require not available in transpiled bundle */ | 
						|
 | 
						|
/* istanbul ignore next */ | 
						|
 | 
						|
 | 
						|
var _inspect = _custom || 'inspect'; | 
						|
 | 
						|
var BoxedBigInt = | 
						|
/*#__PURE__*/ | 
						|
function () { | 
						|
  function BoxedBigInt(value) { | 
						|
    _classCallCheck(this, BoxedBigInt); | 
						|
 | 
						|
    try { | 
						|
      this.value = global.BigInt.asIntN(64, value); | 
						|
    } catch (_) { | 
						|
      /* istanbul ignore next */ | 
						|
      this.value = null; | 
						|
    } | 
						|
 | 
						|
    Object.defineProperty(this, _type, { | 
						|
      value: INTEGER | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  _createClass(BoxedBigInt, [{ | 
						|
    key: "isNaN", | 
						|
    value: function isNaN() { | 
						|
      return this.value === null; | 
						|
    } | 
						|
    /* istanbul ignore next */ | 
						|
 | 
						|
  }, { | 
						|
    key: "toString", | 
						|
    value: function toString() { | 
						|
      return String(this.value); | 
						|
    } | 
						|
    /* istanbul ignore next */ | 
						|
 | 
						|
  }, { | 
						|
    key: _inspect, | 
						|
    value: function value() { | 
						|
      return `[BigInt: ${this.toString()}]}`; | 
						|
    } | 
						|
  }, { | 
						|
    key: "valueOf", | 
						|
    value: function valueOf() { | 
						|
      return this.value; | 
						|
    } | 
						|
  }]); | 
						|
 | 
						|
  return BoxedBigInt; | 
						|
}(); | 
						|
 | 
						|
var INTEGER = Symbol('integer'); | 
						|
 | 
						|
function Integer(_value) { | 
						|
  var num = Number(_value); // -0 is a float thing, not an int thing | 
						|
 | 
						|
  if (Object.is(num, -0)) num = 0; | 
						|
  /* istanbul ignore else */ | 
						|
 | 
						|
  if (global.BigInt && !Number.isSafeInteger(num)) { | 
						|
    return new BoxedBigInt(_value); | 
						|
  } else { | 
						|
    /* istanbul ignore next */ | 
						|
    return Object.defineProperties(new Number(num), { | 
						|
      isNaN: { | 
						|
        value: function value() { | 
						|
          return isNaN(this); | 
						|
        } | 
						|
      }, | 
						|
      [_type]: { | 
						|
        value: INTEGER | 
						|
      }, | 
						|
      [_inspect]: { | 
						|
        value: function value() { | 
						|
          return `[Integer: ${_value}]`; | 
						|
        } | 
						|
      } | 
						|
    }); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function isInteger(obj) { | 
						|
  if (obj === null || typeof obj !== 'object') return false; | 
						|
  return obj[_type] === INTEGER; | 
						|
} | 
						|
 | 
						|
var FLOAT = Symbol('float'); | 
						|
 | 
						|
function Float(_value2) { | 
						|
  /* istanbul ignore next */ | 
						|
  return Object.defineProperties(new Number(_value2), { | 
						|
    [_type]: { | 
						|
      value: FLOAT | 
						|
    }, | 
						|
    [_inspect]: { | 
						|
      value: function value() { | 
						|
        return `[Float: ${_value2}]`; | 
						|
      } | 
						|
    } | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function isFloat(obj) { | 
						|
  if (obj === null || typeof obj !== 'object') return false; | 
						|
  return obj[_type] === FLOAT; | 
						|
} | 
						|
 | 
						|
function tomlType(value) { | 
						|
  var type = typeof value; | 
						|
 | 
						|
  if (type === 'object') { | 
						|
    /* istanbul ignore if */ | 
						|
    if (value === null) return 'null'; | 
						|
    if (value instanceof Date) return 'datetime'; | 
						|
    /* istanbul ignore else */ | 
						|
 | 
						|
    if (_type in value) { | 
						|
      switch (value[_type]) { | 
						|
        case INLINE_TABLE: | 
						|
          return 'inline-table'; | 
						|
 | 
						|
        case INLINE_LIST: | 
						|
          return 'inline-list'; | 
						|
 | 
						|
        /* istanbul ignore next */ | 
						|
 | 
						|
        case TABLE: | 
						|
          return 'table'; | 
						|
 | 
						|
        /* istanbul ignore next */ | 
						|
 | 
						|
        case LIST: | 
						|
          return 'list'; | 
						|
 | 
						|
        case FLOAT: | 
						|
          return 'float'; | 
						|
 | 
						|
        case INTEGER: | 
						|
          return 'integer'; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return type; | 
						|
} | 
						|
 | 
						|
function makeParserClass(Parser) { | 
						|
  var TOMLParser = | 
						|
  /*#__PURE__*/ | 
						|
  function (_Parser) { | 
						|
    _inherits(TOMLParser, _Parser); | 
						|
 | 
						|
    function TOMLParser() { | 
						|
      var _this2; | 
						|
 | 
						|
      _classCallCheck(this, TOMLParser); | 
						|
 | 
						|
      _this2 = _possibleConstructorReturn(this, _getPrototypeOf(TOMLParser).call(this)); | 
						|
      _this2.ctx = _this2.obj = Table(); | 
						|
      return _this2; | 
						|
    } | 
						|
    /* MATCH HELPER */ | 
						|
 | 
						|
 | 
						|
    _createClass(TOMLParser, [{ | 
						|
      key: "atEndOfWord", | 
						|
      value: function atEndOfWord() { | 
						|
        return this.char === CHAR_NUM || this.char === CTRL_I || this.char === CHAR_SP || this.atEndOfLine(); | 
						|
      } | 
						|
    }, { | 
						|
      key: "atEndOfLine", | 
						|
      value: function atEndOfLine() { | 
						|
        return this.char === Parser.END || this.char === CTRL_J || this.char === CTRL_M; | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseStart", | 
						|
      value: function parseStart() { | 
						|
        if (this.char === Parser.END) { | 
						|
          return null; | 
						|
        } else if (this.char === CHAR_LSQB) { | 
						|
          return this.call(this.parseTableOrList); | 
						|
        } else if (this.char === CHAR_NUM) { | 
						|
          return this.call(this.parseComment); | 
						|
        } else if (this.char === CTRL_J || this.char === CHAR_SP || this.char === CTRL_I || this.char === CTRL_M) { | 
						|
          return null; | 
						|
        } else if (isAlphaNumQuoteHyphen(this.char)) { | 
						|
          return this.callNow(this.parseAssignStatement); | 
						|
        } else { | 
						|
          throw this.error(new TomlError(`Unknown character "${this.char}"`)); | 
						|
        } | 
						|
      } // HELPER, this strips any whitespace and comments to the end of the line | 
						|
      // then RETURNS. Last state in a production. | 
						|
 | 
						|
    }, { | 
						|
      key: "parseWhitespaceToEOL", | 
						|
      value: function parseWhitespaceToEOL() { | 
						|
        if (this.char === CHAR_SP || this.char === CTRL_I || this.char === CTRL_M) { | 
						|
          return null; | 
						|
        } else if (this.char === CHAR_NUM) { | 
						|
          return this.goto(this.parseComment); | 
						|
        } else if (this.char === Parser.END || this.char === CTRL_J) { | 
						|
          return this.return(); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Unexpected character, expected only whitespace or comments till end of line')); | 
						|
        } | 
						|
      } | 
						|
      /* ASSIGNMENT: key = value */ | 
						|
 | 
						|
    }, { | 
						|
      key: "parseAssignStatement", | 
						|
      value: function parseAssignStatement() { | 
						|
        return this.callNow(this.parseAssign, this.recordAssignStatement); | 
						|
      } | 
						|
    }, { | 
						|
      key: "recordAssignStatement", | 
						|
      value: function recordAssignStatement(kv) { | 
						|
        var target = this.ctx; | 
						|
        var finalKey = kv.key.pop(); | 
						|
        var _iteratorNormalCompletion = true; | 
						|
        var _didIteratorError = false; | 
						|
        var _iteratorError = undefined; | 
						|
 | 
						|
        try { | 
						|
          for (var _iterator = kv.key[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | 
						|
            var kw = _step.value; | 
						|
 | 
						|
            if (hasKey(target, kw) && (!isTable(target[kw]) || target[kw][_declared])) { | 
						|
              throw this.error(new TomlError("Can't redefine existing key")); | 
						|
            } | 
						|
 | 
						|
            target = target[kw] = target[kw] || Table(); | 
						|
          } | 
						|
        } catch (err) { | 
						|
          _didIteratorError = true; | 
						|
          _iteratorError = err; | 
						|
        } finally { | 
						|
          try { | 
						|
            if (!_iteratorNormalCompletion && _iterator.return != null) { | 
						|
              _iterator.return(); | 
						|
            } | 
						|
          } finally { | 
						|
            if (_didIteratorError) { | 
						|
              throw _iteratorError; | 
						|
            } | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        if (hasKey(target, finalKey)) { | 
						|
          throw this.error(new TomlError("Can't redefine existing key")); | 
						|
        } // unbox our numbers | 
						|
 | 
						|
 | 
						|
        if (isInteger(kv.value) || isFloat(kv.value)) { | 
						|
          target[finalKey] = kv.value.valueOf(); | 
						|
        } else { | 
						|
          target[finalKey] = kv.value; | 
						|
        } | 
						|
 | 
						|
        return this.goto(this.parseWhitespaceToEOL); | 
						|
      } | 
						|
      /* ASSSIGNMENT expression, key = value possibly inside an inline table */ | 
						|
 | 
						|
    }, { | 
						|
      key: "parseAssign", | 
						|
      value: function parseAssign() { | 
						|
        return this.callNow(this.parseKeyword, this.recordAssignKeyword); | 
						|
      } | 
						|
    }, { | 
						|
      key: "recordAssignKeyword", | 
						|
      value: function recordAssignKeyword(key) { | 
						|
        if (this.state.resultTable) { | 
						|
          this.state.resultTable.push(key); | 
						|
        } else { | 
						|
          this.state.resultTable = [key]; | 
						|
        } | 
						|
 | 
						|
        return this.goto(this.parseAssignKeywordPreDot); | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseAssignKeywordPreDot", | 
						|
      value: function parseAssignKeywordPreDot() { | 
						|
        if (this.char === CHAR_PERIOD) { | 
						|
          return this.next(this.parseAssignKeywordPostDot); | 
						|
        } else if (this.char !== CHAR_SP && this.char !== CTRL_I) { | 
						|
          return this.goto(this.parseAssignEqual); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseAssignKeywordPostDot", | 
						|
      value: function parseAssignKeywordPostDot() { | 
						|
        if (this.char !== CHAR_SP && this.char !== CTRL_I) { | 
						|
          return this.callNow(this.parseKeyword, this.recordAssignKeyword); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseAssignEqual", | 
						|
      value: function parseAssignEqual() { | 
						|
        if (this.char === CHAR_EQUALS) { | 
						|
          return this.next(this.parseAssignPreValue); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Invalid character, expected "="')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseAssignPreValue", | 
						|
      value: function parseAssignPreValue() { | 
						|
        if (this.char === CHAR_SP || this.char === CTRL_I) { | 
						|
          return null; | 
						|
        } else { | 
						|
          return this.callNow(this.parseValue, this.recordAssignValue); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "recordAssignValue", | 
						|
      value: function recordAssignValue(value) { | 
						|
        return this.returnNow({ | 
						|
          key: this.state.resultTable, | 
						|
          value: value | 
						|
        }); | 
						|
      } | 
						|
      /* COMMENTS: #...eol */ | 
						|
 | 
						|
    }, { | 
						|
      key: "parseComment", | 
						|
      value: function parseComment() { | 
						|
        do { | 
						|
          if (this.char === Parser.END || this.char === CTRL_J) { | 
						|
            return this.return(); | 
						|
          } | 
						|
        } while (this.nextChar()); | 
						|
      } | 
						|
      /* TABLES AND LISTS, [foo] and [[foo]] */ | 
						|
 | 
						|
    }, { | 
						|
      key: "parseTableOrList", | 
						|
      value: function parseTableOrList() { | 
						|
        if (this.char === CHAR_LSQB) { | 
						|
          this.next(this.parseList); | 
						|
        } else { | 
						|
          return this.goto(this.parseTable); | 
						|
        } | 
						|
      } | 
						|
      /* TABLE [foo.bar.baz] */ | 
						|
 | 
						|
    }, { | 
						|
      key: "parseTable", | 
						|
      value: function parseTable() { | 
						|
        this.ctx = this.obj; | 
						|
        return this.goto(this.parseTableNext); | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseTableNext", | 
						|
      value: function parseTableNext() { | 
						|
        if (this.char === CHAR_SP || this.char === CTRL_I) { | 
						|
          return null; | 
						|
        } else { | 
						|
          return this.callNow(this.parseKeyword, this.parseTableMore); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseTableMore", | 
						|
      value: function parseTableMore(keyword) { | 
						|
        if (this.char === CHAR_SP || this.char === CTRL_I) { | 
						|
          return null; | 
						|
        } else if (this.char === CHAR_RSQB) { | 
						|
          if (hasKey(this.ctx, keyword) && (!isTable(this.ctx[keyword]) || this.ctx[keyword][_declared])) { | 
						|
            throw this.error(new TomlError("Can't redefine existing key")); | 
						|
          } else { | 
						|
            this.ctx = this.ctx[keyword] = this.ctx[keyword] || Table(); | 
						|
            this.ctx[_declared] = true; | 
						|
          } | 
						|
 | 
						|
          return this.next(this.parseWhitespaceToEOL); | 
						|
        } else if (this.char === CHAR_PERIOD) { | 
						|
          if (!hasKey(this.ctx, keyword)) { | 
						|
            this.ctx = this.ctx[keyword] = Table(); | 
						|
          } else if (isTable(this.ctx[keyword])) { | 
						|
            this.ctx = this.ctx[keyword]; | 
						|
          } else if (isList(this.ctx[keyword])) { | 
						|
            this.ctx = this.ctx[keyword][this.ctx[keyword].length - 1]; | 
						|
          } else { | 
						|
            throw this.error(new TomlError("Can't redefine existing key")); | 
						|
          } | 
						|
 | 
						|
          return this.next(this.parseTableNext); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Unexpected character, expected whitespace, . or ]')); | 
						|
        } | 
						|
      } | 
						|
      /* LIST [[a.b.c]] */ | 
						|
 | 
						|
    }, { | 
						|
      key: "parseList", | 
						|
      value: function parseList() { | 
						|
        this.ctx = this.obj; | 
						|
        return this.goto(this.parseListNext); | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseListNext", | 
						|
      value: function parseListNext() { | 
						|
        if (this.char === CHAR_SP || this.char === CTRL_I) { | 
						|
          return null; | 
						|
        } else { | 
						|
          return this.callNow(this.parseKeyword, this.parseListMore); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseListMore", | 
						|
      value: function parseListMore(keyword) { | 
						|
        if (this.char === CHAR_SP || this.char === CTRL_I) { | 
						|
          return null; | 
						|
        } else if (this.char === CHAR_RSQB) { | 
						|
          if (!hasKey(this.ctx, keyword)) { | 
						|
            this.ctx[keyword] = List(); | 
						|
          } | 
						|
 | 
						|
          if (isInlineList(this.ctx[keyword])) { | 
						|
            throw this.error(new TomlError("Can't extend an inline array")); | 
						|
          } else if (isList(this.ctx[keyword])) { | 
						|
            var next = Table(); | 
						|
            this.ctx[keyword].push(next); | 
						|
            this.ctx = next; | 
						|
          } else { | 
						|
            throw this.error(new TomlError("Can't redefine an existing key")); | 
						|
          } | 
						|
 | 
						|
          return this.next(this.parseListEnd); | 
						|
        } else if (this.char === CHAR_PERIOD) { | 
						|
          if (!hasKey(this.ctx, keyword)) { | 
						|
            this.ctx = this.ctx[keyword] = Table(); | 
						|
          } else if (isInlineList(this.ctx[keyword])) { | 
						|
            throw this.error(new TomlError("Can't extend an inline array")); | 
						|
          } else if (isInlineTable(this.ctx[keyword])) { | 
						|
            throw this.error(new TomlError("Can't extend an inline table")); | 
						|
          } else if (isList(this.ctx[keyword])) { | 
						|
            this.ctx = this.ctx[keyword][this.ctx[keyword].length - 1]; | 
						|
          } else if (isTable(this.ctx[keyword])) { | 
						|
            this.ctx = this.ctx[keyword]; | 
						|
          } else { | 
						|
            throw this.error(new TomlError("Can't redefine an existing key")); | 
						|
          } | 
						|
 | 
						|
          return this.next(this.parseListNext); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Unexpected character, expected whitespace, . or ]')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseListEnd", | 
						|
      value: function parseListEnd(keyword) { | 
						|
        if (this.char === CHAR_RSQB) { | 
						|
          return this.next(this.parseWhitespaceToEOL); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Unexpected character, expected whitespace, . or ]')); | 
						|
        } | 
						|
      } | 
						|
      /* VALUE string, number, boolean, inline list, inline object */ | 
						|
 | 
						|
    }, { | 
						|
      key: "parseValue", | 
						|
      value: function parseValue() { | 
						|
        if (this.char === Parser.END) { | 
						|
          throw this.error(new TomlError('Key without value')); | 
						|
        } else if (this.char === CHAR_QUOT) { | 
						|
          return this.next(this.parseDoubleString); | 
						|
        } | 
						|
 | 
						|
        if (this.char === CHAR_APOS) { | 
						|
          return this.next(this.parseSingleString); | 
						|
        } else if (this.char === CHAR_HYPHEN || this.char === CHAR_PLUS) { | 
						|
          return this.goto(this.parseNumberSign); | 
						|
        } else if (this.char === CHAR_i) { | 
						|
          return this.next(this.parseInf); | 
						|
        } else if (this.char === CHAR_n) { | 
						|
          return this.next(this.parseNan); | 
						|
        } else if (isDigit(this.char)) { | 
						|
          return this.goto(this.parseNumberOrDateTime); | 
						|
        } else if (this.char === CHAR_t || this.char === CHAR_f) { | 
						|
          return this.goto(this.parseBoolean); | 
						|
        } else if (this.char === CHAR_LSQB) { | 
						|
          return this.call(this.parseInlineList, this.recordValue); | 
						|
        } else if (this.char === CHAR_LCUB) { | 
						|
          return this.call(this.parseInlineTable, this.recordValue); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Unexpected character, expecting string, number, datetime, boolean, inline array or inline table')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "recordValue", | 
						|
      value: function recordValue(value) { | 
						|
        return this.returnNow(value); | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseInf", | 
						|
      value: function parseInf() { | 
						|
        if (this.char === CHAR_n) { | 
						|
          return this.next(this.parseInf2); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Unexpected character, expected "inf", "+inf" or "-inf"')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseInf2", | 
						|
      value: function parseInf2() { | 
						|
        if (this.char === CHAR_f) { | 
						|
          if (this.state.buf === '-') { | 
						|
            return this.return(-Infinity); | 
						|
          } else { | 
						|
            return this.return(Infinity); | 
						|
          } | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Unexpected character, expected "inf", "+inf" or "-inf"')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseNan", | 
						|
      value: function parseNan() { | 
						|
        if (this.char === CHAR_a) { | 
						|
          return this.next(this.parseNan2); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Unexpected character, expected "nan"')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseNan2", | 
						|
      value: function parseNan2() { | 
						|
        if (this.char === CHAR_n) { | 
						|
          return this.return(NaN); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Unexpected character, expected "nan"')); | 
						|
        } | 
						|
      } | 
						|
      /* KEYS, barewords or basic, literal, or dotted */ | 
						|
 | 
						|
    }, { | 
						|
      key: "parseKeyword", | 
						|
      value: function parseKeyword() { | 
						|
        if (this.char === CHAR_QUOT) { | 
						|
          return this.next(this.parseBasicString); | 
						|
        } else if (this.char === CHAR_APOS) { | 
						|
          return this.next(this.parseLiteralString); | 
						|
        } else { | 
						|
          return this.goto(this.parseBareKey); | 
						|
        } | 
						|
      } | 
						|
      /* KEYS: barewords */ | 
						|
 | 
						|
    }, { | 
						|
      key: "parseBareKey", | 
						|
      value: function parseBareKey() { | 
						|
        do { | 
						|
          if (this.char === Parser.END) { | 
						|
            throw this.error(new TomlError('Key ended without value')); | 
						|
          } else if (isAlphaNumHyphen(this.char)) { | 
						|
            this.consume(); | 
						|
          } else if (this.state.buf.length === 0) { | 
						|
            throw this.error(new TomlError('Empty bare keys are not allowed')); | 
						|
          } else { | 
						|
            return this.returnNow(); | 
						|
          } | 
						|
        } while (this.nextChar()); | 
						|
      } | 
						|
      /* STRINGS, single quoted (literal) */ | 
						|
 | 
						|
    }, { | 
						|
      key: "parseSingleString", | 
						|
      value: function parseSingleString() { | 
						|
        if (this.char === CHAR_APOS) { | 
						|
          return this.next(this.parseLiteralMultiStringMaybe); | 
						|
        } else { | 
						|
          return this.goto(this.parseLiteralString); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseLiteralString", | 
						|
      value: function parseLiteralString() { | 
						|
        do { | 
						|
          if (this.char === CHAR_APOS) { | 
						|
            return this.return(); | 
						|
          } else if (this.atEndOfLine()) { | 
						|
            throw this.error(new TomlError('Unterminated string')); | 
						|
          } else if (this.char === CHAR_DEL || this.char <= CTRL_CHAR_BOUNDARY && this.char !== CTRL_I) { | 
						|
            throw this.errorControlCharInString(); | 
						|
          } else { | 
						|
            this.consume(); | 
						|
          } | 
						|
        } while (this.nextChar()); | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseLiteralMultiStringMaybe", | 
						|
      value: function parseLiteralMultiStringMaybe() { | 
						|
        if (this.char === CHAR_APOS) { | 
						|
          return this.next(this.parseLiteralMultiString); | 
						|
        } else { | 
						|
          return this.returnNow(); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseLiteralMultiString", | 
						|
      value: function parseLiteralMultiString() { | 
						|
        if (this.char === CTRL_M) { | 
						|
          return null; | 
						|
        } else if (this.char === CTRL_J) { | 
						|
          return this.next(this.parseLiteralMultiStringContent); | 
						|
        } else { | 
						|
          return this.goto(this.parseLiteralMultiStringContent); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseLiteralMultiStringContent", | 
						|
      value: function parseLiteralMultiStringContent() { | 
						|
        do { | 
						|
          if (this.char === CHAR_APOS) { | 
						|
            return this.next(this.parseLiteralMultiEnd); | 
						|
          } else if (this.char === Parser.END) { | 
						|
            throw this.error(new TomlError('Unterminated multi-line string')); | 
						|
          } else if (this.char === CHAR_DEL || this.char <= CTRL_CHAR_BOUNDARY && this.char !== CTRL_I && this.char !== CTRL_J && this.char !== CTRL_M) { | 
						|
            throw this.errorControlCharInString(); | 
						|
          } else { | 
						|
            this.consume(); | 
						|
          } | 
						|
        } while (this.nextChar()); | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseLiteralMultiEnd", | 
						|
      value: function parseLiteralMultiEnd() { | 
						|
        if (this.char === CHAR_APOS) { | 
						|
          return this.next(this.parseLiteralMultiEnd2); | 
						|
        } else { | 
						|
          this.state.buf += "'"; | 
						|
          return this.goto(this.parseLiteralMultiStringContent); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseLiteralMultiEnd2", | 
						|
      value: function parseLiteralMultiEnd2() { | 
						|
        if (this.char === CHAR_APOS) { | 
						|
          return this.return(); | 
						|
        } else { | 
						|
          this.state.buf += "''"; | 
						|
          return this.goto(this.parseLiteralMultiStringContent); | 
						|
        } | 
						|
      } | 
						|
      /* STRINGS double quoted */ | 
						|
 | 
						|
    }, { | 
						|
      key: "parseDoubleString", | 
						|
      value: function parseDoubleString() { | 
						|
        if (this.char === CHAR_QUOT) { | 
						|
          return this.next(this.parseMultiStringMaybe); | 
						|
        } else { | 
						|
          return this.goto(this.parseBasicString); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseBasicString", | 
						|
      value: function parseBasicString() { | 
						|
        do { | 
						|
          if (this.char === CHAR_BSOL) { | 
						|
            return this.call(this.parseEscape, this.recordEscapeReplacement); | 
						|
          } else if (this.char === CHAR_QUOT) { | 
						|
            return this.return(); | 
						|
          } else if (this.atEndOfLine()) { | 
						|
            throw this.error(new TomlError('Unterminated string')); | 
						|
          } else if (this.char === CHAR_DEL || this.char <= CTRL_CHAR_BOUNDARY && this.char !== CTRL_I) { | 
						|
            throw this.errorControlCharInString(); | 
						|
          } else { | 
						|
            this.consume(); | 
						|
          } | 
						|
        } while (this.nextChar()); | 
						|
      } | 
						|
    }, { | 
						|
      key: "recordEscapeReplacement", | 
						|
      value: function recordEscapeReplacement(replacement) { | 
						|
        this.state.buf += replacement; | 
						|
        return this.goto(this.parseBasicString); | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseMultiStringMaybe", | 
						|
      value: function parseMultiStringMaybe() { | 
						|
        if (this.char === CHAR_QUOT) { | 
						|
          return this.next(this.parseMultiString); | 
						|
        } else { | 
						|
          return this.returnNow(); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseMultiString", | 
						|
      value: function parseMultiString() { | 
						|
        if (this.char === CTRL_M) { | 
						|
          return null; | 
						|
        } else if (this.char === CTRL_J) { | 
						|
          return this.next(this.parseMultiStringContent); | 
						|
        } else { | 
						|
          return this.goto(this.parseMultiStringContent); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseMultiStringContent", | 
						|
      value: function parseMultiStringContent() { | 
						|
        do { | 
						|
          if (this.char === CHAR_BSOL) { | 
						|
            return this.call(this.parseMultiEscape, this.recordMultiEscapeReplacement); | 
						|
          } else if (this.char === CHAR_QUOT) { | 
						|
            return this.next(this.parseMultiEnd); | 
						|
          } else if (this.char === Parser.END) { | 
						|
            throw this.error(new TomlError('Unterminated multi-line string')); | 
						|
          } else if (this.char === CHAR_DEL || this.char <= CTRL_CHAR_BOUNDARY && this.char !== CTRL_I && this.char !== CTRL_J && this.char !== CTRL_M) { | 
						|
            throw this.errorControlCharInString(); | 
						|
          } else { | 
						|
            this.consume(); | 
						|
          } | 
						|
        } while (this.nextChar()); | 
						|
      } | 
						|
    }, { | 
						|
      key: "errorControlCharInString", | 
						|
      value: function errorControlCharInString() { | 
						|
        var displayCode = '\\u00'; | 
						|
 | 
						|
        if (this.char < 16) { | 
						|
          displayCode += '0'; | 
						|
        } | 
						|
 | 
						|
        displayCode += this.char.toString(16); | 
						|
        return this.error(new TomlError(`Control characters (codes < 0x1f and 0x7f) are not allowed in strings, use ${displayCode} instead`)); | 
						|
      } | 
						|
    }, { | 
						|
      key: "recordMultiEscapeReplacement", | 
						|
      value: function recordMultiEscapeReplacement(replacement) { | 
						|
        this.state.buf += replacement; | 
						|
        return this.goto(this.parseMultiStringContent); | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseMultiEnd", | 
						|
      value: function parseMultiEnd() { | 
						|
        if (this.char === CHAR_QUOT) { | 
						|
          return this.next(this.parseMultiEnd2); | 
						|
        } else { | 
						|
          this.state.buf += '"'; | 
						|
          return this.goto(this.parseMultiStringContent); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseMultiEnd2", | 
						|
      value: function parseMultiEnd2() { | 
						|
        if (this.char === CHAR_QUOT) { | 
						|
          return this.return(); | 
						|
        } else { | 
						|
          this.state.buf += '""'; | 
						|
          return this.goto(this.parseMultiStringContent); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseMultiEscape", | 
						|
      value: function parseMultiEscape() { | 
						|
        if (this.char === CTRL_M || this.char === CTRL_J) { | 
						|
          return this.next(this.parseMultiTrim); | 
						|
        } else if (this.char === CHAR_SP || this.char === CTRL_I) { | 
						|
          return this.next(this.parsePreMultiTrim); | 
						|
        } else { | 
						|
          return this.goto(this.parseEscape); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parsePreMultiTrim", | 
						|
      value: function parsePreMultiTrim() { | 
						|
        if (this.char === CHAR_SP || this.char === CTRL_I) { | 
						|
          return null; | 
						|
        } else if (this.char === CTRL_M || this.char === CTRL_J) { | 
						|
          return this.next(this.parseMultiTrim); | 
						|
        } else { | 
						|
          throw this.error(new TomlError("Can't escape whitespace")); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseMultiTrim", | 
						|
      value: function parseMultiTrim() { | 
						|
        // explicitly whitespace here, END should follow the same path as chars | 
						|
        if (this.char === CTRL_J || this.char === CHAR_SP || this.char === CTRL_I || this.char === CTRL_M) { | 
						|
          return null; | 
						|
        } else { | 
						|
          return this.returnNow(); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseEscape", | 
						|
      value: function parseEscape() { | 
						|
        if (this.char in escapes) { | 
						|
          return this.return(escapes[this.char]); | 
						|
        } else if (this.char === CHAR_u) { | 
						|
          return this.call(this.parseSmallUnicode, this.parseUnicodeReturn); | 
						|
        } else if (this.char === CHAR_U) { | 
						|
          return this.call(this.parseLargeUnicode, this.parseUnicodeReturn); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Unknown escape character: ' + this.char)); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseUnicodeReturn", | 
						|
      value: function parseUnicodeReturn(char) { | 
						|
        try { | 
						|
          var codePoint = parseInt(char, 16); | 
						|
 | 
						|
          if (codePoint >= SURROGATE_FIRST && codePoint <= SURROGATE_LAST) { | 
						|
            throw this.error(new TomlError('Invalid unicode, character in range 0xD800 - 0xDFFF is reserved')); | 
						|
          } | 
						|
 | 
						|
          return this.returnNow(String.fromCodePoint(codePoint)); | 
						|
        } catch (err) { | 
						|
          throw this.error(TomlError.wrap(err)); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseSmallUnicode", | 
						|
      value: function parseSmallUnicode() { | 
						|
        if (!isHexit(this.char)) { | 
						|
          throw this.error(new TomlError('Invalid character in unicode sequence, expected hex')); | 
						|
        } else { | 
						|
          this.consume(); | 
						|
          if (this.state.buf.length >= 4) return this.return(); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseLargeUnicode", | 
						|
      value: function parseLargeUnicode() { | 
						|
        if (!isHexit(this.char)) { | 
						|
          throw this.error(new TomlError('Invalid character in unicode sequence, expected hex')); | 
						|
        } else { | 
						|
          this.consume(); | 
						|
          if (this.state.buf.length >= 8) return this.return(); | 
						|
        } | 
						|
      } | 
						|
      /* NUMBERS */ | 
						|
 | 
						|
    }, { | 
						|
      key: "parseNumberSign", | 
						|
      value: function parseNumberSign() { | 
						|
        this.consume(); | 
						|
        return this.next(this.parseMaybeSignedInfOrNan); | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseMaybeSignedInfOrNan", | 
						|
      value: function parseMaybeSignedInfOrNan() { | 
						|
        if (this.char === CHAR_i) { | 
						|
          return this.next(this.parseInf); | 
						|
        } else if (this.char === CHAR_n) { | 
						|
          return this.next(this.parseNan); | 
						|
        } else { | 
						|
          return this.callNow(this.parseNoUnder, this.parseNumberIntegerStart); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseNumberIntegerStart", | 
						|
      value: function parseNumberIntegerStart() { | 
						|
        if (this.char === CHAR_0) { | 
						|
          this.consume(); | 
						|
          return this.next(this.parseNumberIntegerExponentOrDecimal); | 
						|
        } else { | 
						|
          return this.goto(this.parseNumberInteger); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseNumberIntegerExponentOrDecimal", | 
						|
      value: function parseNumberIntegerExponentOrDecimal() { | 
						|
        if (this.char === CHAR_PERIOD) { | 
						|
          this.consume(); | 
						|
          return this.call(this.parseNoUnder, this.parseNumberFloat); | 
						|
        } else if (this.char === CHAR_E || this.char === CHAR_e) { | 
						|
          this.consume(); | 
						|
          return this.next(this.parseNumberExponentSign); | 
						|
        } else { | 
						|
          return this.returnNow(Integer(this.state.buf)); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseNumberInteger", | 
						|
      value: function parseNumberInteger() { | 
						|
        if (isDigit(this.char)) { | 
						|
          this.consume(); | 
						|
        } else if (this.char === CHAR_LOWBAR) { | 
						|
          return this.call(this.parseNoUnder); | 
						|
        } else if (this.char === CHAR_E || this.char === CHAR_e) { | 
						|
          this.consume(); | 
						|
          return this.next(this.parseNumberExponentSign); | 
						|
        } else if (this.char === CHAR_PERIOD) { | 
						|
          this.consume(); | 
						|
          return this.call(this.parseNoUnder, this.parseNumberFloat); | 
						|
        } else { | 
						|
          var result = Integer(this.state.buf); | 
						|
          /* istanbul ignore if */ | 
						|
 | 
						|
          if (result.isNaN()) { | 
						|
            throw this.error(new TomlError('Invalid number')); | 
						|
          } else { | 
						|
            return this.returnNow(result); | 
						|
          } | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseNoUnder", | 
						|
      value: function parseNoUnder() { | 
						|
        if (this.char === CHAR_LOWBAR || this.char === CHAR_PERIOD || this.char === CHAR_E || this.char === CHAR_e) { | 
						|
          throw this.error(new TomlError('Unexpected character, expected digit')); | 
						|
        } else if (this.atEndOfWord()) { | 
						|
          throw this.error(new TomlError('Incomplete number')); | 
						|
        } | 
						|
 | 
						|
        return this.returnNow(); | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseNumberFloat", | 
						|
      value: function parseNumberFloat() { | 
						|
        if (this.char === CHAR_LOWBAR) { | 
						|
          return this.call(this.parseNoUnder, this.parseNumberFloat); | 
						|
        } else if (isDigit(this.char)) { | 
						|
          this.consume(); | 
						|
        } else if (this.char === CHAR_E || this.char === CHAR_e) { | 
						|
          this.consume(); | 
						|
          return this.next(this.parseNumberExponentSign); | 
						|
        } else { | 
						|
          return this.returnNow(Float(this.state.buf)); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseNumberExponentSign", | 
						|
      value: function parseNumberExponentSign() { | 
						|
        if (isDigit(this.char)) { | 
						|
          return this.goto(this.parseNumberExponent); | 
						|
        } else if (this.char === CHAR_HYPHEN || this.char === CHAR_PLUS) { | 
						|
          this.consume(); | 
						|
          this.call(this.parseNoUnder, this.parseNumberExponent); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Unexpected character, expected -, + or digit')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseNumberExponent", | 
						|
      value: function parseNumberExponent() { | 
						|
        if (isDigit(this.char)) { | 
						|
          this.consume(); | 
						|
        } else if (this.char === CHAR_LOWBAR) { | 
						|
          return this.call(this.parseNoUnder); | 
						|
        } else { | 
						|
          return this.returnNow(Float(this.state.buf)); | 
						|
        } | 
						|
      } | 
						|
      /* NUMBERS or DATETIMES  */ | 
						|
 | 
						|
    }, { | 
						|
      key: "parseNumberOrDateTime", | 
						|
      value: function parseNumberOrDateTime() { | 
						|
        if (this.char === CHAR_0) { | 
						|
          this.consume(); | 
						|
          return this.next(this.parseNumberBaseOrDateTime); | 
						|
        } else { | 
						|
          return this.goto(this.parseNumberOrDateTimeOnly); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseNumberOrDateTimeOnly", | 
						|
      value: function parseNumberOrDateTimeOnly() { | 
						|
        // note, if two zeros are in a row then it MUST be a date | 
						|
        if (this.char === CHAR_LOWBAR) { | 
						|
          return this.call(this.parseNoUnder, this.parseNumberInteger); | 
						|
        } else if (isDigit(this.char)) { | 
						|
          this.consume(); | 
						|
          if (this.state.buf.length > 4) this.next(this.parseNumberInteger); | 
						|
        } else if (this.char === CHAR_E || this.char === CHAR_e) { | 
						|
          this.consume(); | 
						|
          return this.next(this.parseNumberExponentSign); | 
						|
        } else if (this.char === CHAR_PERIOD) { | 
						|
          this.consume(); | 
						|
          return this.call(this.parseNoUnder, this.parseNumberFloat); | 
						|
        } else if (this.char === CHAR_HYPHEN) { | 
						|
          return this.goto(this.parseDateTime); | 
						|
        } else if (this.char === CHAR_COLON) { | 
						|
          return this.goto(this.parseOnlyTimeHour); | 
						|
        } else { | 
						|
          return this.returnNow(Integer(this.state.buf)); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseDateTimeOnly", | 
						|
      value: function parseDateTimeOnly() { | 
						|
        if (this.state.buf.length < 4) { | 
						|
          if (isDigit(this.char)) { | 
						|
            return this.consume(); | 
						|
          } else if (this.char === CHAR_COLON) { | 
						|
            return this.goto(this.parseOnlyTimeHour); | 
						|
          } else { | 
						|
            throw this.error(new TomlError('Expected digit while parsing year part of a date')); | 
						|
          } | 
						|
        } else { | 
						|
          if (this.char === CHAR_HYPHEN) { | 
						|
            return this.goto(this.parseDateTime); | 
						|
          } else { | 
						|
            throw this.error(new TomlError('Expected hyphen (-) while parsing year part of date')); | 
						|
          } | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseNumberBaseOrDateTime", | 
						|
      value: function parseNumberBaseOrDateTime() { | 
						|
        if (this.char === CHAR_b) { | 
						|
          this.consume(); | 
						|
          return this.call(this.parseNoUnder, this.parseIntegerBin); | 
						|
        } else if (this.char === CHAR_o) { | 
						|
          this.consume(); | 
						|
          return this.call(this.parseNoUnder, this.parseIntegerOct); | 
						|
        } else if (this.char === CHAR_x) { | 
						|
          this.consume(); | 
						|
          return this.call(this.parseNoUnder, this.parseIntegerHex); | 
						|
        } else if (this.char === CHAR_PERIOD) { | 
						|
          return this.goto(this.parseNumberInteger); | 
						|
        } else if (isDigit(this.char)) { | 
						|
          return this.goto(this.parseDateTimeOnly); | 
						|
        } else { | 
						|
          return this.returnNow(Integer(this.state.buf)); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseIntegerHex", | 
						|
      value: function parseIntegerHex() { | 
						|
        if (isHexit(this.char)) { | 
						|
          this.consume(); | 
						|
        } else if (this.char === CHAR_LOWBAR) { | 
						|
          return this.call(this.parseNoUnder); | 
						|
        } else { | 
						|
          var result = Integer(this.state.buf); | 
						|
          /* istanbul ignore if */ | 
						|
 | 
						|
          if (result.isNaN()) { | 
						|
            throw this.error(new TomlError('Invalid number')); | 
						|
          } else { | 
						|
            return this.returnNow(result); | 
						|
          } | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseIntegerOct", | 
						|
      value: function parseIntegerOct() { | 
						|
        if (isOctit(this.char)) { | 
						|
          this.consume(); | 
						|
        } else if (this.char === CHAR_LOWBAR) { | 
						|
          return this.call(this.parseNoUnder); | 
						|
        } else { | 
						|
          var result = Integer(this.state.buf); | 
						|
          /* istanbul ignore if */ | 
						|
 | 
						|
          if (result.isNaN()) { | 
						|
            throw this.error(new TomlError('Invalid number')); | 
						|
          } else { | 
						|
            return this.returnNow(result); | 
						|
          } | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseIntegerBin", | 
						|
      value: function parseIntegerBin() { | 
						|
        if (isBit(this.char)) { | 
						|
          this.consume(); | 
						|
        } else if (this.char === CHAR_LOWBAR) { | 
						|
          return this.call(this.parseNoUnder); | 
						|
        } else { | 
						|
          var result = Integer(this.state.buf); | 
						|
          /* istanbul ignore if */ | 
						|
 | 
						|
          if (result.isNaN()) { | 
						|
            throw this.error(new TomlError('Invalid number')); | 
						|
          } else { | 
						|
            return this.returnNow(result); | 
						|
          } | 
						|
        } | 
						|
      } | 
						|
      /* DATETIME */ | 
						|
 | 
						|
    }, { | 
						|
      key: "parseDateTime", | 
						|
      value: function parseDateTime() { | 
						|
        // we enter here having just consumed the year and about to consume the hyphen | 
						|
        if (this.state.buf.length < 4) { | 
						|
          throw this.error(new TomlError('Years less than 1000 must be zero padded to four characters')); | 
						|
        } | 
						|
 | 
						|
        this.state.result = this.state.buf; | 
						|
        this.state.buf = ''; | 
						|
        return this.next(this.parseDateMonth); | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseDateMonth", | 
						|
      value: function parseDateMonth() { | 
						|
        if (this.char === CHAR_HYPHEN) { | 
						|
          if (this.state.buf.length < 2) { | 
						|
            throw this.error(new TomlError('Months less than 10 must be zero padded to two characters')); | 
						|
          } | 
						|
 | 
						|
          this.state.result += '-' + this.state.buf; | 
						|
          this.state.buf = ''; | 
						|
          return this.next(this.parseDateDay); | 
						|
        } else if (isDigit(this.char)) { | 
						|
          this.consume(); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Incomplete datetime')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseDateDay", | 
						|
      value: function parseDateDay() { | 
						|
        if (this.char === CHAR_T || this.char === CHAR_SP) { | 
						|
          if (this.state.buf.length < 2) { | 
						|
            throw this.error(new TomlError('Days less than 10 must be zero padded to two characters')); | 
						|
          } | 
						|
 | 
						|
          this.state.result += '-' + this.state.buf; | 
						|
          this.state.buf = ''; | 
						|
          return this.next(this.parseStartTimeHour); | 
						|
        } else if (this.atEndOfWord()) { | 
						|
          return this.return(createDate(this.state.result + '-' + this.state.buf)); | 
						|
        } else if (isDigit(this.char)) { | 
						|
          this.consume(); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Incomplete datetime')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseStartTimeHour", | 
						|
      value: function parseStartTimeHour() { | 
						|
        if (this.atEndOfWord()) { | 
						|
          return this.returnNow(createDate(this.state.result)); | 
						|
        } else { | 
						|
          return this.goto(this.parseTimeHour); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseTimeHour", | 
						|
      value: function parseTimeHour() { | 
						|
        if (this.char === CHAR_COLON) { | 
						|
          if (this.state.buf.length < 2) { | 
						|
            throw this.error(new TomlError('Hours less than 10 must be zero padded to two characters')); | 
						|
          } | 
						|
 | 
						|
          this.state.result += 'T' + this.state.buf; | 
						|
          this.state.buf = ''; | 
						|
          return this.next(this.parseTimeMin); | 
						|
        } else if (isDigit(this.char)) { | 
						|
          this.consume(); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Incomplete datetime')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseTimeMin", | 
						|
      value: function parseTimeMin() { | 
						|
        if (this.state.buf.length < 2 && isDigit(this.char)) { | 
						|
          this.consume(); | 
						|
        } else if (this.state.buf.length === 2 && this.char === CHAR_COLON) { | 
						|
          this.state.result += ':' + this.state.buf; | 
						|
          this.state.buf = ''; | 
						|
          return this.next(this.parseTimeSec); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Incomplete datetime')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseTimeSec", | 
						|
      value: function parseTimeSec() { | 
						|
        if (isDigit(this.char)) { | 
						|
          this.consume(); | 
						|
 | 
						|
          if (this.state.buf.length === 2) { | 
						|
            this.state.result += ':' + this.state.buf; | 
						|
            this.state.buf = ''; | 
						|
            return this.next(this.parseTimeZoneOrFraction); | 
						|
          } | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Incomplete datetime')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseOnlyTimeHour", | 
						|
      value: function parseOnlyTimeHour() { | 
						|
        /* istanbul ignore else */ | 
						|
        if (this.char === CHAR_COLON) { | 
						|
          if (this.state.buf.length < 2) { | 
						|
            throw this.error(new TomlError('Hours less than 10 must be zero padded to two characters')); | 
						|
          } | 
						|
 | 
						|
          this.state.result = this.state.buf; | 
						|
          this.state.buf = ''; | 
						|
          return this.next(this.parseOnlyTimeMin); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Incomplete time')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseOnlyTimeMin", | 
						|
      value: function parseOnlyTimeMin() { | 
						|
        if (this.state.buf.length < 2 && isDigit(this.char)) { | 
						|
          this.consume(); | 
						|
        } else if (this.state.buf.length === 2 && this.char === CHAR_COLON) { | 
						|
          this.state.result += ':' + this.state.buf; | 
						|
          this.state.buf = ''; | 
						|
          return this.next(this.parseOnlyTimeSec); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Incomplete time')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseOnlyTimeSec", | 
						|
      value: function parseOnlyTimeSec() { | 
						|
        if (isDigit(this.char)) { | 
						|
          this.consume(); | 
						|
 | 
						|
          if (this.state.buf.length === 2) { | 
						|
            return this.next(this.parseOnlyTimeFractionMaybe); | 
						|
          } | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Incomplete time')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseOnlyTimeFractionMaybe", | 
						|
      value: function parseOnlyTimeFractionMaybe() { | 
						|
        this.state.result += ':' + this.state.buf; | 
						|
 | 
						|
        if (this.char === CHAR_PERIOD) { | 
						|
          this.state.buf = ''; | 
						|
          this.next(this.parseOnlyTimeFraction); | 
						|
        } else { | 
						|
          return this.return(createTime(this.state.result)); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseOnlyTimeFraction", | 
						|
      value: function parseOnlyTimeFraction() { | 
						|
        if (isDigit(this.char)) { | 
						|
          this.consume(); | 
						|
        } else if (this.atEndOfWord()) { | 
						|
          if (this.state.buf.length === 0) throw this.error(new TomlError('Expected digit in milliseconds')); | 
						|
          return this.returnNow(createTime(this.state.result + '.' + this.state.buf)); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Unexpected character in datetime, expected period (.), minus (-), plus (+) or Z')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseTimeZoneOrFraction", | 
						|
      value: function parseTimeZoneOrFraction() { | 
						|
        if (this.char === CHAR_PERIOD) { | 
						|
          this.consume(); | 
						|
          this.next(this.parseDateTimeFraction); | 
						|
        } else if (this.char === CHAR_HYPHEN || this.char === CHAR_PLUS) { | 
						|
          this.consume(); | 
						|
          this.next(this.parseTimeZoneHour); | 
						|
        } else if (this.char === CHAR_Z) { | 
						|
          this.consume(); | 
						|
          return this.return(createDatetime(this.state.result + this.state.buf)); | 
						|
        } else if (this.atEndOfWord()) { | 
						|
          return this.returnNow(createDatetimeFloat(this.state.result + this.state.buf)); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Unexpected character in datetime, expected period (.), minus (-), plus (+) or Z')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseDateTimeFraction", | 
						|
      value: function parseDateTimeFraction() { | 
						|
        if (isDigit(this.char)) { | 
						|
          this.consume(); | 
						|
        } else if (this.state.buf.length === 1) { | 
						|
          throw this.error(new TomlError('Expected digit in milliseconds')); | 
						|
        } else if (this.char === CHAR_HYPHEN || this.char === CHAR_PLUS) { | 
						|
          this.consume(); | 
						|
          this.next(this.parseTimeZoneHour); | 
						|
        } else if (this.char === CHAR_Z) { | 
						|
          this.consume(); | 
						|
          return this.return(createDatetime(this.state.result + this.state.buf)); | 
						|
        } else if (this.atEndOfWord()) { | 
						|
          return this.returnNow(createDatetimeFloat(this.state.result + this.state.buf)); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Unexpected character in datetime, expected period (.), minus (-), plus (+) or Z')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseTimeZoneHour", | 
						|
      value: function parseTimeZoneHour() { | 
						|
        if (isDigit(this.char)) { | 
						|
          this.consume(); // FIXME: No more regexps | 
						|
 | 
						|
          if (/\d\d$/.test(this.state.buf)) return this.next(this.parseTimeZoneSep); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Unexpected character in datetime, expected digit')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseTimeZoneSep", | 
						|
      value: function parseTimeZoneSep() { | 
						|
        if (this.char === CHAR_COLON) { | 
						|
          this.consume(); | 
						|
          this.next(this.parseTimeZoneMin); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Unexpected character in datetime, expected colon')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseTimeZoneMin", | 
						|
      value: function parseTimeZoneMin() { | 
						|
        if (isDigit(this.char)) { | 
						|
          this.consume(); | 
						|
          if (/\d\d$/.test(this.state.buf)) return this.return(createDatetime(this.state.result + this.state.buf)); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Unexpected character in datetime, expected digit')); | 
						|
        } | 
						|
      } | 
						|
      /* BOOLEAN */ | 
						|
 | 
						|
    }, { | 
						|
      key: "parseBoolean", | 
						|
      value: function parseBoolean() { | 
						|
        /* istanbul ignore else */ | 
						|
        if (this.char === CHAR_t) { | 
						|
          this.consume(); | 
						|
          return this.next(this.parseTrue_r); | 
						|
        } else if (this.char === CHAR_f) { | 
						|
          this.consume(); | 
						|
          return this.next(this.parseFalse_a); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseTrue_r", | 
						|
      value: function parseTrue_r() { | 
						|
        if (this.char === CHAR_r) { | 
						|
          this.consume(); | 
						|
          return this.next(this.parseTrue_u); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Invalid boolean, expected true or false')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseTrue_u", | 
						|
      value: function parseTrue_u() { | 
						|
        if (this.char === CHAR_u) { | 
						|
          this.consume(); | 
						|
          return this.next(this.parseTrue_e); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Invalid boolean, expected true or false')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseTrue_e", | 
						|
      value: function parseTrue_e() { | 
						|
        if (this.char === CHAR_e) { | 
						|
          return this.return(true); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Invalid boolean, expected true or false')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseFalse_a", | 
						|
      value: function parseFalse_a() { | 
						|
        if (this.char === CHAR_a) { | 
						|
          this.consume(); | 
						|
          return this.next(this.parseFalse_l); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Invalid boolean, expected true or false')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseFalse_l", | 
						|
      value: function parseFalse_l() { | 
						|
        if (this.char === CHAR_l) { | 
						|
          this.consume(); | 
						|
          return this.next(this.parseFalse_s); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Invalid boolean, expected true or false')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseFalse_s", | 
						|
      value: function parseFalse_s() { | 
						|
        if (this.char === CHAR_s) { | 
						|
          this.consume(); | 
						|
          return this.next(this.parseFalse_e); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Invalid boolean, expected true or false')); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseFalse_e", | 
						|
      value: function parseFalse_e() { | 
						|
        if (this.char === CHAR_e) { | 
						|
          return this.return(false); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Invalid boolean, expected true or false')); | 
						|
        } | 
						|
      } | 
						|
      /* INLINE LISTS */ | 
						|
 | 
						|
    }, { | 
						|
      key: "parseInlineList", | 
						|
      value: function parseInlineList() { | 
						|
        if (this.char === CHAR_SP || this.char === CTRL_I || this.char === CTRL_M || this.char === CTRL_J) { | 
						|
          return null; | 
						|
        } else if (this.char === Parser.END) { | 
						|
          throw this.error(new TomlError('Unterminated inline array')); | 
						|
        } else if (this.char === CHAR_NUM) { | 
						|
          return this.call(this.parseComment); | 
						|
        } else if (this.char === CHAR_RSQB) { | 
						|
          return this.return(this.state.resultArr || InlineList()); | 
						|
        } else { | 
						|
          return this.callNow(this.parseValue, this.recordInlineListValue); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "recordInlineListValue", | 
						|
      value: function recordInlineListValue(value) { | 
						|
        if (this.state.resultArr) { | 
						|
          var listType = this.state.resultArr[_contentType]; | 
						|
          var valueType = tomlType(value); | 
						|
 | 
						|
          if (listType !== valueType) { | 
						|
            throw this.error(new TomlError(`Inline lists must be a single type, not a mix of ${listType} and ${valueType}`)); | 
						|
          } | 
						|
        } else { | 
						|
          this.state.resultArr = InlineList(tomlType(value)); | 
						|
        } | 
						|
 | 
						|
        if (isFloat(value) || isInteger(value)) { | 
						|
          // unbox now that we've verified they're ok | 
						|
          this.state.resultArr.push(value.valueOf()); | 
						|
        } else { | 
						|
          this.state.resultArr.push(value); | 
						|
        } | 
						|
 | 
						|
        return this.goto(this.parseInlineListNext); | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseInlineListNext", | 
						|
      value: function parseInlineListNext() { | 
						|
        if (this.char === CHAR_SP || this.char === CTRL_I || this.char === CTRL_M || this.char === CTRL_J) { | 
						|
          return null; | 
						|
        } else if (this.char === CHAR_NUM) { | 
						|
          return this.call(this.parseComment); | 
						|
        } else if (this.char === CHAR_COMMA) { | 
						|
          return this.next(this.parseInlineList); | 
						|
        } else if (this.char === CHAR_RSQB) { | 
						|
          return this.goto(this.parseInlineList); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Invalid character, expected whitespace, comma (,) or close bracket (])')); | 
						|
        } | 
						|
      } | 
						|
      /* INLINE TABLE */ | 
						|
 | 
						|
    }, { | 
						|
      key: "parseInlineTable", | 
						|
      value: function parseInlineTable() { | 
						|
        if (this.char === CHAR_SP || this.char === CTRL_I) { | 
						|
          return null; | 
						|
        } else if (this.char === Parser.END || this.char === CHAR_NUM || this.char === CTRL_J || this.char === CTRL_M) { | 
						|
          throw this.error(new TomlError('Unterminated inline array')); | 
						|
        } else if (this.char === CHAR_RCUB) { | 
						|
          return this.return(this.state.resultTable || InlineTable()); | 
						|
        } else { | 
						|
          if (!this.state.resultTable) this.state.resultTable = InlineTable(); | 
						|
          return this.callNow(this.parseAssign, this.recordInlineTableValue); | 
						|
        } | 
						|
      } | 
						|
    }, { | 
						|
      key: "recordInlineTableValue", | 
						|
      value: function recordInlineTableValue(kv) { | 
						|
        var target = this.state.resultTable; | 
						|
        var finalKey = kv.key.pop(); | 
						|
        var _iteratorNormalCompletion2 = true; | 
						|
        var _didIteratorError2 = false; | 
						|
        var _iteratorError2 = undefined; | 
						|
 | 
						|
        try { | 
						|
          for (var _iterator2 = kv.key[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { | 
						|
            var kw = _step2.value; | 
						|
 | 
						|
            if (hasKey(target, kw) && (!isTable(target[kw]) || target[kw][_declared])) { | 
						|
              throw this.error(new TomlError("Can't redefine existing key")); | 
						|
            } | 
						|
 | 
						|
            target = target[kw] = target[kw] || Table(); | 
						|
          } | 
						|
        } catch (err) { | 
						|
          _didIteratorError2 = true; | 
						|
          _iteratorError2 = err; | 
						|
        } finally { | 
						|
          try { | 
						|
            if (!_iteratorNormalCompletion2 && _iterator2.return != null) { | 
						|
              _iterator2.return(); | 
						|
            } | 
						|
          } finally { | 
						|
            if (_didIteratorError2) { | 
						|
              throw _iteratorError2; | 
						|
            } | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        if (hasKey(target, finalKey)) { | 
						|
          throw this.error(new TomlError("Can't redefine existing key")); | 
						|
        } | 
						|
 | 
						|
        if (isInteger(kv.value) || isFloat(kv.value)) { | 
						|
          target[finalKey] = kv.value.valueOf(); | 
						|
        } else { | 
						|
          target[finalKey] = kv.value; | 
						|
        } | 
						|
 | 
						|
        return this.goto(this.parseInlineTableNext); | 
						|
      } | 
						|
    }, { | 
						|
      key: "parseInlineTableNext", | 
						|
      value: function parseInlineTableNext() { | 
						|
        if (this.char === CHAR_SP || this.char === CTRL_I) { | 
						|
          return null; | 
						|
        } else if (this.char === Parser.END || this.char === CHAR_NUM || this.char === CTRL_J || this.char === CTRL_M) { | 
						|
          throw this.error(new TomlError('Unterminated inline array')); | 
						|
        } else if (this.char === CHAR_COMMA) { | 
						|
          return this.next(this.parseInlineTable); | 
						|
        } else if (this.char === CHAR_RCUB) { | 
						|
          return this.goto(this.parseInlineTable); | 
						|
        } else { | 
						|
          throw this.error(new TomlError('Invalid character, expected whitespace, comma (,) or close bracket (])')); | 
						|
        } | 
						|
      } | 
						|
    }]); | 
						|
 | 
						|
    return TOMLParser; | 
						|
  }(Parser); | 
						|
 | 
						|
  return TOMLParser; | 
						|
} | 
						|
tomlParser.makeParserClass = makeParserClass_1; | 
						|
tomlParser.TomlError = TomlError_1; | 
						|
 | 
						|
var parsePrettyError = prettyError; | 
						|
 | 
						|
function prettyError(err, buf) { | 
						|
  /* istanbul ignore if */ | 
						|
  if (err.pos == null || err.line == null) return err; | 
						|
  var msg = err.message; | 
						|
  msg += ` at row ${err.line + 1}, col ${err.col + 1}, pos ${err.pos}:\n`; | 
						|
  /* istanbul ignore else */ | 
						|
 | 
						|
  if (buf && buf.split) { | 
						|
    var lines = buf.split(/\n/); | 
						|
    var lineNumWidth = String(Math.min(lines.length, err.line + 3)).length; | 
						|
    var linePadding = ' '; | 
						|
 | 
						|
    while (linePadding.length < lineNumWidth) { | 
						|
      linePadding += ' '; | 
						|
    } | 
						|
 | 
						|
    for (var ii = Math.max(0, err.line - 1); ii < Math.min(lines.length, err.line + 2); ++ii) { | 
						|
      var lineNum = String(ii + 1); | 
						|
      if (lineNum.length < lineNumWidth) lineNum = ' ' + lineNum; | 
						|
 | 
						|
      if (err.line === ii) { | 
						|
        msg += lineNum + '> ' + lines[ii] + '\n'; | 
						|
        msg += linePadding + '  '; | 
						|
 | 
						|
        for (var hh = 0; hh < err.col; ++hh) { | 
						|
          msg += ' '; | 
						|
        } | 
						|
 | 
						|
        msg += '^\n'; | 
						|
      } else { | 
						|
        msg += lineNum + ': ' + lines[ii] + '\n'; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  err.message = msg + '\n'; | 
						|
  return err; | 
						|
} | 
						|
 | 
						|
var parseString_1 = parseString; | 
						|
 | 
						|
function parseString(str) { | 
						|
  if (global.Buffer && global.Buffer.isBuffer(str)) { | 
						|
    str = str.toString('utf8'); | 
						|
  } | 
						|
 | 
						|
  var parser = new tomlParser(); | 
						|
 | 
						|
  try { | 
						|
    parser.parse(str); | 
						|
    return parser.finish(); | 
						|
  } catch (err) { | 
						|
    throw parsePrettyError(err, str); | 
						|
  } | 
						|
} | 
						|
 | 
						|
var loadToml = function loadToml(filePath, content) { | 
						|
  try { | 
						|
    return parseString_1(content); | 
						|
  } catch (error) { | 
						|
    error.message = `TOML Error in ${filePath}:\n${error.message}`; | 
						|
    throw error; | 
						|
  } | 
						|
}; | 
						|
 | 
						|
var getExplorerMemoized = mem_1(function (opts) { | 
						|
  var explorer = thirdParty.cosmiconfig("prettier", { | 
						|
    cache: opts.cache, | 
						|
    transform: function transform(result) { | 
						|
      if (result && result.config) { | 
						|
        if (typeof result.config === "string") { | 
						|
          var modulePath = resolve.sync(result.config, { | 
						|
            basedir: path$2.dirname(result.filepath) | 
						|
          }); | 
						|
          result.config = require(modulePath); | 
						|
        } | 
						|
 | 
						|
        if (typeof result.config !== "object") { | 
						|
          throw new Error(`Config is only allowed to be an object, ` + `but received ${typeof result.config} in "${result.filepath}"`); | 
						|
        } | 
						|
 | 
						|
        delete result.config.$schema; | 
						|
      } | 
						|
 | 
						|
      return result; | 
						|
    }, | 
						|
    searchPlaces: ["package.json", ".prettierrc", ".prettierrc.json", ".prettierrc.yaml", ".prettierrc.yml", ".prettierrc.js", "prettier.config.js", ".prettierrc.toml"], | 
						|
    loaders: { | 
						|
      ".toml": loadToml | 
						|
    } | 
						|
  }); | 
						|
 | 
						|
  var _load = opts.sync ? explorer.loadSync : explorer.load; | 
						|
 | 
						|
  var search = opts.sync ? explorer.searchSync : explorer.search; | 
						|
  return { | 
						|
    // cosmiconfig v4 interface | 
						|
    load: function load(searchPath, configPath) { | 
						|
      return configPath ? _load(configPath) : search(searchPath); | 
						|
    } | 
						|
  }; | 
						|
}); | 
						|
/** @param {{ cache: boolean, sync: boolean }} opts */ | 
						|
 | 
						|
function getLoadFunction$1(opts) { | 
						|
  // Normalize opts before passing to a memoized function | 
						|
  opts = Object.assign({ | 
						|
    sync: false, | 
						|
    cache: false | 
						|
  }, opts); | 
						|
  return getExplorerMemoized(opts).load; | 
						|
} | 
						|
 | 
						|
function _resolveConfig(filePath, opts, sync) { | 
						|
  opts = Object.assign({ | 
						|
    useCache: true | 
						|
  }, opts); | 
						|
  var loadOpts = { | 
						|
    cache: !!opts.useCache, | 
						|
    sync: !!sync, | 
						|
    editorconfig: !!opts.editorconfig | 
						|
  }; | 
						|
  var load = getLoadFunction$1(loadOpts); | 
						|
  var loadEditorConfig = resolveConfigEditorconfig.getLoadFunction(loadOpts); | 
						|
  var arr = [load, loadEditorConfig].map(function (l) { | 
						|
    return l(filePath, opts.config); | 
						|
  }); | 
						|
 | 
						|
  var unwrapAndMerge = function unwrapAndMerge(arr) { | 
						|
    var result = arr[0]; | 
						|
    var editorConfigured = arr[1]; | 
						|
    var merged = Object.assign({}, editorConfigured, mergeOverrides(Object.assign({}, result), filePath)); | 
						|
    ["plugins", "pluginSearchDirs"].forEach(function (optionName) { | 
						|
      if (Array.isArray(merged[optionName])) { | 
						|
        merged[optionName] = merged[optionName].map(function (value) { | 
						|
          return typeof value === "string" && value.startsWith(".") // relative path | 
						|
          ? path$2.resolve(path$2.dirname(result.filepath), value) : value; | 
						|
        }); | 
						|
      } | 
						|
    }); | 
						|
 | 
						|
    if (!result && !editorConfigured) { | 
						|
      return null; | 
						|
    } | 
						|
 | 
						|
    return merged; | 
						|
  }; | 
						|
 | 
						|
  if (loadOpts.sync) { | 
						|
    return unwrapAndMerge(arr); | 
						|
  } | 
						|
 | 
						|
  return Promise.all(arr).then(unwrapAndMerge); | 
						|
} | 
						|
 | 
						|
var resolveConfig = function resolveConfig(filePath, opts) { | 
						|
  return _resolveConfig(filePath, opts, false); | 
						|
}; | 
						|
 | 
						|
resolveConfig.sync = function (filePath, opts) { | 
						|
  return _resolveConfig(filePath, opts, true); | 
						|
}; | 
						|
 | 
						|
function clearCache$1() { | 
						|
  mem_1.clear(getExplorerMemoized); | 
						|
  resolveConfigEditorconfig.clearCache(); | 
						|
} | 
						|
 | 
						|
function resolveConfigFile(filePath) { | 
						|
  var load = getLoadFunction$1({ | 
						|
    sync: false | 
						|
  }); | 
						|
  return load(filePath).then(function (result) { | 
						|
    return result ? result.filepath : null; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
resolveConfigFile.sync = function (filePath) { | 
						|
  var load = getLoadFunction$1({ | 
						|
    sync: true | 
						|
  }); | 
						|
  var result = load(filePath); | 
						|
  return result ? result.filepath : null; | 
						|
}; | 
						|
 | 
						|
function mergeOverrides(configResult, filePath) { | 
						|
  var options = Object.assign({}, configResult.config); | 
						|
 | 
						|
  if (filePath && options.overrides) { | 
						|
    var relativeFilePath = path$2.relative(path$2.dirname(configResult.filepath), filePath); | 
						|
    var _iteratorNormalCompletion = true; | 
						|
    var _didIteratorError = false; | 
						|
    var _iteratorError = undefined; | 
						|
 | 
						|
    try { | 
						|
      for (var _iterator = options.overrides[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | 
						|
        var override = _step.value; | 
						|
 | 
						|
        if (pathMatchesGlobs(relativeFilePath, override.files, override.excludeFiles)) { | 
						|
          Object.assign(options, override.options); | 
						|
        } | 
						|
      } | 
						|
    } catch (err) { | 
						|
      _didIteratorError = true; | 
						|
      _iteratorError = err; | 
						|
    } finally { | 
						|
      try { | 
						|
        if (!_iteratorNormalCompletion && _iterator.return != null) { | 
						|
          _iterator.return(); | 
						|
        } | 
						|
      } finally { | 
						|
        if (_didIteratorError) { | 
						|
          throw _iteratorError; | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  delete options.overrides; | 
						|
  return options; | 
						|
} // Based on eslint: https://github.com/eslint/eslint/blob/master/lib/config/config-ops.js | 
						|
 | 
						|
 | 
						|
function pathMatchesGlobs(filePath, patterns, excludedPatterns) { | 
						|
  var patternList = [].concat(patterns); | 
						|
  var excludedPatternList = [].concat(excludedPatterns || []); | 
						|
  var opts = { | 
						|
    matchBase: true, | 
						|
    dot: true | 
						|
  }; | 
						|
  return patternList.some(function (pattern) { | 
						|
    return minimatch_1(filePath, pattern, opts); | 
						|
  }) && !excludedPatternList.some(function (excludedPattern) { | 
						|
    return minimatch_1(filePath, excludedPattern, opts); | 
						|
  }); | 
						|
} | 
						|
 | 
						|
var resolveConfig_1 = { | 
						|
  resolveConfig, | 
						|
  resolveConfigFile, | 
						|
  clearCache: clearCache$1 | 
						|
}; | 
						|
 | 
						|
/** | 
						|
 * @typedef {{ ignorePath?: string, withNodeModules?: boolean, plugins: object }} FileInfoOptions | 
						|
 * @typedef {{ ignored: boolean, inferredParser: string | null }} FileInfoResult | 
						|
 */ | 
						|
 | 
						|
/** | 
						|
 * @param {string} filePath | 
						|
 * @param {FileInfoOptions} opts | 
						|
 * @returns {Promise<FileInfoResult>} | 
						|
 * | 
						|
 * Please note that prettier.getFileInfo() expects opts.plugins to be an array of paths, | 
						|
 * not an object. A transformation from this array to an object is automatically done | 
						|
 * internally by the method wrapper. See withPlugins() in index.js. | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function getFileInfo(filePath, opts) { | 
						|
  if (typeof filePath !== "string") { | 
						|
    return Promise.reject(new TypeError(`expect \`filePath\` to be a string, got \`${typeof filePath}\``)); | 
						|
  } | 
						|
 | 
						|
  return createIgnorer_1(opts.ignorePath, opts.withNodeModules).then(function (ignorer) { | 
						|
    return _getFileInfo({ | 
						|
      ignorer, | 
						|
      filePath: normalizeFilePath(filePath, opts.ignorePath), | 
						|
      plugins: opts.plugins, | 
						|
      resolveConfig: opts.resolveConfig, | 
						|
      sync: false | 
						|
    }); | 
						|
  }); | 
						|
} | 
						|
/** | 
						|
 * @param {string} filePath | 
						|
 * @param {FileInfoOptions} opts | 
						|
 * @returns {FileInfoResult} | 
						|
 */ | 
						|
 | 
						|
 | 
						|
getFileInfo.sync = function (filePath, opts) { | 
						|
  if (typeof filePath !== "string") { | 
						|
    throw new TypeError(`expect \`filePath\` to be a string, got \`${typeof filePath}\``); | 
						|
  } | 
						|
 | 
						|
  var ignorer = createIgnorer_1.sync(opts.ignorePath, opts.withNodeModules); | 
						|
  return _getFileInfo({ | 
						|
    ignorer, | 
						|
    filePath: normalizeFilePath(filePath, opts.ignorePath), | 
						|
    plugins: opts.plugins, | 
						|
    resolveConfig: opts.resolveConfig, | 
						|
    sync: true | 
						|
  }); | 
						|
}; | 
						|
 | 
						|
function _getFileInfo(_ref) { | 
						|
  var ignorer = _ref.ignorer, | 
						|
      filePath = _ref.filePath, | 
						|
      plugins = _ref.plugins, | 
						|
      _ref$resolveConfig = _ref.resolveConfig, | 
						|
      resolveConfig = _ref$resolveConfig === void 0 ? false : _ref$resolveConfig, | 
						|
      _ref$sync = _ref.sync, | 
						|
      sync = _ref$sync === void 0 ? false : _ref$sync; | 
						|
  var fileInfo = { | 
						|
    ignored: ignorer.ignores(filePath), | 
						|
    inferredParser: options$1.inferParser(filePath, plugins) || null | 
						|
  }; | 
						|
 | 
						|
  if (!fileInfo.inferredParser && resolveConfig) { | 
						|
    if (!sync) { | 
						|
      return resolveConfig_1.resolveConfig(filePath).then(function (resolvedConfig) { | 
						|
        if (resolvedConfig && resolvedConfig.parser) { | 
						|
          fileInfo.inferredParser = resolvedConfig.parser; | 
						|
        } | 
						|
 | 
						|
        return fileInfo; | 
						|
      }); | 
						|
    } | 
						|
 | 
						|
    var resolvedConfig = resolveConfig_1.resolveConfig.sync(filePath); | 
						|
 | 
						|
    if (resolvedConfig && resolvedConfig.parser) { | 
						|
      fileInfo.inferredParser = resolvedConfig.parser; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return fileInfo; | 
						|
} | 
						|
 | 
						|
function normalizeFilePath(filePath, ignorePath) { | 
						|
  return ignorePath ? path$2.relative(path$2.dirname(ignorePath), filePath) : filePath; | 
						|
} | 
						|
 | 
						|
var getFileInfo_1 = getFileInfo; | 
						|
 | 
						|
var lodash_uniqby = createCommonjsModule(function (module, exports) { | 
						|
  /** | 
						|
   * lodash (Custom Build) <https://lodash.com/> | 
						|
   * Build: `lodash modularize exports="npm" -o ./` | 
						|
   * Copyright jQuery Foundation and other contributors <https://jquery.org/> | 
						|
   * Released under MIT license <https://lodash.com/license> | 
						|
   * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> | 
						|
   * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors | 
						|
   */ | 
						|
 | 
						|
  /** Used as the size to enable large array optimizations. */ | 
						|
  var LARGE_ARRAY_SIZE = 200; | 
						|
  /** Used as the `TypeError` message for "Functions" methods. */ | 
						|
 | 
						|
  var FUNC_ERROR_TEXT = 'Expected a function'; | 
						|
  /** Used to stand-in for `undefined` hash values. */ | 
						|
 | 
						|
  var HASH_UNDEFINED = '__lodash_hash_undefined__'; | 
						|
  /** Used to compose bitmasks for comparison styles. */ | 
						|
 | 
						|
  var UNORDERED_COMPARE_FLAG = 1, | 
						|
      PARTIAL_COMPARE_FLAG = 2; | 
						|
  /** Used as references for various `Number` constants. */ | 
						|
 | 
						|
  var INFINITY = 1 / 0, | 
						|
      MAX_SAFE_INTEGER = 9007199254740991; | 
						|
  /** `Object#toString` result references. */ | 
						|
 | 
						|
  var argsTag = '[object Arguments]', | 
						|
      arrayTag = '[object Array]', | 
						|
      boolTag = '[object Boolean]', | 
						|
      dateTag = '[object Date]', | 
						|
      errorTag = '[object Error]', | 
						|
      funcTag = '[object Function]', | 
						|
      genTag = '[object GeneratorFunction]', | 
						|
      mapTag = '[object Map]', | 
						|
      numberTag = '[object Number]', | 
						|
      objectTag = '[object Object]', | 
						|
      promiseTag = '[object Promise]', | 
						|
      regexpTag = '[object RegExp]', | 
						|
      setTag = '[object Set]', | 
						|
      stringTag = '[object String]', | 
						|
      symbolTag = '[object Symbol]', | 
						|
      weakMapTag = '[object WeakMap]'; | 
						|
  var arrayBufferTag = '[object ArrayBuffer]', | 
						|
      dataViewTag = '[object DataView]', | 
						|
      float32Tag = '[object Float32Array]', | 
						|
      float64Tag = '[object Float64Array]', | 
						|
      int8Tag = '[object Int8Array]', | 
						|
      int16Tag = '[object Int16Array]', | 
						|
      int32Tag = '[object Int32Array]', | 
						|
      uint8Tag = '[object Uint8Array]', | 
						|
      uint8ClampedTag = '[object Uint8ClampedArray]', | 
						|
      uint16Tag = '[object Uint16Array]', | 
						|
      uint32Tag = '[object Uint32Array]'; | 
						|
  /** Used to match property names within property paths. */ | 
						|
 | 
						|
  var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, | 
						|
      reIsPlainProp = /^\w*$/, | 
						|
      reLeadingDot = /^\./, | 
						|
      rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; | 
						|
  /** | 
						|
   * Used to match `RegExp` | 
						|
   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). | 
						|
   */ | 
						|
 | 
						|
  var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; | 
						|
  /** Used to match backslashes in property paths. */ | 
						|
 | 
						|
  var reEscapeChar = /\\(\\)?/g; | 
						|
  /** Used to detect host constructors (Safari). */ | 
						|
 | 
						|
  var reIsHostCtor = /^\[object .+?Constructor\]$/; | 
						|
  /** Used to detect unsigned integer values. */ | 
						|
 | 
						|
  var reIsUint = /^(?:0|[1-9]\d*)$/; | 
						|
  /** Used to identify `toStringTag` values of typed arrays. */ | 
						|
 | 
						|
  var typedArrayTags = {}; | 
						|
  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true; | 
						|
  typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; | 
						|
  /** Detect free variable `global` from Node.js. */ | 
						|
 | 
						|
  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; | 
						|
  /** Detect free variable `self`. */ | 
						|
 | 
						|
  var freeSelf = typeof self == 'object' && self && self.Object === Object && self; | 
						|
  /** Used as a reference to the global object. */ | 
						|
 | 
						|
  var root = freeGlobal || freeSelf || Function('return this')(); | 
						|
  /** Detect free variable `exports`. */ | 
						|
 | 
						|
  var freeExports =  exports && !exports.nodeType && exports; | 
						|
  /** Detect free variable `module`. */ | 
						|
 | 
						|
  var freeModule = freeExports && 'object' == 'object' && module && !module.nodeType && module; | 
						|
  /** Detect the popular CommonJS extension `module.exports`. */ | 
						|
 | 
						|
  var moduleExports = freeModule && freeModule.exports === freeExports; | 
						|
  /** Detect free variable `process` from Node.js. */ | 
						|
 | 
						|
  var freeProcess = moduleExports && freeGlobal.process; | 
						|
  /** Used to access faster Node.js helpers. */ | 
						|
 | 
						|
  var nodeUtil = function () { | 
						|
    try { | 
						|
      return freeProcess && freeProcess.binding('util'); | 
						|
    } catch (e) {} | 
						|
  }(); | 
						|
  /* Node.js helper references. */ | 
						|
 | 
						|
 | 
						|
  var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; | 
						|
  /** | 
						|
   * A specialized version of `_.includes` for arrays without support for | 
						|
   * specifying an index to search from. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Array} [array] The array to inspect. | 
						|
   * @param {*} target The value to search for. | 
						|
   * @returns {boolean} Returns `true` if `target` is found, else `false`. | 
						|
   */ | 
						|
 | 
						|
  function arrayIncludes(array, value) { | 
						|
    var length = array ? array.length : 0; | 
						|
    return !!length && baseIndexOf(array, value, 0) > -1; | 
						|
  } | 
						|
  /** | 
						|
   * This function is like `arrayIncludes` except that it accepts a comparator. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Array} [array] The array to inspect. | 
						|
   * @param {*} target The value to search for. | 
						|
   * @param {Function} comparator The comparator invoked per element. | 
						|
   * @returns {boolean} Returns `true` if `target` is found, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function arrayIncludesWith(array, value, comparator) { | 
						|
    var index = -1, | 
						|
        length = array ? array.length : 0; | 
						|
 | 
						|
    while (++index < length) { | 
						|
      if (comparator(value, array[index])) { | 
						|
        return true; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return false; | 
						|
  } | 
						|
  /** | 
						|
   * A specialized version of `_.some` for arrays without support for iteratee | 
						|
   * shorthands. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Array} [array] The array to iterate over. | 
						|
   * @param {Function} predicate The function invoked per iteration. | 
						|
   * @returns {boolean} Returns `true` if any element passes the predicate check, | 
						|
   *  else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function arraySome(array, predicate) { | 
						|
    var index = -1, | 
						|
        length = array ? array.length : 0; | 
						|
 | 
						|
    while (++index < length) { | 
						|
      if (predicate(array[index], index, array)) { | 
						|
        return true; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return false; | 
						|
  } | 
						|
  /** | 
						|
   * The base implementation of `_.findIndex` and `_.findLastIndex` without | 
						|
   * support for iteratee shorthands. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Array} array The array to inspect. | 
						|
   * @param {Function} predicate The function invoked per iteration. | 
						|
   * @param {number} fromIndex The index to search from. | 
						|
   * @param {boolean} [fromRight] Specify iterating from right to left. | 
						|
   * @returns {number} Returns the index of the matched value, else `-1`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function baseFindIndex(array, predicate, fromIndex, fromRight) { | 
						|
    var length = array.length, | 
						|
        index = fromIndex + (fromRight ? 1 : -1); | 
						|
 | 
						|
    while (fromRight ? index-- : ++index < length) { | 
						|
      if (predicate(array[index], index, array)) { | 
						|
        return index; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return -1; | 
						|
  } | 
						|
  /** | 
						|
   * The base implementation of `_.indexOf` without `fromIndex` bounds checks. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Array} array The array to inspect. | 
						|
   * @param {*} value The value to search for. | 
						|
   * @param {number} fromIndex The index to search from. | 
						|
   * @returns {number} Returns the index of the matched value, else `-1`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function baseIndexOf(array, value, fromIndex) { | 
						|
    if (value !== value) { | 
						|
      return baseFindIndex(array, baseIsNaN, fromIndex); | 
						|
    } | 
						|
 | 
						|
    var index = fromIndex - 1, | 
						|
        length = array.length; | 
						|
 | 
						|
    while (++index < length) { | 
						|
      if (array[index] === value) { | 
						|
        return index; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return -1; | 
						|
  } | 
						|
  /** | 
						|
   * The base implementation of `_.isNaN` without support for number objects. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {*} value The value to check. | 
						|
   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function baseIsNaN(value) { | 
						|
    return value !== value; | 
						|
  } | 
						|
  /** | 
						|
   * The base implementation of `_.property` without support for deep paths. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {string} key The key of the property to get. | 
						|
   * @returns {Function} Returns the new accessor function. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function baseProperty(key) { | 
						|
    return function (object) { | 
						|
      return object == null ? undefined : object[key]; | 
						|
    }; | 
						|
  } | 
						|
  /** | 
						|
   * The base implementation of `_.times` without support for iteratee shorthands | 
						|
   * or max array length checks. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {number} n The number of times to invoke `iteratee`. | 
						|
   * @param {Function} iteratee The function invoked per iteration. | 
						|
   * @returns {Array} Returns the array of results. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function baseTimes(n, iteratee) { | 
						|
    var index = -1, | 
						|
        result = Array(n); | 
						|
 | 
						|
    while (++index < n) { | 
						|
      result[index] = iteratee(index); | 
						|
    } | 
						|
 | 
						|
    return result; | 
						|
  } | 
						|
  /** | 
						|
   * The base implementation of `_.unary` without support for storing metadata. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Function} func The function to cap arguments for. | 
						|
   * @returns {Function} Returns the new capped function. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function baseUnary(func) { | 
						|
    return function (value) { | 
						|
      return func(value); | 
						|
    }; | 
						|
  } | 
						|
  /** | 
						|
   * Checks if a cache value for `key` exists. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Object} cache The cache to query. | 
						|
   * @param {string} key The key of the entry to check. | 
						|
   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function cacheHas(cache, key) { | 
						|
    return cache.has(key); | 
						|
  } | 
						|
  /** | 
						|
   * Gets the value at `key` of `object`. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Object} [object] The object to query. | 
						|
   * @param {string} key The key of the property to get. | 
						|
   * @returns {*} Returns the property value. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function getValue(object, key) { | 
						|
    return object == null ? undefined : object[key]; | 
						|
  } | 
						|
  /** | 
						|
   * Checks if `value` is a host object in IE < 9. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {*} value The value to check. | 
						|
   * @returns {boolean} Returns `true` if `value` is a host object, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function isHostObject(value) { | 
						|
    // Many host objects are `Object` objects that can coerce to strings | 
						|
    // despite having improperly defined `toString` methods. | 
						|
    var result = false; | 
						|
 | 
						|
    if (value != null && typeof value.toString != 'function') { | 
						|
      try { | 
						|
        result = !!(value + ''); | 
						|
      } catch (e) {} | 
						|
    } | 
						|
 | 
						|
    return result; | 
						|
  } | 
						|
  /** | 
						|
   * Converts `map` to its key-value pairs. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Object} map The map to convert. | 
						|
   * @returns {Array} Returns the key-value pairs. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function mapToArray(map) { | 
						|
    var index = -1, | 
						|
        result = Array(map.size); | 
						|
    map.forEach(function (value, key) { | 
						|
      result[++index] = [key, value]; | 
						|
    }); | 
						|
    return result; | 
						|
  } | 
						|
  /** | 
						|
   * Creates a unary function that invokes `func` with its argument transformed. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Function} func The function to wrap. | 
						|
   * @param {Function} transform The argument transform. | 
						|
   * @returns {Function} Returns the new function. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function overArg(func, transform) { | 
						|
    return function (arg) { | 
						|
      return func(transform(arg)); | 
						|
    }; | 
						|
  } | 
						|
  /** | 
						|
   * Converts `set` to an array of its values. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Object} set The set to convert. | 
						|
   * @returns {Array} Returns the values. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function setToArray(set) { | 
						|
    var index = -1, | 
						|
        result = Array(set.size); | 
						|
    set.forEach(function (value) { | 
						|
      result[++index] = value; | 
						|
    }); | 
						|
    return result; | 
						|
  } | 
						|
  /** Used for built-in method references. */ | 
						|
 | 
						|
 | 
						|
  var arrayProto = Array.prototype, | 
						|
      funcProto = Function.prototype, | 
						|
      objectProto = Object.prototype; | 
						|
  /** Used to detect overreaching core-js shims. */ | 
						|
 | 
						|
  var coreJsData = root['__core-js_shared__']; | 
						|
  /** Used to detect methods masquerading as native. */ | 
						|
 | 
						|
  var maskSrcKey = function () { | 
						|
    var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); | 
						|
    return uid ? 'Symbol(src)_1.' + uid : ''; | 
						|
  }(); | 
						|
  /** Used to resolve the decompiled source of functions. */ | 
						|
 | 
						|
 | 
						|
  var funcToString = funcProto.toString; | 
						|
  /** Used to check objects for own properties. */ | 
						|
 | 
						|
  var hasOwnProperty = objectProto.hasOwnProperty; | 
						|
  /** | 
						|
   * Used to resolve the | 
						|
   * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) | 
						|
   * of values. | 
						|
   */ | 
						|
 | 
						|
  var objectToString = objectProto.toString; | 
						|
  /** Used to detect if a method is native. */ | 
						|
 | 
						|
  var reIsNative = RegExp('^' + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&').replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'); | 
						|
  /** Built-in value references. */ | 
						|
 | 
						|
  var Symbol = root.Symbol, | 
						|
      Uint8Array = root.Uint8Array, | 
						|
      propertyIsEnumerable = objectProto.propertyIsEnumerable, | 
						|
      splice = arrayProto.splice; | 
						|
  /* Built-in method references for those with the same name as other `lodash` methods. */ | 
						|
 | 
						|
  var nativeKeys = overArg(Object.keys, Object); | 
						|
  /* Built-in method references that are verified to be native. */ | 
						|
 | 
						|
  var DataView = getNative(root, 'DataView'), | 
						|
      Map = getNative(root, 'Map'), | 
						|
      Promise = getNative(root, 'Promise'), | 
						|
      Set = getNative(root, 'Set'), | 
						|
      WeakMap = getNative(root, 'WeakMap'), | 
						|
      nativeCreate = getNative(Object, 'create'); | 
						|
  /** Used to detect maps, sets, and weakmaps. */ | 
						|
 | 
						|
  var dataViewCtorString = toSource(DataView), | 
						|
      mapCtorString = toSource(Map), | 
						|
      promiseCtorString = toSource(Promise), | 
						|
      setCtorString = toSource(Set), | 
						|
      weakMapCtorString = toSource(WeakMap); | 
						|
  /** Used to convert symbols to primitives and strings. */ | 
						|
 | 
						|
  var symbolProto = Symbol ? Symbol.prototype : undefined, | 
						|
      symbolValueOf = symbolProto ? symbolProto.valueOf : undefined, | 
						|
      symbolToString = symbolProto ? symbolProto.toString : undefined; | 
						|
  /** | 
						|
   * Creates a hash object. | 
						|
   * | 
						|
   * @private | 
						|
   * @constructor | 
						|
   * @param {Array} [entries] The key-value pairs to cache. | 
						|
   */ | 
						|
 | 
						|
  function Hash(entries) { | 
						|
    var index = -1, | 
						|
        length = entries ? entries.length : 0; | 
						|
    this.clear(); | 
						|
 | 
						|
    while (++index < length) { | 
						|
      var entry = entries[index]; | 
						|
      this.set(entry[0], entry[1]); | 
						|
    } | 
						|
  } | 
						|
  /** | 
						|
   * Removes all key-value entries from the hash. | 
						|
   * | 
						|
   * @private | 
						|
   * @name clear | 
						|
   * @memberOf Hash | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function hashClear() { | 
						|
    this.__data__ = nativeCreate ? nativeCreate(null) : {}; | 
						|
  } | 
						|
  /** | 
						|
   * Removes `key` and its value from the hash. | 
						|
   * | 
						|
   * @private | 
						|
   * @name delete | 
						|
   * @memberOf Hash | 
						|
   * @param {Object} hash The hash to modify. | 
						|
   * @param {string} key The key of the value to remove. | 
						|
   * @returns {boolean} Returns `true` if the entry was removed, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function hashDelete(key) { | 
						|
    return this.has(key) && delete this.__data__[key]; | 
						|
  } | 
						|
  /** | 
						|
   * Gets the hash value for `key`. | 
						|
   * | 
						|
   * @private | 
						|
   * @name get | 
						|
   * @memberOf Hash | 
						|
   * @param {string} key The key of the value to get. | 
						|
   * @returns {*} Returns the entry value. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function hashGet(key) { | 
						|
    var data = this.__data__; | 
						|
 | 
						|
    if (nativeCreate) { | 
						|
      var result = data[key]; | 
						|
      return result === HASH_UNDEFINED ? undefined : result; | 
						|
    } | 
						|
 | 
						|
    return hasOwnProperty.call(data, key) ? data[key] : undefined; | 
						|
  } | 
						|
  /** | 
						|
   * Checks if a hash value for `key` exists. | 
						|
   * | 
						|
   * @private | 
						|
   * @name has | 
						|
   * @memberOf Hash | 
						|
   * @param {string} key The key of the entry to check. | 
						|
   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function hashHas(key) { | 
						|
    var data = this.__data__; | 
						|
    return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key); | 
						|
  } | 
						|
  /** | 
						|
   * Sets the hash `key` to `value`. | 
						|
   * | 
						|
   * @private | 
						|
   * @name set | 
						|
   * @memberOf Hash | 
						|
   * @param {string} key The key of the value to set. | 
						|
   * @param {*} value The value to set. | 
						|
   * @returns {Object} Returns the hash instance. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function hashSet(key, value) { | 
						|
    var data = this.__data__; | 
						|
    data[key] = nativeCreate && value === undefined ? HASH_UNDEFINED : value; | 
						|
    return this; | 
						|
  } // Add methods to `Hash`. | 
						|
 | 
						|
 | 
						|
  Hash.prototype.clear = hashClear; | 
						|
  Hash.prototype['delete'] = hashDelete; | 
						|
  Hash.prototype.get = hashGet; | 
						|
  Hash.prototype.has = hashHas; | 
						|
  Hash.prototype.set = hashSet; | 
						|
  /** | 
						|
   * Creates an list cache object. | 
						|
   * | 
						|
   * @private | 
						|
   * @constructor | 
						|
   * @param {Array} [entries] The key-value pairs to cache. | 
						|
   */ | 
						|
 | 
						|
  function ListCache(entries) { | 
						|
    var index = -1, | 
						|
        length = entries ? entries.length : 0; | 
						|
    this.clear(); | 
						|
 | 
						|
    while (++index < length) { | 
						|
      var entry = entries[index]; | 
						|
      this.set(entry[0], entry[1]); | 
						|
    } | 
						|
  } | 
						|
  /** | 
						|
   * Removes all key-value entries from the list cache. | 
						|
   * | 
						|
   * @private | 
						|
   * @name clear | 
						|
   * @memberOf ListCache | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function listCacheClear() { | 
						|
    this.__data__ = []; | 
						|
  } | 
						|
  /** | 
						|
   * Removes `key` and its value from the list cache. | 
						|
   * | 
						|
   * @private | 
						|
   * @name delete | 
						|
   * @memberOf ListCache | 
						|
   * @param {string} key The key of the value to remove. | 
						|
   * @returns {boolean} Returns `true` if the entry was removed, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function listCacheDelete(key) { | 
						|
    var data = this.__data__, | 
						|
        index = assocIndexOf(data, key); | 
						|
 | 
						|
    if (index < 0) { | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    var lastIndex = data.length - 1; | 
						|
 | 
						|
    if (index == lastIndex) { | 
						|
      data.pop(); | 
						|
    } else { | 
						|
      splice.call(data, index, 1); | 
						|
    } | 
						|
 | 
						|
    return true; | 
						|
  } | 
						|
  /** | 
						|
   * Gets the list cache value for `key`. | 
						|
   * | 
						|
   * @private | 
						|
   * @name get | 
						|
   * @memberOf ListCache | 
						|
   * @param {string} key The key of the value to get. | 
						|
   * @returns {*} Returns the entry value. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function listCacheGet(key) { | 
						|
    var data = this.__data__, | 
						|
        index = assocIndexOf(data, key); | 
						|
    return index < 0 ? undefined : data[index][1]; | 
						|
  } | 
						|
  /** | 
						|
   * Checks if a list cache value for `key` exists. | 
						|
   * | 
						|
   * @private | 
						|
   * @name has | 
						|
   * @memberOf ListCache | 
						|
   * @param {string} key The key of the entry to check. | 
						|
   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function listCacheHas(key) { | 
						|
    return assocIndexOf(this.__data__, key) > -1; | 
						|
  } | 
						|
  /** | 
						|
   * Sets the list cache `key` to `value`. | 
						|
   * | 
						|
   * @private | 
						|
   * @name set | 
						|
   * @memberOf ListCache | 
						|
   * @param {string} key The key of the value to set. | 
						|
   * @param {*} value The value to set. | 
						|
   * @returns {Object} Returns the list cache instance. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function listCacheSet(key, value) { | 
						|
    var data = this.__data__, | 
						|
        index = assocIndexOf(data, key); | 
						|
 | 
						|
    if (index < 0) { | 
						|
      data.push([key, value]); | 
						|
    } else { | 
						|
      data[index][1] = value; | 
						|
    } | 
						|
 | 
						|
    return this; | 
						|
  } // Add methods to `ListCache`. | 
						|
 | 
						|
 | 
						|
  ListCache.prototype.clear = listCacheClear; | 
						|
  ListCache.prototype['delete'] = listCacheDelete; | 
						|
  ListCache.prototype.get = listCacheGet; | 
						|
  ListCache.prototype.has = listCacheHas; | 
						|
  ListCache.prototype.set = listCacheSet; | 
						|
  /** | 
						|
   * Creates a map cache object to store key-value pairs. | 
						|
   * | 
						|
   * @private | 
						|
   * @constructor | 
						|
   * @param {Array} [entries] The key-value pairs to cache. | 
						|
   */ | 
						|
 | 
						|
  function MapCache(entries) { | 
						|
    var index = -1, | 
						|
        length = entries ? entries.length : 0; | 
						|
    this.clear(); | 
						|
 | 
						|
    while (++index < length) { | 
						|
      var entry = entries[index]; | 
						|
      this.set(entry[0], entry[1]); | 
						|
    } | 
						|
  } | 
						|
  /** | 
						|
   * Removes all key-value entries from the map. | 
						|
   * | 
						|
   * @private | 
						|
   * @name clear | 
						|
   * @memberOf MapCache | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function mapCacheClear() { | 
						|
    this.__data__ = { | 
						|
      'hash': new Hash(), | 
						|
      'map': new (Map || ListCache)(), | 
						|
      'string': new Hash() | 
						|
    }; | 
						|
  } | 
						|
  /** | 
						|
   * Removes `key` and its value from the map. | 
						|
   * | 
						|
   * @private | 
						|
   * @name delete | 
						|
   * @memberOf MapCache | 
						|
   * @param {string} key The key of the value to remove. | 
						|
   * @returns {boolean} Returns `true` if the entry was removed, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function mapCacheDelete(key) { | 
						|
    return getMapData(this, key)['delete'](key); | 
						|
  } | 
						|
  /** | 
						|
   * Gets the map value for `key`. | 
						|
   * | 
						|
   * @private | 
						|
   * @name get | 
						|
   * @memberOf MapCache | 
						|
   * @param {string} key The key of the value to get. | 
						|
   * @returns {*} Returns the entry value. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function mapCacheGet(key) { | 
						|
    return getMapData(this, key).get(key); | 
						|
  } | 
						|
  /** | 
						|
   * Checks if a map value for `key` exists. | 
						|
   * | 
						|
   * @private | 
						|
   * @name has | 
						|
   * @memberOf MapCache | 
						|
   * @param {string} key The key of the entry to check. | 
						|
   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function mapCacheHas(key) { | 
						|
    return getMapData(this, key).has(key); | 
						|
  } | 
						|
  /** | 
						|
   * Sets the map `key` to `value`. | 
						|
   * | 
						|
   * @private | 
						|
   * @name set | 
						|
   * @memberOf MapCache | 
						|
   * @param {string} key The key of the value to set. | 
						|
   * @param {*} value The value to set. | 
						|
   * @returns {Object} Returns the map cache instance. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function mapCacheSet(key, value) { | 
						|
    getMapData(this, key).set(key, value); | 
						|
    return this; | 
						|
  } // Add methods to `MapCache`. | 
						|
 | 
						|
 | 
						|
  MapCache.prototype.clear = mapCacheClear; | 
						|
  MapCache.prototype['delete'] = mapCacheDelete; | 
						|
  MapCache.prototype.get = mapCacheGet; | 
						|
  MapCache.prototype.has = mapCacheHas; | 
						|
  MapCache.prototype.set = mapCacheSet; | 
						|
  /** | 
						|
   * | 
						|
   * Creates an array cache object to store unique values. | 
						|
   * | 
						|
   * @private | 
						|
   * @constructor | 
						|
   * @param {Array} [values] The values to cache. | 
						|
   */ | 
						|
 | 
						|
  function SetCache(values) { | 
						|
    var index = -1, | 
						|
        length = values ? values.length : 0; | 
						|
    this.__data__ = new MapCache(); | 
						|
 | 
						|
    while (++index < length) { | 
						|
      this.add(values[index]); | 
						|
    } | 
						|
  } | 
						|
  /** | 
						|
   * Adds `value` to the array cache. | 
						|
   * | 
						|
   * @private | 
						|
   * @name add | 
						|
   * @memberOf SetCache | 
						|
   * @alias push | 
						|
   * @param {*} value The value to cache. | 
						|
   * @returns {Object} Returns the cache instance. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function setCacheAdd(value) { | 
						|
    this.__data__.set(value, HASH_UNDEFINED); | 
						|
 | 
						|
    return this; | 
						|
  } | 
						|
  /** | 
						|
   * Checks if `value` is in the array cache. | 
						|
   * | 
						|
   * @private | 
						|
   * @name has | 
						|
   * @memberOf SetCache | 
						|
   * @param {*} value The value to search for. | 
						|
   * @returns {number} Returns `true` if `value` is found, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function setCacheHas(value) { | 
						|
    return this.__data__.has(value); | 
						|
  } // Add methods to `SetCache`. | 
						|
 | 
						|
 | 
						|
  SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; | 
						|
  SetCache.prototype.has = setCacheHas; | 
						|
  /** | 
						|
   * Creates a stack cache object to store key-value pairs. | 
						|
   * | 
						|
   * @private | 
						|
   * @constructor | 
						|
   * @param {Array} [entries] The key-value pairs to cache. | 
						|
   */ | 
						|
 | 
						|
  function Stack(entries) { | 
						|
    this.__data__ = new ListCache(entries); | 
						|
  } | 
						|
  /** | 
						|
   * Removes all key-value entries from the stack. | 
						|
   * | 
						|
   * @private | 
						|
   * @name clear | 
						|
   * @memberOf Stack | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function stackClear() { | 
						|
    this.__data__ = new ListCache(); | 
						|
  } | 
						|
  /** | 
						|
   * Removes `key` and its value from the stack. | 
						|
   * | 
						|
   * @private | 
						|
   * @name delete | 
						|
   * @memberOf Stack | 
						|
   * @param {string} key The key of the value to remove. | 
						|
   * @returns {boolean} Returns `true` if the entry was removed, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function stackDelete(key) { | 
						|
    return this.__data__['delete'](key); | 
						|
  } | 
						|
  /** | 
						|
   * Gets the stack value for `key`. | 
						|
   * | 
						|
   * @private | 
						|
   * @name get | 
						|
   * @memberOf Stack | 
						|
   * @param {string} key The key of the value to get. | 
						|
   * @returns {*} Returns the entry value. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function stackGet(key) { | 
						|
    return this.__data__.get(key); | 
						|
  } | 
						|
  /** | 
						|
   * Checks if a stack value for `key` exists. | 
						|
   * | 
						|
   * @private | 
						|
   * @name has | 
						|
   * @memberOf Stack | 
						|
   * @param {string} key The key of the entry to check. | 
						|
   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function stackHas(key) { | 
						|
    return this.__data__.has(key); | 
						|
  } | 
						|
  /** | 
						|
   * Sets the stack `key` to `value`. | 
						|
   * | 
						|
   * @private | 
						|
   * @name set | 
						|
   * @memberOf Stack | 
						|
   * @param {string} key The key of the value to set. | 
						|
   * @param {*} value The value to set. | 
						|
   * @returns {Object} Returns the stack cache instance. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function stackSet(key, value) { | 
						|
    var cache = this.__data__; | 
						|
 | 
						|
    if (cache instanceof ListCache) { | 
						|
      var pairs = cache.__data__; | 
						|
 | 
						|
      if (!Map || pairs.length < LARGE_ARRAY_SIZE - 1) { | 
						|
        pairs.push([key, value]); | 
						|
        return this; | 
						|
      } | 
						|
 | 
						|
      cache = this.__data__ = new MapCache(pairs); | 
						|
    } | 
						|
 | 
						|
    cache.set(key, value); | 
						|
    return this; | 
						|
  } // Add methods to `Stack`. | 
						|
 | 
						|
 | 
						|
  Stack.prototype.clear = stackClear; | 
						|
  Stack.prototype['delete'] = stackDelete; | 
						|
  Stack.prototype.get = stackGet; | 
						|
  Stack.prototype.has = stackHas; | 
						|
  Stack.prototype.set = stackSet; | 
						|
  /** | 
						|
   * Creates an array of the enumerable property names of the array-like `value`. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {*} value The value to query. | 
						|
   * @param {boolean} inherited Specify returning inherited property names. | 
						|
   * @returns {Array} Returns the array of property names. | 
						|
   */ | 
						|
 | 
						|
  function arrayLikeKeys(value, inherited) { | 
						|
    // Safari 8.1 makes `arguments.callee` enumerable in strict mode. | 
						|
    // Safari 9 makes `arguments.length` enumerable in strict mode. | 
						|
    var result = isArray(value) || isArguments(value) ? baseTimes(value.length, String) : []; | 
						|
    var length = result.length, | 
						|
        skipIndexes = !!length; | 
						|
 | 
						|
    for (var key in value) { | 
						|
      if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && (key == 'length' || isIndex(key, length)))) { | 
						|
        result.push(key); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return result; | 
						|
  } | 
						|
  /** | 
						|
   * Gets the index at which the `key` is found in `array` of key-value pairs. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Array} array The array to inspect. | 
						|
   * @param {*} key The key to search for. | 
						|
   * @returns {number} Returns the index of the matched value, else `-1`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function assocIndexOf(array, key) { | 
						|
    var length = array.length; | 
						|
 | 
						|
    while (length--) { | 
						|
      if (eq(array[length][0], key)) { | 
						|
        return length; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return -1; | 
						|
  } | 
						|
  /** | 
						|
   * The base implementation of `_.get` without support for default values. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Object} object The object to query. | 
						|
   * @param {Array|string} path The path of the property to get. | 
						|
   * @returns {*} Returns the resolved value. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function baseGet(object, path) { | 
						|
    path = isKey(path, object) ? [path] : castPath(path); | 
						|
    var index = 0, | 
						|
        length = path.length; | 
						|
 | 
						|
    while (object != null && index < length) { | 
						|
      object = object[toKey(path[index++])]; | 
						|
    } | 
						|
 | 
						|
    return index && index == length ? object : undefined; | 
						|
  } | 
						|
  /** | 
						|
   * The base implementation of `getTag`. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {*} value The value to query. | 
						|
   * @returns {string} Returns the `toStringTag`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function baseGetTag(value) { | 
						|
    return objectToString.call(value); | 
						|
  } | 
						|
  /** | 
						|
   * The base implementation of `_.hasIn` without support for deep paths. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Object} [object] The object to query. | 
						|
   * @param {Array|string} key The key to check. | 
						|
   * @returns {boolean} Returns `true` if `key` exists, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function baseHasIn(object, key) { | 
						|
    return object != null && key in Object(object); | 
						|
  } | 
						|
  /** | 
						|
   * The base implementation of `_.isEqual` which supports partial comparisons | 
						|
   * and tracks traversed objects. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {*} value The value to compare. | 
						|
   * @param {*} other The other value to compare. | 
						|
   * @param {Function} [customizer] The function to customize comparisons. | 
						|
   * @param {boolean} [bitmask] The bitmask of comparison flags. | 
						|
   *  The bitmask may be composed of the following flags: | 
						|
   *     1 - Unordered comparison | 
						|
   *     2 - Partial comparison | 
						|
   * @param {Object} [stack] Tracks traversed `value` and `other` objects. | 
						|
   * @returns {boolean} Returns `true` if the values are equivalent, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function baseIsEqual(value, other, customizer, bitmask, stack) { | 
						|
    if (value === other) { | 
						|
      return true; | 
						|
    } | 
						|
 | 
						|
    if (value == null || other == null || !isObject(value) && !isObjectLike(other)) { | 
						|
      return value !== value && other !== other; | 
						|
    } | 
						|
 | 
						|
    return baseIsEqualDeep(value, other, baseIsEqual, customizer, bitmask, stack); | 
						|
  } | 
						|
  /** | 
						|
   * A specialized version of `baseIsEqual` for arrays and objects which performs | 
						|
   * deep comparisons and tracks traversed objects enabling objects with circular | 
						|
   * references to be compared. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Object} object The object to compare. | 
						|
   * @param {Object} other The other object to compare. | 
						|
   * @param {Function} equalFunc The function to determine equivalents of values. | 
						|
   * @param {Function} [customizer] The function to customize comparisons. | 
						|
   * @param {number} [bitmask] The bitmask of comparison flags. See `baseIsEqual` | 
						|
   *  for more details. | 
						|
   * @param {Object} [stack] Tracks traversed `object` and `other` objects. | 
						|
   * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function baseIsEqualDeep(object, other, equalFunc, customizer, bitmask, stack) { | 
						|
    var objIsArr = isArray(object), | 
						|
        othIsArr = isArray(other), | 
						|
        objTag = arrayTag, | 
						|
        othTag = arrayTag; | 
						|
 | 
						|
    if (!objIsArr) { | 
						|
      objTag = getTag(object); | 
						|
      objTag = objTag == argsTag ? objectTag : objTag; | 
						|
    } | 
						|
 | 
						|
    if (!othIsArr) { | 
						|
      othTag = getTag(other); | 
						|
      othTag = othTag == argsTag ? objectTag : othTag; | 
						|
    } | 
						|
 | 
						|
    var objIsObj = objTag == objectTag && !isHostObject(object), | 
						|
        othIsObj = othTag == objectTag && !isHostObject(other), | 
						|
        isSameTag = objTag == othTag; | 
						|
 | 
						|
    if (isSameTag && !objIsObj) { | 
						|
      stack || (stack = new Stack()); | 
						|
      return objIsArr || isTypedArray(object) ? equalArrays(object, other, equalFunc, customizer, bitmask, stack) : equalByTag(object, other, objTag, equalFunc, customizer, bitmask, stack); | 
						|
    } | 
						|
 | 
						|
    if (!(bitmask & PARTIAL_COMPARE_FLAG)) { | 
						|
      var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), | 
						|
          othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); | 
						|
 | 
						|
      if (objIsWrapped || othIsWrapped) { | 
						|
        var objUnwrapped = objIsWrapped ? object.value() : object, | 
						|
            othUnwrapped = othIsWrapped ? other.value() : other; | 
						|
        stack || (stack = new Stack()); | 
						|
        return equalFunc(objUnwrapped, othUnwrapped, customizer, bitmask, stack); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    if (!isSameTag) { | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    stack || (stack = new Stack()); | 
						|
    return equalObjects(object, other, equalFunc, customizer, bitmask, stack); | 
						|
  } | 
						|
  /** | 
						|
   * The base implementation of `_.isMatch` without support for iteratee shorthands. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Object} object The object to inspect. | 
						|
   * @param {Object} source The object of property values to match. | 
						|
   * @param {Array} matchData The property names, values, and compare flags to match. | 
						|
   * @param {Function} [customizer] The function to customize comparisons. | 
						|
   * @returns {boolean} Returns `true` if `object` is a match, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function baseIsMatch(object, source, matchData, customizer) { | 
						|
    var index = matchData.length, | 
						|
        length = index, | 
						|
        noCustomizer = !customizer; | 
						|
 | 
						|
    if (object == null) { | 
						|
      return !length; | 
						|
    } | 
						|
 | 
						|
    object = Object(object); | 
						|
 | 
						|
    while (index--) { | 
						|
      var data = matchData[index]; | 
						|
 | 
						|
      if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) { | 
						|
        return false; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    while (++index < length) { | 
						|
      data = matchData[index]; | 
						|
      var key = data[0], | 
						|
          objValue = object[key], | 
						|
          srcValue = data[1]; | 
						|
 | 
						|
      if (noCustomizer && data[2]) { | 
						|
        if (objValue === undefined && !(key in object)) { | 
						|
          return false; | 
						|
        } | 
						|
      } else { | 
						|
        var stack = new Stack(); | 
						|
 | 
						|
        if (customizer) { | 
						|
          var result = customizer(objValue, srcValue, key, object, source, stack); | 
						|
        } | 
						|
 | 
						|
        if (!(result === undefined ? baseIsEqual(srcValue, objValue, customizer, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG, stack) : result)) { | 
						|
          return false; | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return true; | 
						|
  } | 
						|
  /** | 
						|
   * The base implementation of `_.isNative` without bad shim checks. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {*} value The value to check. | 
						|
   * @returns {boolean} Returns `true` if `value` is a native function, | 
						|
   *  else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function baseIsNative(value) { | 
						|
    if (!isObject(value) || isMasked(value)) { | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    var pattern = isFunction(value) || isHostObject(value) ? reIsNative : reIsHostCtor; | 
						|
    return pattern.test(toSource(value)); | 
						|
  } | 
						|
  /** | 
						|
   * The base implementation of `_.isTypedArray` without Node.js optimizations. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {*} value The value to check. | 
						|
   * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function baseIsTypedArray(value) { | 
						|
    return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objectToString.call(value)]; | 
						|
  } | 
						|
  /** | 
						|
   * The base implementation of `_.iteratee`. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {*} [value=_.identity] The value to convert to an iteratee. | 
						|
   * @returns {Function} Returns the iteratee. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function baseIteratee(value) { | 
						|
    // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. | 
						|
    // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. | 
						|
    if (typeof value == 'function') { | 
						|
      return value; | 
						|
    } | 
						|
 | 
						|
    if (value == null) { | 
						|
      return identity; | 
						|
    } | 
						|
 | 
						|
    if (typeof value == 'object') { | 
						|
      return isArray(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value); | 
						|
    } | 
						|
 | 
						|
    return property(value); | 
						|
  } | 
						|
  /** | 
						|
   * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Object} object The object to query. | 
						|
   * @returns {Array} Returns the array of property names. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function baseKeys(object) { | 
						|
    if (!isPrototype(object)) { | 
						|
      return nativeKeys(object); | 
						|
    } | 
						|
 | 
						|
    var result = []; | 
						|
 | 
						|
    for (var key in Object(object)) { | 
						|
      if (hasOwnProperty.call(object, key) && key != 'constructor') { | 
						|
        result.push(key); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return result; | 
						|
  } | 
						|
  /** | 
						|
   * The base implementation of `_.matches` which doesn't clone `source`. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Object} source The object of property values to match. | 
						|
   * @returns {Function} Returns the new spec function. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function baseMatches(source) { | 
						|
    var matchData = getMatchData(source); | 
						|
 | 
						|
    if (matchData.length == 1 && matchData[0][2]) { | 
						|
      return matchesStrictComparable(matchData[0][0], matchData[0][1]); | 
						|
    } | 
						|
 | 
						|
    return function (object) { | 
						|
      return object === source || baseIsMatch(object, source, matchData); | 
						|
    }; | 
						|
  } | 
						|
  /** | 
						|
   * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {string} path The path of the property to get. | 
						|
   * @param {*} srcValue The value to match. | 
						|
   * @returns {Function} Returns the new spec function. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function baseMatchesProperty(path, srcValue) { | 
						|
    if (isKey(path) && isStrictComparable(srcValue)) { | 
						|
      return matchesStrictComparable(toKey(path), srcValue); | 
						|
    } | 
						|
 | 
						|
    return function (object) { | 
						|
      var objValue = get(object, path); | 
						|
      return objValue === undefined && objValue === srcValue ? hasIn(object, path) : baseIsEqual(srcValue, objValue, undefined, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG); | 
						|
    }; | 
						|
  } | 
						|
  /** | 
						|
   * A specialized version of `baseProperty` which supports deep paths. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Array|string} path The path of the property to get. | 
						|
   * @returns {Function} Returns the new accessor function. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function basePropertyDeep(path) { | 
						|
    return function (object) { | 
						|
      return baseGet(object, path); | 
						|
    }; | 
						|
  } | 
						|
  /** | 
						|
   * The base implementation of `_.toString` which doesn't convert nullish | 
						|
   * values to empty strings. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {*} value The value to process. | 
						|
   * @returns {string} Returns the string. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function baseToString(value) { | 
						|
    // Exit early for strings to avoid a performance hit in some environments. | 
						|
    if (typeof value == 'string') { | 
						|
      return value; | 
						|
    } | 
						|
 | 
						|
    if (isSymbol(value)) { | 
						|
      return symbolToString ? symbolToString.call(value) : ''; | 
						|
    } | 
						|
 | 
						|
    var result = value + ''; | 
						|
    return result == '0' && 1 / value == -INFINITY ? '-0' : result; | 
						|
  } | 
						|
  /** | 
						|
   * The base implementation of `_.uniqBy` without support for iteratee shorthands. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Array} array The array to inspect. | 
						|
   * @param {Function} [iteratee] The iteratee invoked per element. | 
						|
   * @param {Function} [comparator] The comparator invoked per element. | 
						|
   * @returns {Array} Returns the new duplicate free array. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function baseUniq(array, iteratee, comparator) { | 
						|
    var index = -1, | 
						|
        includes = arrayIncludes, | 
						|
        length = array.length, | 
						|
        isCommon = true, | 
						|
        result = [], | 
						|
        seen = result; | 
						|
 | 
						|
    if (comparator) { | 
						|
      isCommon = false; | 
						|
      includes = arrayIncludesWith; | 
						|
    } else if (length >= LARGE_ARRAY_SIZE) { | 
						|
      var set = iteratee ? null : createSet(array); | 
						|
 | 
						|
      if (set) { | 
						|
        return setToArray(set); | 
						|
      } | 
						|
 | 
						|
      isCommon = false; | 
						|
      includes = cacheHas; | 
						|
      seen = new SetCache(); | 
						|
    } else { | 
						|
      seen = iteratee ? [] : result; | 
						|
    } | 
						|
 | 
						|
    outer: while (++index < length) { | 
						|
      var value = array[index], | 
						|
          computed = iteratee ? iteratee(value) : value; | 
						|
      value = comparator || value !== 0 ? value : 0; | 
						|
 | 
						|
      if (isCommon && computed === computed) { | 
						|
        var seenIndex = seen.length; | 
						|
 | 
						|
        while (seenIndex--) { | 
						|
          if (seen[seenIndex] === computed) { | 
						|
            continue outer; | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        if (iteratee) { | 
						|
          seen.push(computed); | 
						|
        } | 
						|
 | 
						|
        result.push(value); | 
						|
      } else if (!includes(seen, computed, comparator)) { | 
						|
        if (seen !== result) { | 
						|
          seen.push(computed); | 
						|
        } | 
						|
 | 
						|
        result.push(value); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return result; | 
						|
  } | 
						|
  /** | 
						|
   * Casts `value` to a path array if it's not one. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {*} value The value to inspect. | 
						|
   * @returns {Array} Returns the cast property path array. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function castPath(value) { | 
						|
    return isArray(value) ? value : stringToPath(value); | 
						|
  } | 
						|
  /** | 
						|
   * Creates a set object of `values`. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Array} values The values to add to the set. | 
						|
   * @returns {Object} Returns the new set. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  var createSet = !(Set && 1 / setToArray(new Set([, -0]))[1] == INFINITY) ? noop : function (values) { | 
						|
    return new Set(values); | 
						|
  }; | 
						|
  /** | 
						|
   * A specialized version of `baseIsEqualDeep` for arrays with support for | 
						|
   * partial deep comparisons. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Array} array The array to compare. | 
						|
   * @param {Array} other The other array to compare. | 
						|
   * @param {Function} equalFunc The function to determine equivalents of values. | 
						|
   * @param {Function} customizer The function to customize comparisons. | 
						|
   * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` | 
						|
   *  for more details. | 
						|
   * @param {Object} stack Tracks traversed `array` and `other` objects. | 
						|
   * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. | 
						|
   */ | 
						|
 | 
						|
  function equalArrays(array, other, equalFunc, customizer, bitmask, stack) { | 
						|
    var isPartial = bitmask & PARTIAL_COMPARE_FLAG, | 
						|
        arrLength = array.length, | 
						|
        othLength = other.length; | 
						|
 | 
						|
    if (arrLength != othLength && !(isPartial && othLength > arrLength)) { | 
						|
      return false; | 
						|
    } // Assume cyclic values are equal. | 
						|
 | 
						|
 | 
						|
    var stacked = stack.get(array); | 
						|
 | 
						|
    if (stacked && stack.get(other)) { | 
						|
      return stacked == other; | 
						|
    } | 
						|
 | 
						|
    var index = -1, | 
						|
        result = true, | 
						|
        seen = bitmask & UNORDERED_COMPARE_FLAG ? new SetCache() : undefined; | 
						|
    stack.set(array, other); | 
						|
    stack.set(other, array); // Ignore non-index properties. | 
						|
 | 
						|
    while (++index < arrLength) { | 
						|
      var arrValue = array[index], | 
						|
          othValue = other[index]; | 
						|
 | 
						|
      if (customizer) { | 
						|
        var compared = isPartial ? customizer(othValue, arrValue, index, other, array, stack) : customizer(arrValue, othValue, index, array, other, stack); | 
						|
      } | 
						|
 | 
						|
      if (compared !== undefined) { | 
						|
        if (compared) { | 
						|
          continue; | 
						|
        } | 
						|
 | 
						|
        result = false; | 
						|
        break; | 
						|
      } // Recursively compare arrays (susceptible to call stack limits). | 
						|
 | 
						|
 | 
						|
      if (seen) { | 
						|
        if (!arraySome(other, function (othValue, othIndex) { | 
						|
          if (!seen.has(othIndex) && (arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) { | 
						|
            return seen.add(othIndex); | 
						|
          } | 
						|
        })) { | 
						|
          result = false; | 
						|
          break; | 
						|
        } | 
						|
      } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) { | 
						|
        result = false; | 
						|
        break; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    stack['delete'](array); | 
						|
    stack['delete'](other); | 
						|
    return result; | 
						|
  } | 
						|
  /** | 
						|
   * A specialized version of `baseIsEqualDeep` for comparing objects of | 
						|
   * the same `toStringTag`. | 
						|
   * | 
						|
   * **Note:** This function only supports comparing values with tags of | 
						|
   * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Object} object The object to compare. | 
						|
   * @param {Object} other The other object to compare. | 
						|
   * @param {string} tag The `toStringTag` of the objects to compare. | 
						|
   * @param {Function} equalFunc The function to determine equivalents of values. | 
						|
   * @param {Function} customizer The function to customize comparisons. | 
						|
   * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` | 
						|
   *  for more details. | 
						|
   * @param {Object} stack Tracks traversed `object` and `other` objects. | 
						|
   * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) { | 
						|
    switch (tag) { | 
						|
      case dataViewTag: | 
						|
        if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) { | 
						|
          return false; | 
						|
        } | 
						|
 | 
						|
        object = object.buffer; | 
						|
        other = other.buffer; | 
						|
 | 
						|
      case arrayBufferTag: | 
						|
        if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array(object), new Uint8Array(other))) { | 
						|
          return false; | 
						|
        } | 
						|
 | 
						|
        return true; | 
						|
 | 
						|
      case boolTag: | 
						|
      case dateTag: | 
						|
      case numberTag: | 
						|
        // Coerce booleans to `1` or `0` and dates to milliseconds. | 
						|
        // Invalid dates are coerced to `NaN`. | 
						|
        return eq(+object, +other); | 
						|
 | 
						|
      case errorTag: | 
						|
        return object.name == other.name && object.message == other.message; | 
						|
 | 
						|
      case regexpTag: | 
						|
      case stringTag: | 
						|
        // Coerce regexes to strings and treat strings, primitives and objects, | 
						|
        // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring | 
						|
        // for more details. | 
						|
        return object == other + ''; | 
						|
 | 
						|
      case mapTag: | 
						|
        var convert = mapToArray; | 
						|
 | 
						|
      case setTag: | 
						|
        var isPartial = bitmask & PARTIAL_COMPARE_FLAG; | 
						|
        convert || (convert = setToArray); | 
						|
 | 
						|
        if (object.size != other.size && !isPartial) { | 
						|
          return false; | 
						|
        } // Assume cyclic values are equal. | 
						|
 | 
						|
 | 
						|
        var stacked = stack.get(object); | 
						|
 | 
						|
        if (stacked) { | 
						|
          return stacked == other; | 
						|
        } | 
						|
 | 
						|
        bitmask |= UNORDERED_COMPARE_FLAG; // Recursively compare objects (susceptible to call stack limits). | 
						|
 | 
						|
        stack.set(object, other); | 
						|
        var result = equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask, stack); | 
						|
        stack['delete'](object); | 
						|
        return result; | 
						|
 | 
						|
      case symbolTag: | 
						|
        if (symbolValueOf) { | 
						|
          return symbolValueOf.call(object) == symbolValueOf.call(other); | 
						|
        } | 
						|
 | 
						|
    } | 
						|
 | 
						|
    return false; | 
						|
  } | 
						|
  /** | 
						|
   * A specialized version of `baseIsEqualDeep` for objects with support for | 
						|
   * partial deep comparisons. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Object} object The object to compare. | 
						|
   * @param {Object} other The other object to compare. | 
						|
   * @param {Function} equalFunc The function to determine equivalents of values. | 
						|
   * @param {Function} customizer The function to customize comparisons. | 
						|
   * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` | 
						|
   *  for more details. | 
						|
   * @param {Object} stack Tracks traversed `object` and `other` objects. | 
						|
   * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function equalObjects(object, other, equalFunc, customizer, bitmask, stack) { | 
						|
    var isPartial = bitmask & PARTIAL_COMPARE_FLAG, | 
						|
        objProps = keys(object), | 
						|
        objLength = objProps.length, | 
						|
        othProps = keys(other), | 
						|
        othLength = othProps.length; | 
						|
 | 
						|
    if (objLength != othLength && !isPartial) { | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    var index = objLength; | 
						|
 | 
						|
    while (index--) { | 
						|
      var key = objProps[index]; | 
						|
 | 
						|
      if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { | 
						|
        return false; | 
						|
      } | 
						|
    } // Assume cyclic values are equal. | 
						|
 | 
						|
 | 
						|
    var stacked = stack.get(object); | 
						|
 | 
						|
    if (stacked && stack.get(other)) { | 
						|
      return stacked == other; | 
						|
    } | 
						|
 | 
						|
    var result = true; | 
						|
    stack.set(object, other); | 
						|
    stack.set(other, object); | 
						|
    var skipCtor = isPartial; | 
						|
 | 
						|
    while (++index < objLength) { | 
						|
      key = objProps[index]; | 
						|
      var objValue = object[key], | 
						|
          othValue = other[key]; | 
						|
 | 
						|
      if (customizer) { | 
						|
        var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack); | 
						|
      } // Recursively compare objects (susceptible to call stack limits). | 
						|
 | 
						|
 | 
						|
      if (!(compared === undefined ? objValue === othValue || equalFunc(objValue, othValue, customizer, bitmask, stack) : compared)) { | 
						|
        result = false; | 
						|
        break; | 
						|
      } | 
						|
 | 
						|
      skipCtor || (skipCtor = key == 'constructor'); | 
						|
    } | 
						|
 | 
						|
    if (result && !skipCtor) { | 
						|
      var objCtor = object.constructor, | 
						|
          othCtor = other.constructor; // Non `Object` object instances with different constructors are not equal. | 
						|
 | 
						|
      if (objCtor != othCtor && 'constructor' in object && 'constructor' in other && !(typeof objCtor == 'function' && objCtor instanceof objCtor && typeof othCtor == 'function' && othCtor instanceof othCtor)) { | 
						|
        result = false; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    stack['delete'](object); | 
						|
    stack['delete'](other); | 
						|
    return result; | 
						|
  } | 
						|
  /** | 
						|
   * Gets the data for `map`. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Object} map The map to query. | 
						|
   * @param {string} key The reference key. | 
						|
   * @returns {*} Returns the map data. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function getMapData(map, key) { | 
						|
    var data = map.__data__; | 
						|
    return isKeyable(key) ? data[typeof key == 'string' ? 'string' : 'hash'] : data.map; | 
						|
  } | 
						|
  /** | 
						|
   * Gets the property names, values, and compare flags of `object`. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Object} object The object to query. | 
						|
   * @returns {Array} Returns the match data of `object`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function getMatchData(object) { | 
						|
    var result = keys(object), | 
						|
        length = result.length; | 
						|
 | 
						|
    while (length--) { | 
						|
      var key = result[length], | 
						|
          value = object[key]; | 
						|
      result[length] = [key, value, isStrictComparable(value)]; | 
						|
    } | 
						|
 | 
						|
    return result; | 
						|
  } | 
						|
  /** | 
						|
   * Gets the native function at `key` of `object`. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Object} object The object to query. | 
						|
   * @param {string} key The key of the method to get. | 
						|
   * @returns {*} Returns the function if it's native, else `undefined`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function getNative(object, key) { | 
						|
    var value = getValue(object, key); | 
						|
    return baseIsNative(value) ? value : undefined; | 
						|
  } | 
						|
  /** | 
						|
   * Gets the `toStringTag` of `value`. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {*} value The value to query. | 
						|
   * @returns {string} Returns the `toStringTag`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  var getTag = baseGetTag; // Fallback for data views, maps, sets, and weak maps in IE 11, | 
						|
  // for data views in Edge < 14, and promises in Node.js. | 
						|
 | 
						|
  if (DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag || Map && getTag(new Map()) != mapTag || Promise && getTag(Promise.resolve()) != promiseTag || Set && getTag(new Set()) != setTag || WeakMap && getTag(new WeakMap()) != weakMapTag) { | 
						|
    getTag = function getTag(value) { | 
						|
      var result = objectToString.call(value), | 
						|
          Ctor = result == objectTag ? value.constructor : undefined, | 
						|
          ctorString = Ctor ? toSource(Ctor) : undefined; | 
						|
 | 
						|
      if (ctorString) { | 
						|
        switch (ctorString) { | 
						|
          case dataViewCtorString: | 
						|
            return dataViewTag; | 
						|
 | 
						|
          case mapCtorString: | 
						|
            return mapTag; | 
						|
 | 
						|
          case promiseCtorString: | 
						|
            return promiseTag; | 
						|
 | 
						|
          case setCtorString: | 
						|
            return setTag; | 
						|
 | 
						|
          case weakMapCtorString: | 
						|
            return weakMapTag; | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      return result; | 
						|
    }; | 
						|
  } | 
						|
  /** | 
						|
   * Checks if `path` exists on `object`. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Object} object The object to query. | 
						|
   * @param {Array|string} path The path to check. | 
						|
   * @param {Function} hasFunc The function to check properties. | 
						|
   * @returns {boolean} Returns `true` if `path` exists, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function hasPath(object, path, hasFunc) { | 
						|
    path = isKey(path, object) ? [path] : castPath(path); | 
						|
    var result, | 
						|
        index = -1, | 
						|
        length = path.length; | 
						|
 | 
						|
    while (++index < length) { | 
						|
      var key = toKey(path[index]); | 
						|
 | 
						|
      if (!(result = object != null && hasFunc(object, key))) { | 
						|
        break; | 
						|
      } | 
						|
 | 
						|
      object = object[key]; | 
						|
    } | 
						|
 | 
						|
    if (result) { | 
						|
      return result; | 
						|
    } | 
						|
 | 
						|
    var length = object ? object.length : 0; | 
						|
    return !!length && isLength(length) && isIndex(key, length) && (isArray(object) || isArguments(object)); | 
						|
  } | 
						|
  /** | 
						|
   * Checks if `value` is a valid array-like index. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {*} value The value to check. | 
						|
   * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. | 
						|
   * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function isIndex(value, length) { | 
						|
    length = length == null ? MAX_SAFE_INTEGER : length; | 
						|
    return !!length && (typeof value == 'number' || reIsUint.test(value)) && value > -1 && value % 1 == 0 && value < length; | 
						|
  } | 
						|
  /** | 
						|
   * Checks if `value` is a property name and not a property path. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {*} value The value to check. | 
						|
   * @param {Object} [object] The object to query keys on. | 
						|
   * @returns {boolean} Returns `true` if `value` is a property name, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function isKey(value, object) { | 
						|
    if (isArray(value)) { | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    var type = typeof value; | 
						|
 | 
						|
    if (type == 'number' || type == 'symbol' || type == 'boolean' || value == null || isSymbol(value)) { | 
						|
      return true; | 
						|
    } | 
						|
 | 
						|
    return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || object != null && value in Object(object); | 
						|
  } | 
						|
  /** | 
						|
   * Checks if `value` is suitable for use as unique object key. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {*} value The value to check. | 
						|
   * @returns {boolean} Returns `true` if `value` is suitable, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function isKeyable(value) { | 
						|
    var type = typeof value; | 
						|
    return type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean' ? value !== '__proto__' : value === null; | 
						|
  } | 
						|
  /** | 
						|
   * Checks if `func` has its source masked. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Function} func The function to check. | 
						|
   * @returns {boolean} Returns `true` if `func` is masked, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function isMasked(func) { | 
						|
    return !!maskSrcKey && maskSrcKey in func; | 
						|
  } | 
						|
  /** | 
						|
   * Checks if `value` is likely a prototype object. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {*} value The value to check. | 
						|
   * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function isPrototype(value) { | 
						|
    var Ctor = value && value.constructor, | 
						|
        proto = typeof Ctor == 'function' && Ctor.prototype || objectProto; | 
						|
    return value === proto; | 
						|
  } | 
						|
  /** | 
						|
   * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {*} value The value to check. | 
						|
   * @returns {boolean} Returns `true` if `value` if suitable for strict | 
						|
   *  equality comparisons, else `false`. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function isStrictComparable(value) { | 
						|
    return value === value && !isObject(value); | 
						|
  } | 
						|
  /** | 
						|
   * A specialized version of `matchesProperty` for source values suitable | 
						|
   * for strict equality comparisons, i.e. `===`. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {string} key The key of the property to get. | 
						|
   * @param {*} srcValue The value to match. | 
						|
   * @returns {Function} Returns the new spec function. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function matchesStrictComparable(key, srcValue) { | 
						|
    return function (object) { | 
						|
      if (object == null) { | 
						|
        return false; | 
						|
      } | 
						|
 | 
						|
      return object[key] === srcValue && (srcValue !== undefined || key in Object(object)); | 
						|
    }; | 
						|
  } | 
						|
  /** | 
						|
   * Converts `string` to a property path array. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {string} string The string to convert. | 
						|
   * @returns {Array} Returns the property path array. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  var stringToPath = memoize(function (string) { | 
						|
    string = toString(string); | 
						|
    var result = []; | 
						|
 | 
						|
    if (reLeadingDot.test(string)) { | 
						|
      result.push(''); | 
						|
    } | 
						|
 | 
						|
    string.replace(rePropName, function (match, number, quote, string) { | 
						|
      result.push(quote ? string.replace(reEscapeChar, '$1') : number || match); | 
						|
    }); | 
						|
    return result; | 
						|
  }); | 
						|
  /** | 
						|
   * Converts `value` to a string key if it's not a string or symbol. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {*} value The value to inspect. | 
						|
   * @returns {string|symbol} Returns the key. | 
						|
   */ | 
						|
 | 
						|
  function toKey(value) { | 
						|
    if (typeof value == 'string' || isSymbol(value)) { | 
						|
      return value; | 
						|
    } | 
						|
 | 
						|
    var result = value + ''; | 
						|
    return result == '0' && 1 / value == -INFINITY ? '-0' : result; | 
						|
  } | 
						|
  /** | 
						|
   * Converts `func` to its source code. | 
						|
   * | 
						|
   * @private | 
						|
   * @param {Function} func The function to process. | 
						|
   * @returns {string} Returns the source code. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function toSource(func) { | 
						|
    if (func != null) { | 
						|
      try { | 
						|
        return funcToString.call(func); | 
						|
      } catch (e) {} | 
						|
 | 
						|
      try { | 
						|
        return func + ''; | 
						|
      } catch (e) {} | 
						|
    } | 
						|
 | 
						|
    return ''; | 
						|
  } | 
						|
  /** | 
						|
   * This method is like `_.uniq` except that it accepts `iteratee` which is | 
						|
   * invoked for each element in `array` to generate the criterion by which | 
						|
   * uniqueness is computed. The iteratee is invoked with one argument: (value). | 
						|
   * | 
						|
   * @static | 
						|
   * @memberOf _ | 
						|
   * @since 4.0.0 | 
						|
   * @category Array | 
						|
   * @param {Array} array The array to inspect. | 
						|
   * @param {Function} [iteratee=_.identity] | 
						|
   *  The iteratee invoked per element. | 
						|
   * @returns {Array} Returns the new duplicate free array. | 
						|
   * @example | 
						|
   * | 
						|
   * _.uniqBy([2.1, 1.2, 2.3], Math.floor); | 
						|
   * // => [2.1, 1.2] | 
						|
   * | 
						|
   * // The `_.property` iteratee shorthand. | 
						|
   * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x'); | 
						|
   * // => [{ 'x': 1 }, { 'x': 2 }] | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function uniqBy(array, iteratee) { | 
						|
    return array && array.length ? baseUniq(array, baseIteratee(iteratee)) : []; | 
						|
  } | 
						|
  /** | 
						|
   * Creates a function that memoizes the result of `func`. If `resolver` is | 
						|
   * provided, it determines the cache key for storing the result based on the | 
						|
   * arguments provided to the memoized function. By default, the first argument | 
						|
   * provided to the memoized function is used as the map cache key. The `func` | 
						|
   * is invoked with the `this` binding of the memoized function. | 
						|
   * | 
						|
   * **Note:** The cache is exposed as the `cache` property on the memoized | 
						|
   * function. Its creation may be customized by replacing the `_.memoize.Cache` | 
						|
   * constructor with one whose instances implement the | 
						|
   * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) | 
						|
   * method interface of `delete`, `get`, `has`, and `set`. | 
						|
   * | 
						|
   * @static | 
						|
   * @memberOf _ | 
						|
   * @since 0.1.0 | 
						|
   * @category Function | 
						|
   * @param {Function} func The function to have its output memoized. | 
						|
   * @param {Function} [resolver] The function to resolve the cache key. | 
						|
   * @returns {Function} Returns the new memoized function. | 
						|
   * @example | 
						|
   * | 
						|
   * var object = { 'a': 1, 'b': 2 }; | 
						|
   * var other = { 'c': 3, 'd': 4 }; | 
						|
   * | 
						|
   * var values = _.memoize(_.values); | 
						|
   * values(object); | 
						|
   * // => [1, 2] | 
						|
   * | 
						|
   * values(other); | 
						|
   * // => [3, 4] | 
						|
   * | 
						|
   * object.a = 2; | 
						|
   * values(object); | 
						|
   * // => [1, 2] | 
						|
   * | 
						|
   * // Modify the result cache. | 
						|
   * values.cache.set(object, ['a', 'b']); | 
						|
   * values(object); | 
						|
   * // => ['a', 'b'] | 
						|
   * | 
						|
   * // Replace `_.memoize.Cache`. | 
						|
   * _.memoize.Cache = WeakMap; | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function memoize(func, resolver) { | 
						|
    if (typeof func != 'function' || resolver && typeof resolver != 'function') { | 
						|
      throw new TypeError(FUNC_ERROR_TEXT); | 
						|
    } | 
						|
 | 
						|
    var memoized = function memoized() { | 
						|
      var args = arguments, | 
						|
          key = resolver ? resolver.apply(this, args) : args[0], | 
						|
          cache = memoized.cache; | 
						|
 | 
						|
      if (cache.has(key)) { | 
						|
        return cache.get(key); | 
						|
      } | 
						|
 | 
						|
      var result = func.apply(this, args); | 
						|
      memoized.cache = cache.set(key, result); | 
						|
      return result; | 
						|
    }; | 
						|
 | 
						|
    memoized.cache = new (memoize.Cache || MapCache)(); | 
						|
    return memoized; | 
						|
  } // Assign cache to `_.memoize`. | 
						|
 | 
						|
 | 
						|
  memoize.Cache = MapCache; | 
						|
  /** | 
						|
   * Performs a | 
						|
   * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) | 
						|
   * comparison between two values to determine if they are equivalent. | 
						|
   * | 
						|
   * @static | 
						|
   * @memberOf _ | 
						|
   * @since 4.0.0 | 
						|
   * @category Lang | 
						|
   * @param {*} value The value to compare. | 
						|
   * @param {*} other The other value to compare. | 
						|
   * @returns {boolean} Returns `true` if the values are equivalent, else `false`. | 
						|
   * @example | 
						|
   * | 
						|
   * var object = { 'a': 1 }; | 
						|
   * var other = { 'a': 1 }; | 
						|
   * | 
						|
   * _.eq(object, object); | 
						|
   * // => true | 
						|
   * | 
						|
   * _.eq(object, other); | 
						|
   * // => false | 
						|
   * | 
						|
   * _.eq('a', 'a'); | 
						|
   * // => true | 
						|
   * | 
						|
   * _.eq('a', Object('a')); | 
						|
   * // => false | 
						|
   * | 
						|
   * _.eq(NaN, NaN); | 
						|
   * // => true | 
						|
   */ | 
						|
 | 
						|
  function eq(value, other) { | 
						|
    return value === other || value !== value && other !== other; | 
						|
  } | 
						|
  /** | 
						|
   * Checks if `value` is likely an `arguments` object. | 
						|
   * | 
						|
   * @static | 
						|
   * @memberOf _ | 
						|
   * @since 0.1.0 | 
						|
   * @category Lang | 
						|
   * @param {*} value The value to check. | 
						|
   * @returns {boolean} Returns `true` if `value` is an `arguments` object, | 
						|
   *  else `false`. | 
						|
   * @example | 
						|
   * | 
						|
   * _.isArguments(function() { return arguments; }()); | 
						|
   * // => true | 
						|
   * | 
						|
   * _.isArguments([1, 2, 3]); | 
						|
   * // => false | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function isArguments(value) { | 
						|
    // Safari 8.1 makes `arguments.callee` enumerable in strict mode. | 
						|
    return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') && (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag); | 
						|
  } | 
						|
  /** | 
						|
   * Checks if `value` is classified as an `Array` object. | 
						|
   * | 
						|
   * @static | 
						|
   * @memberOf _ | 
						|
   * @since 0.1.0 | 
						|
   * @category Lang | 
						|
   * @param {*} value The value to check. | 
						|
   * @returns {boolean} Returns `true` if `value` is an array, else `false`. | 
						|
   * @example | 
						|
   * | 
						|
   * _.isArray([1, 2, 3]); | 
						|
   * // => true | 
						|
   * | 
						|
   * _.isArray(document.body.children); | 
						|
   * // => false | 
						|
   * | 
						|
   * _.isArray('abc'); | 
						|
   * // => false | 
						|
   * | 
						|
   * _.isArray(_.noop); | 
						|
   * // => false | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  var isArray = Array.isArray; | 
						|
  /** | 
						|
   * Checks if `value` is array-like. A value is considered array-like if it's | 
						|
   * not a function and has a `value.length` that's an integer greater than or | 
						|
   * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. | 
						|
   * | 
						|
   * @static | 
						|
   * @memberOf _ | 
						|
   * @since 4.0.0 | 
						|
   * @category Lang | 
						|
   * @param {*} value The value to check. | 
						|
   * @returns {boolean} Returns `true` if `value` is array-like, else `false`. | 
						|
   * @example | 
						|
   * | 
						|
   * _.isArrayLike([1, 2, 3]); | 
						|
   * // => true | 
						|
   * | 
						|
   * _.isArrayLike(document.body.children); | 
						|
   * // => true | 
						|
   * | 
						|
   * _.isArrayLike('abc'); | 
						|
   * // => true | 
						|
   * | 
						|
   * _.isArrayLike(_.noop); | 
						|
   * // => false | 
						|
   */ | 
						|
 | 
						|
  function isArrayLike(value) { | 
						|
    return value != null && isLength(value.length) && !isFunction(value); | 
						|
  } | 
						|
  /** | 
						|
   * This method is like `_.isArrayLike` except that it also checks if `value` | 
						|
   * is an object. | 
						|
   * | 
						|
   * @static | 
						|
   * @memberOf _ | 
						|
   * @since 4.0.0 | 
						|
   * @category Lang | 
						|
   * @param {*} value The value to check. | 
						|
   * @returns {boolean} Returns `true` if `value` is an array-like object, | 
						|
   *  else `false`. | 
						|
   * @example | 
						|
   * | 
						|
   * _.isArrayLikeObject([1, 2, 3]); | 
						|
   * // => true | 
						|
   * | 
						|
   * _.isArrayLikeObject(document.body.children); | 
						|
   * // => true | 
						|
   * | 
						|
   * _.isArrayLikeObject('abc'); | 
						|
   * // => false | 
						|
   * | 
						|
   * _.isArrayLikeObject(_.noop); | 
						|
   * // => false | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function isArrayLikeObject(value) { | 
						|
    return isObjectLike(value) && isArrayLike(value); | 
						|
  } | 
						|
  /** | 
						|
   * Checks if `value` is classified as a `Function` object. | 
						|
   * | 
						|
   * @static | 
						|
   * @memberOf _ | 
						|
   * @since 0.1.0 | 
						|
   * @category Lang | 
						|
   * @param {*} value The value to check. | 
						|
   * @returns {boolean} Returns `true` if `value` is a function, else `false`. | 
						|
   * @example | 
						|
   * | 
						|
   * _.isFunction(_); | 
						|
   * // => true | 
						|
   * | 
						|
   * _.isFunction(/abc/); | 
						|
   * // => false | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function isFunction(value) { | 
						|
    // The use of `Object#toString` avoids issues with the `typeof` operator | 
						|
    // in Safari 8-9 which returns 'object' for typed array and other constructors. | 
						|
    var tag = isObject(value) ? objectToString.call(value) : ''; | 
						|
    return tag == funcTag || tag == genTag; | 
						|
  } | 
						|
  /** | 
						|
   * Checks if `value` is a valid array-like length. | 
						|
   * | 
						|
   * **Note:** This method is loosely based on | 
						|
   * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). | 
						|
   * | 
						|
   * @static | 
						|
   * @memberOf _ | 
						|
   * @since 4.0.0 | 
						|
   * @category Lang | 
						|
   * @param {*} value The value to check. | 
						|
   * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. | 
						|
   * @example | 
						|
   * | 
						|
   * _.isLength(3); | 
						|
   * // => true | 
						|
   * | 
						|
   * _.isLength(Number.MIN_VALUE); | 
						|
   * // => false | 
						|
   * | 
						|
   * _.isLength(Infinity); | 
						|
   * // => false | 
						|
   * | 
						|
   * _.isLength('3'); | 
						|
   * // => false | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function isLength(value) { | 
						|
    return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; | 
						|
  } | 
						|
  /** | 
						|
   * Checks if `value` is the | 
						|
   * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) | 
						|
   * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) | 
						|
   * | 
						|
   * @static | 
						|
   * @memberOf _ | 
						|
   * @since 0.1.0 | 
						|
   * @category Lang | 
						|
   * @param {*} value The value to check. | 
						|
   * @returns {boolean} Returns `true` if `value` is an object, else `false`. | 
						|
   * @example | 
						|
   * | 
						|
   * _.isObject({}); | 
						|
   * // => true | 
						|
   * | 
						|
   * _.isObject([1, 2, 3]); | 
						|
   * // => true | 
						|
   * | 
						|
   * _.isObject(_.noop); | 
						|
   * // => true | 
						|
   * | 
						|
   * _.isObject(null); | 
						|
   * // => false | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function isObject(value) { | 
						|
    var type = typeof value; | 
						|
    return !!value && (type == 'object' || type == 'function'); | 
						|
  } | 
						|
  /** | 
						|
   * Checks if `value` is object-like. A value is object-like if it's not `null` | 
						|
   * and has a `typeof` result of "object". | 
						|
   * | 
						|
   * @static | 
						|
   * @memberOf _ | 
						|
   * @since 4.0.0 | 
						|
   * @category Lang | 
						|
   * @param {*} value The value to check. | 
						|
   * @returns {boolean} Returns `true` if `value` is object-like, else `false`. | 
						|
   * @example | 
						|
   * | 
						|
   * _.isObjectLike({}); | 
						|
   * // => true | 
						|
   * | 
						|
   * _.isObjectLike([1, 2, 3]); | 
						|
   * // => true | 
						|
   * | 
						|
   * _.isObjectLike(_.noop); | 
						|
   * // => false | 
						|
   * | 
						|
   * _.isObjectLike(null); | 
						|
   * // => false | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function isObjectLike(value) { | 
						|
    return !!value && typeof value == 'object'; | 
						|
  } | 
						|
  /** | 
						|
   * Checks if `value` is classified as a `Symbol` primitive or object. | 
						|
   * | 
						|
   * @static | 
						|
   * @memberOf _ | 
						|
   * @since 4.0.0 | 
						|
   * @category Lang | 
						|
   * @param {*} value The value to check. | 
						|
   * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. | 
						|
   * @example | 
						|
   * | 
						|
   * _.isSymbol(Symbol.iterator); | 
						|
   * // => true | 
						|
   * | 
						|
   * _.isSymbol('abc'); | 
						|
   * // => false | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function isSymbol(value) { | 
						|
    return typeof value == 'symbol' || isObjectLike(value) && objectToString.call(value) == symbolTag; | 
						|
  } | 
						|
  /** | 
						|
   * Checks if `value` is classified as a typed array. | 
						|
   * | 
						|
   * @static | 
						|
   * @memberOf _ | 
						|
   * @since 3.0.0 | 
						|
   * @category Lang | 
						|
   * @param {*} value The value to check. | 
						|
   * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. | 
						|
   * @example | 
						|
   * | 
						|
   * _.isTypedArray(new Uint8Array); | 
						|
   * // => true | 
						|
   * | 
						|
   * _.isTypedArray([]); | 
						|
   * // => false | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; | 
						|
  /** | 
						|
   * Converts `value` to a string. An empty string is returned for `null` | 
						|
   * and `undefined` values. The sign of `-0` is preserved. | 
						|
   * | 
						|
   * @static | 
						|
   * @memberOf _ | 
						|
   * @since 4.0.0 | 
						|
   * @category Lang | 
						|
   * @param {*} value The value to process. | 
						|
   * @returns {string} Returns the string. | 
						|
   * @example | 
						|
   * | 
						|
   * _.toString(null); | 
						|
   * // => '' | 
						|
   * | 
						|
   * _.toString(-0); | 
						|
   * // => '-0' | 
						|
   * | 
						|
   * _.toString([1, 2, 3]); | 
						|
   * // => '1,2,3' | 
						|
   */ | 
						|
 | 
						|
  function toString(value) { | 
						|
    return value == null ? '' : baseToString(value); | 
						|
  } | 
						|
  /** | 
						|
   * Gets the value at `path` of `object`. If the resolved value is | 
						|
   * `undefined`, the `defaultValue` is returned in its place. | 
						|
   * | 
						|
   * @static | 
						|
   * @memberOf _ | 
						|
   * @since 3.7.0 | 
						|
   * @category Object | 
						|
   * @param {Object} object The object to query. | 
						|
   * @param {Array|string} path The path of the property to get. | 
						|
   * @param {*} [defaultValue] The value returned for `undefined` resolved values. | 
						|
   * @returns {*} Returns the resolved value. | 
						|
   * @example | 
						|
   * | 
						|
   * var object = { 'a': [{ 'b': { 'c': 3 } }] }; | 
						|
   * | 
						|
   * _.get(object, 'a[0].b.c'); | 
						|
   * // => 3 | 
						|
   * | 
						|
   * _.get(object, ['a', '0', 'b', 'c']); | 
						|
   * // => 3 | 
						|
   * | 
						|
   * _.get(object, 'a.b.c', 'default'); | 
						|
   * // => 'default' | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function get(object, path, defaultValue) { | 
						|
    var result = object == null ? undefined : baseGet(object, path); | 
						|
    return result === undefined ? defaultValue : result; | 
						|
  } | 
						|
  /** | 
						|
   * Checks if `path` is a direct or inherited property of `object`. | 
						|
   * | 
						|
   * @static | 
						|
   * @memberOf _ | 
						|
   * @since 4.0.0 | 
						|
   * @category Object | 
						|
   * @param {Object} object The object to query. | 
						|
   * @param {Array|string} path The path to check. | 
						|
   * @returns {boolean} Returns `true` if `path` exists, else `false`. | 
						|
   * @example | 
						|
   * | 
						|
   * var object = _.create({ 'a': _.create({ 'b': 2 }) }); | 
						|
   * | 
						|
   * _.hasIn(object, 'a'); | 
						|
   * // => true | 
						|
   * | 
						|
   * _.hasIn(object, 'a.b'); | 
						|
   * // => true | 
						|
   * | 
						|
   * _.hasIn(object, ['a', 'b']); | 
						|
   * // => true | 
						|
   * | 
						|
   * _.hasIn(object, 'b'); | 
						|
   * // => false | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function hasIn(object, path) { | 
						|
    return object != null && hasPath(object, path, baseHasIn); | 
						|
  } | 
						|
  /** | 
						|
   * Creates an array of the own enumerable property names of `object`. | 
						|
   * | 
						|
   * **Note:** Non-object values are coerced to objects. See the | 
						|
   * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) | 
						|
   * for more details. | 
						|
   * | 
						|
   * @static | 
						|
   * @since 0.1.0 | 
						|
   * @memberOf _ | 
						|
   * @category Object | 
						|
   * @param {Object} object The object to query. | 
						|
   * @returns {Array} Returns the array of property names. | 
						|
   * @example | 
						|
   * | 
						|
   * function Foo() { | 
						|
   *   this.a = 1; | 
						|
   *   this.b = 2; | 
						|
   * } | 
						|
   * | 
						|
   * Foo.prototype.c = 3; | 
						|
   * | 
						|
   * _.keys(new Foo); | 
						|
   * // => ['a', 'b'] (iteration order is not guaranteed) | 
						|
   * | 
						|
   * _.keys('hi'); | 
						|
   * // => ['0', '1'] | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function keys(object) { | 
						|
    return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); | 
						|
  } | 
						|
  /** | 
						|
   * This method returns the first argument it receives. | 
						|
   * | 
						|
   * @static | 
						|
   * @since 0.1.0 | 
						|
   * @memberOf _ | 
						|
   * @category Util | 
						|
   * @param {*} value Any value. | 
						|
   * @returns {*} Returns `value`. | 
						|
   * @example | 
						|
   * | 
						|
   * var object = { 'a': 1 }; | 
						|
   * | 
						|
   * console.log(_.identity(object) === object); | 
						|
   * // => true | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function identity(value) { | 
						|
    return value; | 
						|
  } | 
						|
  /** | 
						|
   * This method returns `undefined`. | 
						|
   * | 
						|
   * @static | 
						|
   * @memberOf _ | 
						|
   * @since 2.3.0 | 
						|
   * @category Util | 
						|
   * @example | 
						|
   * | 
						|
   * _.times(2, _.noop); | 
						|
   * // => [undefined, undefined] | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function noop() {} // No operation performed. | 
						|
 | 
						|
  /** | 
						|
   * Creates a function that returns the value at `path` of a given object. | 
						|
   * | 
						|
   * @static | 
						|
   * @memberOf _ | 
						|
   * @since 2.4.0 | 
						|
   * @category Util | 
						|
   * @param {Array|string} path The path of the property to get. | 
						|
   * @returns {Function} Returns the new accessor function. | 
						|
   * @example | 
						|
   * | 
						|
   * var objects = [ | 
						|
   *   { 'a': { 'b': 2 } }, | 
						|
   *   { 'a': { 'b': 1 } } | 
						|
   * ]; | 
						|
   * | 
						|
   * _.map(objects, _.property('a.b')); | 
						|
   * // => [2, 1] | 
						|
   * | 
						|
   * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b'); | 
						|
   * // => [1, 2] | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  function property(path) { | 
						|
    return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path); | 
						|
  } | 
						|
 | 
						|
  module.exports = uniqBy; | 
						|
}); | 
						|
 | 
						|
var PENDING = 'pending'; | 
						|
var SETTLED = 'settled'; | 
						|
var FULFILLED = 'fulfilled'; | 
						|
var REJECTED = 'rejected'; | 
						|
 | 
						|
var NOOP = function NOOP() {}; | 
						|
 | 
						|
var isNode = typeof global !== 'undefined' && typeof global.process !== 'undefined' && typeof global.process.emit === 'function'; | 
						|
var asyncSetTimer = typeof setImmediate === 'undefined' ? setTimeout : setImmediate; | 
						|
var asyncQueue = []; | 
						|
var asyncTimer; | 
						|
 | 
						|
function asyncFlush() { | 
						|
  // run promise callbacks | 
						|
  for (var i = 0; i < asyncQueue.length; i++) { | 
						|
    asyncQueue[i][0](asyncQueue[i][1]); | 
						|
  } // reset async asyncQueue | 
						|
 | 
						|
 | 
						|
  asyncQueue = []; | 
						|
  asyncTimer = false; | 
						|
} | 
						|
 | 
						|
function asyncCall(callback, arg) { | 
						|
  asyncQueue.push([callback, arg]); | 
						|
 | 
						|
  if (!asyncTimer) { | 
						|
    asyncTimer = true; | 
						|
    asyncSetTimer(asyncFlush, 0); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function invokeResolver(resolver, promise) { | 
						|
  function resolvePromise(value) { | 
						|
    resolve$1(promise, value); | 
						|
  } | 
						|
 | 
						|
  function rejectPromise(reason) { | 
						|
    reject(promise, reason); | 
						|
  } | 
						|
 | 
						|
  try { | 
						|
    resolver(resolvePromise, rejectPromise); | 
						|
  } catch (e) { | 
						|
    rejectPromise(e); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function invokeCallback(subscriber) { | 
						|
  var owner = subscriber.owner; | 
						|
  var settled = owner._state; | 
						|
  var value = owner._data; | 
						|
  var callback = subscriber[settled]; | 
						|
  var promise = subscriber.then; | 
						|
 | 
						|
  if (typeof callback === 'function') { | 
						|
    settled = FULFILLED; | 
						|
 | 
						|
    try { | 
						|
      value = callback(value); | 
						|
    } catch (e) { | 
						|
      reject(promise, e); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  if (!handleThenable(promise, value)) { | 
						|
    if (settled === FULFILLED) { | 
						|
      resolve$1(promise, value); | 
						|
    } | 
						|
 | 
						|
    if (settled === REJECTED) { | 
						|
      reject(promise, value); | 
						|
    } | 
						|
  } | 
						|
} | 
						|
 | 
						|
function handleThenable(promise, value) { | 
						|
  var resolved; | 
						|
 | 
						|
  try { | 
						|
    if (promise === value) { | 
						|
      throw new TypeError('A promises callback cannot return that same promise.'); | 
						|
    } | 
						|
 | 
						|
    if (value && (typeof value === 'function' || typeof value === 'object')) { | 
						|
      // then should be retrieved only once | 
						|
      var then = value.then; | 
						|
 | 
						|
      if (typeof then === 'function') { | 
						|
        then.call(value, function (val) { | 
						|
          if (!resolved) { | 
						|
            resolved = true; | 
						|
 | 
						|
            if (value === val) { | 
						|
              fulfill(promise, val); | 
						|
            } else { | 
						|
              resolve$1(promise, val); | 
						|
            } | 
						|
          } | 
						|
        }, function (reason) { | 
						|
          if (!resolved) { | 
						|
            resolved = true; | 
						|
            reject(promise, reason); | 
						|
          } | 
						|
        }); | 
						|
        return true; | 
						|
      } | 
						|
    } | 
						|
  } catch (e) { | 
						|
    if (!resolved) { | 
						|
      reject(promise, e); | 
						|
    } | 
						|
 | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function resolve$1(promise, value) { | 
						|
  if (promise === value || !handleThenable(promise, value)) { | 
						|
    fulfill(promise, value); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function fulfill(promise, value) { | 
						|
  if (promise._state === PENDING) { | 
						|
    promise._state = SETTLED; | 
						|
    promise._data = value; | 
						|
    asyncCall(publishFulfillment, promise); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function reject(promise, reason) { | 
						|
  if (promise._state === PENDING) { | 
						|
    promise._state = SETTLED; | 
						|
    promise._data = reason; | 
						|
    asyncCall(publishRejection, promise); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function publish(promise) { | 
						|
  promise._then = promise._then.forEach(invokeCallback); | 
						|
} | 
						|
 | 
						|
function publishFulfillment(promise) { | 
						|
  promise._state = FULFILLED; | 
						|
  publish(promise); | 
						|
} | 
						|
 | 
						|
function publishRejection(promise) { | 
						|
  promise._state = REJECTED; | 
						|
  publish(promise); | 
						|
 | 
						|
  if (!promise._handled && isNode) { | 
						|
    global.process.emit('unhandledRejection', promise._data, promise); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function notifyRejectionHandled(promise) { | 
						|
  global.process.emit('rejectionHandled', promise); | 
						|
} | 
						|
/** | 
						|
 * @class | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function Promise$1(resolver) { | 
						|
  if (typeof resolver !== 'function') { | 
						|
    throw new TypeError('Promise resolver ' + resolver + ' is not a function'); | 
						|
  } | 
						|
 | 
						|
  if (this instanceof Promise$1 === false) { | 
						|
    throw new TypeError('Failed to construct \'Promise\': Please use the \'new\' operator, this object constructor cannot be called as a function.'); | 
						|
  } | 
						|
 | 
						|
  this._then = []; | 
						|
  invokeResolver(resolver, this); | 
						|
} | 
						|
 | 
						|
Promise$1.prototype = { | 
						|
  constructor: Promise$1, | 
						|
  _state: PENDING, | 
						|
  _then: null, | 
						|
  _data: undefined, | 
						|
  _handled: false, | 
						|
  then: function then(onFulfillment, onRejection) { | 
						|
    var subscriber = { | 
						|
      owner: this, | 
						|
      then: new this.constructor(NOOP), | 
						|
      fulfilled: onFulfillment, | 
						|
      rejected: onRejection | 
						|
    }; | 
						|
 | 
						|
    if ((onRejection || onFulfillment) && !this._handled) { | 
						|
      this._handled = true; | 
						|
 | 
						|
      if (this._state === REJECTED && isNode) { | 
						|
        asyncCall(notifyRejectionHandled, this); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    if (this._state === FULFILLED || this._state === REJECTED) { | 
						|
      // already resolved, call callback async | 
						|
      asyncCall(invokeCallback, subscriber); | 
						|
    } else { | 
						|
      // subscribe | 
						|
      this._then.push(subscriber); | 
						|
    } | 
						|
 | 
						|
    return subscriber.then; | 
						|
  }, | 
						|
  catch: function _catch(onRejection) { | 
						|
    return this.then(null, onRejection); | 
						|
  } | 
						|
}; | 
						|
 | 
						|
Promise$1.all = function (promises) { | 
						|
  if (!Array.isArray(promises)) { | 
						|
    throw new TypeError('You must pass an array to Promise.all().'); | 
						|
  } | 
						|
 | 
						|
  return new Promise$1(function (resolve, reject) { | 
						|
    var results = []; | 
						|
    var remaining = 0; | 
						|
 | 
						|
    function resolver(index) { | 
						|
      remaining++; | 
						|
      return function (value) { | 
						|
        results[index] = value; | 
						|
 | 
						|
        if (! --remaining) { | 
						|
          resolve(results); | 
						|
        } | 
						|
      }; | 
						|
    } | 
						|
 | 
						|
    for (var i = 0, promise; i < promises.length; i++) { | 
						|
      promise = promises[i]; | 
						|
 | 
						|
      if (promise && typeof promise.then === 'function') { | 
						|
        promise.then(resolver(i), reject); | 
						|
      } else { | 
						|
        results[i] = promise; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    if (!remaining) { | 
						|
      resolve(results); | 
						|
    } | 
						|
  }); | 
						|
}; | 
						|
 | 
						|
Promise$1.race = function (promises) { | 
						|
  if (!Array.isArray(promises)) { | 
						|
    throw new TypeError('You must pass an array to Promise.race().'); | 
						|
  } | 
						|
 | 
						|
  return new Promise$1(function (resolve, reject) { | 
						|
    for (var i = 0, promise; i < promises.length; i++) { | 
						|
      promise = promises[i]; | 
						|
 | 
						|
      if (promise && typeof promise.then === 'function') { | 
						|
        promise.then(resolve, reject); | 
						|
      } else { | 
						|
        resolve(promise); | 
						|
      } | 
						|
    } | 
						|
  }); | 
						|
}; | 
						|
 | 
						|
Promise$1.resolve = function (value) { | 
						|
  if (value && typeof value === 'object' && value.constructor === Promise$1) { | 
						|
    return value; | 
						|
  } | 
						|
 | 
						|
  return new Promise$1(function (resolve) { | 
						|
    resolve(value); | 
						|
  }); | 
						|
}; | 
						|
 | 
						|
Promise$1.reject = function (reason) { | 
						|
  return new Promise$1(function (resolve, reject) { | 
						|
    reject(reason); | 
						|
  }); | 
						|
}; | 
						|
 | 
						|
var pinkie = Promise$1; | 
						|
 | 
						|
var pinkiePromise = typeof Promise === 'function' ? Promise : pinkie; | 
						|
 | 
						|
var arrayUniq = createCommonjsModule(function (module) { | 
						|
  // 1 - no Set type is defined | 
						|
 | 
						|
  function uniqNoSet(arr) { | 
						|
    var ret = []; | 
						|
 | 
						|
    for (var i = 0; i < arr.length; i++) { | 
						|
      if (ret.indexOf(arr[i]) === -1) { | 
						|
        ret.push(arr[i]); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return ret; | 
						|
  } // 2 - a simple Set type is defined | 
						|
 | 
						|
 | 
						|
  function uniqSet(arr) { | 
						|
    var seen = new Set(); | 
						|
    return arr.filter(function (el) { | 
						|
      if (!seen.has(el)) { | 
						|
        seen.add(el); | 
						|
        return true; | 
						|
      } | 
						|
 | 
						|
      return false; | 
						|
    }); | 
						|
  } // 3 - a standard Set type is defined and it has a forEach method | 
						|
 | 
						|
 | 
						|
  function uniqSetWithForEach(arr) { | 
						|
    var ret = []; | 
						|
    new Set(arr).forEach(function (el) { | 
						|
      ret.push(el); | 
						|
    }); | 
						|
    return ret; | 
						|
  } // V8 currently has a broken implementation | 
						|
  // https://github.com/joyent/node/issues/8449 | 
						|
 | 
						|
 | 
						|
  function doesForEachActuallyWork() { | 
						|
    var ret = false; | 
						|
    new Set([true]).forEach(function (el) { | 
						|
      ret = el; | 
						|
    }); | 
						|
    return ret === true; | 
						|
  } | 
						|
 | 
						|
  if ('Set' in global) { | 
						|
    if (typeof Set.prototype.forEach === 'function' && doesForEachActuallyWork()) { | 
						|
      module.exports = uniqSetWithForEach; | 
						|
    } else { | 
						|
      module.exports = uniqSet; | 
						|
    } | 
						|
  } else { | 
						|
    module.exports = uniqNoSet; | 
						|
  } | 
						|
}); | 
						|
 | 
						|
var arrayUnion = function arrayUnion() { | 
						|
  return arrayUniq([].concat.apply([], arguments)); | 
						|
}; | 
						|
 | 
						|
/* | 
						|
object-assign | 
						|
(c) Sindre Sorhus | 
						|
@license MIT | 
						|
*/ | 
						|
/* eslint-disable no-unused-vars */ | 
						|
 | 
						|
var getOwnPropertySymbols = Object.getOwnPropertySymbols; | 
						|
var hasOwnProperty$2 = Object.prototype.hasOwnProperty; | 
						|
var propIsEnumerable = Object.prototype.propertyIsEnumerable; | 
						|
 | 
						|
function toObject(val) { | 
						|
  if (val === null || val === undefined) { | 
						|
    throw new TypeError('Object.assign cannot be called with null or undefined'); | 
						|
  } | 
						|
 | 
						|
  return Object(val); | 
						|
} | 
						|
 | 
						|
function shouldUseNative() { | 
						|
  try { | 
						|
    if (!Object.assign) { | 
						|
      return false; | 
						|
    } // Detect buggy property enumeration order in older V8 versions. | 
						|
    // https://bugs.chromium.org/p/v8/issues/detail?id=4118 | 
						|
 | 
						|
 | 
						|
    var test1 = new String('abc'); // eslint-disable-line no-new-wrappers | 
						|
 | 
						|
    test1[5] = 'de'; | 
						|
 | 
						|
    if (Object.getOwnPropertyNames(test1)[0] === '5') { | 
						|
      return false; | 
						|
    } // https://bugs.chromium.org/p/v8/issues/detail?id=3056 | 
						|
 | 
						|
 | 
						|
    var test2 = {}; | 
						|
 | 
						|
    for (var i = 0; i < 10; i++) { | 
						|
      test2['_' + String.fromCharCode(i)] = i; | 
						|
    } | 
						|
 | 
						|
    var order2 = Object.getOwnPropertyNames(test2).map(function (n) { | 
						|
      return test2[n]; | 
						|
    }); | 
						|
 | 
						|
    if (order2.join('') !== '0123456789') { | 
						|
      return false; | 
						|
    } // https://bugs.chromium.org/p/v8/issues/detail?id=3056 | 
						|
 | 
						|
 | 
						|
    var test3 = {}; | 
						|
    'abcdefghijklmnopqrst'.split('').forEach(function (letter) { | 
						|
      test3[letter] = letter; | 
						|
    }); | 
						|
 | 
						|
    if (Object.keys(Object.assign({}, test3)).join('') !== 'abcdefghijklmnopqrst') { | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    return true; | 
						|
  } catch (err) { | 
						|
    // We don't expect any of the above to throw, but better to be safe. | 
						|
    return false; | 
						|
  } | 
						|
} | 
						|
 | 
						|
var objectAssign = shouldUseNative() ? Object.assign : function (target, source) { | 
						|
  var from; | 
						|
  var to = toObject(target); | 
						|
  var symbols; | 
						|
 | 
						|
  for (var s = 1; s < arguments.length; s++) { | 
						|
    from = Object(arguments[s]); | 
						|
 | 
						|
    for (var key in from) { | 
						|
      if (hasOwnProperty$2.call(from, key)) { | 
						|
        to[key] = from[key]; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    if (getOwnPropertySymbols) { | 
						|
      symbols = getOwnPropertySymbols(from); | 
						|
 | 
						|
      for (var i = 0; i < symbols.length; i++) { | 
						|
        if (propIsEnumerable.call(from, symbols[i])) { | 
						|
          to[symbols[i]] = from[symbols[i]]; | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return to; | 
						|
}; | 
						|
 | 
						|
// | 
						|
// Permission is hereby granted, free of charge, to any person obtaining a | 
						|
// copy of this software and associated documentation files (the | 
						|
// "Software"), to deal in the Software without restriction, including | 
						|
// without limitation the rights to use, copy, modify, merge, publish, | 
						|
// distribute, sublicense, and/or sell copies of the Software, and to permit | 
						|
// persons to whom the Software is furnished to do so, subject to the | 
						|
// following conditions: | 
						|
// | 
						|
// The above copyright notice and this permission notice shall be included | 
						|
// in all copies or substantial portions of the Software. | 
						|
// | 
						|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | 
						|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | 
						|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN | 
						|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, | 
						|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR | 
						|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE | 
						|
// USE OR OTHER DEALINGS IN THE SOFTWARE. | 
						|
 | 
						|
var isWindows = process.platform === 'win32'; // JavaScript implementation of realpath, ported from node pre-v6 | 
						|
 | 
						|
var DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG); | 
						|
 | 
						|
function rethrow() { | 
						|
  // Only enable in debug mode. A backtrace uses ~1000 bytes of heap space and | 
						|
  // is fairly slow to generate. | 
						|
  var callback; | 
						|
 | 
						|
  if (DEBUG) { | 
						|
    var backtrace = new Error(); | 
						|
    callback = debugCallback; | 
						|
  } else callback = missingCallback; | 
						|
 | 
						|
  return callback; | 
						|
 | 
						|
  function debugCallback(err) { | 
						|
    if (err) { | 
						|
      backtrace.message = err.message; | 
						|
      err = backtrace; | 
						|
      missingCallback(err); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  function missingCallback(err) { | 
						|
    if (err) { | 
						|
      if (process.throwDeprecation) throw err; // Forgot a callback but don't know where? Use NODE_DEBUG=fs | 
						|
      else if (!process.noDeprecation) { | 
						|
          var msg = 'fs: missing callback ' + (err.stack || err.message); | 
						|
          if (process.traceDeprecation) console.trace(msg);else console.error(msg); | 
						|
        } | 
						|
    } | 
						|
  } | 
						|
} | 
						|
 | 
						|
function maybeCallback(cb) { | 
						|
  return typeof cb === 'function' ? cb : rethrow(); | 
						|
} | 
						|
 | 
						|
var normalize$3 = path$2.normalize; // Regexp that finds the next partion of a (partial) path | 
						|
// result is [base_with_slash, base], e.g. ['somedir/', 'somedir'] | 
						|
 | 
						|
if (isWindows) { | 
						|
  var nextPartRe = /(.*?)(?:[\/\\]+|$)/g; | 
						|
} else { | 
						|
  var nextPartRe = /(.*?)(?:[\/]+|$)/g; | 
						|
} // Regex to find the device root, including trailing slash. E.g. 'c:\\'. | 
						|
 | 
						|
 | 
						|
if (isWindows) { | 
						|
  var splitRootRe = /^(?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?[\\\/]*/; | 
						|
} else { | 
						|
  var splitRootRe = /^[\/]*/; | 
						|
} | 
						|
 | 
						|
var realpathSync = function realpathSync(p, cache) { | 
						|
  // make p is absolute | 
						|
  p = path$2.resolve(p); | 
						|
 | 
						|
  if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { | 
						|
    return cache[p]; | 
						|
  } | 
						|
 | 
						|
  var original = p, | 
						|
      seenLinks = {}, | 
						|
      knownHard = {}; // current character position in p | 
						|
 | 
						|
  var pos; // the partial path so far, including a trailing slash if any | 
						|
 | 
						|
  var current; // the partial path without a trailing slash (except when pointing at a root) | 
						|
 | 
						|
  var base; // the partial path scanned in the previous round, with slash | 
						|
 | 
						|
  var previous; | 
						|
  start(); | 
						|
 | 
						|
  function start() { | 
						|
    // Skip over roots | 
						|
    var m = splitRootRe.exec(p); | 
						|
    pos = m[0].length; | 
						|
    current = m[0]; | 
						|
    base = m[0]; | 
						|
    previous = ''; // On windows, check that the root exists. On unix there is no need. | 
						|
 | 
						|
    if (isWindows && !knownHard[base]) { | 
						|
      fs$1.lstatSync(base); | 
						|
      knownHard[base] = true; | 
						|
    } | 
						|
  } // walk down the path, swapping out linked pathparts for their real | 
						|
  // values | 
						|
  // NB: p.length changes. | 
						|
 | 
						|
 | 
						|
  while (pos < p.length) { | 
						|
    // find the next part | 
						|
    nextPartRe.lastIndex = pos; | 
						|
    var result = nextPartRe.exec(p); | 
						|
    previous = current; | 
						|
    current += result[0]; | 
						|
    base = previous + result[1]; | 
						|
    pos = nextPartRe.lastIndex; // continue if not a symlink | 
						|
 | 
						|
    if (knownHard[base] || cache && cache[base] === base) { | 
						|
      continue; | 
						|
    } | 
						|
 | 
						|
    var resolvedLink; | 
						|
 | 
						|
    if (cache && Object.prototype.hasOwnProperty.call(cache, base)) { | 
						|
      // some known symbolic link.  no need to stat again. | 
						|
      resolvedLink = cache[base]; | 
						|
    } else { | 
						|
      var stat = fs$1.lstatSync(base); | 
						|
 | 
						|
      if (!stat.isSymbolicLink()) { | 
						|
        knownHard[base] = true; | 
						|
        if (cache) cache[base] = base; | 
						|
        continue; | 
						|
      } // read the link if it wasn't read before | 
						|
      // dev/ino always return 0 on windows, so skip the check. | 
						|
 | 
						|
 | 
						|
      var linkTarget = null; | 
						|
 | 
						|
      if (!isWindows) { | 
						|
        var id = stat.dev.toString(32) + ':' + stat.ino.toString(32); | 
						|
 | 
						|
        if (seenLinks.hasOwnProperty(id)) { | 
						|
          linkTarget = seenLinks[id]; | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      if (linkTarget === null) { | 
						|
        fs$1.statSync(base); | 
						|
        linkTarget = fs$1.readlinkSync(base); | 
						|
      } | 
						|
 | 
						|
      resolvedLink = path$2.resolve(previous, linkTarget); // track this, if given a cache. | 
						|
 | 
						|
      if (cache) cache[base] = resolvedLink; | 
						|
      if (!isWindows) seenLinks[id] = linkTarget; | 
						|
    } // resolve the link, then start over | 
						|
 | 
						|
 | 
						|
    p = path$2.resolve(resolvedLink, p.slice(pos)); | 
						|
    start(); | 
						|
  } | 
						|
 | 
						|
  if (cache) cache[original] = p; | 
						|
  return p; | 
						|
}; | 
						|
 | 
						|
var realpath = function realpath(p, cache, cb) { | 
						|
  if (typeof cb !== 'function') { | 
						|
    cb = maybeCallback(cache); | 
						|
    cache = null; | 
						|
  } // make p is absolute | 
						|
 | 
						|
 | 
						|
  p = path$2.resolve(p); | 
						|
 | 
						|
  if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { | 
						|
    return process.nextTick(cb.bind(null, null, cache[p])); | 
						|
  } | 
						|
 | 
						|
  var original = p, | 
						|
      seenLinks = {}, | 
						|
      knownHard = {}; // current character position in p | 
						|
 | 
						|
  var pos; // the partial path so far, including a trailing slash if any | 
						|
 | 
						|
  var current; // the partial path without a trailing slash (except when pointing at a root) | 
						|
 | 
						|
  var base; // the partial path scanned in the previous round, with slash | 
						|
 | 
						|
  var previous; | 
						|
  start(); | 
						|
 | 
						|
  function start() { | 
						|
    // Skip over roots | 
						|
    var m = splitRootRe.exec(p); | 
						|
    pos = m[0].length; | 
						|
    current = m[0]; | 
						|
    base = m[0]; | 
						|
    previous = ''; // On windows, check that the root exists. On unix there is no need. | 
						|
 | 
						|
    if (isWindows && !knownHard[base]) { | 
						|
      fs$1.lstat(base, function (err) { | 
						|
        if (err) return cb(err); | 
						|
        knownHard[base] = true; | 
						|
        LOOP(); | 
						|
      }); | 
						|
    } else { | 
						|
      process.nextTick(LOOP); | 
						|
    } | 
						|
  } // walk down the path, swapping out linked pathparts for their real | 
						|
  // values | 
						|
 | 
						|
 | 
						|
  function LOOP() { | 
						|
    // stop if scanned past end of path | 
						|
    if (pos >= p.length) { | 
						|
      if (cache) cache[original] = p; | 
						|
      return cb(null, p); | 
						|
    } // find the next part | 
						|
 | 
						|
 | 
						|
    nextPartRe.lastIndex = pos; | 
						|
    var result = nextPartRe.exec(p); | 
						|
    previous = current; | 
						|
    current += result[0]; | 
						|
    base = previous + result[1]; | 
						|
    pos = nextPartRe.lastIndex; // continue if not a symlink | 
						|
 | 
						|
    if (knownHard[base] || cache && cache[base] === base) { | 
						|
      return process.nextTick(LOOP); | 
						|
    } | 
						|
 | 
						|
    if (cache && Object.prototype.hasOwnProperty.call(cache, base)) { | 
						|
      // known symbolic link.  no need to stat again. | 
						|
      return gotResolvedLink(cache[base]); | 
						|
    } | 
						|
 | 
						|
    return fs$1.lstat(base, gotStat); | 
						|
  } | 
						|
 | 
						|
  function gotStat(err, stat) { | 
						|
    if (err) return cb(err); // if not a symlink, skip to the next path part | 
						|
 | 
						|
    if (!stat.isSymbolicLink()) { | 
						|
      knownHard[base] = true; | 
						|
      if (cache) cache[base] = base; | 
						|
      return process.nextTick(LOOP); | 
						|
    } // stat & read the link if not read before | 
						|
    // call gotTarget as soon as the link target is known | 
						|
    // dev/ino always return 0 on windows, so skip the check. | 
						|
 | 
						|
 | 
						|
    if (!isWindows) { | 
						|
      var id = stat.dev.toString(32) + ':' + stat.ino.toString(32); | 
						|
 | 
						|
      if (seenLinks.hasOwnProperty(id)) { | 
						|
        return gotTarget(null, seenLinks[id], base); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    fs$1.stat(base, function (err) { | 
						|
      if (err) return cb(err); | 
						|
      fs$1.readlink(base, function (err, target) { | 
						|
        if (!isWindows) seenLinks[id] = target; | 
						|
        gotTarget(err, target); | 
						|
      }); | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  function gotTarget(err, target, base) { | 
						|
    if (err) return cb(err); | 
						|
    var resolvedLink = path$2.resolve(previous, target); | 
						|
    if (cache) cache[base] = resolvedLink; | 
						|
    gotResolvedLink(resolvedLink); | 
						|
  } | 
						|
 | 
						|
  function gotResolvedLink(resolvedLink) { | 
						|
    // resolve the link, then start over | 
						|
    p = path$2.resolve(resolvedLink, p.slice(pos)); | 
						|
    start(); | 
						|
  } | 
						|
}; | 
						|
 | 
						|
var old = { | 
						|
  realpathSync: realpathSync, | 
						|
  realpath: realpath | 
						|
}; | 
						|
 | 
						|
var fs_realpath = realpath$1; | 
						|
realpath$1.realpath = realpath$1; | 
						|
realpath$1.sync = realpathSync$1; | 
						|
realpath$1.realpathSync = realpathSync$1; | 
						|
realpath$1.monkeypatch = monkeypatch; | 
						|
realpath$1.unmonkeypatch = unmonkeypatch; | 
						|
var origRealpath = fs$1.realpath; | 
						|
var origRealpathSync = fs$1.realpathSync; | 
						|
var version$2 = process.version; | 
						|
var ok = /^v[0-5]\./.test(version$2); | 
						|
 | 
						|
function newError(er) { | 
						|
  return er && er.syscall === 'realpath' && (er.code === 'ELOOP' || er.code === 'ENOMEM' || er.code === 'ENAMETOOLONG'); | 
						|
} | 
						|
 | 
						|
function realpath$1(p, cache, cb) { | 
						|
  if (ok) { | 
						|
    return origRealpath(p, cache, cb); | 
						|
  } | 
						|
 | 
						|
  if (typeof cache === 'function') { | 
						|
    cb = cache; | 
						|
    cache = null; | 
						|
  } | 
						|
 | 
						|
  origRealpath(p, cache, function (er, result) { | 
						|
    if (newError(er)) { | 
						|
      old.realpath(p, cache, cb); | 
						|
    } else { | 
						|
      cb(er, result); | 
						|
    } | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function realpathSync$1(p, cache) { | 
						|
  if (ok) { | 
						|
    return origRealpathSync(p, cache); | 
						|
  } | 
						|
 | 
						|
  try { | 
						|
    return origRealpathSync(p, cache); | 
						|
  } catch (er) { | 
						|
    if (newError(er)) { | 
						|
      return old.realpathSync(p, cache); | 
						|
    } else { | 
						|
      throw er; | 
						|
    } | 
						|
  } | 
						|
} | 
						|
 | 
						|
function monkeypatch() { | 
						|
  fs$1.realpath = realpath$1; | 
						|
  fs$1.realpathSync = realpathSync$1; | 
						|
} | 
						|
 | 
						|
function unmonkeypatch() { | 
						|
  fs$1.realpath = origRealpath; | 
						|
  fs$1.realpathSync = origRealpathSync; | 
						|
} | 
						|
 | 
						|
var inherits_browser = createCommonjsModule(function (module) { | 
						|
  if (typeof Object.create === 'function') { | 
						|
    // implementation from standard node.js 'util' module | 
						|
    module.exports = function inherits(ctor, superCtor) { | 
						|
      if (superCtor) { | 
						|
        ctor.super_ = superCtor; | 
						|
        ctor.prototype = Object.create(superCtor.prototype, { | 
						|
          constructor: { | 
						|
            value: ctor, | 
						|
            enumerable: false, | 
						|
            writable: true, | 
						|
            configurable: true | 
						|
          } | 
						|
        }); | 
						|
      } | 
						|
    }; | 
						|
  } else { | 
						|
    // old school shim for old browsers | 
						|
    module.exports = function inherits(ctor, superCtor) { | 
						|
      if (superCtor) { | 
						|
        ctor.super_ = superCtor; | 
						|
 | 
						|
        var TempCtor = function TempCtor() {}; | 
						|
 | 
						|
        TempCtor.prototype = superCtor.prototype; | 
						|
        ctor.prototype = new TempCtor(); | 
						|
        ctor.prototype.constructor = ctor; | 
						|
      } | 
						|
    }; | 
						|
  } | 
						|
}); | 
						|
 | 
						|
var inherits = createCommonjsModule(function (module) { | 
						|
  try { | 
						|
    var util = util$2; | 
						|
    /* istanbul ignore next */ | 
						|
 | 
						|
    if (typeof util.inherits !== 'function') throw ''; | 
						|
    module.exports = util.inherits; | 
						|
  } catch (e) { | 
						|
    /* istanbul ignore next */ | 
						|
    module.exports = inherits_browser; | 
						|
  } | 
						|
}); | 
						|
 | 
						|
function posix(path) { | 
						|
  return path.charAt(0) === '/'; | 
						|
} | 
						|
 | 
						|
function win32(path) { | 
						|
  // https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56 | 
						|
  var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; | 
						|
  var result = splitDeviceRe.exec(path); | 
						|
  var device = result[1] || ''; | 
						|
  var isUnc = Boolean(device && device.charAt(1) !== ':'); // UNC paths are always absolute | 
						|
 | 
						|
  return Boolean(result[2] || isUnc); | 
						|
} | 
						|
 | 
						|
var pathIsAbsolute = process.platform === 'win32' ? win32 : posix; | 
						|
var posix_1 = posix; | 
						|
var win32_1 = win32; | 
						|
pathIsAbsolute.posix = posix_1; | 
						|
pathIsAbsolute.win32 = win32_1; | 
						|
 | 
						|
var alphasort_1 = alphasort; | 
						|
var alphasorti_1 = alphasorti; | 
						|
var setopts_1 = setopts; | 
						|
var ownProp_1 = ownProp; | 
						|
var makeAbs_1 = makeAbs; | 
						|
var finish_1 = finish; | 
						|
var mark_1 = mark; | 
						|
var isIgnored_1 = isIgnored; | 
						|
var childrenIgnored_1 = childrenIgnored; | 
						|
 | 
						|
function ownProp(obj, field) { | 
						|
  return Object.prototype.hasOwnProperty.call(obj, field); | 
						|
} | 
						|
 | 
						|
var Minimatch$1 = minimatch_1.Minimatch; | 
						|
 | 
						|
function alphasorti(a, b) { | 
						|
  return a.toLowerCase().localeCompare(b.toLowerCase()); | 
						|
} | 
						|
 | 
						|
function alphasort(a, b) { | 
						|
  return a.localeCompare(b); | 
						|
} | 
						|
 | 
						|
function setupIgnores(self, options) { | 
						|
  self.ignore = options.ignore || []; | 
						|
  if (!Array.isArray(self.ignore)) self.ignore = [self.ignore]; | 
						|
 | 
						|
  if (self.ignore.length) { | 
						|
    self.ignore = self.ignore.map(ignoreMap); | 
						|
  } | 
						|
} // ignore patterns are always in dot:true mode. | 
						|
 | 
						|
 | 
						|
function ignoreMap(pattern) { | 
						|
  var gmatcher = null; | 
						|
 | 
						|
  if (pattern.slice(-3) === '/**') { | 
						|
    var gpattern = pattern.replace(/(\/\*\*)+$/, ''); | 
						|
    gmatcher = new Minimatch$1(gpattern, { | 
						|
      dot: true | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  return { | 
						|
    matcher: new Minimatch$1(pattern, { | 
						|
      dot: true | 
						|
    }), | 
						|
    gmatcher: gmatcher | 
						|
  }; | 
						|
} | 
						|
 | 
						|
function setopts(self, pattern, options) { | 
						|
  if (!options) options = {}; // base-matching: just use globstar for that. | 
						|
 | 
						|
  if (options.matchBase && -1 === pattern.indexOf("/")) { | 
						|
    if (options.noglobstar) { | 
						|
      throw new Error("base matching requires globstar"); | 
						|
    } | 
						|
 | 
						|
    pattern = "**/" + pattern; | 
						|
  } | 
						|
 | 
						|
  self.silent = !!options.silent; | 
						|
  self.pattern = pattern; | 
						|
  self.strict = options.strict !== false; | 
						|
  self.realpath = !!options.realpath; | 
						|
  self.realpathCache = options.realpathCache || Object.create(null); | 
						|
  self.follow = !!options.follow; | 
						|
  self.dot = !!options.dot; | 
						|
  self.mark = !!options.mark; | 
						|
  self.nodir = !!options.nodir; | 
						|
  if (self.nodir) self.mark = true; | 
						|
  self.sync = !!options.sync; | 
						|
  self.nounique = !!options.nounique; | 
						|
  self.nonull = !!options.nonull; | 
						|
  self.nosort = !!options.nosort; | 
						|
  self.nocase = !!options.nocase; | 
						|
  self.stat = !!options.stat; | 
						|
  self.noprocess = !!options.noprocess; | 
						|
  self.absolute = !!options.absolute; | 
						|
  self.maxLength = options.maxLength || Infinity; | 
						|
  self.cache = options.cache || Object.create(null); | 
						|
  self.statCache = options.statCache || Object.create(null); | 
						|
  self.symlinks = options.symlinks || Object.create(null); | 
						|
  setupIgnores(self, options); | 
						|
  self.changedCwd = false; | 
						|
  var cwd = process.cwd(); | 
						|
  if (!ownProp(options, "cwd")) self.cwd = cwd;else { | 
						|
    self.cwd = path$2.resolve(options.cwd); | 
						|
    self.changedCwd = self.cwd !== cwd; | 
						|
  } | 
						|
  self.root = options.root || path$2.resolve(self.cwd, "/"); | 
						|
  self.root = path$2.resolve(self.root); | 
						|
  if (process.platform === "win32") self.root = self.root.replace(/\\/g, "/"); // TODO: is an absolute `cwd` supposed to be resolved against `root`? | 
						|
  // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test') | 
						|
 | 
						|
  self.cwdAbs = pathIsAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd); | 
						|
  if (process.platform === "win32") self.cwdAbs = self.cwdAbs.replace(/\\/g, "/"); | 
						|
  self.nomount = !!options.nomount; // disable comments and negation in Minimatch. | 
						|
  // Note that they are not supported in Glob itself anyway. | 
						|
 | 
						|
  options.nonegate = true; | 
						|
  options.nocomment = true; | 
						|
  self.minimatch = new Minimatch$1(pattern, options); | 
						|
  self.options = self.minimatch.options; | 
						|
} | 
						|
 | 
						|
function finish(self) { | 
						|
  var nou = self.nounique; | 
						|
  var all = nou ? [] : Object.create(null); | 
						|
 | 
						|
  for (var i = 0, l = self.matches.length; i < l; i++) { | 
						|
    var matches = self.matches[i]; | 
						|
 | 
						|
    if (!matches || Object.keys(matches).length === 0) { | 
						|
      if (self.nonull) { | 
						|
        // do like the shell, and spit out the literal glob | 
						|
        var literal = self.minimatch.globSet[i]; | 
						|
        if (nou) all.push(literal);else all[literal] = true; | 
						|
      } | 
						|
    } else { | 
						|
      // had matches | 
						|
      var m = Object.keys(matches); | 
						|
      if (nou) all.push.apply(all, m);else m.forEach(function (m) { | 
						|
        all[m] = true; | 
						|
      }); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  if (!nou) all = Object.keys(all); | 
						|
  if (!self.nosort) all = all.sort(self.nocase ? alphasorti : alphasort); // at *some* point we statted all of these | 
						|
 | 
						|
  if (self.mark) { | 
						|
    for (var i = 0; i < all.length; i++) { | 
						|
      all[i] = self._mark(all[i]); | 
						|
    } | 
						|
 | 
						|
    if (self.nodir) { | 
						|
      all = all.filter(function (e) { | 
						|
        var notDir = !/\/$/.test(e); | 
						|
        var c = self.cache[e] || self.cache[makeAbs(self, e)]; | 
						|
        if (notDir && c) notDir = c !== 'DIR' && !Array.isArray(c); | 
						|
        return notDir; | 
						|
      }); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  if (self.ignore.length) all = all.filter(function (m) { | 
						|
    return !isIgnored(self, m); | 
						|
  }); | 
						|
  self.found = all; | 
						|
} | 
						|
 | 
						|
function mark(self, p) { | 
						|
  var abs = makeAbs(self, p); | 
						|
  var c = self.cache[abs]; | 
						|
  var m = p; | 
						|
 | 
						|
  if (c) { | 
						|
    var isDir = c === 'DIR' || Array.isArray(c); | 
						|
    var slash = p.slice(-1) === '/'; | 
						|
    if (isDir && !slash) m += '/';else if (!isDir && slash) m = m.slice(0, -1); | 
						|
 | 
						|
    if (m !== p) { | 
						|
      var mabs = makeAbs(self, m); | 
						|
      self.statCache[mabs] = self.statCache[abs]; | 
						|
      self.cache[mabs] = self.cache[abs]; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return m; | 
						|
} // lotta situps... | 
						|
 | 
						|
 | 
						|
function makeAbs(self, f) { | 
						|
  var abs = f; | 
						|
 | 
						|
  if (f.charAt(0) === '/') { | 
						|
    abs = path$2.join(self.root, f); | 
						|
  } else if (pathIsAbsolute(f) || f === '') { | 
						|
    abs = f; | 
						|
  } else if (self.changedCwd) { | 
						|
    abs = path$2.resolve(self.cwd, f); | 
						|
  } else { | 
						|
    abs = path$2.resolve(f); | 
						|
  } | 
						|
 | 
						|
  if (process.platform === 'win32') abs = abs.replace(/\\/g, '/'); | 
						|
  return abs; | 
						|
} // Return true, if pattern ends with globstar '**', for the accompanying parent directory. | 
						|
// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents | 
						|
 | 
						|
 | 
						|
function isIgnored(self, path) { | 
						|
  if (!self.ignore.length) return false; | 
						|
  return self.ignore.some(function (item) { | 
						|
    return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)); | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function childrenIgnored(self, path) { | 
						|
  if (!self.ignore.length) return false; | 
						|
  return self.ignore.some(function (item) { | 
						|
    return !!(item.gmatcher && item.gmatcher.match(path)); | 
						|
  }); | 
						|
} | 
						|
 | 
						|
var common$2 = { | 
						|
  alphasort: alphasort_1, | 
						|
  alphasorti: alphasorti_1, | 
						|
  setopts: setopts_1, | 
						|
  ownProp: ownProp_1, | 
						|
  makeAbs: makeAbs_1, | 
						|
  finish: finish_1, | 
						|
  mark: mark_1, | 
						|
  isIgnored: isIgnored_1, | 
						|
  childrenIgnored: childrenIgnored_1 | 
						|
}; | 
						|
 | 
						|
var sync$1 = globSync; | 
						|
globSync.GlobSync = GlobSync; | 
						|
var setopts$1 = common$2.setopts; | 
						|
var ownProp$1 = common$2.ownProp; | 
						|
var childrenIgnored$1 = common$2.childrenIgnored; | 
						|
var isIgnored$1 = common$2.isIgnored; | 
						|
 | 
						|
function globSync(pattern, options) { | 
						|
  if (typeof options === 'function' || arguments.length === 3) throw new TypeError('callback provided to sync glob\n' + 'See: https://github.com/isaacs/node-glob/issues/167'); | 
						|
  return new GlobSync(pattern, options).found; | 
						|
} | 
						|
 | 
						|
function GlobSync(pattern, options) { | 
						|
  if (!pattern) throw new Error('must provide pattern'); | 
						|
  if (typeof options === 'function' || arguments.length === 3) throw new TypeError('callback provided to sync glob\n' + 'See: https://github.com/isaacs/node-glob/issues/167'); | 
						|
  if (!(this instanceof GlobSync)) return new GlobSync(pattern, options); | 
						|
  setopts$1(this, pattern, options); | 
						|
  if (this.noprocess) return this; | 
						|
  var n = this.minimatch.set.length; | 
						|
  this.matches = new Array(n); | 
						|
 | 
						|
  for (var i = 0; i < n; i++) { | 
						|
    this._process(this.minimatch.set[i], i, false); | 
						|
  } | 
						|
 | 
						|
  this._finish(); | 
						|
} | 
						|
 | 
						|
GlobSync.prototype._finish = function () { | 
						|
  assert$1(this instanceof GlobSync); | 
						|
 | 
						|
  if (this.realpath) { | 
						|
    var self = this; | 
						|
    this.matches.forEach(function (matchset, index) { | 
						|
      var set = self.matches[index] = Object.create(null); | 
						|
 | 
						|
      for (var p in matchset) { | 
						|
        try { | 
						|
          p = self._makeAbs(p); | 
						|
          var real = fs_realpath.realpathSync(p, self.realpathCache); | 
						|
          set[real] = true; | 
						|
        } catch (er) { | 
						|
          if (er.syscall === 'stat') set[self._makeAbs(p)] = true;else throw er; | 
						|
        } | 
						|
      } | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  common$2.finish(this); | 
						|
}; | 
						|
 | 
						|
GlobSync.prototype._process = function (pattern, index, inGlobStar) { | 
						|
  assert$1(this instanceof GlobSync); // Get the first [n] parts of pattern that are all strings. | 
						|
 | 
						|
  var n = 0; | 
						|
 | 
						|
  while (typeof pattern[n] === 'string') { | 
						|
    n++; | 
						|
  } // now n is the index of the first one that is *not* a string. | 
						|
  // See if there's anything else | 
						|
 | 
						|
 | 
						|
  var prefix; | 
						|
 | 
						|
  switch (n) { | 
						|
    // if not, then this is rather simple | 
						|
    case pattern.length: | 
						|
      this._processSimple(pattern.join('/'), index); | 
						|
 | 
						|
      return; | 
						|
 | 
						|
    case 0: | 
						|
      // pattern *starts* with some non-trivial item. | 
						|
      // going to readdir(cwd), but not include the prefix in matches. | 
						|
      prefix = null; | 
						|
      break; | 
						|
 | 
						|
    default: | 
						|
      // pattern has some string bits in the front. | 
						|
      // whatever it starts with, whether that's 'absolute' like /foo/bar, | 
						|
      // or 'relative' like '../baz' | 
						|
      prefix = pattern.slice(0, n).join('/'); | 
						|
      break; | 
						|
  } | 
						|
 | 
						|
  var remain = pattern.slice(n); // get the list of entries. | 
						|
 | 
						|
  var read; | 
						|
  if (prefix === null) read = '.';else if (pathIsAbsolute(prefix) || pathIsAbsolute(pattern.join('/'))) { | 
						|
    if (!prefix || !pathIsAbsolute(prefix)) prefix = '/' + prefix; | 
						|
    read = prefix; | 
						|
  } else read = prefix; | 
						|
 | 
						|
  var abs = this._makeAbs(read); //if ignored, skip processing | 
						|
 | 
						|
 | 
						|
  if (childrenIgnored$1(this, read)) return; | 
						|
  var isGlobStar = remain[0] === minimatch_1.GLOBSTAR; | 
						|
  if (isGlobStar) this._processGlobStar(prefix, read, abs, remain, index, inGlobStar);else this._processReaddir(prefix, read, abs, remain, index, inGlobStar); | 
						|
}; | 
						|
 | 
						|
GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { | 
						|
  var entries = this._readdir(abs, inGlobStar); // if the abs isn't a dir, then nothing can match! | 
						|
 | 
						|
 | 
						|
  if (!entries) return; // It will only match dot entries if it starts with a dot, or if | 
						|
  // dot is set.  Stuff like @(.foo|.bar) isn't allowed. | 
						|
 | 
						|
  var pn = remain[0]; | 
						|
  var negate = !!this.minimatch.negate; | 
						|
  var rawGlob = pn._glob; | 
						|
  var dotOk = this.dot || rawGlob.charAt(0) === '.'; | 
						|
  var matchedEntries = []; | 
						|
 | 
						|
  for (var i = 0; i < entries.length; i++) { | 
						|
    var e = entries[i]; | 
						|
 | 
						|
    if (e.charAt(0) !== '.' || dotOk) { | 
						|
      var m; | 
						|
 | 
						|
      if (negate && !prefix) { | 
						|
        m = !e.match(pn); | 
						|
      } else { | 
						|
        m = e.match(pn); | 
						|
      } | 
						|
 | 
						|
      if (m) matchedEntries.push(e); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  var len = matchedEntries.length; // If there are no matched entries, then nothing matches. | 
						|
 | 
						|
  if (len === 0) return; // if this is the last remaining pattern bit, then no need for | 
						|
  // an additional stat *unless* the user has specified mark or | 
						|
  // stat explicitly.  We know they exist, since readdir returned | 
						|
  // them. | 
						|
 | 
						|
  if (remain.length === 1 && !this.mark && !this.stat) { | 
						|
    if (!this.matches[index]) this.matches[index] = Object.create(null); | 
						|
 | 
						|
    for (var i = 0; i < len; i++) { | 
						|
      var e = matchedEntries[i]; | 
						|
 | 
						|
      if (prefix) { | 
						|
        if (prefix.slice(-1) !== '/') e = prefix + '/' + e;else e = prefix + e; | 
						|
      } | 
						|
 | 
						|
      if (e.charAt(0) === '/' && !this.nomount) { | 
						|
        e = path$2.join(this.root, e); | 
						|
      } | 
						|
 | 
						|
      this._emitMatch(index, e); | 
						|
    } // This was the last one, and no stats were needed | 
						|
 | 
						|
 | 
						|
    return; | 
						|
  } // now test all matched entries as stand-ins for that part | 
						|
  // of the pattern. | 
						|
 | 
						|
 | 
						|
  remain.shift(); | 
						|
 | 
						|
  for (var i = 0; i < len; i++) { | 
						|
    var e = matchedEntries[i]; | 
						|
    var newPattern; | 
						|
    if (prefix) newPattern = [prefix, e];else newPattern = [e]; | 
						|
 | 
						|
    this._process(newPattern.concat(remain), index, inGlobStar); | 
						|
  } | 
						|
}; | 
						|
 | 
						|
GlobSync.prototype._emitMatch = function (index, e) { | 
						|
  if (isIgnored$1(this, e)) return; | 
						|
 | 
						|
  var abs = this._makeAbs(e); | 
						|
 | 
						|
  if (this.mark) e = this._mark(e); | 
						|
 | 
						|
  if (this.absolute) { | 
						|
    e = abs; | 
						|
  } | 
						|
 | 
						|
  if (this.matches[index][e]) return; | 
						|
 | 
						|
  if (this.nodir) { | 
						|
    var c = this.cache[abs]; | 
						|
    if (c === 'DIR' || Array.isArray(c)) return; | 
						|
  } | 
						|
 | 
						|
  this.matches[index][e] = true; | 
						|
  if (this.stat) this._stat(e); | 
						|
}; | 
						|
 | 
						|
GlobSync.prototype._readdirInGlobStar = function (abs) { | 
						|
  // follow all symlinked directories forever | 
						|
  // just proceed as if this is a non-globstar situation | 
						|
  if (this.follow) return this._readdir(abs, false); | 
						|
  var entries; | 
						|
  var lstat; | 
						|
 | 
						|
  try { | 
						|
    lstat = fs$1.lstatSync(abs); | 
						|
  } catch (er) { | 
						|
    if (er.code === 'ENOENT') { | 
						|
      // lstat failed, doesn't exist | 
						|
      return null; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  var isSym = lstat && lstat.isSymbolicLink(); | 
						|
  this.symlinks[abs] = isSym; // If it's not a symlink or a dir, then it's definitely a regular file. | 
						|
  // don't bother doing a readdir in that case. | 
						|
 | 
						|
  if (!isSym && lstat && !lstat.isDirectory()) this.cache[abs] = 'FILE';else entries = this._readdir(abs, false); | 
						|
  return entries; | 
						|
}; | 
						|
 | 
						|
GlobSync.prototype._readdir = function (abs, inGlobStar) { | 
						|
  if (inGlobStar && !ownProp$1(this.symlinks, abs)) return this._readdirInGlobStar(abs); | 
						|
 | 
						|
  if (ownProp$1(this.cache, abs)) { | 
						|
    var c = this.cache[abs]; | 
						|
    if (!c || c === 'FILE') return null; | 
						|
    if (Array.isArray(c)) return c; | 
						|
  } | 
						|
 | 
						|
  try { | 
						|
    return this._readdirEntries(abs, fs$1.readdirSync(abs)); | 
						|
  } catch (er) { | 
						|
    this._readdirError(abs, er); | 
						|
 | 
						|
    return null; | 
						|
  } | 
						|
}; | 
						|
 | 
						|
GlobSync.prototype._readdirEntries = function (abs, entries) { | 
						|
  // if we haven't asked to stat everything, then just | 
						|
  // assume that everything in there exists, so we can avoid | 
						|
  // having to stat it a second time. | 
						|
  if (!this.mark && !this.stat) { | 
						|
    for (var i = 0; i < entries.length; i++) { | 
						|
      var e = entries[i]; | 
						|
      if (abs === '/') e = abs + e;else e = abs + '/' + e; | 
						|
      this.cache[e] = true; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  this.cache[abs] = entries; // mark and cache dir-ness | 
						|
 | 
						|
  return entries; | 
						|
}; | 
						|
 | 
						|
GlobSync.prototype._readdirError = function (f, er) { | 
						|
  // handle errors, and cache the information | 
						|
  switch (er.code) { | 
						|
    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 | 
						|
 | 
						|
    case 'ENOTDIR': | 
						|
      // totally normal. means it *does* exist. | 
						|
      var abs = this._makeAbs(f); | 
						|
 | 
						|
      this.cache[abs] = 'FILE'; | 
						|
 | 
						|
      if (abs === this.cwdAbs) { | 
						|
        var error = new Error(er.code + ' invalid cwd ' + this.cwd); | 
						|
        error.path = this.cwd; | 
						|
        error.code = er.code; | 
						|
        throw error; | 
						|
      } | 
						|
 | 
						|
      break; | 
						|
 | 
						|
    case 'ENOENT': // not terribly unusual | 
						|
 | 
						|
    case 'ELOOP': | 
						|
    case 'ENAMETOOLONG': | 
						|
    case 'UNKNOWN': | 
						|
      this.cache[this._makeAbs(f)] = false; | 
						|
      break; | 
						|
 | 
						|
    default: | 
						|
      // some unusual error.  Treat as failure. | 
						|
      this.cache[this._makeAbs(f)] = false; | 
						|
      if (this.strict) throw er; | 
						|
      if (!this.silent) console.error('glob error', er); | 
						|
      break; | 
						|
  } | 
						|
}; | 
						|
 | 
						|
GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { | 
						|
  var entries = this._readdir(abs, inGlobStar); // no entries means not a dir, so it can never have matches | 
						|
  // foo.txt/** doesn't match foo.txt | 
						|
 | 
						|
 | 
						|
  if (!entries) return; // test without the globstar, and with every child both below | 
						|
  // and replacing the globstar. | 
						|
 | 
						|
  var remainWithoutGlobStar = remain.slice(1); | 
						|
  var gspref = prefix ? [prefix] : []; | 
						|
  var noGlobStar = gspref.concat(remainWithoutGlobStar); // the noGlobStar pattern exits the inGlobStar state | 
						|
 | 
						|
  this._process(noGlobStar, index, false); | 
						|
 | 
						|
  var len = entries.length; | 
						|
  var isSym = this.symlinks[abs]; // If it's a symlink, and we're in a globstar, then stop | 
						|
 | 
						|
  if (isSym && inGlobStar) return; | 
						|
 | 
						|
  for (var i = 0; i < len; i++) { | 
						|
    var e = entries[i]; | 
						|
    if (e.charAt(0) === '.' && !this.dot) continue; // these two cases enter the inGlobStar state | 
						|
 | 
						|
    var instead = gspref.concat(entries[i], remainWithoutGlobStar); | 
						|
 | 
						|
    this._process(instead, index, true); | 
						|
 | 
						|
    var below = gspref.concat(entries[i], remain); | 
						|
 | 
						|
    this._process(below, index, true); | 
						|
  } | 
						|
}; | 
						|
 | 
						|
GlobSync.prototype._processSimple = function (prefix, index) { | 
						|
  // XXX review this.  Shouldn't it be doing the mounting etc | 
						|
  // before doing stat?  kinda weird? | 
						|
  var exists = this._stat(prefix); | 
						|
 | 
						|
  if (!this.matches[index]) this.matches[index] = Object.create(null); // If it doesn't exist, then just mark the lack of results | 
						|
 | 
						|
  if (!exists) return; | 
						|
 | 
						|
  if (prefix && pathIsAbsolute(prefix) && !this.nomount) { | 
						|
    var trail = /[\/\\]$/.test(prefix); | 
						|
 | 
						|
    if (prefix.charAt(0) === '/') { | 
						|
      prefix = path$2.join(this.root, prefix); | 
						|
    } else { | 
						|
      prefix = path$2.resolve(this.root, prefix); | 
						|
      if (trail) prefix += '/'; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  if (process.platform === 'win32') prefix = prefix.replace(/\\/g, '/'); // Mark this as a match | 
						|
 | 
						|
  this._emitMatch(index, prefix); | 
						|
}; // Returns either 'DIR', 'FILE', or false | 
						|
 | 
						|
 | 
						|
GlobSync.prototype._stat = function (f) { | 
						|
  var abs = this._makeAbs(f); | 
						|
 | 
						|
  var needDir = f.slice(-1) === '/'; | 
						|
  if (f.length > this.maxLength) return false; | 
						|
 | 
						|
  if (!this.stat && ownProp$1(this.cache, abs)) { | 
						|
    var c = this.cache[abs]; | 
						|
    if (Array.isArray(c)) c = 'DIR'; // It exists, but maybe not how we need it | 
						|
 | 
						|
    if (!needDir || c === 'DIR') return c; | 
						|
    if (needDir && c === 'FILE') return false; // otherwise we have to stat, because maybe c=true | 
						|
    // if we know it exists, but not what it is. | 
						|
  } | 
						|
  var stat = this.statCache[abs]; | 
						|
 | 
						|
  if (!stat) { | 
						|
    var lstat; | 
						|
 | 
						|
    try { | 
						|
      lstat = fs$1.lstatSync(abs); | 
						|
    } catch (er) { | 
						|
      if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { | 
						|
        this.statCache[abs] = false; | 
						|
        return false; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    if (lstat && lstat.isSymbolicLink()) { | 
						|
      try { | 
						|
        stat = fs$1.statSync(abs); | 
						|
      } catch (er) { | 
						|
        stat = lstat; | 
						|
      } | 
						|
    } else { | 
						|
      stat = lstat; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  this.statCache[abs] = stat; | 
						|
  var c = true; | 
						|
  if (stat) c = stat.isDirectory() ? 'DIR' : 'FILE'; | 
						|
  this.cache[abs] = this.cache[abs] || c; | 
						|
  if (needDir && c === 'FILE') return false; | 
						|
  return c; | 
						|
}; | 
						|
 | 
						|
GlobSync.prototype._mark = function (p) { | 
						|
  return common$2.mark(this, p); | 
						|
}; | 
						|
 | 
						|
GlobSync.prototype._makeAbs = function (f) { | 
						|
  return common$2.makeAbs(this, f); | 
						|
}; | 
						|
 | 
						|
// Returns a wrapper function that returns a wrapped callback | 
						|
// The wrapper function should do some stuff, and return a | 
						|
// presumably different callback function. | 
						|
// This makes sure that own properties are retained, so that | 
						|
// decorations and such are not lost along the way. | 
						|
var wrappy_1 = wrappy; | 
						|
 | 
						|
function wrappy(fn, cb) { | 
						|
  if (fn && cb) return wrappy(fn)(cb); | 
						|
  if (typeof fn !== 'function') throw new TypeError('need wrapper function'); | 
						|
  Object.keys(fn).forEach(function (k) { | 
						|
    wrapper[k] = fn[k]; | 
						|
  }); | 
						|
  return wrapper; | 
						|
 | 
						|
  function wrapper() { | 
						|
    var args = new Array(arguments.length); | 
						|
 | 
						|
    for (var i = 0; i < args.length; i++) { | 
						|
      args[i] = arguments[i]; | 
						|
    } | 
						|
 | 
						|
    var ret = fn.apply(this, args); | 
						|
    var cb = args[args.length - 1]; | 
						|
 | 
						|
    if (typeof ret === 'function' && ret !== cb) { | 
						|
      Object.keys(cb).forEach(function (k) { | 
						|
        ret[k] = cb[k]; | 
						|
      }); | 
						|
    } | 
						|
 | 
						|
    return ret; | 
						|
  } | 
						|
} | 
						|
 | 
						|
var once_1 = wrappy_1(once); | 
						|
var strict = wrappy_1(onceStrict); | 
						|
once.proto = once(function () { | 
						|
  Object.defineProperty(Function.prototype, 'once', { | 
						|
    value: function value() { | 
						|
      return once(this); | 
						|
    }, | 
						|
    configurable: true | 
						|
  }); | 
						|
  Object.defineProperty(Function.prototype, 'onceStrict', { | 
						|
    value: function value() { | 
						|
      return onceStrict(this); | 
						|
    }, | 
						|
    configurable: true | 
						|
  }); | 
						|
}); | 
						|
 | 
						|
function once(fn) { | 
						|
  var f = function f() { | 
						|
    if (f.called) return f.value; | 
						|
    f.called = true; | 
						|
    return f.value = fn.apply(this, arguments); | 
						|
  }; | 
						|
 | 
						|
  f.called = false; | 
						|
  return f; | 
						|
} | 
						|
 | 
						|
function onceStrict(fn) { | 
						|
  var f = function f() { | 
						|
    if (f.called) throw new Error(f.onceError); | 
						|
    f.called = true; | 
						|
    return f.value = fn.apply(this, arguments); | 
						|
  }; | 
						|
 | 
						|
  var name = fn.name || 'Function wrapped with `once`'; | 
						|
  f.onceError = name + " shouldn't be called more than once"; | 
						|
  f.called = false; | 
						|
  return f; | 
						|
} | 
						|
once_1.strict = strict; | 
						|
 | 
						|
var reqs = Object.create(null); | 
						|
var inflight_1 = wrappy_1(inflight); | 
						|
 | 
						|
function inflight(key, cb) { | 
						|
  if (reqs[key]) { | 
						|
    reqs[key].push(cb); | 
						|
    return null; | 
						|
  } else { | 
						|
    reqs[key] = [cb]; | 
						|
    return makeres(key); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function makeres(key) { | 
						|
  return once_1(function RES() { | 
						|
    var cbs = reqs[key]; | 
						|
    var len = cbs.length; | 
						|
    var args = slice(arguments); // XXX It's somewhat ambiguous whether a new callback added in this | 
						|
    // pass should be queued for later execution if something in the | 
						|
    // list of callbacks throws, or if it should just be discarded. | 
						|
    // However, it's such an edge case that it hardly matters, and either | 
						|
    // choice is likely as surprising as the other. | 
						|
    // As it happens, we do go ahead and schedule it for later execution. | 
						|
 | 
						|
    try { | 
						|
      for (var i = 0; i < len; i++) { | 
						|
        cbs[i].apply(null, args); | 
						|
      } | 
						|
    } finally { | 
						|
      if (cbs.length > len) { | 
						|
        // added more in the interim. | 
						|
        // de-zalgo, just in case, but don't call again. | 
						|
        cbs.splice(0, len); | 
						|
        process.nextTick(function () { | 
						|
          RES.apply(null, args); | 
						|
        }); | 
						|
      } else { | 
						|
        delete reqs[key]; | 
						|
      } | 
						|
    } | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function slice(args) { | 
						|
  var length = args.length; | 
						|
  var array = []; | 
						|
 | 
						|
  for (var i = 0; i < length; i++) { | 
						|
    array[i] = args[i]; | 
						|
  } | 
						|
 | 
						|
  return array; | 
						|
} | 
						|
 | 
						|
// | 
						|
// 1. Get the minimatch set | 
						|
// 2. For each pattern in the set, PROCESS(pattern, false) | 
						|
// 3. Store matches per-set, then uniq them | 
						|
// | 
						|
// PROCESS(pattern, inGlobStar) | 
						|
// Get the first [n] items from pattern that are all strings | 
						|
// Join these together.  This is PREFIX. | 
						|
//   If there is no more remaining, then stat(PREFIX) and | 
						|
//   add to matches if it succeeds.  END. | 
						|
// | 
						|
// If inGlobStar and PREFIX is symlink and points to dir | 
						|
//   set ENTRIES = [] | 
						|
// else readdir(PREFIX) as ENTRIES | 
						|
//   If fail, END | 
						|
// | 
						|
// with ENTRIES | 
						|
//   If pattern[n] is GLOBSTAR | 
						|
//     // handle the case where the globstar match is empty | 
						|
//     // by pruning it out, and testing the resulting pattern | 
						|
//     PROCESS(pattern[0..n] + pattern[n+1 .. $], false) | 
						|
//     // handle other cases. | 
						|
//     for ENTRY in ENTRIES (not dotfiles) | 
						|
//       // attach globstar + tail onto the entry | 
						|
//       // Mark that this entry is a globstar match | 
						|
//       PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) | 
						|
// | 
						|
//   else // not globstar | 
						|
//     for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) | 
						|
//       Test ENTRY against pattern[n] | 
						|
//       If fails, continue | 
						|
//       If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) | 
						|
// | 
						|
// Caveat: | 
						|
//   Cache all stats and readdirs results to minimize syscall.  Since all | 
						|
//   we ever care about is existence and directory-ness, we can just keep | 
						|
//   `true` for files, and [children,...] for directories, or `false` for | 
						|
//   things that don't exist. | 
						|
 | 
						|
var glob_1 = glob; | 
						|
var EE = events$1.EventEmitter; | 
						|
var setopts$2 = common$2.setopts; | 
						|
var ownProp$2 = common$2.ownProp; | 
						|
var childrenIgnored$2 = common$2.childrenIgnored; | 
						|
var isIgnored$2 = common$2.isIgnored; | 
						|
 | 
						|
function glob(pattern, options, cb) { | 
						|
  if (typeof options === 'function') cb = options, options = {}; | 
						|
  if (!options) options = {}; | 
						|
 | 
						|
  if (options.sync) { | 
						|
    if (cb) throw new TypeError('callback provided to sync glob'); | 
						|
    return sync$1(pattern, options); | 
						|
  } | 
						|
 | 
						|
  return new Glob(pattern, options, cb); | 
						|
} | 
						|
 | 
						|
glob.sync = sync$1; | 
						|
var GlobSync$1 = glob.GlobSync = sync$1.GlobSync; // old api surface | 
						|
 | 
						|
glob.glob = glob; | 
						|
 | 
						|
function extend(origin, add) { | 
						|
  if (add === null || typeof add !== 'object') { | 
						|
    return origin; | 
						|
  } | 
						|
 | 
						|
  var keys = Object.keys(add); | 
						|
  var i = keys.length; | 
						|
 | 
						|
  while (i--) { | 
						|
    origin[keys[i]] = add[keys[i]]; | 
						|
  } | 
						|
 | 
						|
  return origin; | 
						|
} | 
						|
 | 
						|
glob.hasMagic = function (pattern, options_) { | 
						|
  var options = extend({}, options_); | 
						|
  options.noprocess = true; | 
						|
  var g = new Glob(pattern, options); | 
						|
  var set = g.minimatch.set; | 
						|
  if (!pattern) return false; | 
						|
  if (set.length > 1) return true; | 
						|
 | 
						|
  for (var j = 0; j < set[0].length; j++) { | 
						|
    if (typeof set[0][j] !== 'string') return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
}; | 
						|
 | 
						|
glob.Glob = Glob; | 
						|
inherits(Glob, EE); | 
						|
 | 
						|
function Glob(pattern, options, cb) { | 
						|
  if (typeof options === 'function') { | 
						|
    cb = options; | 
						|
    options = null; | 
						|
  } | 
						|
 | 
						|
  if (options && options.sync) { | 
						|
    if (cb) throw new TypeError('callback provided to sync glob'); | 
						|
    return new GlobSync$1(pattern, options); | 
						|
  } | 
						|
 | 
						|
  if (!(this instanceof Glob)) return new Glob(pattern, options, cb); | 
						|
  setopts$2(this, pattern, options); | 
						|
  this._didRealPath = false; // process each pattern in the minimatch set | 
						|
 | 
						|
  var n = this.minimatch.set.length; // The matches are stored as {<filename>: true,...} so that | 
						|
  // duplicates are automagically pruned. | 
						|
  // Later, we do an Object.keys() on these. | 
						|
  // Keep them as a list so we can fill in when nonull is set. | 
						|
 | 
						|
  this.matches = new Array(n); | 
						|
 | 
						|
  if (typeof cb === 'function') { | 
						|
    cb = once_1(cb); | 
						|
    this.on('error', cb); | 
						|
    this.on('end', function (matches) { | 
						|
      cb(null, matches); | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  var self = this; | 
						|
  this._processing = 0; | 
						|
  this._emitQueue = []; | 
						|
  this._processQueue = []; | 
						|
  this.paused = false; | 
						|
  if (this.noprocess) return this; | 
						|
  if (n === 0) return done(); | 
						|
  var sync = true; | 
						|
 | 
						|
  for (var i = 0; i < n; i++) { | 
						|
    this._process(this.minimatch.set[i], i, false, done); | 
						|
  } | 
						|
 | 
						|
  sync = false; | 
						|
 | 
						|
  function done() { | 
						|
    --self._processing; | 
						|
 | 
						|
    if (self._processing <= 0) { | 
						|
      if (sync) { | 
						|
        process.nextTick(function () { | 
						|
          self._finish(); | 
						|
        }); | 
						|
      } else { | 
						|
        self._finish(); | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
} | 
						|
 | 
						|
Glob.prototype._finish = function () { | 
						|
  assert$1(this instanceof Glob); | 
						|
  if (this.aborted) return; | 
						|
  if (this.realpath && !this._didRealpath) return this._realpath(); | 
						|
  common$2.finish(this); | 
						|
  this.emit('end', this.found); | 
						|
}; | 
						|
 | 
						|
Glob.prototype._realpath = function () { | 
						|
  if (this._didRealpath) return; | 
						|
  this._didRealpath = true; | 
						|
  var n = this.matches.length; | 
						|
  if (n === 0) return this._finish(); | 
						|
  var self = this; | 
						|
 | 
						|
  for (var i = 0; i < this.matches.length; i++) { | 
						|
    this._realpathSet(i, next); | 
						|
  } | 
						|
 | 
						|
  function next() { | 
						|
    if (--n === 0) self._finish(); | 
						|
  } | 
						|
}; | 
						|
 | 
						|
Glob.prototype._realpathSet = function (index, cb) { | 
						|
  var matchset = this.matches[index]; | 
						|
  if (!matchset) return cb(); | 
						|
  var found = Object.keys(matchset); | 
						|
  var self = this; | 
						|
  var n = found.length; | 
						|
  if (n === 0) return cb(); | 
						|
  var set = this.matches[index] = Object.create(null); | 
						|
  found.forEach(function (p, i) { | 
						|
    // If there's a problem with the stat, then it means that | 
						|
    // one or more of the links in the realpath couldn't be | 
						|
    // resolved.  just return the abs value in that case. | 
						|
    p = self._makeAbs(p); | 
						|
    fs_realpath.realpath(p, self.realpathCache, function (er, real) { | 
						|
      if (!er) set[real] = true;else if (er.syscall === 'stat') set[p] = true;else self.emit('error', er); // srsly wtf right here | 
						|
 | 
						|
      if (--n === 0) { | 
						|
        self.matches[index] = set; | 
						|
        cb(); | 
						|
      } | 
						|
    }); | 
						|
  }); | 
						|
}; | 
						|
 | 
						|
Glob.prototype._mark = function (p) { | 
						|
  return common$2.mark(this, p); | 
						|
}; | 
						|
 | 
						|
Glob.prototype._makeAbs = function (f) { | 
						|
  return common$2.makeAbs(this, f); | 
						|
}; | 
						|
 | 
						|
Glob.prototype.abort = function () { | 
						|
  this.aborted = true; | 
						|
  this.emit('abort'); | 
						|
}; | 
						|
 | 
						|
Glob.prototype.pause = function () { | 
						|
  if (!this.paused) { | 
						|
    this.paused = true; | 
						|
    this.emit('pause'); | 
						|
  } | 
						|
}; | 
						|
 | 
						|
Glob.prototype.resume = function () { | 
						|
  if (this.paused) { | 
						|
    this.emit('resume'); | 
						|
    this.paused = false; | 
						|
 | 
						|
    if (this._emitQueue.length) { | 
						|
      var eq = this._emitQueue.slice(0); | 
						|
 | 
						|
      this._emitQueue.length = 0; | 
						|
 | 
						|
      for (var i = 0; i < eq.length; i++) { | 
						|
        var e = eq[i]; | 
						|
 | 
						|
        this._emitMatch(e[0], e[1]); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    if (this._processQueue.length) { | 
						|
      var pq = this._processQueue.slice(0); | 
						|
 | 
						|
      this._processQueue.length = 0; | 
						|
 | 
						|
      for (var i = 0; i < pq.length; i++) { | 
						|
        var p = pq[i]; | 
						|
        this._processing--; | 
						|
 | 
						|
        this._process(p[0], p[1], p[2], p[3]); | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
}; | 
						|
 | 
						|
Glob.prototype._process = function (pattern, index, inGlobStar, cb) { | 
						|
  assert$1(this instanceof Glob); | 
						|
  assert$1(typeof cb === 'function'); | 
						|
  if (this.aborted) return; | 
						|
  this._processing++; | 
						|
 | 
						|
  if (this.paused) { | 
						|
    this._processQueue.push([pattern, index, inGlobStar, cb]); | 
						|
 | 
						|
    return; | 
						|
  } //console.error('PROCESS %d', this._processing, pattern) | 
						|
  // Get the first [n] parts of pattern that are all strings. | 
						|
 | 
						|
 | 
						|
  var n = 0; | 
						|
 | 
						|
  while (typeof pattern[n] === 'string') { | 
						|
    n++; | 
						|
  } // now n is the index of the first one that is *not* a string. | 
						|
  // see if there's anything else | 
						|
 | 
						|
 | 
						|
  var prefix; | 
						|
 | 
						|
  switch (n) { | 
						|
    // if not, then this is rather simple | 
						|
    case pattern.length: | 
						|
      this._processSimple(pattern.join('/'), index, cb); | 
						|
 | 
						|
      return; | 
						|
 | 
						|
    case 0: | 
						|
      // pattern *starts* with some non-trivial item. | 
						|
      // going to readdir(cwd), but not include the prefix in matches. | 
						|
      prefix = null; | 
						|
      break; | 
						|
 | 
						|
    default: | 
						|
      // pattern has some string bits in the front. | 
						|
      // whatever it starts with, whether that's 'absolute' like /foo/bar, | 
						|
      // or 'relative' like '../baz' | 
						|
      prefix = pattern.slice(0, n).join('/'); | 
						|
      break; | 
						|
  } | 
						|
 | 
						|
  var remain = pattern.slice(n); // get the list of entries. | 
						|
 | 
						|
  var read; | 
						|
  if (prefix === null) read = '.';else if (pathIsAbsolute(prefix) || pathIsAbsolute(pattern.join('/'))) { | 
						|
    if (!prefix || !pathIsAbsolute(prefix)) prefix = '/' + prefix; | 
						|
    read = prefix; | 
						|
  } else read = prefix; | 
						|
 | 
						|
  var abs = this._makeAbs(read); //if ignored, skip _processing | 
						|
 | 
						|
 | 
						|
  if (childrenIgnored$2(this, read)) return cb(); | 
						|
  var isGlobStar = remain[0] === minimatch_1.GLOBSTAR; | 
						|
  if (isGlobStar) this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb);else this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb); | 
						|
}; | 
						|
 | 
						|
Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { | 
						|
  var self = this; | 
						|
 | 
						|
  this._readdir(abs, inGlobStar, function (er, entries) { | 
						|
    return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb); | 
						|
  }); | 
						|
}; | 
						|
 | 
						|
Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { | 
						|
  // if the abs isn't a dir, then nothing can match! | 
						|
  if (!entries) return cb(); // It will only match dot entries if it starts with a dot, or if | 
						|
  // dot is set.  Stuff like @(.foo|.bar) isn't allowed. | 
						|
 | 
						|
  var pn = remain[0]; | 
						|
  var negate = !!this.minimatch.negate; | 
						|
  var rawGlob = pn._glob; | 
						|
  var dotOk = this.dot || rawGlob.charAt(0) === '.'; | 
						|
  var matchedEntries = []; | 
						|
 | 
						|
  for (var i = 0; i < entries.length; i++) { | 
						|
    var e = entries[i]; | 
						|
 | 
						|
    if (e.charAt(0) !== '.' || dotOk) { | 
						|
      var m; | 
						|
 | 
						|
      if (negate && !prefix) { | 
						|
        m = !e.match(pn); | 
						|
      } else { | 
						|
        m = e.match(pn); | 
						|
      } | 
						|
 | 
						|
      if (m) matchedEntries.push(e); | 
						|
    } | 
						|
  } //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) | 
						|
 | 
						|
 | 
						|
  var len = matchedEntries.length; // If there are no matched entries, then nothing matches. | 
						|
 | 
						|
  if (len === 0) return cb(); // if this is the last remaining pattern bit, then no need for | 
						|
  // an additional stat *unless* the user has specified mark or | 
						|
  // stat explicitly.  We know they exist, since readdir returned | 
						|
  // them. | 
						|
 | 
						|
  if (remain.length === 1 && !this.mark && !this.stat) { | 
						|
    if (!this.matches[index]) this.matches[index] = Object.create(null); | 
						|
 | 
						|
    for (var i = 0; i < len; i++) { | 
						|
      var e = matchedEntries[i]; | 
						|
 | 
						|
      if (prefix) { | 
						|
        if (prefix !== '/') e = prefix + '/' + e;else e = prefix + e; | 
						|
      } | 
						|
 | 
						|
      if (e.charAt(0) === '/' && !this.nomount) { | 
						|
        e = path$2.join(this.root, e); | 
						|
      } | 
						|
 | 
						|
      this._emitMatch(index, e); | 
						|
    } // This was the last one, and no stats were needed | 
						|
 | 
						|
 | 
						|
    return cb(); | 
						|
  } // now test all matched entries as stand-ins for that part | 
						|
  // of the pattern. | 
						|
 | 
						|
 | 
						|
  remain.shift(); | 
						|
 | 
						|
  for (var i = 0; i < len; i++) { | 
						|
    var e = matchedEntries[i]; | 
						|
 | 
						|
    if (prefix) { | 
						|
      if (prefix !== '/') e = prefix + '/' + e;else e = prefix + e; | 
						|
    } | 
						|
 | 
						|
    this._process([e].concat(remain), index, inGlobStar, cb); | 
						|
  } | 
						|
 | 
						|
  cb(); | 
						|
}; | 
						|
 | 
						|
Glob.prototype._emitMatch = function (index, e) { | 
						|
  if (this.aborted) return; | 
						|
  if (isIgnored$2(this, e)) return; | 
						|
 | 
						|
  if (this.paused) { | 
						|
    this._emitQueue.push([index, e]); | 
						|
 | 
						|
    return; | 
						|
  } | 
						|
 | 
						|
  var abs = pathIsAbsolute(e) ? e : this._makeAbs(e); | 
						|
  if (this.mark) e = this._mark(e); | 
						|
  if (this.absolute) e = abs; | 
						|
  if (this.matches[index][e]) return; | 
						|
 | 
						|
  if (this.nodir) { | 
						|
    var c = this.cache[abs]; | 
						|
    if (c === 'DIR' || Array.isArray(c)) return; | 
						|
  } | 
						|
 | 
						|
  this.matches[index][e] = true; | 
						|
  var st = this.statCache[abs]; | 
						|
  if (st) this.emit('stat', e, st); | 
						|
  this.emit('match', e); | 
						|
}; | 
						|
 | 
						|
Glob.prototype._readdirInGlobStar = function (abs, cb) { | 
						|
  if (this.aborted) return; // follow all symlinked directories forever | 
						|
  // just proceed as if this is a non-globstar situation | 
						|
 | 
						|
  if (this.follow) return this._readdir(abs, false, cb); | 
						|
  var lstatkey = 'lstat\0' + abs; | 
						|
  var self = this; | 
						|
  var lstatcb = inflight_1(lstatkey, lstatcb_); | 
						|
  if (lstatcb) fs$1.lstat(abs, lstatcb); | 
						|
 | 
						|
  function lstatcb_(er, lstat) { | 
						|
    if (er && er.code === 'ENOENT') return cb(); | 
						|
    var isSym = lstat && lstat.isSymbolicLink(); | 
						|
    self.symlinks[abs] = isSym; // If it's not a symlink or a dir, then it's definitely a regular file. | 
						|
    // don't bother doing a readdir in that case. | 
						|
 | 
						|
    if (!isSym && lstat && !lstat.isDirectory()) { | 
						|
      self.cache[abs] = 'FILE'; | 
						|
      cb(); | 
						|
    } else self._readdir(abs, false, cb); | 
						|
  } | 
						|
}; | 
						|
 | 
						|
Glob.prototype._readdir = function (abs, inGlobStar, cb) { | 
						|
  if (this.aborted) return; | 
						|
  cb = inflight_1('readdir\0' + abs + '\0' + inGlobStar, cb); | 
						|
  if (!cb) return; //console.error('RD %j %j', +inGlobStar, abs) | 
						|
 | 
						|
  if (inGlobStar && !ownProp$2(this.symlinks, abs)) return this._readdirInGlobStar(abs, cb); | 
						|
 | 
						|
  if (ownProp$2(this.cache, abs)) { | 
						|
    var c = this.cache[abs]; | 
						|
    if (!c || c === 'FILE') return cb(); | 
						|
    if (Array.isArray(c)) return cb(null, c); | 
						|
  } | 
						|
  fs$1.readdir(abs, readdirCb(this, abs, cb)); | 
						|
}; | 
						|
 | 
						|
function readdirCb(self, abs, cb) { | 
						|
  return function (er, entries) { | 
						|
    if (er) self._readdirError(abs, er, cb);else self._readdirEntries(abs, entries, cb); | 
						|
  }; | 
						|
} | 
						|
 | 
						|
Glob.prototype._readdirEntries = function (abs, entries, cb) { | 
						|
  if (this.aborted) return; // if we haven't asked to stat everything, then just | 
						|
  // assume that everything in there exists, so we can avoid | 
						|
  // having to stat it a second time. | 
						|
 | 
						|
  if (!this.mark && !this.stat) { | 
						|
    for (var i = 0; i < entries.length; i++) { | 
						|
      var e = entries[i]; | 
						|
      if (abs === '/') e = abs + e;else e = abs + '/' + e; | 
						|
      this.cache[e] = true; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  this.cache[abs] = entries; | 
						|
  return cb(null, entries); | 
						|
}; | 
						|
 | 
						|
Glob.prototype._readdirError = function (f, er, cb) { | 
						|
  if (this.aborted) return; // handle errors, and cache the information | 
						|
 | 
						|
  switch (er.code) { | 
						|
    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 | 
						|
 | 
						|
    case 'ENOTDIR': | 
						|
      // totally normal. means it *does* exist. | 
						|
      var abs = this._makeAbs(f); | 
						|
 | 
						|
      this.cache[abs] = 'FILE'; | 
						|
 | 
						|
      if (abs === this.cwdAbs) { | 
						|
        var error = new Error(er.code + ' invalid cwd ' + this.cwd); | 
						|
        error.path = this.cwd; | 
						|
        error.code = er.code; | 
						|
        this.emit('error', error); | 
						|
        this.abort(); | 
						|
      } | 
						|
 | 
						|
      break; | 
						|
 | 
						|
    case 'ENOENT': // not terribly unusual | 
						|
 | 
						|
    case 'ELOOP': | 
						|
    case 'ENAMETOOLONG': | 
						|
    case 'UNKNOWN': | 
						|
      this.cache[this._makeAbs(f)] = false; | 
						|
      break; | 
						|
 | 
						|
    default: | 
						|
      // some unusual error.  Treat as failure. | 
						|
      this.cache[this._makeAbs(f)] = false; | 
						|
 | 
						|
      if (this.strict) { | 
						|
        this.emit('error', er); // If the error is handled, then we abort | 
						|
        // if not, we threw out of here | 
						|
 | 
						|
        this.abort(); | 
						|
      } | 
						|
 | 
						|
      if (!this.silent) console.error('glob error', er); | 
						|
      break; | 
						|
  } | 
						|
 | 
						|
  return cb(); | 
						|
}; | 
						|
 | 
						|
Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { | 
						|
  var self = this; | 
						|
 | 
						|
  this._readdir(abs, inGlobStar, function (er, entries) { | 
						|
    self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb); | 
						|
  }); | 
						|
}; | 
						|
 | 
						|
Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { | 
						|
  //console.error('pgs2', prefix, remain[0], entries) | 
						|
  // no entries means not a dir, so it can never have matches | 
						|
  // foo.txt/** doesn't match foo.txt | 
						|
  if (!entries) return cb(); // test without the globstar, and with every child both below | 
						|
  // and replacing the globstar. | 
						|
 | 
						|
  var remainWithoutGlobStar = remain.slice(1); | 
						|
  var gspref = prefix ? [prefix] : []; | 
						|
  var noGlobStar = gspref.concat(remainWithoutGlobStar); // the noGlobStar pattern exits the inGlobStar state | 
						|
 | 
						|
  this._process(noGlobStar, index, false, cb); | 
						|
 | 
						|
  var isSym = this.symlinks[abs]; | 
						|
  var len = entries.length; // If it's a symlink, and we're in a globstar, then stop | 
						|
 | 
						|
  if (isSym && inGlobStar) return cb(); | 
						|
 | 
						|
  for (var i = 0; i < len; i++) { | 
						|
    var e = entries[i]; | 
						|
    if (e.charAt(0) === '.' && !this.dot) continue; // these two cases enter the inGlobStar state | 
						|
 | 
						|
    var instead = gspref.concat(entries[i], remainWithoutGlobStar); | 
						|
 | 
						|
    this._process(instead, index, true, cb); | 
						|
 | 
						|
    var below = gspref.concat(entries[i], remain); | 
						|
 | 
						|
    this._process(below, index, true, cb); | 
						|
  } | 
						|
 | 
						|
  cb(); | 
						|
}; | 
						|
 | 
						|
Glob.prototype._processSimple = function (prefix, index, cb) { | 
						|
  // XXX review this.  Shouldn't it be doing the mounting etc | 
						|
  // before doing stat?  kinda weird? | 
						|
  var self = this; | 
						|
 | 
						|
  this._stat(prefix, function (er, exists) { | 
						|
    self._processSimple2(prefix, index, er, exists, cb); | 
						|
  }); | 
						|
}; | 
						|
 | 
						|
Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { | 
						|
  //console.error('ps2', prefix, exists) | 
						|
  if (!this.matches[index]) this.matches[index] = Object.create(null); // If it doesn't exist, then just mark the lack of results | 
						|
 | 
						|
  if (!exists) return cb(); | 
						|
 | 
						|
  if (prefix && pathIsAbsolute(prefix) && !this.nomount) { | 
						|
    var trail = /[\/\\]$/.test(prefix); | 
						|
 | 
						|
    if (prefix.charAt(0) === '/') { | 
						|
      prefix = path$2.join(this.root, prefix); | 
						|
    } else { | 
						|
      prefix = path$2.resolve(this.root, prefix); | 
						|
      if (trail) prefix += '/'; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  if (process.platform === 'win32') prefix = prefix.replace(/\\/g, '/'); // Mark this as a match | 
						|
 | 
						|
  this._emitMatch(index, prefix); | 
						|
 | 
						|
  cb(); | 
						|
}; // Returns either 'DIR', 'FILE', or false | 
						|
 | 
						|
 | 
						|
Glob.prototype._stat = function (f, cb) { | 
						|
  var abs = this._makeAbs(f); | 
						|
 | 
						|
  var needDir = f.slice(-1) === '/'; | 
						|
  if (f.length > this.maxLength) return cb(); | 
						|
 | 
						|
  if (!this.stat && ownProp$2(this.cache, abs)) { | 
						|
    var c = this.cache[abs]; | 
						|
    if (Array.isArray(c)) c = 'DIR'; // It exists, but maybe not how we need it | 
						|
 | 
						|
    if (!needDir || c === 'DIR') return cb(null, c); | 
						|
    if (needDir && c === 'FILE') return cb(); // otherwise we have to stat, because maybe c=true | 
						|
    // if we know it exists, but not what it is. | 
						|
  } | 
						|
  var stat = this.statCache[abs]; | 
						|
 | 
						|
  if (stat !== undefined) { | 
						|
    if (stat === false) return cb(null, stat);else { | 
						|
      var type = stat.isDirectory() ? 'DIR' : 'FILE'; | 
						|
      if (needDir && type === 'FILE') return cb();else return cb(null, type, stat); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  var self = this; | 
						|
  var statcb = inflight_1('stat\0' + abs, lstatcb_); | 
						|
  if (statcb) fs$1.lstat(abs, statcb); | 
						|
 | 
						|
  function lstatcb_(er, lstat) { | 
						|
    if (lstat && lstat.isSymbolicLink()) { | 
						|
      // If it's a symlink, then treat it as the target, unless | 
						|
      // the target does not exist, then treat it as a file. | 
						|
      return fs$1.stat(abs, function (er, stat) { | 
						|
        if (er) self._stat2(f, abs, null, lstat, cb);else self._stat2(f, abs, er, stat, cb); | 
						|
      }); | 
						|
    } else { | 
						|
      self._stat2(f, abs, er, lstat, cb); | 
						|
    } | 
						|
  } | 
						|
}; | 
						|
 | 
						|
Glob.prototype._stat2 = function (f, abs, er, stat, cb) { | 
						|
  if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { | 
						|
    this.statCache[abs] = false; | 
						|
    return cb(); | 
						|
  } | 
						|
 | 
						|
  var needDir = f.slice(-1) === '/'; | 
						|
  this.statCache[abs] = stat; | 
						|
  if (abs.slice(-1) === '/' && stat && !stat.isDirectory()) return cb(null, false, stat); | 
						|
  var c = true; | 
						|
  if (stat) c = stat.isDirectory() ? 'DIR' : 'FILE'; | 
						|
  this.cache[abs] = this.cache[abs] || c; | 
						|
  if (needDir && c === 'FILE') return cb(); | 
						|
  return cb(null, c, stat); | 
						|
}; | 
						|
 | 
						|
var pify_1 = createCommonjsModule(function (module) { | 
						|
 | 
						|
  var processFn = function processFn(fn, P, opts) { | 
						|
    return function () { | 
						|
      var that = this; | 
						|
      var args = new Array(arguments.length); | 
						|
 | 
						|
      for (var i = 0; i < arguments.length; i++) { | 
						|
        args[i] = arguments[i]; | 
						|
      } | 
						|
 | 
						|
      return new P(function (resolve, reject) { | 
						|
        args.push(function (err, result) { | 
						|
          if (err) { | 
						|
            reject(err); | 
						|
          } else if (opts.multiArgs) { | 
						|
            var results = new Array(arguments.length - 1); | 
						|
 | 
						|
            for (var i = 1; i < arguments.length; i++) { | 
						|
              results[i - 1] = arguments[i]; | 
						|
            } | 
						|
 | 
						|
            resolve(results); | 
						|
          } else { | 
						|
            resolve(result); | 
						|
          } | 
						|
        }); | 
						|
        fn.apply(that, args); | 
						|
      }); | 
						|
    }; | 
						|
  }; | 
						|
 | 
						|
  var pify = module.exports = function (obj, P, opts) { | 
						|
    if (typeof P !== 'function') { | 
						|
      opts = P; | 
						|
      P = Promise; | 
						|
    } | 
						|
 | 
						|
    opts = opts || {}; | 
						|
    opts.exclude = opts.exclude || [/.+Sync$/]; | 
						|
 | 
						|
    var filter = function filter(key) { | 
						|
      var match = function match(pattern) { | 
						|
        return typeof pattern === 'string' ? key === pattern : pattern.test(key); | 
						|
      }; | 
						|
 | 
						|
      return opts.include ? opts.include.some(match) : !opts.exclude.some(match); | 
						|
    }; | 
						|
 | 
						|
    var ret = typeof obj === 'function' ? function () { | 
						|
      if (opts.excludeMain) { | 
						|
        return obj.apply(this, arguments); | 
						|
      } | 
						|
 | 
						|
      return processFn(obj, P, opts).apply(this, arguments); | 
						|
    } : {}; | 
						|
    return Object.keys(obj).reduce(function (ret, key) { | 
						|
      var x = obj[key]; | 
						|
      ret[key] = typeof x === 'function' && filter(key) ? processFn(x, P, opts) : x; | 
						|
      return ret; | 
						|
    }, ret); | 
						|
  }; | 
						|
 | 
						|
  pify.all = pify; | 
						|
}); | 
						|
 | 
						|
var globP = pify_1(glob_1, pinkiePromise).bind(glob_1); | 
						|
 | 
						|
function isNegative(pattern) { | 
						|
  return pattern[0] === '!'; | 
						|
} | 
						|
 | 
						|
function isString(value) { | 
						|
  return typeof value === 'string'; | 
						|
} | 
						|
 | 
						|
function assertPatternsInput(patterns) { | 
						|
  if (!patterns.every(isString)) { | 
						|
    throw new TypeError('patterns must be a string or an array of strings'); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function generateGlobTasks(patterns, opts) { | 
						|
  patterns = [].concat(patterns); | 
						|
  assertPatternsInput(patterns); | 
						|
  var globTasks = []; | 
						|
  opts = objectAssign({ | 
						|
    cache: Object.create(null), | 
						|
    statCache: Object.create(null), | 
						|
    realpathCache: Object.create(null), | 
						|
    symlinks: Object.create(null), | 
						|
    ignore: [] | 
						|
  }, opts); | 
						|
  patterns.forEach(function (pattern, i) { | 
						|
    if (isNegative(pattern)) { | 
						|
      return; | 
						|
    } | 
						|
 | 
						|
    var ignore = patterns.slice(i).filter(isNegative).map(function (pattern) { | 
						|
      return pattern.slice(1); | 
						|
    }); | 
						|
    globTasks.push({ | 
						|
      pattern: pattern, | 
						|
      opts: objectAssign({}, opts, { | 
						|
        ignore: opts.ignore.concat(ignore) | 
						|
      }) | 
						|
    }); | 
						|
  }); | 
						|
  return globTasks; | 
						|
} | 
						|
 | 
						|
var globby = function globby(patterns, opts) { | 
						|
  var globTasks; | 
						|
 | 
						|
  try { | 
						|
    globTasks = generateGlobTasks(patterns, opts); | 
						|
  } catch (err) { | 
						|
    return pinkiePromise.reject(err); | 
						|
  } | 
						|
 | 
						|
  return pinkiePromise.all(globTasks.map(function (task) { | 
						|
    return globP(task.pattern, task.opts); | 
						|
  })).then(function (paths) { | 
						|
    return arrayUnion.apply(null, paths); | 
						|
  }); | 
						|
}; | 
						|
 | 
						|
var sync$2 = function sync(patterns, opts) { | 
						|
  var globTasks = generateGlobTasks(patterns, opts); | 
						|
  return globTasks.reduce(function (matches, task) { | 
						|
    return arrayUnion(matches, glob_1.sync(task.pattern, task.opts)); | 
						|
  }, []); | 
						|
}; | 
						|
 | 
						|
var generateGlobTasks_1 = generateGlobTasks; | 
						|
 | 
						|
var hasMagic = function hasMagic(patterns, opts) { | 
						|
  return [].concat(patterns).some(function (pattern) { | 
						|
    return glob_1.hasMagic(pattern, opts); | 
						|
  }); | 
						|
}; | 
						|
globby.sync = sync$2; | 
						|
globby.generateGlobTasks = generateGlobTasks_1; | 
						|
globby.hasMagic = hasMagic; | 
						|
 | 
						|
var addLeadingComment$2 = utilShared.addLeadingComment, | 
						|
    addTrailingComment$2 = utilShared.addTrailingComment, | 
						|
    addDanglingComment$2 = utilShared.addDanglingComment; | 
						|
 | 
						|
function handleOwnLineComment(comment, text, options, ast, isLastComment) { | 
						|
  var precedingNode = comment.precedingNode, | 
						|
      enclosingNode = comment.enclosingNode, | 
						|
      followingNode = comment.followingNode; | 
						|
 | 
						|
  if (handleLastFunctionArgComments(text, precedingNode, enclosingNode, followingNode, comment, options) || handleMemberExpressionComments(enclosingNode, followingNode, comment) || handleIfStatementComments(text, precedingNode, enclosingNode, followingNode, comment, options) || handleWhileComments(text, precedingNode, enclosingNode, followingNode, comment, options) || handleTryStatementComments(enclosingNode, precedingNode, followingNode, comment) || handleClassComments(enclosingNode, precedingNode, followingNode, comment) || handleImportSpecifierComments(enclosingNode, comment) || handleForComments(enclosingNode, precedingNode, comment) || handleUnionTypeComments(precedingNode, enclosingNode, followingNode, comment) || handleOnlyComments(enclosingNode, ast, comment, isLastComment) || handleImportDeclarationComments(text, enclosingNode, precedingNode, comment, options) || handleAssignmentPatternComments(enclosingNode, comment) || handleMethodNameComments(text, enclosingNode, precedingNode, comment, options)) { | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function handleEndOfLineComment(comment, text, options, ast, isLastComment) { | 
						|
  var precedingNode = comment.precedingNode, | 
						|
      enclosingNode = comment.enclosingNode, | 
						|
      followingNode = comment.followingNode; | 
						|
 | 
						|
  if (handleLastFunctionArgComments(text, precedingNode, enclosingNode, followingNode, comment, options) || handleConditionalExpressionComments(enclosingNode, precedingNode, followingNode, comment, text, options) || handleImportSpecifierComments(enclosingNode, comment) || handleIfStatementComments(text, precedingNode, enclosingNode, followingNode, comment, options) || handleWhileComments(text, precedingNode, enclosingNode, followingNode, comment, options) || handleTryStatementComments(enclosingNode, precedingNode, followingNode, comment) || handleClassComments(enclosingNode, precedingNode, followingNode, comment) || handleLabeledStatementComments(enclosingNode, comment) || handleCallExpressionComments(precedingNode, enclosingNode, comment) || handlePropertyComments(enclosingNode, comment) || handleOnlyComments(enclosingNode, ast, comment, isLastComment) || handleTypeAliasComments(enclosingNode, followingNode, comment) || handleVariableDeclaratorComments(enclosingNode, followingNode, comment)) { | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function handleRemainingComment(comment, text, options, ast, isLastComment) { | 
						|
  var precedingNode = comment.precedingNode, | 
						|
      enclosingNode = comment.enclosingNode, | 
						|
      followingNode = comment.followingNode; | 
						|
 | 
						|
  if (handleIfStatementComments(text, precedingNode, enclosingNode, followingNode, comment, options) || handleWhileComments(text, precedingNode, enclosingNode, followingNode, comment, options) || handleObjectPropertyAssignment(enclosingNode, precedingNode, comment) || handleCommentInEmptyParens(text, enclosingNode, comment, options) || handleMethodNameComments(text, enclosingNode, precedingNode, comment, options) || handleOnlyComments(enclosingNode, ast, comment, isLastComment) || handleCommentAfterArrowParams(text, enclosingNode, comment, options) || handleFunctionNameComments(text, enclosingNode, precedingNode, comment, options) || handleTSMappedTypeComments(text, enclosingNode, precedingNode, followingNode, comment) || handleBreakAndContinueStatementComments(enclosingNode, comment)) { | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function addBlockStatementFirstComment(node, comment) { | 
						|
  var body = node.body.filter(function (n) { | 
						|
    return n.type !== "EmptyStatement"; | 
						|
  }); | 
						|
 | 
						|
  if (body.length === 0) { | 
						|
    addDanglingComment$2(node, comment); | 
						|
  } else { | 
						|
    addLeadingComment$2(body[0], comment); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function addBlockOrNotComment(node, comment) { | 
						|
  if (node.type === "BlockStatement") { | 
						|
    addBlockStatementFirstComment(node, comment); | 
						|
  } else { | 
						|
    addLeadingComment$2(node, comment); | 
						|
  } | 
						|
} // There are often comments before the else clause of if statements like | 
						|
// | 
						|
//   if (1) { ... } | 
						|
//   // comment | 
						|
//   else { ... } | 
						|
// | 
						|
// They are being attached as leading comments of the BlockExpression which | 
						|
// is not well printed. What we want is to instead move the comment inside | 
						|
// of the block and make it leadingComment of the first element of the block | 
						|
// or dangling comment of the block if there is nothing inside | 
						|
// | 
						|
//   if (1) { ... } | 
						|
//   else { | 
						|
//     // comment | 
						|
//     ... | 
						|
//   } | 
						|
 | 
						|
 | 
						|
function handleIfStatementComments(text, precedingNode, enclosingNode, followingNode, comment, options) { | 
						|
  if (!enclosingNode || enclosingNode.type !== "IfStatement" || !followingNode) { | 
						|
    return false; | 
						|
  } // We unfortunately have no way using the AST or location of nodes to know | 
						|
  // if the comment is positioned before the condition parenthesis: | 
						|
  //   if (a /* comment */) {} | 
						|
  // The only workaround I found is to look at the next character to see if | 
						|
  // it is a ). | 
						|
 | 
						|
 | 
						|
  var nextCharacter = util.getNextNonSpaceNonCommentCharacter(text, comment, options.locEnd); | 
						|
 | 
						|
  if (nextCharacter === ")") { | 
						|
    addTrailingComment$2(precedingNode, comment); | 
						|
    return true; | 
						|
  } // Comments before `else`: | 
						|
  // - treat as trailing comments of the consequent, if it's a BlockStatement | 
						|
  // - treat as a dangling comment otherwise | 
						|
 | 
						|
 | 
						|
  if (precedingNode === enclosingNode.consequent && followingNode === enclosingNode.alternate) { | 
						|
    if (precedingNode.type === "BlockStatement") { | 
						|
      addTrailingComment$2(precedingNode, comment); | 
						|
    } else { | 
						|
      addDanglingComment$2(enclosingNode, comment); | 
						|
    } | 
						|
 | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  if (followingNode.type === "BlockStatement") { | 
						|
    addBlockStatementFirstComment(followingNode, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  if (followingNode.type === "IfStatement") { | 
						|
    addBlockOrNotComment(followingNode.consequent, comment); | 
						|
    return true; | 
						|
  } // For comments positioned after the condition parenthesis in an if statement | 
						|
  // before the consequent without brackets on, such as | 
						|
  // if (a) /* comment */ true, | 
						|
  // we look at the next character to see if the following node | 
						|
  // is the consequent for the if statement | 
						|
 | 
						|
 | 
						|
  if (enclosingNode.consequent === followingNode) { | 
						|
    addLeadingComment$2(followingNode, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function handleWhileComments(text, precedingNode, enclosingNode, followingNode, comment, options) { | 
						|
  if (!enclosingNode || enclosingNode.type !== "WhileStatement" || !followingNode) { | 
						|
    return false; | 
						|
  } // We unfortunately have no way using the AST or location of nodes to know | 
						|
  // if the comment is positioned before the condition parenthesis: | 
						|
  //   while (a /* comment */) {} | 
						|
  // The only workaround I found is to look at the next character to see if | 
						|
  // it is a ). | 
						|
 | 
						|
 | 
						|
  var nextCharacter = util.getNextNonSpaceNonCommentCharacter(text, comment, options.locEnd); | 
						|
 | 
						|
  if (nextCharacter === ")") { | 
						|
    addTrailingComment$2(precedingNode, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  if (followingNode.type === "BlockStatement") { | 
						|
    addBlockStatementFirstComment(followingNode, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} // Same as IfStatement but for TryStatement | 
						|
 | 
						|
 | 
						|
function handleTryStatementComments(enclosingNode, precedingNode, followingNode, comment) { | 
						|
  if (!enclosingNode || enclosingNode.type !== "TryStatement" && enclosingNode.type !== "CatchClause" || !followingNode) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  if (enclosingNode.type === "CatchClause" && precedingNode) { | 
						|
    addTrailingComment$2(precedingNode, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  if (followingNode.type === "BlockStatement") { | 
						|
    addBlockStatementFirstComment(followingNode, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  if (followingNode.type === "TryStatement") { | 
						|
    addBlockOrNotComment(followingNode.finalizer, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  if (followingNode.type === "CatchClause") { | 
						|
    addBlockOrNotComment(followingNode.body, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function handleMemberExpressionComments(enclosingNode, followingNode, comment) { | 
						|
  if (enclosingNode && (enclosingNode.type === "MemberExpression" || enclosingNode.type === "OptionalMemberExpression") && followingNode && followingNode.type === "Identifier") { | 
						|
    addLeadingComment$2(enclosingNode, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function handleConditionalExpressionComments(enclosingNode, precedingNode, followingNode, comment, text, options) { | 
						|
  var isSameLineAsPrecedingNode = precedingNode && !util.hasNewlineInRange(text, options.locEnd(precedingNode), options.locStart(comment)); | 
						|
 | 
						|
  if ((!precedingNode || !isSameLineAsPrecedingNode) && enclosingNode && enclosingNode.type === "ConditionalExpression" && followingNode) { | 
						|
    addLeadingComment$2(followingNode, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function handleObjectPropertyAssignment(enclosingNode, precedingNode, comment) { | 
						|
  if (enclosingNode && (enclosingNode.type === "ObjectProperty" || enclosingNode.type === "Property") && enclosingNode.shorthand && enclosingNode.key === precedingNode && enclosingNode.value.type === "AssignmentPattern") { | 
						|
    addTrailingComment$2(enclosingNode.value.left, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function handleClassComments(enclosingNode, precedingNode, followingNode, comment) { | 
						|
  if (enclosingNode && (enclosingNode.type === "ClassDeclaration" || enclosingNode.type === "ClassExpression") && enclosingNode.decorators && enclosingNode.decorators.length > 0 && !(followingNode && followingNode.type === "Decorator")) { | 
						|
    if (!enclosingNode.decorators || enclosingNode.decorators.length === 0) { | 
						|
      addLeadingComment$2(enclosingNode, comment); | 
						|
    } else { | 
						|
      addTrailingComment$2(enclosingNode.decorators[enclosingNode.decorators.length - 1], comment); | 
						|
    } | 
						|
 | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function handleMethodNameComments(text, enclosingNode, precedingNode, comment, options) { | 
						|
  // This is only needed for estree parsers (flow, typescript) to attach | 
						|
  // after a method name: | 
						|
  // obj = { fn /*comment*/() {} }; | 
						|
  if (enclosingNode && precedingNode && (enclosingNode.type === "Property" || enclosingNode.type === "MethodDefinition") && precedingNode.type === "Identifier" && enclosingNode.key === precedingNode && // special Property case: { key: /*comment*/(value) }; | 
						|
  // comment should be attached to value instead of key | 
						|
  util.getNextNonSpaceNonCommentCharacter(text, precedingNode, options.locEnd) !== ":") { | 
						|
    addTrailingComment$2(precedingNode, comment); | 
						|
    return true; | 
						|
  } // Print comments between decorators and class methods as a trailing comment | 
						|
  // on the decorator node instead of the method node | 
						|
 | 
						|
 | 
						|
  if (precedingNode && enclosingNode && precedingNode.type === "Decorator" && (enclosingNode.type === "ClassMethod" || enclosingNode.type === "ClassProperty" || enclosingNode.type === "TSAbstractClassProperty" || enclosingNode.type === "TSAbstractMethodDefinition" || enclosingNode.type === "MethodDefinition")) { | 
						|
    addTrailingComment$2(precedingNode, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function handleFunctionNameComments(text, enclosingNode, precedingNode, comment, options) { | 
						|
  if (util.getNextNonSpaceNonCommentCharacter(text, comment, options.locEnd) !== "(") { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  if (precedingNode && enclosingNode && (enclosingNode.type === "FunctionDeclaration" || enclosingNode.type === "FunctionExpression" || enclosingNode.type === "ClassMethod" || enclosingNode.type === "MethodDefinition" || enclosingNode.type === "ObjectMethod")) { | 
						|
    addTrailingComment$2(precedingNode, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function handleCommentAfterArrowParams(text, enclosingNode, comment, options) { | 
						|
  if (!(enclosingNode && enclosingNode.type === "ArrowFunctionExpression")) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  var index = utilShared.getNextNonSpaceNonCommentCharacterIndex(text, comment, options); | 
						|
 | 
						|
  if (text.substr(index, 2) === "=>") { | 
						|
    addDanglingComment$2(enclosingNode, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function handleCommentInEmptyParens(text, enclosingNode, comment, options) { | 
						|
  if (util.getNextNonSpaceNonCommentCharacter(text, comment, options.locEnd) !== ")") { | 
						|
    return false; | 
						|
  } // Only add dangling comments to fix the case when no params are present, | 
						|
  // i.e. a function without any argument. | 
						|
 | 
						|
 | 
						|
  if (enclosingNode && ((enclosingNode.type === "FunctionDeclaration" || enclosingNode.type === "FunctionExpression" || enclosingNode.type === "ArrowFunctionExpression" || enclosingNode.type === "ClassMethod" || enclosingNode.type === "ObjectMethod") && enclosingNode.params.length === 0 || (enclosingNode.type === "CallExpression" || enclosingNode.type === "OptionalCallExpression" || enclosingNode.type === "NewExpression") && enclosingNode.arguments.length === 0)) { | 
						|
    addDanglingComment$2(enclosingNode, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  if (enclosingNode && enclosingNode.type === "MethodDefinition" && enclosingNode.value.params.length === 0) { | 
						|
    addDanglingComment$2(enclosingNode.value, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function handleLastFunctionArgComments(text, precedingNode, enclosingNode, followingNode, comment, options) { | 
						|
  // Type definitions functions | 
						|
  if (precedingNode && precedingNode.type === "FunctionTypeParam" && enclosingNode && enclosingNode.type === "FunctionTypeAnnotation" && followingNode && followingNode.type !== "FunctionTypeParam") { | 
						|
    addTrailingComment$2(precedingNode, comment); | 
						|
    return true; | 
						|
  } // Real functions | 
						|
 | 
						|
 | 
						|
  if (precedingNode && (precedingNode.type === "Identifier" || precedingNode.type === "AssignmentPattern") && enclosingNode && (enclosingNode.type === "ArrowFunctionExpression" || enclosingNode.type === "FunctionExpression" || enclosingNode.type === "FunctionDeclaration" || enclosingNode.type === "ObjectMethod" || enclosingNode.type === "ClassMethod") && util.getNextNonSpaceNonCommentCharacter(text, comment, options.locEnd) === ")") { | 
						|
    addTrailingComment$2(precedingNode, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  if (enclosingNode && enclosingNode.type === "FunctionDeclaration" && followingNode && followingNode.type === "BlockStatement") { | 
						|
    var functionParamRightParenIndex = function () { | 
						|
      if (enclosingNode.params.length !== 0) { | 
						|
        return util.getNextNonSpaceNonCommentCharacterIndexWithStartIndex(text, options.locEnd(util.getLast(enclosingNode.params))); | 
						|
      } | 
						|
 | 
						|
      var functionParamLeftParenIndex = util.getNextNonSpaceNonCommentCharacterIndexWithStartIndex(text, options.locEnd(enclosingNode.id)); | 
						|
      return util.getNextNonSpaceNonCommentCharacterIndexWithStartIndex(text, functionParamLeftParenIndex + 1); | 
						|
    }(); | 
						|
 | 
						|
    if (options.locStart(comment) > functionParamRightParenIndex) { | 
						|
      addBlockStatementFirstComment(followingNode, comment); | 
						|
      return true; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function handleImportSpecifierComments(enclosingNode, comment) { | 
						|
  if (enclosingNode && enclosingNode.type === "ImportSpecifier") { | 
						|
    addLeadingComment$2(enclosingNode, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function handleLabeledStatementComments(enclosingNode, comment) { | 
						|
  if (enclosingNode && enclosingNode.type === "LabeledStatement") { | 
						|
    addLeadingComment$2(enclosingNode, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function handleBreakAndContinueStatementComments(enclosingNode, comment) { | 
						|
  if (enclosingNode && (enclosingNode.type === "ContinueStatement" || enclosingNode.type === "BreakStatement") && !enclosingNode.label) { | 
						|
    addTrailingComment$2(enclosingNode, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function handleCallExpressionComments(precedingNode, enclosingNode, comment) { | 
						|
  if (enclosingNode && (enclosingNode.type === "CallExpression" || enclosingNode.type === "OptionalCallExpression") && precedingNode && enclosingNode.callee === precedingNode && enclosingNode.arguments.length > 0) { | 
						|
    addLeadingComment$2(enclosingNode.arguments[0], comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function handleUnionTypeComments(precedingNode, enclosingNode, followingNode, comment) { | 
						|
  if (enclosingNode && (enclosingNode.type === "UnionTypeAnnotation" || enclosingNode.type === "TSUnionType")) { | 
						|
    addTrailingComment$2(precedingNode, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function handlePropertyComments(enclosingNode, comment) { | 
						|
  if (enclosingNode && (enclosingNode.type === "Property" || enclosingNode.type === "ObjectProperty")) { | 
						|
    addLeadingComment$2(enclosingNode, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function handleOnlyComments(enclosingNode, ast, comment, isLastComment) { | 
						|
  // With Flow the enclosingNode is undefined so use the AST instead. | 
						|
  if (ast && ast.body && ast.body.length === 0) { | 
						|
    if (isLastComment) { | 
						|
      addDanglingComment$2(ast, comment); | 
						|
    } else { | 
						|
      addLeadingComment$2(ast, comment); | 
						|
    } | 
						|
 | 
						|
    return true; | 
						|
  } else if (enclosingNode && enclosingNode.type === "Program" && enclosingNode.body.length === 0 && enclosingNode.directives && enclosingNode.directives.length === 0) { | 
						|
    if (isLastComment) { | 
						|
      addDanglingComment$2(enclosingNode, comment); | 
						|
    } else { | 
						|
      addLeadingComment$2(enclosingNode, comment); | 
						|
    } | 
						|
 | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function handleForComments(enclosingNode, precedingNode, comment) { | 
						|
  if (enclosingNode && (enclosingNode.type === "ForInStatement" || enclosingNode.type === "ForOfStatement")) { | 
						|
    addLeadingComment$2(enclosingNode, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function handleImportDeclarationComments(text, enclosingNode, precedingNode, comment, options) { | 
						|
  if (precedingNode && precedingNode.type === "ImportSpecifier" && enclosingNode && enclosingNode.type === "ImportDeclaration" && util.hasNewline(text, options.locEnd(comment))) { | 
						|
    addTrailingComment$2(precedingNode, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function handleAssignmentPatternComments(enclosingNode, comment) { | 
						|
  if (enclosingNode && enclosingNode.type === "AssignmentPattern") { | 
						|
    addLeadingComment$2(enclosingNode, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function handleTypeAliasComments(enclosingNode, followingNode, comment) { | 
						|
  if (enclosingNode && enclosingNode.type === "TypeAlias") { | 
						|
    addLeadingComment$2(enclosingNode, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function handleVariableDeclaratorComments(enclosingNode, followingNode, comment) { | 
						|
  if (enclosingNode && (enclosingNode.type === "VariableDeclarator" || enclosingNode.type === "AssignmentExpression") && followingNode && (followingNode.type === "ObjectExpression" || followingNode.type === "ArrayExpression" || followingNode.type === "TemplateLiteral" || followingNode.type === "TaggedTemplateExpression")) { | 
						|
    addLeadingComment$2(followingNode, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function handleTSMappedTypeComments(text, enclosingNode, precedingNode, followingNode, comment) { | 
						|
  if (!enclosingNode || enclosingNode.type !== "TSMappedType") { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  if (followingNode && followingNode.type === "TSTypeParameter" && followingNode.name) { | 
						|
    addLeadingComment$2(followingNode.name, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  if (precedingNode && precedingNode.type === "TSTypeParameter" && precedingNode.constraint) { | 
						|
    addTrailingComment$2(precedingNode.constraint, comment); | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function isBlockComment(comment) { | 
						|
  return comment.type === "Block" || comment.type === "CommentBlock"; | 
						|
} | 
						|
 | 
						|
function hasLeadingComment(node) { | 
						|
  var fn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () { | 
						|
    return true; | 
						|
  }; | 
						|
 | 
						|
  if (node.leadingComments) { | 
						|
    return node.leadingComments.some(fn); | 
						|
  } | 
						|
 | 
						|
  if (node.comments) { | 
						|
    return node.comments.some(function (comment) { | 
						|
      return comment.leading && fn(comment); | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
var comments$1 = { | 
						|
  handleOwnLineComment, | 
						|
  handleEndOfLineComment, | 
						|
  handleRemainingComment, | 
						|
  hasLeadingComment, | 
						|
  isBlockComment | 
						|
}; | 
						|
 | 
						|
var isBlockComment$1 = comments$1.isBlockComment, | 
						|
    hasLeadingComment$1 = comments$1.hasLeadingComment; | 
						|
var _require$$1$builders = doc.builders, | 
						|
    indent$2 = _require$$1$builders.indent, | 
						|
    join$2 = _require$$1$builders.join, | 
						|
    hardline$3 = _require$$1$builders.hardline, | 
						|
    softline$1 = _require$$1$builders.softline, | 
						|
    literalline$1 = _require$$1$builders.literalline, | 
						|
    concat$4 = _require$$1$builders.concat, | 
						|
    group$1 = _require$$1$builders.group, | 
						|
    dedentToRoot$1 = _require$$1$builders.dedentToRoot, | 
						|
    _require$$1$utils = doc.utils, | 
						|
    mapDoc$3 = _require$$1$utils.mapDoc, | 
						|
    stripTrailingHardline$1 = _require$$1$utils.stripTrailingHardline; | 
						|
 | 
						|
function embed(path, print, textToDoc, options) { | 
						|
  var node = path.getValue(); | 
						|
  var parent = path.getParentNode(); | 
						|
  var parentParent = path.getParentNode(1); | 
						|
 | 
						|
  switch (node.type) { | 
						|
    case "TemplateLiteral": | 
						|
      { | 
						|
        var isCss = [isStyledJsx, isStyledComponents, isCssProp, isAngularComponentStyles].some(function (isIt) { | 
						|
          return isIt(path); | 
						|
        }); | 
						|
 | 
						|
        if (isCss) { | 
						|
          // Get full template literal with expressions replaced by placeholders | 
						|
          var rawQuasis = node.quasis.map(function (q) { | 
						|
            return q.value.raw; | 
						|
          }); | 
						|
          var placeholderID = 0; | 
						|
          var text = rawQuasis.reduce(function (prevVal, currVal, idx) { | 
						|
            return idx == 0 ? currVal : prevVal + "@prettier-placeholder-" + placeholderID++ + "-id" + currVal; | 
						|
          }, ""); | 
						|
          var doc = textToDoc(text, { | 
						|
            parser: "css" | 
						|
          }); | 
						|
          return transformCssDoc(doc, path, print); | 
						|
        } | 
						|
        /* | 
						|
         * react-relay and graphql-tag | 
						|
         * graphql`...` | 
						|
         * graphql.experimental`...` | 
						|
         * gql`...` | 
						|
         * | 
						|
         * This intentionally excludes Relay Classic tags, as Prettier does not | 
						|
         * support Relay Classic formatting. | 
						|
         */ | 
						|
 | 
						|
 | 
						|
        if (isGraphQL(path)) { | 
						|
          var expressionDocs = node.expressions ? path.map(print, "expressions") : []; | 
						|
          var numQuasis = node.quasis.length; | 
						|
 | 
						|
          if (numQuasis === 1 && node.quasis[0].value.raw.trim() === "") { | 
						|
            return "``"; | 
						|
          } | 
						|
 | 
						|
          var parts = []; | 
						|
 | 
						|
          for (var i = 0; i < numQuasis; i++) { | 
						|
            var templateElement = node.quasis[i]; | 
						|
            var isFirst = i === 0; | 
						|
            var isLast = i === numQuasis - 1; | 
						|
            var _text = templateElement.value.cooked; // Bail out if any of the quasis have an invalid escape sequence | 
						|
            // (which would make the `cooked` value be `null` or `undefined`) | 
						|
 | 
						|
            if (typeof _text !== "string") { | 
						|
              return null; | 
						|
            } | 
						|
 | 
						|
            var lines = _text.split("\n"); | 
						|
 | 
						|
            var numLines = lines.length; | 
						|
            var expressionDoc = expressionDocs[i]; | 
						|
            var startsWithBlankLine = numLines > 2 && lines[0].trim() === "" && lines[1].trim() === ""; | 
						|
            var endsWithBlankLine = numLines > 2 && lines[numLines - 1].trim() === "" && lines[numLines - 2].trim() === ""; | 
						|
            var commentsAndWhitespaceOnly = lines.every(function (line) { | 
						|
              return /^\s*(?:#[^\r\n]*)?$/.test(line); | 
						|
            }); // Bail out if an interpolation occurs within a comment. | 
						|
 | 
						|
            if (!isLast && /#[^\r\n]*$/.test(lines[numLines - 1])) { | 
						|
              return null; | 
						|
            } | 
						|
 | 
						|
            var _doc = null; | 
						|
 | 
						|
            if (commentsAndWhitespaceOnly) { | 
						|
              _doc = printGraphqlComments(lines); | 
						|
            } else { | 
						|
              _doc = stripTrailingHardline$1(textToDoc(_text, { | 
						|
                parser: "graphql" | 
						|
              })); | 
						|
            } | 
						|
 | 
						|
            if (_doc) { | 
						|
              _doc = escapeTemplateCharacters(_doc, false); | 
						|
 | 
						|
              if (!isFirst && startsWithBlankLine) { | 
						|
                parts.push(""); | 
						|
              } | 
						|
 | 
						|
              parts.push(_doc); | 
						|
 | 
						|
              if (!isLast && endsWithBlankLine) { | 
						|
                parts.push(""); | 
						|
              } | 
						|
            } else if (!isFirst && !isLast && startsWithBlankLine) { | 
						|
              parts.push(""); | 
						|
            } | 
						|
 | 
						|
            if (expressionDoc) { | 
						|
              parts.push(concat$4(["${", expressionDoc, "}"])); | 
						|
            } | 
						|
          } | 
						|
 | 
						|
          return concat$4(["`", indent$2(concat$4([hardline$3, join$2(hardline$3, parts)])), hardline$3, "`"]); | 
						|
        } | 
						|
 | 
						|
        var htmlParser = isHtml(path) ? "html" : isAngularComponentTemplate(path) ? "angular" : undefined; | 
						|
 | 
						|
        if (htmlParser) { | 
						|
          return printHtmlTemplateLiteral(path, print, textToDoc, htmlParser, options.embeddedInHtml); | 
						|
        } | 
						|
 | 
						|
        break; | 
						|
      } | 
						|
 | 
						|
    case "TemplateElement": | 
						|
      { | 
						|
        /** | 
						|
         * md`...` | 
						|
         * markdown`...` | 
						|
         */ | 
						|
        if (parentParent && parentParent.type === "TaggedTemplateExpression" && parent.quasis.length === 1 && parentParent.tag.type === "Identifier" && (parentParent.tag.name === "md" || parentParent.tag.name === "markdown")) { | 
						|
          var _text2 = parent.quasis[0].value.raw.replace(/((?:\\\\)*)\\`/g, function (_, backslashes) { | 
						|
            return "\\".repeat(backslashes.length / 2) + "`"; | 
						|
          }); | 
						|
 | 
						|
          var indentation = getIndentation(_text2); | 
						|
          var hasIndent = indentation !== ""; | 
						|
          return concat$4([hasIndent ? indent$2(concat$4([softline$1, printMarkdown(_text2.replace(new RegExp(`^${indentation}`, "gm"), ""))])) : concat$4([literalline$1, dedentToRoot$1(printMarkdown(_text2))]), softline$1]); | 
						|
        } | 
						|
 | 
						|
        break; | 
						|
      } | 
						|
  } | 
						|
 | 
						|
  function printMarkdown(text) { | 
						|
    var doc = textToDoc(text, { | 
						|
      parser: "markdown", | 
						|
      __inJsTemplate: true | 
						|
    }); | 
						|
    return stripTrailingHardline$1(escapeTemplateCharacters(doc, true)); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function getIndentation(str) { | 
						|
  var firstMatchedIndent = str.match(/^([^\S\n]*)\S/m); | 
						|
  return firstMatchedIndent === null ? "" : firstMatchedIndent[1]; | 
						|
} | 
						|
 | 
						|
function uncook(cookedValue) { | 
						|
  return cookedValue.replace(/([\\`]|\$\{)/g, "\\$1"); | 
						|
} | 
						|
 | 
						|
function escapeTemplateCharacters(doc, raw) { | 
						|
  return mapDoc$3(doc, function (currentDoc) { | 
						|
    if (!currentDoc.parts) { | 
						|
      return currentDoc; | 
						|
    } | 
						|
 | 
						|
    var parts = []; | 
						|
    currentDoc.parts.forEach(function (part) { | 
						|
      if (typeof part === "string") { | 
						|
        parts.push(raw ? part.replace(/(\\*)`/g, "$1$1\\`") : uncook(part)); | 
						|
      } else { | 
						|
        parts.push(part); | 
						|
      } | 
						|
    }); | 
						|
    return Object.assign({}, currentDoc, { | 
						|
      parts | 
						|
    }); | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function transformCssDoc(quasisDoc, path, print) { | 
						|
  var parentNode = path.getValue(); | 
						|
  var isEmpty = parentNode.quasis.length === 1 && !parentNode.quasis[0].value.raw.trim(); | 
						|
 | 
						|
  if (isEmpty) { | 
						|
    return "``"; | 
						|
  } | 
						|
 | 
						|
  var expressionDocs = parentNode.expressions ? path.map(print, "expressions") : []; | 
						|
  var newDoc = replacePlaceholders(quasisDoc, expressionDocs); | 
						|
  /* istanbul ignore if */ | 
						|
 | 
						|
  if (!newDoc) { | 
						|
    throw new Error("Couldn't insert all the expressions"); | 
						|
  } | 
						|
 | 
						|
  return concat$4(["`", indent$2(concat$4([hardline$3, stripTrailingHardline$1(newDoc)])), softline$1, "`"]); | 
						|
} // Search all the placeholders in the quasisDoc tree | 
						|
// and replace them with the expression docs one by one | 
						|
// returns a new doc with all the placeholders replaced, | 
						|
// or null if it couldn't replace any expression | 
						|
 | 
						|
 | 
						|
function replacePlaceholders(quasisDoc, expressionDocs) { | 
						|
  if (!expressionDocs || !expressionDocs.length) { | 
						|
    return quasisDoc; | 
						|
  } | 
						|
 | 
						|
  var expressions = expressionDocs.slice(); | 
						|
  var replaceCounter = 0; | 
						|
  var newDoc = mapDoc$3(quasisDoc, function (doc) { | 
						|
    if (!doc || !doc.parts || !doc.parts.length) { | 
						|
      return doc; | 
						|
    } | 
						|
 | 
						|
    var parts = doc.parts; | 
						|
    var atIndex = parts.indexOf("@"); | 
						|
    var placeholderIndex = atIndex + 1; | 
						|
 | 
						|
    if (atIndex > -1 && typeof parts[placeholderIndex] === "string" && parts[placeholderIndex].startsWith("prettier-placeholder")) { | 
						|
      // If placeholder is split, join it | 
						|
      var at = parts[atIndex]; | 
						|
      var placeholder = parts[placeholderIndex]; | 
						|
      var rest = parts.slice(placeholderIndex + 1); | 
						|
      parts = parts.slice(0, atIndex).concat([at + placeholder]).concat(rest); | 
						|
    } | 
						|
 | 
						|
    var atPlaceholderIndex = parts.findIndex(function (part) { | 
						|
      return typeof part === "string" && part.startsWith("@prettier-placeholder"); | 
						|
    }); | 
						|
 | 
						|
    if (atPlaceholderIndex > -1) { | 
						|
      var _placeholder = parts[atPlaceholderIndex]; | 
						|
 | 
						|
      var _rest = parts.slice(atPlaceholderIndex + 1); | 
						|
 | 
						|
      var placeholderMatch = _placeholder.match(/@prettier-placeholder-(.+)-id([\s\S]*)/); | 
						|
 | 
						|
      var placeholderID = placeholderMatch[1]; // When the expression has a suffix appended, like: | 
						|
      // animation: linear ${time}s ease-out; | 
						|
 | 
						|
      var suffix = placeholderMatch[2]; | 
						|
      var expression = expressions[placeholderID]; | 
						|
      replaceCounter++; | 
						|
      parts = parts.slice(0, atPlaceholderIndex).concat(["${", expression, "}" + suffix]).concat(_rest); | 
						|
    } | 
						|
 | 
						|
    return Object.assign({}, doc, { | 
						|
      parts: parts | 
						|
    }); | 
						|
  }); | 
						|
  return expressions.length === replaceCounter ? newDoc : null; | 
						|
} | 
						|
 | 
						|
function printGraphqlComments(lines) { | 
						|
  var parts = []; | 
						|
  var seenComment = false; | 
						|
  lines.map(function (textLine) { | 
						|
    return textLine.trim(); | 
						|
  }).forEach(function (textLine, i, array) { | 
						|
    // Lines are either whitespace only, or a comment (with potential whitespace | 
						|
    // around it). Drop whitespace-only lines. | 
						|
    if (textLine === "") { | 
						|
      return; | 
						|
    } | 
						|
 | 
						|
    if (array[i - 1] === "" && seenComment) { | 
						|
      // If a non-first comment is preceded by a blank (whitespace only) line, | 
						|
      // add in a blank line. | 
						|
      parts.push(concat$4([hardline$3, textLine])); | 
						|
    } else { | 
						|
      parts.push(textLine); | 
						|
    } | 
						|
 | 
						|
    seenComment = true; | 
						|
  }); // If `lines` was whitespace only, return `null`. | 
						|
 | 
						|
  return parts.length === 0 ? null : join$2(hardline$3, parts); | 
						|
} | 
						|
/** | 
						|
 * Template literal in these contexts: | 
						|
 * <style jsx>{`div{color:red}`}</style> | 
						|
 * css`` | 
						|
 * css.global`` | 
						|
 * css.resolve`` | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function isStyledJsx(path) { | 
						|
  var node = path.getValue(); | 
						|
  var parent = path.getParentNode(); | 
						|
  var parentParent = path.getParentNode(1); | 
						|
  return parentParent && node.quasis && parent.type === "JSXExpressionContainer" && parentParent.type === "JSXElement" && parentParent.openingElement.name.name === "style" && parentParent.openingElement.attributes.some(function (attribute) { | 
						|
    return attribute.name.name === "jsx"; | 
						|
  }) || parent && parent.type === "TaggedTemplateExpression" && parent.tag.type === "Identifier" && parent.tag.name === "css" || parent && parent.type === "TaggedTemplateExpression" && parent.tag.type === "MemberExpression" && parent.tag.object.name === "css" && (parent.tag.property.name === "global" || parent.tag.property.name === "resolve"); | 
						|
} | 
						|
/** | 
						|
 * Angular Components can have: | 
						|
 * - Inline HTML template | 
						|
 * - Inline CSS styles | 
						|
 * | 
						|
 * ...which are both within template literals somewhere | 
						|
 * inside of the Component decorator factory. | 
						|
 * | 
						|
 * E.g. | 
						|
 * @Component({ | 
						|
 *  template: `<div>...</div>`, | 
						|
 *  styles: [`h1 { color: blue; }`] | 
						|
 * }) | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function isAngularComponentStyles(path) { | 
						|
  return isPathMatch(path, [function (node) { | 
						|
    return node.type === "TemplateLiteral"; | 
						|
  }, function (node, name) { | 
						|
    return node.type === "ArrayExpression" && name === "elements"; | 
						|
  }, function (node, name) { | 
						|
    return node.type === "Property" && node.key.type === "Identifier" && node.key.name === "styles" && name === "value"; | 
						|
  }].concat(getAngularComponentObjectExpressionPredicates())); | 
						|
} | 
						|
 | 
						|
function isAngularComponentTemplate(path) { | 
						|
  return isPathMatch(path, [function (node) { | 
						|
    return node.type === "TemplateLiteral"; | 
						|
  }, function (node, name) { | 
						|
    return node.type === "Property" && node.key.type === "Identifier" && node.key.name === "template" && name === "value"; | 
						|
  }].concat(getAngularComponentObjectExpressionPredicates())); | 
						|
} | 
						|
 | 
						|
function getAngularComponentObjectExpressionPredicates() { | 
						|
  return [function (node, name) { | 
						|
    return node.type === "ObjectExpression" && name === "properties"; | 
						|
  }, function (node, name) { | 
						|
    return node.type === "CallExpression" && node.callee.type === "Identifier" && node.callee.name === "Component" && name === "arguments"; | 
						|
  }, function (node, name) { | 
						|
    return node.type === "Decorator" && name === "expression"; | 
						|
  }]; | 
						|
} | 
						|
/** | 
						|
 * styled-components template literals | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function isStyledComponents(path) { | 
						|
  var parent = path.getParentNode(); | 
						|
 | 
						|
  if (!parent || parent.type !== "TaggedTemplateExpression") { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  var tag = parent.tag; | 
						|
 | 
						|
  switch (tag.type) { | 
						|
    case "MemberExpression": | 
						|
      return (// styled.foo`` | 
						|
        isStyledIdentifier(tag.object) || // Component.extend`` | 
						|
        isStyledExtend(tag) | 
						|
      ); | 
						|
 | 
						|
    case "CallExpression": | 
						|
      return (// styled(Component)`` | 
						|
        isStyledIdentifier(tag.callee) || tag.callee.type === "MemberExpression" && (tag.callee.object.type === "MemberExpression" && ( // styled.foo.attrs({})`` | 
						|
        isStyledIdentifier(tag.callee.object.object) || // Component.extend.attrs({})`` | 
						|
        isStyledExtend(tag.callee.object)) || // styled(Component).attrs({})`` | 
						|
        tag.callee.object.type === "CallExpression" && isStyledIdentifier(tag.callee.object.callee)) | 
						|
      ); | 
						|
 | 
						|
    case "Identifier": | 
						|
      // css`` | 
						|
      return tag.name === "css"; | 
						|
 | 
						|
    default: | 
						|
      return false; | 
						|
  } | 
						|
} | 
						|
/** | 
						|
 * JSX element with CSS prop | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function isCssProp(path) { | 
						|
  var parent = path.getParentNode(); | 
						|
  var parentParent = path.getParentNode(1); | 
						|
  return parentParent && parent.type === "JSXExpressionContainer" && parentParent.type === "JSXAttribute" && parentParent.name.type === "JSXIdentifier" && parentParent.name.name === "css"; | 
						|
} | 
						|
 | 
						|
function isStyledIdentifier(node) { | 
						|
  return node.type === "Identifier" && node.name === "styled"; | 
						|
} | 
						|
 | 
						|
function isStyledExtend(node) { | 
						|
  return /^[A-Z]/.test(node.object.name) && node.property.name === "extend"; | 
						|
} | 
						|
/* | 
						|
 * react-relay and graphql-tag | 
						|
 * graphql`...` | 
						|
 * graphql.experimental`...` | 
						|
 * gql`...` | 
						|
 * GraphQL comment block | 
						|
 * | 
						|
 * This intentionally excludes Relay Classic tags, as Prettier does not | 
						|
 * support Relay Classic formatting. | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function isGraphQL(path) { | 
						|
  var node = path.getValue(); | 
						|
  var parent = path.getParentNode(); | 
						|
  return hasLanguageComment(node, "GraphQL") || parent && (parent.type === "TaggedTemplateExpression" && (parent.tag.type === "MemberExpression" && parent.tag.object.name === "graphql" && parent.tag.property.name === "experimental" || parent.tag.type === "Identifier" && (parent.tag.name === "gql" || parent.tag.name === "graphql")) || parent.type === "CallExpression" && parent.callee.type === "Identifier" && parent.callee.name === "graphql"); | 
						|
} | 
						|
 | 
						|
function hasLanguageComment(node, languageName) { | 
						|
  // This checks for a leading comment that is exactly `/* GraphQL */` | 
						|
  // In order to be in line with other implementations of this comment tag | 
						|
  // we will not trim the comment value and we will expect exactly one space on | 
						|
  // either side of the GraphQL string | 
						|
  // Also see ./clean.js | 
						|
  return hasLeadingComment$1(node, function (comment) { | 
						|
    return isBlockComment$1(comment) && comment.value === ` ${languageName} `; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function isPathMatch(path, predicateStack) { | 
						|
  var stack = path.stack.slice(); | 
						|
  var name = null; | 
						|
  var node = stack.pop(); | 
						|
  var _iteratorNormalCompletion = true; | 
						|
  var _didIteratorError = false; | 
						|
  var _iteratorError = undefined; | 
						|
 | 
						|
  try { | 
						|
    for (var _iterator = predicateStack[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | 
						|
      var predicate = _step.value; | 
						|
 | 
						|
      if (node === undefined) { | 
						|
        return false; | 
						|
      } // skip index/array | 
						|
 | 
						|
 | 
						|
      if (typeof name === "number") { | 
						|
        name = stack.pop(); | 
						|
        node = stack.pop(); | 
						|
      } | 
						|
 | 
						|
      if (!predicate(node, name)) { | 
						|
        return false; | 
						|
      } | 
						|
 | 
						|
      name = stack.pop(); | 
						|
      node = stack.pop(); | 
						|
    } | 
						|
  } catch (err) { | 
						|
    _didIteratorError = true; | 
						|
    _iteratorError = err; | 
						|
  } finally { | 
						|
    try { | 
						|
      if (!_iteratorNormalCompletion && _iterator.return != null) { | 
						|
        _iterator.return(); | 
						|
      } | 
						|
    } finally { | 
						|
      if (_didIteratorError) { | 
						|
        throw _iteratorError; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return true; | 
						|
} | 
						|
/** | 
						|
 *     - html`...` | 
						|
 *     - HTML comment block | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function isHtml(path) { | 
						|
  var node = path.getValue(); | 
						|
  return hasLanguageComment(node, "HTML") || isPathMatch(path, [function (node) { | 
						|
    return node.type === "TemplateLiteral"; | 
						|
  }, function (node, name) { | 
						|
    return node.type === "TaggedTemplateExpression" && node.tag.type === "Identifier" && node.tag.name === "html" && name === "quasi"; | 
						|
  }]); | 
						|
} // The counter is needed to distinguish nested embeds. | 
						|
 | 
						|
 | 
						|
var htmlTemplateLiteralCounter = 0; | 
						|
 | 
						|
function printHtmlTemplateLiteral(path, print, textToDoc, parser, escapeClosingScriptTag) { | 
						|
  var node = path.getValue(); | 
						|
  var counter = htmlTemplateLiteralCounter; | 
						|
  htmlTemplateLiteralCounter = htmlTemplateLiteralCounter + 1 >>> 0; | 
						|
 | 
						|
  var composePlaceholder = function composePlaceholder(index) { | 
						|
    return `PRETTIER_HTML_PLACEHOLDER_${index}_${counter}_IN_JS`; | 
						|
  }; | 
						|
 | 
						|
  var text = node.quasis.map(function (quasi, index, quasis) { | 
						|
    return index === quasis.length - 1 ? quasi.value.cooked : quasi.value.cooked + composePlaceholder(index); | 
						|
  }).join(""); | 
						|
  var expressionDocs = path.map(print, "expressions"); | 
						|
 | 
						|
  if (expressionDocs.length === 0 && text.trim().length === 0) { | 
						|
    return "``"; | 
						|
  } | 
						|
 | 
						|
  var placeholderRegex = RegExp(composePlaceholder("(\\d+)"), "g"); | 
						|
  var contentDoc = mapDoc$3(stripTrailingHardline$1(textToDoc(text, { | 
						|
    parser | 
						|
  })), function (doc) { | 
						|
    if (typeof doc !== "string") { | 
						|
      return doc; | 
						|
    } | 
						|
 | 
						|
    var parts = []; | 
						|
    var components = doc.split(placeholderRegex); | 
						|
 | 
						|
    for (var i = 0; i < components.length; i++) { | 
						|
      var component = components[i]; | 
						|
 | 
						|
      if (i % 2 === 0) { | 
						|
        if (component) { | 
						|
          component = uncook(component); | 
						|
 | 
						|
          if (escapeClosingScriptTag) { | 
						|
            component = component.replace(/<\/(script)\b/gi, "<\\/$1"); | 
						|
          } | 
						|
 | 
						|
          parts.push(component); | 
						|
        } | 
						|
 | 
						|
        continue; | 
						|
      } | 
						|
 | 
						|
      var placeholderIndex = +component; | 
						|
      parts.push(concat$4(["${", group$1(expressionDocs[placeholderIndex]), "}"])); | 
						|
    } | 
						|
 | 
						|
    return concat$4(parts); | 
						|
  }); | 
						|
  return group$1(concat$4(["`", indent$2(concat$4([hardline$3, group$1(contentDoc)])), softline$1, "`"])); | 
						|
} | 
						|
 | 
						|
var embed_1 = embed; | 
						|
 | 
						|
function clean(ast, newObj, parent) { | 
						|
  ["range", "raw", "comments", "leadingComments", "trailingComments", "extra", "start", "end", "flags", "errors"].forEach(function (name) { | 
						|
    delete newObj[name]; | 
						|
  }); | 
						|
 | 
						|
  if (ast.type === "BigIntLiteral") { | 
						|
    newObj.value = newObj.value.toLowerCase(); | 
						|
  } // We remove extra `;` and add them when needed | 
						|
 | 
						|
 | 
						|
  if (ast.type === "EmptyStatement") { | 
						|
    return null; | 
						|
  } // We move text around, including whitespaces and add {" "} | 
						|
 | 
						|
 | 
						|
  if (ast.type === "JSXText") { | 
						|
    return null; | 
						|
  } | 
						|
 | 
						|
  if (ast.type === "JSXExpressionContainer" && ast.expression.type === "Literal" && ast.expression.value === " ") { | 
						|
    return null; | 
						|
  } // We remove unneeded parens around same-operator LogicalExpressions | 
						|
 | 
						|
 | 
						|
  if (isUnbalancedLogicalTree(newObj)) { | 
						|
    return rebalanceLogicalTree(newObj); | 
						|
  } // (TypeScript) Ignore `static` in `constructor(static p) {}` | 
						|
  // and `export` in `constructor(export p) {}` | 
						|
 | 
						|
 | 
						|
  if (ast.type === "TSParameterProperty" && ast.accessibility === null && !ast.readonly) { | 
						|
    return { | 
						|
      type: "Identifier", | 
						|
      name: ast.parameter.name, | 
						|
      typeAnnotation: newObj.parameter.typeAnnotation, | 
						|
      decorators: newObj.decorators | 
						|
    }; | 
						|
  } // (TypeScript) ignore empty `specifiers` array | 
						|
 | 
						|
 | 
						|
  if (ast.type === "TSNamespaceExportDeclaration" && ast.specifiers && ast.specifiers.length === 0) { | 
						|
    delete newObj.specifiers; | 
						|
  } // We convert <div></div> to <div /> | 
						|
 | 
						|
 | 
						|
  if (ast.type === "JSXOpeningElement") { | 
						|
    delete newObj.selfClosing; | 
						|
  } | 
						|
 | 
						|
  if (ast.type === "JSXElement") { | 
						|
    delete newObj.closingElement; | 
						|
  } // We change {'key': value} into {key: value} | 
						|
 | 
						|
 | 
						|
  if ((ast.type === "Property" || ast.type === "ObjectProperty" || ast.type === "MethodDefinition" || ast.type === "ClassProperty" || ast.type === "TSPropertySignature" || ast.type === "ObjectTypeProperty") && typeof ast.key === "object" && ast.key && (ast.key.type === "Literal" || ast.key.type === "StringLiteral" || ast.key.type === "Identifier")) { | 
						|
    delete newObj.key; | 
						|
  } | 
						|
 | 
						|
  if (ast.type === "OptionalMemberExpression" && ast.optional === false) { | 
						|
    newObj.type = "MemberExpression"; | 
						|
    delete newObj.optional; | 
						|
  } // Remove raw and cooked values from TemplateElement when it's CSS | 
						|
  // styled-jsx | 
						|
 | 
						|
 | 
						|
  if (ast.type === "JSXElement" && ast.openingElement.name.name === "style" && ast.openingElement.attributes.some(function (attr) { | 
						|
    return attr.name.name === "jsx"; | 
						|
  })) { | 
						|
    var templateLiterals = newObj.children.filter(function (child) { | 
						|
      return child.type === "JSXExpressionContainer" && child.expression.type === "TemplateLiteral"; | 
						|
    }).map(function (container) { | 
						|
      return container.expression; | 
						|
    }); | 
						|
    var quasis = templateLiterals.reduce(function (quasis, templateLiteral) { | 
						|
      return quasis.concat(templateLiteral.quasis); | 
						|
    }, []); | 
						|
    quasis.forEach(function (q) { | 
						|
      return delete q.value; | 
						|
    }); | 
						|
  } // CSS template literals in css prop | 
						|
 | 
						|
 | 
						|
  if (ast.type === "JSXAttribute" && ast.name.name === "css" && ast.value.type === "JSXExpressionContainer" && ast.value.expression.type === "TemplateLiteral") { | 
						|
    newObj.value.expression.quasis.forEach(function (q) { | 
						|
      return delete q.value; | 
						|
    }); | 
						|
  } // Angular Components: Inline HTML template and Inline CSS styles | 
						|
 | 
						|
 | 
						|
  var expression = ast.expression || ast.callee; | 
						|
 | 
						|
  if (ast.type === "Decorator" && expression.type === "CallExpression" && expression.callee.name === "Component" && expression.arguments.length === 1) { | 
						|
    var astProps = ast.expression.arguments[0].properties; | 
						|
    newObj.expression.arguments[0].properties.forEach(function (prop, index) { | 
						|
      var templateLiteral = null; | 
						|
 | 
						|
      switch (astProps[index].key.name) { | 
						|
        case "styles": | 
						|
          if (prop.value.type === "ArrayExpression") { | 
						|
            templateLiteral = prop.value.elements[0]; | 
						|
          } | 
						|
 | 
						|
          break; | 
						|
 | 
						|
        case "template": | 
						|
          if (prop.value.type === "TemplateLiteral") { | 
						|
            templateLiteral = prop.value; | 
						|
          } | 
						|
 | 
						|
          break; | 
						|
      } | 
						|
 | 
						|
      if (templateLiteral) { | 
						|
        templateLiteral.quasis.forEach(function (q) { | 
						|
          return delete q.value; | 
						|
        }); | 
						|
      } | 
						|
    }); | 
						|
  } // styled-components, graphql, markdown | 
						|
 | 
						|
 | 
						|
  if (ast.type === "TaggedTemplateExpression" && (ast.tag.type === "MemberExpression" || ast.tag.type === "Identifier" && (ast.tag.name === "gql" || ast.tag.name === "graphql" || ast.tag.name === "css" || ast.tag.name === "md" || ast.tag.name === "markdown" || ast.tag.name === "html") || ast.tag.type === "CallExpression")) { | 
						|
    newObj.quasi.quasis.forEach(function (quasi) { | 
						|
      return delete quasi.value; | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  if (ast.type === "TemplateLiteral") { | 
						|
    // This checks for a leading comment that is exactly `/* GraphQL */` | 
						|
    // In order to be in line with other implementations of this comment tag | 
						|
    // we will not trim the comment value and we will expect exactly one space on | 
						|
    // either side of the GraphQL string | 
						|
    // Also see ./embed.js | 
						|
    var hasLanguageComment = ast.leadingComments && ast.leadingComments.some(function (comment) { | 
						|
      return comment.type === "CommentBlock" && ["GraphQL", "HTML"].some(function (languageName) { | 
						|
        return comment.value === ` ${languageName} `; | 
						|
      }); | 
						|
    }); | 
						|
 | 
						|
    if (hasLanguageComment || parent.type === "CallExpression" && parent.callee.name === "graphql") { | 
						|
      newObj.quasis.forEach(function (quasi) { | 
						|
        return delete quasi.value; | 
						|
      }); | 
						|
    } | 
						|
  } | 
						|
} | 
						|
 | 
						|
function isUnbalancedLogicalTree(newObj) { | 
						|
  return newObj.type === "LogicalExpression" && newObj.right.type === "LogicalExpression" && newObj.operator === newObj.right.operator; | 
						|
} | 
						|
 | 
						|
function rebalanceLogicalTree(newObj) { | 
						|
  if (isUnbalancedLogicalTree(newObj)) { | 
						|
    return rebalanceLogicalTree({ | 
						|
      type: "LogicalExpression", | 
						|
      operator: newObj.operator, | 
						|
      left: rebalanceLogicalTree({ | 
						|
        type: "LogicalExpression", | 
						|
        operator: newObj.operator, | 
						|
        left: newObj.left, | 
						|
        right: newObj.right.left, | 
						|
        loc: {} | 
						|
      }), | 
						|
      right: newObj.right.right, | 
						|
      loc: {} | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  return newObj; | 
						|
} | 
						|
 | 
						|
var clean_1 = clean; | 
						|
 | 
						|
var detectNewline = createCommonjsModule(function (module) { | 
						|
 | 
						|
  module.exports = function (str) { | 
						|
    if (typeof str !== 'string') { | 
						|
      throw new TypeError('Expected a string'); | 
						|
    } | 
						|
 | 
						|
    var newlines = str.match(/(?:\r?\n)/g) || []; | 
						|
 | 
						|
    if (newlines.length === 0) { | 
						|
      return null; | 
						|
    } | 
						|
 | 
						|
    var crlf = newlines.filter(function (el) { | 
						|
      return el === '\r\n'; | 
						|
    }).length; | 
						|
    var lf = newlines.length - crlf; | 
						|
    return crlf > lf ? '\r\n' : '\n'; | 
						|
  }; | 
						|
 | 
						|
  module.exports.graceful = function (str) { | 
						|
    return module.exports(str) || '\n'; | 
						|
  }; | 
						|
}); | 
						|
var detectNewline_1 = detectNewline.graceful; | 
						|
 | 
						|
var build = createCommonjsModule(function (module, exports) { | 
						|
 | 
						|
  Object.defineProperty(exports, '__esModule', { | 
						|
    value: true | 
						|
  }); | 
						|
  exports.extract = extract; | 
						|
  exports.strip = strip; | 
						|
  exports.parse = parse; | 
						|
  exports.parseWithComments = parseWithComments; | 
						|
  exports.print = print; | 
						|
 | 
						|
  function _os() { | 
						|
    var data = os$1; | 
						|
 | 
						|
    _os = function _os() { | 
						|
      return data; | 
						|
    }; | 
						|
 | 
						|
    return data; | 
						|
  } | 
						|
 | 
						|
  function _detectNewline() { | 
						|
    var data = _interopRequireDefault(detectNewline); | 
						|
 | 
						|
    _detectNewline = function _detectNewline() { | 
						|
      return data; | 
						|
    }; | 
						|
 | 
						|
    return data; | 
						|
  } | 
						|
 | 
						|
  function _interopRequireDefault(obj) { | 
						|
    return obj && obj.__esModule ? obj : { | 
						|
      default: obj | 
						|
    }; | 
						|
  } | 
						|
  /** | 
						|
   * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. | 
						|
   * | 
						|
   * This source code is licensed under the MIT license found in the | 
						|
   * LICENSE file in the root directory of this source tree. | 
						|
   */ | 
						|
 | 
						|
 | 
						|
  var commentEndRe = /\*\/$/; | 
						|
  var commentStartRe = /^\/\*\*/; | 
						|
  var docblockRe = /^\s*(\/\*\*?(.|\r?\n)*?\*\/)/; | 
						|
  var lineCommentRe = /(^|\s+)\/\/([^\r\n]*)/g; | 
						|
  var ltrimNewlineRe = /^(\r?\n)+/; | 
						|
  var multilineRe = /(?:^|\r?\n) *(@[^\r\n]*?) *\r?\n *(?![^@\r\n]*\/\/[^]*)([^@\r\n\s][^@\r\n]+?) *\r?\n/g; | 
						|
  var propertyRe = /(?:^|\r?\n) *@(\S+) *([^\r\n]*)/g; | 
						|
  var stringStartRe = /(\r?\n|^) *\* ?/g; | 
						|
 | 
						|
  function extract(contents) { | 
						|
    var match = contents.match(docblockRe); | 
						|
    return match ? match[0].trimLeft() : ''; | 
						|
  } | 
						|
 | 
						|
  function strip(contents) { | 
						|
    var match = contents.match(docblockRe); | 
						|
    return match && match[0] ? contents.substring(match[0].length) : contents; | 
						|
  } | 
						|
 | 
						|
  function parse(docblock) { | 
						|
    return parseWithComments(docblock).pragmas; | 
						|
  } | 
						|
 | 
						|
  function parseWithComments(docblock) { | 
						|
    var line = (0, _detectNewline().default)(docblock) || _os().EOL; | 
						|
 | 
						|
    docblock = docblock.replace(commentStartRe, '').replace(commentEndRe, '').replace(stringStartRe, '$1'); // Normalize multi-line directives | 
						|
 | 
						|
    var prev = ''; | 
						|
 | 
						|
    while (prev !== docblock) { | 
						|
      prev = docblock; | 
						|
      docblock = docblock.replace(multilineRe, `${line}$1 $2${line}`); | 
						|
    } | 
						|
 | 
						|
    docblock = docblock.replace(ltrimNewlineRe, '').trimRight(); | 
						|
    var result = Object.create(null); | 
						|
    var comments = docblock.replace(propertyRe, '').replace(ltrimNewlineRe, '').trimRight(); | 
						|
    var match; | 
						|
 | 
						|
    while (match = propertyRe.exec(docblock)) { | 
						|
      // strip linecomments from pragmas | 
						|
      var nextPragma = match[2].replace(lineCommentRe, ''); | 
						|
 | 
						|
      if (typeof result[match[1]] === 'string' || Array.isArray(result[match[1]])) { | 
						|
        result[match[1]] = [].concat(result[match[1]], nextPragma); | 
						|
      } else { | 
						|
        result[match[1]] = nextPragma; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return { | 
						|
      comments, | 
						|
      pragmas: result | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  function print(_ref) { | 
						|
    var _ref$comments = _ref.comments, | 
						|
        comments = _ref$comments === void 0 ? '' : _ref$comments, | 
						|
        _ref$pragmas = _ref.pragmas, | 
						|
        pragmas = _ref$pragmas === void 0 ? {} : _ref$pragmas; | 
						|
 | 
						|
    var line = (0, _detectNewline().default)(comments) || _os().EOL; | 
						|
 | 
						|
    var head = '/**'; | 
						|
    var start = ' *'; | 
						|
    var tail = ' */'; | 
						|
    var keys = Object.keys(pragmas); | 
						|
    var printedObject = keys.map(function (key) { | 
						|
      return printKeyValues(key, pragmas[key]); | 
						|
    }).reduce(function (arr, next) { | 
						|
      return arr.concat(next); | 
						|
    }, []).map(function (keyValue) { | 
						|
      return start + ' ' + keyValue + line; | 
						|
    }).join(''); | 
						|
 | 
						|
    if (!comments) { | 
						|
      if (keys.length === 0) { | 
						|
        return ''; | 
						|
      } | 
						|
 | 
						|
      if (keys.length === 1 && !Array.isArray(pragmas[keys[0]])) { | 
						|
        var value = pragmas[keys[0]]; | 
						|
        return `${head} ${printKeyValues(keys[0], value)[0]}${tail}`; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    var printedComments = comments.split(line).map(function (textLine) { | 
						|
      return `${start} ${textLine}`; | 
						|
    }).join(line) + line; | 
						|
    return head + line + (comments ? printedComments : '') + (comments && keys.length ? start + line : '') + printedObject + tail; | 
						|
  } | 
						|
 | 
						|
  function printKeyValues(key, valueOrArray) { | 
						|
    return [].concat(valueOrArray).map(function (value) { | 
						|
      return `@${key} ${value}`.trim(); | 
						|
    }); | 
						|
  } | 
						|
}); | 
						|
unwrapExports(build); | 
						|
var build_1 = build.extract; | 
						|
var build_2 = build.strip; | 
						|
var build_3 = build.parse; | 
						|
var build_4 = build.parseWithComments; | 
						|
var build_5 = build.print; | 
						|
 | 
						|
function hasPragma(text) { | 
						|
  var pragmas = Object.keys(build.parse(build.extract(text))); | 
						|
  return pragmas.indexOf("prettier") !== -1 || pragmas.indexOf("format") !== -1; | 
						|
} | 
						|
 | 
						|
function insertPragma(text) { | 
						|
  var parsedDocblock = build.parseWithComments(build.extract(text)); | 
						|
  var pragmas = Object.assign({ | 
						|
    format: "" | 
						|
  }, parsedDocblock.pragmas); | 
						|
  var newDocblock = build.print({ | 
						|
    pragmas, | 
						|
    comments: parsedDocblock.comments.replace(/^(\s+?\r?\n)+/, "") // remove leading newlines | 
						|
 | 
						|
  }).replace(/(\r\n|\r)/g, "\n"); // normalise newlines (mitigate use of os.EOL by jest-docblock) | 
						|
 | 
						|
  var strippedText = build.strip(text); | 
						|
  var separatingNewlines = strippedText.startsWith("\n") ? "\n" : "\n\n"; | 
						|
  return newDocblock + separatingNewlines + strippedText; | 
						|
} | 
						|
 | 
						|
var pragma = { | 
						|
  hasPragma, | 
						|
  insertPragma | 
						|
}; | 
						|
 | 
						|
var getLast$1 = util.getLast, | 
						|
    hasNewline$2 = util.hasNewline, | 
						|
    hasNewlineInRange$1 = util.hasNewlineInRange, | 
						|
    hasIgnoreComment$1 = util.hasIgnoreComment, | 
						|
    hasNodeIgnoreComment$1 = util.hasNodeIgnoreComment, | 
						|
    skipWhitespace$1 = util.skipWhitespace; | 
						|
var isIdentifierName = utils$1.keyword.isIdentifierNameES5; // We match any whitespace except line terminators because | 
						|
// Flow annotation comments cannot be split across lines. For example: | 
						|
// | 
						|
// (this /* | 
						|
// : any */).foo = 5; | 
						|
// | 
						|
// is not picked up by Flow (see https://github.com/facebook/flow/issues/7050), so | 
						|
// removing the newline would create a type annotation that the user did not intend | 
						|
// to create. | 
						|
 | 
						|
var NON_LINE_TERMINATING_WHITE_SPACE = "(?:(?=.)\\s)"; | 
						|
var FLOW_SHORTHAND_ANNOTATION = new RegExp(`^${NON_LINE_TERMINATING_WHITE_SPACE}*:`); | 
						|
var FLOW_ANNOTATION = new RegExp(`^${NON_LINE_TERMINATING_WHITE_SPACE}*::`); | 
						|
 | 
						|
function hasFlowShorthandAnnotationComment(node) { | 
						|
  // https://flow.org/en/docs/types/comments/ | 
						|
  // Syntax example: const r = new (window.Request /*: Class<Request> */)(""); | 
						|
  return node.extra && node.extra.parenthesized && node.trailingComments && node.trailingComments[0].value.match(FLOW_SHORTHAND_ANNOTATION); | 
						|
} | 
						|
 | 
						|
function hasFlowAnnotationComment(comments) { | 
						|
  return comments && comments[0].value.match(FLOW_ANNOTATION); | 
						|
} | 
						|
 | 
						|
function hasNode(node, fn) { | 
						|
  if (!node || typeof node !== "object") { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  if (Array.isArray(node)) { | 
						|
    return node.some(function (value) { | 
						|
      return hasNode(value, fn); | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  var result = fn(node); | 
						|
  return typeof result === "boolean" ? result : Object.keys(node).some(function (key) { | 
						|
    return hasNode(node[key], fn); | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function hasNakedLeftSide(node) { | 
						|
  return node.type === "AssignmentExpression" || node.type === "BinaryExpression" || node.type === "LogicalExpression" || node.type === "NGPipeExpression" || node.type === "ConditionalExpression" || node.type === "CallExpression" || node.type === "OptionalCallExpression" || node.type === "MemberExpression" || node.type === "OptionalMemberExpression" || node.type === "SequenceExpression" || node.type === "TaggedTemplateExpression" || node.type === "BindExpression" || node.type === "UpdateExpression" && !node.prefix || node.type === "TSAsExpression" || node.type === "TSNonNullExpression"; | 
						|
} | 
						|
 | 
						|
function getLeftSide(node) { | 
						|
  if (node.expressions) { | 
						|
    return node.expressions[0]; | 
						|
  } | 
						|
 | 
						|
  return node.left || node.test || node.callee || node.object || node.tag || node.argument || node.expression; | 
						|
} | 
						|
 | 
						|
function getLeftSidePathName(path, node) { | 
						|
  if (node.expressions) { | 
						|
    return ["expressions", 0]; | 
						|
  } | 
						|
 | 
						|
  if (node.left) { | 
						|
    return ["left"]; | 
						|
  } | 
						|
 | 
						|
  if (node.test) { | 
						|
    return ["test"]; | 
						|
  } | 
						|
 | 
						|
  if (node.object) { | 
						|
    return ["object"]; | 
						|
  } | 
						|
 | 
						|
  if (node.callee) { | 
						|
    return ["callee"]; | 
						|
  } | 
						|
 | 
						|
  if (node.tag) { | 
						|
    return ["tag"]; | 
						|
  } | 
						|
 | 
						|
  if (node.argument) { | 
						|
    return ["argument"]; | 
						|
  } | 
						|
 | 
						|
  if (node.expression) { | 
						|
    return ["expression"]; | 
						|
  } | 
						|
 | 
						|
  throw new Error("Unexpected node has no left side", node); | 
						|
} | 
						|
 | 
						|
function isLiteral(node) { | 
						|
  return node.type === "BooleanLiteral" || node.type === "DirectiveLiteral" || node.type === "Literal" || node.type === "NullLiteral" || node.type === "NumericLiteral" || node.type === "RegExpLiteral" || node.type === "StringLiteral" || node.type === "TemplateLiteral" || node.type === "TSTypeLiteral" || node.type === "JSXText"; | 
						|
} | 
						|
 | 
						|
function isNumericLiteral(node) { | 
						|
  return node.type === "NumericLiteral" || node.type === "Literal" && typeof node.value === "number"; | 
						|
} | 
						|
 | 
						|
function isStringLiteral(node) { | 
						|
  return node.type === "StringLiteral" || node.type === "Literal" && typeof node.value === "string"; | 
						|
} | 
						|
 | 
						|
function isObjectType(n) { | 
						|
  return n.type === "ObjectTypeAnnotation" || n.type === "TSTypeLiteral"; | 
						|
} | 
						|
 | 
						|
function isFunctionOrArrowExpression(node) { | 
						|
  return node.type === "FunctionExpression" || node.type === "ArrowFunctionExpression"; | 
						|
} | 
						|
 | 
						|
function isFunctionOrArrowExpressionWithBody(node) { | 
						|
  return node.type === "FunctionExpression" || node.type === "ArrowFunctionExpression" && node.body.type === "BlockStatement"; | 
						|
} | 
						|
 | 
						|
function isTemplateLiteral(node) { | 
						|
  return node.type === "TemplateLiteral"; | 
						|
} // `inject` is used in AngularJS 1.x, `async` in Angular 2+ | 
						|
// example: https://docs.angularjs.org/guide/unit-testing#using-beforeall- | 
						|
 | 
						|
 | 
						|
function isAngularTestWrapper(node) { | 
						|
  return (node.type === "CallExpression" || node.type === "OptionalCallExpression") && node.callee.type === "Identifier" && (node.callee.name === "async" || node.callee.name === "inject" || node.callee.name === "fakeAsync"); | 
						|
} | 
						|
 | 
						|
function isJSXNode(node) { | 
						|
  return node.type === "JSXElement" || node.type === "JSXFragment"; | 
						|
} | 
						|
 | 
						|
function isTheOnlyJSXElementInMarkdown(options, path) { | 
						|
  if (options.parentParser !== "markdown" && options.parentParser !== "mdx") { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  var node = path.getNode(); | 
						|
 | 
						|
  if (!node.expression || !isJSXNode(node.expression)) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  var parent = path.getParentNode(); | 
						|
  return parent.type === "Program" && parent.body.length == 1; | 
						|
} // Detect an expression node representing `{" "}` | 
						|
 | 
						|
 | 
						|
function isJSXWhitespaceExpression(node) { | 
						|
  return node.type === "JSXExpressionContainer" && isLiteral(node.expression) && node.expression.value === " " && !node.expression.comments; | 
						|
} | 
						|
 | 
						|
function isMemberExpressionChain(node) { | 
						|
  if (node.type !== "MemberExpression" && node.type !== "OptionalMemberExpression") { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  if (node.object.type === "Identifier") { | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return isMemberExpressionChain(node.object); | 
						|
} | 
						|
 | 
						|
function isGetterOrSetter(node) { | 
						|
  return node.kind === "get" || node.kind === "set"; | 
						|
} | 
						|
 | 
						|
function sameLocStart(nodeA, nodeB, options) { | 
						|
  return options.locStart(nodeA) === options.locStart(nodeB); | 
						|
} // TODO: This is a bad hack and we need a better way to distinguish between | 
						|
// arrow functions and otherwise | 
						|
 | 
						|
 | 
						|
function isFunctionNotation(node, options) { | 
						|
  return isGetterOrSetter(node) || sameLocStart(node, node.value, options); | 
						|
} // Hack to differentiate between the following two which have the same ast | 
						|
// type T = { method: () => void }; | 
						|
// type T = { method(): void }; | 
						|
 | 
						|
 | 
						|
function isObjectTypePropertyAFunction(node, options) { | 
						|
  return (node.type === "ObjectTypeProperty" || node.type === "ObjectTypeInternalSlot") && node.value.type === "FunctionTypeAnnotation" && !node.static && !isFunctionNotation(node, options); | 
						|
} // Hack to differentiate between the following two which have the same ast | 
						|
// declare function f(a): void; | 
						|
// var f: (a) => void; | 
						|
 | 
						|
 | 
						|
function isTypeAnnotationAFunction(node, options) { | 
						|
  return (node.type === "TypeAnnotation" || node.type === "TSTypeAnnotation") && node.typeAnnotation.type === "FunctionTypeAnnotation" && !node.static && !sameLocStart(node, node.typeAnnotation, options); | 
						|
} | 
						|
 | 
						|
function isBinaryish(node) { | 
						|
  return node.type === "BinaryExpression" || node.type === "LogicalExpression" || node.type === "NGPipeExpression"; | 
						|
} | 
						|
 | 
						|
function isMemberish(node) { | 
						|
  return node.type === "MemberExpression" || node.type === "OptionalMemberExpression" || node.type === "BindExpression" && node.object; | 
						|
} | 
						|
 | 
						|
function isSimpleFlowType(node) { | 
						|
  var flowTypeAnnotations = ["AnyTypeAnnotation", "NullLiteralTypeAnnotation", "GenericTypeAnnotation", "ThisTypeAnnotation", "NumberTypeAnnotation", "VoidTypeAnnotation", "EmptyTypeAnnotation", "MixedTypeAnnotation", "BooleanTypeAnnotation", "BooleanLiteralTypeAnnotation", "StringTypeAnnotation"]; | 
						|
  return node && flowTypeAnnotations.indexOf(node.type) !== -1 && !(node.type === "GenericTypeAnnotation" && node.typeParameters); | 
						|
} | 
						|
 | 
						|
var unitTestRe = /^(skip|[fx]?(it|describe|test))$/; | 
						|
 | 
						|
function isSkipOrOnlyBlock(node) { | 
						|
  return (node.callee.type === "MemberExpression" || node.callee.type === "OptionalMemberExpression") && node.callee.object.type === "Identifier" && node.callee.property.type === "Identifier" && unitTestRe.test(node.callee.object.name) && (node.callee.property.name === "only" || node.callee.property.name === "skip"); | 
						|
} | 
						|
 | 
						|
function isUnitTestSetUp(n) { | 
						|
  var unitTestSetUpRe = /^(before|after)(Each|All)$/; | 
						|
  return n.callee.type === "Identifier" && unitTestSetUpRe.test(n.callee.name) && n.arguments.length === 1; | 
						|
} // eg; `describe("some string", (done) => {})` | 
						|
 | 
						|
 | 
						|
function isTestCall(n, parent) { | 
						|
  if (n.type !== "CallExpression") { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  if (n.arguments.length === 1) { | 
						|
    if (isAngularTestWrapper(n) && parent && isTestCall(parent)) { | 
						|
      return isFunctionOrArrowExpression(n.arguments[0]); | 
						|
    } | 
						|
 | 
						|
    if (isUnitTestSetUp(n)) { | 
						|
      return isAngularTestWrapper(n.arguments[0]); | 
						|
    } | 
						|
  } else if (n.arguments.length === 2 || n.arguments.length === 3) { | 
						|
    if ((n.callee.type === "Identifier" && unitTestRe.test(n.callee.name) || isSkipOrOnlyBlock(n)) && (isTemplateLiteral(n.arguments[0]) || isStringLiteral(n.arguments[0]))) { | 
						|
      // it("name", () => { ... }, 2500) | 
						|
      if (n.arguments[2] && !isNumericLiteral(n.arguments[2])) { | 
						|
        return false; | 
						|
      } | 
						|
 | 
						|
      return (n.arguments.length === 2 ? isFunctionOrArrowExpression(n.arguments[1]) : isFunctionOrArrowExpressionWithBody(n.arguments[1]) && n.arguments[1].params.length <= 1) || isAngularTestWrapper(n.arguments[1]); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function hasLeadingComment$2(node) { | 
						|
  return node.comments && node.comments.some(function (comment) { | 
						|
    return comment.leading; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function hasTrailingComment(node) { | 
						|
  return node.comments && node.comments.some(function (comment) { | 
						|
    return comment.trailing; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function isCallOrOptionalCallExpression(node) { | 
						|
  return node.type === "CallExpression" || node.type === "OptionalCallExpression"; | 
						|
} | 
						|
 | 
						|
function hasDanglingComments(node) { | 
						|
  return node.comments && node.comments.some(function (comment) { | 
						|
    return !comment.leading && !comment.trailing; | 
						|
  }); | 
						|
} | 
						|
/** identify if an angular expression seems to have side effects */ | 
						|
 | 
						|
 | 
						|
function hasNgSideEffect(path) { | 
						|
  return hasNode(path.getValue(), function (node) { | 
						|
    switch (node.type) { | 
						|
      case undefined: | 
						|
        return false; | 
						|
 | 
						|
      case "CallExpression": | 
						|
      case "OptionalCallExpression": | 
						|
      case "AssignmentExpression": | 
						|
        return true; | 
						|
    } | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function isNgForOf(node, index, parentNode) { | 
						|
  return node.type === "NGMicrosyntaxKeyedExpression" && node.key.name === "of" && index === 1 && parentNode.body[0].type === "NGMicrosyntaxLet" && parentNode.body[0].value === null; | 
						|
} | 
						|
/** @param node {import("estree").TemplateLiteral} */ | 
						|
 | 
						|
 | 
						|
function isSimpleTemplateLiteral(node) { | 
						|
  if (node.expressions.length === 0) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  return node.expressions.every(function (expr) { | 
						|
    // Disallow comments since printDocToString can't print them here | 
						|
    if (expr.comments) { | 
						|
      return false; | 
						|
    } // Allow `x` and `this` | 
						|
 | 
						|
 | 
						|
    if (expr.type === "Identifier" || expr.type === "ThisExpression") { | 
						|
      return true; | 
						|
    } // Allow `a.b.c`, `a.b[c]`, and `this.x.y` | 
						|
 | 
						|
 | 
						|
    if (expr.type === "MemberExpression" || expr.type === "OptionalMemberExpression") { | 
						|
      var head = expr; | 
						|
 | 
						|
      while (head.type === "MemberExpression" || head.type === "OptionalMemberExpression") { | 
						|
        if (head.property.type !== "Identifier" && head.property.type !== "Literal" && head.property.type !== "StringLiteral" && head.property.type !== "NumericLiteral") { | 
						|
          return false; | 
						|
        } | 
						|
 | 
						|
        head = head.object; | 
						|
 | 
						|
        if (head.comments) { | 
						|
          return false; | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      if (head.type === "Identifier" || head.type === "ThisExpression") { | 
						|
        return true; | 
						|
      } | 
						|
 | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    return false; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function getFlowVariance(path) { | 
						|
  if (!path.variance) { | 
						|
    return null; | 
						|
  } // Babel 7.0 currently uses variance node type, and flow should | 
						|
  // follow suit soon: | 
						|
  // https://github.com/babel/babel/issues/4722 | 
						|
 | 
						|
 | 
						|
  var variance = path.variance.kind || path.variance; | 
						|
 | 
						|
  switch (variance) { | 
						|
    case "plus": | 
						|
      return "+"; | 
						|
 | 
						|
    case "minus": | 
						|
      return "-"; | 
						|
 | 
						|
    default: | 
						|
      /* istanbul ignore next */ | 
						|
      return variance; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function classPropMayCauseASIProblems(path) { | 
						|
  var node = path.getNode(); | 
						|
 | 
						|
  if (node.type !== "ClassProperty") { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  var name = node.key && node.key.name; // this isn't actually possible yet with most parsers available today | 
						|
  // so isn't properly tested yet. | 
						|
 | 
						|
  if ((name === "static" || name === "get" || name === "set") && !node.value && !node.typeAnnotation) { | 
						|
    return true; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function classChildNeedsASIProtection(node) { | 
						|
  if (!node) { | 
						|
    return; | 
						|
  } | 
						|
 | 
						|
  if (node.static || node.accessibility // TypeScript | 
						|
  ) { | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
  if (!node.computed) { | 
						|
    var name = node.key && node.key.name; | 
						|
 | 
						|
    if (name === "in" || name === "instanceof") { | 
						|
      return true; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  switch (node.type) { | 
						|
    case "ClassProperty": | 
						|
    case "TSAbstractClassProperty": | 
						|
      return node.computed; | 
						|
 | 
						|
    case "MethodDefinition": // Flow | 
						|
 | 
						|
    case "TSAbstractMethodDefinition": // TypeScript | 
						|
 | 
						|
    case "ClassMethod": | 
						|
    case "ClassPrivateMethod": | 
						|
      { | 
						|
        // Babel | 
						|
        var isAsync = node.value ? node.value.async : node.async; | 
						|
        var isGenerator = node.value ? node.value.generator : node.generator; | 
						|
 | 
						|
        if (isAsync || node.kind === "get" || node.kind === "set") { | 
						|
          return false; | 
						|
        } | 
						|
 | 
						|
        if (node.computed || isGenerator) { | 
						|
          return true; | 
						|
        } | 
						|
 | 
						|
        return false; | 
						|
      } | 
						|
 | 
						|
    case "TSIndexSignature": | 
						|
      return true; | 
						|
 | 
						|
    default: | 
						|
      /* istanbul ignore next */ | 
						|
      return false; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function getTypeScriptMappedTypeModifier(tokenNode, keyword) { | 
						|
  if (tokenNode === "+") { | 
						|
    return "+" + keyword; | 
						|
  } else if (tokenNode === "-") { | 
						|
    return "-" + keyword; | 
						|
  } | 
						|
 | 
						|
  return keyword; | 
						|
} | 
						|
 | 
						|
function hasNewlineBetweenOrAfterDecorators(node, options) { | 
						|
  return hasNewlineInRange$1(options.originalText, options.locStart(node.decorators[0]), options.locEnd(getLast$1(node.decorators))) || hasNewline$2(options.originalText, options.locEnd(getLast$1(node.decorators))); | 
						|
} // Only space, newline, carriage return, and tab are treated as whitespace | 
						|
// inside JSX. | 
						|
 | 
						|
 | 
						|
var jsxWhitespaceChars = " \n\r\t"; | 
						|
var matchJsxWhitespaceRegex = new RegExp("([" + jsxWhitespaceChars + "]+)"); | 
						|
var containsNonJsxWhitespaceRegex = new RegExp("[^" + jsxWhitespaceChars + "]"); // Meaningful if it contains non-whitespace characters, | 
						|
// or it contains whitespace without a new line. | 
						|
 | 
						|
function isMeaningfulJSXText(node) { | 
						|
  return isLiteral(node) && (containsNonJsxWhitespaceRegex.test(rawText(node)) || !/\n/.test(rawText(node))); | 
						|
} | 
						|
 | 
						|
function hasJsxIgnoreComment(path) { | 
						|
  var node = path.getValue(); | 
						|
  var parent = path.getParentNode(); | 
						|
 | 
						|
  if (!parent || !node || !isJSXNode(node) || !isJSXNode(parent)) { | 
						|
    return false; | 
						|
  } // Lookup the previous sibling, ignoring any empty JSXText elements | 
						|
 | 
						|
 | 
						|
  var index = parent.children.indexOf(node); | 
						|
  var prevSibling = null; | 
						|
 | 
						|
  for (var i = index; i > 0; i--) { | 
						|
    var candidate = parent.children[i - 1]; | 
						|
 | 
						|
    if (candidate.type === "JSXText" && !isMeaningfulJSXText(candidate)) { | 
						|
      continue; | 
						|
    } | 
						|
 | 
						|
    prevSibling = candidate; | 
						|
    break; | 
						|
  } | 
						|
 | 
						|
  return prevSibling && prevSibling.type === "JSXExpressionContainer" && prevSibling.expression.type === "JSXEmptyExpression" && prevSibling.expression.comments && prevSibling.expression.comments.find(function (comment) { | 
						|
    return comment.value.trim() === "prettier-ignore"; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function isEmptyJSXElement(node) { | 
						|
  if (node.children.length === 0) { | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  if (node.children.length > 1) { | 
						|
    return false; | 
						|
  } // if there is one text child and does not contain any meaningful text | 
						|
  // we can treat the element as empty. | 
						|
 | 
						|
 | 
						|
  var child = node.children[0]; | 
						|
  return isLiteral(child) && !isMeaningfulJSXText(child); | 
						|
} | 
						|
 | 
						|
function hasPrettierIgnore(path) { | 
						|
  return hasIgnoreComment$1(path) || hasJsxIgnoreComment(path); | 
						|
} | 
						|
 | 
						|
function isLastStatement(path) { | 
						|
  var parent = path.getParentNode(); | 
						|
 | 
						|
  if (!parent) { | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  var node = path.getValue(); | 
						|
  var body = (parent.body || parent.consequent).filter(function (stmt) { | 
						|
    return stmt.type !== "EmptyStatement"; | 
						|
  }); | 
						|
  return body && body[body.length - 1] === node; | 
						|
} | 
						|
 | 
						|
function isFlowAnnotationComment(text, typeAnnotation, options) { | 
						|
  var start = options.locStart(typeAnnotation); | 
						|
  var end = skipWhitespace$1(text, options.locEnd(typeAnnotation)); | 
						|
  return text.substr(start, 2) === "/*" && text.substr(end, 2) === "*/"; | 
						|
} | 
						|
 | 
						|
function hasLeadingOwnLineComment(text, node, options) { | 
						|
  if (isJSXNode(node)) { | 
						|
    return hasNodeIgnoreComment$1(node); | 
						|
  } | 
						|
 | 
						|
  var res = node.comments && node.comments.some(function (comment) { | 
						|
    return comment.leading && hasNewline$2(text, options.locEnd(comment)); | 
						|
  }); | 
						|
  return res; | 
						|
} // This recurses the return argument, looking for the first token | 
						|
// (the leftmost leaf node) and, if it (or its parents) has any | 
						|
// leadingComments, returns true (so it can be wrapped in parens). | 
						|
 | 
						|
 | 
						|
function returnArgumentHasLeadingComment(options, argument) { | 
						|
  if (hasLeadingOwnLineComment(options.originalText, argument, options)) { | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  if (hasNakedLeftSide(argument)) { | 
						|
    var leftMost = argument; | 
						|
    var newLeftMost; | 
						|
 | 
						|
    while (newLeftMost = getLeftSide(leftMost)) { | 
						|
      leftMost = newLeftMost; | 
						|
 | 
						|
      if (hasLeadingOwnLineComment(options.originalText, leftMost, options)) { | 
						|
        return true; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function isStringPropSafeToCoerceToIdentifier(node, options) { | 
						|
  return isStringLiteral(node.key) && isIdentifierName(node.key.value) && options.parser !== "json" && !(options.parser === "typescript" && node.type === "ClassProperty"); | 
						|
} | 
						|
 | 
						|
function isJestEachTemplateLiteral(node, parentNode) { | 
						|
  /** | 
						|
   * describe.each`table`(name, fn) | 
						|
   * describe.only.each`table`(name, fn) | 
						|
   * describe.skip.each`table`(name, fn) | 
						|
   * test.each`table`(name, fn) | 
						|
   * test.only.each`table`(name, fn) | 
						|
   * test.skip.each`table`(name, fn) | 
						|
   * | 
						|
   * Ref: https://github.com/facebook/jest/pull/6102 | 
						|
   */ | 
						|
  var jestEachTriggerRegex = /^[xf]?(describe|it|test)$/; | 
						|
  return parentNode.type === "TaggedTemplateExpression" && parentNode.quasi === node && parentNode.tag.type === "MemberExpression" && parentNode.tag.property.type === "Identifier" && parentNode.tag.property.name === "each" && (parentNode.tag.object.type === "Identifier" && jestEachTriggerRegex.test(parentNode.tag.object.name) || parentNode.tag.object.type === "MemberExpression" && parentNode.tag.object.property.type === "Identifier" && (parentNode.tag.object.property.name === "only" || parentNode.tag.object.property.name === "skip") && parentNode.tag.object.object.type === "Identifier" && jestEachTriggerRegex.test(parentNode.tag.object.object.name)); | 
						|
} | 
						|
 | 
						|
function templateLiteralHasNewLines(template) { | 
						|
  return template.quasis.some(function (quasi) { | 
						|
    return quasi.value.raw.includes("\n"); | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function isTemplateOnItsOwnLine(n, text, options) { | 
						|
  return (n.type === "TemplateLiteral" && templateLiteralHasNewLines(n) || n.type === "TaggedTemplateExpression" && templateLiteralHasNewLines(n.quasi)) && !hasNewline$2(text, options.locStart(n), { | 
						|
    backwards: true | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function needsHardlineAfterDanglingComment(node) { | 
						|
  if (!node.comments) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  var lastDanglingComment = getLast$1(node.comments.filter(function (comment) { | 
						|
    return !comment.leading && !comment.trailing; | 
						|
  })); | 
						|
  return lastDanglingComment && !comments$1.isBlockComment(lastDanglingComment); | 
						|
} // If we have nested conditional expressions, we want to print them in JSX mode | 
						|
// if there's at least one JSXElement somewhere in the tree. | 
						|
// | 
						|
// A conditional expression chain like this should be printed in normal mode, | 
						|
// because there aren't JSXElements anywhere in it: | 
						|
// | 
						|
// isA ? "A" : isB ? "B" : isC ? "C" : "Unknown"; | 
						|
// | 
						|
// But a conditional expression chain like this should be printed in JSX mode, | 
						|
// because there is a JSXElement in the last ConditionalExpression: | 
						|
// | 
						|
// isA ? "A" : isB ? "B" : isC ? "C" : <span className="warning">Unknown</span>; | 
						|
// | 
						|
// This type of ConditionalExpression chain is structured like this in the AST: | 
						|
// | 
						|
// ConditionalExpression { | 
						|
//   test: ..., | 
						|
//   consequent: ..., | 
						|
//   alternate: ConditionalExpression { | 
						|
//     test: ..., | 
						|
//     consequent: ..., | 
						|
//     alternate: ConditionalExpression { | 
						|
//       test: ..., | 
						|
//       consequent: ..., | 
						|
//       alternate: ..., | 
						|
//     } | 
						|
//   } | 
						|
// } | 
						|
// | 
						|
// We want to traverse over that shape and convert it into a flat structure so | 
						|
// that we can find if there's a JSXElement somewhere inside. | 
						|
 | 
						|
 | 
						|
function getConditionalChainContents(node) { | 
						|
  // Given this code: | 
						|
  // | 
						|
  // // Using a ConditionalExpression as the consequent is uncommon, but should | 
						|
  // // be handled. | 
						|
  // A ? B : C ? D : E ? F ? G : H : I | 
						|
  // | 
						|
  // which has this AST: | 
						|
  // | 
						|
  // ConditionalExpression { | 
						|
  //   test: Identifier(A), | 
						|
  //   consequent: Identifier(B), | 
						|
  //   alternate: ConditionalExpression { | 
						|
  //     test: Identifier(C), | 
						|
  //     consequent: Identifier(D), | 
						|
  //     alternate: ConditionalExpression { | 
						|
  //       test: Identifier(E), | 
						|
  //       consequent: ConditionalExpression { | 
						|
  //         test: Identifier(F), | 
						|
  //         consequent: Identifier(G), | 
						|
  //         alternate: Identifier(H), | 
						|
  //       }, | 
						|
  //       alternate: Identifier(I), | 
						|
  //     } | 
						|
  //   } | 
						|
  // } | 
						|
  // | 
						|
  // we should return this Array: | 
						|
  // | 
						|
  // [ | 
						|
  //   Identifier(A), | 
						|
  //   Identifier(B), | 
						|
  //   Identifier(C), | 
						|
  //   Identifier(D), | 
						|
  //   Identifier(E), | 
						|
  //   Identifier(F), | 
						|
  //   Identifier(G), | 
						|
  //   Identifier(H), | 
						|
  //   Identifier(I) | 
						|
  // ]; | 
						|
  // | 
						|
  // This loses the information about whether each node was the test, | 
						|
  // consequent, or alternate, but we don't care about that here- we are only | 
						|
  // flattening this structure to find if there's any JSXElements inside. | 
						|
  var nonConditionalExpressions = []; | 
						|
 | 
						|
  function recurse(node) { | 
						|
    if (node.type === "ConditionalExpression") { | 
						|
      recurse(node.test); | 
						|
      recurse(node.consequent); | 
						|
      recurse(node.alternate); | 
						|
    } else { | 
						|
      nonConditionalExpressions.push(node); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  recurse(node); | 
						|
  return nonConditionalExpressions; | 
						|
} | 
						|
 | 
						|
function conditionalExpressionChainContainsJSX(node) { | 
						|
  return Boolean(getConditionalChainContents(node).find(isJSXNode)); | 
						|
} // Logic to check for args with multiple anonymous functions. For instance, | 
						|
// the following call should be split on multiple lines for readability: | 
						|
// source.pipe(map((x) => x + x), filter((x) => x % 2 === 0)) | 
						|
 | 
						|
 | 
						|
function isFunctionCompositionArgs(args) { | 
						|
  if (args.length <= 1) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  var count = 0; | 
						|
  var _iteratorNormalCompletion = true; | 
						|
  var _didIteratorError = false; | 
						|
  var _iteratorError = undefined; | 
						|
 | 
						|
  try { | 
						|
    for (var _iterator = args[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | 
						|
      var arg = _step.value; | 
						|
 | 
						|
      if (isFunctionOrArrowExpression(arg)) { | 
						|
        count += 1; | 
						|
 | 
						|
        if (count > 1) { | 
						|
          return true; | 
						|
        } | 
						|
      } else if (isCallOrOptionalCallExpression(arg)) { | 
						|
        var _iteratorNormalCompletion2 = true; | 
						|
        var _didIteratorError2 = false; | 
						|
        var _iteratorError2 = undefined; | 
						|
 | 
						|
        try { | 
						|
          for (var _iterator2 = arg.arguments[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { | 
						|
            var childArg = _step2.value; | 
						|
 | 
						|
            if (isFunctionOrArrowExpression(childArg)) { | 
						|
              return true; | 
						|
            } | 
						|
          } | 
						|
        } catch (err) { | 
						|
          _didIteratorError2 = true; | 
						|
          _iteratorError2 = err; | 
						|
        } finally { | 
						|
          try { | 
						|
            if (!_iteratorNormalCompletion2 && _iterator2.return != null) { | 
						|
              _iterator2.return(); | 
						|
            } | 
						|
          } finally { | 
						|
            if (_didIteratorError2) { | 
						|
              throw _iteratorError2; | 
						|
            } | 
						|
          } | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
  } catch (err) { | 
						|
    _didIteratorError = true; | 
						|
    _iteratorError = err; | 
						|
  } finally { | 
						|
    try { | 
						|
      if (!_iteratorNormalCompletion && _iterator.return != null) { | 
						|
        _iterator.return(); | 
						|
      } | 
						|
    } finally { | 
						|
      if (_didIteratorError) { | 
						|
        throw _iteratorError; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} // Logic to determine if a call is a “long curried function call”. | 
						|
// See https://github.com/prettier/prettier/issues/1420. | 
						|
// | 
						|
// `connect(a, b, c)(d)` | 
						|
// In the above call expression, the second call is the parent node and the | 
						|
// first call is the current node. | 
						|
 | 
						|
 | 
						|
function isLongCurriedCallExpression(path) { | 
						|
  var node = path.getValue(); | 
						|
  var parent = path.getParentNode(); | 
						|
  return isCallOrOptionalCallExpression(node) && isCallOrOptionalCallExpression(parent) && parent.callee === node && node.arguments.length > parent.arguments.length && parent.arguments.length > 0; | 
						|
} | 
						|
 | 
						|
function rawText(node) { | 
						|
  return node.extra ? node.extra.raw : node.raw; | 
						|
} | 
						|
 | 
						|
function identity(x) { | 
						|
  return x; | 
						|
} | 
						|
 | 
						|
function isTSXFile(options) { | 
						|
  return options.filepath && /\.tsx$/i.test(options.filepath); | 
						|
} | 
						|
 | 
						|
var utils$2 = { | 
						|
  classChildNeedsASIProtection, | 
						|
  classPropMayCauseASIProblems, | 
						|
  conditionalExpressionChainContainsJSX, | 
						|
  getFlowVariance, | 
						|
  getLeftSidePathName, | 
						|
  getTypeScriptMappedTypeModifier, | 
						|
  hasDanglingComments, | 
						|
  hasFlowAnnotationComment, | 
						|
  hasFlowShorthandAnnotationComment, | 
						|
  hasLeadingComment: hasLeadingComment$2, | 
						|
  hasLeadingOwnLineComment, | 
						|
  hasNakedLeftSide, | 
						|
  hasNewlineBetweenOrAfterDecorators, | 
						|
  hasNgSideEffect, | 
						|
  hasNode, | 
						|
  hasPrettierIgnore, | 
						|
  hasTrailingComment, | 
						|
  identity, | 
						|
  isBinaryish, | 
						|
  isCallOrOptionalCallExpression, | 
						|
  isEmptyJSXElement, | 
						|
  isFlowAnnotationComment, | 
						|
  isFunctionCompositionArgs, | 
						|
  isFunctionNotation, | 
						|
  isFunctionOrArrowExpression, | 
						|
  isGetterOrSetter, | 
						|
  isJestEachTemplateLiteral, | 
						|
  isJSXNode, | 
						|
  isJSXWhitespaceExpression, | 
						|
  isLastStatement, | 
						|
  isLiteral, | 
						|
  isLongCurriedCallExpression, | 
						|
  isMeaningfulJSXText, | 
						|
  isMemberExpressionChain, | 
						|
  isMemberish, | 
						|
  isNgForOf, | 
						|
  isNumericLiteral, | 
						|
  isObjectType, | 
						|
  isObjectTypePropertyAFunction, | 
						|
  isSimpleFlowType, | 
						|
  isSimpleTemplateLiteral, | 
						|
  isStringLiteral, | 
						|
  isStringPropSafeToCoerceToIdentifier, | 
						|
  isTemplateOnItsOwnLine, | 
						|
  isTestCall, | 
						|
  isTheOnlyJSXElementInMarkdown, | 
						|
  isTSXFile, | 
						|
  isTypeAnnotationAFunction, | 
						|
  matchJsxWhitespaceRegex, | 
						|
  needsHardlineAfterDanglingComment, | 
						|
  rawText, | 
						|
  returnArgumentHasLeadingComment | 
						|
}; | 
						|
 | 
						|
var getLeftSidePathName$1 = utils$2.getLeftSidePathName, | 
						|
    hasFlowShorthandAnnotationComment$1 = utils$2.hasFlowShorthandAnnotationComment, | 
						|
    hasNakedLeftSide$1 = utils$2.hasNakedLeftSide, | 
						|
    hasNode$1 = utils$2.hasNode; | 
						|
 | 
						|
function hasClosureCompilerTypeCastComment(text, path) { | 
						|
  // https://github.com/google/closure-compiler/wiki/Annotating-Types#type-casts | 
						|
  // Syntax example: var x = /** @type {string} */ (fruit); | 
						|
  var n = path.getValue(); | 
						|
  return isParenthesized(n) && (hasTypeCastComment(n) || hasAncestorTypeCastComment(0)); // for sub-item: /** @type {array} */ (numberOrString).map(x => x); | 
						|
 | 
						|
  function hasAncestorTypeCastComment(index) { | 
						|
    var ancestor = path.getParentNode(index); | 
						|
    return ancestor && !isParenthesized(ancestor) ? hasTypeCastComment(ancestor) || hasAncestorTypeCastComment(index + 1) : false; | 
						|
  } | 
						|
 | 
						|
  function hasTypeCastComment(node) { | 
						|
    return node.comments && node.comments.some(function (comment) { | 
						|
      return comment.leading && comments$1.isBlockComment(comment) && isTypeCastComment(comment.value); | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  function isParenthesized(node) { | 
						|
    // Closure typecast comments only really make sense when _not_ using | 
						|
    // typescript or flow parsers, so we take advantage of the babel parser's | 
						|
    // parenthesized expressions. | 
						|
    return node.extra && node.extra.parenthesized; | 
						|
  } | 
						|
 | 
						|
  function isTypeCastComment(comment) { | 
						|
    var cleaned = comment.trim().split("\n").map(function (line) { | 
						|
      return line.replace(/^[\s*]+/, ""); | 
						|
    }).join(" ").trim(); | 
						|
 | 
						|
    if (!/^@type\s*\{[^]+\}$/.test(cleaned)) { | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    var isCompletelyClosed = false; | 
						|
    var unpairedBracketCount = 0; | 
						|
    var _iteratorNormalCompletion = true; | 
						|
    var _didIteratorError = false; | 
						|
    var _iteratorError = undefined; | 
						|
 | 
						|
    try { | 
						|
      for (var _iterator = cleaned[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | 
						|
        var char = _step.value; | 
						|
 | 
						|
        if (char === "{") { | 
						|
          if (isCompletelyClosed) { | 
						|
            return false; | 
						|
          } | 
						|
 | 
						|
          unpairedBracketCount++; | 
						|
        } else if (char === "}") { | 
						|
          if (unpairedBracketCount === 0) { | 
						|
            return false; | 
						|
          } | 
						|
 | 
						|
          unpairedBracketCount--; | 
						|
 | 
						|
          if (unpairedBracketCount === 0) { | 
						|
            isCompletelyClosed = true; | 
						|
          } | 
						|
        } | 
						|
      } | 
						|
    } catch (err) { | 
						|
      _didIteratorError = true; | 
						|
      _iteratorError = err; | 
						|
    } finally { | 
						|
      try { | 
						|
        if (!_iteratorNormalCompletion && _iterator.return != null) { | 
						|
          _iterator.return(); | 
						|
        } | 
						|
      } finally { | 
						|
        if (_didIteratorError) { | 
						|
          throw _iteratorError; | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return unpairedBracketCount === 0; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function needsParens(path, options) { | 
						|
  var parent = path.getParentNode(); | 
						|
 | 
						|
  if (!parent) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  var name = path.getName(); | 
						|
  var node = path.getNode(); // If the value of this path is some child of a Node and not a Node | 
						|
  // itself, then it doesn't need parentheses. Only Node objects (in | 
						|
  // fact, only Expression nodes) need parentheses. | 
						|
 | 
						|
  if (path.getValue() !== node) { | 
						|
    return false; | 
						|
  } // to avoid unexpected `}}` in HTML interpolations | 
						|
 | 
						|
 | 
						|
  if (options.__isInHtmlInterpolation && !options.bracketSpacing && endsWithRightBracket(node) && isFollowedByRightBracket(path)) { | 
						|
    return true; | 
						|
  } // Only statements don't need parentheses. | 
						|
 | 
						|
 | 
						|
  if (isStatement(node)) { | 
						|
    return false; | 
						|
  } // Closure compiler requires that type casted expressions to be surrounded by | 
						|
  // parentheses. | 
						|
 | 
						|
 | 
						|
  if (hasClosureCompilerTypeCastComment(options.originalText, path)) { | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  if ( // Preserve parens if we have a Flow annotation comment, unless we're using the Flow | 
						|
  // parser. The Flow parser turns Flow comments into type annotation nodes in its | 
						|
  // AST, which we handle separately. | 
						|
  options.parser !== "flow" && hasFlowShorthandAnnotationComment$1(path.getValue())) { | 
						|
    return true; | 
						|
  } // Identifiers never need parentheses. | 
						|
 | 
						|
 | 
						|
  if (node.type === "Identifier") { | 
						|
    // ...unless those identifiers are embed placeholders. They might be substituted by complex | 
						|
    // expressions, so the parens around them should not be dropped. Example (JS-in-HTML-in-JS): | 
						|
    //     let tpl = html`<script> f((${expr}) / 2); </script>`; | 
						|
    // If the inner JS formatter removes the parens, the expression might change its meaning: | 
						|
    //     f((a + b) / 2)  vs  f(a + b / 2) | 
						|
    if (node.extra && node.extra.parenthesized && /^PRETTIER_HTML_PLACEHOLDER_\d+_\d+_IN_JS$/.test(node.name)) { | 
						|
      return true; | 
						|
    } | 
						|
 | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  if (parent.type === "ParenthesizedExpression") { | 
						|
    return false; | 
						|
  } // Add parens around the extends clause of a class. It is needed for almost | 
						|
  // all expressions. | 
						|
 | 
						|
 | 
						|
  if ((parent.type === "ClassDeclaration" || parent.type === "ClassExpression") && parent.superClass === node && (node.type === "ArrowFunctionExpression" || node.type === "AssignmentExpression" || node.type === "AwaitExpression" || node.type === "BinaryExpression" || node.type === "ConditionalExpression" || node.type === "LogicalExpression" || node.type === "NewExpression" || node.type === "ObjectExpression" || node.type === "ParenthesizedExpression" || node.type === "SequenceExpression" || node.type === "TaggedTemplateExpression" || node.type === "UnaryExpression" || node.type === "UpdateExpression" || node.type === "YieldExpression")) { | 
						|
    return true; | 
						|
  } // `export default function` or `export default class` can't be followed by | 
						|
  // anything after. So an expression like `export default (function(){}).toString()` | 
						|
  // needs to be followed by a parentheses | 
						|
 | 
						|
 | 
						|
  if (parent.type === "ExportDefaultDeclaration") { | 
						|
    return shouldWrapFunctionForExportDefault(path, options); | 
						|
  } | 
						|
 | 
						|
  if (parent.type === "Decorator" && parent.expression === node) { | 
						|
    var hasCallExpression = false; | 
						|
    var hasMemberExpression = false; | 
						|
    var current = node; | 
						|
 | 
						|
    while (current) { | 
						|
      switch (current.type) { | 
						|
        case "MemberExpression": | 
						|
          hasMemberExpression = true; | 
						|
          current = current.object; | 
						|
          break; | 
						|
 | 
						|
        case "CallExpression": | 
						|
          if ( | 
						|
          /** @(x().y) */ | 
						|
          hasMemberExpression || | 
						|
          /** @(x().y()) */ | 
						|
          hasCallExpression) { | 
						|
            return true; | 
						|
          } | 
						|
 | 
						|
          hasCallExpression = true; | 
						|
          current = current.callee; | 
						|
          break; | 
						|
 | 
						|
        case "Identifier": | 
						|
          return false; | 
						|
 | 
						|
        default: | 
						|
          return true; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  if (parent.type === "ArrowFunctionExpression" && parent.body === node && node.type !== "SequenceExpression" && // these have parens added anyway | 
						|
  util.startsWithNoLookaheadToken(node, | 
						|
  /* forbidFunctionClassAndDoExpr */ | 
						|
  false) || parent.type === "ExpressionStatement" && util.startsWithNoLookaheadToken(node, | 
						|
  /* forbidFunctionClassAndDoExpr */ | 
						|
  true)) { | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  switch (node.type) { | 
						|
    case "SpreadElement": | 
						|
    case "SpreadProperty": | 
						|
      return parent.type === "MemberExpression" && name === "object" && parent.object === node; | 
						|
 | 
						|
    case "UpdateExpression": | 
						|
      if (parent.type === "UnaryExpression") { | 
						|
        return node.prefix && (node.operator === "++" && parent.operator === "+" || node.operator === "--" && parent.operator === "-"); | 
						|
      } | 
						|
 | 
						|
    // else fallthrough | 
						|
 | 
						|
    case "UnaryExpression": | 
						|
      switch (parent.type) { | 
						|
        case "UnaryExpression": | 
						|
          return node.operator === parent.operator && (node.operator === "+" || node.operator === "-"); | 
						|
 | 
						|
        case "BindExpression": | 
						|
          return true; | 
						|
 | 
						|
        case "MemberExpression": | 
						|
        case "OptionalMemberExpression": | 
						|
          return name === "object"; | 
						|
 | 
						|
        case "TaggedTemplateExpression": | 
						|
          return true; | 
						|
 | 
						|
        case "NewExpression": | 
						|
        case "CallExpression": | 
						|
        case "OptionalCallExpression": | 
						|
          return name === "callee"; | 
						|
 | 
						|
        case "BinaryExpression": | 
						|
          return parent.operator === "**" && name === "left"; | 
						|
 | 
						|
        case "TSNonNullExpression": | 
						|
          return true; | 
						|
 | 
						|
        default: | 
						|
          return false; | 
						|
      } | 
						|
 | 
						|
    case "BinaryExpression": | 
						|
      { | 
						|
        if (parent.type === "UpdateExpression") { | 
						|
          return true; | 
						|
        } | 
						|
 | 
						|
        var isLeftOfAForStatement = function isLeftOfAForStatement(node) { | 
						|
          var i = 0; | 
						|
 | 
						|
          while (node) { | 
						|
            var _parent = path.getParentNode(i++); | 
						|
 | 
						|
            if (!_parent) { | 
						|
              return false; | 
						|
            } | 
						|
 | 
						|
            if (_parent.type === "ForStatement" && _parent.init === node) { | 
						|
              return true; | 
						|
            } | 
						|
 | 
						|
            node = _parent; | 
						|
          } | 
						|
 | 
						|
          return false; | 
						|
        }; | 
						|
 | 
						|
        if (node.operator === "in" && isLeftOfAForStatement(node)) { | 
						|
          return true; | 
						|
        } | 
						|
      } | 
						|
    // fallthrough | 
						|
 | 
						|
    case "TSTypeAssertion": | 
						|
    case "TSAsExpression": | 
						|
    case "LogicalExpression": | 
						|
      switch (parent.type) { | 
						|
        case "ConditionalExpression": | 
						|
          return node.type === "TSAsExpression"; | 
						|
 | 
						|
        case "CallExpression": | 
						|
        case "NewExpression": | 
						|
        case "OptionalCallExpression": | 
						|
          return name === "callee"; | 
						|
 | 
						|
        case "ClassExpression": | 
						|
        case "ClassDeclaration": | 
						|
          return name === "superClass" && parent.superClass === node; | 
						|
 | 
						|
        case "TSTypeAssertion": | 
						|
        case "TaggedTemplateExpression": | 
						|
        case "UnaryExpression": | 
						|
        case "JSXSpreadAttribute": | 
						|
        case "SpreadElement": | 
						|
        case "SpreadProperty": | 
						|
        case "BindExpression": | 
						|
        case "AwaitExpression": | 
						|
        case "TSAsExpression": | 
						|
        case "TSNonNullExpression": | 
						|
        case "UpdateExpression": | 
						|
          return true; | 
						|
 | 
						|
        case "MemberExpression": | 
						|
        case "OptionalMemberExpression": | 
						|
          return name === "object"; | 
						|
 | 
						|
        case "AssignmentExpression": | 
						|
          return parent.left === node && (node.type === "TSTypeAssertion" || node.type === "TSAsExpression"); | 
						|
 | 
						|
        case "LogicalExpression": | 
						|
          if (node.type === "LogicalExpression") { | 
						|
            return parent.operator !== node.operator; | 
						|
          } | 
						|
 | 
						|
        // else fallthrough | 
						|
 | 
						|
        case "BinaryExpression": | 
						|
          { | 
						|
            if (!node.operator && node.type !== "TSTypeAssertion") { | 
						|
              return true; | 
						|
            } | 
						|
 | 
						|
            var po = parent.operator; | 
						|
            var pp = util.getPrecedence(po); | 
						|
            var no = node.operator; | 
						|
            var np = util.getPrecedence(no); | 
						|
 | 
						|
            if (pp > np) { | 
						|
              return true; | 
						|
            } | 
						|
 | 
						|
            if (pp === np && name === "right") { | 
						|
              assert$1.strictEqual(parent.right, node); | 
						|
              return true; | 
						|
            } | 
						|
 | 
						|
            if (pp === np && !util.shouldFlatten(po, no)) { | 
						|
              return true; | 
						|
            } | 
						|
 | 
						|
            if (pp < np && no === "%") { | 
						|
              return po === "+" || po === "-"; | 
						|
            } // Add parenthesis when working with bitwise operators | 
						|
            // It's not strictly needed but helps with code understanding | 
						|
 | 
						|
 | 
						|
            if (util.isBitwiseOperator(po)) { | 
						|
              return true; | 
						|
            } | 
						|
 | 
						|
            return false; | 
						|
          } | 
						|
 | 
						|
        default: | 
						|
          return false; | 
						|
      } | 
						|
 | 
						|
    case "SequenceExpression": | 
						|
      switch (parent.type) { | 
						|
        case "ReturnStatement": | 
						|
          return false; | 
						|
 | 
						|
        case "ForStatement": | 
						|
          // Although parentheses wouldn't hurt around sequence | 
						|
          // expressions in the head of for loops, traditional style | 
						|
          // dictates that e.g. i++, j++ should not be wrapped with | 
						|
          // parentheses. | 
						|
          return false; | 
						|
 | 
						|
        case "ExpressionStatement": | 
						|
          return name !== "expression"; | 
						|
 | 
						|
        case "ArrowFunctionExpression": | 
						|
          // We do need parentheses, but SequenceExpressions are handled | 
						|
          // specially when printing bodies of arrow functions. | 
						|
          return name !== "body"; | 
						|
 | 
						|
        default: | 
						|
          // Otherwise err on the side of overparenthesization, adding | 
						|
          // explicit exceptions above if this proves overzealous. | 
						|
          return true; | 
						|
      } | 
						|
 | 
						|
    case "YieldExpression": | 
						|
      if (parent.type === "UnaryExpression" || parent.type === "AwaitExpression" || parent.type === "TSAsExpression" || parent.type === "TSNonNullExpression") { | 
						|
        return true; | 
						|
      } | 
						|
 | 
						|
    // else fallthrough | 
						|
 | 
						|
    case "AwaitExpression": | 
						|
      switch (parent.type) { | 
						|
        case "TaggedTemplateExpression": | 
						|
        case "UnaryExpression": | 
						|
        case "BinaryExpression": | 
						|
        case "LogicalExpression": | 
						|
        case "SpreadElement": | 
						|
        case "SpreadProperty": | 
						|
        case "TSAsExpression": | 
						|
        case "TSNonNullExpression": | 
						|
        case "BindExpression": | 
						|
          return true; | 
						|
 | 
						|
        case "MemberExpression": | 
						|
        case "OptionalMemberExpression": | 
						|
          return name === "object"; | 
						|
 | 
						|
        case "NewExpression": | 
						|
        case "CallExpression": | 
						|
        case "OptionalCallExpression": | 
						|
          return name === "callee"; | 
						|
 | 
						|
        case "ConditionalExpression": | 
						|
          return parent.test === node; | 
						|
 | 
						|
        default: | 
						|
          return false; | 
						|
      } | 
						|
 | 
						|
    case "TSConditionalType": | 
						|
      if (parent.type === "TSConditionalType" && node === parent.extendsType) { | 
						|
        return true; | 
						|
      } | 
						|
 | 
						|
    // fallthrough | 
						|
 | 
						|
    case "TSFunctionType": | 
						|
    case "TSConstructorType": | 
						|
      if (parent.type === "TSConditionalType" && node === parent.checkType) { | 
						|
        return true; | 
						|
      } | 
						|
 | 
						|
    // fallthrough | 
						|
 | 
						|
    case "TSUnionType": | 
						|
    case "TSIntersectionType": | 
						|
      if (parent.type === "TSUnionType" || parent.type === "TSIntersectionType") { | 
						|
        return true; | 
						|
      } | 
						|
 | 
						|
    // fallthrough | 
						|
 | 
						|
    case "TSTypeOperator": | 
						|
    case "TSInferType": | 
						|
      return parent.type === "TSArrayType" || parent.type === "TSOptionalType" || parent.type === "TSRestType" || parent.type === "TSIndexedAccessType" && node === parent.objectType || parent.type === "TSTypeOperator"; | 
						|
 | 
						|
    case "ArrayTypeAnnotation": | 
						|
      return parent.type === "NullableTypeAnnotation"; | 
						|
 | 
						|
    case "IntersectionTypeAnnotation": | 
						|
    case "UnionTypeAnnotation": | 
						|
      return parent.type === "ArrayTypeAnnotation" || parent.type === "NullableTypeAnnotation" || parent.type === "IntersectionTypeAnnotation" || parent.type === "UnionTypeAnnotation"; | 
						|
 | 
						|
    case "NullableTypeAnnotation": | 
						|
      return parent.type === "ArrayTypeAnnotation"; | 
						|
 | 
						|
    case "FunctionTypeAnnotation": | 
						|
      { | 
						|
        var ancestor = parent.type === "NullableTypeAnnotation" ? path.getParentNode(1) : parent; | 
						|
        return ancestor.type === "UnionTypeAnnotation" || ancestor.type === "IntersectionTypeAnnotation" || ancestor.type === "ArrayTypeAnnotation" || // We should check ancestor's parent to know whether the parentheses | 
						|
        // are really needed, but since ??T doesn't make sense this check | 
						|
        // will almost never be true. | 
						|
        ancestor.type === "NullableTypeAnnotation"; | 
						|
      } | 
						|
 | 
						|
    case "StringLiteral": | 
						|
    case "NumericLiteral": | 
						|
    case "Literal": | 
						|
      if (typeof node.value === "string" && parent.type === "ExpressionStatement" && ( // TypeScript workaround for https://github.com/JamesHenry/typescript-estree/issues/2 | 
						|
      // See corresponding workaround in printer.js case: "Literal" | 
						|
      options.parser !== "typescript" && !parent.directive || options.parser === "typescript" && options.originalText.substr(options.locStart(node) - 1, 1) === "(")) { | 
						|
        // To avoid becoming a directive | 
						|
        var grandParent = path.getParentNode(1); | 
						|
        return grandParent.type === "Program" || grandParent.type === "BlockStatement"; | 
						|
      } | 
						|
 | 
						|
      return parent.type === "MemberExpression" && typeof node.value === "number" && name === "object" && parent.object === node; | 
						|
 | 
						|
    case "AssignmentExpression": | 
						|
      { | 
						|
        var _grandParent = path.getParentNode(1); | 
						|
 | 
						|
        if (parent.type === "ArrowFunctionExpression" && parent.body === node) { | 
						|
          return true; | 
						|
        } else if (parent.type === "ClassProperty" && parent.key === node && parent.computed) { | 
						|
          return false; | 
						|
        } else if (parent.type === "TSPropertySignature" && parent.name === node) { | 
						|
          return false; | 
						|
        } else if (parent.type === "ForStatement" && (parent.init === node || parent.update === node)) { | 
						|
          return false; | 
						|
        } else if (parent.type === "ExpressionStatement") { | 
						|
          return node.left.type === "ObjectPattern"; | 
						|
        } else if (parent.type === "TSPropertySignature" && parent.key === node) { | 
						|
          return false; | 
						|
        } else if (parent.type === "AssignmentExpression") { | 
						|
          return false; | 
						|
        } else if (parent.type === "SequenceExpression" && _grandParent && _grandParent.type === "ForStatement" && (_grandParent.init === parent || _grandParent.update === parent)) { | 
						|
          return false; | 
						|
        } else if (parent.type === "Property" && parent.value === node) { | 
						|
          return false; | 
						|
        } else if (parent.type === "NGChainedExpression") { | 
						|
          return false; | 
						|
        } | 
						|
 | 
						|
        return true; | 
						|
      } | 
						|
 | 
						|
    case "ConditionalExpression": | 
						|
      switch (parent.type) { | 
						|
        case "TaggedTemplateExpression": | 
						|
        case "UnaryExpression": | 
						|
        case "SpreadElement": | 
						|
        case "SpreadProperty": | 
						|
        case "BinaryExpression": | 
						|
        case "LogicalExpression": | 
						|
        case "NGPipeExpression": | 
						|
        case "ExportDefaultDeclaration": | 
						|
        case "AwaitExpression": | 
						|
        case "JSXSpreadAttribute": | 
						|
        case "TSTypeAssertion": | 
						|
        case "TypeCastExpression": | 
						|
        case "TSAsExpression": | 
						|
        case "TSNonNullExpression": | 
						|
          return true; | 
						|
 | 
						|
        case "NewExpression": | 
						|
        case "CallExpression": | 
						|
        case "OptionalCallExpression": | 
						|
          return name === "callee"; | 
						|
 | 
						|
        case "ConditionalExpression": | 
						|
          return name === "test" && parent.test === node; | 
						|
 | 
						|
        case "MemberExpression": | 
						|
        case "OptionalMemberExpression": | 
						|
          return name === "object"; | 
						|
 | 
						|
        default: | 
						|
          return false; | 
						|
      } | 
						|
 | 
						|
    case "FunctionExpression": | 
						|
      switch (parent.type) { | 
						|
        case "NewExpression": | 
						|
        case "CallExpression": | 
						|
        case "OptionalCallExpression": | 
						|
          // Not always necessary, but it's clearer to the reader if IIFEs are wrapped in parentheses. | 
						|
          // Is necessary if it is `expression` of `ExpressionStatement`. | 
						|
          return name === "callee"; | 
						|
 | 
						|
        case "TaggedTemplateExpression": | 
						|
          return true; | 
						|
        // This is basically a kind of IIFE. | 
						|
 | 
						|
        default: | 
						|
          return false; | 
						|
      } | 
						|
 | 
						|
    case "ArrowFunctionExpression": | 
						|
      switch (parent.type) { | 
						|
        case "NewExpression": | 
						|
        case "CallExpression": | 
						|
        case "OptionalCallExpression": | 
						|
          return name === "callee"; | 
						|
 | 
						|
        case "MemberExpression": | 
						|
        case "OptionalMemberExpression": | 
						|
          return name === "object"; | 
						|
 | 
						|
        case "TSAsExpression": | 
						|
        case "BindExpression": | 
						|
        case "TaggedTemplateExpression": | 
						|
        case "UnaryExpression": | 
						|
        case "LogicalExpression": | 
						|
        case "BinaryExpression": | 
						|
        case "AwaitExpression": | 
						|
        case "TSTypeAssertion": | 
						|
          return true; | 
						|
 | 
						|
        case "ConditionalExpression": | 
						|
          return name === "test"; | 
						|
 | 
						|
        default: | 
						|
          return false; | 
						|
      } | 
						|
 | 
						|
    case "ClassExpression": | 
						|
      switch (parent.type) { | 
						|
        case "NewExpression": | 
						|
          return name === "callee" && parent.callee === node; | 
						|
 | 
						|
        default: | 
						|
          return false; | 
						|
      } | 
						|
 | 
						|
    case "OptionalMemberExpression": | 
						|
    case "OptionalCallExpression": | 
						|
      if ((parent.type === "MemberExpression" && name === "object" || parent.type === "CallExpression" && name === "callee") && // workaround for https://github.com/facebook/flow/issues/8159 | 
						|
      !(options.parser === "flow" && parent.range[0] === node.range[0])) { | 
						|
        return true; | 
						|
      } | 
						|
 | 
						|
    // fallthrough | 
						|
 | 
						|
    case "CallExpression": | 
						|
    case "MemberExpression": | 
						|
    case "TaggedTemplateExpression": | 
						|
    case "TSNonNullExpression": | 
						|
      if ((parent.type === "BindExpression" || parent.type === "NewExpression") && name === "callee") { | 
						|
        var object = node; | 
						|
 | 
						|
        while (object) { | 
						|
          switch (object.type) { | 
						|
            case "CallExpression": | 
						|
            case "OptionalCallExpression": | 
						|
              return true; | 
						|
 | 
						|
            case "MemberExpression": | 
						|
            case "OptionalMemberExpression": | 
						|
            case "BindExpression": | 
						|
              object = object.object; | 
						|
              break; | 
						|
            // tagged templates are basically member expressions from a grammar perspective | 
						|
            // see https://tc39.github.io/ecma262/#prod-MemberExpression | 
						|
 | 
						|
            case "TaggedTemplateExpression": | 
						|
              object = object.tag; | 
						|
              break; | 
						|
 | 
						|
            case "TSNonNullExpression": | 
						|
              object = object.expression; | 
						|
              break; | 
						|
 | 
						|
            default: | 
						|
              return false; | 
						|
          } | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      return false; | 
						|
 | 
						|
    case "BindExpression": | 
						|
      return (parent.type === "BindExpression" || parent.type === "NewExpression") && name === "callee" || (parent.type === "MemberExpression" || parent.type === "OptionalMemberExpression") && name === "object"; | 
						|
 | 
						|
    case "NGPipeExpression": | 
						|
      if (parent.type === "NGRoot" || parent.type === "NGMicrosyntaxExpression" || parent.type === "ObjectProperty" || parent.type === "ArrayExpression" || (parent.type === "CallExpression" || parent.type === "OptionalCallExpression") && parent.arguments[name] === node || parent.type === "NGPipeExpression" && name === "right" || parent.type === "MemberExpression" && name === "property" || parent.type === "AssignmentExpression") { | 
						|
        return false; | 
						|
      } | 
						|
 | 
						|
      return true; | 
						|
 | 
						|
    case "JSXFragment": | 
						|
    case "JSXElement": | 
						|
      return name === "callee" || parent.type !== "ArrayExpression" && parent.type !== "ArrowFunctionExpression" && parent.type !== "AssignmentExpression" && parent.type !== "AssignmentPattern" && parent.type !== "BinaryExpression" && parent.type !== "CallExpression" && parent.type !== "ConditionalExpression" && parent.type !== "ExpressionStatement" && parent.type !== "JsExpressionRoot" && parent.type !== "JSXAttribute" && parent.type !== "JSXElement" && parent.type !== "JSXExpressionContainer" && parent.type !== "JSXFragment" && parent.type !== "LogicalExpression" && parent.type !== "ObjectProperty" && parent.type !== "OptionalCallExpression" && parent.type !== "Property" && parent.type !== "ReturnStatement" && parent.type !== "TypeCastExpression" && parent.type !== "VariableDeclarator"; | 
						|
 | 
						|
    case "TypeAnnotation": | 
						|
      return name === "returnType" && parent.type === "ArrowFunctionExpression" && includesFunctionTypeInObjectType(node); | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function isStatement(node) { | 
						|
  return node.type === "BlockStatement" || node.type === "BreakStatement" || node.type === "ClassBody" || node.type === "ClassDeclaration" || node.type === "ClassMethod" || node.type === "ClassProperty" || node.type === "ClassPrivateProperty" || node.type === "ContinueStatement" || node.type === "DebuggerStatement" || node.type === "DeclareClass" || node.type === "DeclareExportAllDeclaration" || node.type === "DeclareExportDeclaration" || node.type === "DeclareFunction" || node.type === "DeclareInterface" || node.type === "DeclareModule" || node.type === "DeclareModuleExports" || node.type === "DeclareVariable" || node.type === "DoWhileStatement" || node.type === "EnumDeclaration" || node.type === "ExportAllDeclaration" || node.type === "ExportDefaultDeclaration" || node.type === "ExportNamedDeclaration" || node.type === "ExpressionStatement" || node.type === "ForAwaitStatement" || node.type === "ForInStatement" || node.type === "ForOfStatement" || node.type === "ForStatement" || node.type === "FunctionDeclaration" || node.type === "IfStatement" || node.type === "ImportDeclaration" || node.type === "InterfaceDeclaration" || node.type === "LabeledStatement" || node.type === "MethodDefinition" || node.type === "ReturnStatement" || node.type === "SwitchStatement" || node.type === "ThrowStatement" || node.type === "TryStatement" || node.type === "TSDeclareFunction" || node.type === "TSEnumDeclaration" || node.type === "TSImportEqualsDeclaration" || node.type === "TSInterfaceDeclaration" || node.type === "TSModuleDeclaration" || node.type === "TSNamespaceExportDeclaration" || node.type === "TypeAlias" || node.type === "VariableDeclaration" || node.type === "WhileStatement" || node.type === "WithStatement"; | 
						|
} | 
						|
 | 
						|
function includesFunctionTypeInObjectType(node) { | 
						|
  return hasNode$1(node, function (n1) { | 
						|
    return n1.type === "ObjectTypeAnnotation" && hasNode$1(n1, function (n2) { | 
						|
      return n2.type === "FunctionTypeAnnotation" || undefined; | 
						|
    }) || undefined; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function endsWithRightBracket(node) { | 
						|
  switch (node.type) { | 
						|
    case "ObjectExpression": | 
						|
      return true; | 
						|
 | 
						|
    default: | 
						|
      return false; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function isFollowedByRightBracket(path) { | 
						|
  var node = path.getValue(); | 
						|
  var parent = path.getParentNode(); | 
						|
  var name = path.getName(); | 
						|
 | 
						|
  switch (parent.type) { | 
						|
    case "NGPipeExpression": | 
						|
      if (typeof name === "number" && parent.arguments[name] === node && parent.arguments.length - 1 === name) { | 
						|
        return path.callParent(isFollowedByRightBracket); | 
						|
      } | 
						|
 | 
						|
      break; | 
						|
 | 
						|
    case "ObjectProperty": | 
						|
      if (name === "value") { | 
						|
        var parentParent = path.getParentNode(1); | 
						|
        return parentParent.properties[parentParent.properties.length - 1] === parent; | 
						|
      } | 
						|
 | 
						|
      break; | 
						|
 | 
						|
    case "BinaryExpression": | 
						|
    case "LogicalExpression": | 
						|
      if (name === "right") { | 
						|
        return path.callParent(isFollowedByRightBracket); | 
						|
      } | 
						|
 | 
						|
      break; | 
						|
 | 
						|
    case "ConditionalExpression": | 
						|
      if (name === "alternate") { | 
						|
        return path.callParent(isFollowedByRightBracket); | 
						|
      } | 
						|
 | 
						|
      break; | 
						|
 | 
						|
    case "UnaryExpression": | 
						|
      if (parent.prefix) { | 
						|
        return path.callParent(isFollowedByRightBracket); | 
						|
      } | 
						|
 | 
						|
      break; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function shouldWrapFunctionForExportDefault(path, options) { | 
						|
  var node = path.getValue(); | 
						|
  var parent = path.getParentNode(); | 
						|
 | 
						|
  if (node.type === "FunctionExpression" || node.type === "ClassExpression") { | 
						|
    return parent.type === "ExportDefaultDeclaration" || // in some cases the function is already wrapped | 
						|
    // (e.g. `export default (function() {})();`) | 
						|
    // in this case we don't need to add extra parens | 
						|
    !needsParens(path, options); | 
						|
  } | 
						|
 | 
						|
  if (!hasNakedLeftSide$1(node) || parent.type !== "ExportDefaultDeclaration" && needsParens(path, options)) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  return path.call.apply(path, [function (childPath) { | 
						|
    return shouldWrapFunctionForExportDefault(childPath, options); | 
						|
  }].concat(getLeftSidePathName$1(path, node))); | 
						|
} | 
						|
 | 
						|
var needsParens_1 = needsParens; | 
						|
 | 
						|
var _require$$0$builders$1 = doc.builders, | 
						|
    concat$5 = _require$$0$builders$1.concat, | 
						|
    join$3 = _require$$0$builders$1.join, | 
						|
    line$1 = _require$$0$builders$1.line; | 
						|
 | 
						|
function printHtmlBinding(path, options, print) { | 
						|
  var node = path.getValue(); | 
						|
 | 
						|
  if (options.__onHtmlBindingRoot && path.getName() === null) { | 
						|
    options.__onHtmlBindingRoot(node); | 
						|
  } | 
						|
 | 
						|
  if (node.type !== "File") { | 
						|
    return; | 
						|
  } | 
						|
 | 
						|
  if (options.__isVueForBindingLeft) { | 
						|
    return path.call(function (functionDeclarationPath) { | 
						|
      var _functionDeclarationP = functionDeclarationPath.getValue(), | 
						|
          params = _functionDeclarationP.params; | 
						|
 | 
						|
      return concat$5([params.length > 1 ? "(" : "", join$3(concat$5([",", line$1]), functionDeclarationPath.map(print, "params")), params.length > 1 ? ")" : ""]); | 
						|
    }, "program", "body", 0); | 
						|
  } | 
						|
 | 
						|
  if (options.__isVueSlotScope) { | 
						|
    return path.call(function (functionDeclarationPath) { | 
						|
      return join$3(concat$5([",", line$1]), functionDeclarationPath.map(print, "params")); | 
						|
    }, "program", "body", 0); | 
						|
  } | 
						|
} // based on https://github.com/prettier/prettier/blob/master/src/language-html/syntax-vue.js isVueEventBindingExpression() | 
						|
 | 
						|
 | 
						|
function isVueEventBindingExpression(node) { | 
						|
  switch (node.type) { | 
						|
    case "MemberExpression": | 
						|
      switch (node.property.type) { | 
						|
        case "Identifier": | 
						|
        case "NumericLiteral": | 
						|
        case "StringLiteral": | 
						|
          return isVueEventBindingExpression(node.object); | 
						|
      } | 
						|
 | 
						|
      return false; | 
						|
 | 
						|
    case "Identifier": | 
						|
      return true; | 
						|
 | 
						|
    default: | 
						|
      return false; | 
						|
  } | 
						|
} | 
						|
 | 
						|
var htmlBinding = { | 
						|
  isVueEventBindingExpression, | 
						|
  printHtmlBinding | 
						|
}; | 
						|
 | 
						|
function preprocess(ast, options) { | 
						|
  switch (options.parser) { | 
						|
    case "json": | 
						|
    case "json5": | 
						|
    case "json-stringify": | 
						|
    case "__js_expression": | 
						|
    case "__vue_expression": | 
						|
      return Object.assign({}, ast, { | 
						|
        type: options.parser.startsWith("__") ? "JsExpressionRoot" : "JsonRoot", | 
						|
        node: ast, | 
						|
        comments: [] | 
						|
      }); | 
						|
 | 
						|
    default: | 
						|
      return ast; | 
						|
  } | 
						|
} | 
						|
 | 
						|
var preprocess_1 = preprocess; | 
						|
 | 
						|
var getParentExportDeclaration$1 = util.getParentExportDeclaration, | 
						|
    isExportDeclaration$1 = util.isExportDeclaration, | 
						|
    shouldFlatten$1 = util.shouldFlatten, | 
						|
    getNextNonSpaceNonCommentCharacter$1 = util.getNextNonSpaceNonCommentCharacter, | 
						|
    hasNewline$3 = util.hasNewline, | 
						|
    hasNewlineInRange$2 = util.hasNewlineInRange, | 
						|
    getLast$2 = util.getLast, | 
						|
    getStringWidth$2 = util.getStringWidth, | 
						|
    printString$1 = util.printString, | 
						|
    printNumber$1 = util.printNumber, | 
						|
    hasIgnoreComment$2 = util.hasIgnoreComment, | 
						|
    hasNodeIgnoreComment$2 = util.hasNodeIgnoreComment, | 
						|
    getPenultimate$1 = util.getPenultimate, | 
						|
    startsWithNoLookaheadToken$1 = util.startsWithNoLookaheadToken, | 
						|
    getIndentSize$1 = util.getIndentSize, | 
						|
    matchAncestorTypes$1 = util.matchAncestorTypes, | 
						|
    getPreferredQuote$1 = util.getPreferredQuote; | 
						|
var isNextLineEmpty$2 = utilShared.isNextLineEmpty, | 
						|
    isNextLineEmptyAfterIndex$1 = utilShared.isNextLineEmptyAfterIndex, | 
						|
    getNextNonSpaceNonCommentCharacterIndex$2 = utilShared.getNextNonSpaceNonCommentCharacterIndex; | 
						|
var insertPragma$1 = pragma.insertPragma; | 
						|
var printHtmlBinding$1 = htmlBinding.printHtmlBinding, | 
						|
    isVueEventBindingExpression$1 = htmlBinding.isVueEventBindingExpression; | 
						|
var classChildNeedsASIProtection$1 = utils$2.classChildNeedsASIProtection, | 
						|
    classPropMayCauseASIProblems$1 = utils$2.classPropMayCauseASIProblems, | 
						|
    conditionalExpressionChainContainsJSX$1 = utils$2.conditionalExpressionChainContainsJSX, | 
						|
    getFlowVariance$1 = utils$2.getFlowVariance, | 
						|
    getLeftSidePathName$2 = utils$2.getLeftSidePathName, | 
						|
    getTypeScriptMappedTypeModifier$1 = utils$2.getTypeScriptMappedTypeModifier, | 
						|
    hasDanglingComments$1 = utils$2.hasDanglingComments, | 
						|
    hasFlowAnnotationComment$1 = utils$2.hasFlowAnnotationComment, | 
						|
    hasFlowShorthandAnnotationComment$2 = utils$2.hasFlowShorthandAnnotationComment, | 
						|
    hasLeadingComment$3 = utils$2.hasLeadingComment, | 
						|
    hasLeadingOwnLineComment$1 = utils$2.hasLeadingOwnLineComment, | 
						|
    hasNakedLeftSide$2 = utils$2.hasNakedLeftSide, | 
						|
    hasNewlineBetweenOrAfterDecorators$1 = utils$2.hasNewlineBetweenOrAfterDecorators, | 
						|
    hasNgSideEffect$1 = utils$2.hasNgSideEffect, | 
						|
    hasPrettierIgnore$1 = utils$2.hasPrettierIgnore, | 
						|
    hasTrailingComment$1 = utils$2.hasTrailingComment, | 
						|
    identity$1 = utils$2.identity, | 
						|
    isBinaryish$1 = utils$2.isBinaryish, | 
						|
    isCallOrOptionalCallExpression$1 = utils$2.isCallOrOptionalCallExpression, | 
						|
    isEmptyJSXElement$1 = utils$2.isEmptyJSXElement, | 
						|
    isFlowAnnotationComment$1 = utils$2.isFlowAnnotationComment, | 
						|
    isFunctionCompositionArgs$1 = utils$2.isFunctionCompositionArgs, | 
						|
    isFunctionNotation$1 = utils$2.isFunctionNotation, | 
						|
    isFunctionOrArrowExpression$1 = utils$2.isFunctionOrArrowExpression, | 
						|
    isGetterOrSetter$1 = utils$2.isGetterOrSetter, | 
						|
    isJestEachTemplateLiteral$1 = utils$2.isJestEachTemplateLiteral, | 
						|
    isJSXNode$1 = utils$2.isJSXNode, | 
						|
    isJSXWhitespaceExpression$1 = utils$2.isJSXWhitespaceExpression, | 
						|
    isLastStatement$1 = utils$2.isLastStatement, | 
						|
    isLiteral$1 = utils$2.isLiteral, | 
						|
    isLongCurriedCallExpression$1 = utils$2.isLongCurriedCallExpression, | 
						|
    isMeaningfulJSXText$1 = utils$2.isMeaningfulJSXText, | 
						|
    isMemberExpressionChain$1 = utils$2.isMemberExpressionChain, | 
						|
    isMemberish$1 = utils$2.isMemberish, | 
						|
    isNgForOf$1 = utils$2.isNgForOf, | 
						|
    isNumericLiteral$1 = utils$2.isNumericLiteral, | 
						|
    isObjectType$1 = utils$2.isObjectType, | 
						|
    isObjectTypePropertyAFunction$1 = utils$2.isObjectTypePropertyAFunction, | 
						|
    isSimpleFlowType$1 = utils$2.isSimpleFlowType, | 
						|
    isSimpleTemplateLiteral$1 = utils$2.isSimpleTemplateLiteral, | 
						|
    isStringLiteral$1 = utils$2.isStringLiteral, | 
						|
    isStringPropSafeToCoerceToIdentifier$1 = utils$2.isStringPropSafeToCoerceToIdentifier, | 
						|
    isTemplateOnItsOwnLine$1 = utils$2.isTemplateOnItsOwnLine, | 
						|
    isTestCall$1 = utils$2.isTestCall, | 
						|
    isTheOnlyJSXElementInMarkdown$1 = utils$2.isTheOnlyJSXElementInMarkdown, | 
						|
    isTSXFile$1 = utils$2.isTSXFile, | 
						|
    isTypeAnnotationAFunction$1 = utils$2.isTypeAnnotationAFunction, | 
						|
    matchJsxWhitespaceRegex$1 = utils$2.matchJsxWhitespaceRegex, | 
						|
    needsHardlineAfterDanglingComment$1 = utils$2.needsHardlineAfterDanglingComment, | 
						|
    rawText$1 = utils$2.rawText, | 
						|
    returnArgumentHasLeadingComment$1 = utils$2.returnArgumentHasLeadingComment; | 
						|
var needsQuoteProps = new WeakMap(); | 
						|
var _require$$5$builders = doc.builders, | 
						|
    concat$6 = _require$$5$builders.concat, | 
						|
    join$4 = _require$$5$builders.join, | 
						|
    line$2 = _require$$5$builders.line, | 
						|
    hardline$4 = _require$$5$builders.hardline, | 
						|
    softline$2 = _require$$5$builders.softline, | 
						|
    literalline$2 = _require$$5$builders.literalline, | 
						|
    group$2 = _require$$5$builders.group, | 
						|
    indent$3 = _require$$5$builders.indent, | 
						|
    align$1 = _require$$5$builders.align, | 
						|
    conditionalGroup$1 = _require$$5$builders.conditionalGroup, | 
						|
    fill$2 = _require$$5$builders.fill, | 
						|
    ifBreak$1 = _require$$5$builders.ifBreak, | 
						|
    breakParent$2 = _require$$5$builders.breakParent, | 
						|
    lineSuffixBoundary$1 = _require$$5$builders.lineSuffixBoundary, | 
						|
    addAlignmentToDoc$2 = _require$$5$builders.addAlignmentToDoc, | 
						|
    dedent$1 = _require$$5$builders.dedent, | 
						|
    _require$$5$utils = doc.utils, | 
						|
    willBreak$1 = _require$$5$utils.willBreak, | 
						|
    isLineNext$1 = _require$$5$utils.isLineNext, | 
						|
    isEmpty$1 = _require$$5$utils.isEmpty, | 
						|
    removeLines$1 = _require$$5$utils.removeLines, | 
						|
    printDocToString$2 = doc.printer.printDocToString; | 
						|
var uid = 0; | 
						|
 | 
						|
function shouldPrintComma(options, level) { | 
						|
  level = level || "es5"; | 
						|
 | 
						|
  switch (options.trailingComma) { | 
						|
    case "all": | 
						|
      if (level === "all") { | 
						|
        return true; | 
						|
      } | 
						|
 | 
						|
    // fallthrough | 
						|
 | 
						|
    case "es5": | 
						|
      if (level === "es5") { | 
						|
        return true; | 
						|
      } | 
						|
 | 
						|
    // fallthrough | 
						|
 | 
						|
    case "none": | 
						|
    default: | 
						|
      return false; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function genericPrint(path, options, printPath, args) { | 
						|
  var node = path.getValue(); | 
						|
  var needsParens = false; | 
						|
  var linesWithoutParens = printPathNoParens(path, options, printPath, args); | 
						|
 | 
						|
  if (!node || isEmpty$1(linesWithoutParens)) { | 
						|
    return linesWithoutParens; | 
						|
  } | 
						|
 | 
						|
  var parentExportDecl = getParentExportDeclaration$1(path); | 
						|
  var decorators = []; | 
						|
 | 
						|
  if (node.type === "ClassMethod" || node.type === "ClassPrivateMethod" || node.type === "ClassProperty" || node.type === "TSAbstractClassProperty" || node.type === "ClassPrivateProperty" || node.type === "MethodDefinition" || node.type === "TSAbstractMethodDefinition") ; else if (node.decorators && node.decorators.length > 0 && // If the parent node is an export declaration and the decorator | 
						|
  // was written before the export, the export will be responsible | 
						|
  // for printing the decorators. | 
						|
  !(parentExportDecl && options.locStart(parentExportDecl, { | 
						|
    ignoreDecorators: true | 
						|
  }) > options.locStart(node.decorators[0]))) { | 
						|
    var shouldBreak = node.type === "ClassExpression" || node.type === "ClassDeclaration" || hasNewlineBetweenOrAfterDecorators$1(node, options); | 
						|
    var separator = shouldBreak ? hardline$4 : line$2; | 
						|
    path.each(function (decoratorPath) { | 
						|
      var decorator = decoratorPath.getValue(); | 
						|
 | 
						|
      if (decorator.expression) { | 
						|
        decorator = decorator.expression; | 
						|
      } else { | 
						|
        decorator = decorator.callee; | 
						|
      } | 
						|
 | 
						|
      decorators.push(printPath(decoratorPath), separator); | 
						|
    }, "decorators"); | 
						|
 | 
						|
    if (parentExportDecl) { | 
						|
      decorators.unshift(hardline$4); | 
						|
    } | 
						|
  } else if (isExportDeclaration$1(node) && node.declaration && node.declaration.decorators && node.declaration.decorators.length > 0 && // Only print decorators here if they were written before the export, | 
						|
  // otherwise they are printed by the node.declaration | 
						|
  options.locStart(node, { | 
						|
    ignoreDecorators: true | 
						|
  }) > options.locStart(node.declaration.decorators[0])) { | 
						|
    // Export declarations are responsible for printing any decorators | 
						|
    // that logically apply to node.declaration. | 
						|
    path.each(function (decoratorPath) { | 
						|
      var decorator = decoratorPath.getValue(); | 
						|
      var prefix = decorator.type === "Decorator" ? "" : "@"; | 
						|
      decorators.push(prefix, printPath(decoratorPath), hardline$4); | 
						|
    }, "declaration", "decorators"); | 
						|
  } else { | 
						|
    // Nodes with decorators can't have parentheses, so we can avoid | 
						|
    // computing pathNeedsParens() except in this case. | 
						|
    needsParens = needsParens_1(path, options); | 
						|
  } | 
						|
 | 
						|
  var parts = []; | 
						|
 | 
						|
  if (needsParens) { | 
						|
    parts.unshift("("); | 
						|
  } | 
						|
 | 
						|
  parts.push(linesWithoutParens); | 
						|
 | 
						|
  if (needsParens) { | 
						|
    var _node = path.getValue(); | 
						|
 | 
						|
    if (hasFlowShorthandAnnotationComment$2(_node)) { | 
						|
      parts.push(" /*"); | 
						|
      parts.push(_node.trailingComments[0].value.trimLeft()); | 
						|
      parts.push("*/"); | 
						|
      _node.trailingComments[0].printed = true; | 
						|
    } | 
						|
 | 
						|
    parts.push(")"); | 
						|
  } | 
						|
 | 
						|
  if (decorators.length > 0) { | 
						|
    return group$2(concat$6(decorators.concat(parts))); | 
						|
  } | 
						|
 | 
						|
  return concat$6(parts); | 
						|
} | 
						|
 | 
						|
function printDecorators(path, options, print) { | 
						|
  var node = path.getValue(); | 
						|
  return group$2(concat$6([join$4(line$2, path.map(print, "decorators")), hasNewlineBetweenOrAfterDecorators$1(node, options) ? hardline$4 : line$2])); | 
						|
} | 
						|
/** | 
						|
 * The following is the shared logic for | 
						|
 * ternary operators, namely ConditionalExpression | 
						|
 * and TSConditionalType | 
						|
 * @typedef {Object} OperatorOptions | 
						|
 * @property {() => Array<string | Doc>} beforeParts - Parts to print before the `?`. | 
						|
 * @property {(breakClosingParen: boolean) => Array<string | Doc>} afterParts - Parts to print after the conditional expression. | 
						|
 * @property {boolean} shouldCheckJsx - Whether to check for and print in JSX mode. | 
						|
 * @property {string} conditionalNodeType - The type of the conditional expression node, ie "ConditionalExpression" or "TSConditionalType". | 
						|
 * @property {string} consequentNodePropertyName - The property at which the consequent node can be found on the main node, eg "consequent". | 
						|
 * @property {string} alternateNodePropertyName - The property at which the alternate node can be found on the main node, eg "alternate". | 
						|
 * @property {string} testNodePropertyName - The property at which the test node can be found on the main node, eg "test". | 
						|
 * @property {boolean} breakNested - Whether to break all nested ternaries when one breaks. | 
						|
 * @param {FastPath} path - The path to the ConditionalExpression/TSConditionalType node. | 
						|
 * @param {Options} options - Prettier options | 
						|
 * @param {Function} print - Print function to call recursively | 
						|
 * @param {OperatorOptions} operatorOptions | 
						|
 * @returns Doc | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function printTernaryOperator(path, options, print, operatorOptions) { | 
						|
  var node = path.getValue(); | 
						|
  var testNode = node[operatorOptions.testNodePropertyName]; | 
						|
  var consequentNode = node[operatorOptions.consequentNodePropertyName]; | 
						|
  var alternateNode = node[operatorOptions.alternateNodePropertyName]; | 
						|
  var parts = []; // We print a ConditionalExpression in either "JSX mode" or "normal mode". | 
						|
  // See tests/jsx/conditional-expression.js for more info. | 
						|
 | 
						|
  var jsxMode = false; | 
						|
  var parent = path.getParentNode(); | 
						|
  var forceNoIndent = parent.type === operatorOptions.conditionalNodeType; // Find the outermost non-ConditionalExpression parent, and the outermost | 
						|
  // ConditionalExpression parent. We'll use these to determine if we should | 
						|
  // print in JSX mode. | 
						|
 | 
						|
  var currentParent; | 
						|
  var previousParent; | 
						|
  var i = 0; | 
						|
 | 
						|
  do { | 
						|
    previousParent = currentParent || node; | 
						|
    currentParent = path.getParentNode(i); | 
						|
    i++; | 
						|
  } while (currentParent && currentParent.type === operatorOptions.conditionalNodeType); | 
						|
 | 
						|
  var firstNonConditionalParent = currentParent || parent; | 
						|
  var lastConditionalParent = previousParent; | 
						|
 | 
						|
  if (operatorOptions.shouldCheckJsx && (isJSXNode$1(testNode) || isJSXNode$1(consequentNode) || isJSXNode$1(alternateNode) || conditionalExpressionChainContainsJSX$1(lastConditionalParent))) { | 
						|
    jsxMode = true; | 
						|
    forceNoIndent = true; // Even though they don't need parens, we wrap (almost) everything in | 
						|
    // parens when using ?: within JSX, because the parens are analogous to | 
						|
    // curly braces in an if statement. | 
						|
 | 
						|
    var wrap = function wrap(doc) { | 
						|
      return concat$6([ifBreak$1("(", ""), indent$3(concat$6([softline$2, doc])), softline$2, ifBreak$1(")", "")]); | 
						|
    }; // The only things we don't wrap are: | 
						|
    // * Nested conditional expressions in alternates | 
						|
    // * null | 
						|
 | 
						|
 | 
						|
    var isNull = function isNull(node) { | 
						|
      return node.type === "NullLiteral" || node.type === "Literal" && node.value === null; | 
						|
    }; | 
						|
 | 
						|
    parts.push(" ? ", isNull(consequentNode) ? path.call(print, operatorOptions.consequentNodePropertyName) : wrap(path.call(print, operatorOptions.consequentNodePropertyName)), " : ", alternateNode.type === operatorOptions.conditionalNodeType || isNull(alternateNode) ? path.call(print, operatorOptions.alternateNodePropertyName) : wrap(path.call(print, operatorOptions.alternateNodePropertyName))); | 
						|
  } else { | 
						|
    // normal mode | 
						|
    var part = concat$6([line$2, "? ", consequentNode.type === operatorOptions.conditionalNodeType ? ifBreak$1("", "(") : "", align$1(2, path.call(print, operatorOptions.consequentNodePropertyName)), consequentNode.type === operatorOptions.conditionalNodeType ? ifBreak$1("", ")") : "", line$2, ": ", alternateNode.type === operatorOptions.conditionalNodeType ? path.call(print, operatorOptions.alternateNodePropertyName) : align$1(2, path.call(print, operatorOptions.alternateNodePropertyName))]); | 
						|
    parts.push(parent.type !== operatorOptions.conditionalNodeType || parent[operatorOptions.alternateNodePropertyName] === node ? part : options.useTabs ? dedent$1(indent$3(part)) : align$1(Math.max(0, options.tabWidth - 2), part)); | 
						|
  } // We want a whole chain of ConditionalExpressions to all | 
						|
  // break if any of them break. That means we should only group around the | 
						|
  // outer-most ConditionalExpression. | 
						|
 | 
						|
 | 
						|
  var maybeGroup = function maybeGroup(doc) { | 
						|
    return operatorOptions.breakNested ? parent === firstNonConditionalParent ? group$2(doc) : doc : group$2(doc); | 
						|
  }; // Break the closing paren to keep the chain right after it: | 
						|
  // (a | 
						|
  //   ? b | 
						|
  //   : c | 
						|
  // ).call() | 
						|
 | 
						|
 | 
						|
  var breakClosingParen = !jsxMode && (parent.type === "MemberExpression" || parent.type === "OptionalMemberExpression" || parent.type === "NGPipeExpression" && parent.left === node && operatorOptions.breakNested) && !parent.computed; | 
						|
  return maybeGroup(concat$6([].concat(function (testDoc) { | 
						|
    return ( | 
						|
      /** | 
						|
       *     a | 
						|
       *       ? b | 
						|
       *       : multiline | 
						|
       *         test | 
						|
       *         node | 
						|
       *       ^^ align(2) | 
						|
       *       ? d | 
						|
       *       : e | 
						|
       */ | 
						|
      parent.type === operatorOptions.conditionalNodeType && parent[operatorOptions.alternateNodePropertyName] === node ? align$1(2, testDoc) : testDoc | 
						|
    ); | 
						|
  }(concat$6(operatorOptions.beforeParts())), forceNoIndent ? concat$6(parts) : indent$3(concat$6(parts)), operatorOptions.afterParts(breakClosingParen)))); | 
						|
} | 
						|
 | 
						|
function printPathNoParens(path, options, print, args) { | 
						|
  var n = path.getValue(); | 
						|
  var semi = options.semi ? ";" : ""; | 
						|
 | 
						|
  if (!n) { | 
						|
    return ""; | 
						|
  } | 
						|
 | 
						|
  if (typeof n === "string") { | 
						|
    return n; | 
						|
  } | 
						|
 | 
						|
  var htmlBinding = printHtmlBinding$1(path, options, print); | 
						|
 | 
						|
  if (htmlBinding) { | 
						|
    return htmlBinding; | 
						|
  } | 
						|
 | 
						|
  var parts = []; | 
						|
 | 
						|
  switch (n.type) { | 
						|
    case "JsExpressionRoot": | 
						|
      return path.call(print, "node"); | 
						|
 | 
						|
    case "JsonRoot": | 
						|
      return concat$6([path.call(print, "node"), hardline$4]); | 
						|
 | 
						|
    case "File": | 
						|
      // Print @babel/parser's InterpreterDirective here so that | 
						|
      // leading comments on the `Program` node get printed after the hashbang. | 
						|
      if (n.program && n.program.interpreter) { | 
						|
        parts.push(path.call(function (programPath) { | 
						|
          return programPath.call(print, "interpreter"); | 
						|
        }, "program")); | 
						|
      } | 
						|
 | 
						|
      parts.push(path.call(print, "program")); | 
						|
      return concat$6(parts); | 
						|
 | 
						|
    case "Program": | 
						|
      // Babel 6 | 
						|
      if (n.directives) { | 
						|
        path.each(function (childPath) { | 
						|
          parts.push(print(childPath), semi, hardline$4); | 
						|
 | 
						|
          if (isNextLineEmpty$2(options.originalText, childPath.getValue(), options)) { | 
						|
            parts.push(hardline$4); | 
						|
          } | 
						|
        }, "directives"); | 
						|
      } | 
						|
 | 
						|
      parts.push(path.call(function (bodyPath) { | 
						|
        return printStatementSequence(bodyPath, options, print); | 
						|
      }, "body")); | 
						|
      parts.push(comments.printDanglingComments(path, options, | 
						|
      /* sameIndent */ | 
						|
      true)); // Only force a trailing newline if there were any contents. | 
						|
 | 
						|
      if (n.body.length || n.comments) { | 
						|
        parts.push(hardline$4); | 
						|
      } | 
						|
 | 
						|
      return concat$6(parts); | 
						|
    // Babel extension. | 
						|
 | 
						|
    case "EmptyStatement": | 
						|
      return ""; | 
						|
 | 
						|
    case "ExpressionStatement": | 
						|
      // Detect Flow-parsed directives | 
						|
      if (n.directive) { | 
						|
        return concat$6([nodeStr(n.expression, options, true), semi]); | 
						|
      } | 
						|
 | 
						|
      if (options.parser === "__vue_event_binding") { | 
						|
        var parent = path.getParentNode(); | 
						|
 | 
						|
        if (parent.type === "Program" && parent.body.length === 1 && parent.body[0] === n) { | 
						|
          return concat$6([path.call(print, "expression"), isVueEventBindingExpression$1(n.expression) ? ";" : ""]); | 
						|
        } | 
						|
      } // Do not append semicolon after the only JSX element in a program | 
						|
 | 
						|
 | 
						|
      return concat$6([path.call(print, "expression"), isTheOnlyJSXElementInMarkdown$1(options, path) ? "" : semi]); | 
						|
    // Babel extension. | 
						|
 | 
						|
    case "ParenthesizedExpression": | 
						|
      return concat$6(["(", path.call(print, "expression"), ")"]); | 
						|
 | 
						|
    case "AssignmentExpression": | 
						|
      return printAssignment(n.left, path.call(print, "left"), concat$6([" ", n.operator]), n.right, path.call(print, "right"), options); | 
						|
 | 
						|
    case "BinaryExpression": | 
						|
    case "LogicalExpression": | 
						|
    case "NGPipeExpression": | 
						|
      { | 
						|
        var _parent = path.getParentNode(); | 
						|
 | 
						|
        var parentParent = path.getParentNode(1); | 
						|
        var isInsideParenthesis = n !== _parent.body && (_parent.type === "IfStatement" || _parent.type === "WhileStatement" || _parent.type === "SwitchStatement" || _parent.type === "DoWhileStatement"); | 
						|
 | 
						|
        var _parts = printBinaryishExpressions(path, print, options, | 
						|
        /* isNested */ | 
						|
        false, isInsideParenthesis); //   if ( | 
						|
        //     this.hasPlugin("dynamicImports") && this.lookahead().type === tt.parenLeft | 
						|
        //   ) { | 
						|
        // | 
						|
        // looks super weird, we want to break the children if the parent breaks | 
						|
        // | 
						|
        //   if ( | 
						|
        //     this.hasPlugin("dynamicImports") && | 
						|
        //     this.lookahead().type === tt.parenLeft | 
						|
        //   ) { | 
						|
 | 
						|
 | 
						|
        if (isInsideParenthesis) { | 
						|
          return concat$6(_parts); | 
						|
        } // Break between the parens in | 
						|
        // unaries or in a member or specific call expression, i.e. | 
						|
        // | 
						|
        //   ( | 
						|
        //     a && | 
						|
        //     b && | 
						|
        //     c | 
						|
        //   ).call() | 
						|
 | 
						|
 | 
						|
        if ((_parent.type === "CallExpression" || _parent.type === "OptionalCallExpression") && _parent.callee === n || _parent.type === "UnaryExpression" || (_parent.type === "MemberExpression" || _parent.type === "OptionalMemberExpression") && !_parent.computed) { | 
						|
          return group$2(concat$6([indent$3(concat$6([softline$2, concat$6(_parts)])), softline$2])); | 
						|
        } // Avoid indenting sub-expressions in some cases where the first sub-expression is already | 
						|
        // indented accordingly. We should indent sub-expressions where the first case isn't indented. | 
						|
 | 
						|
 | 
						|
        var shouldNotIndent = _parent.type === "ReturnStatement" || _parent.type === "JSXExpressionContainer" && parentParent.type === "JSXAttribute" || n.type !== "NGPipeExpression" && (_parent.type === "NGRoot" && options.parser === "__ng_binding" || _parent.type === "NGMicrosyntaxExpression" && parentParent.type === "NGMicrosyntax" && parentParent.body.length === 1) || n === _parent.body && _parent.type === "ArrowFunctionExpression" || n !== _parent.body && _parent.type === "ForStatement" || _parent.type === "ConditionalExpression" && parentParent.type !== "ReturnStatement" && parentParent.type !== "CallExpression" && parentParent.type !== "OptionalCallExpression"; | 
						|
        var shouldIndentIfInlining = _parent.type === "AssignmentExpression" || _parent.type === "VariableDeclarator" || _parent.type === "ClassProperty" || _parent.type === "TSAbstractClassProperty" || _parent.type === "ClassPrivateProperty" || _parent.type === "ObjectProperty" || _parent.type === "Property"; | 
						|
        var samePrecedenceSubExpression = isBinaryish$1(n.left) && shouldFlatten$1(n.operator, n.left.operator); | 
						|
 | 
						|
        if (shouldNotIndent || shouldInlineLogicalExpression(n) && !samePrecedenceSubExpression || !shouldInlineLogicalExpression(n) && shouldIndentIfInlining) { | 
						|
          return group$2(concat$6(_parts)); | 
						|
        } | 
						|
 | 
						|
        if (_parts.length === 0) { | 
						|
          return ""; | 
						|
        } // If the right part is a JSX node, we include it in a separate group to | 
						|
        // prevent it breaking the whole chain, so we can print the expression like: | 
						|
        // | 
						|
        //   foo && bar && ( | 
						|
        //     <Foo> | 
						|
        //       <Bar /> | 
						|
        //     </Foo> | 
						|
        //   ) | 
						|
 | 
						|
 | 
						|
        var hasJSX = isJSXNode$1(n.right); | 
						|
        var rest = concat$6(hasJSX ? _parts.slice(1, -1) : _parts.slice(1)); | 
						|
        var groupId = Symbol("logicalChain-" + ++uid); | 
						|
        var chain = group$2(concat$6([// Don't include the initial expression in the indentation | 
						|
        // level. The first item is guaranteed to be the first | 
						|
        // left-most expression. | 
						|
        _parts.length > 0 ? _parts[0] : "", indent$3(rest)]), { | 
						|
          id: groupId | 
						|
        }); | 
						|
 | 
						|
        if (!hasJSX) { | 
						|
          return chain; | 
						|
        } | 
						|
 | 
						|
        var jsxPart = getLast$2(_parts); | 
						|
        return group$2(concat$6([chain, ifBreak$1(indent$3(jsxPart), jsxPart, { | 
						|
          groupId | 
						|
        })])); | 
						|
      } | 
						|
 | 
						|
    case "AssignmentPattern": | 
						|
      return concat$6([path.call(print, "left"), " = ", path.call(print, "right")]); | 
						|
 | 
						|
    case "TSTypeAssertion": | 
						|
      { | 
						|
        var shouldBreakAfterCast = !(n.expression.type === "ArrayExpression" || n.expression.type === "ObjectExpression"); | 
						|
        var castGroup = group$2(concat$6(["<", indent$3(concat$6([softline$2, path.call(print, "typeAnnotation")])), softline$2, ">"])); | 
						|
        var exprContents = concat$6([ifBreak$1("("), indent$3(concat$6([softline$2, path.call(print, "expression")])), softline$2, ifBreak$1(")")]); | 
						|
 | 
						|
        if (shouldBreakAfterCast) { | 
						|
          return conditionalGroup$1([concat$6([castGroup, path.call(print, "expression")]), concat$6([castGroup, group$2(exprContents, { | 
						|
            shouldBreak: true | 
						|
          })]), concat$6([castGroup, path.call(print, "expression")])]); | 
						|
        } | 
						|
 | 
						|
        return group$2(concat$6([castGroup, path.call(print, "expression")])); | 
						|
      } | 
						|
 | 
						|
    case "OptionalMemberExpression": | 
						|
    case "MemberExpression": | 
						|
      { | 
						|
        var _parent2 = path.getParentNode(); | 
						|
 | 
						|
        var firstNonMemberParent; | 
						|
        var i = 0; | 
						|
 | 
						|
        do { | 
						|
          firstNonMemberParent = path.getParentNode(i); | 
						|
          i++; | 
						|
        } while (firstNonMemberParent && (firstNonMemberParent.type === "MemberExpression" || firstNonMemberParent.type === "OptionalMemberExpression" || firstNonMemberParent.type === "TSNonNullExpression")); | 
						|
 | 
						|
        var shouldInline = firstNonMemberParent && (firstNonMemberParent.type === "NewExpression" || firstNonMemberParent.type === "BindExpression" || firstNonMemberParent.type === "VariableDeclarator" && firstNonMemberParent.id.type !== "Identifier" || firstNonMemberParent.type === "AssignmentExpression" && firstNonMemberParent.left.type !== "Identifier") || n.computed || n.object.type === "Identifier" && n.property.type === "Identifier" && _parent2.type !== "MemberExpression" && _parent2.type !== "OptionalMemberExpression"; | 
						|
        return concat$6([path.call(print, "object"), shouldInline ? printMemberLookup(path, options, print) : group$2(indent$3(concat$6([softline$2, printMemberLookup(path, options, print)])))]); | 
						|
      } | 
						|
 | 
						|
    case "MetaProperty": | 
						|
      return concat$6([path.call(print, "meta"), ".", path.call(print, "property")]); | 
						|
 | 
						|
    case "BindExpression": | 
						|
      if (n.object) { | 
						|
        parts.push(path.call(print, "object")); | 
						|
      } | 
						|
 | 
						|
      parts.push(group$2(indent$3(concat$6([softline$2, printBindExpressionCallee(path, options, print)])))); | 
						|
      return concat$6(parts); | 
						|
 | 
						|
    case "Identifier": | 
						|
      { | 
						|
        return concat$6([n.name, printOptionalToken(path), printTypeAnnotation(path, options, print)]); | 
						|
      } | 
						|
 | 
						|
    case "V8IntrinsicIdentifier": | 
						|
      return concat$6(["%", n.name]); | 
						|
 | 
						|
    case "SpreadElement": | 
						|
    case "SpreadElementPattern": | 
						|
    case "RestProperty": | 
						|
    case "SpreadProperty": | 
						|
    case "SpreadPropertyPattern": | 
						|
    case "RestElement": | 
						|
    case "ObjectTypeSpreadProperty": | 
						|
      return concat$6(["...", path.call(print, "argument"), printTypeAnnotation(path, options, print)]); | 
						|
 | 
						|
    case "FunctionDeclaration": | 
						|
    case "FunctionExpression": | 
						|
      parts.push(printFunctionDeclaration(path, print, options)); | 
						|
 | 
						|
      if (!n.body) { | 
						|
        parts.push(semi); | 
						|
      } | 
						|
 | 
						|
      return concat$6(parts); | 
						|
 | 
						|
    case "ArrowFunctionExpression": | 
						|
      { | 
						|
        if (n.async) { | 
						|
          parts.push("async "); | 
						|
        } | 
						|
 | 
						|
        if (shouldPrintParamsWithoutParens(path, options)) { | 
						|
          parts.push(path.call(print, "params", 0)); | 
						|
        } else { | 
						|
          parts.push(group$2(concat$6([printFunctionParams(path, print, options, | 
						|
          /* expandLast */ | 
						|
          args && (args.expandLastArg || args.expandFirstArg), | 
						|
          /* printTypeParams */ | 
						|
          true), printReturnType(path, print, options)]))); | 
						|
        } | 
						|
 | 
						|
        var dangling = comments.printDanglingComments(path, options, | 
						|
        /* sameIndent */ | 
						|
        true, function (comment) { | 
						|
          var nextCharacter = getNextNonSpaceNonCommentCharacterIndex$2(options.originalText, comment, options); | 
						|
          return options.originalText.substr(nextCharacter, 2) === "=>"; | 
						|
        }); | 
						|
 | 
						|
        if (dangling) { | 
						|
          parts.push(" ", dangling); | 
						|
        } | 
						|
 | 
						|
        parts.push(" =>"); | 
						|
        var body = path.call(function (bodyPath) { | 
						|
          return print(bodyPath, args); | 
						|
        }, "body"); // We want to always keep these types of nodes on the same line | 
						|
        // as the arrow. | 
						|
 | 
						|
        if (!hasLeadingOwnLineComment$1(options.originalText, n.body, options) && (n.body.type === "ArrayExpression" || n.body.type === "ObjectExpression" || n.body.type === "BlockStatement" || isJSXNode$1(n.body) || isTemplateOnItsOwnLine$1(n.body, options.originalText, options) || n.body.type === "ArrowFunctionExpression" || n.body.type === "DoExpression")) { | 
						|
          return group$2(concat$6([concat$6(parts), " ", body])); | 
						|
        } // We handle sequence expressions as the body of arrows specially, | 
						|
        // so that the required parentheses end up on their own lines. | 
						|
 | 
						|
 | 
						|
        if (n.body.type === "SequenceExpression") { | 
						|
          return group$2(concat$6([concat$6(parts), group$2(concat$6([" (", indent$3(concat$6([softline$2, body])), softline$2, ")"]))])); | 
						|
        } // if the arrow function is expanded as last argument, we are adding a | 
						|
        // level of indentation and need to add a softline to align the closing ) | 
						|
        // with the opening (, or if it's inside a JSXExpression (e.g. an attribute) | 
						|
        // we should align the expression's closing } with the line with the opening {. | 
						|
 | 
						|
 | 
						|
        var shouldAddSoftLine = (args && args.expandLastArg || path.getParentNode().type === "JSXExpressionContainer") && !(n.comments && n.comments.length); | 
						|
        var printTrailingComma = args && args.expandLastArg && shouldPrintComma(options, "all"); // In order to avoid confusion between | 
						|
        // a => a ? a : a | 
						|
        // a <= a ? a : a | 
						|
 | 
						|
        var shouldAddParens = n.body.type === "ConditionalExpression" && !startsWithNoLookaheadToken$1(n.body, | 
						|
        /* forbidFunctionAndClass */ | 
						|
        false); | 
						|
        return group$2(concat$6([concat$6(parts), group$2(concat$6([indent$3(concat$6([line$2, shouldAddParens ? ifBreak$1("", "(") : "", body, shouldAddParens ? ifBreak$1("", ")") : ""])), shouldAddSoftLine ? concat$6([ifBreak$1(printTrailingComma ? "," : ""), softline$2]) : ""]))])); | 
						|
      } | 
						|
 | 
						|
    case "YieldExpression": | 
						|
      parts.push("yield"); | 
						|
 | 
						|
      if (n.delegate) { | 
						|
        parts.push("*"); | 
						|
      } | 
						|
 | 
						|
      if (n.argument) { | 
						|
        parts.push(" ", path.call(print, "argument")); | 
						|
      } | 
						|
 | 
						|
      return concat$6(parts); | 
						|
 | 
						|
    case "AwaitExpression": | 
						|
      { | 
						|
        parts.push("await ", path.call(print, "argument")); | 
						|
 | 
						|
        var _parent3 = path.getParentNode(); | 
						|
 | 
						|
        if ((_parent3.type === "CallExpression" || _parent3.type === "OptionalCallExpression") && _parent3.callee === n || (_parent3.type === "MemberExpression" || _parent3.type === "OptionalMemberExpression") && _parent3.object === n) { | 
						|
          return group$2(concat$6([indent$3(concat$6([softline$2, concat$6(parts)])), softline$2])); | 
						|
        } | 
						|
 | 
						|
        return concat$6(parts); | 
						|
      } | 
						|
 | 
						|
    case "ImportSpecifier": | 
						|
      if (n.importKind) { | 
						|
        parts.push(path.call(print, "importKind"), " "); | 
						|
      } | 
						|
 | 
						|
      parts.push(path.call(print, "imported")); | 
						|
 | 
						|
      if (n.local && n.local.name !== n.imported.name) { | 
						|
        parts.push(" as ", path.call(print, "local")); | 
						|
      } | 
						|
 | 
						|
      return concat$6(parts); | 
						|
 | 
						|
    case "ExportSpecifier": | 
						|
      parts.push(path.call(print, "local")); | 
						|
 | 
						|
      if (n.exported && n.exported.name !== n.local.name) { | 
						|
        parts.push(" as ", path.call(print, "exported")); | 
						|
      } | 
						|
 | 
						|
      return concat$6(parts); | 
						|
 | 
						|
    case "ImportNamespaceSpecifier": | 
						|
      parts.push("* as "); | 
						|
      parts.push(path.call(print, "local")); | 
						|
      return concat$6(parts); | 
						|
 | 
						|
    case "ImportDefaultSpecifier": | 
						|
      return path.call(print, "local"); | 
						|
 | 
						|
    case "TSExportAssignment": | 
						|
      return concat$6(["export = ", path.call(print, "expression"), semi]); | 
						|
 | 
						|
    case "ExportDefaultDeclaration": | 
						|
    case "ExportNamedDeclaration": | 
						|
      return printExportDeclaration(path, options, print); | 
						|
 | 
						|
    case "ExportAllDeclaration": | 
						|
      parts.push("export "); | 
						|
 | 
						|
      if (n.exportKind === "type") { | 
						|
        parts.push("type "); | 
						|
      } | 
						|
 | 
						|
      parts.push("* from ", path.call(print, "source"), semi); | 
						|
      return concat$6(parts); | 
						|
 | 
						|
    case "ExportNamespaceSpecifier": | 
						|
    case "ExportDefaultSpecifier": | 
						|
      return path.call(print, "exported"); | 
						|
 | 
						|
    case "ImportDeclaration": | 
						|
      { | 
						|
        parts.push("import "); | 
						|
 | 
						|
        if (n.importKind && n.importKind !== "value") { | 
						|
          parts.push(n.importKind + " "); | 
						|
        } | 
						|
 | 
						|
        var standalones = []; | 
						|
        var grouped = []; | 
						|
 | 
						|
        if (n.specifiers && n.specifiers.length > 0) { | 
						|
          path.each(function (specifierPath) { | 
						|
            var value = specifierPath.getValue(); | 
						|
 | 
						|
            if (value.type === "ImportDefaultSpecifier" || value.type === "ImportNamespaceSpecifier") { | 
						|
              standalones.push(print(specifierPath)); | 
						|
            } else { | 
						|
              grouped.push(print(specifierPath)); | 
						|
            } | 
						|
          }, "specifiers"); | 
						|
 | 
						|
          if (standalones.length > 0) { | 
						|
            parts.push(join$4(", ", standalones)); | 
						|
          } | 
						|
 | 
						|
          if (standalones.length > 0 && grouped.length > 0) { | 
						|
            parts.push(", "); | 
						|
          } | 
						|
 | 
						|
          if (grouped.length === 1 && standalones.length === 0 && n.specifiers && !n.specifiers.some(function (node) { | 
						|
            return node.comments; | 
						|
          })) { | 
						|
            parts.push(concat$6(["{", options.bracketSpacing ? " " : "", concat$6(grouped), options.bracketSpacing ? " " : "", "}"])); | 
						|
          } else if (grouped.length >= 1) { | 
						|
            parts.push(group$2(concat$6(["{", indent$3(concat$6([options.bracketSpacing ? line$2 : softline$2, join$4(concat$6([",", line$2]), grouped)])), ifBreak$1(shouldPrintComma(options) ? "," : ""), options.bracketSpacing ? line$2 : softline$2, "}"]))); | 
						|
          } | 
						|
 | 
						|
          parts.push(" from "); | 
						|
        } else if (n.importKind && n.importKind === "type" || // import {} from 'x' | 
						|
        /{\s*}/.test(options.originalText.slice(options.locStart(n), options.locStart(n.source)))) { | 
						|
          parts.push("{} from "); | 
						|
        } | 
						|
 | 
						|
        parts.push(path.call(print, "source"), semi); | 
						|
        return concat$6(parts); | 
						|
      } | 
						|
 | 
						|
    case "Import": | 
						|
      return "import"; | 
						|
 | 
						|
    case "TSModuleBlock": | 
						|
    case "BlockStatement": | 
						|
      { | 
						|
        var naked = path.call(function (bodyPath) { | 
						|
          return printStatementSequence(bodyPath, options, print); | 
						|
        }, "body"); | 
						|
        var hasContent = n.body.find(function (node) { | 
						|
          return node.type !== "EmptyStatement"; | 
						|
        }); | 
						|
        var hasDirectives = n.directives && n.directives.length > 0; | 
						|
 | 
						|
        var _parent4 = path.getParentNode(); | 
						|
 | 
						|
        var _parentParent = path.getParentNode(1); | 
						|
 | 
						|
        if (!hasContent && !hasDirectives && !hasDanglingComments$1(n) && (_parent4.type === "ArrowFunctionExpression" || _parent4.type === "FunctionExpression" || _parent4.type === "FunctionDeclaration" || _parent4.type === "ObjectMethod" || _parent4.type === "ClassMethod" || _parent4.type === "ClassPrivateMethod" || _parent4.type === "ForStatement" || _parent4.type === "WhileStatement" || _parent4.type === "DoWhileStatement" || _parent4.type === "DoExpression" || _parent4.type === "CatchClause" && !_parentParent.finalizer || _parent4.type === "TSModuleDeclaration")) { | 
						|
          return "{}"; | 
						|
        } | 
						|
 | 
						|
        parts.push("{"); // Babel 6 | 
						|
 | 
						|
        if (hasDirectives) { | 
						|
          path.each(function (childPath) { | 
						|
            parts.push(indent$3(concat$6([hardline$4, print(childPath), semi]))); | 
						|
 | 
						|
            if (isNextLineEmpty$2(options.originalText, childPath.getValue(), options)) { | 
						|
              parts.push(hardline$4); | 
						|
            } | 
						|
          }, "directives"); | 
						|
        } | 
						|
 | 
						|
        if (hasContent) { | 
						|
          parts.push(indent$3(concat$6([hardline$4, naked]))); | 
						|
        } | 
						|
 | 
						|
        parts.push(comments.printDanglingComments(path, options)); | 
						|
        parts.push(hardline$4, "}"); | 
						|
        return concat$6(parts); | 
						|
      } | 
						|
 | 
						|
    case "ReturnStatement": | 
						|
      parts.push("return"); | 
						|
 | 
						|
      if (n.argument) { | 
						|
        if (returnArgumentHasLeadingComment$1(options, n.argument)) { | 
						|
          parts.push(concat$6([" (", indent$3(concat$6([hardline$4, path.call(print, "argument")])), hardline$4, ")"])); | 
						|
        } else if (n.argument.type === "LogicalExpression" || n.argument.type === "BinaryExpression" || n.argument.type === "SequenceExpression") { | 
						|
          parts.push(group$2(concat$6([ifBreak$1(" (", " "), indent$3(concat$6([softline$2, path.call(print, "argument")])), softline$2, ifBreak$1(")")]))); | 
						|
        } else { | 
						|
          parts.push(" ", path.call(print, "argument")); | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      if (hasDanglingComments$1(n)) { | 
						|
        parts.push(" ", comments.printDanglingComments(path, options, | 
						|
        /* sameIndent */ | 
						|
        true)); | 
						|
      } | 
						|
 | 
						|
      parts.push(semi); | 
						|
      return concat$6(parts); | 
						|
 | 
						|
    case "NewExpression": | 
						|
    case "OptionalCallExpression": | 
						|
    case "CallExpression": | 
						|
      { | 
						|
        var isNew = n.type === "NewExpression"; | 
						|
        var optional = printOptionalToken(path); | 
						|
 | 
						|
        if ( // We want to keep CommonJS- and AMD-style require calls, and AMD-style | 
						|
        // define calls, as a unit. | 
						|
        // e.g. `define(["some/lib", (lib) => {` | 
						|
        !isNew && n.callee.type === "Identifier" && (n.callee.name === "require" || n.callee.name === "define") || // Template literals as single arguments | 
						|
        n.arguments.length === 1 && isTemplateOnItsOwnLine$1(n.arguments[0], options.originalText, options) || // Keep test declarations on a single line | 
						|
        // e.g. `it('long name', () => {` | 
						|
        !isNew && isTestCall$1(n, path.getParentNode())) { | 
						|
          return concat$6([isNew ? "new " : "", path.call(print, "callee"), optional, printFunctionTypeParameters(path, options, print), concat$6(["(", join$4(", ", path.map(print, "arguments")), ")"])]); | 
						|
        } // Inline Flow annotation comments following Identifiers in Call nodes need to | 
						|
        // stay with the Identifier. For example: | 
						|
        // | 
						|
        // foo /*:: <SomeGeneric> */(bar); | 
						|
        // | 
						|
        // Here, we ensure that such comments stay between the Identifier and the Callee. | 
						|
 | 
						|
 | 
						|
        var isIdentifierWithFlowAnnotation = n.callee.type === "Identifier" && hasFlowAnnotationComment$1(n.callee.trailingComments); | 
						|
 | 
						|
        if (isIdentifierWithFlowAnnotation) { | 
						|
          n.callee.trailingComments[0].printed = true; | 
						|
        } // We detect calls on member lookups and possibly print them in a | 
						|
        // special chain format. See `printMemberChain` for more info. | 
						|
 | 
						|
 | 
						|
        if (!isNew && isMemberish$1(n.callee)) { | 
						|
          return printMemberChain(path, options, print); | 
						|
        } | 
						|
 | 
						|
        var contents = concat$6([isNew ? "new " : "", path.call(print, "callee"), optional, isIdentifierWithFlowAnnotation ? `/*:: ${n.callee.trailingComments[0].value.substring(2).trim()} */` : "", printFunctionTypeParameters(path, options, print), printArgumentsList(path, options, print)]); // We group here when the callee is itself a call expression. | 
						|
        // See `isLongCurriedCallExpression` for more info. | 
						|
 | 
						|
        if (isCallOrOptionalCallExpression$1(n.callee)) { | 
						|
          return group$2(contents); | 
						|
        } | 
						|
 | 
						|
        return contents; | 
						|
      } | 
						|
 | 
						|
    case "TSInterfaceDeclaration": | 
						|
      if (n.declare) { | 
						|
        parts.push("declare "); | 
						|
      } | 
						|
 | 
						|
      parts.push(n.abstract ? "abstract " : "", printTypeScriptModifiers(path, options, print), "interface ", path.call(print, "id"), n.typeParameters ? path.call(print, "typeParameters") : "", " "); | 
						|
 | 
						|
      if (n.extends && n.extends.length) { | 
						|
        parts.push(group$2(indent$3(concat$6([softline$2, "extends ", (n.extends.length === 1 ? identity$1 : indent$3)(join$4(concat$6([",", line$2]), path.map(print, "extends"))), " "])))); | 
						|
      } | 
						|
 | 
						|
      parts.push(path.call(print, "body")); | 
						|
      return concat$6(parts); | 
						|
 | 
						|
    case "ObjectTypeInternalSlot": | 
						|
      return concat$6([n.static ? "static " : "", "[[", path.call(print, "id"), "]]", printOptionalToken(path), n.method ? "" : ": ", path.call(print, "value")]); | 
						|
 | 
						|
    case "ObjectExpression": | 
						|
    case "ObjectPattern": | 
						|
    case "ObjectTypeAnnotation": | 
						|
    case "TSInterfaceBody": | 
						|
    case "TSTypeLiteral": | 
						|
      { | 
						|
        var propertiesField; | 
						|
 | 
						|
        if (n.type === "TSTypeLiteral") { | 
						|
          propertiesField = "members"; | 
						|
        } else if (n.type === "TSInterfaceBody") { | 
						|
          propertiesField = "body"; | 
						|
        } else { | 
						|
          propertiesField = "properties"; | 
						|
        } | 
						|
 | 
						|
        var isTypeAnnotation = n.type === "ObjectTypeAnnotation"; | 
						|
        var fields = []; | 
						|
 | 
						|
        if (isTypeAnnotation) { | 
						|
          fields.push("indexers", "callProperties", "internalSlots"); | 
						|
        } | 
						|
 | 
						|
        fields.push(propertiesField); | 
						|
        var firstProperty = fields.map(function (field) { | 
						|
          return n[field][0]; | 
						|
        }).sort(function (a, b) { | 
						|
          return options.locStart(a) - options.locStart(b); | 
						|
        })[0]; | 
						|
 | 
						|
        var _parent5 = path.getParentNode(0); | 
						|
 | 
						|
        var isFlowInterfaceLikeBody = isTypeAnnotation && _parent5 && (_parent5.type === "InterfaceDeclaration" || _parent5.type === "DeclareInterface" || _parent5.type === "DeclareClass") && path.getName() === "body"; | 
						|
        var shouldBreak = n.type === "TSInterfaceBody" || isFlowInterfaceLikeBody || n.type === "ObjectPattern" && _parent5.type !== "FunctionDeclaration" && _parent5.type !== "FunctionExpression" && _parent5.type !== "ArrowFunctionExpression" && _parent5.type !== "ObjectMethod" && _parent5.type !== "ClassMethod" && _parent5.type !== "ClassPrivateMethod" && _parent5.type !== "AssignmentPattern" && _parent5.type !== "CatchClause" && n.properties.some(function (property) { | 
						|
          return property.value && (property.value.type === "ObjectPattern" || property.value.type === "ArrayPattern"); | 
						|
        }) || n.type !== "ObjectPattern" && firstProperty && hasNewlineInRange$2(options.originalText, options.locStart(n), options.locStart(firstProperty)); | 
						|
        var separator = isFlowInterfaceLikeBody ? ";" : n.type === "TSInterfaceBody" || n.type === "TSTypeLiteral" ? ifBreak$1(semi, ";") : ","; | 
						|
        var leftBrace = n.exact ? "{|" : "{"; | 
						|
        var rightBrace = n.exact ? "|}" : "}"; // Unfortunately, things are grouped together in the ast can be | 
						|
        // interleaved in the source code. So we need to reorder them before | 
						|
        // printing them. | 
						|
 | 
						|
        var propsAndLoc = []; | 
						|
        fields.forEach(function (field) { | 
						|
          path.each(function (childPath) { | 
						|
            var node = childPath.getValue(); | 
						|
            propsAndLoc.push({ | 
						|
              node: node, | 
						|
              printed: print(childPath), | 
						|
              loc: options.locStart(node) | 
						|
            }); | 
						|
          }, field); | 
						|
        }); | 
						|
        var separatorParts = []; | 
						|
        var props = propsAndLoc.sort(function (a, b) { | 
						|
          return a.loc - b.loc; | 
						|
        }).map(function (prop) { | 
						|
          var result = concat$6(separatorParts.concat(group$2(prop.printed))); | 
						|
          separatorParts = [separator, line$2]; | 
						|
 | 
						|
          if ((prop.node.type === "TSPropertySignature" || prop.node.type === "TSMethodSignature" || prop.node.type === "TSConstructSignatureDeclaration") && hasNodeIgnoreComment$2(prop.node)) { | 
						|
            separatorParts.shift(); | 
						|
          } | 
						|
 | 
						|
          if (isNextLineEmpty$2(options.originalText, prop.node, options)) { | 
						|
            separatorParts.push(hardline$4); | 
						|
          } | 
						|
 | 
						|
          return result; | 
						|
        }); | 
						|
 | 
						|
        if (n.inexact) { | 
						|
          props.push(concat$6(separatorParts.concat(group$2("...")))); | 
						|
        } | 
						|
 | 
						|
        var lastElem = getLast$2(n[propertiesField]); | 
						|
        var canHaveTrailingSeparator = !(lastElem && (lastElem.type === "RestProperty" || lastElem.type === "RestElement" || hasNodeIgnoreComment$2(lastElem) || n.inexact)); | 
						|
        var content; | 
						|
 | 
						|
        if (props.length === 0) { | 
						|
          if (!hasDanglingComments$1(n)) { | 
						|
            return concat$6([leftBrace, rightBrace, printTypeAnnotation(path, options, print)]); | 
						|
          } | 
						|
 | 
						|
          content = group$2(concat$6([leftBrace, comments.printDanglingComments(path, options), softline$2, rightBrace, printOptionalToken(path), printTypeAnnotation(path, options, print)])); | 
						|
        } else { | 
						|
          content = concat$6([leftBrace, indent$3(concat$6([options.bracketSpacing ? line$2 : softline$2, concat$6(props)])), ifBreak$1(canHaveTrailingSeparator && (separator !== "," || shouldPrintComma(options)) ? separator : ""), concat$6([options.bracketSpacing ? line$2 : softline$2, rightBrace]), printOptionalToken(path), printTypeAnnotation(path, options, print)]); | 
						|
        } // If we inline the object as first argument of the parent, we don't want | 
						|
        // to create another group so that the object breaks before the return | 
						|
        // type | 
						|
 | 
						|
 | 
						|
        var parentParentParent = path.getParentNode(2); | 
						|
 | 
						|
        if (n.type === "ObjectPattern" && _parent5 && shouldHugArguments(_parent5) && !n.decorators && _parent5.params[0] === n || shouldHugType(n) && parentParentParent && shouldHugArguments(parentParentParent) && parentParentParent.params[0].typeAnnotation && parentParentParent.params[0].typeAnnotation.typeAnnotation === n) { | 
						|
          return content; | 
						|
        } | 
						|
 | 
						|
        return group$2(content, { | 
						|
          shouldBreak | 
						|
        }); | 
						|
      } | 
						|
    // Babel 6 | 
						|
 | 
						|
    case "ObjectProperty": // Non-standard AST node type. | 
						|
 | 
						|
    case "Property": | 
						|
      if (n.method || n.kind === "get" || n.kind === "set") { | 
						|
        return printMethod(path, options, print); | 
						|
      } | 
						|
 | 
						|
      if (n.shorthand) { | 
						|
        parts.push(path.call(print, "value")); | 
						|
      } else { | 
						|
        parts.push(printAssignment(n.key, printPropertyKey(path, options, print), ":", n.value, path.call(print, "value"), options)); | 
						|
      } | 
						|
 | 
						|
      return concat$6(parts); | 
						|
    // Babel 6 | 
						|
 | 
						|
    case "ClassMethod": | 
						|
    case "ClassPrivateMethod": | 
						|
    case "MethodDefinition": | 
						|
    case "TSAbstractMethodDefinition": | 
						|
      if (n.decorators && n.decorators.length !== 0) { | 
						|
        parts.push(printDecorators(path, options, print)); | 
						|
      } | 
						|
 | 
						|
      if (n.accessibility) { | 
						|
        parts.push(n.accessibility + " "); | 
						|
      } | 
						|
 | 
						|
      if (n.static) { | 
						|
        parts.push("static "); | 
						|
      } | 
						|
 | 
						|
      if (n.type === "TSAbstractMethodDefinition") { | 
						|
        parts.push("abstract "); | 
						|
      } | 
						|
 | 
						|
      parts.push(printMethod(path, options, print)); | 
						|
      return concat$6(parts); | 
						|
 | 
						|
    case "ObjectMethod": | 
						|
      return printMethod(path, options, print); | 
						|
 | 
						|
    case "Decorator": | 
						|
      return concat$6(["@", path.call(print, "expression"), path.call(print, "callee")]); | 
						|
 | 
						|
    case "ArrayExpression": | 
						|
    case "ArrayPattern": | 
						|
      if (n.elements.length === 0) { | 
						|
        if (!hasDanglingComments$1(n)) { | 
						|
          parts.push("[]"); | 
						|
        } else { | 
						|
          parts.push(group$2(concat$6(["[", comments.printDanglingComments(path, options), softline$2, "]"]))); | 
						|
        } | 
						|
      } else { | 
						|
        var _lastElem = getLast$2(n.elements); | 
						|
 | 
						|
        var canHaveTrailingComma = !(_lastElem && _lastElem.type === "RestElement"); // JavaScript allows you to have empty elements in an array which | 
						|
        // changes its length based on the number of commas. The algorithm | 
						|
        // is that if the last argument is null, we need to force insert | 
						|
        // a comma to ensure JavaScript recognizes it. | 
						|
        //   [,].length === 1 | 
						|
        //   [1,].length === 1 | 
						|
        //   [1,,].length === 2 | 
						|
        // | 
						|
        // Note that getLast returns null if the array is empty, but | 
						|
        // we already check for an empty array just above so we are safe | 
						|
 | 
						|
        var needsForcedTrailingComma = canHaveTrailingComma && _lastElem === null; | 
						|
 | 
						|
        var _shouldBreak = n.elements.length > 1 && n.elements.every(function (element, i, elements) { | 
						|
          var elementType = element && element.type; | 
						|
 | 
						|
          if (elementType !== "ArrayExpression" && elementType !== "ObjectExpression") { | 
						|
            return false; | 
						|
          } | 
						|
 | 
						|
          var nextElement = elements[i + 1]; | 
						|
 | 
						|
          if (nextElement && elementType !== nextElement.type) { | 
						|
            return false; | 
						|
          } | 
						|
 | 
						|
          var itemsKey = elementType === "ArrayExpression" ? "elements" : "properties"; | 
						|
          return element[itemsKey] && element[itemsKey].length > 1; | 
						|
        }); | 
						|
 | 
						|
        parts.push(group$2(concat$6(["[", indent$3(concat$6([softline$2, printArrayItems(path, options, "elements", print)])), needsForcedTrailingComma ? "," : "", ifBreak$1(canHaveTrailingComma && !needsForcedTrailingComma && shouldPrintComma(options) ? "," : ""), comments.printDanglingComments(path, options, | 
						|
        /* sameIndent */ | 
						|
        true), softline$2, "]"]), { | 
						|
          shouldBreak: _shouldBreak | 
						|
        })); | 
						|
      } | 
						|
 | 
						|
      parts.push(printOptionalToken(path), printTypeAnnotation(path, options, print)); | 
						|
      return concat$6(parts); | 
						|
 | 
						|
    case "SequenceExpression": | 
						|
      { | 
						|
        var _parent6 = path.getParentNode(0); | 
						|
 | 
						|
        if (_parent6.type === "ExpressionStatement" || _parent6.type === "ForStatement") { | 
						|
          // For ExpressionStatements and for-loop heads, which are among | 
						|
          // the few places a SequenceExpression appears unparenthesized, we want | 
						|
          // to indent expressions after the first. | 
						|
          var _parts2 = []; | 
						|
          path.each(function (p) { | 
						|
            if (p.getName() === 0) { | 
						|
              _parts2.push(print(p)); | 
						|
            } else { | 
						|
              _parts2.push(",", indent$3(concat$6([line$2, print(p)]))); | 
						|
            } | 
						|
          }, "expressions"); | 
						|
          return group$2(concat$6(_parts2)); | 
						|
        } | 
						|
 | 
						|
        return group$2(concat$6([join$4(concat$6([",", line$2]), path.map(print, "expressions"))])); | 
						|
      } | 
						|
 | 
						|
    case "ThisExpression": | 
						|
      return "this"; | 
						|
 | 
						|
    case "Super": | 
						|
      return "super"; | 
						|
 | 
						|
    case "NullLiteral": | 
						|
      // Babel 6 Literal split | 
						|
      return "null"; | 
						|
 | 
						|
    case "RegExpLiteral": | 
						|
      // Babel 6 Literal split | 
						|
      return printRegex(n); | 
						|
 | 
						|
    case "NumericLiteral": | 
						|
      // Babel 6 Literal split | 
						|
      return printNumber$1(n.extra.raw); | 
						|
 | 
						|
    case "BigIntLiteral": | 
						|
      // babel: n.extra.raw, typescript: n.raw, flow: n.bigint | 
						|
      return (n.bigint || (n.extra ? n.extra.raw : n.raw)).toLowerCase(); | 
						|
 | 
						|
    case "BooleanLiteral": // Babel 6 Literal split | 
						|
 | 
						|
    case "StringLiteral": // Babel 6 Literal split | 
						|
 | 
						|
    case "Literal": | 
						|
      { | 
						|
        if (n.regex) { | 
						|
          return printRegex(n.regex); | 
						|
        } | 
						|
 | 
						|
        if (typeof n.value === "number") { | 
						|
          return printNumber$1(n.raw); | 
						|
        } | 
						|
 | 
						|
        if (typeof n.value !== "string") { | 
						|
          return "" + n.value; | 
						|
        } // TypeScript workaround for https://github.com/JamesHenry/typescript-estree/issues/2 | 
						|
        // See corresponding workaround in needs-parens.js | 
						|
 | 
						|
 | 
						|
        var grandParent = path.getParentNode(1); | 
						|
        var isTypeScriptDirective = options.parser === "typescript" && typeof n.value === "string" && grandParent && (grandParent.type === "Program" || grandParent.type === "BlockStatement"); | 
						|
        return nodeStr(n, options, isTypeScriptDirective); | 
						|
      } | 
						|
 | 
						|
    case "Directive": | 
						|
      return path.call(print, "value"); | 
						|
    // Babel 6 | 
						|
 | 
						|
    case "DirectiveLiteral": | 
						|
      return nodeStr(n, options); | 
						|
 | 
						|
    case "UnaryExpression": | 
						|
      parts.push(n.operator); | 
						|
 | 
						|
      if (/[a-z]$/.test(n.operator)) { | 
						|
        parts.push(" "); | 
						|
      } | 
						|
 | 
						|
      if (n.argument.comments && n.argument.comments.length > 0) { | 
						|
        parts.push(group$2(concat$6(["(", indent$3(concat$6([softline$2, path.call(print, "argument")])), softline$2, ")"]))); | 
						|
      } else { | 
						|
        parts.push(path.call(print, "argument")); | 
						|
      } | 
						|
 | 
						|
      return concat$6(parts); | 
						|
 | 
						|
    case "UpdateExpression": | 
						|
      parts.push(path.call(print, "argument"), n.operator); | 
						|
 | 
						|
      if (n.prefix) { | 
						|
        parts.reverse(); | 
						|
      } | 
						|
 | 
						|
      return concat$6(parts); | 
						|
 | 
						|
    case "ConditionalExpression": | 
						|
      return printTernaryOperator(path, options, print, { | 
						|
        beforeParts: function beforeParts() { | 
						|
          return [path.call(print, "test")]; | 
						|
        }, | 
						|
        afterParts: function afterParts(breakClosingParen) { | 
						|
          return [breakClosingParen ? softline$2 : ""]; | 
						|
        }, | 
						|
        shouldCheckJsx: true, | 
						|
        conditionalNodeType: "ConditionalExpression", | 
						|
        consequentNodePropertyName: "consequent", | 
						|
        alternateNodePropertyName: "alternate", | 
						|
        testNodePropertyName: "test", | 
						|
        breakNested: true | 
						|
      }); | 
						|
 | 
						|
    case "VariableDeclaration": | 
						|
      { | 
						|
        var printed = path.map(function (childPath) { | 
						|
          return print(childPath); | 
						|
        }, "declarations"); // We generally want to terminate all variable declarations with a | 
						|
        // semicolon, except when they in the () part of for loops. | 
						|
 | 
						|
        var parentNode = path.getParentNode(); | 
						|
        var isParentForLoop = parentNode.type === "ForStatement" || parentNode.type === "ForInStatement" || parentNode.type === "ForOfStatement" || parentNode.type === "ForAwaitStatement"; | 
						|
        var hasValue = n.declarations.some(function (decl) { | 
						|
          return decl.init; | 
						|
        }); | 
						|
        var firstVariable; | 
						|
 | 
						|
        if (printed.length === 1 && !n.declarations[0].comments) { | 
						|
          firstVariable = printed[0]; | 
						|
        } else if (printed.length > 0) { | 
						|
          // Indent first var to comply with eslint one-var rule | 
						|
          firstVariable = indent$3(printed[0]); | 
						|
        } | 
						|
 | 
						|
        parts = [n.declare ? "declare " : "", n.kind, firstVariable ? concat$6([" ", firstVariable]) : "", indent$3(concat$6(printed.slice(1).map(function (p) { | 
						|
          return concat$6([",", hasValue && !isParentForLoop ? hardline$4 : line$2, p]); | 
						|
        })))]; | 
						|
 | 
						|
        if (!(isParentForLoop && parentNode.body !== n)) { | 
						|
          parts.push(semi); | 
						|
        } | 
						|
 | 
						|
        return group$2(concat$6(parts)); | 
						|
      } | 
						|
 | 
						|
    case "TSTypeAliasDeclaration": | 
						|
      { | 
						|
        if (n.declare) { | 
						|
          parts.push("declare "); | 
						|
        } | 
						|
 | 
						|
        var _printed = printAssignmentRight(n.id, n.typeAnnotation, n.typeAnnotation && path.call(print, "typeAnnotation"), options); | 
						|
 | 
						|
        parts.push("type ", path.call(print, "id"), path.call(print, "typeParameters"), " =", _printed, semi); | 
						|
        return group$2(concat$6(parts)); | 
						|
      } | 
						|
 | 
						|
    case "VariableDeclarator": | 
						|
      return printAssignment(n.id, path.call(print, "id"), " =", n.init, n.init && path.call(print, "init"), options); | 
						|
 | 
						|
    case "WithStatement": | 
						|
      return group$2(concat$6(["with (", path.call(print, "object"), ")", adjustClause(n.body, path.call(print, "body"))])); | 
						|
 | 
						|
    case "IfStatement": | 
						|
      { | 
						|
        var con = adjustClause(n.consequent, path.call(print, "consequent")); | 
						|
        var opening = group$2(concat$6(["if (", group$2(concat$6([indent$3(concat$6([softline$2, path.call(print, "test")])), softline$2])), ")", con])); | 
						|
        parts.push(opening); | 
						|
 | 
						|
        if (n.alternate) { | 
						|
          var commentOnOwnLine = hasTrailingComment$1(n.consequent) && n.consequent.comments.some(function (comment) { | 
						|
            return comment.trailing && !comments$1.isBlockComment(comment); | 
						|
          }) || needsHardlineAfterDanglingComment$1(n); | 
						|
          var elseOnSameLine = n.consequent.type === "BlockStatement" && !commentOnOwnLine; | 
						|
          parts.push(elseOnSameLine ? " " : hardline$4); | 
						|
 | 
						|
          if (hasDanglingComments$1(n)) { | 
						|
            parts.push(comments.printDanglingComments(path, options, true), commentOnOwnLine ? hardline$4 : " "); | 
						|
          } | 
						|
 | 
						|
          parts.push("else", group$2(adjustClause(n.alternate, path.call(print, "alternate"), n.alternate.type === "IfStatement"))); | 
						|
        } | 
						|
 | 
						|
        return concat$6(parts); | 
						|
      } | 
						|
 | 
						|
    case "ForStatement": | 
						|
      { | 
						|
        var _body = adjustClause(n.body, path.call(print, "body")); // We want to keep dangling comments above the loop to stay consistent. | 
						|
        // Any comment positioned between the for statement and the parentheses | 
						|
        // is going to be printed before the statement. | 
						|
 | 
						|
 | 
						|
        var _dangling = comments.printDanglingComments(path, options, | 
						|
        /* sameLine */ | 
						|
        true); | 
						|
 | 
						|
        var printedComments = _dangling ? concat$6([_dangling, softline$2]) : ""; | 
						|
 | 
						|
        if (!n.init && !n.test && !n.update) { | 
						|
          return concat$6([printedComments, group$2(concat$6(["for (;;)", _body]))]); | 
						|
        } | 
						|
 | 
						|
        return concat$6([printedComments, group$2(concat$6(["for (", group$2(concat$6([indent$3(concat$6([softline$2, path.call(print, "init"), ";", line$2, path.call(print, "test"), ";", line$2, path.call(print, "update")])), softline$2])), ")", _body]))]); | 
						|
      } | 
						|
 | 
						|
    case "WhileStatement": | 
						|
      return group$2(concat$6(["while (", group$2(concat$6([indent$3(concat$6([softline$2, path.call(print, "test")])), softline$2])), ")", adjustClause(n.body, path.call(print, "body"))])); | 
						|
 | 
						|
    case "ForInStatement": | 
						|
      // Note: esprima can't actually parse "for each (". | 
						|
      return group$2(concat$6([n.each ? "for each (" : "for (", path.call(print, "left"), " in ", path.call(print, "right"), ")", adjustClause(n.body, path.call(print, "body"))])); | 
						|
 | 
						|
    case "ForOfStatement": | 
						|
    case "ForAwaitStatement": | 
						|
      { | 
						|
        // Babel 7 removed ForAwaitStatement in favor of ForOfStatement | 
						|
        // with `"await": true`: | 
						|
        // https://github.com/estree/estree/pull/138 | 
						|
        var isAwait = n.type === "ForAwaitStatement" || n.await; | 
						|
        return group$2(concat$6(["for", isAwait ? " await" : "", " (", path.call(print, "left"), " of ", path.call(print, "right"), ")", adjustClause(n.body, path.call(print, "body"))])); | 
						|
      } | 
						|
 | 
						|
    case "DoWhileStatement": | 
						|
      { | 
						|
        var clause = adjustClause(n.body, path.call(print, "body")); | 
						|
        var doBody = group$2(concat$6(["do", clause])); | 
						|
        parts = [doBody]; | 
						|
 | 
						|
        if (n.body.type === "BlockStatement") { | 
						|
          parts.push(" "); | 
						|
        } else { | 
						|
          parts.push(hardline$4); | 
						|
        } | 
						|
 | 
						|
        parts.push("while ("); | 
						|
        parts.push(group$2(concat$6([indent$3(concat$6([softline$2, path.call(print, "test")])), softline$2])), ")", semi); | 
						|
        return concat$6(parts); | 
						|
      } | 
						|
 | 
						|
    case "DoExpression": | 
						|
      return concat$6(["do ", path.call(print, "body")]); | 
						|
 | 
						|
    case "BreakStatement": | 
						|
      parts.push("break"); | 
						|
 | 
						|
      if (n.label) { | 
						|
        parts.push(" ", path.call(print, "label")); | 
						|
      } | 
						|
 | 
						|
      parts.push(semi); | 
						|
      return concat$6(parts); | 
						|
 | 
						|
    case "ContinueStatement": | 
						|
      parts.push("continue"); | 
						|
 | 
						|
      if (n.label) { | 
						|
        parts.push(" ", path.call(print, "label")); | 
						|
      } | 
						|
 | 
						|
      parts.push(semi); | 
						|
      return concat$6(parts); | 
						|
 | 
						|
    case "LabeledStatement": | 
						|
      if (n.body.type === "EmptyStatement") { | 
						|
        return concat$6([path.call(print, "label"), ":;"]); | 
						|
      } | 
						|
 | 
						|
      return concat$6([path.call(print, "label"), ": ", path.call(print, "body")]); | 
						|
 | 
						|
    case "TryStatement": | 
						|
      return concat$6(["try ", path.call(print, "block"), n.handler ? concat$6([" ", path.call(print, "handler")]) : "", n.finalizer ? concat$6([" finally ", path.call(print, "finalizer")]) : ""]); | 
						|
 | 
						|
    case "CatchClause": | 
						|
      if (n.param) { | 
						|
        var hasComments = n.param.comments && n.param.comments.some(function (comment) { | 
						|
          return !comments$1.isBlockComment(comment) || comment.leading && hasNewline$3(options.originalText, options.locEnd(comment)) || comment.trailing && hasNewline$3(options.originalText, options.locStart(comment), { | 
						|
            backwards: true | 
						|
          }); | 
						|
        }); | 
						|
        var param = path.call(print, "param"); | 
						|
        return concat$6(["catch ", hasComments ? concat$6(["(", indent$3(concat$6([softline$2, param])), softline$2, ") "]) : concat$6(["(", param, ") "]), path.call(print, "body")]); | 
						|
      } | 
						|
 | 
						|
      return concat$6(["catch ", path.call(print, "body")]); | 
						|
 | 
						|
    case "ThrowStatement": | 
						|
      return concat$6(["throw ", path.call(print, "argument"), semi]); | 
						|
    // Note: ignoring n.lexical because it has no printing consequences. | 
						|
 | 
						|
    case "SwitchStatement": | 
						|
      return concat$6([group$2(concat$6(["switch (", indent$3(concat$6([softline$2, path.call(print, "discriminant")])), softline$2, ")"])), " {", n.cases.length > 0 ? indent$3(concat$6([hardline$4, join$4(hardline$4, path.map(function (casePath) { | 
						|
        var caseNode = casePath.getValue(); | 
						|
        return concat$6([casePath.call(print), n.cases.indexOf(caseNode) !== n.cases.length - 1 && isNextLineEmpty$2(options.originalText, caseNode, options) ? hardline$4 : ""]); | 
						|
      }, "cases"))])) : "", hardline$4, "}"]); | 
						|
 | 
						|
    case "SwitchCase": | 
						|
      { | 
						|
        if (n.test) { | 
						|
          parts.push("case ", path.call(print, "test"), ":"); | 
						|
        } else { | 
						|
          parts.push("default:"); | 
						|
        } | 
						|
 | 
						|
        var consequent = n.consequent.filter(function (node) { | 
						|
          return node.type !== "EmptyStatement"; | 
						|
        }); | 
						|
 | 
						|
        if (consequent.length > 0) { | 
						|
          var cons = path.call(function (consequentPath) { | 
						|
            return printStatementSequence(consequentPath, options, print); | 
						|
          }, "consequent"); | 
						|
          parts.push(consequent.length === 1 && consequent[0].type === "BlockStatement" ? concat$6([" ", cons]) : indent$3(concat$6([hardline$4, cons]))); | 
						|
        } | 
						|
 | 
						|
        return concat$6(parts); | 
						|
      } | 
						|
    // JSX extensions below. | 
						|
 | 
						|
    case "DebuggerStatement": | 
						|
      return concat$6(["debugger", semi]); | 
						|
 | 
						|
    case "JSXAttribute": | 
						|
      parts.push(path.call(print, "name")); | 
						|
 | 
						|
      if (n.value) { | 
						|
        var res; | 
						|
 | 
						|
        if (isStringLiteral$1(n.value)) { | 
						|
          var raw = rawText$1(n.value); // Unescape all quotes so we get an accurate preferred quote | 
						|
 | 
						|
          var final = raw.replace(/'/g, "'").replace(/"/g, '"'); | 
						|
          var quote = getPreferredQuote$1(final, options.jsxSingleQuote ? "'" : '"'); | 
						|
 | 
						|
          var _escape = quote === "'" ? "'" : """; | 
						|
 | 
						|
          final = final.slice(1, -1).replace(new RegExp(quote, "g"), _escape); | 
						|
          res = concat$6([quote, final, quote]); | 
						|
        } else { | 
						|
          res = path.call(print, "value"); | 
						|
        } | 
						|
 | 
						|
        parts.push("=", res); | 
						|
      } | 
						|
 | 
						|
      return concat$6(parts); | 
						|
 | 
						|
    case "JSXIdentifier": | 
						|
      return "" + n.name; | 
						|
 | 
						|
    case "JSXNamespacedName": | 
						|
      return join$4(":", [path.call(print, "namespace"), path.call(print, "name")]); | 
						|
 | 
						|
    case "JSXMemberExpression": | 
						|
      return join$4(".", [path.call(print, "object"), path.call(print, "property")]); | 
						|
 | 
						|
    case "TSQualifiedName": | 
						|
      return join$4(".", [path.call(print, "left"), path.call(print, "right")]); | 
						|
 | 
						|
    case "JSXSpreadAttribute": | 
						|
    case "JSXSpreadChild": | 
						|
      { | 
						|
        return concat$6(["{", path.call(function (p) { | 
						|
          var printed = concat$6(["...", print(p)]); | 
						|
          var n = p.getValue(); | 
						|
 | 
						|
          if (!n.comments || !n.comments.length) { | 
						|
            return printed; | 
						|
          } | 
						|
 | 
						|
          return concat$6([indent$3(concat$6([softline$2, comments.printComments(p, function () { | 
						|
            return printed; | 
						|
          }, options)])), softline$2]); | 
						|
        }, n.type === "JSXSpreadAttribute" ? "argument" : "expression"), "}"]); | 
						|
      } | 
						|
 | 
						|
    case "JSXExpressionContainer": | 
						|
      { | 
						|
        var _parent7 = path.getParentNode(0); | 
						|
 | 
						|
        var preventInline = _parent7.type === "JSXAttribute" && n.expression.comments && n.expression.comments.length > 0; | 
						|
 | 
						|
        var _shouldInline = !preventInline && (n.expression.type === "ArrayExpression" || n.expression.type === "ObjectExpression" || n.expression.type === "ArrowFunctionExpression" || n.expression.type === "CallExpression" || n.expression.type === "OptionalCallExpression" || n.expression.type === "FunctionExpression" || n.expression.type === "JSXEmptyExpression" || n.expression.type === "TemplateLiteral" || n.expression.type === "TaggedTemplateExpression" || n.expression.type === "DoExpression" || isJSXNode$1(_parent7) && (n.expression.type === "ConditionalExpression" || isBinaryish$1(n.expression))); | 
						|
 | 
						|
        if (_shouldInline) { | 
						|
          return group$2(concat$6(["{", path.call(print, "expression"), lineSuffixBoundary$1, "}"])); | 
						|
        } | 
						|
 | 
						|
        return group$2(concat$6(["{", indent$3(concat$6([softline$2, path.call(print, "expression")])), softline$2, lineSuffixBoundary$1, "}"])); | 
						|
      } | 
						|
 | 
						|
    case "JSXFragment": | 
						|
    case "JSXElement": | 
						|
      { | 
						|
        var elem = comments.printComments(path, function () { | 
						|
          return printJSXElement(path, options, print); | 
						|
        }, options); | 
						|
        return maybeWrapJSXElementInParens(path, elem, options); | 
						|
      } | 
						|
 | 
						|
    case "JSXOpeningElement": | 
						|
      { | 
						|
        var _n = path.getValue(); | 
						|
 | 
						|
        var nameHasComments = _n.name && _n.name.comments && _n.name.comments.length > 0 || _n.typeParameters && _n.typeParameters.comments && _n.typeParameters.comments.length > 0; // Don't break self-closing elements with no attributes and no comments | 
						|
 | 
						|
        if (_n.selfClosing && !_n.attributes.length && !nameHasComments) { | 
						|
          return concat$6(["<", path.call(print, "name"), path.call(print, "typeParameters"), " />"]); | 
						|
        } // don't break up opening elements with a single long text attribute | 
						|
 | 
						|
 | 
						|
        if (_n.attributes && _n.attributes.length === 1 && _n.attributes[0].value && isStringLiteral$1(_n.attributes[0].value) && !_n.attributes[0].value.value.includes("\n") && // We should break for the following cases: | 
						|
        // <div | 
						|
        //   // comment | 
						|
        //   attr="value" | 
						|
        // > | 
						|
        // <div | 
						|
        //   attr="value" | 
						|
        //   // comment | 
						|
        // > | 
						|
        !nameHasComments && (!_n.attributes[0].comments || !_n.attributes[0].comments.length)) { | 
						|
          return group$2(concat$6(["<", path.call(print, "name"), path.call(print, "typeParameters"), " ", concat$6(path.map(print, "attributes")), _n.selfClosing ? " />" : ">"])); | 
						|
        } | 
						|
 | 
						|
        var lastAttrHasTrailingComments = _n.attributes.length && hasTrailingComment$1(getLast$2(_n.attributes)); | 
						|
        var bracketSameLine = // Simple tags (no attributes and no comment in tag name) should be | 
						|
        // kept unbroken regardless of `jsxBracketSameLine` | 
						|
        !_n.attributes.length && !nameHasComments || options.jsxBracketSameLine && ( // We should print the bracket in a new line for the following cases: | 
						|
        // <div | 
						|
        //   // comment | 
						|
        // > | 
						|
        // <div | 
						|
        //   attr // comment | 
						|
        // > | 
						|
        !nameHasComments || _n.attributes.length) && !lastAttrHasTrailingComments; // We should print the opening element expanded if any prop value is a | 
						|
        // string literal with newlines | 
						|
 | 
						|
        var _shouldBreak2 = _n.attributes && _n.attributes.some(function (attr) { | 
						|
          return attr.value && isStringLiteral$1(attr.value) && attr.value.value.includes("\n"); | 
						|
        }); | 
						|
 | 
						|
        return group$2(concat$6(["<", path.call(print, "name"), path.call(print, "typeParameters"), concat$6([indent$3(concat$6(path.map(function (attr) { | 
						|
          return concat$6([line$2, print(attr)]); | 
						|
        }, "attributes"))), _n.selfClosing ? line$2 : bracketSameLine ? ">" : softline$2]), _n.selfClosing ? "/>" : bracketSameLine ? "" : ">"]), { | 
						|
          shouldBreak: _shouldBreak2 | 
						|
        }); | 
						|
      } | 
						|
 | 
						|
    case "JSXClosingElement": | 
						|
      return concat$6(["</", path.call(print, "name"), ">"]); | 
						|
 | 
						|
    case "JSXOpeningFragment": | 
						|
    case "JSXClosingFragment": | 
						|
      { | 
						|
        var hasComment = n.comments && n.comments.length; | 
						|
        var hasOwnLineComment = hasComment && !n.comments.every(comments$1.isBlockComment); | 
						|
        var isOpeningFragment = n.type === "JSXOpeningFragment"; | 
						|
        return concat$6([isOpeningFragment ? "<" : "</", indent$3(concat$6([hasOwnLineComment ? hardline$4 : hasComment && !isOpeningFragment ? " " : "", comments.printDanglingComments(path, options, true)])), hasOwnLineComment ? hardline$4 : "", ">"]); | 
						|
      } | 
						|
 | 
						|
    case "JSXText": | 
						|
      /* istanbul ignore next */ | 
						|
      throw new Error("JSXTest should be handled by JSXElement"); | 
						|
 | 
						|
    case "JSXEmptyExpression": | 
						|
      { | 
						|
        var requiresHardline = n.comments && !n.comments.every(comments$1.isBlockComment); | 
						|
        return concat$6([comments.printDanglingComments(path, options, | 
						|
        /* sameIndent */ | 
						|
        !requiresHardline), requiresHardline ? hardline$4 : ""]); | 
						|
      } | 
						|
 | 
						|
    case "ClassBody": | 
						|
      if (!n.comments && n.body.length === 0) { | 
						|
        return "{}"; | 
						|
      } | 
						|
 | 
						|
      return concat$6(["{", n.body.length > 0 ? indent$3(concat$6([hardline$4, path.call(function (bodyPath) { | 
						|
        return printStatementSequence(bodyPath, options, print); | 
						|
      }, "body")])) : comments.printDanglingComments(path, options), hardline$4, "}"]); | 
						|
 | 
						|
    case "ClassProperty": | 
						|
    case "TSAbstractClassProperty": | 
						|
    case "ClassPrivateProperty": | 
						|
      { | 
						|
        if (n.decorators && n.decorators.length !== 0) { | 
						|
          parts.push(printDecorators(path, options, print)); | 
						|
        } | 
						|
 | 
						|
        if (n.accessibility) { | 
						|
          parts.push(n.accessibility + " "); | 
						|
        } | 
						|
 | 
						|
        if (n.declare) { | 
						|
          parts.push("declare "); | 
						|
        } | 
						|
 | 
						|
        if (n.static) { | 
						|
          parts.push("static "); | 
						|
        } | 
						|
 | 
						|
        if (n.type === "TSAbstractClassProperty") { | 
						|
          parts.push("abstract "); | 
						|
        } | 
						|
 | 
						|
        if (n.readonly) { | 
						|
          parts.push("readonly "); | 
						|
        } | 
						|
 | 
						|
        var variance = getFlowVariance$1(n); | 
						|
 | 
						|
        if (variance) { | 
						|
          parts.push(variance); | 
						|
        } | 
						|
 | 
						|
        parts.push(printPropertyKey(path, options, print), printOptionalToken(path), printTypeAnnotation(path, options, print)); | 
						|
 | 
						|
        if (n.value) { | 
						|
          parts.push(" =", printAssignmentRight(n.key, n.value, path.call(print, "value"), options)); | 
						|
        } | 
						|
 | 
						|
        parts.push(semi); | 
						|
        return group$2(concat$6(parts)); | 
						|
      } | 
						|
 | 
						|
    case "ClassDeclaration": | 
						|
    case "ClassExpression": | 
						|
      if (n.declare) { | 
						|
        parts.push("declare "); | 
						|
      } | 
						|
 | 
						|
      parts.push(concat$6(printClass(path, options, print))); | 
						|
      return concat$6(parts); | 
						|
 | 
						|
    case "TSInterfaceHeritage": | 
						|
      parts.push(path.call(print, "expression")); | 
						|
 | 
						|
      if (n.typeParameters) { | 
						|
        parts.push(path.call(print, "typeParameters")); | 
						|
      } | 
						|
 | 
						|
      return concat$6(parts); | 
						|
 | 
						|
    case "TemplateElement": | 
						|
      return join$4(literalline$2, n.value.raw.split(/\r?\n/g)); | 
						|
 | 
						|
    case "TemplateLiteral": | 
						|
      { | 
						|
        var expressions = path.map(print, "expressions"); | 
						|
 | 
						|
        var _parentNode = path.getParentNode(); | 
						|
 | 
						|
        if (isJestEachTemplateLiteral$1(n, _parentNode)) { | 
						|
          var _printed2 = printJestEachTemplateLiteral(n, expressions, options); | 
						|
 | 
						|
          if (_printed2) { | 
						|
            return _printed2; | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        var isSimple = isSimpleTemplateLiteral$1(n); | 
						|
 | 
						|
        if (isSimple) { | 
						|
          expressions = expressions.map(function (doc) { | 
						|
            return printDocToString$2(doc, Object.assign({}, options, { | 
						|
              printWidth: Infinity | 
						|
            })).formatted; | 
						|
          }); | 
						|
        } | 
						|
 | 
						|
        parts.push(lineSuffixBoundary$1, "`"); | 
						|
        path.each(function (childPath) { | 
						|
          var i = childPath.getName(); | 
						|
          parts.push(print(childPath)); | 
						|
 | 
						|
          if (i < expressions.length) { | 
						|
            // For a template literal of the following form: | 
						|
            //   `someQuery { | 
						|
            //     ${call({ | 
						|
            //       a, | 
						|
            //       b, | 
						|
            //     })} | 
						|
            //   }` | 
						|
            // the expression is on its own line (there is a \n in the previous | 
						|
            // quasi literal), therefore we want to indent the JavaScript | 
						|
            // expression inside at the beginning of ${ instead of the beginning | 
						|
            // of the `. | 
						|
            var tabWidth = options.tabWidth; | 
						|
            var quasi = childPath.getValue(); | 
						|
            var indentSize = getIndentSize$1(quasi.value.raw, tabWidth); | 
						|
            var _printed3 = expressions[i]; | 
						|
 | 
						|
            if (!isSimple) { | 
						|
              // Breaks at the template element boundaries (${ and }) are preferred to breaking | 
						|
              // in the middle of a MemberExpression | 
						|
              if (n.expressions[i].comments && n.expressions[i].comments.length || n.expressions[i].type === "MemberExpression" || n.expressions[i].type === "OptionalMemberExpression" || n.expressions[i].type === "ConditionalExpression") { | 
						|
                _printed3 = concat$6([indent$3(concat$6([softline$2, _printed3])), softline$2]); | 
						|
              } | 
						|
            } | 
						|
 | 
						|
            var aligned = indentSize === 0 && quasi.value.raw.endsWith("\n") ? align$1(-Infinity, _printed3) : addAlignmentToDoc$2(_printed3, indentSize, tabWidth); | 
						|
            parts.push(group$2(concat$6(["${", aligned, lineSuffixBoundary$1, "}"]))); | 
						|
          } | 
						|
        }, "quasis"); | 
						|
        parts.push("`"); | 
						|
        return concat$6(parts); | 
						|
      } | 
						|
    // These types are unprintable because they serve as abstract | 
						|
    // supertypes for other (printable) types. | 
						|
 | 
						|
    case "TaggedTemplateExpression": | 
						|
      return concat$6([path.call(print, "tag"), path.call(print, "typeParameters"), path.call(print, "quasi")]); | 
						|
 | 
						|
    case "Node": | 
						|
    case "Printable": | 
						|
    case "SourceLocation": | 
						|
    case "Position": | 
						|
    case "Statement": | 
						|
    case "Function": | 
						|
    case "Pattern": | 
						|
    case "Expression": | 
						|
    case "Declaration": | 
						|
    case "Specifier": | 
						|
    case "NamedSpecifier": | 
						|
    case "Comment": | 
						|
    case "MemberTypeAnnotation": // Flow | 
						|
 | 
						|
    case "Type": | 
						|
      /* istanbul ignore next */ | 
						|
      throw new Error("unprintable type: " + JSON.stringify(n.type)); | 
						|
    // Type Annotations for Facebook Flow, typically stripped out or | 
						|
    // transformed away before printing. | 
						|
 | 
						|
    case "TypeAnnotation": | 
						|
    case "TSTypeAnnotation": | 
						|
      if (n.typeAnnotation) { | 
						|
        return path.call(print, "typeAnnotation"); | 
						|
      } | 
						|
      /* istanbul ignore next */ | 
						|
 | 
						|
 | 
						|
      return ""; | 
						|
 | 
						|
    case "TSTupleType": | 
						|
    case "TupleTypeAnnotation": | 
						|
      { | 
						|
        var typesField = n.type === "TSTupleType" ? "elementTypes" : "types"; | 
						|
        return group$2(concat$6(["[", indent$3(concat$6([softline$2, printArrayItems(path, options, typesField, print)])), ifBreak$1(shouldPrintComma(options, "all") ? "," : ""), comments.printDanglingComments(path, options, | 
						|
        /* sameIndent */ | 
						|
        true), softline$2, "]"])); | 
						|
      } | 
						|
 | 
						|
    case "ExistsTypeAnnotation": | 
						|
      return "*"; | 
						|
 | 
						|
    case "EmptyTypeAnnotation": | 
						|
      return "empty"; | 
						|
 | 
						|
    case "AnyTypeAnnotation": | 
						|
      return "any"; | 
						|
 | 
						|
    case "MixedTypeAnnotation": | 
						|
      return "mixed"; | 
						|
 | 
						|
    case "ArrayTypeAnnotation": | 
						|
      return concat$6([path.call(print, "elementType"), "[]"]); | 
						|
 | 
						|
    case "BooleanTypeAnnotation": | 
						|
      return "boolean"; | 
						|
 | 
						|
    case "BooleanLiteralTypeAnnotation": | 
						|
      return "" + n.value; | 
						|
 | 
						|
    case "DeclareClass": | 
						|
      return printFlowDeclaration(path, printClass(path, options, print)); | 
						|
 | 
						|
    case "TSDeclareFunction": | 
						|
      // For TypeScript the TSDeclareFunction node shares the AST | 
						|
      // structure with FunctionDeclaration | 
						|
      return concat$6([n.declare ? "declare " : "", printFunctionDeclaration(path, print, options), semi]); | 
						|
 | 
						|
    case "DeclareFunction": | 
						|
      return printFlowDeclaration(path, ["function ", path.call(print, "id"), n.predicate ? " " : "", path.call(print, "predicate"), semi]); | 
						|
 | 
						|
    case "DeclareModule": | 
						|
      return printFlowDeclaration(path, ["module ", path.call(print, "id"), " ", path.call(print, "body")]); | 
						|
 | 
						|
    case "DeclareModuleExports": | 
						|
      return printFlowDeclaration(path, ["module.exports", ": ", path.call(print, "typeAnnotation"), semi]); | 
						|
 | 
						|
    case "DeclareVariable": | 
						|
      return printFlowDeclaration(path, ["var ", path.call(print, "id"), semi]); | 
						|
 | 
						|
    case "DeclareExportAllDeclaration": | 
						|
      return concat$6(["declare export * from ", path.call(print, "source")]); | 
						|
 | 
						|
    case "DeclareExportDeclaration": | 
						|
      return concat$6(["declare ", printExportDeclaration(path, options, print)]); | 
						|
 | 
						|
    case "DeclareOpaqueType": | 
						|
    case "OpaqueType": | 
						|
      { | 
						|
        parts.push("opaque type ", path.call(print, "id"), path.call(print, "typeParameters")); | 
						|
 | 
						|
        if (n.supertype) { | 
						|
          parts.push(": ", path.call(print, "supertype")); | 
						|
        } | 
						|
 | 
						|
        if (n.impltype) { | 
						|
          parts.push(" = ", path.call(print, "impltype")); | 
						|
        } | 
						|
 | 
						|
        parts.push(semi); | 
						|
 | 
						|
        if (n.type === "DeclareOpaqueType") { | 
						|
          return printFlowDeclaration(path, parts); | 
						|
        } | 
						|
 | 
						|
        return concat$6(parts); | 
						|
      } | 
						|
 | 
						|
    case "EnumDeclaration": | 
						|
      return concat$6(["enum ", path.call(print, "id"), " ", path.call(print, "body")]); | 
						|
 | 
						|
    case "EnumBooleanBody": | 
						|
    case "EnumNumberBody": | 
						|
    case "EnumStringBody": | 
						|
    case "EnumSymbolBody": | 
						|
      { | 
						|
        if (n.type === "EnumSymbolBody" || n.explicitType) { | 
						|
          var type = null; | 
						|
 | 
						|
          switch (n.type) { | 
						|
            case "EnumBooleanBody": | 
						|
              type = "boolean"; | 
						|
              break; | 
						|
 | 
						|
            case "EnumNumberBody": | 
						|
              type = "number"; | 
						|
              break; | 
						|
 | 
						|
            case "EnumStringBody": | 
						|
              type = "string"; | 
						|
              break; | 
						|
 | 
						|
            case "EnumSymbolBody": | 
						|
              type = "symbol"; | 
						|
              break; | 
						|
          } | 
						|
 | 
						|
          parts.push("of ", type, " "); | 
						|
        } | 
						|
 | 
						|
        if (n.members.length === 0) { | 
						|
          parts.push(group$2(concat$6(["{", comments.printDanglingComments(path, options), softline$2, "}"]))); | 
						|
        } else { | 
						|
          parts.push(group$2(concat$6(["{", indent$3(concat$6([hardline$4, printArrayItems(path, options, "members", print), shouldPrintComma(options) ? "," : ""])), comments.printDanglingComments(path, options, | 
						|
          /* sameIndent */ | 
						|
          true), hardline$4, "}"]))); | 
						|
        } | 
						|
 | 
						|
        return concat$6(parts); | 
						|
      } | 
						|
 | 
						|
    case "EnumBooleanMember": | 
						|
    case "EnumNumberMember": | 
						|
    case "EnumStringMember": | 
						|
      return concat$6([path.call(print, "id"), " = ", typeof n.init === "object" ? path.call(print, "init") : String(n.init)]); | 
						|
 | 
						|
    case "EnumDefaultedMember": | 
						|
      return path.call(print, "id"); | 
						|
 | 
						|
    case "FunctionTypeAnnotation": | 
						|
    case "TSFunctionType": | 
						|
      { | 
						|
        // FunctionTypeAnnotation is ambiguous: | 
						|
        // declare function foo(a: B): void; OR | 
						|
        // var A: (a: B) => void; | 
						|
        var _parent8 = path.getParentNode(0); | 
						|
 | 
						|
        var _parentParent2 = path.getParentNode(1); | 
						|
 | 
						|
        var _parentParentParent = path.getParentNode(2); | 
						|
 | 
						|
        var isArrowFunctionTypeAnnotation = n.type === "TSFunctionType" || !((_parent8.type === "ObjectTypeProperty" || _parent8.type === "ObjectTypeInternalSlot") && !getFlowVariance$1(_parent8) && !_parent8.optional && options.locStart(_parent8) === options.locStart(n) || _parent8.type === "ObjectTypeCallProperty" || _parentParentParent && _parentParentParent.type === "DeclareFunction"); | 
						|
        var needsColon = isArrowFunctionTypeAnnotation && (_parent8.type === "TypeAnnotation" || _parent8.type === "TSTypeAnnotation"); // Sadly we can't put it inside of FastPath::needsColon because we are | 
						|
        // printing ":" as part of the expression and it would put parenthesis | 
						|
        // around :( | 
						|
 | 
						|
        var needsParens = needsColon && isArrowFunctionTypeAnnotation && (_parent8.type === "TypeAnnotation" || _parent8.type === "TSTypeAnnotation") && _parentParent2.type === "ArrowFunctionExpression"; | 
						|
 | 
						|
        if (isObjectTypePropertyAFunction$1(_parent8, options)) { | 
						|
          isArrowFunctionTypeAnnotation = true; | 
						|
          needsColon = true; | 
						|
        } | 
						|
 | 
						|
        if (needsParens) { | 
						|
          parts.push("("); | 
						|
        } | 
						|
 | 
						|
        parts.push(printFunctionParams(path, print, options, | 
						|
        /* expandArg */ | 
						|
        false, | 
						|
        /* printTypeParams */ | 
						|
        true)); // The returnType is not wrapped in a TypeAnnotation, so the colon | 
						|
        // needs to be added separately. | 
						|
 | 
						|
        if (n.returnType || n.predicate || n.typeAnnotation) { | 
						|
          parts.push(isArrowFunctionTypeAnnotation ? " => " : ": ", path.call(print, "returnType"), path.call(print, "predicate"), path.call(print, "typeAnnotation")); | 
						|
        } | 
						|
 | 
						|
        if (needsParens) { | 
						|
          parts.push(")"); | 
						|
        } | 
						|
 | 
						|
        return group$2(concat$6(parts)); | 
						|
      } | 
						|
 | 
						|
    case "TSRestType": | 
						|
      return concat$6(["...", path.call(print, "typeAnnotation")]); | 
						|
 | 
						|
    case "TSOptionalType": | 
						|
      return concat$6([path.call(print, "typeAnnotation"), "?"]); | 
						|
 | 
						|
    case "FunctionTypeParam": | 
						|
      return concat$6([path.call(print, "name"), printOptionalToken(path), n.name ? ": " : "", path.call(print, "typeAnnotation")]); | 
						|
 | 
						|
    case "GenericTypeAnnotation": | 
						|
      return concat$6([path.call(print, "id"), path.call(print, "typeParameters")]); | 
						|
 | 
						|
    case "DeclareInterface": | 
						|
    case "InterfaceDeclaration": | 
						|
    case "InterfaceTypeAnnotation": | 
						|
      { | 
						|
        if (n.type === "DeclareInterface" || n.declare) { | 
						|
          parts.push("declare "); | 
						|
        } | 
						|
 | 
						|
        parts.push("interface"); | 
						|
 | 
						|
        if (n.type === "DeclareInterface" || n.type === "InterfaceDeclaration") { | 
						|
          parts.push(" ", path.call(print, "id"), path.call(print, "typeParameters")); | 
						|
        } | 
						|
 | 
						|
        if (n["extends"].length > 0) { | 
						|
          parts.push(group$2(indent$3(concat$6([line$2, "extends ", (n.extends.length === 1 ? identity$1 : indent$3)(join$4(concat$6([",", line$2]), path.map(print, "extends")))])))); | 
						|
        } | 
						|
 | 
						|
        parts.push(" ", path.call(print, "body")); | 
						|
        return group$2(concat$6(parts)); | 
						|
      } | 
						|
 | 
						|
    case "ClassImplements": | 
						|
    case "InterfaceExtends": | 
						|
      return concat$6([path.call(print, "id"), path.call(print, "typeParameters")]); | 
						|
 | 
						|
    case "TSClassImplements": | 
						|
      return concat$6([path.call(print, "expression"), path.call(print, "typeParameters")]); | 
						|
 | 
						|
    case "TSIntersectionType": | 
						|
    case "IntersectionTypeAnnotation": | 
						|
      { | 
						|
        var types = path.map(print, "types"); | 
						|
        var result = []; | 
						|
        var wasIndented = false; | 
						|
 | 
						|
        for (var _i = 0; _i < types.length; ++_i) { | 
						|
          if (_i === 0) { | 
						|
            result.push(types[_i]); | 
						|
          } else if (isObjectType$1(n.types[_i - 1]) && isObjectType$1(n.types[_i])) { | 
						|
            // If both are objects, don't indent | 
						|
            result.push(concat$6([" & ", wasIndented ? indent$3(types[_i]) : types[_i]])); | 
						|
          } else if (!isObjectType$1(n.types[_i - 1]) && !isObjectType$1(n.types[_i])) { | 
						|
            // If no object is involved, go to the next line if it breaks | 
						|
            result.push(indent$3(concat$6([" &", line$2, types[_i]]))); | 
						|
          } else { | 
						|
            // If you go from object to non-object or vis-versa, then inline it | 
						|
            if (_i > 1) { | 
						|
              wasIndented = true; | 
						|
            } | 
						|
 | 
						|
            result.push(" & ", _i > 1 ? indent$3(types[_i]) : types[_i]); | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        return group$2(concat$6(result)); | 
						|
      } | 
						|
 | 
						|
    case "TSUnionType": | 
						|
    case "UnionTypeAnnotation": | 
						|
      { | 
						|
        // single-line variation | 
						|
        // A | B | C | 
						|
        // multi-line variation | 
						|
        // | A | 
						|
        // | B | 
						|
        // | C | 
						|
        var _parent9 = path.getParentNode(); // If there's a leading comment, the parent is doing the indentation | 
						|
 | 
						|
 | 
						|
        var shouldIndent = _parent9.type !== "TypeParameterInstantiation" && _parent9.type !== "TSTypeParameterInstantiation" && _parent9.type !== "GenericTypeAnnotation" && _parent9.type !== "TSTypeReference" && _parent9.type !== "TSTypeAssertion" && _parent9.type !== "TupleTypeAnnotation" && _parent9.type !== "TSTupleType" && !(_parent9.type === "FunctionTypeParam" && !_parent9.name) && !((_parent9.type === "TypeAlias" || _parent9.type === "VariableDeclarator" || _parent9.type === "TSTypeAliasDeclaration") && hasLeadingOwnLineComment$1(options.originalText, n, options)); // { | 
						|
        //   a: string | 
						|
        // } | null | void | 
						|
        // should be inlined and not be printed in the multi-line variant | 
						|
 | 
						|
        var shouldHug = shouldHugType(n); // We want to align the children but without its comment, so it looks like | 
						|
        // | child1 | 
						|
        // // comment | 
						|
        // | child2 | 
						|
 | 
						|
        var _printed4 = path.map(function (typePath) { | 
						|
          var printedType = typePath.call(print); | 
						|
 | 
						|
          if (!shouldHug) { | 
						|
            printedType = align$1(2, printedType); | 
						|
          } | 
						|
 | 
						|
          return comments.printComments(typePath, function () { | 
						|
            return printedType; | 
						|
          }, options); | 
						|
        }, "types"); | 
						|
 | 
						|
        if (shouldHug) { | 
						|
          return join$4(" | ", _printed4); | 
						|
        } | 
						|
 | 
						|
        var shouldAddStartLine = shouldIndent && !hasLeadingOwnLineComment$1(options.originalText, n, options); | 
						|
        var code = concat$6([ifBreak$1(concat$6([shouldAddStartLine ? line$2 : "", "| "])), join$4(concat$6([line$2, "| "]), _printed4)]); | 
						|
 | 
						|
        if (needsParens_1(path, options)) { | 
						|
          return group$2(concat$6([indent$3(code), softline$2])); | 
						|
        } | 
						|
 | 
						|
        if (_parent9.type === "TupleTypeAnnotation" && _parent9.types.length > 1 || _parent9.type === "TSTupleType" && _parent9.elementTypes.length > 1) { | 
						|
          return group$2(concat$6([indent$3(concat$6([ifBreak$1(concat$6(["(", softline$2])), code])), softline$2, ifBreak$1(")")])); | 
						|
        } | 
						|
 | 
						|
        return group$2(shouldIndent ? indent$3(code) : code); | 
						|
      } | 
						|
 | 
						|
    case "NullableTypeAnnotation": | 
						|
      return concat$6(["?", path.call(print, "typeAnnotation")]); | 
						|
 | 
						|
    case "TSNullKeyword": | 
						|
    case "NullLiteralTypeAnnotation": | 
						|
      return "null"; | 
						|
 | 
						|
    case "ThisTypeAnnotation": | 
						|
      return "this"; | 
						|
 | 
						|
    case "NumberTypeAnnotation": | 
						|
      return "number"; | 
						|
 | 
						|
    case "ObjectTypeCallProperty": | 
						|
      if (n.static) { | 
						|
        parts.push("static "); | 
						|
      } | 
						|
 | 
						|
      parts.push(path.call(print, "value")); | 
						|
      return concat$6(parts); | 
						|
 | 
						|
    case "ObjectTypeIndexer": | 
						|
      { | 
						|
        var _variance = getFlowVariance$1(n); | 
						|
 | 
						|
        return concat$6([_variance || "", "[", path.call(print, "id"), n.id ? ": " : "", path.call(print, "key"), "]: ", path.call(print, "value")]); | 
						|
      } | 
						|
 | 
						|
    case "ObjectTypeProperty": | 
						|
      { | 
						|
        var _variance2 = getFlowVariance$1(n); | 
						|
 | 
						|
        var modifier = ""; | 
						|
 | 
						|
        if (n.proto) { | 
						|
          modifier = "proto "; | 
						|
        } else if (n.static) { | 
						|
          modifier = "static "; | 
						|
        } | 
						|
 | 
						|
        return concat$6([modifier, isGetterOrSetter$1(n) ? n.kind + " " : "", _variance2 || "", printPropertyKey(path, options, print), printOptionalToken(path), isFunctionNotation$1(n, options) ? "" : ": ", path.call(print, "value")]); | 
						|
      } | 
						|
 | 
						|
    case "QualifiedTypeIdentifier": | 
						|
      return concat$6([path.call(print, "qualification"), ".", path.call(print, "id")]); | 
						|
 | 
						|
    case "StringLiteralTypeAnnotation": | 
						|
      return nodeStr(n, options); | 
						|
 | 
						|
    case "NumberLiteralTypeAnnotation": | 
						|
      assert$1.strictEqual(typeof n.value, "number"); | 
						|
 | 
						|
      if (n.extra != null) { | 
						|
        return printNumber$1(n.extra.raw); | 
						|
      } | 
						|
 | 
						|
      return printNumber$1(n.raw); | 
						|
 | 
						|
    case "StringTypeAnnotation": | 
						|
      return "string"; | 
						|
 | 
						|
    case "DeclareTypeAlias": | 
						|
    case "TypeAlias": | 
						|
      { | 
						|
        if (n.type === "DeclareTypeAlias" || n.declare) { | 
						|
          parts.push("declare "); | 
						|
        } | 
						|
 | 
						|
        var _printed5 = printAssignmentRight(n.id, n.right, path.call(print, "right"), options); | 
						|
 | 
						|
        parts.push("type ", path.call(print, "id"), path.call(print, "typeParameters"), " =", _printed5, semi); | 
						|
        return group$2(concat$6(parts)); | 
						|
      } | 
						|
 | 
						|
    case "TypeCastExpression": | 
						|
      { | 
						|
        var value = path.getValue(); // Flow supports a comment syntax for specifying type annotations: https://flow.org/en/docs/types/comments/. | 
						|
        // Unfortunately, its parser doesn't differentiate between comment annotations and regular | 
						|
        // annotations when producing an AST. So to preserve parentheses around type casts that use | 
						|
        // the comment syntax, we need to hackily read the source itself to see if the code contains | 
						|
        // a type annotation comment. | 
						|
        // | 
						|
        // Note that we're able to use the normal whitespace regex here because the Flow parser has | 
						|
        // already deemed this AST node to be a type cast. Only the Babel parser needs the | 
						|
        // non-line-break whitespace regex, which is why hasFlowShorthandAnnotationComment() is | 
						|
        // implemented differently. | 
						|
 | 
						|
        var commentSyntax = value && value.typeAnnotation && value.typeAnnotation.range && options.originalText.substring(value.typeAnnotation.range[0]).match(/^\/\*\s*:/); | 
						|
        return concat$6(["(", path.call(print, "expression"), commentSyntax ? " /*" : "", ": ", path.call(print, "typeAnnotation"), commentSyntax ? " */" : "", ")"]); | 
						|
      } | 
						|
 | 
						|
    case "TypeParameterDeclaration": | 
						|
    case "TypeParameterInstantiation": | 
						|
      { | 
						|
        var _value = path.getValue(); | 
						|
 | 
						|
        var commentStart = _value.range ? options.originalText.substring(0, _value.range[0]).lastIndexOf("/*") : -1; // As noted in the TypeCastExpression comments above, we're able to use a normal whitespace regex here | 
						|
        // because we know for sure that this is a type definition. | 
						|
 | 
						|
        var _commentSyntax = commentStart >= 0 && options.originalText.substring(commentStart).match(/^\/\*\s*::/); | 
						|
 | 
						|
        if (_commentSyntax) { | 
						|
          return concat$6(["/*:: ", printTypeParameters(path, options, print, "params"), " */"]); | 
						|
        } | 
						|
 | 
						|
        return printTypeParameters(path, options, print, "params"); | 
						|
      } | 
						|
 | 
						|
    case "TSTypeParameterDeclaration": | 
						|
    case "TSTypeParameterInstantiation": | 
						|
      return printTypeParameters(path, options, print, "params"); | 
						|
 | 
						|
    case "TSTypeParameter": | 
						|
    case "TypeParameter": | 
						|
      { | 
						|
        var _parent10 = path.getParentNode(); | 
						|
 | 
						|
        if (_parent10.type === "TSMappedType") { | 
						|
          parts.push("[", path.call(print, "name")); | 
						|
 | 
						|
          if (n.constraint) { | 
						|
            parts.push(" in ", path.call(print, "constraint")); | 
						|
          } | 
						|
 | 
						|
          parts.push("]"); | 
						|
          return concat$6(parts); | 
						|
        } | 
						|
 | 
						|
        var _variance3 = getFlowVariance$1(n); | 
						|
 | 
						|
        if (_variance3) { | 
						|
          parts.push(_variance3); | 
						|
        } | 
						|
 | 
						|
        parts.push(path.call(print, "name")); | 
						|
 | 
						|
        if (n.bound) { | 
						|
          parts.push(": "); | 
						|
          parts.push(path.call(print, "bound")); | 
						|
        } | 
						|
 | 
						|
        if (n.constraint) { | 
						|
          parts.push(" extends ", path.call(print, "constraint")); | 
						|
        } | 
						|
 | 
						|
        if (n["default"]) { | 
						|
          parts.push(" = ", path.call(print, "default")); | 
						|
        } // Keep comma if the file extension is .tsx and | 
						|
        // has one type parameter that isn't extend with any types. | 
						|
        // Because, otherwise formatted result will be invalid as tsx. | 
						|
 | 
						|
 | 
						|
        var _grandParent = path.getNode(2); | 
						|
 | 
						|
        if (_parent10.params && _parent10.params.length === 1 && isTSXFile$1(options) && !n.constraint && _grandParent.type === "ArrowFunctionExpression") { | 
						|
          parts.push(","); | 
						|
        } | 
						|
 | 
						|
        return concat$6(parts); | 
						|
      } | 
						|
 | 
						|
    case "TypeofTypeAnnotation": | 
						|
      return concat$6(["typeof ", path.call(print, "argument")]); | 
						|
 | 
						|
    case "VoidTypeAnnotation": | 
						|
      return "void"; | 
						|
 | 
						|
    case "InferredPredicate": | 
						|
      return "%checks"; | 
						|
    // Unhandled types below. If encountered, nodes of these types should | 
						|
    // be either left alone or desugared into AST types that are fully | 
						|
    // supported by the pretty-printer. | 
						|
 | 
						|
    case "DeclaredPredicate": | 
						|
      return concat$6(["%checks(", path.call(print, "value"), ")"]); | 
						|
 | 
						|
    case "TSAbstractKeyword": | 
						|
      return "abstract"; | 
						|
 | 
						|
    case "TSAnyKeyword": | 
						|
      return "any"; | 
						|
 | 
						|
    case "TSAsyncKeyword": | 
						|
      return "async"; | 
						|
 | 
						|
    case "TSBooleanKeyword": | 
						|
      return "boolean"; | 
						|
 | 
						|
    case "TSBigIntKeyword": | 
						|
      return "bigint"; | 
						|
 | 
						|
    case "TSConstKeyword": | 
						|
      return "const"; | 
						|
 | 
						|
    case "TSDeclareKeyword": | 
						|
      return "declare"; | 
						|
 | 
						|
    case "TSExportKeyword": | 
						|
      return "export"; | 
						|
 | 
						|
    case "TSNeverKeyword": | 
						|
      return "never"; | 
						|
 | 
						|
    case "TSNumberKeyword": | 
						|
      return "number"; | 
						|
 | 
						|
    case "TSObjectKeyword": | 
						|
      return "object"; | 
						|
 | 
						|
    case "TSProtectedKeyword": | 
						|
      return "protected"; | 
						|
 | 
						|
    case "TSPrivateKeyword": | 
						|
      return "private"; | 
						|
 | 
						|
    case "TSPublicKeyword": | 
						|
      return "public"; | 
						|
 | 
						|
    case "TSReadonlyKeyword": | 
						|
      return "readonly"; | 
						|
 | 
						|
    case "TSSymbolKeyword": | 
						|
      return "symbol"; | 
						|
 | 
						|
    case "TSStaticKeyword": | 
						|
      return "static"; | 
						|
 | 
						|
    case "TSStringKeyword": | 
						|
      return "string"; | 
						|
 | 
						|
    case "TSUndefinedKeyword": | 
						|
      return "undefined"; | 
						|
 | 
						|
    case "TSUnknownKeyword": | 
						|
      return "unknown"; | 
						|
 | 
						|
    case "TSVoidKeyword": | 
						|
      return "void"; | 
						|
 | 
						|
    case "TSAsExpression": | 
						|
      return concat$6([path.call(print, "expression"), " as ", path.call(print, "typeAnnotation")]); | 
						|
 | 
						|
    case "TSArrayType": | 
						|
      return concat$6([path.call(print, "elementType"), "[]"]); | 
						|
 | 
						|
    case "TSPropertySignature": | 
						|
      { | 
						|
        if (n.export) { | 
						|
          parts.push("export "); | 
						|
        } | 
						|
 | 
						|
        if (n.accessibility) { | 
						|
          parts.push(n.accessibility + " "); | 
						|
        } | 
						|
 | 
						|
        if (n.static) { | 
						|
          parts.push("static "); | 
						|
        } | 
						|
 | 
						|
        if (n.readonly) { | 
						|
          parts.push("readonly "); | 
						|
        } | 
						|
 | 
						|
        parts.push(printPropertyKey(path, options, print), printOptionalToken(path)); | 
						|
 | 
						|
        if (n.typeAnnotation) { | 
						|
          parts.push(": "); | 
						|
          parts.push(path.call(print, "typeAnnotation")); | 
						|
        } // This isn't valid semantically, but it's in the AST so we can print it. | 
						|
 | 
						|
 | 
						|
        if (n.initializer) { | 
						|
          parts.push(" = ", path.call(print, "initializer")); | 
						|
        } | 
						|
 | 
						|
        return concat$6(parts); | 
						|
      } | 
						|
 | 
						|
    case "TSParameterProperty": | 
						|
      if (n.accessibility) { | 
						|
        parts.push(n.accessibility + " "); | 
						|
      } | 
						|
 | 
						|
      if (n.export) { | 
						|
        parts.push("export "); | 
						|
      } | 
						|
 | 
						|
      if (n.static) { | 
						|
        parts.push("static "); | 
						|
      } | 
						|
 | 
						|
      if (n.readonly) { | 
						|
        parts.push("readonly "); | 
						|
      } | 
						|
 | 
						|
      parts.push(path.call(print, "parameter")); | 
						|
      return concat$6(parts); | 
						|
 | 
						|
    case "TSTypeReference": | 
						|
      return concat$6([path.call(print, "typeName"), printTypeParameters(path, options, print, "typeParameters")]); | 
						|
 | 
						|
    case "TSTypeQuery": | 
						|
      return concat$6(["typeof ", path.call(print, "exprName")]); | 
						|
 | 
						|
    case "TSIndexSignature": | 
						|
      { | 
						|
        var _parent11 = path.getParentNode(); | 
						|
 | 
						|
        return concat$6([n.export ? "export " : "", n.accessibility ? concat$6([n.accessibility, " "]) : "", n.static ? "static " : "", n.readonly ? "readonly " : "", "[", n.parameters ? concat$6(path.map(print, "parameters")) : "", "]: ", path.call(print, "typeAnnotation"), _parent11.type === "ClassBody" ? semi : ""]); | 
						|
      } | 
						|
 | 
						|
    case "TSTypePredicate": | 
						|
      return concat$6([n.asserts ? "asserts " : "", path.call(print, "parameterName"), n.typeAnnotation ? concat$6([" is ", path.call(print, "typeAnnotation")]) : ""]); | 
						|
 | 
						|
    case "TSNonNullExpression": | 
						|
      return concat$6([path.call(print, "expression"), "!"]); | 
						|
 | 
						|
    case "TSThisType": | 
						|
      return "this"; | 
						|
 | 
						|
    case "TSImportType": | 
						|
      return concat$6([!n.isTypeOf ? "" : "typeof ", "import(", path.call(print, "parameter"), ")", !n.qualifier ? "" : concat$6([".", path.call(print, "qualifier")]), printTypeParameters(path, options, print, "typeParameters")]); | 
						|
 | 
						|
    case "TSLiteralType": | 
						|
      return path.call(print, "literal"); | 
						|
 | 
						|
    case "TSIndexedAccessType": | 
						|
      return concat$6([path.call(print, "objectType"), "[", path.call(print, "indexType"), "]"]); | 
						|
 | 
						|
    case "TSConstructSignatureDeclaration": | 
						|
    case "TSCallSignatureDeclaration": | 
						|
    case "TSConstructorType": | 
						|
      { | 
						|
        if (n.type !== "TSCallSignatureDeclaration") { | 
						|
          parts.push("new "); | 
						|
        } | 
						|
 | 
						|
        parts.push(group$2(printFunctionParams(path, print, options, | 
						|
        /* expandArg */ | 
						|
        false, | 
						|
        /* printTypeParams */ | 
						|
        true))); | 
						|
 | 
						|
        if (n.returnType) { | 
						|
          var isType = n.type === "TSConstructorType"; | 
						|
          parts.push(isType ? " => " : ": ", path.call(print, "returnType")); | 
						|
        } | 
						|
 | 
						|
        return concat$6(parts); | 
						|
      } | 
						|
 | 
						|
    case "TSTypeOperator": | 
						|
      return concat$6([n.operator, " ", path.call(print, "typeAnnotation")]); | 
						|
 | 
						|
    case "TSMappedType": | 
						|
      { | 
						|
        var _shouldBreak3 = hasNewlineInRange$2(options.originalText, options.locStart(n), options.locEnd(n)); | 
						|
 | 
						|
        return group$2(concat$6(["{", indent$3(concat$6([options.bracketSpacing ? line$2 : softline$2, n.readonly ? concat$6([getTypeScriptMappedTypeModifier$1(n.readonly, "readonly"), " "]) : "", printTypeScriptModifiers(path, options, print), path.call(print, "typeParameter"), n.optional ? getTypeScriptMappedTypeModifier$1(n.optional, "?") : "", ": ", path.call(print, "typeAnnotation"), ifBreak$1(semi, "")])), comments.printDanglingComments(path, options, | 
						|
        /* sameIndent */ | 
						|
        true), options.bracketSpacing ? line$2 : softline$2, "}"]), { | 
						|
          shouldBreak: _shouldBreak3 | 
						|
        }); | 
						|
      } | 
						|
 | 
						|
    case "TSMethodSignature": | 
						|
      parts.push(n.accessibility ? concat$6([n.accessibility, " "]) : "", n.export ? "export " : "", n.static ? "static " : "", n.readonly ? "readonly " : "", n.computed ? "[" : "", path.call(print, "key"), n.computed ? "]" : "", printOptionalToken(path), printFunctionParams(path, print, options, | 
						|
      /* expandArg */ | 
						|
      false, | 
						|
      /* printTypeParams */ | 
						|
      true)); | 
						|
 | 
						|
      if (n.returnType) { | 
						|
        parts.push(": ", path.call(print, "returnType")); | 
						|
      } | 
						|
 | 
						|
      return group$2(concat$6(parts)); | 
						|
 | 
						|
    case "TSNamespaceExportDeclaration": | 
						|
      parts.push("export as namespace ", path.call(print, "id")); | 
						|
 | 
						|
      if (options.semi) { | 
						|
        parts.push(";"); | 
						|
      } | 
						|
 | 
						|
      return group$2(concat$6(parts)); | 
						|
 | 
						|
    case "TSEnumDeclaration": | 
						|
      if (n.declare) { | 
						|
        parts.push("declare "); | 
						|
      } | 
						|
 | 
						|
      if (n.modifiers) { | 
						|
        parts.push(printTypeScriptModifiers(path, options, print)); | 
						|
      } | 
						|
 | 
						|
      if (n.const) { | 
						|
        parts.push("const "); | 
						|
      } | 
						|
 | 
						|
      parts.push("enum ", path.call(print, "id"), " "); | 
						|
 | 
						|
      if (n.members.length === 0) { | 
						|
        parts.push(group$2(concat$6(["{", comments.printDanglingComments(path, options), softline$2, "}"]))); | 
						|
      } else { | 
						|
        parts.push(group$2(concat$6(["{", indent$3(concat$6([hardline$4, printArrayItems(path, options, "members", print), shouldPrintComma(options, "es5") ? "," : ""])), comments.printDanglingComments(path, options, | 
						|
        /* sameIndent */ | 
						|
        true), hardline$4, "}"]))); | 
						|
      } | 
						|
 | 
						|
      return concat$6(parts); | 
						|
 | 
						|
    case "TSEnumMember": | 
						|
      parts.push(path.call(print, "id")); | 
						|
 | 
						|
      if (n.initializer) { | 
						|
        parts.push(" = ", path.call(print, "initializer")); | 
						|
      } | 
						|
 | 
						|
      return concat$6(parts); | 
						|
 | 
						|
    case "TSImportEqualsDeclaration": | 
						|
      if (n.isExport) { | 
						|
        parts.push("export "); | 
						|
      } | 
						|
 | 
						|
      parts.push("import ", path.call(print, "id"), " = ", path.call(print, "moduleReference")); | 
						|
 | 
						|
      if (options.semi) { | 
						|
        parts.push(";"); | 
						|
      } | 
						|
 | 
						|
      return group$2(concat$6(parts)); | 
						|
 | 
						|
    case "TSExternalModuleReference": | 
						|
      return concat$6(["require(", path.call(print, "expression"), ")"]); | 
						|
 | 
						|
    case "TSModuleDeclaration": | 
						|
      { | 
						|
        var _parent12 = path.getParentNode(); | 
						|
 | 
						|
        var isExternalModule = isLiteral$1(n.id); | 
						|
        var parentIsDeclaration = _parent12.type === "TSModuleDeclaration"; | 
						|
        var bodyIsDeclaration = n.body && n.body.type === "TSModuleDeclaration"; | 
						|
 | 
						|
        if (parentIsDeclaration) { | 
						|
          parts.push("."); | 
						|
        } else { | 
						|
          if (n.declare) { | 
						|
            parts.push("declare "); | 
						|
          } | 
						|
 | 
						|
          parts.push(printTypeScriptModifiers(path, options, print)); | 
						|
          var textBetweenNodeAndItsId = options.originalText.slice(options.locStart(n), options.locStart(n.id)); // Global declaration looks like this: | 
						|
          // (declare)? global { ... } | 
						|
 | 
						|
          var isGlobalDeclaration = n.id.type === "Identifier" && n.id.name === "global" && !/namespace|module/.test(textBetweenNodeAndItsId); | 
						|
 | 
						|
          if (!isGlobalDeclaration) { | 
						|
            parts.push(isExternalModule || /(^|\s)module(\s|$)/.test(textBetweenNodeAndItsId) ? "module " : "namespace "); | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        parts.push(path.call(print, "id")); | 
						|
 | 
						|
        if (bodyIsDeclaration) { | 
						|
          parts.push(path.call(print, "body")); | 
						|
        } else if (n.body) { | 
						|
          parts.push(" ", group$2(path.call(print, "body"))); | 
						|
        } else { | 
						|
          parts.push(semi); | 
						|
        } | 
						|
 | 
						|
        return concat$6(parts); | 
						|
      } | 
						|
 | 
						|
    case "PrivateName": | 
						|
      return concat$6(["#", path.call(print, "id")]); | 
						|
 | 
						|
    case "TSConditionalType": | 
						|
      return printTernaryOperator(path, options, print, { | 
						|
        beforeParts: function beforeParts() { | 
						|
          return [path.call(print, "checkType"), " ", "extends", " ", path.call(print, "extendsType")]; | 
						|
        }, | 
						|
        afterParts: function afterParts() { | 
						|
          return []; | 
						|
        }, | 
						|
        shouldCheckJsx: false, | 
						|
        conditionalNodeType: "TSConditionalType", | 
						|
        consequentNodePropertyName: "trueType", | 
						|
        alternateNodePropertyName: "falseType", | 
						|
        testNodePropertyName: "checkType", | 
						|
        breakNested: true | 
						|
      }); | 
						|
 | 
						|
    case "TSInferType": | 
						|
      return concat$6(["infer", " ", path.call(print, "typeParameter")]); | 
						|
 | 
						|
    case "InterpreterDirective": | 
						|
      parts.push("#!", n.value, hardline$4); | 
						|
 | 
						|
      if (isNextLineEmpty$2(options.originalText, n, options)) { | 
						|
        parts.push(hardline$4); | 
						|
      } | 
						|
 | 
						|
      return concat$6(parts); | 
						|
 | 
						|
    case "NGRoot": | 
						|
      return concat$6([].concat(path.call(print, "node"), !n.node.comments || n.node.comments.length === 0 ? [] : concat$6([" //", n.node.comments[0].value.trimRight()]))); | 
						|
 | 
						|
    case "NGChainedExpression": | 
						|
      return group$2(join$4(concat$6([";", line$2]), path.map(function (childPath) { | 
						|
        return hasNgSideEffect$1(childPath) ? print(childPath) : concat$6(["(", print(childPath), ")"]); | 
						|
      }, "expressions"))); | 
						|
 | 
						|
    case "NGEmptyExpression": | 
						|
      return ""; | 
						|
 | 
						|
    case "NGQuotedExpression": | 
						|
      return concat$6([n.prefix, ":", n.value]); | 
						|
 | 
						|
    case "NGMicrosyntax": | 
						|
      return concat$6(path.map(function (childPath, index) { | 
						|
        return concat$6([index === 0 ? "" : isNgForOf$1(childPath.getValue(), index, n) ? " " : concat$6([";", line$2]), print(childPath)]); | 
						|
      }, "body")); | 
						|
 | 
						|
    case "NGMicrosyntaxKey": | 
						|
      return /^[a-z_$][a-z0-9_$]*(-[a-z_$][a-z0-9_$])*$/i.test(n.name) ? n.name : JSON.stringify(n.name); | 
						|
 | 
						|
    case "NGMicrosyntaxExpression": | 
						|
      return concat$6([path.call(print, "expression"), n.alias === null ? "" : concat$6([" as ", path.call(print, "alias")])]); | 
						|
 | 
						|
    case "NGMicrosyntaxKeyedExpression": | 
						|
      { | 
						|
        var index = path.getName(); | 
						|
 | 
						|
        var _parentNode2 = path.getParentNode(); | 
						|
 | 
						|
        var shouldNotPrintColon = isNgForOf$1(n, index, _parentNode2) || (index === 1 && (n.key.name === "then" || n.key.name === "else") || index === 2 && n.key.name === "else" && _parentNode2.body[index - 1].type === "NGMicrosyntaxKeyedExpression" && _parentNode2.body[index - 1].key.name === "then") && _parentNode2.body[0].type === "NGMicrosyntaxExpression"; | 
						|
        return concat$6([path.call(print, "key"), shouldNotPrintColon ? " " : ": ", path.call(print, "expression")]); | 
						|
      } | 
						|
 | 
						|
    case "NGMicrosyntaxLet": | 
						|
      return concat$6(["let ", path.call(print, "key"), n.value === null ? "" : concat$6([" = ", path.call(print, "value")])]); | 
						|
 | 
						|
    case "NGMicrosyntaxAs": | 
						|
      return concat$6([path.call(print, "key"), " as ", path.call(print, "alias")]); | 
						|
 | 
						|
    case "ArgumentPlaceholder": | 
						|
      return "?"; | 
						|
 | 
						|
    default: | 
						|
      /* istanbul ignore next */ | 
						|
      throw new Error("unknown type: " + JSON.stringify(n.type)); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function printStatementSequence(path, options, print) { | 
						|
  var printed = []; | 
						|
  var bodyNode = path.getNode(); | 
						|
  var isClass = bodyNode.type === "ClassBody"; | 
						|
  path.map(function (stmtPath, i) { | 
						|
    var stmt = stmtPath.getValue(); // Just in case the AST has been modified to contain falsy | 
						|
    // "statements," it's safer simply to skip them. | 
						|
 | 
						|
    /* istanbul ignore if */ | 
						|
 | 
						|
    if (!stmt) { | 
						|
      return; | 
						|
    } // Skip printing EmptyStatement nodes to avoid leaving stray | 
						|
    // semicolons lying around. | 
						|
 | 
						|
 | 
						|
    if (stmt.type === "EmptyStatement") { | 
						|
      return; | 
						|
    } | 
						|
 | 
						|
    var stmtPrinted = print(stmtPath); | 
						|
    var text = options.originalText; | 
						|
    var parts = []; // in no-semi mode, prepend statement with semicolon if it might break ASI | 
						|
    // don't prepend the only JSX element in a program with semicolon | 
						|
 | 
						|
    if (!options.semi && !isClass && !isTheOnlyJSXElementInMarkdown$1(options, stmtPath) && stmtNeedsASIProtection(stmtPath, options)) { | 
						|
      if (stmt.comments && stmt.comments.some(function (comment) { | 
						|
        return comment.leading; | 
						|
      })) { | 
						|
        parts.push(print(stmtPath, { | 
						|
          needsSemi: true | 
						|
        })); | 
						|
      } else { | 
						|
        parts.push(";", stmtPrinted); | 
						|
      } | 
						|
    } else { | 
						|
      parts.push(stmtPrinted); | 
						|
    } | 
						|
 | 
						|
    if (!options.semi && isClass) { | 
						|
      if (classPropMayCauseASIProblems$1(stmtPath)) { | 
						|
        parts.push(";"); | 
						|
      } else if (stmt.type === "ClassProperty") { | 
						|
        var nextChild = bodyNode.body[i + 1]; | 
						|
 | 
						|
        if (classChildNeedsASIProtection$1(nextChild)) { | 
						|
          parts.push(";"); | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    if (isNextLineEmpty$2(text, stmt, options) && !isLastStatement$1(stmtPath)) { | 
						|
      parts.push(hardline$4); | 
						|
    } | 
						|
 | 
						|
    printed.push(concat$6(parts)); | 
						|
  }); | 
						|
  return join$4(hardline$4, printed); | 
						|
} | 
						|
 | 
						|
function printPropertyKey(path, options, print) { | 
						|
  var node = path.getNode(); | 
						|
 | 
						|
  if (node.computed) { | 
						|
    return concat$6(["[", path.call(print, "key"), "]"]); | 
						|
  } | 
						|
 | 
						|
  var parent = path.getParentNode(); | 
						|
  var key = node.key; | 
						|
 | 
						|
  if (options.quoteProps === "consistent" && !needsQuoteProps.has(parent)) { | 
						|
    var objectHasStringProp = (parent.properties || parent.body || parent.members).some(function (prop) { | 
						|
      return !prop.computed && prop.key && isStringLiteral$1(prop.key) && !isStringPropSafeToCoerceToIdentifier$1(prop, options); | 
						|
    }); | 
						|
    needsQuoteProps.set(parent, objectHasStringProp); | 
						|
  } | 
						|
 | 
						|
  if (key.type === "Identifier" && (options.parser === "json" || options.quoteProps === "consistent" && needsQuoteProps.get(parent))) { | 
						|
    // a -> "a" | 
						|
    var prop = printString$1(JSON.stringify(key.name), options); | 
						|
    return path.call(function (keyPath) { | 
						|
      return comments.printComments(keyPath, function () { | 
						|
        return prop; | 
						|
      }, options); | 
						|
    }, "key"); | 
						|
  } | 
						|
 | 
						|
  if (isStringPropSafeToCoerceToIdentifier$1(node, options) && (options.quoteProps === "as-needed" || options.quoteProps === "consistent" && !needsQuoteProps.get(parent))) { | 
						|
    // 'a' -> a | 
						|
    return path.call(function (keyPath) { | 
						|
      return comments.printComments(keyPath, function () { | 
						|
        return key.value; | 
						|
      }, options); | 
						|
    }, "key"); | 
						|
  } | 
						|
 | 
						|
  return path.call(print, "key"); | 
						|
} | 
						|
 | 
						|
function printMethod(path, options, print) { | 
						|
  var node = path.getNode(); | 
						|
  var kind = node.kind; | 
						|
  var value = node.value || node; | 
						|
  var parts = []; | 
						|
 | 
						|
  if (!kind || kind === "init" || kind === "method" || kind === "constructor") { | 
						|
    if (value.async) { | 
						|
      parts.push("async "); | 
						|
    } | 
						|
 | 
						|
    if (value.generator) { | 
						|
      parts.push("*"); | 
						|
    } | 
						|
  } else { | 
						|
    assert$1.ok(kind === "get" || kind === "set"); | 
						|
    parts.push(kind, " "); | 
						|
  } | 
						|
 | 
						|
  parts.push(printPropertyKey(path, options, print), node.optional || node.key.optional ? "?" : "", node === value ? printMethodInternal(path, options, print) : path.call(function (path) { | 
						|
    return printMethodInternal(path, options, print); | 
						|
  }, "value")); | 
						|
  return concat$6(parts); | 
						|
} | 
						|
 | 
						|
function printMethodInternal(path, options, print) { | 
						|
  var parts = [printFunctionTypeParameters(path, options, print), group$2(concat$6([printFunctionParams(path, print, options), printReturnType(path, print, options)]))]; | 
						|
 | 
						|
  if (path.getNode().body) { | 
						|
    parts.push(" ", path.call(print, "body")); | 
						|
  } else { | 
						|
    parts.push(options.semi ? ";" : ""); | 
						|
  } | 
						|
 | 
						|
  return concat$6(parts); | 
						|
} | 
						|
 | 
						|
function couldGroupArg(arg) { | 
						|
  return arg.type === "ObjectExpression" && (arg.properties.length > 0 || arg.comments) || arg.type === "ArrayExpression" && (arg.elements.length > 0 || arg.comments) || arg.type === "TSTypeAssertion" && couldGroupArg(arg.expression) || arg.type === "TSAsExpression" && couldGroupArg(arg.expression) || arg.type === "FunctionExpression" || arg.type === "ArrowFunctionExpression" && ( // we want to avoid breaking inside composite return types but not simple keywords | 
						|
  // https://github.com/prettier/prettier/issues/4070 | 
						|
  // export class Thing implements OtherThing { | 
						|
  //   do: (type: Type) => Provider<Prop> = memoize( | 
						|
  //     (type: ObjectType): Provider<Opts> => {} | 
						|
  //   ); | 
						|
  // } | 
						|
  // https://github.com/prettier/prettier/issues/6099 | 
						|
  // app.get("/", (req, res): void => { | 
						|
  //   res.send("Hello World!"); | 
						|
  // }); | 
						|
  !arg.returnType || !arg.returnType.typeAnnotation || arg.returnType.typeAnnotation.type !== "TSTypeReference") && (arg.body.type === "BlockStatement" || arg.body.type === "ArrowFunctionExpression" || arg.body.type === "ObjectExpression" || arg.body.type === "ArrayExpression" || arg.body.type === "CallExpression" || arg.body.type === "OptionalCallExpression" || arg.body.type === "ConditionalExpression" || isJSXNode$1(arg.body)); | 
						|
} | 
						|
 | 
						|
function shouldGroupLastArg(args) { | 
						|
  var lastArg = getLast$2(args); | 
						|
  var penultimateArg = getPenultimate$1(args); | 
						|
  return !hasLeadingComment$3(lastArg) && !hasTrailingComment$1(lastArg) && couldGroupArg(lastArg) && ( // If the last two arguments are of the same type, | 
						|
  // disable last element expansion. | 
						|
  !penultimateArg || penultimateArg.type !== lastArg.type); | 
						|
} | 
						|
 | 
						|
function shouldGroupFirstArg(args) { | 
						|
  if (args.length !== 2) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  var firstArg = args[0]; | 
						|
  var secondArg = args[1]; | 
						|
  return (!firstArg.comments || !firstArg.comments.length) && (firstArg.type === "FunctionExpression" || firstArg.type === "ArrowFunctionExpression" && firstArg.body.type === "BlockStatement") && secondArg.type !== "FunctionExpression" && secondArg.type !== "ArrowFunctionExpression" && secondArg.type !== "ConditionalExpression" && !couldGroupArg(secondArg); | 
						|
} | 
						|
 | 
						|
function printJestEachTemplateLiteral(node, expressions, options) { | 
						|
  /** | 
						|
   * a    | b    | expected | 
						|
   * ${1} | ${1} | ${2} | 
						|
   * ${1} | ${2} | ${3} | 
						|
   * ${2} | ${1} | ${3} | 
						|
   */ | 
						|
  var headerNames = node.quasis[0].value.raw.trim().split(/\s*\|\s*/); | 
						|
 | 
						|
  if (headerNames.length > 1 || headerNames.some(function (headerName) { | 
						|
    return headerName.length !== 0; | 
						|
  })) { | 
						|
    var parts = []; | 
						|
    var stringifiedExpressions = expressions.map(function (doc) { | 
						|
      return "${" + printDocToString$2(doc, Object.assign({}, options, { | 
						|
        printWidth: Infinity, | 
						|
        endOfLine: "lf" | 
						|
      })).formatted + "}"; | 
						|
    }); | 
						|
    var tableBody = [{ | 
						|
      hasLineBreak: false, | 
						|
      cells: [] | 
						|
    }]; | 
						|
 | 
						|
    for (var i = 1; i < node.quasis.length; i++) { | 
						|
      var row = tableBody[tableBody.length - 1]; | 
						|
      var correspondingExpression = stringifiedExpressions[i - 1]; | 
						|
      row.cells.push(correspondingExpression); | 
						|
 | 
						|
      if (correspondingExpression.indexOf("\n") !== -1) { | 
						|
        row.hasLineBreak = true; | 
						|
      } | 
						|
 | 
						|
      if (node.quasis[i].value.raw.indexOf("\n") !== -1) { | 
						|
        tableBody.push({ | 
						|
          hasLineBreak: false, | 
						|
          cells: [] | 
						|
        }); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    var maxColumnCount = tableBody.reduce(function (maxColumnCount, row) { | 
						|
      return Math.max(maxColumnCount, row.cells.length); | 
						|
    }, headerNames.length); | 
						|
    var maxColumnWidths = Array.from(new Array(maxColumnCount), function () { | 
						|
      return 0; | 
						|
    }); | 
						|
    var table = [{ | 
						|
      cells: headerNames | 
						|
    }].concat(tableBody.filter(function (row) { | 
						|
      return row.cells.length !== 0; | 
						|
    })); | 
						|
    table.filter(function (row) { | 
						|
      return !row.hasLineBreak; | 
						|
    }).forEach(function (row) { | 
						|
      row.cells.forEach(function (cell, index) { | 
						|
        maxColumnWidths[index] = Math.max(maxColumnWidths[index], getStringWidth$2(cell)); | 
						|
      }); | 
						|
    }); | 
						|
    parts.push(lineSuffixBoundary$1, "`", indent$3(concat$6([hardline$4, join$4(hardline$4, table.map(function (row) { | 
						|
      return join$4(" | ", row.cells.map(function (cell, index) { | 
						|
        return row.hasLineBreak ? cell : cell + " ".repeat(maxColumnWidths[index] - getStringWidth$2(cell)); | 
						|
      })); | 
						|
    }))])), hardline$4, "`"); | 
						|
    return concat$6(parts); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function printArgumentsList(path, options, print) { | 
						|
  var node = path.getValue(); | 
						|
  var args = node.arguments; | 
						|
 | 
						|
  if (args.length === 0) { | 
						|
    return concat$6(["(", comments.printDanglingComments(path, options, | 
						|
    /* sameIndent */ | 
						|
    true), ")"]); | 
						|
  } // useEffect(() => { ... }, [foo, bar, baz]) | 
						|
 | 
						|
 | 
						|
  if (args.length === 2 && args[0].type === "ArrowFunctionExpression" && args[0].params.length === 0 && args[0].body.type === "BlockStatement" && args[1].type === "ArrayExpression" && !args.find(function (arg) { | 
						|
    return arg.comments; | 
						|
  })) { | 
						|
    return concat$6(["(", path.call(print, "arguments", 0), ", ", path.call(print, "arguments", 1), ")"]); | 
						|
  } // func( | 
						|
  //   ({ | 
						|
  //     a, | 
						|
  //     b | 
						|
  //   }) => {} | 
						|
  // ); | 
						|
 | 
						|
 | 
						|
  function shouldBreakForArrowFunctionInArguments(arg, argPath) { | 
						|
    if (!arg || arg.type !== "ArrowFunctionExpression" || !arg.body || arg.body.type !== "BlockStatement" || !arg.params || arg.params.length < 1) { | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    var shouldBreak = false; | 
						|
    argPath.each(function (paramPath) { | 
						|
      var printed = concat$6([print(paramPath)]); | 
						|
      shouldBreak = shouldBreak || willBreak$1(printed); | 
						|
    }, "params"); | 
						|
    return shouldBreak; | 
						|
  } | 
						|
 | 
						|
  var anyArgEmptyLine = false; | 
						|
  var shouldBreakForArrowFunction = false; | 
						|
  var hasEmptyLineFollowingFirstArg = false; | 
						|
  var lastArgIndex = args.length - 1; | 
						|
  var printedArguments = path.map(function (argPath, index) { | 
						|
    var arg = argPath.getNode(); | 
						|
    var parts = [print(argPath)]; | 
						|
 | 
						|
    if (index === lastArgIndex) ; else if (isNextLineEmpty$2(options.originalText, arg, options)) { | 
						|
      if (index === 0) { | 
						|
        hasEmptyLineFollowingFirstArg = true; | 
						|
      } | 
						|
 | 
						|
      anyArgEmptyLine = true; | 
						|
      parts.push(",", hardline$4, hardline$4); | 
						|
    } else { | 
						|
      parts.push(",", line$2); | 
						|
    } | 
						|
 | 
						|
    shouldBreakForArrowFunction = shouldBreakForArrowFunctionInArguments(arg, argPath); | 
						|
    return concat$6(parts); | 
						|
  }, "arguments"); | 
						|
  var maybeTrailingComma = // Dynamic imports cannot have trailing commas | 
						|
  !(node.callee && node.callee.type === "Import") && shouldPrintComma(options, "all") ? "," : ""; | 
						|
 | 
						|
  function allArgsBrokenOut() { | 
						|
    return group$2(concat$6(["(", indent$3(concat$6([line$2, concat$6(printedArguments)])), maybeTrailingComma, line$2, ")"]), { | 
						|
      shouldBreak: true | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  if (isFunctionCompositionArgs$1(args)) { | 
						|
    return allArgsBrokenOut(); | 
						|
  } | 
						|
 | 
						|
  var shouldGroupFirst = shouldGroupFirstArg(args); | 
						|
  var shouldGroupLast = shouldGroupLastArg(args); | 
						|
 | 
						|
  if (shouldGroupFirst || shouldGroupLast) { | 
						|
    var shouldBreak = (shouldGroupFirst ? printedArguments.slice(1).some(willBreak$1) : printedArguments.slice(0, -1).some(willBreak$1)) || anyArgEmptyLine || shouldBreakForArrowFunction; // We want to print the last argument with a special flag | 
						|
 | 
						|
    var printedExpanded; | 
						|
    var i = 0; | 
						|
    path.each(function (argPath) { | 
						|
      if (shouldGroupFirst && i === 0) { | 
						|
        printedExpanded = [concat$6([argPath.call(function (p) { | 
						|
          return print(p, { | 
						|
            expandFirstArg: true | 
						|
          }); | 
						|
        }), printedArguments.length > 1 ? "," : "", hasEmptyLineFollowingFirstArg ? hardline$4 : line$2, hasEmptyLineFollowingFirstArg ? hardline$4 : ""])].concat(printedArguments.slice(1)); | 
						|
      } | 
						|
 | 
						|
      if (shouldGroupLast && i === args.length - 1) { | 
						|
        printedExpanded = printedArguments.slice(0, -1).concat(argPath.call(function (p) { | 
						|
          return print(p, { | 
						|
            expandLastArg: true | 
						|
          }); | 
						|
        })); | 
						|
      } | 
						|
 | 
						|
      i++; | 
						|
    }, "arguments"); | 
						|
    var somePrintedArgumentsWillBreak = printedArguments.some(willBreak$1); | 
						|
    var simpleConcat = concat$6(["(", concat$6(printedExpanded), ")"]); | 
						|
    return concat$6([somePrintedArgumentsWillBreak ? breakParent$2 : "", conditionalGroup$1([!somePrintedArgumentsWillBreak && !node.typeArguments && !node.typeParameters ? simpleConcat : ifBreak$1(allArgsBrokenOut(), simpleConcat), shouldGroupFirst ? concat$6(["(", group$2(printedExpanded[0], { | 
						|
      shouldBreak: true | 
						|
    }), concat$6(printedExpanded.slice(1)), ")"]) : concat$6(["(", concat$6(printedArguments.slice(0, -1)), group$2(getLast$2(printedExpanded), { | 
						|
      shouldBreak: true | 
						|
    }), ")"]), allArgsBrokenOut()], { | 
						|
      shouldBreak | 
						|
    })]); | 
						|
  } | 
						|
 | 
						|
  var contents = concat$6(["(", indent$3(concat$6([softline$2, concat$6(printedArguments)])), ifBreak$1(maybeTrailingComma), softline$2, ")"]); | 
						|
 | 
						|
  if (isLongCurriedCallExpression$1(path)) { | 
						|
    // By not wrapping the arguments in a group, the printer prioritizes | 
						|
    // breaking up these arguments rather than the args of the parent call. | 
						|
    return contents; | 
						|
  } | 
						|
 | 
						|
  return group$2(contents, { | 
						|
    shouldBreak: printedArguments.some(willBreak$1) || anyArgEmptyLine | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function printTypeAnnotation(path, options, print) { | 
						|
  var node = path.getValue(); | 
						|
 | 
						|
  if (!node.typeAnnotation) { | 
						|
    return ""; | 
						|
  } | 
						|
 | 
						|
  var parentNode = path.getParentNode(); | 
						|
  var isDefinite = node.definite || parentNode && parentNode.type === "VariableDeclarator" && parentNode.definite; | 
						|
  var isFunctionDeclarationIdentifier = parentNode.type === "DeclareFunction" && parentNode.id === node; | 
						|
 | 
						|
  if (isFlowAnnotationComment$1(options.originalText, node.typeAnnotation, options)) { | 
						|
    return concat$6([" /*: ", path.call(print, "typeAnnotation"), " */"]); | 
						|
  } | 
						|
 | 
						|
  return concat$6([isFunctionDeclarationIdentifier ? "" : isDefinite ? "!: " : ": ", path.call(print, "typeAnnotation")]); | 
						|
} | 
						|
 | 
						|
function printFunctionTypeParameters(path, options, print) { | 
						|
  var fun = path.getValue(); | 
						|
 | 
						|
  if (fun.typeArguments) { | 
						|
    return path.call(print, "typeArguments"); | 
						|
  } | 
						|
 | 
						|
  if (fun.typeParameters) { | 
						|
    return path.call(print, "typeParameters"); | 
						|
  } | 
						|
 | 
						|
  return ""; | 
						|
} | 
						|
 | 
						|
function printFunctionParams(path, print, options, expandArg, printTypeParams) { | 
						|
  var fun = path.getValue(); | 
						|
  var parent = path.getParentNode(); | 
						|
  var paramsField = fun.parameters ? "parameters" : "params"; | 
						|
  var isParametersInTestCall = isTestCall$1(parent); | 
						|
  var shouldHugParameters = shouldHugArguments(fun); | 
						|
  var shouldExpandParameters = expandArg && !(fun[paramsField] && fun[paramsField].some(function (n) { | 
						|
    return n.comments; | 
						|
  })); | 
						|
  var typeParams = printTypeParams ? printFunctionTypeParameters(path, options, print) : ""; | 
						|
  var printed = []; | 
						|
 | 
						|
  if (fun[paramsField]) { | 
						|
    var lastArgIndex = fun[paramsField].length - 1; | 
						|
    printed = path.map(function (childPath, index) { | 
						|
      var parts = []; | 
						|
      var param = childPath.getValue(); | 
						|
      parts.push(print(childPath)); | 
						|
 | 
						|
      if (index === lastArgIndex) { | 
						|
        if (fun.rest) { | 
						|
          parts.push(",", line$2); | 
						|
        } | 
						|
      } else if (isParametersInTestCall || shouldHugParameters || shouldExpandParameters) { | 
						|
        parts.push(", "); | 
						|
      } else if (isNextLineEmpty$2(options.originalText, param, options)) { | 
						|
        parts.push(",", hardline$4, hardline$4); | 
						|
      } else { | 
						|
        parts.push(",", line$2); | 
						|
      } | 
						|
 | 
						|
      return concat$6(parts); | 
						|
    }, paramsField); | 
						|
  } | 
						|
 | 
						|
  if (fun.rest) { | 
						|
    printed.push(concat$6(["...", path.call(print, "rest")])); | 
						|
  } | 
						|
 | 
						|
  if (printed.length === 0) { | 
						|
    return concat$6([typeParams, "(", comments.printDanglingComments(path, options, | 
						|
    /* sameIndent */ | 
						|
    true, function (comment) { | 
						|
      return getNextNonSpaceNonCommentCharacter$1(options.originalText, comment, options.locEnd) === ")"; | 
						|
    }), ")"]); | 
						|
  } | 
						|
 | 
						|
  var lastParam = getLast$2(fun[paramsField]); // If the parent is a call with the first/last argument expansion and this is the | 
						|
  // params of the first/last argument, we don't want the arguments to break and instead | 
						|
  // want the whole expression to be on a new line. | 
						|
  // | 
						|
  // Good:                 Bad: | 
						|
  //   verylongcall(         verylongcall(( | 
						|
  //     (a, b) => {           a, | 
						|
  //     }                     b, | 
						|
  //   })                    ) => { | 
						|
  //                         }) | 
						|
 | 
						|
  if (shouldExpandParameters) { | 
						|
    return group$2(concat$6([removeLines$1(typeParams), "(", concat$6(printed.map(removeLines$1)), ")"])); | 
						|
  } // Single object destructuring should hug | 
						|
  // | 
						|
  // function({ | 
						|
  //   a, | 
						|
  //   b, | 
						|
  //   c | 
						|
  // }) {} | 
						|
 | 
						|
 | 
						|
  var hasNotParameterDecorator = fun[paramsField].every(function (param) { | 
						|
    return !param.decorators; | 
						|
  }); | 
						|
 | 
						|
  if (shouldHugParameters && hasNotParameterDecorator) { | 
						|
    return concat$6([typeParams, "(", concat$6(printed), ")"]); | 
						|
  } // don't break in specs, eg; `it("should maintain parens around done even when long", (done) => {})` | 
						|
 | 
						|
 | 
						|
  if (isParametersInTestCall) { | 
						|
    return concat$6([typeParams, "(", concat$6(printed), ")"]); | 
						|
  } | 
						|
 | 
						|
  var isFlowShorthandWithOneArg = (isObjectTypePropertyAFunction$1(parent, options) || isTypeAnnotationAFunction$1(parent, options) || parent.type === "TypeAlias" || parent.type === "UnionTypeAnnotation" || parent.type === "TSUnionType" || parent.type === "IntersectionTypeAnnotation" || parent.type === "FunctionTypeAnnotation" && parent.returnType === fun) && fun[paramsField].length === 1 && fun[paramsField][0].name === null && fun[paramsField][0].typeAnnotation && fun.typeParameters === null && isSimpleFlowType$1(fun[paramsField][0].typeAnnotation) && !fun.rest; | 
						|
 | 
						|
  if (isFlowShorthandWithOneArg) { | 
						|
    if (options.arrowParens === "always") { | 
						|
      return concat$6(["(", concat$6(printed), ")"]); | 
						|
    } | 
						|
 | 
						|
    return concat$6(printed); | 
						|
  } | 
						|
 | 
						|
  var canHaveTrailingComma = !(lastParam && lastParam.type === "RestElement") && !fun.rest; | 
						|
  return concat$6([typeParams, "(", indent$3(concat$6([softline$2, concat$6(printed)])), ifBreak$1(canHaveTrailingComma && shouldPrintComma(options, "all") ? "," : ""), softline$2, ")"]); | 
						|
} | 
						|
 | 
						|
function shouldPrintParamsWithoutParens(path, options) { | 
						|
  if (options.arrowParens === "always") { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  if (options.arrowParens === "avoid") { | 
						|
    var node = path.getValue(); | 
						|
    return canPrintParamsWithoutParens(node); | 
						|
  } // Fallback default; should be unreachable | 
						|
 | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function canPrintParamsWithoutParens(node) { | 
						|
  return node.params.length === 1 && !node.rest && !node.typeParameters && !hasDanglingComments$1(node) && node.params[0].type === "Identifier" && !node.params[0].typeAnnotation && !node.params[0].comments && !node.params[0].optional && !node.predicate && !node.returnType; | 
						|
} | 
						|
 | 
						|
function printFunctionDeclaration(path, print, options) { | 
						|
  var n = path.getValue(); | 
						|
  var parts = []; | 
						|
 | 
						|
  if (n.async) { | 
						|
    parts.push("async "); | 
						|
  } | 
						|
 | 
						|
  parts.push("function"); | 
						|
 | 
						|
  if (n.generator) { | 
						|
    parts.push("*"); | 
						|
  } | 
						|
 | 
						|
  if (n.id) { | 
						|
    parts.push(" ", path.call(print, "id")); | 
						|
  } | 
						|
 | 
						|
  parts.push(printFunctionTypeParameters(path, options, print), group$2(concat$6([printFunctionParams(path, print, options), printReturnType(path, print, options)])), n.body ? " " : "", path.call(print, "body")); | 
						|
  return concat$6(parts); | 
						|
} | 
						|
 | 
						|
function printReturnType(path, print, options) { | 
						|
  var n = path.getValue(); | 
						|
  var returnType = path.call(print, "returnType"); | 
						|
 | 
						|
  if (n.returnType && isFlowAnnotationComment$1(options.originalText, n.returnType, options)) { | 
						|
    return concat$6([" /*: ", returnType, " */"]); | 
						|
  } | 
						|
 | 
						|
  var parts = [returnType]; // prepend colon to TypeScript type annotation | 
						|
 | 
						|
  if (n.returnType && n.returnType.typeAnnotation) { | 
						|
    parts.unshift(": "); | 
						|
  } | 
						|
 | 
						|
  if (n.predicate) { | 
						|
    // The return type will already add the colon, but otherwise we | 
						|
    // need to do it ourselves | 
						|
    parts.push(n.returnType ? " " : ": ", path.call(print, "predicate")); | 
						|
  } | 
						|
 | 
						|
  return concat$6(parts); | 
						|
} | 
						|
 | 
						|
function printExportDeclaration(path, options, print) { | 
						|
  var decl = path.getValue(); | 
						|
  var semi = options.semi ? ";" : ""; | 
						|
  var parts = ["export "]; | 
						|
  var isDefault = decl["default"] || decl.type === "ExportDefaultDeclaration"; | 
						|
 | 
						|
  if (isDefault) { | 
						|
    parts.push("default "); | 
						|
  } | 
						|
 | 
						|
  parts.push(comments.printDanglingComments(path, options, | 
						|
  /* sameIndent */ | 
						|
  true)); | 
						|
 | 
						|
  if (needsHardlineAfterDanglingComment$1(decl)) { | 
						|
    parts.push(hardline$4); | 
						|
  } | 
						|
 | 
						|
  if (decl.declaration) { | 
						|
    parts.push(path.call(print, "declaration")); | 
						|
 | 
						|
    if (isDefault && decl.declaration.type !== "ClassDeclaration" && decl.declaration.type !== "FunctionDeclaration" && decl.declaration.type !== "TSInterfaceDeclaration" && decl.declaration.type !== "DeclareClass" && decl.declaration.type !== "DeclareFunction" && decl.declaration.type !== "TSDeclareFunction") { | 
						|
      parts.push(semi); | 
						|
    } | 
						|
  } else { | 
						|
    if (decl.specifiers && decl.specifiers.length > 0) { | 
						|
      var specifiers = []; | 
						|
      var defaultSpecifiers = []; | 
						|
      var namespaceSpecifiers = []; | 
						|
      path.each(function (specifierPath) { | 
						|
        var specifierType = path.getValue().type; | 
						|
 | 
						|
        if (specifierType === "ExportSpecifier") { | 
						|
          specifiers.push(print(specifierPath)); | 
						|
        } else if (specifierType === "ExportDefaultSpecifier") { | 
						|
          defaultSpecifiers.push(print(specifierPath)); | 
						|
        } else if (specifierType === "ExportNamespaceSpecifier") { | 
						|
          namespaceSpecifiers.push(concat$6(["* as ", print(specifierPath)])); | 
						|
        } | 
						|
      }, "specifiers"); | 
						|
      var isNamespaceFollowed = namespaceSpecifiers.length !== 0 && specifiers.length !== 0; | 
						|
      var isDefaultFollowed = defaultSpecifiers.length !== 0 && (namespaceSpecifiers.length !== 0 || specifiers.length !== 0); | 
						|
      var canBreak = specifiers.length > 1 || defaultSpecifiers.length > 0 || decl.specifiers && decl.specifiers.some(function (node) { | 
						|
        return node.comments; | 
						|
      }); | 
						|
      var printed = ""; | 
						|
 | 
						|
      if (specifiers.length !== 0) { | 
						|
        if (canBreak) { | 
						|
          printed = group$2(concat$6(["{", indent$3(concat$6([options.bracketSpacing ? line$2 : softline$2, join$4(concat$6([",", line$2]), specifiers)])), ifBreak$1(shouldPrintComma(options) ? "," : ""), options.bracketSpacing ? line$2 : softline$2, "}"])); | 
						|
        } else { | 
						|
          printed = concat$6(["{", options.bracketSpacing ? " " : "", concat$6(specifiers), options.bracketSpacing ? " " : "", "}"]); | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      parts.push(decl.exportKind === "type" ? "type " : "", concat$6(defaultSpecifiers), concat$6([isDefaultFollowed ? ", " : ""]), concat$6(namespaceSpecifiers), concat$6([isNamespaceFollowed ? ", " : ""]), printed); | 
						|
    } else { | 
						|
      parts.push("{}"); | 
						|
    } | 
						|
 | 
						|
    if (decl.source) { | 
						|
      parts.push(" from ", path.call(print, "source")); | 
						|
    } | 
						|
 | 
						|
    parts.push(semi); | 
						|
  } | 
						|
 | 
						|
  return concat$6(parts); | 
						|
} | 
						|
 | 
						|
function printFlowDeclaration(path, parts) { | 
						|
  var parentExportDecl = getParentExportDeclaration$1(path); | 
						|
 | 
						|
  if (parentExportDecl) { | 
						|
    assert$1.strictEqual(parentExportDecl.type, "DeclareExportDeclaration"); | 
						|
  } else { | 
						|
    // If the parent node has type DeclareExportDeclaration, then it | 
						|
    // will be responsible for printing the "declare" token. Otherwise | 
						|
    // it needs to be printed with this non-exported declaration node. | 
						|
    parts.unshift("declare "); | 
						|
  } | 
						|
 | 
						|
  return concat$6(parts); | 
						|
} | 
						|
 | 
						|
function printTypeScriptModifiers(path, options, print) { | 
						|
  var n = path.getValue(); | 
						|
 | 
						|
  if (!n.modifiers || !n.modifiers.length) { | 
						|
    return ""; | 
						|
  } | 
						|
 | 
						|
  return concat$6([join$4(" ", path.map(print, "modifiers")), " "]); | 
						|
} | 
						|
 | 
						|
function printTypeParameters(path, options, print, paramsKey) { | 
						|
  var n = path.getValue(); | 
						|
 | 
						|
  if (!n[paramsKey]) { | 
						|
    return ""; | 
						|
  } // for TypeParameterDeclaration typeParameters is a single node | 
						|
 | 
						|
 | 
						|
  if (!Array.isArray(n[paramsKey])) { | 
						|
    return path.call(print, paramsKey); | 
						|
  } | 
						|
 | 
						|
  var grandparent = path.getNode(2); | 
						|
  var greatGreatGrandParent = path.getNode(4); | 
						|
  var isParameterInTestCall = grandparent != null && isTestCall$1(grandparent); | 
						|
  var shouldInline = isParameterInTestCall || n[paramsKey].length === 0 || n[paramsKey].length === 1 && (shouldHugType(n[paramsKey][0]) || n[paramsKey][0].type === "GenericTypeAnnotation" && shouldHugType(n[paramsKey][0].id) || n[paramsKey][0].type === "TSTypeReference" && shouldHugType(n[paramsKey][0].typeName) || n[paramsKey][0].type === "NullableTypeAnnotation" || // See https://github.com/prettier/prettier/pull/6467 for the context. | 
						|
  greatGreatGrandParent && greatGreatGrandParent.type === "VariableDeclarator" && grandparent && grandparent.type === "TSTypeAnnotation" && n[paramsKey][0].type !== "TSUnionType" && n[paramsKey][0].type !== "UnionTypeAnnotation" && n[paramsKey][0].type !== "TSConditionalType" && n[paramsKey][0].type !== "TSMappedType"); | 
						|
 | 
						|
  if (shouldInline) { | 
						|
    return concat$6(["<", join$4(", ", path.map(print, paramsKey)), ">"]); | 
						|
  } | 
						|
 | 
						|
  return group$2(concat$6(["<", indent$3(concat$6([softline$2, join$4(concat$6([",", line$2]), path.map(print, paramsKey))])), ifBreak$1(options.parser !== "typescript" && shouldPrintComma(options, "all") ? "," : ""), softline$2, ">"])); | 
						|
} | 
						|
 | 
						|
function printClass(path, options, print) { | 
						|
  var n = path.getValue(); | 
						|
  var parts = []; | 
						|
 | 
						|
  if (n.abstract) { | 
						|
    parts.push("abstract "); | 
						|
  } | 
						|
 | 
						|
  parts.push("class"); | 
						|
 | 
						|
  if (n.id) { | 
						|
    parts.push(" ", path.call(print, "id")); | 
						|
  } | 
						|
 | 
						|
  parts.push(path.call(print, "typeParameters")); | 
						|
  var partsGroup = []; | 
						|
 | 
						|
  if (n.superClass) { | 
						|
    var printed = concat$6(["extends ", path.call(print, "superClass"), path.call(print, "superTypeParameters")]); // Keep old behaviour of extends in same line | 
						|
    // If there is only on extends and there are not comments | 
						|
 | 
						|
    if ((!n.implements || n.implements.length === 0) && (!n.superClass.comments || n.superClass.comments.length === 0)) { | 
						|
      parts.push(concat$6([" ", path.call(function (superClass) { | 
						|
        return comments.printComments(superClass, function () { | 
						|
          return printed; | 
						|
        }, options); | 
						|
      }, "superClass")])); | 
						|
    } else { | 
						|
      partsGroup.push(group$2(concat$6([line$2, path.call(function (superClass) { | 
						|
        return comments.printComments(superClass, function () { | 
						|
          return printed; | 
						|
        }, options); | 
						|
      }, "superClass")]))); | 
						|
    } | 
						|
  } else if (n.extends && n.extends.length > 0) { | 
						|
    parts.push(" extends ", join$4(", ", path.map(print, "extends"))); | 
						|
  } | 
						|
 | 
						|
  if (n["mixins"] && n["mixins"].length > 0) { | 
						|
    partsGroup.push(line$2, "mixins ", group$2(indent$3(join$4(concat$6([",", line$2]), path.map(print, "mixins"))))); | 
						|
  } | 
						|
 | 
						|
  if (n["implements"] && n["implements"].length > 0) { | 
						|
    partsGroup.push(line$2, "implements", group$2(indent$3(concat$6([line$2, join$4(concat$6([",", line$2]), path.map(print, "implements"))])))); | 
						|
  } | 
						|
 | 
						|
  if (partsGroup.length > 0) { | 
						|
    parts.push(group$2(indent$3(concat$6(partsGroup)))); | 
						|
  } | 
						|
 | 
						|
  if (n.body && n.body.comments && hasLeadingOwnLineComment$1(options.originalText, n.body, options)) { | 
						|
    parts.push(hardline$4); | 
						|
  } else { | 
						|
    parts.push(" "); | 
						|
  } | 
						|
 | 
						|
  parts.push(path.call(print, "body")); | 
						|
  return parts; | 
						|
} | 
						|
 | 
						|
function printOptionalToken(path) { | 
						|
  var node = path.getValue(); | 
						|
 | 
						|
  if (!node.optional || // It's an optional computed method parsed by typescript-estree. | 
						|
  // "?" is printed in `printMethod`. | 
						|
  node.type === "Identifier" && node === path.getParentNode().key) { | 
						|
    return ""; | 
						|
  } | 
						|
 | 
						|
  if (node.type === "OptionalCallExpression" || node.type === "OptionalMemberExpression" && node.computed) { | 
						|
    return "?."; | 
						|
  } | 
						|
 | 
						|
  return "?"; | 
						|
} | 
						|
 | 
						|
function printMemberLookup(path, options, print) { | 
						|
  var property = path.call(print, "property"); | 
						|
  var n = path.getValue(); | 
						|
  var optional = printOptionalToken(path); | 
						|
 | 
						|
  if (!n.computed) { | 
						|
    return concat$6([optional, ".", property]); | 
						|
  } | 
						|
 | 
						|
  if (!n.property || isNumericLiteral$1(n.property)) { | 
						|
    return concat$6([optional, "[", property, "]"]); | 
						|
  } | 
						|
 | 
						|
  return group$2(concat$6([optional, "[", indent$3(concat$6([softline$2, property])), softline$2, "]"])); | 
						|
} | 
						|
 | 
						|
function printBindExpressionCallee(path, options, print) { | 
						|
  return concat$6(["::", path.call(print, "callee")]); | 
						|
} // We detect calls on member expressions specially to format a | 
						|
// common pattern better. The pattern we are looking for is this: | 
						|
// | 
						|
// arr | 
						|
//   .map(x => x + 1) | 
						|
//   .filter(x => x > 10) | 
						|
//   .some(x => x % 2) | 
						|
// | 
						|
// The way it is structured in the AST is via a nested sequence of | 
						|
// MemberExpression and CallExpression. We need to traverse the AST | 
						|
// and make groups out of it to print it in the desired way. | 
						|
 | 
						|
 | 
						|
function printMemberChain(path, options, print) { | 
						|
  // The first phase is to linearize the AST by traversing it down. | 
						|
  // | 
						|
  //   a().b() | 
						|
  // has the following AST structure: | 
						|
  //   CallExpression(MemberExpression(CallExpression(Identifier))) | 
						|
  // and we transform it into | 
						|
  //   [Identifier, CallExpression, MemberExpression, CallExpression] | 
						|
  var printedNodes = []; // Here we try to retain one typed empty line after each call expression or | 
						|
  // the first group whether it is in parentheses or not | 
						|
 | 
						|
  function shouldInsertEmptyLineAfter(node) { | 
						|
    var originalText = options.originalText; | 
						|
    var nextCharIndex = getNextNonSpaceNonCommentCharacterIndex$2(originalText, node, options); | 
						|
    var nextChar = originalText.charAt(nextCharIndex); // if it is cut off by a parenthesis, we only account for one typed empty | 
						|
    // line after that parenthesis | 
						|
 | 
						|
    if (nextChar == ")") { | 
						|
      return isNextLineEmptyAfterIndex$1(originalText, nextCharIndex + 1, options); | 
						|
    } | 
						|
 | 
						|
    return isNextLineEmpty$2(originalText, node, options); | 
						|
  } | 
						|
 | 
						|
  function rec(path) { | 
						|
    var node = path.getValue(); | 
						|
 | 
						|
    if ((node.type === "CallExpression" || node.type === "OptionalCallExpression") && (isMemberish$1(node.callee) || node.callee.type === "CallExpression" || node.callee.type === "OptionalCallExpression")) { | 
						|
      printedNodes.unshift({ | 
						|
        node: node, | 
						|
        printed: concat$6([comments.printComments(path, function () { | 
						|
          return concat$6([printOptionalToken(path), printFunctionTypeParameters(path, options, print), printArgumentsList(path, options, print)]); | 
						|
        }, options), shouldInsertEmptyLineAfter(node) ? hardline$4 : ""]) | 
						|
      }); | 
						|
      path.call(function (callee) { | 
						|
        return rec(callee); | 
						|
      }, "callee"); | 
						|
    } else if (isMemberish$1(node)) { | 
						|
      printedNodes.unshift({ | 
						|
        node: node, | 
						|
        needsParens: needsParens_1(path, options), | 
						|
        printed: comments.printComments(path, function () { | 
						|
          return node.type === "OptionalMemberExpression" || node.type === "MemberExpression" ? printMemberLookup(path, options, print) : printBindExpressionCallee(path, options, print); | 
						|
        }, options) | 
						|
      }); | 
						|
      path.call(function (object) { | 
						|
        return rec(object); | 
						|
      }, "object"); | 
						|
    } else if (node.type === "TSNonNullExpression") { | 
						|
      printedNodes.unshift({ | 
						|
        node: node, | 
						|
        printed: comments.printComments(path, function () { | 
						|
          return "!"; | 
						|
        }, options) | 
						|
      }); | 
						|
      path.call(function (expression) { | 
						|
        return rec(expression); | 
						|
      }, "expression"); | 
						|
    } else { | 
						|
      printedNodes.unshift({ | 
						|
        node: node, | 
						|
        printed: path.call(print) | 
						|
      }); | 
						|
    } | 
						|
  } // Note: the comments of the root node have already been printed, so we | 
						|
  // need to extract this first call without printing them as they would | 
						|
  // if handled inside of the recursive call. | 
						|
 | 
						|
 | 
						|
  var node = path.getValue(); | 
						|
  printedNodes.unshift({ | 
						|
    node, | 
						|
    printed: concat$6([printOptionalToken(path), printFunctionTypeParameters(path, options, print), printArgumentsList(path, options, print)]) | 
						|
  }); | 
						|
  path.call(function (callee) { | 
						|
    return rec(callee); | 
						|
  }, "callee"); // Once we have a linear list of printed nodes, we want to create groups out | 
						|
  // of it. | 
						|
  // | 
						|
  //   a().b.c().d().e | 
						|
  // will be grouped as | 
						|
  //   [ | 
						|
  //     [Identifier, CallExpression], | 
						|
  //     [MemberExpression, MemberExpression, CallExpression], | 
						|
  //     [MemberExpression, CallExpression], | 
						|
  //     [MemberExpression], | 
						|
  //   ] | 
						|
  // so that we can print it as | 
						|
  //   a() | 
						|
  //     .b.c() | 
						|
  //     .d() | 
						|
  //     .e | 
						|
  // The first group is the first node followed by | 
						|
  //   - as many CallExpression as possible | 
						|
  //       < fn()()() >.something() | 
						|
  //   - as many array accessors as possible | 
						|
  //       < fn()[0][1][2] >.something() | 
						|
  //   - then, as many MemberExpression as possible but the last one | 
						|
  //       < this.items >.something() | 
						|
 | 
						|
  var groups = []; | 
						|
  var currentGroup = [printedNodes[0]]; | 
						|
  var i = 1; | 
						|
 | 
						|
  for (; i < printedNodes.length; ++i) { | 
						|
    if (printedNodes[i].node.type === "TSNonNullExpression" || printedNodes[i].node.type === "OptionalCallExpression" || printedNodes[i].node.type === "CallExpression" || (printedNodes[i].node.type === "MemberExpression" || printedNodes[i].node.type === "OptionalMemberExpression") && printedNodes[i].node.computed && isNumericLiteral$1(printedNodes[i].node.property)) { | 
						|
      currentGroup.push(printedNodes[i]); | 
						|
    } else { | 
						|
      break; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  if (printedNodes[0].node.type !== "CallExpression" && printedNodes[0].node.type !== "OptionalCallExpression") { | 
						|
    for (; i + 1 < printedNodes.length; ++i) { | 
						|
      if (isMemberish$1(printedNodes[i].node) && isMemberish$1(printedNodes[i + 1].node)) { | 
						|
        currentGroup.push(printedNodes[i]); | 
						|
      } else { | 
						|
        break; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  groups.push(currentGroup); | 
						|
  currentGroup = []; // Then, each following group is a sequence of MemberExpression followed by | 
						|
  // a sequence of CallExpression. To compute it, we keep adding things to the | 
						|
  // group until we has seen a CallExpression in the past and reach a | 
						|
  // MemberExpression | 
						|
 | 
						|
  var hasSeenCallExpression = false; | 
						|
 | 
						|
  for (; i < printedNodes.length; ++i) { | 
						|
    if (hasSeenCallExpression && isMemberish$1(printedNodes[i].node)) { | 
						|
      // [0] should be appended at the end of the group instead of the | 
						|
      // beginning of the next one | 
						|
      if (printedNodes[i].node.computed && isNumericLiteral$1(printedNodes[i].node.property)) { | 
						|
        currentGroup.push(printedNodes[i]); | 
						|
        continue; | 
						|
      } | 
						|
 | 
						|
      groups.push(currentGroup); | 
						|
      currentGroup = []; | 
						|
      hasSeenCallExpression = false; | 
						|
    } | 
						|
 | 
						|
    if (printedNodes[i].node.type === "CallExpression" || printedNodes[i].node.type === "OptionalCallExpression") { | 
						|
      hasSeenCallExpression = true; | 
						|
    } | 
						|
 | 
						|
    currentGroup.push(printedNodes[i]); | 
						|
 | 
						|
    if (printedNodes[i].node.comments && printedNodes[i].node.comments.some(function (comment) { | 
						|
      return comment.trailing; | 
						|
    })) { | 
						|
      groups.push(currentGroup); | 
						|
      currentGroup = []; | 
						|
      hasSeenCallExpression = false; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  if (currentGroup.length > 0) { | 
						|
    groups.push(currentGroup); | 
						|
  } // There are cases like Object.keys(), Observable.of(), _.values() where | 
						|
  // they are the subject of all the chained calls and therefore should | 
						|
  // be kept on the same line: | 
						|
  // | 
						|
  //   Object.keys(items) | 
						|
  //     .filter(x => x) | 
						|
  //     .map(x => x) | 
						|
  // | 
						|
  // In order to detect those cases, we use an heuristic: if the first | 
						|
  // node is an identifier with the name starting with a capital | 
						|
  // letter or just a sequence of _$. The rationale is that they are | 
						|
  // likely to be factories. | 
						|
 | 
						|
 | 
						|
  function isFactory(name) { | 
						|
    return /^[A-Z]|^[_$]+$/.test(name); | 
						|
  } // In case the Identifier is shorter than tab width, we can keep the | 
						|
  // first call in a single line, if it's an ExpressionStatement. | 
						|
  // | 
						|
  //   d3.scaleLinear() | 
						|
  //     .domain([0, 100]) | 
						|
  //     .range([0, width]); | 
						|
  // | 
						|
 | 
						|
 | 
						|
  function isShort(name) { | 
						|
    return name.length <= options.tabWidth; | 
						|
  } | 
						|
 | 
						|
  function shouldNotWrap(groups) { | 
						|
    var parent = path.getParentNode(); | 
						|
    var isExpression = parent && parent.type === "ExpressionStatement"; | 
						|
    var hasComputed = groups[1].length && groups[1][0].node.computed; | 
						|
 | 
						|
    if (groups[0].length === 1) { | 
						|
      var firstNode = groups[0][0].node; | 
						|
      return firstNode.type === "ThisExpression" || firstNode.type === "Identifier" && (isFactory(firstNode.name) || isExpression && isShort(firstNode.name) || hasComputed); | 
						|
    } | 
						|
 | 
						|
    var lastNode = getLast$2(groups[0]).node; | 
						|
    return (lastNode.type === "MemberExpression" || lastNode.type === "OptionalMemberExpression") && lastNode.property.type === "Identifier" && (isFactory(lastNode.property.name) || hasComputed); | 
						|
  } | 
						|
 | 
						|
  var shouldMerge = groups.length >= 2 && !groups[1][0].node.comments && shouldNotWrap(groups); | 
						|
 | 
						|
  function printGroup(printedGroup) { | 
						|
    var printed = printedGroup.map(function (tuple) { | 
						|
      return tuple.printed; | 
						|
    }); // Checks if the last node (i.e. the parent node) needs parens and print | 
						|
    // accordingly | 
						|
 | 
						|
    if (printedGroup.length > 0 && printedGroup[printedGroup.length - 1].needsParens) { | 
						|
      return concat$6(["("].concat(_toConsumableArray$1(printed), [")"])); | 
						|
    } | 
						|
 | 
						|
    return concat$6(printed); | 
						|
  } | 
						|
 | 
						|
  function printIndentedGroup(groups) { | 
						|
    if (groups.length === 0) { | 
						|
      return ""; | 
						|
    } | 
						|
 | 
						|
    return indent$3(group$2(concat$6([hardline$4, join$4(hardline$4, groups.map(printGroup))]))); | 
						|
  } | 
						|
 | 
						|
  var printedGroups = groups.map(printGroup); | 
						|
  var oneLine = concat$6(printedGroups); | 
						|
  var cutoff = shouldMerge ? 3 : 2; | 
						|
  var flatGroups = groups.slice(0, cutoff).reduce(function (res, group) { | 
						|
    return res.concat(group); | 
						|
  }, []); | 
						|
  var hasComment = flatGroups.slice(1, -1).some(function (node) { | 
						|
    return hasLeadingComment$3(node.node); | 
						|
  }) || flatGroups.slice(0, -1).some(function (node) { | 
						|
    return hasTrailingComment$1(node.node); | 
						|
  }) || groups[cutoff] && hasLeadingComment$3(groups[cutoff][0].node); // If we only have a single `.`, we shouldn't do anything fancy and just | 
						|
  // render everything concatenated together. | 
						|
 | 
						|
  if (groups.length <= cutoff && !hasComment) { | 
						|
    if (isLongCurriedCallExpression$1(path)) { | 
						|
      return oneLine; | 
						|
    } | 
						|
 | 
						|
    return group$2(oneLine); | 
						|
  } // Find out the last node in the first group and check if it has an | 
						|
  // empty line after | 
						|
 | 
						|
 | 
						|
  var lastNodeBeforeIndent = getLast$2(shouldMerge ? groups.slice(1, 2)[0] : groups[0]).node; | 
						|
  var shouldHaveEmptyLineBeforeIndent = lastNodeBeforeIndent.type !== "CallExpression" && lastNodeBeforeIndent.type !== "OptionalCallExpression" && shouldInsertEmptyLineAfter(lastNodeBeforeIndent); | 
						|
  var expanded = concat$6([printGroup(groups[0]), shouldMerge ? concat$6(groups.slice(1, 2).map(printGroup)) : "", shouldHaveEmptyLineBeforeIndent ? hardline$4 : "", printIndentedGroup(groups.slice(shouldMerge ? 2 : 1))]); | 
						|
  var callExpressions = printedNodes.map(function (_ref) { | 
						|
    var node = _ref.node; | 
						|
    return node; | 
						|
  }).filter(isCallOrOptionalCallExpression$1); // We don't want to print in one line if there's: | 
						|
  //  * A comment. | 
						|
  //  * 3 or more chained calls. | 
						|
  //  * Any group but the last one has a hard line. | 
						|
  // If the last group is a function it's okay to inline if it fits. | 
						|
 | 
						|
  if (hasComment || callExpressions.length >= 3 || printedGroups.slice(0, -1).some(willBreak$1) || | 
						|
  /** | 
						|
   *     scopes.filter(scope => scope.value !== '').map((scope, i) => { | 
						|
   *       // multi line content | 
						|
   *     }) | 
						|
   */ | 
						|
  function (lastGroupDoc, lastGroupNode) { | 
						|
    return isCallOrOptionalCallExpression$1(lastGroupNode) && willBreak$1(lastGroupDoc); | 
						|
  }(getLast$2(printedGroups), getLast$2(getLast$2(groups)).node) && callExpressions.slice(0, -1).some(function (n) { | 
						|
    return n.arguments.some(isFunctionOrArrowExpression$1); | 
						|
  })) { | 
						|
    return group$2(expanded); | 
						|
  } | 
						|
 | 
						|
  return concat$6([// We only need to check `oneLine` because if `expanded` is chosen | 
						|
  // that means that the parent group has already been broken | 
						|
  // naturally | 
						|
  willBreak$1(oneLine) || shouldHaveEmptyLineBeforeIndent ? breakParent$2 : "", conditionalGroup$1([oneLine, expanded])]); | 
						|
} | 
						|
 | 
						|
function separatorNoWhitespace(isFacebookTranslationTag, child, childNode, nextNode) { | 
						|
  if (isFacebookTranslationTag) { | 
						|
    return ""; | 
						|
  } | 
						|
 | 
						|
  if (childNode.type === "JSXElement" && !childNode.closingElement || nextNode && nextNode.type === "JSXElement" && !nextNode.closingElement) { | 
						|
    return child.length === 1 ? softline$2 : hardline$4; | 
						|
  } | 
						|
 | 
						|
  return softline$2; | 
						|
} | 
						|
 | 
						|
function separatorWithWhitespace(isFacebookTranslationTag, child, childNode, nextNode) { | 
						|
  if (isFacebookTranslationTag) { | 
						|
    return hardline$4; | 
						|
  } | 
						|
 | 
						|
  if (child.length === 1) { | 
						|
    return childNode.type === "JSXElement" && !childNode.closingElement || nextNode && nextNode.type === "JSXElement" && !nextNode.closingElement ? hardline$4 : softline$2; | 
						|
  } | 
						|
 | 
						|
  return hardline$4; | 
						|
} // JSX Children are strange, mostly for two reasons: | 
						|
// 1. JSX reads newlines into string values, instead of skipping them like JS | 
						|
// 2. up to one whitespace between elements within a line is significant, | 
						|
//    but not between lines. | 
						|
// | 
						|
// Leading, trailing, and lone whitespace all need to | 
						|
// turn themselves into the rather ugly `{' '}` when breaking. | 
						|
// | 
						|
// We print JSX using the `fill` doc primitive. | 
						|
// This requires that we give it an array of alternating | 
						|
// content and whitespace elements. | 
						|
// To ensure this we add dummy `""` content elements as needed. | 
						|
 | 
						|
 | 
						|
function printJSXChildren(path, options, print, jsxWhitespace, isFacebookTranslationTag) { | 
						|
  var n = path.getValue(); | 
						|
  var children = []; // using `map` instead of `each` because it provides `i` | 
						|
 | 
						|
  path.map(function (childPath, i) { | 
						|
    var child = childPath.getValue(); | 
						|
 | 
						|
    if (isLiteral$1(child)) { | 
						|
      var text = rawText$1(child); // Contains a non-whitespace character | 
						|
 | 
						|
      if (isMeaningfulJSXText$1(child)) { | 
						|
        var words = text.split(matchJsxWhitespaceRegex$1); // Starts with whitespace | 
						|
 | 
						|
        if (words[0] === "") { | 
						|
          children.push(""); | 
						|
          words.shift(); | 
						|
 | 
						|
          if (/\n/.test(words[0])) { | 
						|
            var next = n.children[i + 1]; | 
						|
            children.push(separatorWithWhitespace(isFacebookTranslationTag, words[1], child, next)); | 
						|
          } else { | 
						|
            children.push(jsxWhitespace); | 
						|
          } | 
						|
 | 
						|
          words.shift(); | 
						|
        } | 
						|
 | 
						|
        var endWhitespace; // Ends with whitespace | 
						|
 | 
						|
        if (getLast$2(words) === "") { | 
						|
          words.pop(); | 
						|
          endWhitespace = words.pop(); | 
						|
        } // This was whitespace only without a new line. | 
						|
 | 
						|
 | 
						|
        if (words.length === 0) { | 
						|
          return; | 
						|
        } | 
						|
 | 
						|
        words.forEach(function (word, i) { | 
						|
          if (i % 2 === 1) { | 
						|
            children.push(line$2); | 
						|
          } else { | 
						|
            children.push(word); | 
						|
          } | 
						|
        }); | 
						|
 | 
						|
        if (endWhitespace !== undefined) { | 
						|
          if (/\n/.test(endWhitespace)) { | 
						|
            var _next = n.children[i + 1]; | 
						|
            children.push(separatorWithWhitespace(isFacebookTranslationTag, getLast$2(children), child, _next)); | 
						|
          } else { | 
						|
            children.push(jsxWhitespace); | 
						|
          } | 
						|
        } else { | 
						|
          var _next2 = n.children[i + 1]; | 
						|
          children.push(separatorNoWhitespace(isFacebookTranslationTag, getLast$2(children), child, _next2)); | 
						|
        } | 
						|
      } else if (/\n/.test(text)) { | 
						|
        // Keep (up to one) blank line between tags/expressions/text. | 
						|
        // Note: We don't keep blank lines between text elements. | 
						|
        if (text.match(/\n/g).length > 1) { | 
						|
          children.push(""); | 
						|
          children.push(hardline$4); | 
						|
        } | 
						|
      } else { | 
						|
        children.push(""); | 
						|
        children.push(jsxWhitespace); | 
						|
      } | 
						|
    } else { | 
						|
      var printedChild = print(childPath); | 
						|
      children.push(printedChild); | 
						|
      var _next3 = n.children[i + 1]; | 
						|
 | 
						|
      var directlyFollowedByMeaningfulText = _next3 && isMeaningfulJSXText$1(_next3); | 
						|
 | 
						|
      if (directlyFollowedByMeaningfulText) { | 
						|
        var firstWord = rawText$1(_next3).trim().split(matchJsxWhitespaceRegex$1)[0]; | 
						|
        children.push(separatorNoWhitespace(isFacebookTranslationTag, firstWord, child, _next3)); | 
						|
      } else { | 
						|
        children.push(hardline$4); | 
						|
      } | 
						|
    } | 
						|
  }, "children"); | 
						|
  return children; | 
						|
} // JSX expands children from the inside-out, instead of the outside-in. | 
						|
// This is both to break children before attributes, | 
						|
// and to ensure that when children break, their parents do as well. | 
						|
// | 
						|
// Any element that is written without any newlines and fits on a single line | 
						|
// is left that way. | 
						|
// Not only that, any user-written-line containing multiple JSX siblings | 
						|
// should also be kept on one line if possible, | 
						|
// so each user-written-line is wrapped in its own group. | 
						|
// | 
						|
// Elements that contain newlines or don't fit on a single line (recursively) | 
						|
// are fully-split, using hardline and shouldBreak: true. | 
						|
// | 
						|
// To support that case properly, all leading and trailing spaces | 
						|
// are stripped from the list of children, and replaced with a single hardline. | 
						|
 | 
						|
 | 
						|
function printJSXElement(path, options, print) { | 
						|
  var n = path.getValue(); | 
						|
 | 
						|
  if (n.type === "JSXElement" && isEmptyJSXElement$1(n)) { | 
						|
    return concat$6([path.call(print, "openingElement"), path.call(print, "closingElement")]); | 
						|
  } | 
						|
 | 
						|
  var openingLines = n.type === "JSXElement" ? path.call(print, "openingElement") : path.call(print, "openingFragment"); | 
						|
  var closingLines = n.type === "JSXElement" ? path.call(print, "closingElement") : path.call(print, "closingFragment"); | 
						|
 | 
						|
  if (n.children.length === 1 && n.children[0].type === "JSXExpressionContainer" && (n.children[0].expression.type === "TemplateLiteral" || n.children[0].expression.type === "TaggedTemplateExpression")) { | 
						|
    return concat$6([openingLines, concat$6(path.map(print, "children")), closingLines]); | 
						|
  } // Convert `{" "}` to text nodes containing a space. | 
						|
  // This makes it easy to turn them into `jsxWhitespace` which | 
						|
  // can then print as either a space or `{" "}` when breaking. | 
						|
 | 
						|
 | 
						|
  n.children = n.children.map(function (child) { | 
						|
    if (isJSXWhitespaceExpression$1(child)) { | 
						|
      return { | 
						|
        type: "JSXText", | 
						|
        value: " ", | 
						|
        raw: " " | 
						|
      }; | 
						|
    } | 
						|
 | 
						|
    return child; | 
						|
  }); | 
						|
  var containsTag = n.children.filter(isJSXNode$1).length > 0; | 
						|
  var containsMultipleExpressions = n.children.filter(function (child) { | 
						|
    return child.type === "JSXExpressionContainer"; | 
						|
  }).length > 1; | 
						|
  var containsMultipleAttributes = n.type === "JSXElement" && n.openingElement.attributes.length > 1; // Record any breaks. Should never go from true to false, only false to true. | 
						|
 | 
						|
  var forcedBreak = willBreak$1(openingLines) || containsTag || containsMultipleAttributes || containsMultipleExpressions; | 
						|
  var rawJsxWhitespace = options.singleQuote ? "{' '}" : '{" "}'; | 
						|
  var jsxWhitespace = ifBreak$1(concat$6([rawJsxWhitespace, softline$2]), " "); | 
						|
  var isFacebookTranslationTag = n.openingElement && n.openingElement.name && n.openingElement.name.name === "fbt"; | 
						|
  var children = printJSXChildren(path, options, print, jsxWhitespace, isFacebookTranslationTag); | 
						|
  var containsText = n.children.filter(function (child) { | 
						|
    return isMeaningfulJSXText$1(child); | 
						|
  }).length > 0; // We can end up we multiple whitespace elements with empty string | 
						|
  // content between them. | 
						|
  // We need to remove empty whitespace and softlines before JSX whitespace | 
						|
  // to get the correct output. | 
						|
 | 
						|
  for (var i = children.length - 2; i >= 0; i--) { | 
						|
    var isPairOfEmptyStrings = children[i] === "" && children[i + 1] === ""; | 
						|
    var isPairOfHardlines = children[i] === hardline$4 && children[i + 1] === "" && children[i + 2] === hardline$4; | 
						|
    var isLineFollowedByJSXWhitespace = (children[i] === softline$2 || children[i] === hardline$4) && children[i + 1] === "" && children[i + 2] === jsxWhitespace; | 
						|
    var isJSXWhitespaceFollowedByLine = children[i] === jsxWhitespace && children[i + 1] === "" && (children[i + 2] === softline$2 || children[i + 2] === hardline$4); | 
						|
    var isDoubleJSXWhitespace = children[i] === jsxWhitespace && children[i + 1] === "" && children[i + 2] === jsxWhitespace; | 
						|
    var isPairOfHardOrSoftLines = children[i] === softline$2 && children[i + 1] === "" && children[i + 2] === hardline$4 || children[i] === hardline$4 && children[i + 1] === "" && children[i + 2] === softline$2; | 
						|
 | 
						|
    if (isPairOfHardlines && containsText || isPairOfEmptyStrings || isLineFollowedByJSXWhitespace || isDoubleJSXWhitespace || isPairOfHardOrSoftLines) { | 
						|
      children.splice(i, 2); | 
						|
    } else if (isJSXWhitespaceFollowedByLine) { | 
						|
      children.splice(i + 1, 2); | 
						|
    } | 
						|
  } // Trim trailing lines (or empty strings) | 
						|
 | 
						|
 | 
						|
  while (children.length && (isLineNext$1(getLast$2(children)) || isEmpty$1(getLast$2(children)))) { | 
						|
    children.pop(); | 
						|
  } // Trim leading lines (or empty strings) | 
						|
 | 
						|
 | 
						|
  while (children.length && (isLineNext$1(children[0]) || isEmpty$1(children[0])) && (isLineNext$1(children[1]) || isEmpty$1(children[1]))) { | 
						|
    children.shift(); | 
						|
    children.shift(); | 
						|
  } // Tweak how we format children if outputting this element over multiple lines. | 
						|
  // Also detect whether we will force this element to output over multiple lines. | 
						|
 | 
						|
 | 
						|
  var multilineChildren = []; | 
						|
  children.forEach(function (child, i) { | 
						|
    // There are a number of situations where we need to ensure we display | 
						|
    // whitespace as `{" "}` when outputting this element over multiple lines. | 
						|
    if (child === jsxWhitespace) { | 
						|
      if (i === 1 && children[i - 1] === "") { | 
						|
        if (children.length === 2) { | 
						|
          // Solitary whitespace | 
						|
          multilineChildren.push(rawJsxWhitespace); | 
						|
          return; | 
						|
        } // Leading whitespace | 
						|
 | 
						|
 | 
						|
        multilineChildren.push(concat$6([rawJsxWhitespace, hardline$4])); | 
						|
        return; | 
						|
      } else if (i === children.length - 1) { | 
						|
        // Trailing whitespace | 
						|
        multilineChildren.push(rawJsxWhitespace); | 
						|
        return; | 
						|
      } else if (children[i - 1] === "" && children[i - 2] === hardline$4) { | 
						|
        // Whitespace after line break | 
						|
        multilineChildren.push(rawJsxWhitespace); | 
						|
        return; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    multilineChildren.push(child); | 
						|
 | 
						|
    if (willBreak$1(child)) { | 
						|
      forcedBreak = true; | 
						|
    } | 
						|
  }); // If there is text we use `fill` to fit as much onto each line as possible. | 
						|
  // When there is no text (just tags and expressions) we use `group` | 
						|
  // to output each on a separate line. | 
						|
 | 
						|
  var content = containsText ? fill$2(multilineChildren) : group$2(concat$6(multilineChildren), { | 
						|
    shouldBreak: true | 
						|
  }); | 
						|
  var multiLineElem = group$2(concat$6([openingLines, indent$3(concat$6([hardline$4, content])), hardline$4, closingLines])); | 
						|
 | 
						|
  if (forcedBreak) { | 
						|
    return multiLineElem; | 
						|
  } | 
						|
 | 
						|
  return conditionalGroup$1([group$2(concat$6([openingLines, concat$6(children), closingLines])), multiLineElem]); | 
						|
} | 
						|
 | 
						|
function maybeWrapJSXElementInParens(path, elem, options) { | 
						|
  var parent = path.getParentNode(); | 
						|
 | 
						|
  if (!parent) { | 
						|
    return elem; | 
						|
  } | 
						|
 | 
						|
  var NO_WRAP_PARENTS = { | 
						|
    ArrayExpression: true, | 
						|
    JSXAttribute: true, | 
						|
    JSXElement: true, | 
						|
    JSXExpressionContainer: true, | 
						|
    JSXFragment: true, | 
						|
    ExpressionStatement: true, | 
						|
    CallExpression: true, | 
						|
    OptionalCallExpression: true, | 
						|
    ConditionalExpression: true, | 
						|
    JsExpressionRoot: true | 
						|
  }; | 
						|
 | 
						|
  if (NO_WRAP_PARENTS[parent.type]) { | 
						|
    return elem; | 
						|
  } | 
						|
 | 
						|
  var shouldBreak = matchAncestorTypes$1(path, ["ArrowFunctionExpression", "CallExpression", "JSXExpressionContainer"]) || matchAncestorTypes$1(path, ["ArrowFunctionExpression", "OptionalCallExpression", "JSXExpressionContainer"]); | 
						|
  var needsParens = needsParens_1(path, options); | 
						|
  return group$2(concat$6([needsParens ? "" : ifBreak$1("("), indent$3(concat$6([softline$2, elem])), softline$2, needsParens ? "" : ifBreak$1(")")]), { | 
						|
    shouldBreak | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function shouldInlineLogicalExpression(node) { | 
						|
  if (node.type !== "LogicalExpression") { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  if (node.right.type === "ObjectExpression" && node.right.properties.length !== 0) { | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  if (node.right.type === "ArrayExpression" && node.right.elements.length !== 0) { | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  if (isJSXNode$1(node.right)) { | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} // For binary expressions to be consistent, we need to group | 
						|
// subsequent operators with the same precedence level under a single | 
						|
// group. Otherwise they will be nested such that some of them break | 
						|
// onto new lines but not all. Operators with the same precedence | 
						|
// level should either all break or not. Because we group them by | 
						|
// precedence level and the AST is structured based on precedence | 
						|
// level, things are naturally broken up correctly, i.e. `&&` is | 
						|
// broken before `+`. | 
						|
 | 
						|
 | 
						|
function printBinaryishExpressions(path, print, options, isNested, isInsideParenthesis) { | 
						|
  var parts = []; | 
						|
  var node = path.getValue(); // We treat BinaryExpression and LogicalExpression nodes the same. | 
						|
 | 
						|
  if (isBinaryish$1(node)) { | 
						|
    // Put all operators with the same precedence level in the same | 
						|
    // group. The reason we only need to do this with the `left` | 
						|
    // expression is because given an expression like `1 + 2 - 3`, it | 
						|
    // is always parsed like `((1 + 2) - 3)`, meaning the `left` side | 
						|
    // is where the rest of the expression will exist. Binary | 
						|
    // expressions on the right side mean they have a difference | 
						|
    // precedence level and should be treated as a separate group, so | 
						|
    // print them normally. (This doesn't hold for the `**` operator, | 
						|
    // which is unique in that it is right-associative.) | 
						|
    if (shouldFlatten$1(node.operator, node.left.operator)) { | 
						|
      // Flatten them out by recursively calling this function. | 
						|
      parts = parts.concat(path.call(function (left) { | 
						|
        return printBinaryishExpressions(left, print, options, | 
						|
        /* isNested */ | 
						|
        true, isInsideParenthesis); | 
						|
      }, "left")); | 
						|
    } else { | 
						|
      parts.push(path.call(print, "left")); | 
						|
    } | 
						|
 | 
						|
    var shouldInline = shouldInlineLogicalExpression(node); | 
						|
    var lineBeforeOperator = (node.operator === "|>" || node.type === "NGPipeExpression" || node.operator === "|" && options.parser === "__vue_expression") && !hasLeadingOwnLineComment$1(options.originalText, node.right, options); | 
						|
    var operator = node.type === "NGPipeExpression" ? "|" : node.operator; | 
						|
    var rightSuffix = node.type === "NGPipeExpression" && node.arguments.length !== 0 ? group$2(indent$3(concat$6([softline$2, ": ", join$4(concat$6([softline$2, ":", ifBreak$1(" ")]), path.map(print, "arguments").map(function (arg) { | 
						|
      return align$1(2, group$2(arg)); | 
						|
    }))]))) : ""; | 
						|
    var right = shouldInline ? concat$6([operator, " ", path.call(print, "right"), rightSuffix]) : concat$6([lineBeforeOperator ? softline$2 : "", operator, lineBeforeOperator ? " " : line$2, path.call(print, "right"), rightSuffix]); // If there's only a single binary expression, we want to create a group | 
						|
    // in order to avoid having a small right part like -1 be on its own line. | 
						|
 | 
						|
    var parent = path.getParentNode(); | 
						|
    var shouldGroup = !(isInsideParenthesis && node.type === "LogicalExpression") && parent.type !== node.type && node.left.type !== node.type && node.right.type !== node.type; | 
						|
    parts.push(" ", shouldGroup ? group$2(right) : right); // The root comments are already printed, but we need to manually print | 
						|
    // the other ones since we don't call the normal print on BinaryExpression, | 
						|
    // only for the left and right parts | 
						|
 | 
						|
    if (isNested && node.comments) { | 
						|
      parts = comments.printComments(path, function () { | 
						|
        return concat$6(parts); | 
						|
      }, options); | 
						|
    } | 
						|
  } else { | 
						|
    // Our stopping case. Simply print the node normally. | 
						|
    parts.push(path.call(print)); | 
						|
  } | 
						|
 | 
						|
  return parts; | 
						|
} | 
						|
 | 
						|
function printAssignmentRight(leftNode, rightNode, printedRight, options) { | 
						|
  if (hasLeadingOwnLineComment$1(options.originalText, rightNode, options)) { | 
						|
    return indent$3(concat$6([hardline$4, printedRight])); | 
						|
  } | 
						|
 | 
						|
  var canBreak = isBinaryish$1(rightNode) && !shouldInlineLogicalExpression(rightNode) || rightNode.type === "ConditionalExpression" && isBinaryish$1(rightNode.test) && !shouldInlineLogicalExpression(rightNode.test) || rightNode.type === "StringLiteralTypeAnnotation" || rightNode.type === "ClassExpression" && rightNode.decorators && rightNode.decorators.length || (leftNode.type === "Identifier" || isStringLiteral$1(leftNode) || leftNode.type === "MemberExpression") && (isStringLiteral$1(rightNode) || isMemberExpressionChain$1(rightNode)) && // do not put values on a separate line from the key in json | 
						|
  options.parser !== "json" && options.parser !== "json5" || rightNode.type === "SequenceExpression"; | 
						|
 | 
						|
  if (canBreak) { | 
						|
    return group$2(indent$3(concat$6([line$2, printedRight]))); | 
						|
  } | 
						|
 | 
						|
  return concat$6([" ", printedRight]); | 
						|
} | 
						|
 | 
						|
function printAssignment(leftNode, printedLeft, operator, rightNode, printedRight, options) { | 
						|
  if (!rightNode) { | 
						|
    return printedLeft; | 
						|
  } | 
						|
 | 
						|
  var printed = printAssignmentRight(leftNode, rightNode, printedRight, options); | 
						|
  return group$2(concat$6([printedLeft, operator, printed])); | 
						|
} | 
						|
 | 
						|
function adjustClause(node, clause, forceSpace) { | 
						|
  if (node.type === "EmptyStatement") { | 
						|
    return ";"; | 
						|
  } | 
						|
 | 
						|
  if (node.type === "BlockStatement" || forceSpace) { | 
						|
    return concat$6([" ", clause]); | 
						|
  } | 
						|
 | 
						|
  return indent$3(concat$6([line$2, clause])); | 
						|
} | 
						|
 | 
						|
function nodeStr(node, options, isFlowOrTypeScriptDirectiveLiteral) { | 
						|
  var raw = rawText$1(node); | 
						|
  var isDirectiveLiteral = isFlowOrTypeScriptDirectiveLiteral || node.type === "DirectiveLiteral"; | 
						|
  return printString$1(raw, options, isDirectiveLiteral); | 
						|
} | 
						|
 | 
						|
function printRegex(node) { | 
						|
  var flags = node.flags.split("").sort().join(""); | 
						|
  return `/${node.pattern}/${flags}`; | 
						|
} | 
						|
 | 
						|
function exprNeedsASIProtection(path, options) { | 
						|
  var node = path.getValue(); | 
						|
  var maybeASIProblem = needsParens_1(path, options) || node.type === "ParenthesizedExpression" || node.type === "TypeCastExpression" || node.type === "ArrowFunctionExpression" && !shouldPrintParamsWithoutParens(path, options) || node.type === "ArrayExpression" || node.type === "ArrayPattern" || node.type === "UnaryExpression" && node.prefix && (node.operator === "+" || node.operator === "-") || node.type === "TemplateLiteral" || node.type === "TemplateElement" || isJSXNode$1(node) || node.type === "BindExpression" && !node.object || node.type === "RegExpLiteral" || node.type === "Literal" && node.pattern || node.type === "Literal" && node.regex; | 
						|
 | 
						|
  if (maybeASIProblem) { | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  if (!hasNakedLeftSide$2(node)) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  return path.call.apply(path, [function (childPath) { | 
						|
    return exprNeedsASIProtection(childPath, options); | 
						|
  }].concat(getLeftSidePathName$2(path, node))); | 
						|
} | 
						|
 | 
						|
function stmtNeedsASIProtection(path, options) { | 
						|
  var node = path.getNode(); | 
						|
 | 
						|
  if (node.type !== "ExpressionStatement") { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  return path.call(function (childPath) { | 
						|
    return exprNeedsASIProtection(childPath, options); | 
						|
  }, "expression"); | 
						|
} | 
						|
 | 
						|
function shouldHugType(node) { | 
						|
  if (isSimpleFlowType$1(node) || isObjectType$1(node)) { | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  if (node.type === "UnionTypeAnnotation" || node.type === "TSUnionType") { | 
						|
    var voidCount = node.types.filter(function (n) { | 
						|
      return n.type === "VoidTypeAnnotation" || n.type === "TSVoidKeyword" || n.type === "NullLiteralTypeAnnotation" || n.type === "TSNullKeyword"; | 
						|
    }).length; | 
						|
    var objectCount = node.types.filter(function (n) { | 
						|
      return n.type === "ObjectTypeAnnotation" || n.type === "TSTypeLiteral" || // This is a bit aggressive but captures Array<{x}> | 
						|
      n.type === "GenericTypeAnnotation" || n.type === "TSTypeReference"; | 
						|
    }).length; | 
						|
 | 
						|
    if (node.types.length - 1 === voidCount && objectCount > 0) { | 
						|
      return true; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function shouldHugArguments(fun) { | 
						|
  return fun && fun.params && fun.params.length === 1 && !fun.params[0].comments && (fun.params[0].type === "ObjectPattern" || fun.params[0].type === "ArrayPattern" || fun.params[0].type === "Identifier" && fun.params[0].typeAnnotation && (fun.params[0].typeAnnotation.type === "TypeAnnotation" || fun.params[0].typeAnnotation.type === "TSTypeAnnotation") && isObjectType$1(fun.params[0].typeAnnotation.typeAnnotation) || fun.params[0].type === "FunctionTypeParam" && isObjectType$1(fun.params[0].typeAnnotation) || fun.params[0].type === "AssignmentPattern" && (fun.params[0].left.type === "ObjectPattern" || fun.params[0].left.type === "ArrayPattern") && (fun.params[0].right.type === "Identifier" || fun.params[0].right.type === "ObjectExpression" && fun.params[0].right.properties.length === 0 || fun.params[0].right.type === "ArrayExpression" && fun.params[0].right.elements.length === 0)) && !fun.rest; | 
						|
} | 
						|
 | 
						|
function printArrayItems(path, options, printPath, print) { | 
						|
  var printedElements = []; | 
						|
  var separatorParts = []; | 
						|
  path.each(function (childPath) { | 
						|
    printedElements.push(concat$6(separatorParts)); | 
						|
    printedElements.push(group$2(print(childPath))); | 
						|
    separatorParts = [",", line$2]; | 
						|
 | 
						|
    if (childPath.getValue() && isNextLineEmpty$2(options.originalText, childPath.getValue(), options)) { | 
						|
      separatorParts.push(softline$2); | 
						|
    } | 
						|
  }, printPath); | 
						|
  return concat$6(printedElements); | 
						|
} | 
						|
 | 
						|
function willPrintOwnComments(path | 
						|
/*, options */ | 
						|
) { | 
						|
  var node = path.getValue(); | 
						|
  var parent = path.getParentNode(); | 
						|
  return (node && (isJSXNode$1(node) || hasFlowShorthandAnnotationComment$2(node) || parent && (parent.type === "CallExpression" || parent.type === "OptionalCallExpression") && (hasFlowAnnotationComment$1(node.leadingComments) || hasFlowAnnotationComment$1(node.trailingComments))) || parent && (parent.type === "JSXSpreadAttribute" || parent.type === "JSXSpreadChild" || parent.type === "UnionTypeAnnotation" || parent.type === "TSUnionType" || (parent.type === "ClassDeclaration" || parent.type === "ClassExpression") && parent.superClass === node)) && !hasIgnoreComment$2(path); | 
						|
} | 
						|
 | 
						|
function canAttachComment(node) { | 
						|
  return node.type && node.type !== "CommentBlock" && node.type !== "CommentLine" && node.type !== "Line" && node.type !== "Block" && node.type !== "EmptyStatement" && node.type !== "TemplateElement" && node.type !== "Import"; | 
						|
} | 
						|
 | 
						|
function printComment$1(commentPath, options) { | 
						|
  var comment = commentPath.getValue(); | 
						|
 | 
						|
  switch (comment.type) { | 
						|
    case "CommentBlock": | 
						|
    case "Block": | 
						|
      { | 
						|
        if (isIndentableBlockComment(comment)) { | 
						|
          var printed = printIndentableBlockComment(comment); // We need to prevent an edge case of a previous trailing comment | 
						|
          // printed as a `lineSuffix` which causes the comments to be | 
						|
          // interleaved. See https://github.com/prettier/prettier/issues/4412 | 
						|
 | 
						|
          if (comment.trailing && !hasNewline$3(options.originalText, options.locStart(comment), { | 
						|
            backwards: true | 
						|
          })) { | 
						|
            return concat$6([hardline$4, printed]); | 
						|
          } | 
						|
 | 
						|
          return printed; | 
						|
        } | 
						|
 | 
						|
        var isInsideFlowComment = options.originalText.substr(options.locEnd(comment) - 3, 3) === "*-/"; | 
						|
        return "/*" + comment.value + (isInsideFlowComment ? "*-/" : "*/"); | 
						|
      } | 
						|
 | 
						|
    case "CommentLine": | 
						|
    case "Line": | 
						|
      // Print shebangs with the proper comment characters | 
						|
      if (options.originalText.slice(options.locStart(comment)).startsWith("#!")) { | 
						|
        return "#!" + comment.value.trimRight(); | 
						|
      } | 
						|
 | 
						|
      return "//" + comment.value.trimRight(); | 
						|
 | 
						|
    default: | 
						|
      throw new Error("Not a comment: " + JSON.stringify(comment)); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function isIndentableBlockComment(comment) { | 
						|
  // If the comment has multiple lines and every line starts with a star | 
						|
  // we can fix the indentation of each line. The stars in the `/*` and | 
						|
  // `*/` delimiters are not included in the comment value, so add them | 
						|
  // back first. | 
						|
  var lines = `*${comment.value}*`.split("\n"); | 
						|
  return lines.length > 1 && lines.every(function (line) { | 
						|
    return line.trim()[0] === "*"; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function printIndentableBlockComment(comment) { | 
						|
  var lines = comment.value.split("\n"); | 
						|
  return concat$6(["/*", join$4(hardline$4, lines.map(function (line, index) { | 
						|
    return index === 0 ? line.trimRight() : " " + (index < lines.length - 1 ? line.trim() : line.trimLeft()); | 
						|
  })), "*/"]); | 
						|
} | 
						|
 | 
						|
var printerEstree = { | 
						|
  preprocess: preprocess_1, | 
						|
  print: genericPrint, | 
						|
  embed: embed_1, | 
						|
  insertPragma: insertPragma$1, | 
						|
  massageAstNode: clean_1, | 
						|
  hasPrettierIgnore: hasPrettierIgnore$1, | 
						|
  willPrintOwnComments, | 
						|
  canAttachComment, | 
						|
  printComment: printComment$1, | 
						|
  isBlockComment: comments$1.isBlockComment, | 
						|
  handleComments: { | 
						|
    ownLine: comments$1.handleOwnLineComment, | 
						|
    endOfLine: comments$1.handleEndOfLineComment, | 
						|
    remaining: comments$1.handleRemainingComment | 
						|
  } | 
						|
}; | 
						|
 | 
						|
var _require$$0$builders$2 = doc.builders, | 
						|
    concat$7 = _require$$0$builders$2.concat, | 
						|
    hardline$5 = _require$$0$builders$2.hardline, | 
						|
    indent$4 = _require$$0$builders$2.indent, | 
						|
    join$5 = _require$$0$builders$2.join; | 
						|
 | 
						|
function genericPrint$1(path, options, print) { | 
						|
  var node = path.getValue(); | 
						|
 | 
						|
  switch (node.type) { | 
						|
    case "JsonRoot": | 
						|
      return concat$7([path.call(print, "node"), hardline$5]); | 
						|
 | 
						|
    case "ArrayExpression": | 
						|
      return node.elements.length === 0 ? "[]" : concat$7(["[", indent$4(concat$7([hardline$5, join$5(concat$7([",", hardline$5]), path.map(print, "elements"))])), hardline$5, "]"]); | 
						|
 | 
						|
    case "ObjectExpression": | 
						|
      return node.properties.length === 0 ? "{}" : concat$7(["{", indent$4(concat$7([hardline$5, join$5(concat$7([",", hardline$5]), path.map(print, "properties"))])), hardline$5, "}"]); | 
						|
 | 
						|
    case "ObjectProperty": | 
						|
      return concat$7([path.call(print, "key"), ": ", path.call(print, "value")]); | 
						|
 | 
						|
    case "UnaryExpression": | 
						|
      return concat$7([node.operator === "+" ? "" : node.operator, path.call(print, "argument")]); | 
						|
 | 
						|
    case "NullLiteral": | 
						|
      return "null"; | 
						|
 | 
						|
    case "BooleanLiteral": | 
						|
      return node.value ? "true" : "false"; | 
						|
 | 
						|
    case "StringLiteral": | 
						|
    case "NumericLiteral": | 
						|
      return JSON.stringify(node.value); | 
						|
 | 
						|
    case "Identifier": | 
						|
      return JSON.stringify(node.name); | 
						|
 | 
						|
    default: | 
						|
      /* istanbul ignore next */ | 
						|
      throw new Error("unknown type: " + JSON.stringify(node.type)); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function clean$1(node, newNode | 
						|
/*, parent*/ | 
						|
) { | 
						|
  delete newNode.start; | 
						|
  delete newNode.end; | 
						|
  delete newNode.extra; | 
						|
  delete newNode.loc; | 
						|
  delete newNode.comments; | 
						|
  delete newNode.errors; | 
						|
 | 
						|
  if (node.type === "Identifier") { | 
						|
    return { | 
						|
      type: "StringLiteral", | 
						|
      value: node.name | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  if (node.type === "UnaryExpression" && node.operator === "+") { | 
						|
    return newNode.argument; | 
						|
  } | 
						|
} | 
						|
 | 
						|
var printerEstreeJson = { | 
						|
  preprocess: preprocess_1, | 
						|
  print: genericPrint$1, | 
						|
  massageAstNode: clean$1 | 
						|
}; | 
						|
 | 
						|
var CATEGORY_COMMON = "Common"; // format based on https://github.com/prettier/prettier/blob/master/src/main/core-options.js | 
						|
 | 
						|
var commonOptions = { | 
						|
  bracketSpacing: { | 
						|
    since: "0.0.0", | 
						|
    category: CATEGORY_COMMON, | 
						|
    type: "boolean", | 
						|
    default: true, | 
						|
    description: "Print spaces between brackets.", | 
						|
    oppositeDescription: "Do not print spaces between brackets." | 
						|
  }, | 
						|
  singleQuote: { | 
						|
    since: "0.0.0", | 
						|
    category: CATEGORY_COMMON, | 
						|
    type: "boolean", | 
						|
    default: false, | 
						|
    description: "Use single quotes instead of double quotes." | 
						|
  }, | 
						|
  proseWrap: { | 
						|
    since: "1.8.2", | 
						|
    category: CATEGORY_COMMON, | 
						|
    type: "choice", | 
						|
    default: [{ | 
						|
      since: "1.8.2", | 
						|
      value: true | 
						|
    }, { | 
						|
      since: "1.9.0", | 
						|
      value: "preserve" | 
						|
    }], | 
						|
    description: "How to wrap prose.", | 
						|
    choices: [{ | 
						|
      since: "1.9.0", | 
						|
      value: "always", | 
						|
      description: "Wrap prose if it exceeds the print width." | 
						|
    }, { | 
						|
      since: "1.9.0", | 
						|
      value: "never", | 
						|
      description: "Do not wrap prose." | 
						|
    }, { | 
						|
      since: "1.9.0", | 
						|
      value: "preserve", | 
						|
      description: "Wrap prose as-is." | 
						|
    }, { | 
						|
      value: false, | 
						|
      deprecated: "1.9.0", | 
						|
      redirect: "never" | 
						|
    }, { | 
						|
      value: true, | 
						|
      deprecated: "1.9.0", | 
						|
      redirect: "always" | 
						|
    }] | 
						|
  } | 
						|
}; | 
						|
 | 
						|
var CATEGORY_JAVASCRIPT = "JavaScript"; // format based on https://github.com/prettier/prettier/blob/master/src/main/core-options.js | 
						|
 | 
						|
var options$2 = { | 
						|
  arrowParens: { | 
						|
    since: "1.9.0", | 
						|
    category: CATEGORY_JAVASCRIPT, | 
						|
    type: "choice", | 
						|
    default: "avoid", | 
						|
    description: "Include parentheses around a sole arrow function parameter.", | 
						|
    choices: [{ | 
						|
      value: "avoid", | 
						|
      description: "Omit parens when possible. Example: `x => x`" | 
						|
    }, { | 
						|
      value: "always", | 
						|
      description: "Always include parens. Example: `(x) => x`" | 
						|
    }] | 
						|
  }, | 
						|
  bracketSpacing: commonOptions.bracketSpacing, | 
						|
  jsxBracketSameLine: { | 
						|
    since: "0.17.0", | 
						|
    category: CATEGORY_JAVASCRIPT, | 
						|
    type: "boolean", | 
						|
    default: false, | 
						|
    description: "Put > on the last line instead of at a new line." | 
						|
  }, | 
						|
  semi: { | 
						|
    since: "1.0.0", | 
						|
    category: CATEGORY_JAVASCRIPT, | 
						|
    type: "boolean", | 
						|
    default: true, | 
						|
    description: "Print semicolons.", | 
						|
    oppositeDescription: "Do not print semicolons, except at the beginning of lines which may need them." | 
						|
  }, | 
						|
  singleQuote: commonOptions.singleQuote, | 
						|
  jsxSingleQuote: { | 
						|
    since: "1.15.0", | 
						|
    category: CATEGORY_JAVASCRIPT, | 
						|
    type: "boolean", | 
						|
    default: false, | 
						|
    description: "Use single quotes in JSX." | 
						|
  }, | 
						|
  quoteProps: { | 
						|
    since: "1.17.0", | 
						|
    category: CATEGORY_JAVASCRIPT, | 
						|
    type: "choice", | 
						|
    default: "as-needed", | 
						|
    description: "Change when properties in objects are quoted.", | 
						|
    choices: [{ | 
						|
      value: "as-needed", | 
						|
      description: "Only add quotes around object properties where required." | 
						|
    }, { | 
						|
      value: "consistent", | 
						|
      description: "If at least one property in an object requires quotes, quote all properties." | 
						|
    }, { | 
						|
      value: "preserve", | 
						|
      description: "Respect the input use of quotes in object properties." | 
						|
    }] | 
						|
  }, | 
						|
  trailingComma: { | 
						|
    since: "0.0.0", | 
						|
    category: CATEGORY_JAVASCRIPT, | 
						|
    type: "choice", | 
						|
    default: [{ | 
						|
      since: "0.0.0", | 
						|
      value: false | 
						|
    }, { | 
						|
      since: "0.19.0", | 
						|
      value: "none" | 
						|
    }], | 
						|
    description: "Print trailing commas wherever possible when multi-line.", | 
						|
    choices: [{ | 
						|
      value: "none", | 
						|
      description: "No trailing commas." | 
						|
    }, { | 
						|
      value: "es5", | 
						|
      description: "Trailing commas where valid in ES5 (objects, arrays, etc.)" | 
						|
    }, { | 
						|
      value: "all", | 
						|
      description: "Trailing commas wherever possible (including function arguments)." | 
						|
    }, { | 
						|
      value: true, | 
						|
      deprecated: "0.19.0", | 
						|
      redirect: "es5" | 
						|
    }, { | 
						|
      value: false, | 
						|
      deprecated: "0.19.0", | 
						|
      redirect: "none" | 
						|
    }] | 
						|
  } | 
						|
}; | 
						|
 | 
						|
var createLanguage = function createLanguage(linguistData, transform) { | 
						|
  var language = {}; | 
						|
 | 
						|
  for (var key in linguistData) { | 
						|
    var newKey = key === "languageId" ? "linguistLanguageId" : key; | 
						|
    language[newKey] = linguistData[key]; | 
						|
  } | 
						|
 | 
						|
  return transform(language); | 
						|
}; | 
						|
 | 
						|
var name$2 = "JavaScript"; | 
						|
var type = "programming"; | 
						|
var tmScope = "source.js"; | 
						|
var aceMode = "javascript"; | 
						|
var codemirrorMode = "javascript"; | 
						|
var codemirrorMimeType = "text/javascript"; | 
						|
var color = "#f1e05a"; | 
						|
var aliases = [ | 
						|
	"js", | 
						|
	"node" | 
						|
]; | 
						|
var extensions = [ | 
						|
	".js", | 
						|
	"._js", | 
						|
	".bones", | 
						|
	".es", | 
						|
	".es6", | 
						|
	".frag", | 
						|
	".gs", | 
						|
	".jake", | 
						|
	".jsb", | 
						|
	".jscad", | 
						|
	".jsfl", | 
						|
	".jsm", | 
						|
	".jss", | 
						|
	".mjs", | 
						|
	".njs", | 
						|
	".pac", | 
						|
	".sjs", | 
						|
	".ssjs", | 
						|
	".xsjs", | 
						|
	".xsjslib" | 
						|
]; | 
						|
var filenames = [ | 
						|
	"Jakefile" | 
						|
]; | 
						|
var interpreters = [ | 
						|
	"chakra", | 
						|
	"d8", | 
						|
	"js", | 
						|
	"node", | 
						|
	"rhino", | 
						|
	"v8", | 
						|
	"v8-shell" | 
						|
]; | 
						|
var languageId = 183; | 
						|
var JavaScript = { | 
						|
	name: name$2, | 
						|
	type: type, | 
						|
	tmScope: tmScope, | 
						|
	aceMode: aceMode, | 
						|
	codemirrorMode: codemirrorMode, | 
						|
	codemirrorMimeType: codemirrorMimeType, | 
						|
	color: color, | 
						|
	aliases: aliases, | 
						|
	extensions: extensions, | 
						|
	filenames: filenames, | 
						|
	interpreters: interpreters, | 
						|
	languageId: languageId | 
						|
}; | 
						|
 | 
						|
var JavaScript$1 = /*#__PURE__*/Object.freeze({ | 
						|
  __proto__: null, | 
						|
  name: name$2, | 
						|
  type: type, | 
						|
  tmScope: tmScope, | 
						|
  aceMode: aceMode, | 
						|
  codemirrorMode: codemirrorMode, | 
						|
  codemirrorMimeType: codemirrorMimeType, | 
						|
  color: color, | 
						|
  aliases: aliases, | 
						|
  extensions: extensions, | 
						|
  filenames: filenames, | 
						|
  interpreters: interpreters, | 
						|
  languageId: languageId, | 
						|
  'default': JavaScript | 
						|
}); | 
						|
 | 
						|
var name$3 = "JSX"; | 
						|
var type$1 = "programming"; | 
						|
var group$3 = "JavaScript"; | 
						|
var extensions$1 = [ | 
						|
	".jsx" | 
						|
]; | 
						|
var tmScope$1 = "source.js.jsx"; | 
						|
var aceMode$1 = "javascript"; | 
						|
var codemirrorMode$1 = "jsx"; | 
						|
var codemirrorMimeType$1 = "text/jsx"; | 
						|
var languageId$1 = 178; | 
						|
var JSX = { | 
						|
	name: name$3, | 
						|
	type: type$1, | 
						|
	group: group$3, | 
						|
	extensions: extensions$1, | 
						|
	tmScope: tmScope$1, | 
						|
	aceMode: aceMode$1, | 
						|
	codemirrorMode: codemirrorMode$1, | 
						|
	codemirrorMimeType: codemirrorMimeType$1, | 
						|
	languageId: languageId$1 | 
						|
}; | 
						|
 | 
						|
var JSX$1 = /*#__PURE__*/Object.freeze({ | 
						|
  __proto__: null, | 
						|
  name: name$3, | 
						|
  type: type$1, | 
						|
  group: group$3, | 
						|
  extensions: extensions$1, | 
						|
  tmScope: tmScope$1, | 
						|
  aceMode: aceMode$1, | 
						|
  codemirrorMode: codemirrorMode$1, | 
						|
  codemirrorMimeType: codemirrorMimeType$1, | 
						|
  languageId: languageId$1, | 
						|
  'default': JSX | 
						|
}); | 
						|
 | 
						|
var name$4 = "TypeScript"; | 
						|
var type$2 = "programming"; | 
						|
var color$1 = "#2b7489"; | 
						|
var aliases$1 = [ | 
						|
	"ts" | 
						|
]; | 
						|
var interpreters$1 = [ | 
						|
	"deno", | 
						|
	"ts-node" | 
						|
]; | 
						|
var extensions$2 = [ | 
						|
	".ts" | 
						|
]; | 
						|
var tmScope$2 = "source.ts"; | 
						|
var aceMode$2 = "typescript"; | 
						|
var codemirrorMode$2 = "javascript"; | 
						|
var codemirrorMimeType$2 = "application/typescript"; | 
						|
var languageId$2 = 378; | 
						|
var TypeScript = { | 
						|
	name: name$4, | 
						|
	type: type$2, | 
						|
	color: color$1, | 
						|
	aliases: aliases$1, | 
						|
	interpreters: interpreters$1, | 
						|
	extensions: extensions$2, | 
						|
	tmScope: tmScope$2, | 
						|
	aceMode: aceMode$2, | 
						|
	codemirrorMode: codemirrorMode$2, | 
						|
	codemirrorMimeType: codemirrorMimeType$2, | 
						|
	languageId: languageId$2 | 
						|
}; | 
						|
 | 
						|
var TypeScript$1 = /*#__PURE__*/Object.freeze({ | 
						|
  __proto__: null, | 
						|
  name: name$4, | 
						|
  type: type$2, | 
						|
  color: color$1, | 
						|
  aliases: aliases$1, | 
						|
  interpreters: interpreters$1, | 
						|
  extensions: extensions$2, | 
						|
  tmScope: tmScope$2, | 
						|
  aceMode: aceMode$2, | 
						|
  codemirrorMode: codemirrorMode$2, | 
						|
  codemirrorMimeType: codemirrorMimeType$2, | 
						|
  languageId: languageId$2, | 
						|
  'default': TypeScript | 
						|
}); | 
						|
 | 
						|
var name$5 = "TSX"; | 
						|
var type$3 = "programming"; | 
						|
var group$4 = "TypeScript"; | 
						|
var extensions$3 = [ | 
						|
	".tsx" | 
						|
]; | 
						|
var tmScope$3 = "source.tsx"; | 
						|
var aceMode$3 = "javascript"; | 
						|
var codemirrorMode$3 = "jsx"; | 
						|
var codemirrorMimeType$3 = "text/jsx"; | 
						|
var languageId$3 = 94901924; | 
						|
var TSX = { | 
						|
	name: name$5, | 
						|
	type: type$3, | 
						|
	group: group$4, | 
						|
	extensions: extensions$3, | 
						|
	tmScope: tmScope$3, | 
						|
	aceMode: aceMode$3, | 
						|
	codemirrorMode: codemirrorMode$3, | 
						|
	codemirrorMimeType: codemirrorMimeType$3, | 
						|
	languageId: languageId$3 | 
						|
}; | 
						|
 | 
						|
var TSX$1 = /*#__PURE__*/Object.freeze({ | 
						|
  __proto__: null, | 
						|
  name: name$5, | 
						|
  type: type$3, | 
						|
  group: group$4, | 
						|
  extensions: extensions$3, | 
						|
  tmScope: tmScope$3, | 
						|
  aceMode: aceMode$3, | 
						|
  codemirrorMode: codemirrorMode$3, | 
						|
  codemirrorMimeType: codemirrorMimeType$3, | 
						|
  languageId: languageId$3, | 
						|
  'default': TSX | 
						|
}); | 
						|
 | 
						|
var name$6 = "JSON"; | 
						|
var type$4 = "data"; | 
						|
var tmScope$4 = "source.json"; | 
						|
var aceMode$4 = "json"; | 
						|
var codemirrorMode$4 = "javascript"; | 
						|
var codemirrorMimeType$4 = "application/json"; | 
						|
var searchable = false; | 
						|
var extensions$4 = [ | 
						|
	".json", | 
						|
	".avsc", | 
						|
	".geojson", | 
						|
	".gltf", | 
						|
	".har", | 
						|
	".ice", | 
						|
	".JSON-tmLanguage", | 
						|
	".jsonl", | 
						|
	".mcmeta", | 
						|
	".tfstate", | 
						|
	".tfstate.backup", | 
						|
	".topojson", | 
						|
	".webapp", | 
						|
	".webmanifest", | 
						|
	".yy", | 
						|
	".yyp" | 
						|
]; | 
						|
var filenames$1 = [ | 
						|
	".arcconfig", | 
						|
	".htmlhintrc", | 
						|
	".tern-config", | 
						|
	".tern-project", | 
						|
	".watchmanconfig", | 
						|
	"composer.lock", | 
						|
	"mcmod.info" | 
						|
]; | 
						|
var languageId$4 = 174; | 
						|
var _JSON = { | 
						|
	name: name$6, | 
						|
	type: type$4, | 
						|
	tmScope: tmScope$4, | 
						|
	aceMode: aceMode$4, | 
						|
	codemirrorMode: codemirrorMode$4, | 
						|
	codemirrorMimeType: codemirrorMimeType$4, | 
						|
	searchable: searchable, | 
						|
	extensions: extensions$4, | 
						|
	filenames: filenames$1, | 
						|
	languageId: languageId$4 | 
						|
}; | 
						|
 | 
						|
var _JSON$1 = /*#__PURE__*/Object.freeze({ | 
						|
  __proto__: null, | 
						|
  name: name$6, | 
						|
  type: type$4, | 
						|
  tmScope: tmScope$4, | 
						|
  aceMode: aceMode$4, | 
						|
  codemirrorMode: codemirrorMode$4, | 
						|
  codemirrorMimeType: codemirrorMimeType$4, | 
						|
  searchable: searchable, | 
						|
  extensions: extensions$4, | 
						|
  filenames: filenames$1, | 
						|
  languageId: languageId$4, | 
						|
  'default': _JSON | 
						|
}); | 
						|
 | 
						|
var name$7 = "JSON with Comments"; | 
						|
var type$5 = "data"; | 
						|
var group$5 = "JSON"; | 
						|
var tmScope$5 = "source.js"; | 
						|
var aceMode$5 = "javascript"; | 
						|
var codemirrorMode$5 = "javascript"; | 
						|
var codemirrorMimeType$5 = "text/javascript"; | 
						|
var aliases$2 = [ | 
						|
	"jsonc" | 
						|
]; | 
						|
var extensions$5 = [ | 
						|
	".sublime-build", | 
						|
	".sublime-commands", | 
						|
	".sublime-completions", | 
						|
	".sublime-keymap", | 
						|
	".sublime-macro", | 
						|
	".sublime-menu", | 
						|
	".sublime-mousemap", | 
						|
	".sublime-project", | 
						|
	".sublime-settings", | 
						|
	".sublime-theme", | 
						|
	".sublime-workspace", | 
						|
	".sublime_metrics", | 
						|
	".sublime_session" | 
						|
]; | 
						|
var filenames$2 = [ | 
						|
	".babelrc", | 
						|
	".eslintrc.json", | 
						|
	".jscsrc", | 
						|
	".jshintrc", | 
						|
	".jslintrc", | 
						|
	"jsconfig.json", | 
						|
	"language-configuration.json", | 
						|
	"tsconfig.json" | 
						|
]; | 
						|
var languageId$5 = 423; | 
						|
var JSON_with_Comments = { | 
						|
	name: name$7, | 
						|
	type: type$5, | 
						|
	group: group$5, | 
						|
	tmScope: tmScope$5, | 
						|
	aceMode: aceMode$5, | 
						|
	codemirrorMode: codemirrorMode$5, | 
						|
	codemirrorMimeType: codemirrorMimeType$5, | 
						|
	aliases: aliases$2, | 
						|
	extensions: extensions$5, | 
						|
	filenames: filenames$2, | 
						|
	languageId: languageId$5 | 
						|
}; | 
						|
 | 
						|
var JSON_with_Comments$1 = /*#__PURE__*/Object.freeze({ | 
						|
  __proto__: null, | 
						|
  name: name$7, | 
						|
  type: type$5, | 
						|
  group: group$5, | 
						|
  tmScope: tmScope$5, | 
						|
  aceMode: aceMode$5, | 
						|
  codemirrorMode: codemirrorMode$5, | 
						|
  codemirrorMimeType: codemirrorMimeType$5, | 
						|
  aliases: aliases$2, | 
						|
  extensions: extensions$5, | 
						|
  filenames: filenames$2, | 
						|
  languageId: languageId$5, | 
						|
  'default': JSON_with_Comments | 
						|
}); | 
						|
 | 
						|
var name$8 = "JSON5"; | 
						|
var type$6 = "data"; | 
						|
var extensions$6 = [ | 
						|
	".json5" | 
						|
]; | 
						|
var tmScope$6 = "source.js"; | 
						|
var aceMode$6 = "javascript"; | 
						|
var codemirrorMode$6 = "javascript"; | 
						|
var codemirrorMimeType$6 = "application/json"; | 
						|
var languageId$6 = 175; | 
						|
var JSON5 = { | 
						|
	name: name$8, | 
						|
	type: type$6, | 
						|
	extensions: extensions$6, | 
						|
	tmScope: tmScope$6, | 
						|
	aceMode: aceMode$6, | 
						|
	codemirrorMode: codemirrorMode$6, | 
						|
	codemirrorMimeType: codemirrorMimeType$6, | 
						|
	languageId: languageId$6 | 
						|
}; | 
						|
 | 
						|
var JSON5$1 = /*#__PURE__*/Object.freeze({ | 
						|
  __proto__: null, | 
						|
  name: name$8, | 
						|
  type: type$6, | 
						|
  extensions: extensions$6, | 
						|
  tmScope: tmScope$6, | 
						|
  aceMode: aceMode$6, | 
						|
  codemirrorMode: codemirrorMode$6, | 
						|
  codemirrorMimeType: codemirrorMimeType$6, | 
						|
  languageId: languageId$6, | 
						|
  'default': JSON5 | 
						|
}); | 
						|
 | 
						|
var require$$0$1 = getCjsExportFromNamespace(JavaScript$1); | 
						|
 | 
						|
var require$$1 = getCjsExportFromNamespace(JSX$1); | 
						|
 | 
						|
var require$$2 = getCjsExportFromNamespace(TypeScript$1); | 
						|
 | 
						|
var require$$3 = getCjsExportFromNamespace(TSX$1); | 
						|
 | 
						|
var require$$4$1 = getCjsExportFromNamespace(_JSON$1); | 
						|
 | 
						|
var require$$5 = getCjsExportFromNamespace(JSON_with_Comments$1); | 
						|
 | 
						|
var require$$6 = getCjsExportFromNamespace(JSON5$1); | 
						|
 | 
						|
var languages = [createLanguage(require$$0$1, function (data) { | 
						|
  return Object.assign(data, { | 
						|
    since: "0.0.0", | 
						|
    parsers: ["babel", "flow"], | 
						|
    vscodeLanguageIds: ["javascript", "mongo"], | 
						|
    interpreters: data.interpreters.concat(["nodejs"]) | 
						|
  }); | 
						|
}), createLanguage(require$$0$1, function (data) { | 
						|
  return Object.assign(data, { | 
						|
    name: "Flow", | 
						|
    since: "0.0.0", | 
						|
    parsers: ["babel", "flow"], | 
						|
    vscodeLanguageIds: ["javascript"], | 
						|
    aliases: [], | 
						|
    filenames: [], | 
						|
    extensions: [".js.flow"] | 
						|
  }); | 
						|
}), createLanguage(require$$1, function (data) { | 
						|
  return Object.assign(data, { | 
						|
    since: "0.0.0", | 
						|
    parsers: ["babel", "flow"], | 
						|
    vscodeLanguageIds: ["javascriptreact"] | 
						|
  }); | 
						|
}), createLanguage(require$$2, function (data) { | 
						|
  return Object.assign(data, { | 
						|
    since: "1.4.0", | 
						|
    parsers: ["typescript"], | 
						|
    vscodeLanguageIds: ["typescript"] | 
						|
  }); | 
						|
}), createLanguage(require$$3, function (data) { | 
						|
  return Object.assign(data, { | 
						|
    since: "1.4.0", | 
						|
    parsers: ["typescript"], | 
						|
    vscodeLanguageIds: ["typescriptreact"] | 
						|
  }); | 
						|
}), createLanguage(require$$4$1, function (data) { | 
						|
  return Object.assign(data, { | 
						|
    name: "JSON.stringify", | 
						|
    since: "1.13.0", | 
						|
    parsers: ["json-stringify"], | 
						|
    vscodeLanguageIds: ["json"], | 
						|
    extensions: [], | 
						|
    // .json file defaults to json instead of json-stringify | 
						|
    filenames: ["package.json", "package-lock.json", "composer.json"] | 
						|
  }); | 
						|
}), createLanguage(require$$4$1, function (data) { | 
						|
  return Object.assign(data, { | 
						|
    since: "1.5.0", | 
						|
    parsers: ["json"], | 
						|
    vscodeLanguageIds: ["json"], | 
						|
    filenames: data.filenames.concat([".prettierrc"]) | 
						|
  }); | 
						|
}), createLanguage(require$$5, function (data) { | 
						|
  return Object.assign(data, { | 
						|
    since: "1.5.0", | 
						|
    parsers: ["json"], | 
						|
    vscodeLanguageIds: ["jsonc"], | 
						|
    filenames: data.filenames.concat([".eslintrc"]) | 
						|
  }); | 
						|
}), createLanguage(require$$6, function (data) { | 
						|
  return Object.assign(data, { | 
						|
    since: "1.13.0", | 
						|
    parsers: ["json5"], | 
						|
    vscodeLanguageIds: ["json5"] | 
						|
  }); | 
						|
})]; | 
						|
var printers = { | 
						|
  estree: printerEstree, | 
						|
  "estree-json": printerEstreeJson | 
						|
}; | 
						|
var languageJs = { | 
						|
  languages, | 
						|
  options: options$2, | 
						|
  printers | 
						|
}; | 
						|
 | 
						|
var index = [ | 
						|
	"a", | 
						|
	"abbr", | 
						|
	"acronym", | 
						|
	"address", | 
						|
	"applet", | 
						|
	"area", | 
						|
	"article", | 
						|
	"aside", | 
						|
	"audio", | 
						|
	"b", | 
						|
	"base", | 
						|
	"basefont", | 
						|
	"bdi", | 
						|
	"bdo", | 
						|
	"bgsound", | 
						|
	"big", | 
						|
	"blink", | 
						|
	"blockquote", | 
						|
	"body", | 
						|
	"br", | 
						|
	"button", | 
						|
	"canvas", | 
						|
	"caption", | 
						|
	"center", | 
						|
	"cite", | 
						|
	"code", | 
						|
	"col", | 
						|
	"colgroup", | 
						|
	"command", | 
						|
	"content", | 
						|
	"data", | 
						|
	"datalist", | 
						|
	"dd", | 
						|
	"del", | 
						|
	"details", | 
						|
	"dfn", | 
						|
	"dialog", | 
						|
	"dir", | 
						|
	"div", | 
						|
	"dl", | 
						|
	"dt", | 
						|
	"element", | 
						|
	"em", | 
						|
	"embed", | 
						|
	"fieldset", | 
						|
	"figcaption", | 
						|
	"figure", | 
						|
	"font", | 
						|
	"footer", | 
						|
	"form", | 
						|
	"frame", | 
						|
	"frameset", | 
						|
	"h1", | 
						|
	"h2", | 
						|
	"h3", | 
						|
	"h4", | 
						|
	"h5", | 
						|
	"h6", | 
						|
	"head", | 
						|
	"header", | 
						|
	"hgroup", | 
						|
	"hr", | 
						|
	"html", | 
						|
	"i", | 
						|
	"iframe", | 
						|
	"image", | 
						|
	"img", | 
						|
	"input", | 
						|
	"ins", | 
						|
	"isindex", | 
						|
	"kbd", | 
						|
	"keygen", | 
						|
	"label", | 
						|
	"legend", | 
						|
	"li", | 
						|
	"link", | 
						|
	"listing", | 
						|
	"main", | 
						|
	"map", | 
						|
	"mark", | 
						|
	"marquee", | 
						|
	"math", | 
						|
	"menu", | 
						|
	"menuitem", | 
						|
	"meta", | 
						|
	"meter", | 
						|
	"multicol", | 
						|
	"nav", | 
						|
	"nextid", | 
						|
	"nobr", | 
						|
	"noembed", | 
						|
	"noframes", | 
						|
	"noscript", | 
						|
	"object", | 
						|
	"ol", | 
						|
	"optgroup", | 
						|
	"option", | 
						|
	"output", | 
						|
	"p", | 
						|
	"param", | 
						|
	"picture", | 
						|
	"plaintext", | 
						|
	"pre", | 
						|
	"progress", | 
						|
	"q", | 
						|
	"rb", | 
						|
	"rbc", | 
						|
	"rp", | 
						|
	"rt", | 
						|
	"rtc", | 
						|
	"ruby", | 
						|
	"s", | 
						|
	"samp", | 
						|
	"script", | 
						|
	"section", | 
						|
	"select", | 
						|
	"shadow", | 
						|
	"slot", | 
						|
	"small", | 
						|
	"source", | 
						|
	"spacer", | 
						|
	"span", | 
						|
	"strike", | 
						|
	"strong", | 
						|
	"style", | 
						|
	"sub", | 
						|
	"summary", | 
						|
	"sup", | 
						|
	"svg", | 
						|
	"table", | 
						|
	"tbody", | 
						|
	"td", | 
						|
	"template", | 
						|
	"textarea", | 
						|
	"tfoot", | 
						|
	"th", | 
						|
	"thead", | 
						|
	"time", | 
						|
	"title", | 
						|
	"tr", | 
						|
	"track", | 
						|
	"tt", | 
						|
	"u", | 
						|
	"ul", | 
						|
	"var", | 
						|
	"video", | 
						|
	"wbr", | 
						|
	"xmp" | 
						|
]; | 
						|
 | 
						|
var htmlTagNames = /*#__PURE__*/Object.freeze({ | 
						|
  __proto__: null, | 
						|
  'default': index | 
						|
}); | 
						|
 | 
						|
var htmlTagNames$1 = getCjsExportFromNamespace(htmlTagNames); | 
						|
 | 
						|
function clean$2(ast, newObj, parent) { | 
						|
  ["raw", // front-matter | 
						|
  "raws", "sourceIndex", "source", "before", "after", "trailingComma"].forEach(function (name) { | 
						|
    delete newObj[name]; | 
						|
  }); | 
						|
 | 
						|
  if (ast.type === "yaml") { | 
						|
    delete newObj.value; | 
						|
  } // --insert-pragma | 
						|
 | 
						|
 | 
						|
  if (ast.type === "css-comment" && parent.type === "css-root" && parent.nodes.length !== 0 && ( // first non-front-matter comment | 
						|
  parent.nodes[0] === ast || (parent.nodes[0].type === "yaml" || parent.nodes[0].type === "toml") && parent.nodes[1] === ast)) { | 
						|
    /** | 
						|
     * something | 
						|
     * | 
						|
     * @format | 
						|
     */ | 
						|
    delete newObj.text; // standalone pragma | 
						|
 | 
						|
    if (/^\*\s*@(format|prettier)\s*$/.test(ast.text)) { | 
						|
      return null; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  if (ast.type === "media-query" || ast.type === "media-query-list" || ast.type === "media-feature-expression") { | 
						|
    delete newObj.value; | 
						|
  } | 
						|
 | 
						|
  if (ast.type === "css-rule") { | 
						|
    delete newObj.params; | 
						|
  } | 
						|
 | 
						|
  if (ast.type === "selector-combinator") { | 
						|
    newObj.value = newObj.value.replace(/\s+/g, " "); | 
						|
  } | 
						|
 | 
						|
  if (ast.type === "media-feature") { | 
						|
    newObj.value = newObj.value.replace(/ /g, ""); | 
						|
  } | 
						|
 | 
						|
  if (ast.type === "value-word" && (ast.isColor && ast.isHex || ["initial", "inherit", "unset", "revert"].indexOf(newObj.value.replace().toLowerCase()) !== -1) || ast.type === "media-feature" || ast.type === "selector-root-invalid" || ast.type === "selector-pseudo") { | 
						|
    newObj.value = newObj.value.toLowerCase(); | 
						|
  } | 
						|
 | 
						|
  if (ast.type === "css-decl") { | 
						|
    newObj.prop = newObj.prop.toLowerCase(); | 
						|
  } | 
						|
 | 
						|
  if (ast.type === "css-atrule" || ast.type === "css-import") { | 
						|
    newObj.name = newObj.name.toLowerCase(); | 
						|
  } | 
						|
 | 
						|
  if (ast.type === "value-number") { | 
						|
    newObj.unit = newObj.unit.toLowerCase(); | 
						|
  } | 
						|
 | 
						|
  if ((ast.type === "media-feature" || ast.type === "media-keyword" || ast.type === "media-type" || ast.type === "media-unknown" || ast.type === "media-url" || ast.type === "media-value" || ast.type === "selector-attribute" || ast.type === "selector-string" || ast.type === "selector-class" || ast.type === "selector-combinator" || ast.type === "value-string") && newObj.value) { | 
						|
    newObj.value = cleanCSSStrings(newObj.value); | 
						|
  } | 
						|
 | 
						|
  if (ast.type === "selector-attribute") { | 
						|
    newObj.attribute = newObj.attribute.trim(); | 
						|
 | 
						|
    if (newObj.namespace) { | 
						|
      if (typeof newObj.namespace === "string") { | 
						|
        newObj.namespace = newObj.namespace.trim(); | 
						|
 | 
						|
        if (newObj.namespace.length === 0) { | 
						|
          newObj.namespace = true; | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    if (newObj.value) { | 
						|
      newObj.value = newObj.value.trim().replace(/^['"]|['"]$/g, ""); | 
						|
      delete newObj.quoted; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  if ((ast.type === "media-value" || ast.type === "media-type" || ast.type === "value-number" || ast.type === "selector-root-invalid" || ast.type === "selector-class" || ast.type === "selector-combinator" || ast.type === "selector-tag") && newObj.value) { | 
						|
    newObj.value = newObj.value.replace(/([\d.eE+-]+)([a-zA-Z]*)/g, function (match, numStr, unit) { | 
						|
      var num = Number(numStr); | 
						|
      return isNaN(num) ? match : num + unit.toLowerCase(); | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  if (ast.type === "selector-tag") { | 
						|
    var lowercasedValue = ast.value.toLowerCase(); | 
						|
 | 
						|
    if (htmlTagNames$1.indexOf(lowercasedValue) !== -1) { | 
						|
      newObj.value = lowercasedValue; | 
						|
    } | 
						|
 | 
						|
    if (["from", "to"].indexOf(lowercasedValue) !== -1) { | 
						|
      newObj.value = lowercasedValue; | 
						|
    } | 
						|
  } // Workaround when `postcss-values-parser` parse `not`, `and` or `or` keywords as `value-func` | 
						|
 | 
						|
 | 
						|
  if (ast.type === "css-atrule" && ast.name.toLowerCase() === "supports") { | 
						|
    delete newObj.value; | 
						|
  } // Workaround for SCSS nested properties | 
						|
 | 
						|
 | 
						|
  if (ast.type === "selector-unknown") { | 
						|
    delete newObj.value; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function cleanCSSStrings(value) { | 
						|
  return value.replace(/'/g, '"').replace(/\\([^a-fA-F\d])/g, "$1"); | 
						|
} | 
						|
 | 
						|
var clean_1$1 = clean$2; | 
						|
 | 
						|
var _require$$0$builders$3 = doc.builders, | 
						|
    hardline$6 = _require$$0$builders$3.hardline, | 
						|
    literalline$3 = _require$$0$builders$3.literalline, | 
						|
    concat$8 = _require$$0$builders$3.concat, | 
						|
    markAsRoot$1 = _require$$0$builders$3.markAsRoot, | 
						|
    mapDoc$4 = doc.utils.mapDoc; | 
						|
 | 
						|
function embed$1(path, print, textToDoc | 
						|
/*, options */ | 
						|
) { | 
						|
  var node = path.getValue(); | 
						|
 | 
						|
  if (node.type === "yaml") { | 
						|
    return markAsRoot$1(concat$8(["---", hardline$6, node.value.trim() ? replaceNewlinesWithLiterallines(textToDoc(node.value, { | 
						|
      parser: "yaml" | 
						|
    })) : "", "---", hardline$6])); | 
						|
  } | 
						|
 | 
						|
  return null; | 
						|
 | 
						|
  function replaceNewlinesWithLiterallines(doc) { | 
						|
    return mapDoc$4(doc, function (currentDoc) { | 
						|
      return typeof currentDoc === "string" && currentDoc.includes("\n") ? concat$8(currentDoc.split(/(\n)/g).map(function (v, i) { | 
						|
        return i % 2 === 0 ? v : literalline$3; | 
						|
      })) : currentDoc; | 
						|
    }); | 
						|
  } | 
						|
} | 
						|
 | 
						|
var embed_1$1 = embed$1; | 
						|
 | 
						|
var DELIMITER_MAP = { | 
						|
  "---": "yaml", | 
						|
  "+++": "toml" | 
						|
}; | 
						|
 | 
						|
function parse$3(text) { | 
						|
  var delimiterRegex = Object.keys(DELIMITER_MAP).map(escapeStringRegexp).join("|"); | 
						|
  var match = text.match( // trailing spaces after delimiters are allowed | 
						|
  new RegExp(`^(${delimiterRegex})[^\\n\\S]*\\n(?:([\\s\\S]*?)\\n)?\\1[^\\n\\S]*(\\n|$)`)); | 
						|
 | 
						|
  if (match === null) { | 
						|
    return { | 
						|
      frontMatter: null, | 
						|
      content: text | 
						|
    }; | 
						|
  } | 
						|
 | 
						|
  var raw = match[0].replace(/\n$/, ""); | 
						|
  var delimiter = match[1]; | 
						|
  var value = match[2]; | 
						|
  return { | 
						|
    frontMatter: { | 
						|
      type: DELIMITER_MAP[delimiter], | 
						|
      value, | 
						|
      raw | 
						|
    }, | 
						|
    content: match[0].replace(/[^\n]/g, " ") + text.slice(match[0].length) | 
						|
  }; | 
						|
} | 
						|
 | 
						|
var frontMatter = parse$3; | 
						|
 | 
						|
function hasPragma$1(text) { | 
						|
  return pragma.hasPragma(frontMatter(text).content); | 
						|
} | 
						|
 | 
						|
function insertPragma$2(text) { | 
						|
  var _parseFrontMatter = frontMatter(text), | 
						|
      frontMatter$1 = _parseFrontMatter.frontMatter, | 
						|
      content = _parseFrontMatter.content; | 
						|
 | 
						|
  return (frontMatter$1 ? frontMatter$1.raw + "\n\n" : "") + pragma.insertPragma(content); | 
						|
} | 
						|
 | 
						|
var pragma$1 = { | 
						|
  hasPragma: hasPragma$1, | 
						|
  insertPragma: insertPragma$2 | 
						|
}; | 
						|
 | 
						|
var colorAdjusterFunctions = ["red", "green", "blue", "alpha", "a", "rgb", "hue", "h", "saturation", "s", "lightness", "l", "whiteness", "w", "blackness", "b", "tint", "shade", "blend", "blenda", "contrast", "hsl", "hsla", "hwb", "hwba"]; | 
						|
 | 
						|
function getAncestorCounter(path, typeOrTypes) { | 
						|
  var types = [].concat(typeOrTypes); | 
						|
  var counter = -1; | 
						|
  var ancestorNode; | 
						|
 | 
						|
  while (ancestorNode = path.getParentNode(++counter)) { | 
						|
    if (types.indexOf(ancestorNode.type) !== -1) { | 
						|
      return counter; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return -1; | 
						|
} | 
						|
 | 
						|
function getAncestorNode(path, typeOrTypes) { | 
						|
  var counter = getAncestorCounter(path, typeOrTypes); | 
						|
  return counter === -1 ? null : path.getParentNode(counter); | 
						|
} | 
						|
 | 
						|
function getPropOfDeclNode(path) { | 
						|
  var declAncestorNode = getAncestorNode(path, "css-decl"); | 
						|
  return declAncestorNode && declAncestorNode.prop && declAncestorNode.prop.toLowerCase(); | 
						|
} | 
						|
 | 
						|
function isSCSS(parser, text) { | 
						|
  var hasExplicitParserChoice = parser === "less" || parser === "scss"; | 
						|
  var IS_POSSIBLY_SCSS = /(\w\s*: [^}:]+|#){|@import[^\n]+(url|,)/; | 
						|
  return hasExplicitParserChoice ? parser === "scss" : IS_POSSIBLY_SCSS.test(text); | 
						|
} | 
						|
 | 
						|
function isWideKeywords(value) { | 
						|
  return ["initial", "inherit", "unset", "revert"].indexOf(value.toLowerCase()) !== -1; | 
						|
} | 
						|
 | 
						|
function isKeyframeAtRuleKeywords(path, value) { | 
						|
  var atRuleAncestorNode = getAncestorNode(path, "css-atrule"); | 
						|
  return atRuleAncestorNode && atRuleAncestorNode.name && atRuleAncestorNode.name.toLowerCase().endsWith("keyframes") && ["from", "to"].indexOf(value.toLowerCase()) !== -1; | 
						|
} | 
						|
 | 
						|
function maybeToLowerCase(value) { | 
						|
  return value.includes("$") || value.includes("@") || value.includes("#") || value.startsWith("%") || value.startsWith("--") || value.startsWith(":--") || value.includes("(") && value.includes(")") ? value : value.toLowerCase(); | 
						|
} | 
						|
 | 
						|
function insideValueFunctionNode(path, functionName) { | 
						|
  var funcAncestorNode = getAncestorNode(path, "value-func"); | 
						|
  return funcAncestorNode && funcAncestorNode.value && funcAncestorNode.value.toLowerCase() === functionName; | 
						|
} | 
						|
 | 
						|
function insideICSSRuleNode(path) { | 
						|
  var ruleAncestorNode = getAncestorNode(path, "css-rule"); | 
						|
  return ruleAncestorNode && ruleAncestorNode.raws && ruleAncestorNode.raws.selector && (ruleAncestorNode.raws.selector.startsWith(":import") || ruleAncestorNode.raws.selector.startsWith(":export")); | 
						|
} | 
						|
 | 
						|
function insideAtRuleNode(path, atRuleNameOrAtRuleNames) { | 
						|
  var atRuleNames = [].concat(atRuleNameOrAtRuleNames); | 
						|
  var atRuleAncestorNode = getAncestorNode(path, "css-atrule"); | 
						|
  return atRuleAncestorNode && atRuleNames.indexOf(atRuleAncestorNode.name.toLowerCase()) !== -1; | 
						|
} | 
						|
 | 
						|
function insideURLFunctionInImportAtRuleNode(path) { | 
						|
  var node = path.getValue(); | 
						|
  var atRuleAncestorNode = getAncestorNode(path, "css-atrule"); | 
						|
  return atRuleAncestorNode && atRuleAncestorNode.name === "import" && node.groups[0].value === "url" && node.groups.length === 2; | 
						|
} | 
						|
 | 
						|
function isURLFunctionNode(node) { | 
						|
  return node.type === "value-func" && node.value.toLowerCase() === "url"; | 
						|
} | 
						|
 | 
						|
function isLastNode(path, node) { | 
						|
  var parentNode = path.getParentNode(); | 
						|
 | 
						|
  if (!parentNode) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  var nodes = parentNode.nodes; | 
						|
  return nodes && nodes.indexOf(node) === nodes.length - 1; | 
						|
} | 
						|
 | 
						|
function isHTMLTag(value) { | 
						|
  return htmlTagNames$1.indexOf(value.toLowerCase()) !== -1; | 
						|
} | 
						|
 | 
						|
function isDetachedRulesetDeclarationNode(node) { | 
						|
  // If a Less file ends up being parsed with the SCSS parser, Less | 
						|
  // variable declarations will be parsed as atrules with names ending | 
						|
  // with a colon, so keep the original case then. | 
						|
  if (!node.selector) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  return typeof node.selector === "string" && /^@.+:.*$/.test(node.selector) || node.selector.value && /^@.+:.*$/.test(node.selector.value); | 
						|
} | 
						|
 | 
						|
function isForKeywordNode(node) { | 
						|
  return node.type === "value-word" && ["from", "through", "end"].indexOf(node.value) !== -1; | 
						|
} | 
						|
 | 
						|
function isIfElseKeywordNode(node) { | 
						|
  return node.type === "value-word" && ["and", "or", "not"].indexOf(node.value) !== -1; | 
						|
} | 
						|
 | 
						|
function isEachKeywordNode(node) { | 
						|
  return node.type === "value-word" && node.value === "in"; | 
						|
} | 
						|
 | 
						|
function isMultiplicationNode(node) { | 
						|
  return node.type === "value-operator" && node.value === "*"; | 
						|
} | 
						|
 | 
						|
function isDivisionNode(node) { | 
						|
  return node.type === "value-operator" && node.value === "/"; | 
						|
} | 
						|
 | 
						|
function isAdditionNode(node) { | 
						|
  return node.type === "value-operator" && node.value === "+"; | 
						|
} | 
						|
 | 
						|
function isSubtractionNode(node) { | 
						|
  return node.type === "value-operator" && node.value === "-"; | 
						|
} | 
						|
 | 
						|
function isModuloNode(node) { | 
						|
  return node.type === "value-operator" && node.value === "%"; | 
						|
} | 
						|
 | 
						|
function isMathOperatorNode(node) { | 
						|
  return isMultiplicationNode(node) || isDivisionNode(node) || isAdditionNode(node) || isSubtractionNode(node) || isModuloNode(node); | 
						|
} | 
						|
 | 
						|
function isEqualityOperatorNode(node) { | 
						|
  return node.type === "value-word" && ["==", "!="].indexOf(node.value) !== -1; | 
						|
} | 
						|
 | 
						|
function isRelationalOperatorNode(node) { | 
						|
  return node.type === "value-word" && ["<", ">", "<=", ">="].indexOf(node.value) !== -1; | 
						|
} | 
						|
 | 
						|
function isSCSSControlDirectiveNode(node) { | 
						|
  return node.type === "css-atrule" && ["if", "else", "for", "each", "while"].indexOf(node.name) !== -1; | 
						|
} | 
						|
 | 
						|
function isSCSSNestedPropertyNode(node) { | 
						|
  if (!node.selector) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  return node.selector.replace(/\/\*.*?\*\//, "").replace(/\/\/.*?\n/, "").trim().endsWith(":"); | 
						|
} | 
						|
 | 
						|
function isDetachedRulesetCallNode(node) { | 
						|
  return node.raws && node.raws.params && /^\(\s*\)$/.test(node.raws.params); | 
						|
} | 
						|
 | 
						|
function isTemplatePlaceholderNode(node) { | 
						|
  return node.name.startsWith("prettier-placeholder"); | 
						|
} | 
						|
 | 
						|
function isTemplatePropNode(node) { | 
						|
  return node.prop.startsWith("@prettier-placeholder"); | 
						|
} | 
						|
 | 
						|
function isPostcssSimpleVarNode(currentNode, nextNode) { | 
						|
  return currentNode.value === "$$" && currentNode.type === "value-func" && nextNode && nextNode.type === "value-word" && !nextNode.raws.before; | 
						|
} | 
						|
 | 
						|
function hasComposesNode(node) { | 
						|
  return node.value && node.value.type === "value-root" && node.value.group && node.value.group.type === "value-value" && node.prop.toLowerCase() === "composes"; | 
						|
} | 
						|
 | 
						|
function hasParensAroundNode(node) { | 
						|
  return node.value && node.value.group && node.value.group.group && node.value.group.group.type === "value-paren_group" && node.value.group.group.open !== null && node.value.group.group.close !== null; | 
						|
} | 
						|
 | 
						|
function hasEmptyRawBefore(node) { | 
						|
  return node.raws && node.raws.before === ""; | 
						|
} | 
						|
 | 
						|
function isKeyValuePairNode(node) { | 
						|
  return node.type === "value-comma_group" && node.groups && node.groups[1] && node.groups[1].type === "value-colon"; | 
						|
} | 
						|
 | 
						|
function isKeyValuePairInParenGroupNode(node) { | 
						|
  return node.type === "value-paren_group" && node.groups && node.groups[0] && isKeyValuePairNode(node.groups[0]); | 
						|
} | 
						|
 | 
						|
function isSCSSMapItemNode(path) { | 
						|
  var node = path.getValue(); // Ignore empty item (i.e. `$key: ()`) | 
						|
 | 
						|
  if (node.groups.length === 0) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  var parentParentNode = path.getParentNode(1); // Check open parens contain key/value pair (i.e. `(key: value)` and `(key: (value, other-value)`) | 
						|
 | 
						|
  if (!isKeyValuePairInParenGroupNode(node) && !(parentParentNode && isKeyValuePairInParenGroupNode(parentParentNode))) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  var declNode = getAncestorNode(path, "css-decl"); // SCSS map declaration (i.e. `$map: (key: value, other-key: other-value)`) | 
						|
 | 
						|
  if (declNode && declNode.prop && declNode.prop.startsWith("$")) { | 
						|
    return true; | 
						|
  } // List as value of key inside SCSS map (i.e. `$map: (key: (value other-value other-other-value))`) | 
						|
 | 
						|
 | 
						|
  if (isKeyValuePairInParenGroupNode(parentParentNode)) { | 
						|
    return true; | 
						|
  } // SCSS Map is argument of function (i.e. `func((key: value, other-key: other-value))`) | 
						|
 | 
						|
 | 
						|
  if (parentParentNode.type === "value-func") { | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function isInlineValueCommentNode(node) { | 
						|
  return node.type === "value-comment" && node.inline; | 
						|
} | 
						|
 | 
						|
function isHashNode(node) { | 
						|
  return node.type === "value-word" && node.value === "#"; | 
						|
} | 
						|
 | 
						|
function isLeftCurlyBraceNode(node) { | 
						|
  return node.type === "value-word" && node.value === "{"; | 
						|
} | 
						|
 | 
						|
function isRightCurlyBraceNode(node) { | 
						|
  return node.type === "value-word" && node.value === "}"; | 
						|
} | 
						|
 | 
						|
function isWordNode(node) { | 
						|
  return ["value-word", "value-atword"].indexOf(node.type) !== -1; | 
						|
} | 
						|
 | 
						|
function isColonNode(node) { | 
						|
  return node.type === "value-colon"; | 
						|
} | 
						|
 | 
						|
function isMediaAndSupportsKeywords(node) { | 
						|
  return node.value && ["not", "and", "or"].indexOf(node.value.toLowerCase()) !== -1; | 
						|
} | 
						|
 | 
						|
function isColorAdjusterFuncNode(node) { | 
						|
  if (node.type !== "value-func") { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  return colorAdjusterFunctions.indexOf(node.value.toLowerCase()) !== -1; | 
						|
} | 
						|
 | 
						|
var utils$3 = { | 
						|
  getAncestorCounter, | 
						|
  getAncestorNode, | 
						|
  getPropOfDeclNode, | 
						|
  maybeToLowerCase, | 
						|
  insideValueFunctionNode, | 
						|
  insideICSSRuleNode, | 
						|
  insideAtRuleNode, | 
						|
  insideURLFunctionInImportAtRuleNode, | 
						|
  isKeyframeAtRuleKeywords, | 
						|
  isHTMLTag, | 
						|
  isWideKeywords, | 
						|
  isSCSS, | 
						|
  isLastNode, | 
						|
  isSCSSControlDirectiveNode, | 
						|
  isDetachedRulesetDeclarationNode, | 
						|
  isRelationalOperatorNode, | 
						|
  isEqualityOperatorNode, | 
						|
  isMultiplicationNode, | 
						|
  isDivisionNode, | 
						|
  isAdditionNode, | 
						|
  isSubtractionNode, | 
						|
  isModuloNode, | 
						|
  isMathOperatorNode, | 
						|
  isEachKeywordNode, | 
						|
  isForKeywordNode, | 
						|
  isURLFunctionNode, | 
						|
  isIfElseKeywordNode, | 
						|
  hasComposesNode, | 
						|
  hasParensAroundNode, | 
						|
  hasEmptyRawBefore, | 
						|
  isSCSSNestedPropertyNode, | 
						|
  isDetachedRulesetCallNode, | 
						|
  isTemplatePlaceholderNode, | 
						|
  isTemplatePropNode, | 
						|
  isPostcssSimpleVarNode, | 
						|
  isKeyValuePairNode, | 
						|
  isKeyValuePairInParenGroupNode, | 
						|
  isSCSSMapItemNode, | 
						|
  isInlineValueCommentNode, | 
						|
  isHashNode, | 
						|
  isLeftCurlyBraceNode, | 
						|
  isRightCurlyBraceNode, | 
						|
  isWordNode, | 
						|
  isColonNode, | 
						|
  isMediaAndSupportsKeywords, | 
						|
  isColorAdjusterFuncNode | 
						|
}; | 
						|
 | 
						|
var insertPragma$3 = pragma$1.insertPragma; | 
						|
var printNumber$2 = util.printNumber, | 
						|
    printString$2 = util.printString, | 
						|
    hasIgnoreComment$3 = util.hasIgnoreComment, | 
						|
    hasNewline$4 = util.hasNewline; | 
						|
var isNextLineEmpty$3 = utilShared.isNextLineEmpty; | 
						|
var _require$$3$builders = doc.builders, | 
						|
    concat$9 = _require$$3$builders.concat, | 
						|
    join$6 = _require$$3$builders.join, | 
						|
    line$3 = _require$$3$builders.line, | 
						|
    hardline$7 = _require$$3$builders.hardline, | 
						|
    softline$3 = _require$$3$builders.softline, | 
						|
    group$6 = _require$$3$builders.group, | 
						|
    fill$3 = _require$$3$builders.fill, | 
						|
    indent$5 = _require$$3$builders.indent, | 
						|
    dedent$2 = _require$$3$builders.dedent, | 
						|
    ifBreak$2 = _require$$3$builders.ifBreak, | 
						|
    removeLines$2 = doc.utils.removeLines; | 
						|
var getAncestorNode$1 = utils$3.getAncestorNode, | 
						|
    getPropOfDeclNode$1 = utils$3.getPropOfDeclNode, | 
						|
    maybeToLowerCase$1 = utils$3.maybeToLowerCase, | 
						|
    insideValueFunctionNode$1 = utils$3.insideValueFunctionNode, | 
						|
    insideICSSRuleNode$1 = utils$3.insideICSSRuleNode, | 
						|
    insideAtRuleNode$1 = utils$3.insideAtRuleNode, | 
						|
    insideURLFunctionInImportAtRuleNode$1 = utils$3.insideURLFunctionInImportAtRuleNode, | 
						|
    isKeyframeAtRuleKeywords$1 = utils$3.isKeyframeAtRuleKeywords, | 
						|
    isHTMLTag$1 = utils$3.isHTMLTag, | 
						|
    isWideKeywords$1 = utils$3.isWideKeywords, | 
						|
    isSCSS$1 = utils$3.isSCSS, | 
						|
    isLastNode$1 = utils$3.isLastNode, | 
						|
    isSCSSControlDirectiveNode$1 = utils$3.isSCSSControlDirectiveNode, | 
						|
    isDetachedRulesetDeclarationNode$1 = utils$3.isDetachedRulesetDeclarationNode, | 
						|
    isRelationalOperatorNode$1 = utils$3.isRelationalOperatorNode, | 
						|
    isEqualityOperatorNode$1 = utils$3.isEqualityOperatorNode, | 
						|
    isMultiplicationNode$1 = utils$3.isMultiplicationNode, | 
						|
    isDivisionNode$1 = utils$3.isDivisionNode, | 
						|
    isAdditionNode$1 = utils$3.isAdditionNode, | 
						|
    isSubtractionNode$1 = utils$3.isSubtractionNode, | 
						|
    isMathOperatorNode$1 = utils$3.isMathOperatorNode, | 
						|
    isEachKeywordNode$1 = utils$3.isEachKeywordNode, | 
						|
    isForKeywordNode$1 = utils$3.isForKeywordNode, | 
						|
    isURLFunctionNode$1 = utils$3.isURLFunctionNode, | 
						|
    isIfElseKeywordNode$1 = utils$3.isIfElseKeywordNode, | 
						|
    hasComposesNode$1 = utils$3.hasComposesNode, | 
						|
    hasParensAroundNode$1 = utils$3.hasParensAroundNode, | 
						|
    hasEmptyRawBefore$1 = utils$3.hasEmptyRawBefore, | 
						|
    isKeyValuePairNode$1 = utils$3.isKeyValuePairNode, | 
						|
    isDetachedRulesetCallNode$1 = utils$3.isDetachedRulesetCallNode, | 
						|
    isTemplatePlaceholderNode$1 = utils$3.isTemplatePlaceholderNode, | 
						|
    isTemplatePropNode$1 = utils$3.isTemplatePropNode, | 
						|
    isPostcssSimpleVarNode$1 = utils$3.isPostcssSimpleVarNode, | 
						|
    isSCSSMapItemNode$1 = utils$3.isSCSSMapItemNode, | 
						|
    isInlineValueCommentNode$1 = utils$3.isInlineValueCommentNode, | 
						|
    isHashNode$1 = utils$3.isHashNode, | 
						|
    isLeftCurlyBraceNode$1 = utils$3.isLeftCurlyBraceNode, | 
						|
    isRightCurlyBraceNode$1 = utils$3.isRightCurlyBraceNode, | 
						|
    isWordNode$1 = utils$3.isWordNode, | 
						|
    isColonNode$1 = utils$3.isColonNode, | 
						|
    isMediaAndSupportsKeywords$1 = utils$3.isMediaAndSupportsKeywords, | 
						|
    isColorAdjusterFuncNode$1 = utils$3.isColorAdjusterFuncNode; | 
						|
 | 
						|
function shouldPrintComma$1(options) { | 
						|
  switch (options.trailingComma) { | 
						|
    case "all": | 
						|
    case "es5": | 
						|
      return true; | 
						|
 | 
						|
    case "none": | 
						|
    default: | 
						|
      return false; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function genericPrint$2(path, options, print) { | 
						|
  var node = path.getValue(); | 
						|
  /* istanbul ignore if */ | 
						|
 | 
						|
  if (!node) { | 
						|
    return ""; | 
						|
  } | 
						|
 | 
						|
  if (typeof node === "string") { | 
						|
    return node; | 
						|
  } | 
						|
 | 
						|
  switch (node.type) { | 
						|
    case "yaml": | 
						|
    case "toml": | 
						|
      return concat$9([node.raw, hardline$7]); | 
						|
 | 
						|
    case "css-root": | 
						|
      { | 
						|
        var nodes = printNodeSequence(path, options, print); | 
						|
 | 
						|
        if (nodes.parts.length) { | 
						|
          return concat$9([nodes, hardline$7]); | 
						|
        } | 
						|
 | 
						|
        return nodes; | 
						|
      } | 
						|
 | 
						|
    case "css-comment": | 
						|
      { | 
						|
        if (node.raws.content) { | 
						|
          return node.raws.content; | 
						|
        } | 
						|
 | 
						|
        var text = options.originalText.slice(options.locStart(node), options.locEnd(node)); | 
						|
        var rawText = node.raws.text || node.text; // Workaround a bug where the location is off. | 
						|
        // https://github.com/postcss/postcss-scss/issues/63 | 
						|
 | 
						|
        if (text.indexOf(rawText) === -1) { | 
						|
          if (node.raws.inline) { | 
						|
            return concat$9(["// ", rawText]); | 
						|
          } | 
						|
 | 
						|
          return concat$9(["/* ", rawText, " */"]); | 
						|
        } | 
						|
 | 
						|
        return text; | 
						|
      } | 
						|
 | 
						|
    case "css-rule": | 
						|
      { | 
						|
        return concat$9([path.call(print, "selector"), node.important ? " !important" : "", node.nodes ? concat$9([" {", node.nodes.length > 0 ? indent$5(concat$9([hardline$7, printNodeSequence(path, options, print)])) : "", hardline$7, "}", isDetachedRulesetDeclarationNode$1(node) ? ";" : ""]) : ";"]); | 
						|
      } | 
						|
 | 
						|
    case "css-decl": | 
						|
      { | 
						|
        var parentNode = path.getParentNode(); | 
						|
        return concat$9([node.raws.before.replace(/[\s;]/g, ""), insideICSSRuleNode$1(path) ? node.prop : maybeToLowerCase$1(node.prop), node.raws.between.trim() === ":" ? ":" : node.raws.between.trim(), node.extend ? "" : " ", hasComposesNode$1(node) ? removeLines$2(path.call(print, "value")) : path.call(print, "value"), node.raws.important ? node.raws.important.replace(/\s*!\s*important/i, " !important") : node.important ? " !important" : "", node.raws.scssDefault ? node.raws.scssDefault.replace(/\s*!default/i, " !default") : node.scssDefault ? " !default" : "", node.raws.scssGlobal ? node.raws.scssGlobal.replace(/\s*!global/i, " !global") : node.scssGlobal ? " !global" : "", node.nodes ? concat$9([" {", indent$5(concat$9([softline$3, printNodeSequence(path, options, print)])), softline$3, "}"]) : isTemplatePropNode$1(node) && !parentNode.raws.semicolon && options.originalText[options.locEnd(node) - 1] !== ";" ? "" : ";"]); | 
						|
      } | 
						|
 | 
						|
    case "css-atrule": | 
						|
      { | 
						|
        var _parentNode = path.getParentNode(); | 
						|
 | 
						|
        return concat$9(["@", // If a Less file ends up being parsed with the SCSS parser, Less | 
						|
        // variable declarations will be parsed as at-rules with names ending | 
						|
        // with a colon, so keep the original case then. | 
						|
        isDetachedRulesetCallNode$1(node) || node.name.endsWith(":") ? node.name : maybeToLowerCase$1(node.name), node.params ? concat$9([isDetachedRulesetCallNode$1(node) ? "" : isTemplatePlaceholderNode$1(node) && /^\s*\n/.test(node.raws.afterName) ? /^\s*\n\s*\n/.test(node.raws.afterName) ? concat$9([hardline$7, hardline$7]) : hardline$7 : " ", path.call(print, "params")]) : "", node.selector ? indent$5(concat$9([" ", path.call(print, "selector")])) : "", node.value ? group$6(concat$9([" ", path.call(print, "value"), isSCSSControlDirectiveNode$1(node) ? hasParensAroundNode$1(node) ? " " : line$3 : ""])) : node.name === "else" ? " " : "", node.nodes ? concat$9([isSCSSControlDirectiveNode$1(node) ? "" : " ", "{", indent$5(concat$9([node.nodes.length > 0 ? softline$3 : "", printNodeSequence(path, options, print)])), softline$3, "}"]) : isTemplatePlaceholderNode$1(node) && !_parentNode.raws.semicolon && options.originalText[options.locEnd(node) - 1] !== ";" ? "" : ";"]); | 
						|
      } | 
						|
    // postcss-media-query-parser | 
						|
 | 
						|
    case "media-query-list": | 
						|
      { | 
						|
        var parts = []; | 
						|
        path.each(function (childPath) { | 
						|
          var node = childPath.getValue(); | 
						|
 | 
						|
          if (node.type === "media-query" && node.value === "") { | 
						|
            return; | 
						|
          } | 
						|
 | 
						|
          parts.push(childPath.call(print)); | 
						|
        }, "nodes"); | 
						|
        return group$6(indent$5(join$6(line$3, parts))); | 
						|
      } | 
						|
 | 
						|
    case "media-query": | 
						|
      { | 
						|
        return concat$9([join$6(" ", path.map(print, "nodes")), isLastNode$1(path, node) ? "" : ","]); | 
						|
      } | 
						|
 | 
						|
    case "media-type": | 
						|
      { | 
						|
        return adjustNumbers(adjustStrings(node.value, options)); | 
						|
      } | 
						|
 | 
						|
    case "media-feature-expression": | 
						|
      { | 
						|
        if (!node.nodes) { | 
						|
          return node.value; | 
						|
        } | 
						|
 | 
						|
        return concat$9(["(", concat$9(path.map(print, "nodes")), ")"]); | 
						|
      } | 
						|
 | 
						|
    case "media-feature": | 
						|
      { | 
						|
        return maybeToLowerCase$1(adjustStrings(node.value.replace(/ +/g, " "), options)); | 
						|
      } | 
						|
 | 
						|
    case "media-colon": | 
						|
      { | 
						|
        return concat$9([node.value, " "]); | 
						|
      } | 
						|
 | 
						|
    case "media-value": | 
						|
      { | 
						|
        return adjustNumbers(adjustStrings(node.value, options)); | 
						|
      } | 
						|
 | 
						|
    case "media-keyword": | 
						|
      { | 
						|
        return adjustStrings(node.value, options); | 
						|
      } | 
						|
 | 
						|
    case "media-url": | 
						|
      { | 
						|
        return adjustStrings(node.value.replace(/^url\(\s+/gi, "url(").replace(/\s+\)$/gi, ")"), options); | 
						|
      } | 
						|
 | 
						|
    case "media-unknown": | 
						|
      { | 
						|
        return node.value; | 
						|
      } | 
						|
    // postcss-selector-parser | 
						|
 | 
						|
    case "selector-root": | 
						|
      { | 
						|
        return group$6(concat$9([insideAtRuleNode$1(path, "custom-selector") ? concat$9([getAncestorNode$1(path, "css-atrule").customSelector, line$3]) : "", join$6(concat$9([",", insideAtRuleNode$1(path, ["extend", "custom-selector", "nest"]) ? line$3 : hardline$7]), path.map(print, "nodes"))])); | 
						|
      } | 
						|
 | 
						|
    case "selector-selector": | 
						|
      { | 
						|
        return group$6(indent$5(concat$9(path.map(print, "nodes")))); | 
						|
      } | 
						|
 | 
						|
    case "selector-comment": | 
						|
      { | 
						|
        return node.value; | 
						|
      } | 
						|
 | 
						|
    case "selector-string": | 
						|
      { | 
						|
        return adjustStrings(node.value, options); | 
						|
      } | 
						|
 | 
						|
    case "selector-tag": | 
						|
      { | 
						|
        var _parentNode2 = path.getParentNode(); | 
						|
 | 
						|
        var index = _parentNode2 && _parentNode2.nodes.indexOf(node); | 
						|
 | 
						|
        var prevNode = index && _parentNode2.nodes[index - 1]; | 
						|
        return concat$9([node.namespace ? concat$9([node.namespace === true ? "" : node.namespace.trim(), "|"]) : "", prevNode.type === "selector-nesting" ? node.value : adjustNumbers(isHTMLTag$1(node.value) || isKeyframeAtRuleKeywords$1(path, node.value) ? node.value.toLowerCase() : node.value)]); | 
						|
      } | 
						|
 | 
						|
    case "selector-id": | 
						|
      { | 
						|
        return concat$9(["#", node.value]); | 
						|
      } | 
						|
 | 
						|
    case "selector-class": | 
						|
      { | 
						|
        return concat$9([".", adjustNumbers(adjustStrings(node.value, options))]); | 
						|
      } | 
						|
 | 
						|
    case "selector-attribute": | 
						|
      { | 
						|
        return concat$9(["[", node.namespace ? concat$9([node.namespace === true ? "" : node.namespace.trim(), "|"]) : "", node.attribute.trim(), node.operator ? node.operator : "", node.value ? quoteAttributeValue(adjustStrings(node.value.trim(), options), options) : "", node.insensitive ? " i" : "", "]"]); | 
						|
      } | 
						|
 | 
						|
    case "selector-combinator": | 
						|
      { | 
						|
        if (node.value === "+" || node.value === ">" || node.value === "~" || node.value === ">>>") { | 
						|
          var _parentNode3 = path.getParentNode(); | 
						|
 | 
						|
          var _leading = _parentNode3.type === "selector-selector" && _parentNode3.nodes[0] === node ? "" : line$3; | 
						|
 | 
						|
          return concat$9([_leading, node.value, isLastNode$1(path, node) ? "" : " "]); | 
						|
        } | 
						|
 | 
						|
        var leading = node.value.trim().startsWith("(") ? line$3 : ""; | 
						|
        var value = adjustNumbers(adjustStrings(node.value.trim(), options)) || line$3; | 
						|
        return concat$9([leading, value]); | 
						|
      } | 
						|
 | 
						|
    case "selector-universal": | 
						|
      { | 
						|
        return concat$9([node.namespace ? concat$9([node.namespace === true ? "" : node.namespace.trim(), "|"]) : "", node.value]); | 
						|
      } | 
						|
 | 
						|
    case "selector-pseudo": | 
						|
      { | 
						|
        return concat$9([maybeToLowerCase$1(node.value), node.nodes && node.nodes.length > 0 ? concat$9(["(", join$6(", ", path.map(print, "nodes")), ")"]) : ""]); | 
						|
      } | 
						|
 | 
						|
    case "selector-nesting": | 
						|
      { | 
						|
        return node.value; | 
						|
      } | 
						|
 | 
						|
    case "selector-unknown": | 
						|
      { | 
						|
        var ruleAncestorNode = getAncestorNode$1(path, "css-rule"); // Nested SCSS property | 
						|
 | 
						|
        if (ruleAncestorNode && ruleAncestorNode.isSCSSNesterProperty) { | 
						|
          return adjustNumbers(adjustStrings(maybeToLowerCase$1(node.value), options)); | 
						|
        } | 
						|
 | 
						|
        return node.value; | 
						|
      } | 
						|
    // postcss-values-parser | 
						|
 | 
						|
    case "value-value": | 
						|
    case "value-root": | 
						|
      { | 
						|
        return path.call(print, "group"); | 
						|
      } | 
						|
 | 
						|
    case "value-comment": | 
						|
      { | 
						|
        return concat$9([node.inline ? "//" : "/*", node.value, node.inline ? "" : "*/"]); | 
						|
      } | 
						|
 | 
						|
    case "value-comma_group": | 
						|
      { | 
						|
        var _parentNode4 = path.getParentNode(); | 
						|
 | 
						|
        var parentParentNode = path.getParentNode(1); | 
						|
        var declAncestorProp = getPropOfDeclNode$1(path); | 
						|
        var isGridValue = declAncestorProp && _parentNode4.type === "value-value" && (declAncestorProp === "grid" || declAncestorProp.startsWith("grid-template")); | 
						|
        var atRuleAncestorNode = getAncestorNode$1(path, "css-atrule"); | 
						|
        var isControlDirective = atRuleAncestorNode && isSCSSControlDirectiveNode$1(atRuleAncestorNode); | 
						|
        var printed = path.map(print, "groups"); | 
						|
        var _parts = []; | 
						|
        var insideURLFunction = insideValueFunctionNode$1(path, "url"); | 
						|
        var insideSCSSInterpolationInString = false; | 
						|
        var didBreak = false; | 
						|
 | 
						|
        for (var i = 0; i < node.groups.length; ++i) { | 
						|
          _parts.push(printed[i]); // Ignore value inside `url()` | 
						|
 | 
						|
 | 
						|
          if (insideURLFunction) { | 
						|
            continue; | 
						|
          } | 
						|
 | 
						|
          var iPrevNode = node.groups[i - 1]; | 
						|
          var iNode = node.groups[i]; | 
						|
          var iNextNode = node.groups[i + 1]; | 
						|
          var iNextNextNode = node.groups[i + 2]; // Ignore after latest node (i.e. before semicolon) | 
						|
 | 
						|
          if (!iNextNode) { | 
						|
            continue; | 
						|
          } // Ignore spaces before/after string interpolation (i.e. `"#{my-fn("_")}"`) | 
						|
 | 
						|
 | 
						|
          var isStartSCSSInterpolationInString = iNode.type === "value-string" && iNode.value.startsWith("#{"); | 
						|
          var isEndingSCSSInterpolationInString = insideSCSSInterpolationInString && iNextNode.type === "value-string" && iNextNode.value.endsWith("}"); | 
						|
 | 
						|
          if (isStartSCSSInterpolationInString || isEndingSCSSInterpolationInString) { | 
						|
            insideSCSSInterpolationInString = !insideSCSSInterpolationInString; | 
						|
            continue; | 
						|
          } | 
						|
 | 
						|
          if (insideSCSSInterpolationInString) { | 
						|
            continue; | 
						|
          } // Ignore colon (i.e. `:`) | 
						|
 | 
						|
 | 
						|
          if (isColonNode$1(iNode) || isColonNode$1(iNextNode)) { | 
						|
            continue; | 
						|
          } // Ignore `@` in Less (i.e. `@@var;`) | 
						|
 | 
						|
 | 
						|
          if (iNode.type === "value-atword" && iNode.value === "") { | 
						|
            continue; | 
						|
          } // Ignore `~` in Less (i.e. `content: ~"^//* some horrible but needed css hack";`) | 
						|
 | 
						|
 | 
						|
          if (iNode.value === "~") { | 
						|
            continue; | 
						|
          } // Ignore escape `\` | 
						|
 | 
						|
 | 
						|
          if (iNode.value && iNode.value.indexOf("\\") !== -1 && iNextNode && iNextNode.type !== "value-comment") { | 
						|
            continue; | 
						|
          } // Ignore escaped `/` | 
						|
 | 
						|
 | 
						|
          if (iPrevNode && iPrevNode.value && iPrevNode.value.indexOf("\\") === iPrevNode.value.length - 1 && iNode.type === "value-operator" && iNode.value === "/") { | 
						|
            continue; | 
						|
          } // Ignore `\` (i.e. `$variable: \@small;`) | 
						|
 | 
						|
 | 
						|
          if (iNode.value === "\\") { | 
						|
            continue; | 
						|
          } // Ignore `$$` (i.e. `background-color: $$(style)Color;`) | 
						|
 | 
						|
 | 
						|
          if (isPostcssSimpleVarNode$1(iNode, iNextNode)) { | 
						|
            continue; | 
						|
          } // Ignore spaces after `#` and after `{` and before `}` in SCSS interpolation (i.e. `#{variable}`) | 
						|
 | 
						|
 | 
						|
          if (isHashNode$1(iNode) || isLeftCurlyBraceNode$1(iNode) || isRightCurlyBraceNode$1(iNextNode) || isLeftCurlyBraceNode$1(iNextNode) && hasEmptyRawBefore$1(iNextNode) || isRightCurlyBraceNode$1(iNode) && hasEmptyRawBefore$1(iNextNode)) { | 
						|
            continue; | 
						|
          } // Ignore css variables and interpolation in SCSS (i.e. `--#{$var}`) | 
						|
 | 
						|
 | 
						|
          if (iNode.value === "--" && isHashNode$1(iNextNode)) { | 
						|
            continue; | 
						|
          } // Formatting math operations | 
						|
 | 
						|
 | 
						|
          var isMathOperator = isMathOperatorNode$1(iNode); | 
						|
          var isNextMathOperator = isMathOperatorNode$1(iNextNode); // Print spaces before and after math operators beside SCSS interpolation as is | 
						|
          // (i.e. `#{$var}+5`, `#{$var} +5`, `#{$var}+ 5`, `#{$var} + 5`) | 
						|
          // (i.e. `5+#{$var}`, `5 +#{$var}`, `5+ #{$var}`, `5 + #{$var}`) | 
						|
 | 
						|
          if ((isMathOperator && isHashNode$1(iNextNode) || isNextMathOperator && isRightCurlyBraceNode$1(iNode)) && hasEmptyRawBefore$1(iNextNode)) { | 
						|
            continue; | 
						|
          } // Print spaces before and after addition and subtraction math operators as is in `calc` function | 
						|
          // due to the fact that it is not valid syntax | 
						|
          // (i.e. `calc(1px+1px)`, `calc(1px+ 1px)`, `calc(1px +1px)`, `calc(1px + 1px)`) | 
						|
 | 
						|
 | 
						|
          if (insideValueFunctionNode$1(path, "calc") && (isAdditionNode$1(iNode) || isAdditionNode$1(iNextNode) || isSubtractionNode$1(iNode) || isSubtractionNode$1(iNextNode)) && hasEmptyRawBefore$1(iNextNode)) { | 
						|
            continue; | 
						|
          } // Print spaces after `+` and `-` in color adjuster functions as is (e.g. `color(red l(+ 20%))`) | 
						|
          // Adjusters with signed numbers (e.g. `color(red l(+20%))`) output as-is. | 
						|
 | 
						|
 | 
						|
          var isColorAdjusterNode = (isAdditionNode$1(iNode) || isSubtractionNode$1(iNode)) && i === 0 && (iNextNode.type === "value-number" || iNextNode.isHex) && parentParentNode && isColorAdjusterFuncNode$1(parentParentNode) && !hasEmptyRawBefore$1(iNextNode); | 
						|
          var requireSpaceBeforeOperator = iNextNextNode && iNextNextNode.type === "value-func" || iNextNextNode && isWordNode$1(iNextNextNode) || iNode.type === "value-func" || isWordNode$1(iNode); | 
						|
          var requireSpaceAfterOperator = iNextNode.type === "value-func" || isWordNode$1(iNextNode) || iPrevNode && iPrevNode.type === "value-func" || iPrevNode && isWordNode$1(iPrevNode); // Formatting `/`, `+`, `-` sign | 
						|
 | 
						|
          if (!(isMultiplicationNode$1(iNextNode) || isMultiplicationNode$1(iNode)) && !insideValueFunctionNode$1(path, "calc") && !isColorAdjusterNode && (isDivisionNode$1(iNextNode) && !requireSpaceBeforeOperator || isDivisionNode$1(iNode) && !requireSpaceAfterOperator || isAdditionNode$1(iNextNode) && !requireSpaceBeforeOperator || isAdditionNode$1(iNode) && !requireSpaceAfterOperator || isSubtractionNode$1(iNextNode) || isSubtractionNode$1(iNode)) && (hasEmptyRawBefore$1(iNextNode) || isMathOperator && (!iPrevNode || iPrevNode && isMathOperatorNode$1(iPrevNode)))) { | 
						|
            continue; | 
						|
          } // Add `hardline` after inline comment (i.e. `// comment\n foo: bar;`) | 
						|
 | 
						|
 | 
						|
          if (isInlineValueCommentNode$1(iNode)) { | 
						|
            _parts.push(hardline$7); | 
						|
 | 
						|
            continue; | 
						|
          } // Handle keywords in SCSS control directive | 
						|
 | 
						|
 | 
						|
          if (isControlDirective && (isEqualityOperatorNode$1(iNextNode) || isRelationalOperatorNode$1(iNextNode) || isIfElseKeywordNode$1(iNextNode) || isEachKeywordNode$1(iNode) || isForKeywordNode$1(iNode))) { | 
						|
            _parts.push(" "); | 
						|
 | 
						|
            continue; | 
						|
          } // At-rule `namespace` should be in one line | 
						|
 | 
						|
 | 
						|
          if (atRuleAncestorNode && atRuleAncestorNode.name.toLowerCase() === "namespace") { | 
						|
            _parts.push(" "); | 
						|
 | 
						|
            continue; | 
						|
          } // Formatting `grid` property | 
						|
 | 
						|
 | 
						|
          if (isGridValue) { | 
						|
            if (iNode.source && iNextNode.source && iNode.source.start.line !== iNextNode.source.start.line) { | 
						|
              _parts.push(hardline$7); | 
						|
 | 
						|
              didBreak = true; | 
						|
            } else { | 
						|
              _parts.push(" "); | 
						|
            } | 
						|
 | 
						|
            continue; | 
						|
          } // Add `space` before next math operation | 
						|
          // Note: `grip` property have `/` delimiter and it is not math operation, so | 
						|
          // `grid` property handles above | 
						|
 | 
						|
 | 
						|
          if (isNextMathOperator) { | 
						|
            _parts.push(" "); | 
						|
 | 
						|
            continue; | 
						|
          } // Be default all values go through `line` | 
						|
 | 
						|
 | 
						|
          _parts.push(line$3); | 
						|
        } | 
						|
 | 
						|
        if (didBreak) { | 
						|
          _parts.unshift(hardline$7); | 
						|
        } | 
						|
 | 
						|
        if (isControlDirective) { | 
						|
          return group$6(indent$5(concat$9(_parts))); | 
						|
        } // Indent is not needed for import url when url is very long | 
						|
        // and node has two groups | 
						|
        // when type is value-comma_group | 
						|
        // example @import url("verylongurl") projection,tv | 
						|
 | 
						|
 | 
						|
        if (insideURLFunctionInImportAtRuleNode$1(path)) { | 
						|
          return group$6(fill$3(_parts)); | 
						|
        } | 
						|
 | 
						|
        return group$6(indent$5(fill$3(_parts))); | 
						|
      } | 
						|
 | 
						|
    case "value-paren_group": | 
						|
      { | 
						|
        var _parentNode5 = path.getParentNode(); | 
						|
 | 
						|
        if (_parentNode5 && isURLFunctionNode$1(_parentNode5) && (node.groups.length === 1 || node.groups.length > 0 && node.groups[0].type === "value-comma_group" && node.groups[0].groups.length > 0 && node.groups[0].groups[0].type === "value-word" && node.groups[0].groups[0].value.startsWith("data:"))) { | 
						|
          return concat$9([node.open ? path.call(print, "open") : "", join$6(",", path.map(print, "groups")), node.close ? path.call(print, "close") : ""]); | 
						|
        } | 
						|
 | 
						|
        if (!node.open) { | 
						|
          var _printed = path.map(print, "groups"); | 
						|
 | 
						|
          var res = []; | 
						|
 | 
						|
          for (var _i = 0; _i < _printed.length; _i++) { | 
						|
            if (_i !== 0) { | 
						|
              res.push(concat$9([",", line$3])); | 
						|
            } | 
						|
 | 
						|
            res.push(_printed[_i]); | 
						|
          } | 
						|
 | 
						|
          return group$6(indent$5(fill$3(res))); | 
						|
        } | 
						|
 | 
						|
        var isSCSSMapItem = isSCSSMapItemNode$1(path); | 
						|
        return group$6(concat$9([node.open ? path.call(print, "open") : "", indent$5(concat$9([softline$3, join$6(concat$9([",", line$3]), path.map(function (childPath) { | 
						|
          var node = childPath.getValue(); | 
						|
          var printed = print(childPath); // Key/Value pair in open paren already indented | 
						|
 | 
						|
          if (isKeyValuePairNode$1(node) && node.type === "value-comma_group" && node.groups && node.groups[2] && node.groups[2].type === "value-paren_group") { | 
						|
            printed.contents.contents.parts[1] = group$6(printed.contents.contents.parts[1]); | 
						|
            return group$6(dedent$2(printed)); | 
						|
          } | 
						|
 | 
						|
          return printed; | 
						|
        }, "groups"))])), ifBreak$2(isSCSS$1(options.parser, options.originalText) && isSCSSMapItem && shouldPrintComma$1(options) ? "," : ""), softline$3, node.close ? path.call(print, "close") : ""]), { | 
						|
          shouldBreak: isSCSSMapItem | 
						|
        }); | 
						|
      } | 
						|
 | 
						|
    case "value-func": | 
						|
      { | 
						|
        return concat$9([node.value, insideAtRuleNode$1(path, "supports") && isMediaAndSupportsKeywords$1(node) ? " " : "", path.call(print, "group")]); | 
						|
      } | 
						|
 | 
						|
    case "value-paren": | 
						|
      { | 
						|
        return node.value; | 
						|
      } | 
						|
 | 
						|
    case "value-number": | 
						|
      { | 
						|
        return concat$9([printCssNumber(node.value), maybeToLowerCase$1(node.unit)]); | 
						|
      } | 
						|
 | 
						|
    case "value-operator": | 
						|
      { | 
						|
        return node.value; | 
						|
      } | 
						|
 | 
						|
    case "value-word": | 
						|
      { | 
						|
        if (node.isColor && node.isHex || isWideKeywords$1(node.value)) { | 
						|
          return node.value.toLowerCase(); | 
						|
        } | 
						|
 | 
						|
        return node.value; | 
						|
      } | 
						|
 | 
						|
    case "value-colon": | 
						|
      { | 
						|
        return concat$9([node.value, // Don't add spaces on `:` in `url` function (i.e. `url(fbglyph: cross-outline, fig-white)`) | 
						|
        insideValueFunctionNode$1(path, "url") ? "" : line$3]); | 
						|
      } | 
						|
 | 
						|
    case "value-comma": | 
						|
      { | 
						|
        return concat$9([node.value, " "]); | 
						|
      } | 
						|
 | 
						|
    case "value-string": | 
						|
      { | 
						|
        return printString$2(node.raws.quote + node.value + node.raws.quote, options); | 
						|
      } | 
						|
 | 
						|
    case "value-atword": | 
						|
      { | 
						|
        return concat$9(["@", node.value]); | 
						|
      } | 
						|
 | 
						|
    case "value-unicode-range": | 
						|
      { | 
						|
        return node.value; | 
						|
      } | 
						|
 | 
						|
    case "value-unknown": | 
						|
      { | 
						|
        return node.value; | 
						|
      } | 
						|
 | 
						|
    default: | 
						|
      /* istanbul ignore next */ | 
						|
      throw new Error(`Unknown postcss type ${JSON.stringify(node.type)}`); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function printNodeSequence(path, options, print) { | 
						|
  var node = path.getValue(); | 
						|
  var parts = []; | 
						|
  var i = 0; | 
						|
  path.map(function (pathChild) { | 
						|
    var prevNode = node.nodes[i - 1]; | 
						|
 | 
						|
    if (prevNode && prevNode.type === "css-comment" && prevNode.text.trim() === "prettier-ignore") { | 
						|
      var childNode = pathChild.getValue(); | 
						|
      parts.push(options.originalText.slice(options.locStart(childNode), options.locEnd(childNode))); | 
						|
    } else { | 
						|
      parts.push(pathChild.call(print)); | 
						|
    } | 
						|
 | 
						|
    if (i !== node.nodes.length - 1) { | 
						|
      if (node.nodes[i + 1].type === "css-comment" && !hasNewline$4(options.originalText, options.locStart(node.nodes[i + 1]), { | 
						|
        backwards: true | 
						|
      }) && node.nodes[i].type !== "yaml" && node.nodes[i].type !== "toml" || node.nodes[i + 1].type === "css-atrule" && node.nodes[i + 1].name === "else" && node.nodes[i].type !== "css-comment") { | 
						|
        parts.push(" "); | 
						|
      } else { | 
						|
        parts.push(hardline$7); | 
						|
 | 
						|
        if (isNextLineEmpty$3(options.originalText, pathChild.getValue(), options) && node.nodes[i].type !== "yaml" && node.nodes[i].type !== "toml") { | 
						|
          parts.push(hardline$7); | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    i++; | 
						|
  }, "nodes"); | 
						|
  return concat$9(parts); | 
						|
} | 
						|
 | 
						|
var STRING_REGEX$1 = /(['"])(?:(?!\1)[^\\]|\\[\s\S])*\1/g; | 
						|
var NUMBER_REGEX = /(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?/g; | 
						|
var STANDARD_UNIT_REGEX = /[a-zA-Z]+/g; | 
						|
var WORD_PART_REGEX = /[$@]?[a-zA-Z_\u0080-\uFFFF][\w\-\u0080-\uFFFF]*/g; | 
						|
var ADJUST_NUMBERS_REGEX = RegExp(STRING_REGEX$1.source + `|` + `(${WORD_PART_REGEX.source})?` + `(${NUMBER_REGEX.source})` + `(${STANDARD_UNIT_REGEX.source})?`, "g"); | 
						|
 | 
						|
function adjustStrings(value, options) { | 
						|
  return value.replace(STRING_REGEX$1, function (match) { | 
						|
    return printString$2(match, options); | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function quoteAttributeValue(value, options) { | 
						|
  var quote = options.singleQuote ? "'" : '"'; | 
						|
  return value.includes('"') || value.includes("'") ? value : quote + value + quote; | 
						|
} | 
						|
 | 
						|
function adjustNumbers(value) { | 
						|
  return value.replace(ADJUST_NUMBERS_REGEX, function (match, quote, wordPart, number, unit) { | 
						|
    return !wordPart && number ? (wordPart || "") + printCssNumber(number) + maybeToLowerCase$1(unit || "") : match; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function printCssNumber(rawNumber) { | 
						|
  return printNumber$2(rawNumber) // Remove trailing `.0`. | 
						|
  .replace(/\.0(?=$|e)/, ""); | 
						|
} | 
						|
 | 
						|
var printerPostcss = { | 
						|
  print: genericPrint$2, | 
						|
  embed: embed_1$1, | 
						|
  insertPragma: insertPragma$3, | 
						|
  hasPrettierIgnore: hasIgnoreComment$3, | 
						|
  massageAstNode: clean_1$1 | 
						|
}; | 
						|
 | 
						|
var options$3 = { | 
						|
  singleQuote: commonOptions.singleQuote | 
						|
}; | 
						|
 | 
						|
var name$9 = "CSS"; | 
						|
var type$7 = "markup"; | 
						|
var tmScope$7 = "source.css"; | 
						|
var aceMode$7 = "css"; | 
						|
var codemirrorMode$7 = "css"; | 
						|
var codemirrorMimeType$7 = "text/css"; | 
						|
var color$2 = "#563d7c"; | 
						|
var extensions$7 = [ | 
						|
	".css" | 
						|
]; | 
						|
var languageId$7 = 50; | 
						|
var CSS = { | 
						|
	name: name$9, | 
						|
	type: type$7, | 
						|
	tmScope: tmScope$7, | 
						|
	aceMode: aceMode$7, | 
						|
	codemirrorMode: codemirrorMode$7, | 
						|
	codemirrorMimeType: codemirrorMimeType$7, | 
						|
	color: color$2, | 
						|
	extensions: extensions$7, | 
						|
	languageId: languageId$7 | 
						|
}; | 
						|
 | 
						|
var CSS$1 = /*#__PURE__*/Object.freeze({ | 
						|
  __proto__: null, | 
						|
  name: name$9, | 
						|
  type: type$7, | 
						|
  tmScope: tmScope$7, | 
						|
  aceMode: aceMode$7, | 
						|
  codemirrorMode: codemirrorMode$7, | 
						|
  codemirrorMimeType: codemirrorMimeType$7, | 
						|
  color: color$2, | 
						|
  extensions: extensions$7, | 
						|
  languageId: languageId$7, | 
						|
  'default': CSS | 
						|
}); | 
						|
 | 
						|
var name$a = "PostCSS"; | 
						|
var type$8 = "markup"; | 
						|
var tmScope$8 = "source.postcss"; | 
						|
var group$7 = "CSS"; | 
						|
var extensions$8 = [ | 
						|
	".pcss" | 
						|
]; | 
						|
var aceMode$8 = "text"; | 
						|
var languageId$8 = 262764437; | 
						|
var PostCSS = { | 
						|
	name: name$a, | 
						|
	type: type$8, | 
						|
	tmScope: tmScope$8, | 
						|
	group: group$7, | 
						|
	extensions: extensions$8, | 
						|
	aceMode: aceMode$8, | 
						|
	languageId: languageId$8 | 
						|
}; | 
						|
 | 
						|
var PostCSS$1 = /*#__PURE__*/Object.freeze({ | 
						|
  __proto__: null, | 
						|
  name: name$a, | 
						|
  type: type$8, | 
						|
  tmScope: tmScope$8, | 
						|
  group: group$7, | 
						|
  extensions: extensions$8, | 
						|
  aceMode: aceMode$8, | 
						|
  languageId: languageId$8, | 
						|
  'default': PostCSS | 
						|
}); | 
						|
 | 
						|
var name$b = "Less"; | 
						|
var type$9 = "markup"; | 
						|
var group$8 = "CSS"; | 
						|
var extensions$9 = [ | 
						|
	".less" | 
						|
]; | 
						|
var tmScope$9 = "source.css.less"; | 
						|
var aceMode$9 = "less"; | 
						|
var codemirrorMode$8 = "css"; | 
						|
var codemirrorMimeType$8 = "text/css"; | 
						|
var languageId$9 = 198; | 
						|
var Less = { | 
						|
	name: name$b, | 
						|
	type: type$9, | 
						|
	group: group$8, | 
						|
	extensions: extensions$9, | 
						|
	tmScope: tmScope$9, | 
						|
	aceMode: aceMode$9, | 
						|
	codemirrorMode: codemirrorMode$8, | 
						|
	codemirrorMimeType: codemirrorMimeType$8, | 
						|
	languageId: languageId$9 | 
						|
}; | 
						|
 | 
						|
var Less$1 = /*#__PURE__*/Object.freeze({ | 
						|
  __proto__: null, | 
						|
  name: name$b, | 
						|
  type: type$9, | 
						|
  group: group$8, | 
						|
  extensions: extensions$9, | 
						|
  tmScope: tmScope$9, | 
						|
  aceMode: aceMode$9, | 
						|
  codemirrorMode: codemirrorMode$8, | 
						|
  codemirrorMimeType: codemirrorMimeType$8, | 
						|
  languageId: languageId$9, | 
						|
  'default': Less | 
						|
}); | 
						|
 | 
						|
var name$c = "SCSS"; | 
						|
var type$a = "markup"; | 
						|
var tmScope$a = "source.css.scss"; | 
						|
var group$9 = "CSS"; | 
						|
var aceMode$a = "scss"; | 
						|
var codemirrorMode$9 = "css"; | 
						|
var codemirrorMimeType$9 = "text/x-scss"; | 
						|
var extensions$a = [ | 
						|
	".scss" | 
						|
]; | 
						|
var languageId$a = 329; | 
						|
var SCSS = { | 
						|
	name: name$c, | 
						|
	type: type$a, | 
						|
	tmScope: tmScope$a, | 
						|
	group: group$9, | 
						|
	aceMode: aceMode$a, | 
						|
	codemirrorMode: codemirrorMode$9, | 
						|
	codemirrorMimeType: codemirrorMimeType$9, | 
						|
	extensions: extensions$a, | 
						|
	languageId: languageId$a | 
						|
}; | 
						|
 | 
						|
var SCSS$1 = /*#__PURE__*/Object.freeze({ | 
						|
  __proto__: null, | 
						|
  name: name$c, | 
						|
  type: type$a, | 
						|
  tmScope: tmScope$a, | 
						|
  group: group$9, | 
						|
  aceMode: aceMode$a, | 
						|
  codemirrorMode: codemirrorMode$9, | 
						|
  codemirrorMimeType: codemirrorMimeType$9, | 
						|
  extensions: extensions$a, | 
						|
  languageId: languageId$a, | 
						|
  'default': SCSS | 
						|
}); | 
						|
 | 
						|
var require$$0$2 = getCjsExportFromNamespace(CSS$1); | 
						|
 | 
						|
var require$$1$1 = getCjsExportFromNamespace(PostCSS$1); | 
						|
 | 
						|
var require$$2$1 = getCjsExportFromNamespace(Less$1); | 
						|
 | 
						|
var require$$3$1 = getCjsExportFromNamespace(SCSS$1); | 
						|
 | 
						|
var languages$1 = [createLanguage(require$$0$2, function (data) { | 
						|
  return Object.assign(data, { | 
						|
    since: "1.4.0", | 
						|
    parsers: ["css"], | 
						|
    vscodeLanguageIds: ["css"] | 
						|
  }); | 
						|
}), createLanguage(require$$1$1, function (data) { | 
						|
  return Object.assign(data, { | 
						|
    since: "1.4.0", | 
						|
    parsers: ["css"], | 
						|
    vscodeLanguageIds: ["postcss"], | 
						|
    extensions: data.extensions.concat(".postcss") | 
						|
  }); | 
						|
}), createLanguage(require$$2$1, function (data) { | 
						|
  return Object.assign(data, { | 
						|
    since: "1.4.0", | 
						|
    parsers: ["less"], | 
						|
    vscodeLanguageIds: ["less"] | 
						|
  }); | 
						|
}), createLanguage(require$$3$1, function (data) { | 
						|
  return Object.assign(data, { | 
						|
    since: "1.4.0", | 
						|
    parsers: ["scss"], | 
						|
    vscodeLanguageIds: ["scss"] | 
						|
  }); | 
						|
})]; | 
						|
var printers$1 = { | 
						|
  postcss: printerPostcss | 
						|
}; | 
						|
var languageCss = { | 
						|
  languages: languages$1, | 
						|
  options: options$3, | 
						|
  printers: printers$1 | 
						|
}; | 
						|
 | 
						|
var _require$$0$builders$4 = doc.builders, | 
						|
    concat$a = _require$$0$builders$4.concat, | 
						|
    join$7 = _require$$0$builders$4.join, | 
						|
    softline$4 = _require$$0$builders$4.softline, | 
						|
    hardline$8 = _require$$0$builders$4.hardline, | 
						|
    line$4 = _require$$0$builders$4.line, | 
						|
    group$a = _require$$0$builders$4.group, | 
						|
    indent$6 = _require$$0$builders$4.indent, | 
						|
    ifBreak$3 = _require$$0$builders$4.ifBreak; // http://w3c.github.io/html/single-page.html#void-elements | 
						|
 | 
						|
var voidTags = ["area", "base", "br", "col", "embed", "hr", "img", "input", "link", "meta", "param", "source", "track", "wbr"]; // Formatter based on @glimmerjs/syntax's built-in test formatter: | 
						|
// https://github.com/glimmerjs/glimmer-vm/blob/master/packages/%40glimmer/syntax/lib/generation/print.ts | 
						|
 | 
						|
function printChildren(path, options, print) { | 
						|
  return concat$a(path.map(function (childPath, childIndex) { | 
						|
    var childNode = path.getValue(); | 
						|
    var isFirstNode = childIndex === 0; | 
						|
    var isLastNode = childIndex == path.getParentNode(0).children.length - 1; | 
						|
    var isLastNodeInMultiNodeList = isLastNode && !isFirstNode; | 
						|
    var isWhitespace = isWhitespaceNode(childNode); | 
						|
 | 
						|
    if (isWhitespace && isLastNodeInMultiNodeList) { | 
						|
      return print(childPath, options, print); | 
						|
    } else if (isFirstNode) { | 
						|
      return concat$a([softline$4, print(childPath, options, print)]); | 
						|
    } | 
						|
 | 
						|
    return print(childPath, options, print); | 
						|
  }, "children")); | 
						|
} | 
						|
 | 
						|
function print(path, options, print) { | 
						|
  var n = path.getValue(); | 
						|
  /* istanbul ignore if*/ | 
						|
 | 
						|
  if (!n) { | 
						|
    return ""; | 
						|
  } | 
						|
 | 
						|
  switch (n.type) { | 
						|
    case "Block": | 
						|
    case "Program": | 
						|
    case "Template": | 
						|
      { | 
						|
        return group$a(concat$a(path.map(print, "body").filter(function (text) { | 
						|
          return text !== ""; | 
						|
        }))); | 
						|
      } | 
						|
 | 
						|
    case "ElementNode": | 
						|
      { | 
						|
        var tagFirstChar = n.tag[0]; | 
						|
        var isLocal = n.tag.indexOf(".") !== -1; | 
						|
        var isGlimmerComponent = tagFirstChar.toUpperCase() === tagFirstChar || isLocal; | 
						|
        var hasChildren = n.children.length > 0; | 
						|
        var hasNonWhitespaceChildren = n.children.some(function (n) { | 
						|
          return !isWhitespaceNode(n); | 
						|
        }); | 
						|
        var isVoid = isGlimmerComponent && (!hasChildren || !hasNonWhitespaceChildren) || voidTags.indexOf(n.tag) !== -1; | 
						|
        var closeTagForNoBreak = isVoid ? concat$a([" />", softline$4]) : ">"; | 
						|
        var closeTagForBreak = isVoid ? "/>" : ">"; | 
						|
 | 
						|
        var _getParams = function _getParams(path, print) { | 
						|
          return indent$6(concat$a([n.attributes.length ? line$4 : "", join$7(line$4, path.map(print, "attributes")), n.modifiers.length ? line$4 : "", join$7(line$4, path.map(print, "modifiers")), n.comments.length ? line$4 : "", join$7(line$4, path.map(print, "comments"))])); | 
						|
        }; | 
						|
 | 
						|
        var nextNode = getNextNode(path); | 
						|
        return concat$a([group$a(concat$a(["<", n.tag, _getParams(path, print), n.blockParams.length ? ` as |${n.blockParams.join(" ")}|` : "", ifBreak$3(softline$4, ""), ifBreak$3(closeTagForBreak, closeTagForNoBreak)])), !isVoid ? group$a(concat$a([hasNonWhitespaceChildren ? indent$6(printChildren(path, options, print)) : "", ifBreak$3(hasChildren ? hardline$8 : "", ""), concat$a(["</", n.tag, ">"])])) : "", nextNode && nextNode.type === "ElementNode" ? hardline$8 : ""]); | 
						|
      } | 
						|
 | 
						|
    case "BlockStatement": | 
						|
      { | 
						|
        var pp = path.getParentNode(1); | 
						|
        var isElseIf = pp && pp.inverse && pp.inverse.body.length === 1 && pp.inverse.body[0] === n && pp.inverse.body[0].path.parts[0] === "if"; | 
						|
        var hasElseIf = n.inverse && n.inverse.body.length === 1 && n.inverse.body[0].type === "BlockStatement" && n.inverse.body[0].path.parts[0] === "if"; | 
						|
        var indentElse = hasElseIf ? function (a) { | 
						|
          return a; | 
						|
        } : indent$6; | 
						|
 | 
						|
        if (n.inverse) { | 
						|
          return concat$a([isElseIf ? concat$a(["{{else ", printPathParams(path, print), "}}"]) : printOpenBlock(path, print), indent$6(concat$a([hardline$8, path.call(print, "program")])), n.inverse && !hasElseIf ? concat$a([hardline$8, "{{else}}"]) : "", n.inverse ? indentElse(concat$a([hardline$8, path.call(print, "inverse")])) : "", isElseIf ? "" : concat$a([hardline$8, printCloseBlock(path, print)])]); | 
						|
        } else if (isElseIf) { | 
						|
          return concat$a([concat$a(["{{else ", printPathParams(path, print), "}}"]), indent$6(concat$a([hardline$8, path.call(print, "program")]))]); | 
						|
        } | 
						|
 | 
						|
        var _hasNonWhitespaceChildren = n.program.body.some(function (n) { | 
						|
          return !isWhitespaceNode(n); | 
						|
        }); | 
						|
 | 
						|
        return concat$a([printOpenBlock(path, print), group$a(concat$a([indent$6(concat$a([softline$4, path.call(print, "program")])), _hasNonWhitespaceChildren ? hardline$8 : softline$4, printCloseBlock(path, print)]))]); | 
						|
      } | 
						|
 | 
						|
    case "ElementModifierStatement": | 
						|
    case "MustacheStatement": | 
						|
      { | 
						|
        var _pp = path.getParentNode(1); | 
						|
 | 
						|
        var isConcat = _pp && _pp.type === "ConcatStatement"; | 
						|
        return group$a(concat$a([n.escaped === false ? "{{{" : "{{", printPathParams(path, print, { | 
						|
          group: false | 
						|
        }), isConcat ? "" : softline$4, n.escaped === false ? "}}}" : "}}"])); | 
						|
      } | 
						|
 | 
						|
    case "SubExpression": | 
						|
      { | 
						|
        var params = getParams(path, print); | 
						|
        var printedParams = params.length > 0 ? indent$6(concat$a([line$4, group$a(join$7(line$4, params))])) : ""; | 
						|
        return group$a(concat$a(["(", printPath(path, print), printedParams, softline$4, ")"])); | 
						|
      } | 
						|
 | 
						|
    case "AttrNode": | 
						|
      { | 
						|
        var isText = n.value.type === "TextNode"; | 
						|
 | 
						|
        if (isText && n.value.loc.start.column === n.value.loc.end.column) { | 
						|
          return concat$a([n.name]); | 
						|
        } | 
						|
 | 
						|
        var value = path.call(print, "value"); | 
						|
        var quotedValue = isText ? printStringLiteral(value.parts.join(), options) : value; | 
						|
        return concat$a([n.name, "=", quotedValue]); | 
						|
      } | 
						|
 | 
						|
    case "ConcatStatement": | 
						|
      { | 
						|
        return concat$a(['"', group$a(indent$6(join$7(softline$4, path.map(function (partPath) { | 
						|
          return print(partPath); | 
						|
        }, "parts").filter(function (a) { | 
						|
          return a !== ""; | 
						|
        })))), '"']); | 
						|
      } | 
						|
 | 
						|
    case "Hash": | 
						|
      { | 
						|
        return concat$a([join$7(line$4, path.map(print, "pairs"))]); | 
						|
      } | 
						|
 | 
						|
    case "HashPair": | 
						|
      { | 
						|
        return concat$a([n.key, "=", path.call(print, "value")]); | 
						|
      } | 
						|
 | 
						|
    case "TextNode": | 
						|
      { | 
						|
        var maxLineBreaksToPreserve = 2; | 
						|
        var isFirstElement = !getPreviousNode(path); | 
						|
        var isLastElement = !getNextNode(path); | 
						|
        var isWhitespaceOnly = !/\S/.test(n.chars); | 
						|
        var lineBreaksCount = countNewLines(n.chars); | 
						|
        var hasBlockParent = path.getParentNode(0).type === "Block"; | 
						|
        var hasElementParent = path.getParentNode(0).type === "ElementNode"; | 
						|
        var hasTemplateParent = path.getParentNode(0).type === "Template"; | 
						|
        var leadingLineBreaksCount = countLeadingNewLines(n.chars); | 
						|
        var trailingLineBreaksCount = countTrailingNewLines(n.chars); | 
						|
 | 
						|
        if ((isFirstElement || isLastElement) && isWhitespaceOnly && (hasBlockParent || hasElementParent || hasTemplateParent)) { | 
						|
          return ""; | 
						|
        } | 
						|
 | 
						|
        if (isWhitespaceOnly && lineBreaksCount) { | 
						|
          leadingLineBreaksCount = Math.min(lineBreaksCount, maxLineBreaksToPreserve); | 
						|
          trailingLineBreaksCount = 0; | 
						|
        } else { | 
						|
          if (isNextNodeOfType(path, "ElementNode") || isNextNodeOfType(path, "BlockStatement")) { | 
						|
            trailingLineBreaksCount = Math.max(trailingLineBreaksCount, 1); | 
						|
          } | 
						|
 | 
						|
          if (isPreviousNodeOfSomeType(path, ["ElementNode"]) || isPreviousNodeOfSomeType(path, ["BlockStatement"])) { | 
						|
            leadingLineBreaksCount = Math.max(leadingLineBreaksCount, 1); | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        var leadingSpace = ""; | 
						|
        var trailingSpace = ""; // preserve a space inside of an attribute node where whitespace present, | 
						|
        // when next to mustache statement. | 
						|
 | 
						|
        var inAttrNode = path.stack.indexOf("attributes") >= 0; | 
						|
 | 
						|
        if (inAttrNode) { | 
						|
          var parentNode = path.getParentNode(0); | 
						|
 | 
						|
          var _isConcat = parentNode.type === "ConcatStatement"; | 
						|
 | 
						|
          if (_isConcat) { | 
						|
            var parts = parentNode.parts; | 
						|
            var partIndex = parts.indexOf(n); | 
						|
 | 
						|
            if (partIndex > 0) { | 
						|
              var partType = parts[partIndex - 1].type; | 
						|
              var isMustache = partType === "MustacheStatement"; | 
						|
 | 
						|
              if (isMustache) { | 
						|
                leadingSpace = " "; | 
						|
              } | 
						|
            } | 
						|
 | 
						|
            if (partIndex < parts.length - 1) { | 
						|
              var _partType = parts[partIndex + 1].type; | 
						|
 | 
						|
              var _isMustache = _partType === "MustacheStatement"; | 
						|
 | 
						|
              if (_isMustache) { | 
						|
                trailingSpace = " "; | 
						|
              } | 
						|
            } | 
						|
          } | 
						|
        } else { | 
						|
          if (trailingLineBreaksCount === 0 && isNextNodeOfType(path, "MustacheStatement")) { | 
						|
            trailingSpace = " "; | 
						|
          } | 
						|
 | 
						|
          if (leadingLineBreaksCount === 0 && isPreviousNodeOfSomeType(path, ["MustacheStatement"])) { | 
						|
            leadingSpace = " "; | 
						|
          } | 
						|
 | 
						|
          if (isFirstElement) { | 
						|
            leadingLineBreaksCount = 0; | 
						|
            leadingSpace = ""; | 
						|
          } | 
						|
 | 
						|
          if (isLastElement) { | 
						|
            trailingLineBreaksCount = 0; | 
						|
            trailingSpace = ""; | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        return concat$a([].concat(_toConsumableArray$1(generateHardlines(leadingLineBreaksCount, maxLineBreaksToPreserve)), [n.chars.replace(/^[\s ]+/g, leadingSpace).replace(/[\s ]+$/, trailingSpace)], _toConsumableArray$1(generateHardlines(trailingLineBreaksCount, maxLineBreaksToPreserve))).filter(Boolean)); | 
						|
      } | 
						|
 | 
						|
    case "MustacheCommentStatement": | 
						|
      { | 
						|
        var dashes = n.value.indexOf("}}") > -1 ? "--" : ""; | 
						|
        return concat$a(["{{!", dashes, n.value, dashes, "}}"]); | 
						|
      } | 
						|
 | 
						|
    case "PathExpression": | 
						|
      { | 
						|
        return n.original; | 
						|
      } | 
						|
 | 
						|
    case "BooleanLiteral": | 
						|
      { | 
						|
        return String(n.value); | 
						|
      } | 
						|
 | 
						|
    case "CommentStatement": | 
						|
      { | 
						|
        return concat$a(["<!--", n.value, "-->"]); | 
						|
      } | 
						|
 | 
						|
    case "StringLiteral": | 
						|
      { | 
						|
        return printStringLiteral(n.value, options); | 
						|
      } | 
						|
 | 
						|
    case "NumberLiteral": | 
						|
      { | 
						|
        return String(n.value); | 
						|
      } | 
						|
 | 
						|
    case "UndefinedLiteral": | 
						|
      { | 
						|
        return "undefined"; | 
						|
      } | 
						|
 | 
						|
    case "NullLiteral": | 
						|
      { | 
						|
        return "null"; | 
						|
      } | 
						|
 | 
						|
    /* istanbul ignore next */ | 
						|
 | 
						|
    default: | 
						|
      throw new Error("unknown glimmer type: " + JSON.stringify(n.type)); | 
						|
  } | 
						|
} | 
						|
/** | 
						|
 * Prints a string literal with the correct surrounding quotes based on | 
						|
 * `options.singleQuote` and the number of escaped quotes contained in | 
						|
 * the string literal. This function is the glimmer equivalent of `printString` | 
						|
 * in `common/util`, but has differences because of the way escaped characters | 
						|
 * are treated in hbs string literals. | 
						|
 * @param {string} stringLiteral - the string literal value | 
						|
 * @param {object} options - the prettier options object | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function printStringLiteral(stringLiteral, options) { | 
						|
  var double = { | 
						|
    quote: '"', | 
						|
    regex: /"/g | 
						|
  }; | 
						|
  var single = { | 
						|
    quote: "'", | 
						|
    regex: /'/g | 
						|
  }; | 
						|
  var preferred = options.singleQuote ? single : double; | 
						|
  var alternate = preferred === single ? double : single; | 
						|
  var shouldUseAlternateQuote = false; // If `stringLiteral` contains at least one of the quote preferred for | 
						|
  // enclosing the string, we might want to enclose with the alternate quote | 
						|
  // instead, to minimize the number of escaped quotes. | 
						|
 | 
						|
  if (stringLiteral.includes(preferred.quote) || stringLiteral.includes(alternate.quote)) { | 
						|
    var numPreferredQuotes = (stringLiteral.match(preferred.regex) || []).length; | 
						|
    var numAlternateQuotes = (stringLiteral.match(alternate.regex) || []).length; | 
						|
    shouldUseAlternateQuote = numPreferredQuotes > numAlternateQuotes; | 
						|
  } | 
						|
 | 
						|
  var enclosingQuote = shouldUseAlternateQuote ? alternate : preferred; | 
						|
  var escapedStringLiteral = stringLiteral.replace(enclosingQuote.regex, `\\${enclosingQuote.quote}`); | 
						|
  return `${enclosingQuote.quote}${escapedStringLiteral}${enclosingQuote.quote}`; | 
						|
} | 
						|
 | 
						|
function printPath(path, print) { | 
						|
  return path.call(print, "path"); | 
						|
} | 
						|
 | 
						|
function getParams(path, print) { | 
						|
  var node = path.getValue(); | 
						|
  var parts = []; | 
						|
 | 
						|
  if (node.params.length > 0) { | 
						|
    parts = parts.concat(path.map(print, "params")); | 
						|
  } | 
						|
 | 
						|
  if (node.hash && node.hash.pairs.length > 0) { | 
						|
    parts.push(path.call(print, "hash")); | 
						|
  } | 
						|
 | 
						|
  return parts; | 
						|
} | 
						|
 | 
						|
function printPathParams(path, print, options) { | 
						|
  var parts = []; | 
						|
  options = Object.assign({ | 
						|
    group: true | 
						|
  }, options || {}); | 
						|
  parts.push(printPath(path, print)); | 
						|
  parts = parts.concat(getParams(path, print)); | 
						|
 | 
						|
  if (!options.group) { | 
						|
    return indent$6(join$7(line$4, parts)); | 
						|
  } | 
						|
 | 
						|
  return indent$6(group$a(join$7(line$4, parts))); | 
						|
} | 
						|
 | 
						|
function printBlockParams(path) { | 
						|
  var block = path.getValue(); | 
						|
 | 
						|
  if (!block.program || !block.program.blockParams.length) { | 
						|
    return ""; | 
						|
  } | 
						|
 | 
						|
  return concat$a([" as |", block.program.blockParams.join(" "), "|"]); | 
						|
} | 
						|
 | 
						|
function printOpenBlock(path, print) { | 
						|
  return group$a(concat$a(["{{#", printPathParams(path, print), printBlockParams(path), softline$4, "}}"])); | 
						|
} | 
						|
 | 
						|
function printCloseBlock(path, print) { | 
						|
  return concat$a(["{{/", path.call(print, "path"), "}}"]); | 
						|
} | 
						|
 | 
						|
function isWhitespaceNode(node) { | 
						|
  return node.type === "TextNode" && !/\S/.test(node.chars); | 
						|
} | 
						|
 | 
						|
function getPreviousNode(path) { | 
						|
  var node = path.getValue(); | 
						|
  var parentNode = path.getParentNode(0); | 
						|
  var children = parentNode.children || parentNode.body; | 
						|
 | 
						|
  if (children) { | 
						|
    var nodeIndex = children.indexOf(node); | 
						|
 | 
						|
    if (nodeIndex > 0) { | 
						|
      var previousNode = children[nodeIndex - 1]; | 
						|
      return previousNode; | 
						|
    } | 
						|
  } | 
						|
} | 
						|
 | 
						|
function getNextNode(path) { | 
						|
  var node = path.getValue(); | 
						|
  var parentNode = path.getParentNode(0); | 
						|
  var children = parentNode.children || parentNode.body; | 
						|
 | 
						|
  if (children) { | 
						|
    var nodeIndex = children.indexOf(node); | 
						|
 | 
						|
    if (nodeIndex < children.length) { | 
						|
      var nextNode = children[nodeIndex + 1]; | 
						|
      return nextNode; | 
						|
    } | 
						|
  } | 
						|
} | 
						|
 | 
						|
function isPreviousNodeOfSomeType(path, types) { | 
						|
  var previousNode = getPreviousNode(path); | 
						|
 | 
						|
  if (previousNode) { | 
						|
    return types.some(function (type) { | 
						|
      return previousNode.type === type; | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function isNextNodeOfType(path, type) { | 
						|
  var nextNode = getNextNode(path); | 
						|
  return nextNode && nextNode.type === type; | 
						|
} | 
						|
 | 
						|
function clean$3(ast, newObj) { | 
						|
  delete newObj.loc; | 
						|
  delete newObj.selfClosing; // (Glimmer/HTML) ignore TextNode whitespace | 
						|
 | 
						|
  if (ast.type === "TextNode") { | 
						|
    if (ast.chars.replace(/\s+/, "") === "") { | 
						|
      return null; | 
						|
    } | 
						|
 | 
						|
    newObj.chars = ast.chars.replace(/^\s+/, "").replace(/\s+$/, ""); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function countNewLines(string) { | 
						|
  /* istanbul ignore next */ | 
						|
  string = typeof string === "string" ? string : ""; | 
						|
  return string.split("\n").length - 1; | 
						|
} | 
						|
 | 
						|
function countLeadingNewLines(string) { | 
						|
  /* istanbul ignore next */ | 
						|
  string = typeof string === "string" ? string : ""; | 
						|
  var newLines = (string.match(/^([^\S\r\n]*[\r\n])+/g) || [])[0] || ""; | 
						|
  return countNewLines(newLines); | 
						|
} | 
						|
 | 
						|
function countTrailingNewLines(string) { | 
						|
  /* istanbul ignore next */ | 
						|
  string = typeof string === "string" ? string : ""; | 
						|
  var newLines = (string.match(/([\r\n][^\S\r\n]*)+$/g) || [])[0] || ""; | 
						|
  return countNewLines(newLines); | 
						|
} | 
						|
 | 
						|
function generateHardlines() { | 
						|
  var number = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; | 
						|
  var max = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; | 
						|
  return new Array(Math.min(number, max)).fill(hardline$8); | 
						|
} | 
						|
 | 
						|
var printerGlimmer = { | 
						|
  print, | 
						|
  massageAstNode: clean$3 | 
						|
}; | 
						|
 | 
						|
var name$d = "Handlebars"; | 
						|
var type$b = "markup"; | 
						|
var group$b = "HTML"; | 
						|
var aliases$3 = [ | 
						|
	"hbs", | 
						|
	"htmlbars" | 
						|
]; | 
						|
var extensions$b = [ | 
						|
	".handlebars", | 
						|
	".hbs" | 
						|
]; | 
						|
var tmScope$b = "text.html.handlebars"; | 
						|
var aceMode$b = "handlebars"; | 
						|
var languageId$b = 155; | 
						|
var Handlebars = { | 
						|
	name: name$d, | 
						|
	type: type$b, | 
						|
	group: group$b, | 
						|
	aliases: aliases$3, | 
						|
	extensions: extensions$b, | 
						|
	tmScope: tmScope$b, | 
						|
	aceMode: aceMode$b, | 
						|
	languageId: languageId$b | 
						|
}; | 
						|
 | 
						|
var Handlebars$1 = /*#__PURE__*/Object.freeze({ | 
						|
  __proto__: null, | 
						|
  name: name$d, | 
						|
  type: type$b, | 
						|
  group: group$b, | 
						|
  aliases: aliases$3, | 
						|
  extensions: extensions$b, | 
						|
  tmScope: tmScope$b, | 
						|
  aceMode: aceMode$b, | 
						|
  languageId: languageId$b, | 
						|
  'default': Handlebars | 
						|
}); | 
						|
 | 
						|
var require$$0$3 = getCjsExportFromNamespace(Handlebars$1); | 
						|
 | 
						|
var languages$2 = [createLanguage(require$$0$3, function (data) { | 
						|
  return Object.assign(data, { | 
						|
    since: null, | 
						|
    // unreleased | 
						|
    parsers: ["glimmer"], | 
						|
    vscodeLanguageIds: ["handlebars"] | 
						|
  }); | 
						|
})]; | 
						|
var printers$2 = { | 
						|
  glimmer: printerGlimmer | 
						|
}; | 
						|
var languageHandlebars = { | 
						|
  languages: languages$2, | 
						|
  printers: printers$2 | 
						|
}; | 
						|
 | 
						|
function hasPragma$2(text) { | 
						|
  return /^\s*#[^\n\S]*@(format|prettier)\s*(\n|$)/.test(text); | 
						|
} | 
						|
 | 
						|
function insertPragma$4(text) { | 
						|
  return "# @format\n\n" + text; | 
						|
} | 
						|
 | 
						|
var pragma$2 = { | 
						|
  hasPragma: hasPragma$2, | 
						|
  insertPragma: insertPragma$4 | 
						|
}; | 
						|
 | 
						|
var _require$$0$builders$5 = doc.builders, | 
						|
    concat$b = _require$$0$builders$5.concat, | 
						|
    join$8 = _require$$0$builders$5.join, | 
						|
    hardline$9 = _require$$0$builders$5.hardline, | 
						|
    line$5 = _require$$0$builders$5.line, | 
						|
    softline$5 = _require$$0$builders$5.softline, | 
						|
    group$c = _require$$0$builders$5.group, | 
						|
    indent$7 = _require$$0$builders$5.indent, | 
						|
    ifBreak$4 = _require$$0$builders$5.ifBreak; | 
						|
var hasIgnoreComment$4 = util.hasIgnoreComment; | 
						|
var isNextLineEmpty$4 = utilShared.isNextLineEmpty; | 
						|
var insertPragma$5 = pragma$2.insertPragma; | 
						|
 | 
						|
function genericPrint$3(path, options, print) { | 
						|
  var n = path.getValue(); | 
						|
 | 
						|
  if (!n) { | 
						|
    return ""; | 
						|
  } | 
						|
 | 
						|
  if (typeof n === "string") { | 
						|
    return n; | 
						|
  } | 
						|
 | 
						|
  switch (n.kind) { | 
						|
    case "Document": | 
						|
      { | 
						|
        var parts = []; | 
						|
        path.map(function (pathChild, index) { | 
						|
          parts.push(concat$b([pathChild.call(print)])); | 
						|
 | 
						|
          if (index !== n.definitions.length - 1) { | 
						|
            parts.push(hardline$9); | 
						|
 | 
						|
            if (isNextLineEmpty$4(options.originalText, pathChild.getValue(), options)) { | 
						|
              parts.push(hardline$9); | 
						|
            } | 
						|
          } | 
						|
        }, "definitions"); | 
						|
        return concat$b([concat$b(parts), hardline$9]); | 
						|
      } | 
						|
 | 
						|
    case "OperationDefinition": | 
						|
      { | 
						|
        var hasOperation = options.originalText[options.locStart(n)] !== "{"; | 
						|
        var hasName = !!n.name; | 
						|
        return concat$b([hasOperation ? n.operation : "", hasOperation && hasName ? concat$b([" ", path.call(print, "name")]) : "", n.variableDefinitions && n.variableDefinitions.length ? group$c(concat$b(["(", indent$7(concat$b([softline$5, join$8(concat$b([ifBreak$4("", ", "), softline$5]), path.map(print, "variableDefinitions"))])), softline$5, ")"])) : "", printDirectives(path, print, n), n.selectionSet ? !hasOperation && !hasName ? "" : " " : "", path.call(print, "selectionSet")]); | 
						|
      } | 
						|
 | 
						|
    case "FragmentDefinition": | 
						|
      { | 
						|
        return concat$b(["fragment ", path.call(print, "name"), n.variableDefinitions && n.variableDefinitions.length ? group$c(concat$b(["(", indent$7(concat$b([softline$5, join$8(concat$b([ifBreak$4("", ", "), softline$5]), path.map(print, "variableDefinitions"))])), softline$5, ")"])) : "", " on ", path.call(print, "typeCondition"), printDirectives(path, print, n), " ", path.call(print, "selectionSet")]); | 
						|
      } | 
						|
 | 
						|
    case "SelectionSet": | 
						|
      { | 
						|
        return concat$b(["{", indent$7(concat$b([hardline$9, join$8(hardline$9, path.call(function (selectionsPath) { | 
						|
          return printSequence(selectionsPath, options, print); | 
						|
        }, "selections"))])), hardline$9, "}"]); | 
						|
      } | 
						|
 | 
						|
    case "Field": | 
						|
      { | 
						|
        return group$c(concat$b([n.alias ? concat$b([path.call(print, "alias"), ": "]) : "", path.call(print, "name"), n.arguments.length > 0 ? group$c(concat$b(["(", indent$7(concat$b([softline$5, join$8(concat$b([ifBreak$4("", ", "), softline$5]), path.call(function (argsPath) { | 
						|
          return printSequence(argsPath, options, print); | 
						|
        }, "arguments"))])), softline$5, ")"])) : "", printDirectives(path, print, n), n.selectionSet ? " " : "", path.call(print, "selectionSet")])); | 
						|
      } | 
						|
 | 
						|
    case "Name": | 
						|
      { | 
						|
        return n.value; | 
						|
      } | 
						|
 | 
						|
    case "StringValue": | 
						|
      { | 
						|
        if (n.block) { | 
						|
          return concat$b(['"""', hardline$9, join$8(hardline$9, n.value.replace(/"""/g, "\\$&").split("\n")), hardline$9, '"""']); | 
						|
        } | 
						|
 | 
						|
        return concat$b(['"', n.value.replace(/["\\]/g, "\\$&").replace(/\n/g, "\\n"), '"']); | 
						|
      } | 
						|
 | 
						|
    case "IntValue": | 
						|
    case "FloatValue": | 
						|
    case "EnumValue": | 
						|
      { | 
						|
        return n.value; | 
						|
      } | 
						|
 | 
						|
    case "BooleanValue": | 
						|
      { | 
						|
        return n.value ? "true" : "false"; | 
						|
      } | 
						|
 | 
						|
    case "NullValue": | 
						|
      { | 
						|
        return "null"; | 
						|
      } | 
						|
 | 
						|
    case "Variable": | 
						|
      { | 
						|
        return concat$b(["$", path.call(print, "name")]); | 
						|
      } | 
						|
 | 
						|
    case "ListValue": | 
						|
      { | 
						|
        return group$c(concat$b(["[", indent$7(concat$b([softline$5, join$8(concat$b([ifBreak$4("", ", "), softline$5]), path.map(print, "values"))])), softline$5, "]"])); | 
						|
      } | 
						|
 | 
						|
    case "ObjectValue": | 
						|
      { | 
						|
        return group$c(concat$b(["{", options.bracketSpacing && n.fields.length > 0 ? " " : "", indent$7(concat$b([softline$5, join$8(concat$b([ifBreak$4("", ", "), softline$5]), path.map(print, "fields"))])), softline$5, ifBreak$4("", options.bracketSpacing && n.fields.length > 0 ? " " : ""), "}"])); | 
						|
      } | 
						|
 | 
						|
    case "ObjectField": | 
						|
    case "Argument": | 
						|
      { | 
						|
        return concat$b([path.call(print, "name"), ": ", path.call(print, "value")]); | 
						|
      } | 
						|
 | 
						|
    case "Directive": | 
						|
      { | 
						|
        return concat$b(["@", path.call(print, "name"), n.arguments.length > 0 ? group$c(concat$b(["(", indent$7(concat$b([softline$5, join$8(concat$b([ifBreak$4("", ", "), softline$5]), path.call(function (argsPath) { | 
						|
          return printSequence(argsPath, options, print); | 
						|
        }, "arguments"))])), softline$5, ")"])) : ""]); | 
						|
      } | 
						|
 | 
						|
    case "NamedType": | 
						|
      { | 
						|
        return path.call(print, "name"); | 
						|
      } | 
						|
 | 
						|
    case "VariableDefinition": | 
						|
      { | 
						|
        return concat$b([path.call(print, "variable"), ": ", path.call(print, "type"), n.defaultValue ? concat$b([" = ", path.call(print, "defaultValue")]) : "", printDirectives(path, print, n)]); | 
						|
      } | 
						|
 | 
						|
    case "TypeExtensionDefinition": | 
						|
      { | 
						|
        return concat$b(["extend ", path.call(print, "definition")]); | 
						|
      } | 
						|
 | 
						|
    case "ObjectTypeExtension": | 
						|
    case "ObjectTypeDefinition": | 
						|
      { | 
						|
        return concat$b([path.call(print, "description"), n.description ? hardline$9 : "", n.kind === "ObjectTypeExtension" ? "extend " : "", "type ", path.call(print, "name"), n.interfaces.length > 0 ? concat$b([" implements ", join$8(determineInterfaceSeparator(options.originalText.substr(options.locStart(n), options.locEnd(n))), path.map(print, "interfaces"))]) : "", printDirectives(path, print, n), n.fields.length > 0 ? concat$b([" {", indent$7(concat$b([hardline$9, join$8(hardline$9, path.call(function (fieldsPath) { | 
						|
          return printSequence(fieldsPath, options, print); | 
						|
        }, "fields"))])), hardline$9, "}"]) : ""]); | 
						|
      } | 
						|
 | 
						|
    case "FieldDefinition": | 
						|
      { | 
						|
        return concat$b([path.call(print, "description"), n.description ? hardline$9 : "", path.call(print, "name"), n.arguments.length > 0 ? group$c(concat$b(["(", indent$7(concat$b([softline$5, join$8(concat$b([ifBreak$4("", ", "), softline$5]), path.call(function (argsPath) { | 
						|
          return printSequence(argsPath, options, print); | 
						|
        }, "arguments"))])), softline$5, ")"])) : "", ": ", path.call(print, "type"), printDirectives(path, print, n)]); | 
						|
      } | 
						|
 | 
						|
    case "DirectiveDefinition": | 
						|
      { | 
						|
        return concat$b([path.call(print, "description"), n.description ? hardline$9 : "", "directive ", "@", path.call(print, "name"), n.arguments.length > 0 ? group$c(concat$b(["(", indent$7(concat$b([softline$5, join$8(concat$b([ifBreak$4("", ", "), softline$5]), path.call(function (argsPath) { | 
						|
          return printSequence(argsPath, options, print); | 
						|
        }, "arguments"))])), softline$5, ")"])) : "", concat$b([" on ", join$8(" | ", path.map(print, "locations"))])]); | 
						|
      } | 
						|
 | 
						|
    case "EnumTypeExtension": | 
						|
    case "EnumTypeDefinition": | 
						|
      { | 
						|
        return concat$b([path.call(print, "description"), n.description ? hardline$9 : "", n.kind === "EnumTypeExtension" ? "extend " : "", "enum ", path.call(print, "name"), printDirectives(path, print, n), n.values.length > 0 ? concat$b([" {", indent$7(concat$b([hardline$9, join$8(hardline$9, path.call(function (valuesPath) { | 
						|
          return printSequence(valuesPath, options, print); | 
						|
        }, "values"))])), hardline$9, "}"]) : ""]); | 
						|
      } | 
						|
 | 
						|
    case "EnumValueDefinition": | 
						|
      { | 
						|
        return concat$b([path.call(print, "description"), n.description ? hardline$9 : "", path.call(print, "name"), printDirectives(path, print, n)]); | 
						|
      } | 
						|
 | 
						|
    case "InputValueDefinition": | 
						|
      { | 
						|
        return concat$b([path.call(print, "description"), n.description ? n.description.block ? hardline$9 : line$5 : "", path.call(print, "name"), ": ", path.call(print, "type"), n.defaultValue ? concat$b([" = ", path.call(print, "defaultValue")]) : "", printDirectives(path, print, n)]); | 
						|
      } | 
						|
 | 
						|
    case "InputObjectTypeExtension": | 
						|
    case "InputObjectTypeDefinition": | 
						|
      { | 
						|
        return concat$b([path.call(print, "description"), n.description ? hardline$9 : "", n.kind === "InputObjectTypeExtension" ? "extend " : "", "input ", path.call(print, "name"), printDirectives(path, print, n), n.fields.length > 0 ? concat$b([" {", indent$7(concat$b([hardline$9, join$8(hardline$9, path.call(function (fieldsPath) { | 
						|
          return printSequence(fieldsPath, options, print); | 
						|
        }, "fields"))])), hardline$9, "}"]) : ""]); | 
						|
      } | 
						|
 | 
						|
    case "SchemaDefinition": | 
						|
      { | 
						|
        return concat$b(["schema", printDirectives(path, print, n), " {", n.operationTypes.length > 0 ? indent$7(concat$b([hardline$9, join$8(hardline$9, path.call(function (opsPath) { | 
						|
          return printSequence(opsPath, options, print); | 
						|
        }, "operationTypes"))])) : "", hardline$9, "}"]); | 
						|
      } | 
						|
 | 
						|
    case "OperationTypeDefinition": | 
						|
      { | 
						|
        return concat$b([path.call(print, "operation"), ": ", path.call(print, "type")]); | 
						|
      } | 
						|
 | 
						|
    case "InterfaceTypeExtension": | 
						|
    case "InterfaceTypeDefinition": | 
						|
      { | 
						|
        return concat$b([path.call(print, "description"), n.description ? hardline$9 : "", n.kind === "InterfaceTypeExtension" ? "extend " : "", "interface ", path.call(print, "name"), printDirectives(path, print, n), n.fields.length > 0 ? concat$b([" {", indent$7(concat$b([hardline$9, join$8(hardline$9, path.call(function (fieldsPath) { | 
						|
          return printSequence(fieldsPath, options, print); | 
						|
        }, "fields"))])), hardline$9, "}"]) : ""]); | 
						|
      } | 
						|
 | 
						|
    case "FragmentSpread": | 
						|
      { | 
						|
        return concat$b(["...", path.call(print, "name"), printDirectives(path, print, n)]); | 
						|
      } | 
						|
 | 
						|
    case "InlineFragment": | 
						|
      { | 
						|
        return concat$b(["...", n.typeCondition ? concat$b([" on ", path.call(print, "typeCondition")]) : "", printDirectives(path, print, n), " ", path.call(print, "selectionSet")]); | 
						|
      } | 
						|
 | 
						|
    case "UnionTypeExtension": | 
						|
    case "UnionTypeDefinition": | 
						|
      { | 
						|
        return group$c(concat$b([path.call(print, "description"), n.description ? hardline$9 : "", group$c(concat$b([n.kind === "UnionTypeExtension" ? "extend " : "", "union ", path.call(print, "name"), printDirectives(path, print, n), n.types.length > 0 ? concat$b([" =", ifBreak$4("", " "), indent$7(concat$b([ifBreak$4(concat$b([line$5, "  "])), join$8(concat$b([line$5, "| "]), path.map(print, "types"))]))]) : ""]))])); | 
						|
      } | 
						|
 | 
						|
    case "ScalarTypeExtension": | 
						|
    case "ScalarTypeDefinition": | 
						|
      { | 
						|
        return concat$b([path.call(print, "description"), n.description ? hardline$9 : "", n.kind === "ScalarTypeExtension" ? "extend " : "", "scalar ", path.call(print, "name"), printDirectives(path, print, n)]); | 
						|
      } | 
						|
 | 
						|
    case "NonNullType": | 
						|
      { | 
						|
        return concat$b([path.call(print, "type"), "!"]); | 
						|
      } | 
						|
 | 
						|
    case "ListType": | 
						|
      { | 
						|
        return concat$b(["[", path.call(print, "type"), "]"]); | 
						|
      } | 
						|
 | 
						|
    default: | 
						|
      /* istanbul ignore next */ | 
						|
      throw new Error("unknown graphql type: " + JSON.stringify(n.kind)); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function printDirectives(path, print, n) { | 
						|
  if (n.directives.length === 0) { | 
						|
    return ""; | 
						|
  } | 
						|
 | 
						|
  return concat$b([" ", group$c(indent$7(concat$b([softline$5, join$8(concat$b([ifBreak$4("", " "), softline$5]), path.map(print, "directives"))])))]); | 
						|
} | 
						|
 | 
						|
function printSequence(sequencePath, options, print) { | 
						|
  var count = sequencePath.getValue().length; | 
						|
  return sequencePath.map(function (path, i) { | 
						|
    var printed = print(path); | 
						|
 | 
						|
    if (isNextLineEmpty$4(options.originalText, path.getValue(), options) && i < count - 1) { | 
						|
      return concat$b([printed, hardline$9]); | 
						|
    } | 
						|
 | 
						|
    return printed; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function canAttachComment$1(node) { | 
						|
  return node.kind && node.kind !== "Comment"; | 
						|
} | 
						|
 | 
						|
function printComment$2(commentPath) { | 
						|
  var comment = commentPath.getValue(); | 
						|
 | 
						|
  if (comment.kind === "Comment") { | 
						|
    return "#" + comment.value.trimRight(); | 
						|
  } | 
						|
 | 
						|
  throw new Error("Not a comment: " + JSON.stringify(comment)); | 
						|
} | 
						|
 | 
						|
function determineInterfaceSeparator(originalSource) { | 
						|
  var start = originalSource.indexOf("implements"); | 
						|
 | 
						|
  if (start === -1) { | 
						|
    throw new Error("Must implement interfaces: " + originalSource); | 
						|
  } | 
						|
 | 
						|
  var end = originalSource.indexOf("{"); | 
						|
 | 
						|
  if (end === -1) { | 
						|
    end = originalSource.length; | 
						|
  } | 
						|
 | 
						|
  return originalSource.substr(start, end).includes("&") ? " & " : ", "; | 
						|
} | 
						|
 | 
						|
function clean$4(node, newNode | 
						|
/*, parent*/ | 
						|
) { | 
						|
  delete newNode.loc; | 
						|
  delete newNode.comments; | 
						|
} | 
						|
 | 
						|
var printerGraphql = { | 
						|
  print: genericPrint$3, | 
						|
  massageAstNode: clean$4, | 
						|
  hasPrettierIgnore: hasIgnoreComment$4, | 
						|
  insertPragma: insertPragma$5, | 
						|
  printComment: printComment$2, | 
						|
  canAttachComment: canAttachComment$1 | 
						|
}; | 
						|
 | 
						|
var options$4 = { | 
						|
  bracketSpacing: commonOptions.bracketSpacing | 
						|
}; | 
						|
 | 
						|
var name$e = "GraphQL"; | 
						|
var type$c = "data"; | 
						|
var extensions$c = [ | 
						|
	".graphql", | 
						|
	".gql", | 
						|
	".graphqls" | 
						|
]; | 
						|
var tmScope$c = "source.graphql"; | 
						|
var aceMode$c = "text"; | 
						|
var languageId$c = 139; | 
						|
var GraphQL = { | 
						|
	name: name$e, | 
						|
	type: type$c, | 
						|
	extensions: extensions$c, | 
						|
	tmScope: tmScope$c, | 
						|
	aceMode: aceMode$c, | 
						|
	languageId: languageId$c | 
						|
}; | 
						|
 | 
						|
var GraphQL$1 = /*#__PURE__*/Object.freeze({ | 
						|
  __proto__: null, | 
						|
  name: name$e, | 
						|
  type: type$c, | 
						|
  extensions: extensions$c, | 
						|
  tmScope: tmScope$c, | 
						|
  aceMode: aceMode$c, | 
						|
  languageId: languageId$c, | 
						|
  'default': GraphQL | 
						|
}); | 
						|
 | 
						|
var require$$0$4 = getCjsExportFromNamespace(GraphQL$1); | 
						|
 | 
						|
var languages$3 = [createLanguage(require$$0$4, function (data) { | 
						|
  return Object.assign(data, { | 
						|
    since: "1.5.0", | 
						|
    parsers: ["graphql"], | 
						|
    vscodeLanguageIds: ["graphql"] | 
						|
  }); | 
						|
})]; | 
						|
var printers$3 = { | 
						|
  graphql: printerGraphql | 
						|
}; | 
						|
var languageGraphql = { | 
						|
  languages: languages$3, | 
						|
  options: options$4, | 
						|
  printers: printers$3 | 
						|
}; | 
						|
 | 
						|
var json = { | 
						|
  "cjkPattern": "[\\u02ea-\\u02eb\\u1100-\\u11ff\\u2e80-\\u2e99\\u2e9b-\\u2ef3\\u2f00-\\u2fd5\\u3000-\\u303f\\u3041-\\u3096\\u3099-\\u309f\\u30a1-\\u30fa\\u30fc-\\u30ff\\u3105-\\u312f\\u3131-\\u318e\\u3190-\\u3191\\u3196-\\u31ba\\u31c0-\\u31e3\\u31f0-\\u321e\\u322a-\\u3247\\u3260-\\u327e\\u328a-\\u32b0\\u32c0-\\u32cb\\u32d0-\\u3370\\u337b-\\u337f\\u33e0-\\u33fe\\u3400-\\u4db5\\u4e00-\\u9fef\\ua960-\\ua97c\\uac00-\\ud7a3\\ud7b0-\\ud7c6\\ud7cb-\\ud7fb\\uf900-\\ufa6d\\ufa70-\\ufad9\\ufe10-\\ufe1f\\ufe30-\\ufe6f\\uff00-\\uffef]|[\\ud840-\\ud868\\ud86a-\\ud86c\\ud86f-\\ud872\\ud874-\\ud879][\\udc00-\\udfff]|\\ud82c[\\udc00-\\udd1e\\udd50-\\udd52\\udd64-\\udd67]|\\ud83c[\\ude00\\ude50-\\ude51]|\\ud869[\\udc00-\\uded6\\udf00-\\udfff]|\\ud86d[\\udc00-\\udf34\\udf40-\\udfff]|\\ud86e[\\udc00-\\udc1d\\udc20-\\udfff]|\\ud873[\\udc00-\\udea1\\udeb0-\\udfff]|\\ud87a[\\udc00-\\udfe0]|\\ud87e[\\udc00-\\ude1d]", | 
						|
  "kPattern": "[\\u1100-\\u11ff\\u3001-\\u3003\\u3008-\\u3011\\u3013-\\u301f\\u302e-\\u3030\\u3037\\u30fb\\u3131-\\u318e\\u3200-\\u321e\\u3260-\\u327e\\ua960-\\ua97c\\uac00-\\ud7a3\\ud7b0-\\ud7c6\\ud7cb-\\ud7fb\\ufe45-\\ufe46\\uff61-\\uff65\\uffa0-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\\uffda-\\uffdc]", | 
						|
  "punctuationPattern": "[\\u0021-\\u002f\\u003a-\\u0040\\u005b-\\u0060\\u007b-\\u007e\\u00a1\\u00a7\\u00ab\\u00b6-\\u00b7\\u00bb\\u00bf\\u037e\\u0387\\u055a-\\u055f\\u0589-\\u058a\\u05be\\u05c0\\u05c3\\u05c6\\u05f3-\\u05f4\\u0609-\\u060a\\u060c-\\u060d\\u061b\\u061e-\\u061f\\u066a-\\u066d\\u06d4\\u0700-\\u070d\\u07f7-\\u07f9\\u0830-\\u083e\\u085e\\u0964-\\u0965\\u0970\\u09fd\\u0a76\\u0af0\\u0c77\\u0c84\\u0df4\\u0e4f\\u0e5a-\\u0e5b\\u0f04-\\u0f12\\u0f14\\u0f3a-\\u0f3d\\u0f85\\u0fd0-\\u0fd4\\u0fd9-\\u0fda\\u104a-\\u104f\\u10fb\\u1360-\\u1368\\u1400\\u166e\\u169b-\\u169c\\u16eb-\\u16ed\\u1735-\\u1736\\u17d4-\\u17d6\\u17d8-\\u17da\\u1800-\\u180a\\u1944-\\u1945\\u1a1e-\\u1a1f\\u1aa0-\\u1aa6\\u1aa8-\\u1aad\\u1b5a-\\u1b60\\u1bfc-\\u1bff\\u1c3b-\\u1c3f\\u1c7e-\\u1c7f\\u1cc0-\\u1cc7\\u1cd3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205e\\u207d-\\u207e\\u208d-\\u208e\\u2308-\\u230b\\u2329-\\u232a\\u2768-\\u2775\\u27c5-\\u27c6\\u27e6-\\u27ef\\u2983-\\u2998\\u29d8-\\u29db\\u29fc-\\u29fd\\u2cf9-\\u2cfc\\u2cfe-\\u2cff\\u2d70\\u2e00-\\u2e2e\\u2e30-\\u2e4f\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301f\\u3030\\u303d\\u30a0\\u30fb\\ua4fe-\\ua4ff\\ua60d-\\ua60f\\ua673\\ua67e\\ua6f2-\\ua6f7\\ua874-\\ua877\\ua8ce-\\ua8cf\\ua8f8-\\ua8fa\\ua8fc\\ua92e-\\ua92f\\ua95f\\ua9c1-\\ua9cd\\ua9de-\\ua9df\\uaa5c-\\uaa5f\\uaade-\\uaadf\\uaaf0-\\uaaf1\\uabeb\\ufd3e-\\ufd3f\\ufe10-\\ufe19\\ufe30-\\ufe52\\ufe54-\\ufe61\\ufe63\\ufe68\\ufe6a-\\ufe6b\\uff01-\\uff03\\uff05-\\uff0a\\uff0c-\\uff0f\\uff1a-\\uff1b\\uff1f-\\uff20\\uff3b-\\uff3d\\uff3f\\uff5b\\uff5d\\uff5f-\\uff65]|\\ud800[\\udd00-\\udd02\\udf9f\\udfd0]|\\ud801[\\udd6f]|\\ud802[\\udc57\\udd1f\\udd3f\\ude50-\\ude58\\ude7f\\udef0-\\udef6\\udf39-\\udf3f\\udf99-\\udf9c]|\\ud803[\\udf55-\\udf59]|\\ud804[\\udc47-\\udc4d\\udcbb-\\udcbc\\udcbe-\\udcc1\\udd40-\\udd43\\udd74-\\udd75\\uddc5-\\uddc8\\uddcd\\udddb\\udddd-\\udddf\\ude38-\\ude3d\\udea9]|\\ud805[\\udc4b-\\udc4f\\udc5b\\udc5d\\udcc6\\uddc1-\\uddd7\\ude41-\\ude43\\ude60-\\ude6c\\udf3c-\\udf3e]|\\ud806[\\udc3b\\udde2\\ude3f-\\ude46\\ude9a-\\ude9c\\ude9e-\\udea2]|\\ud807[\\udc41-\\udc45\\udc70-\\udc71\\udef7-\\udef8\\udfff]|\\ud809[\\udc70-\\udc74]|\\ud81a[\\ude6e-\\ude6f\\udef5\\udf37-\\udf3b\\udf44]|\\ud81b[\\ude97-\\ude9a\\udfe2]|\\ud82f[\\udc9f]|\\ud836[\\ude87-\\ude8b]|\\ud83a[\\udd5e-\\udd5f]" | 
						|
}; | 
						|
 | 
						|
var cjkPattern = json.cjkPattern, | 
						|
    kPattern = json.kPattern, | 
						|
    punctuationPattern = json.punctuationPattern; | 
						|
var getLast$3 = util.getLast; | 
						|
var INLINE_NODE_TYPES = ["liquidNode", "inlineCode", "emphasis", "strong", "delete", "link", "linkReference", "image", "imageReference", "footnote", "footnoteReference", "sentence", "whitespace", "word", "break", "inlineMath"]; | 
						|
var INLINE_NODE_WRAPPER_TYPES = INLINE_NODE_TYPES.concat(["tableCell", "paragraph", "heading"]); | 
						|
var kRegex = new RegExp(kPattern); | 
						|
var punctuationRegex = new RegExp(punctuationPattern); | 
						|
/** | 
						|
 * split text into whitespaces and words | 
						|
 * @param {string} text | 
						|
 * @return {Array<{ type: "whitespace", value: " " | "\n" | "" } | { type: "word", value: string }>} | 
						|
 */ | 
						|
 | 
						|
function splitText(text, options) { | 
						|
  var KIND_NON_CJK = "non-cjk"; | 
						|
  var KIND_CJ_LETTER = "cj-letter"; | 
						|
  var KIND_K_LETTER = "k-letter"; | 
						|
  var KIND_CJK_PUNCTUATION = "cjk-punctuation"; | 
						|
  var nodes = []; | 
						|
  (options.proseWrap === "preserve" ? text : text.replace(new RegExp(`(${cjkPattern})\n(${cjkPattern})`, "g"), "$1$2")).split(/([ \t\n]+)/).forEach(function (token, index, tokens) { | 
						|
    // whitespace | 
						|
    if (index % 2 === 1) { | 
						|
      nodes.push({ | 
						|
        type: "whitespace", | 
						|
        value: /\n/.test(token) ? "\n" : " " | 
						|
      }); | 
						|
      return; | 
						|
    } // word separated by whitespace | 
						|
 | 
						|
 | 
						|
    if ((index === 0 || index === tokens.length - 1) && token === "") { | 
						|
      return; | 
						|
    } | 
						|
 | 
						|
    token.split(new RegExp(`(${cjkPattern})`)).forEach(function (innerToken, innerIndex, innerTokens) { | 
						|
      if ((innerIndex === 0 || innerIndex === innerTokens.length - 1) && innerToken === "") { | 
						|
        return; | 
						|
      } // non-CJK word | 
						|
 | 
						|
 | 
						|
      if (innerIndex % 2 === 0) { | 
						|
        if (innerToken !== "") { | 
						|
          appendNode({ | 
						|
            type: "word", | 
						|
            value: innerToken, | 
						|
            kind: KIND_NON_CJK, | 
						|
            hasLeadingPunctuation: punctuationRegex.test(innerToken[0]), | 
						|
            hasTrailingPunctuation: punctuationRegex.test(getLast$3(innerToken)) | 
						|
          }); | 
						|
        } | 
						|
 | 
						|
        return; | 
						|
      } // CJK character | 
						|
 | 
						|
 | 
						|
      appendNode(punctuationRegex.test(innerToken) ? { | 
						|
        type: "word", | 
						|
        value: innerToken, | 
						|
        kind: KIND_CJK_PUNCTUATION, | 
						|
        hasLeadingPunctuation: true, | 
						|
        hasTrailingPunctuation: true | 
						|
      } : { | 
						|
        type: "word", | 
						|
        value: innerToken, | 
						|
        kind: kRegex.test(innerToken) ? KIND_K_LETTER : KIND_CJ_LETTER, | 
						|
        hasLeadingPunctuation: false, | 
						|
        hasTrailingPunctuation: false | 
						|
      }); | 
						|
    }); | 
						|
  }); | 
						|
  return nodes; | 
						|
 | 
						|
  function appendNode(node) { | 
						|
    var lastNode = getLast$3(nodes); | 
						|
 | 
						|
    if (lastNode && lastNode.type === "word") { | 
						|
      if (lastNode.kind === KIND_NON_CJK && node.kind === KIND_CJ_LETTER && !lastNode.hasTrailingPunctuation || lastNode.kind === KIND_CJ_LETTER && node.kind === KIND_NON_CJK && !node.hasLeadingPunctuation) { | 
						|
        nodes.push({ | 
						|
          type: "whitespace", | 
						|
          value: " " | 
						|
        }); | 
						|
      } else if (!isBetween(KIND_NON_CJK, KIND_CJK_PUNCTUATION) && // disallow leading/trailing full-width whitespace | 
						|
      ![lastNode.value, node.value].some(function (value) { | 
						|
        return /\u3000/.test(value); | 
						|
      })) { | 
						|
        nodes.push({ | 
						|
          type: "whitespace", | 
						|
          value: "" | 
						|
        }); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    nodes.push(node); | 
						|
 | 
						|
    function isBetween(kind1, kind2) { | 
						|
      return lastNode.kind === kind1 && node.kind === kind2 || lastNode.kind === kind2 && node.kind === kind1; | 
						|
    } | 
						|
  } | 
						|
} | 
						|
 | 
						|
function getOrderedListItemInfo(orderListItem, originalText) { | 
						|
  var _originalText$slice$m = originalText.slice(orderListItem.position.start.offset, orderListItem.position.end.offset).match(/^\s*(\d+)(\.|\))(\s*)/), | 
						|
      _originalText$slice$m2 = _slicedToArray(_originalText$slice$m, 4), | 
						|
      numberText = _originalText$slice$m2[1], | 
						|
      marker = _originalText$slice$m2[2], | 
						|
      leadingSpaces = _originalText$slice$m2[3]; | 
						|
 | 
						|
  return { | 
						|
    numberText, | 
						|
    marker, | 
						|
    leadingSpaces | 
						|
  }; | 
						|
} // workaround for https://github.com/remarkjs/remark/issues/351 | 
						|
// leading and trailing newlines are stripped by remark | 
						|
 | 
						|
 | 
						|
function getFencedCodeBlockValue(node, originalText) { | 
						|
  var text = originalText.slice(node.position.start.offset, node.position.end.offset); | 
						|
  var leadingSpaceCount = text.match(/^\s*/)[0].length; | 
						|
  var replaceRegex = new RegExp(`^\\s{0,${leadingSpaceCount}}`); | 
						|
  var lineContents = text.split("\n"); | 
						|
  var markerStyle = text[leadingSpaceCount]; // ` or ~ | 
						|
 | 
						|
  var marker = text.slice(leadingSpaceCount).match(new RegExp(`^[${markerStyle}]+`))[0]; // https://spec.commonmark.org/0.28/#example-104: Closing fences may be indented by 0-3 spaces | 
						|
  // https://spec.commonmark.org/0.28/#example-93: The closing code fence must be at least as long as the opening fence | 
						|
 | 
						|
  var hasEndMarker = new RegExp(`^\\s{0,3}${marker}`).test(lineContents[lineContents.length - 1].slice(getIndent(lineContents.length - 1))); | 
						|
  return lineContents.slice(1, hasEndMarker ? -1 : undefined).map(function (x, i) { | 
						|
    return x.slice(getIndent(i + 1)).replace(replaceRegex, ""); | 
						|
  }).join("\n"); | 
						|
 | 
						|
  function getIndent(lineIndex) { | 
						|
    return node.position.indent[lineIndex - 1] - 1; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function mapAst(ast, handler) { | 
						|
  return function preorder(node, index, parentStack) { | 
						|
    parentStack = parentStack || []; | 
						|
    var newNode = handler(node, index, parentStack); | 
						|
 | 
						|
    if (Array.isArray(newNode)) { | 
						|
      return newNode; | 
						|
    } | 
						|
 | 
						|
    newNode = Object.assign({}, newNode); | 
						|
 | 
						|
    if (newNode.children) { | 
						|
      newNode.children = newNode.children.reduce(function (nodes, child, index) { | 
						|
        var newNodes = preorder(child, index, [newNode].concat(parentStack)); | 
						|
 | 
						|
        if (!Array.isArray(newNodes)) { | 
						|
          newNodes = [newNodes]; | 
						|
        } | 
						|
 | 
						|
        nodes.push.apply(nodes, newNodes); | 
						|
        return nodes; | 
						|
      }, []); | 
						|
    } | 
						|
 | 
						|
    return newNode; | 
						|
  }(ast, null, null); | 
						|
} | 
						|
 | 
						|
var utils$4 = { | 
						|
  mapAst, | 
						|
  splitText, | 
						|
  punctuationPattern, | 
						|
  getFencedCodeBlockValue, | 
						|
  getOrderedListItemInfo, | 
						|
  INLINE_NODE_TYPES, | 
						|
  INLINE_NODE_WRAPPER_TYPES | 
						|
}; | 
						|
 | 
						|
var _require$$0$builders$6 = doc.builders, | 
						|
    hardline$a = _require$$0$builders$6.hardline, | 
						|
    literalline$4 = _require$$0$builders$6.literalline, | 
						|
    concat$c = _require$$0$builders$6.concat, | 
						|
    markAsRoot$2 = _require$$0$builders$6.markAsRoot, | 
						|
    mapDoc$5 = doc.utils.mapDoc; | 
						|
var getFencedCodeBlockValue$1 = utils$4.getFencedCodeBlockValue; | 
						|
 | 
						|
function embed$2(path, print, textToDoc, options) { | 
						|
  var node = path.getValue(); | 
						|
 | 
						|
  if (node.type === "code" && node.lang !== null) { | 
						|
    // only look for the first string so as to support [markdown-preview-enhanced](https://shd101wyy.github.io/markdown-preview-enhanced/#/code-chunk) | 
						|
    var langMatch = node.lang.match(/^[A-Za-z0-9_-]+/); | 
						|
    var lang = langMatch ? langMatch[0] : ""; | 
						|
    var parser = getParserName(lang); | 
						|
 | 
						|
    if (parser) { | 
						|
      var styleUnit = options.__inJsTemplate ? "~" : "`"; | 
						|
      var style = styleUnit.repeat(Math.max(3, util.getMaxContinuousCount(node.value, styleUnit) + 1)); | 
						|
      var doc = textToDoc(getFencedCodeBlockValue$1(node, options.originalText), { | 
						|
        parser | 
						|
      }); | 
						|
      return markAsRoot$2(concat$c([style, node.lang, hardline$a, replaceNewlinesWithLiterallines(doc), style])); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  if (node.type === "yaml") { | 
						|
    return markAsRoot$2(concat$c(["---", hardline$a, node.value && node.value.trim() ? replaceNewlinesWithLiterallines(textToDoc(node.value, { | 
						|
      parser: "yaml" | 
						|
    })) : "", "---"])); | 
						|
  } // MDX | 
						|
 | 
						|
 | 
						|
  switch (node.type) { | 
						|
    case "importExport": | 
						|
      return textToDoc(node.value, { | 
						|
        parser: "babel" | 
						|
      }); | 
						|
 | 
						|
    case "jsx": | 
						|
      return textToDoc(node.value, { | 
						|
        parser: "__js_expression" | 
						|
      }); | 
						|
  } | 
						|
 | 
						|
  return null; | 
						|
 | 
						|
  function getParserName(lang) { | 
						|
    var supportInfo = support.getSupportInfo(null, { | 
						|
      plugins: options.plugins | 
						|
    }); | 
						|
    var language = supportInfo.languages.find(function (language) { | 
						|
      return language.name.toLowerCase() === lang || language.aliases && language.aliases.indexOf(lang) !== -1 || language.extensions && language.extensions.find(function (ext) { | 
						|
        return ext.substring(1) === lang; | 
						|
      }); | 
						|
    }); | 
						|
 | 
						|
    if (language) { | 
						|
      return language.parsers[0]; | 
						|
    } | 
						|
 | 
						|
    return null; | 
						|
  } | 
						|
 | 
						|
  function replaceNewlinesWithLiterallines(doc) { | 
						|
    return mapDoc$5(doc, function (currentDoc) { | 
						|
      return typeof currentDoc === "string" && currentDoc.includes("\n") ? concat$c(currentDoc.split(/(\n)/g).map(function (v, i) { | 
						|
        return i % 2 === 0 ? v : literalline$4; | 
						|
      })) : currentDoc; | 
						|
    }); | 
						|
  } | 
						|
} | 
						|
 | 
						|
var embed_1$2 = embed$2; | 
						|
 | 
						|
var pragmas = ["format", "prettier"]; | 
						|
 | 
						|
function startWithPragma(text) { | 
						|
  var pragma = `@(${pragmas.join("|")})`; | 
						|
  var regex = new RegExp([`<!--\\s*${pragma}\\s*-->`, `<!--.*\r?\n[\\s\\S]*(^|\n)[^\\S\n]*${pragma}[^\\S\n]*($|\n)[\\s\\S]*\n.*-->`].join("|"), "m"); | 
						|
  var matched = text.match(regex); | 
						|
  return matched && matched.index === 0; | 
						|
} | 
						|
 | 
						|
var pragma$3 = { | 
						|
  startWithPragma, | 
						|
  hasPragma: function hasPragma(text) { | 
						|
    return startWithPragma(frontMatter(text).content.trimLeft()); | 
						|
  }, | 
						|
  insertPragma: function insertPragma(text) { | 
						|
    var extracted = frontMatter(text); | 
						|
    var pragma = `<!-- @${pragmas[0]} -->`; | 
						|
    return extracted.frontMatter ? `${extracted.frontMatter.raw}\n\n${pragma}\n\n${extracted.content}` : `${pragma}\n\n${extracted.content}`; | 
						|
  } | 
						|
}; | 
						|
 | 
						|
var getOrderedListItemInfo$1 = utils$4.getOrderedListItemInfo, | 
						|
    mapAst$1 = utils$4.mapAst, | 
						|
    splitText$1 = utils$4.splitText; // 0x0 ~ 0x10ffff | 
						|
// eslint-disable-next-line no-control-regex | 
						|
 | 
						|
var isSingleCharRegex = /^([\u0000-\uffff]|[\ud800-\udbff][\udc00-\udfff])$/; | 
						|
 | 
						|
function preprocess$1(ast, options) { | 
						|
  ast = restoreUnescapedCharacter(ast, options); | 
						|
  ast = mergeContinuousTexts(ast); | 
						|
  ast = transformInlineCode(ast); | 
						|
  ast = transformIndentedCodeblockAndMarkItsParentList(ast, options); | 
						|
  ast = markAlignedList(ast, options); | 
						|
  ast = splitTextIntoSentences(ast, options); | 
						|
  ast = transformImportExport(ast); | 
						|
  ast = mergeContinuousImportExport(ast); | 
						|
  return ast; | 
						|
} | 
						|
 | 
						|
function transformImportExport(ast) { | 
						|
  return mapAst$1(ast, function (node) { | 
						|
    if (node.type !== "import" && node.type !== "export") { | 
						|
      return node; | 
						|
    } | 
						|
 | 
						|
    return Object.assign({}, node, { | 
						|
      type: "importExport" | 
						|
    }); | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function transformInlineCode(ast) { | 
						|
  return mapAst$1(ast, function (node) { | 
						|
    if (node.type !== "inlineCode") { | 
						|
      return node; | 
						|
    } | 
						|
 | 
						|
    return Object.assign({}, node, { | 
						|
      value: node.value.replace(/\s+/g, " ") | 
						|
    }); | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function restoreUnescapedCharacter(ast, options) { | 
						|
  return mapAst$1(ast, function (node) { | 
						|
    return node.type !== "text" ? node : Object.assign({}, node, { | 
						|
      value: node.value !== "*" && node.value !== "_" && node.value !== "$" && // handle these cases in printer | 
						|
      isSingleCharRegex.test(node.value) && node.position.end.offset - node.position.start.offset !== node.value.length ? options.originalText.slice(node.position.start.offset, node.position.end.offset) : node.value | 
						|
    }); | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function mergeContinuousImportExport(ast) { | 
						|
  return mergeChildren(ast, function (prevNode, node) { | 
						|
    return prevNode.type === "importExport" && node.type === "importExport"; | 
						|
  }, function (prevNode, node) { | 
						|
    return { | 
						|
      type: "importExport", | 
						|
      value: prevNode.value + "\n\n" + node.value, | 
						|
      position: { | 
						|
        start: prevNode.position.start, | 
						|
        end: node.position.end | 
						|
      } | 
						|
    }; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function mergeChildren(ast, shouldMerge, mergeNode) { | 
						|
  return mapAst$1(ast, function (node) { | 
						|
    if (!node.children) { | 
						|
      return node; | 
						|
    } | 
						|
 | 
						|
    var children = node.children.reduce(function (current, child) { | 
						|
      var lastChild = current[current.length - 1]; | 
						|
 | 
						|
      if (lastChild && shouldMerge(lastChild, child)) { | 
						|
        current.splice(-1, 1, mergeNode(lastChild, child)); | 
						|
      } else { | 
						|
        current.push(child); | 
						|
      } | 
						|
 | 
						|
      return current; | 
						|
    }, []); | 
						|
    return Object.assign({}, node, { | 
						|
      children | 
						|
    }); | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function mergeContinuousTexts(ast) { | 
						|
  return mergeChildren(ast, function (prevNode, node) { | 
						|
    return prevNode.type === "text" && node.type === "text"; | 
						|
  }, function (prevNode, node) { | 
						|
    return { | 
						|
      type: "text", | 
						|
      value: prevNode.value + node.value, | 
						|
      position: { | 
						|
        start: prevNode.position.start, | 
						|
        end: node.position.end | 
						|
      } | 
						|
    }; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function splitTextIntoSentences(ast, options) { | 
						|
  return mapAst$1(ast, function (node, index, _ref) { | 
						|
    var _ref2 = _slicedToArray(_ref, 1), | 
						|
        parentNode = _ref2[0]; | 
						|
 | 
						|
    if (node.type !== "text") { | 
						|
      return node; | 
						|
    } | 
						|
 | 
						|
    var value = node.value; | 
						|
 | 
						|
    if (parentNode.type === "paragraph") { | 
						|
      if (index === 0) { | 
						|
        value = value.trimLeft(); | 
						|
      } | 
						|
 | 
						|
      if (index === parentNode.children.length - 1) { | 
						|
        value = value.trimRight(); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return { | 
						|
      type: "sentence", | 
						|
      position: node.position, | 
						|
      children: splitText$1(value, options) | 
						|
    }; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function transformIndentedCodeblockAndMarkItsParentList(ast, options) { | 
						|
  return mapAst$1(ast, function (node, index, parentStack) { | 
						|
    if (node.type === "code") { | 
						|
      // the first char may point to `\n`, e.g. `\n\t\tbar`, just ignore it | 
						|
      var isIndented = /^\n?( {4,}|\t)/.test(options.originalText.slice(node.position.start.offset, node.position.end.offset)); | 
						|
      node.isIndented = isIndented; | 
						|
 | 
						|
      if (isIndented) { | 
						|
        for (var i = 0; i < parentStack.length; i++) { | 
						|
          var parent = parentStack[i]; // no need to check checked items | 
						|
 | 
						|
          if (parent.hasIndentedCodeblock) { | 
						|
            break; | 
						|
          } | 
						|
 | 
						|
          if (parent.type === "list") { | 
						|
            parent.hasIndentedCodeblock = true; | 
						|
          } | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return node; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function markAlignedList(ast, options) { | 
						|
  return mapAst$1(ast, function (node, index, parentStack) { | 
						|
    if (node.type === "list" && node.children.length !== 0) { | 
						|
      // if one of its parents is not aligned, it's not possible to be aligned in sub-lists | 
						|
      for (var i = 0; i < parentStack.length; i++) { | 
						|
        var parent = parentStack[i]; | 
						|
 | 
						|
        if (parent.type === "list" && !parent.isAligned) { | 
						|
          node.isAligned = false; | 
						|
          return node; | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      node.isAligned = isAligned(node); | 
						|
    } | 
						|
 | 
						|
    return node; | 
						|
  }); | 
						|
 | 
						|
  function getListItemStart(listItem) { | 
						|
    return listItem.children.length === 0 ? -1 : listItem.children[0].position.start.column - 1; | 
						|
  } | 
						|
 | 
						|
  function isAligned(list) { | 
						|
    if (!list.ordered) { | 
						|
      /** | 
						|
       * - 123 | 
						|
       * - 123 | 
						|
       */ | 
						|
      return true; | 
						|
    } | 
						|
 | 
						|
    var _list$children = _slicedToArray(list.children, 2), | 
						|
        firstItem = _list$children[0], | 
						|
        secondItem = _list$children[1]; | 
						|
 | 
						|
    var firstInfo = getOrderedListItemInfo$1(firstItem, options.originalText); | 
						|
 | 
						|
    if (firstInfo.leadingSpaces.length > 1) { | 
						|
      /** | 
						|
       * 1.   123 | 
						|
       * | 
						|
       * 1.   123 | 
						|
       * 1. 123 | 
						|
       */ | 
						|
      return true; | 
						|
    } | 
						|
 | 
						|
    var firstStart = getListItemStart(firstItem); | 
						|
 | 
						|
    if (firstStart === -1) { | 
						|
      /** | 
						|
       * 1. | 
						|
       * | 
						|
       * 1. | 
						|
       * 1. | 
						|
       */ | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    if (list.children.length === 1) { | 
						|
      /** | 
						|
       * aligned: | 
						|
       * | 
						|
       * 11. 123 | 
						|
       * | 
						|
       * not aligned: | 
						|
       * | 
						|
       * 1. 123 | 
						|
       */ | 
						|
      return firstStart % options.tabWidth === 0; | 
						|
    } | 
						|
 | 
						|
    var secondStart = getListItemStart(secondItem); | 
						|
 | 
						|
    if (firstStart !== secondStart) { | 
						|
      /** | 
						|
       * 11. 123 | 
						|
       * 1. 123 | 
						|
       * | 
						|
       * 1. 123 | 
						|
       * 11. 123 | 
						|
       */ | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    if (firstStart % options.tabWidth === 0) { | 
						|
      /** | 
						|
       * 11. 123 | 
						|
       * 12. 123 | 
						|
       */ | 
						|
      return true; | 
						|
    } | 
						|
    /** | 
						|
     * aligned: | 
						|
     * | 
						|
     * 11. 123 | 
						|
     * 1.  123 | 
						|
     * | 
						|
     * not aligned: | 
						|
     * | 
						|
     * 1. 123 | 
						|
     * 2. 123 | 
						|
     */ | 
						|
 | 
						|
 | 
						|
    var secondInfo = getOrderedListItemInfo$1(secondItem, options.originalText); | 
						|
    return secondInfo.leadingSpaces.length > 1; | 
						|
  } | 
						|
} | 
						|
 | 
						|
var preprocess_1$1 = preprocess$1; | 
						|
 | 
						|
var _require$$0$builders$7 = doc.builders, | 
						|
    breakParent$3 = _require$$0$builders$7.breakParent, | 
						|
    concat$d = _require$$0$builders$7.concat, | 
						|
    join$9 = _require$$0$builders$7.join, | 
						|
    line$6 = _require$$0$builders$7.line, | 
						|
    literalline$5 = _require$$0$builders$7.literalline, | 
						|
    markAsRoot$3 = _require$$0$builders$7.markAsRoot, | 
						|
    hardline$b = _require$$0$builders$7.hardline, | 
						|
    softline$6 = _require$$0$builders$7.softline, | 
						|
    ifBreak$5 = _require$$0$builders$7.ifBreak, | 
						|
    fill$4 = _require$$0$builders$7.fill, | 
						|
    align$2 = _require$$0$builders$7.align, | 
						|
    indent$8 = _require$$0$builders$7.indent, | 
						|
    group$d = _require$$0$builders$7.group, | 
						|
    mapDoc$6 = doc.utils.mapDoc, | 
						|
    printDocToString$3 = doc.printer.printDocToString; | 
						|
var getFencedCodeBlockValue$2 = utils$4.getFencedCodeBlockValue, | 
						|
    getOrderedListItemInfo$2 = utils$4.getOrderedListItemInfo, | 
						|
    splitText$2 = utils$4.splitText, | 
						|
    punctuationPattern$1 = utils$4.punctuationPattern, | 
						|
    INLINE_NODE_TYPES$1 = utils$4.INLINE_NODE_TYPES, | 
						|
    INLINE_NODE_WRAPPER_TYPES$1 = utils$4.INLINE_NODE_WRAPPER_TYPES; | 
						|
var replaceEndOfLineWith$1 = util.replaceEndOfLineWith; | 
						|
var TRAILING_HARDLINE_NODES = ["importExport"]; | 
						|
var SINGLE_LINE_NODE_TYPES = ["heading", "tableCell", "link"]; | 
						|
var SIBLING_NODE_TYPES = ["listItem", "definition", "footnoteDefinition", "jsx"]; | 
						|
 | 
						|
function genericPrint$4(path, options, print) { | 
						|
  var node = path.getValue(); | 
						|
 | 
						|
  if (shouldRemainTheSameContent(path)) { | 
						|
    return concat$d(splitText$2(options.originalText.slice(node.position.start.offset, node.position.end.offset), options).map(function (node) { | 
						|
      return node.type === "word" ? node.value : node.value === "" ? "" : printLine(path, node.value, options); | 
						|
    })); | 
						|
  } | 
						|
 | 
						|
  switch (node.type) { | 
						|
    case "root": | 
						|
      if (node.children.length === 0) { | 
						|
        return ""; | 
						|
      } | 
						|
 | 
						|
      return concat$d([normalizeDoc(printRoot(path, options, print)), TRAILING_HARDLINE_NODES.indexOf(getLastDescendantNode(node).type) === -1 ? hardline$b : ""]); | 
						|
 | 
						|
    case "paragraph": | 
						|
      return printChildren$1(path, options, print, { | 
						|
        postprocessor: fill$4 | 
						|
      }); | 
						|
 | 
						|
    case "sentence": | 
						|
      return printChildren$1(path, options, print); | 
						|
 | 
						|
    case "word": | 
						|
      return node.value.replace(/[*$]/g, "\\$&") // escape all `*` and `$` (math) | 
						|
      .replace(new RegExp([`(^|${punctuationPattern$1})(_+)`, `(_+)(${punctuationPattern$1}|$)`].join("|"), "g"), function (_, text1, underscore1, underscore2, text2) { | 
						|
        return (underscore1 ? `${text1}${underscore1}` : `${underscore2}${text2}`).replace(/_/g, "\\_"); | 
						|
      }); | 
						|
    // escape all `_` except concating with non-punctuation, e.g. `1_2_3` is not considered emphasis | 
						|
 | 
						|
    case "whitespace": | 
						|
      { | 
						|
        var parentNode = path.getParentNode(); | 
						|
        var index = parentNode.children.indexOf(node); | 
						|
        var nextNode = parentNode.children[index + 1]; | 
						|
        var proseWrap = // leading char that may cause different syntax | 
						|
        nextNode && /^>|^([-+*]|#{1,6}|[0-9]+[.)])$/.test(nextNode.value) ? "never" : options.proseWrap; | 
						|
        return printLine(path, node.value, { | 
						|
          proseWrap | 
						|
        }); | 
						|
      } | 
						|
 | 
						|
    case "emphasis": | 
						|
      { | 
						|
        var _parentNode = path.getParentNode(); | 
						|
 | 
						|
        var _index = _parentNode.children.indexOf(node); | 
						|
 | 
						|
        var prevNode = _parentNode.children[_index - 1]; | 
						|
        var _nextNode = _parentNode.children[_index + 1]; | 
						|
        var hasPrevOrNextWord = // `1*2*3` is considered emphasis but `1_2_3` is not | 
						|
        prevNode && prevNode.type === "sentence" && prevNode.children.length > 0 && util.getLast(prevNode.children).type === "word" && !util.getLast(prevNode.children).hasTrailingPunctuation || _nextNode && _nextNode.type === "sentence" && _nextNode.children.length > 0 && _nextNode.children[0].type === "word" && !_nextNode.children[0].hasLeadingPunctuation; | 
						|
        var style = hasPrevOrNextWord || getAncestorNode$2(path, "emphasis") ? "*" : "_"; | 
						|
        return concat$d([style, printChildren$1(path, options, print), style]); | 
						|
      } | 
						|
 | 
						|
    case "strong": | 
						|
      return concat$d(["**", printChildren$1(path, options, print), "**"]); | 
						|
 | 
						|
    case "delete": | 
						|
      return concat$d(["~~", printChildren$1(path, options, print), "~~"]); | 
						|
 | 
						|
    case "inlineCode": | 
						|
      { | 
						|
        var backtickCount = util.getMinNotPresentContinuousCount(node.value, "`"); | 
						|
 | 
						|
        var _style = "`".repeat(backtickCount || 1); | 
						|
 | 
						|
        var gap = backtickCount ? " " : ""; | 
						|
        return concat$d([_style, gap, node.value, gap, _style]); | 
						|
      } | 
						|
 | 
						|
    case "link": | 
						|
      switch (options.originalText[node.position.start.offset]) { | 
						|
        case "<": | 
						|
          { | 
						|
            var mailto = "mailto:"; | 
						|
            var url = // <hello@example.com> is parsed as { url: "mailto:hello@example.com" } | 
						|
            node.url.startsWith(mailto) && options.originalText.slice(node.position.start.offset + 1, node.position.start.offset + 1 + mailto.length) !== mailto ? node.url.slice(mailto.length) : node.url; | 
						|
            return concat$d(["<", url, ">"]); | 
						|
          } | 
						|
 | 
						|
        case "[": | 
						|
          return concat$d(["[", printChildren$1(path, options, print), "](", printUrl(node.url, ")"), printTitle(node.title, options), ")"]); | 
						|
 | 
						|
        default: | 
						|
          return options.originalText.slice(node.position.start.offset, node.position.end.offset); | 
						|
      } | 
						|
 | 
						|
    case "image": | 
						|
      return concat$d([""), printTitle(node.title, options), ")"]); | 
						|
 | 
						|
    case "blockquote": | 
						|
      return concat$d(["> ", align$2("> ", printChildren$1(path, options, print))]); | 
						|
 | 
						|
    case "heading": | 
						|
      return concat$d(["#".repeat(node.depth) + " ", printChildren$1(path, options, print)]); | 
						|
 | 
						|
    case "code": | 
						|
      { | 
						|
        if (node.isIndented) { | 
						|
          // indented code block | 
						|
          var alignment = " ".repeat(4); | 
						|
          return align$2(alignment, concat$d([alignment, concat$d(replaceEndOfLineWith$1(node.value, hardline$b))])); | 
						|
        } // fenced code block | 
						|
 | 
						|
 | 
						|
        var styleUnit = options.__inJsTemplate ? "~" : "`"; | 
						|
 | 
						|
        var _style2 = styleUnit.repeat(Math.max(3, util.getMaxContinuousCount(node.value, styleUnit) + 1)); | 
						|
 | 
						|
        return concat$d([_style2, node.lang || "", hardline$b, concat$d(replaceEndOfLineWith$1(getFencedCodeBlockValue$2(node, options.originalText), hardline$b)), hardline$b, _style2]); | 
						|
      } | 
						|
 | 
						|
    case "yaml": | 
						|
    case "toml": | 
						|
      return options.originalText.slice(node.position.start.offset, node.position.end.offset); | 
						|
 | 
						|
    case "html": | 
						|
      { | 
						|
        var _parentNode2 = path.getParentNode(); | 
						|
 | 
						|
        var value = _parentNode2.type === "root" && util.getLast(_parentNode2.children) === node ? node.value.trimRight() : node.value; | 
						|
        var isHtmlComment = /^<!--[\s\S]*-->$/.test(value); | 
						|
        return concat$d(replaceEndOfLineWith$1(value, isHtmlComment ? hardline$b : markAsRoot$3(literalline$5))); | 
						|
      } | 
						|
 | 
						|
    case "list": | 
						|
      { | 
						|
        var nthSiblingIndex = getNthListSiblingIndex(node, path.getParentNode()); | 
						|
        var isGitDiffFriendlyOrderedList = node.ordered && node.children.length > 1 && +getOrderedListItemInfo$2(node.children[1], options.originalText).numberText === 1; | 
						|
        return printChildren$1(path, options, print, { | 
						|
          processor: function processor(childPath, index) { | 
						|
            var prefix = getPrefix(); | 
						|
            return concat$d([prefix, align$2(" ".repeat(prefix.length), printListItem(childPath, options, print, prefix))]); | 
						|
 | 
						|
            function getPrefix() { | 
						|
              var rawPrefix = node.ordered ? (index === 0 ? node.start : isGitDiffFriendlyOrderedList ? 1 : node.start + index) + (nthSiblingIndex % 2 === 0 ? ". " : ") ") : nthSiblingIndex % 2 === 0 ? "- " : "* "; | 
						|
              return node.isAligned || | 
						|
              /* workaround for https://github.com/remarkjs/remark/issues/315 */ | 
						|
              node.hasIndentedCodeblock ? alignListPrefix(rawPrefix, options) : rawPrefix; | 
						|
            } | 
						|
          } | 
						|
        }); | 
						|
      } | 
						|
 | 
						|
    case "thematicBreak": | 
						|
      { | 
						|
        var counter = getAncestorCounter$1(path, "list"); | 
						|
 | 
						|
        if (counter === -1) { | 
						|
          return "---"; | 
						|
        } | 
						|
 | 
						|
        var _nthSiblingIndex = getNthListSiblingIndex(path.getParentNode(counter), path.getParentNode(counter + 1)); | 
						|
 | 
						|
        return _nthSiblingIndex % 2 === 0 ? "***" : "---"; | 
						|
      } | 
						|
 | 
						|
    case "linkReference": | 
						|
      return concat$d(["[", printChildren$1(path, options, print), "]", node.referenceType === "full" ? concat$d(["[", node.identifier, "]"]) : node.referenceType === "collapsed" ? "[]" : ""]); | 
						|
 | 
						|
    case "imageReference": | 
						|
      switch (node.referenceType) { | 
						|
        case "full": | 
						|
          return concat$d(["![", node.alt || "", "][", node.identifier, "]"]); | 
						|
 | 
						|
        default: | 
						|
          return concat$d(["![", node.alt, "]", node.referenceType === "collapsed" ? "[]" : ""]); | 
						|
      } | 
						|
 | 
						|
    case "definition": | 
						|
      { | 
						|
        var lineOrSpace = options.proseWrap === "always" ? line$6 : " "; | 
						|
        return group$d(concat$d([concat$d(["[", node.identifier, "]:"]), indent$8(concat$d([lineOrSpace, printUrl(node.url), node.title === null ? "" : concat$d([lineOrSpace, printTitle(node.title, options, false)])]))])); | 
						|
      } | 
						|
 | 
						|
    case "footnote": | 
						|
      return concat$d(["[^", printChildren$1(path, options, print), "]"]); | 
						|
 | 
						|
    case "footnoteReference": | 
						|
      return concat$d(["[^", node.identifier, "]"]); | 
						|
 | 
						|
    case "footnoteDefinition": | 
						|
      { | 
						|
        var _nextNode2 = path.getParentNode().children[path.getName() + 1]; | 
						|
        var shouldInlineFootnote = node.children.length === 1 && node.children[0].type === "paragraph" && (options.proseWrap === "never" || options.proseWrap === "preserve" && node.children[0].position.start.line === node.children[0].position.end.line); | 
						|
        return concat$d(["[^", node.identifier, "]: ", shouldInlineFootnote ? printChildren$1(path, options, print) : group$d(concat$d([align$2(" ".repeat(options.tabWidth), printChildren$1(path, options, print, { | 
						|
          processor: function processor(childPath, index) { | 
						|
            return index === 0 ? group$d(concat$d([softline$6, softline$6, childPath.call(print)])) : childPath.call(print); | 
						|
          } | 
						|
        })), _nextNode2 && _nextNode2.type === "footnoteDefinition" ? softline$6 : ""]))]); | 
						|
      } | 
						|
 | 
						|
    case "table": | 
						|
      return printTable(path, options, print); | 
						|
 | 
						|
    case "tableCell": | 
						|
      return printChildren$1(path, options, print); | 
						|
 | 
						|
    case "break": | 
						|
      return /\s/.test(options.originalText[node.position.start.offset]) ? concat$d(["  ", markAsRoot$3(literalline$5)]) : concat$d(["\\", hardline$b]); | 
						|
 | 
						|
    case "liquidNode": | 
						|
      return concat$d(replaceEndOfLineWith$1(node.value, hardline$b)); | 
						|
    // MDX | 
						|
 | 
						|
    case "importExport": | 
						|
    case "jsx": | 
						|
      return node.value; | 
						|
    // fallback to the original text if multiparser failed | 
						|
 | 
						|
    case "math": | 
						|
      return concat$d(["$$", hardline$b, node.value ? concat$d([concat$d(replaceEndOfLineWith$1(node.value, hardline$b)), hardline$b]) : "", "$$"]); | 
						|
 | 
						|
    case "inlineMath": | 
						|
      { | 
						|
        // remark-math trims content but we don't want to remove whitespaces | 
						|
        // since it's very possible that it's recognized as math accidentally | 
						|
        return options.originalText.slice(options.locStart(node), options.locEnd(node)); | 
						|
      } | 
						|
 | 
						|
    case "tableRow": // handled in "table" | 
						|
 | 
						|
    case "listItem": // handled in "list" | 
						|
 | 
						|
    default: | 
						|
      throw new Error(`Unknown markdown type ${JSON.stringify(node.type)}`); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function printListItem(path, options, print, listPrefix) { | 
						|
  var node = path.getValue(); | 
						|
  var prefix = node.checked === null ? "" : node.checked ? "[x] " : "[ ] "; | 
						|
  return concat$d([prefix, printChildren$1(path, options, print, { | 
						|
    processor: function processor(childPath, index) { | 
						|
      if (index === 0 && childPath.getValue().type !== "list") { | 
						|
        return align$2(" ".repeat(prefix.length), childPath.call(print)); | 
						|
      } | 
						|
 | 
						|
      var alignment = " ".repeat(clamp(options.tabWidth - listPrefix.length, 0, 3) // 4+ will cause indented code block | 
						|
      ); | 
						|
      return concat$d([alignment, align$2(alignment, childPath.call(print))]); | 
						|
    } | 
						|
  })]); | 
						|
} | 
						|
 | 
						|
function alignListPrefix(prefix, options) { | 
						|
  var additionalSpaces = getAdditionalSpaces(); | 
						|
  return prefix + " ".repeat(additionalSpaces >= 4 ? 0 : additionalSpaces // 4+ will cause indented code block | 
						|
  ); | 
						|
 | 
						|
  function getAdditionalSpaces() { | 
						|
    var restSpaces = prefix.length % options.tabWidth; | 
						|
    return restSpaces === 0 ? 0 : options.tabWidth - restSpaces; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function getNthListSiblingIndex(node, parentNode) { | 
						|
  return getNthSiblingIndex(node, parentNode, function (siblingNode) { | 
						|
    return siblingNode.ordered === node.ordered; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function getNthSiblingIndex(node, parentNode, condition) { | 
						|
  condition = condition || function () { | 
						|
    return true; | 
						|
  }; | 
						|
 | 
						|
  var index = -1; | 
						|
  var _iteratorNormalCompletion = true; | 
						|
  var _didIteratorError = false; | 
						|
  var _iteratorError = undefined; | 
						|
 | 
						|
  try { | 
						|
    for (var _iterator = parentNode.children[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | 
						|
      var childNode = _step.value; | 
						|
 | 
						|
      if (childNode.type === node.type && condition(childNode)) { | 
						|
        index++; | 
						|
      } else { | 
						|
        index = -1; | 
						|
      } | 
						|
 | 
						|
      if (childNode === node) { | 
						|
        return index; | 
						|
      } | 
						|
    } | 
						|
  } catch (err) { | 
						|
    _didIteratorError = true; | 
						|
    _iteratorError = err; | 
						|
  } finally { | 
						|
    try { | 
						|
      if (!_iteratorNormalCompletion && _iterator.return != null) { | 
						|
        _iterator.return(); | 
						|
      } | 
						|
    } finally { | 
						|
      if (_didIteratorError) { | 
						|
        throw _iteratorError; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
} | 
						|
 | 
						|
function getAncestorCounter$1(path, typeOrTypes) { | 
						|
  var types = [].concat(typeOrTypes); | 
						|
  var counter = -1; | 
						|
  var ancestorNode; | 
						|
 | 
						|
  while (ancestorNode = path.getParentNode(++counter)) { | 
						|
    if (types.indexOf(ancestorNode.type) !== -1) { | 
						|
      return counter; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return -1; | 
						|
} | 
						|
 | 
						|
function getAncestorNode$2(path, typeOrTypes) { | 
						|
  var counter = getAncestorCounter$1(path, typeOrTypes); | 
						|
  return counter === -1 ? null : path.getParentNode(counter); | 
						|
} | 
						|
 | 
						|
function printLine(path, value, options) { | 
						|
  if (options.proseWrap === "preserve" && value === "\n") { | 
						|
    return hardline$b; | 
						|
  } | 
						|
 | 
						|
  var isBreakable = options.proseWrap === "always" && !getAncestorNode$2(path, SINGLE_LINE_NODE_TYPES); | 
						|
  return value !== "" ? isBreakable ? line$6 : " " : isBreakable ? softline$6 : ""; | 
						|
} | 
						|
 | 
						|
function printTable(path, options, print) { | 
						|
  var hardlineWithoutBreakParent = hardline$b.parts[0]; | 
						|
  var node = path.getValue(); | 
						|
  var contents = []; // { [rowIndex: number]: { [columnIndex: number]: string } } | 
						|
 | 
						|
  path.map(function (rowPath) { | 
						|
    var rowContents = []; | 
						|
    rowPath.map(function (cellPath) { | 
						|
      rowContents.push(printDocToString$3(cellPath.call(print), options).formatted); | 
						|
    }, "children"); | 
						|
    contents.push(rowContents); | 
						|
  }, "children"); // Get the width of each column | 
						|
 | 
						|
  var columnMaxWidths = contents.reduce(function (currentWidths, rowContents) { | 
						|
    return currentWidths.map(function (width, columnIndex) { | 
						|
      return Math.max(width, util.getStringWidth(rowContents[columnIndex])); | 
						|
    }); | 
						|
  }, contents[0].map(function () { | 
						|
    return 3; | 
						|
  }) // minimum width = 3 (---, :--, :-:, --:) | 
						|
  ); | 
						|
  var alignedTable = join$9(hardlineWithoutBreakParent, [printRow(contents[0]), printSeparator(), join$9(hardlineWithoutBreakParent, contents.slice(1).map(function (rowContents) { | 
						|
    return printRow(rowContents); | 
						|
  }))]); | 
						|
 | 
						|
  if (options.proseWrap !== "never") { | 
						|
    return concat$d([breakParent$3, alignedTable]); | 
						|
  } // Only if the --prose-wrap never is set and it exceeds the print width. | 
						|
 | 
						|
 | 
						|
  var compactTable = join$9(hardlineWithoutBreakParent, [printRow(contents[0], | 
						|
  /* isCompact */ | 
						|
  true), printSeparator( | 
						|
  /* isCompact */ | 
						|
  true), join$9(hardlineWithoutBreakParent, contents.slice(1).map(function (rowContents) { | 
						|
    return printRow(rowContents, | 
						|
    /* isCompact */ | 
						|
    true); | 
						|
  }))]); | 
						|
  return concat$d([breakParent$3, group$d(ifBreak$5(compactTable, alignedTable))]); | 
						|
 | 
						|
  function printSeparator(isCompact) { | 
						|
    return concat$d(["| ", join$9(" | ", columnMaxWidths.map(function (width, index) { | 
						|
      var spaces = isCompact ? 3 : width; | 
						|
 | 
						|
      switch (node.align[index]) { | 
						|
        case "left": | 
						|
          return ":" + "-".repeat(spaces - 1); | 
						|
 | 
						|
        case "right": | 
						|
          return "-".repeat(spaces - 1) + ":"; | 
						|
 | 
						|
        case "center": | 
						|
          return ":" + "-".repeat(spaces - 2) + ":"; | 
						|
 | 
						|
        default: | 
						|
          return "-".repeat(spaces); | 
						|
      } | 
						|
    })), " |"]); | 
						|
  } | 
						|
 | 
						|
  function printRow(rowContents, isCompact) { | 
						|
    return concat$d(["| ", join$9(" | ", isCompact ? rowContents : rowContents.map(function (rowContent, columnIndex) { | 
						|
      switch (node.align[columnIndex]) { | 
						|
        case "right": | 
						|
          return alignRight(rowContent, columnMaxWidths[columnIndex]); | 
						|
 | 
						|
        case "center": | 
						|
          return alignCenter(rowContent, columnMaxWidths[columnIndex]); | 
						|
 | 
						|
        default: | 
						|
          return alignLeft(rowContent, columnMaxWidths[columnIndex]); | 
						|
      } | 
						|
    })), " |"]); | 
						|
  } | 
						|
 | 
						|
  function alignLeft(text, width) { | 
						|
    var spaces = width - util.getStringWidth(text); | 
						|
    return concat$d([text, " ".repeat(spaces)]); | 
						|
  } | 
						|
 | 
						|
  function alignRight(text, width) { | 
						|
    var spaces = width - util.getStringWidth(text); | 
						|
    return concat$d([" ".repeat(spaces), text]); | 
						|
  } | 
						|
 | 
						|
  function alignCenter(text, width) { | 
						|
    var spaces = width - util.getStringWidth(text); | 
						|
    var left = Math.floor(spaces / 2); | 
						|
    var right = spaces - left; | 
						|
    return concat$d([" ".repeat(left), text, " ".repeat(right)]); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function printRoot(path, options, print) { | 
						|
  /** @typedef {{ index: number, offset: number }} IgnorePosition */ | 
						|
 | 
						|
  /** @type {Array<{start: IgnorePosition, end: IgnorePosition}>} */ | 
						|
  var ignoreRanges = []; | 
						|
  /** @type {IgnorePosition | null} */ | 
						|
 | 
						|
  var ignoreStart = null; | 
						|
  var children = path.getValue().children; | 
						|
  children.forEach(function (childNode, index) { | 
						|
    switch (isPrettierIgnore(childNode)) { | 
						|
      case "start": | 
						|
        if (ignoreStart === null) { | 
						|
          ignoreStart = { | 
						|
            index, | 
						|
            offset: childNode.position.end.offset | 
						|
          }; | 
						|
        } | 
						|
 | 
						|
        break; | 
						|
 | 
						|
      case "end": | 
						|
        if (ignoreStart !== null) { | 
						|
          ignoreRanges.push({ | 
						|
            start: ignoreStart, | 
						|
            end: { | 
						|
              index, | 
						|
              offset: childNode.position.start.offset | 
						|
            } | 
						|
          }); | 
						|
          ignoreStart = null; | 
						|
        } | 
						|
 | 
						|
        break; | 
						|
    } | 
						|
  }); | 
						|
  return printChildren$1(path, options, print, { | 
						|
    processor: function processor(childPath, index) { | 
						|
      if (ignoreRanges.length !== 0) { | 
						|
        var ignoreRange = ignoreRanges[0]; | 
						|
 | 
						|
        if (index === ignoreRange.start.index) { | 
						|
          return concat$d([children[ignoreRange.start.index].value, options.originalText.slice(ignoreRange.start.offset, ignoreRange.end.offset), children[ignoreRange.end.index].value]); | 
						|
        } | 
						|
 | 
						|
        if (ignoreRange.start.index < index && index < ignoreRange.end.index) { | 
						|
          return false; | 
						|
        } | 
						|
 | 
						|
        if (index === ignoreRange.end.index) { | 
						|
          ignoreRanges.shift(); | 
						|
          return false; | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      return childPath.call(print); | 
						|
    } | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function printChildren$1(path, options, print, events) { | 
						|
  events = events || {}; | 
						|
  var postprocessor = events.postprocessor || concat$d; | 
						|
 | 
						|
  var processor = events.processor || function (childPath) { | 
						|
    return childPath.call(print); | 
						|
  }; | 
						|
 | 
						|
  var node = path.getValue(); | 
						|
  var parts = []; | 
						|
  var lastChildNode; | 
						|
  path.map(function (childPath, index) { | 
						|
    var childNode = childPath.getValue(); | 
						|
    var result = processor(childPath, index); | 
						|
 | 
						|
    if (result !== false) { | 
						|
      var data = { | 
						|
        parts, | 
						|
        prevNode: lastChildNode, | 
						|
        parentNode: node, | 
						|
        options | 
						|
      }; | 
						|
 | 
						|
      if (!shouldNotPrePrintHardline(childNode, data)) { | 
						|
        parts.push(hardline$b); | 
						|
 | 
						|
        if (lastChildNode && TRAILING_HARDLINE_NODES.indexOf(lastChildNode.type) !== -1) { | 
						|
          if (shouldPrePrintTripleHardline(childNode, data)) { | 
						|
            parts.push(hardline$b); | 
						|
          } | 
						|
        } else { | 
						|
          if (shouldPrePrintDoubleHardline(childNode, data) || shouldPrePrintTripleHardline(childNode, data)) { | 
						|
            parts.push(hardline$b); | 
						|
          } | 
						|
 | 
						|
          if (shouldPrePrintTripleHardline(childNode, data)) { | 
						|
            parts.push(hardline$b); | 
						|
          } | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      parts.push(result); | 
						|
      lastChildNode = childNode; | 
						|
    } | 
						|
  }, "children"); | 
						|
  return postprocessor(parts); | 
						|
} | 
						|
 | 
						|
function getLastDescendantNode(node) { | 
						|
  var current = node; | 
						|
 | 
						|
  while (current.children && current.children.length !== 0) { | 
						|
    current = current.children[current.children.length - 1]; | 
						|
  } | 
						|
 | 
						|
  return current; | 
						|
} | 
						|
/** @return {false | 'next' | 'start' | 'end'} */ | 
						|
 | 
						|
 | 
						|
function isPrettierIgnore(node) { | 
						|
  if (node.type !== "html") { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  var match = node.value.match(/^<!--\s*prettier-ignore(?:-(start|end))?\s*-->$/); | 
						|
  return match === null ? false : match[1] ? match[1] : "next"; | 
						|
} | 
						|
 | 
						|
function isInlineNode(node) { | 
						|
  return node && INLINE_NODE_TYPES$1.indexOf(node.type) !== -1; | 
						|
} | 
						|
 | 
						|
function isEndsWithHardLine(node) { | 
						|
  return node && /\n+$/.test(node.value); | 
						|
} | 
						|
 | 
						|
function last(nodes) { | 
						|
  return nodes && nodes[nodes.length - 1]; | 
						|
} | 
						|
 | 
						|
function shouldNotPrePrintHardline(node, _ref) { | 
						|
  var parentNode = _ref.parentNode, | 
						|
      parts = _ref.parts, | 
						|
      prevNode = _ref.prevNode; | 
						|
  var isFirstNode = parts.length === 0; | 
						|
  var isInlineHTML = node.type === "html" && INLINE_NODE_WRAPPER_TYPES$1.indexOf(parentNode.type) !== -1; | 
						|
  var isAfterHardlineNode = prevNode && (isEndsWithHardLine(prevNode) || isEndsWithHardLine(last(prevNode.children))); | 
						|
  return isFirstNode || isInlineNode(node) || isInlineHTML || isAfterHardlineNode; | 
						|
} | 
						|
 | 
						|
function shouldPrePrintDoubleHardline(node, _ref2) { | 
						|
  var parentNode = _ref2.parentNode, | 
						|
      prevNode = _ref2.prevNode; | 
						|
  var prevNodeType = prevNode && prevNode.type; | 
						|
  var nodeType = node.type; | 
						|
  var isSequence = prevNodeType === nodeType; | 
						|
  var isSiblingNode = isSequence && SIBLING_NODE_TYPES.indexOf(nodeType) !== -1; | 
						|
  var isInTightListItem = parentNode.type === "listItem" && !parentNode.loose; | 
						|
  var isPrevNodeLooseListItem = prevNodeType === "listItem" && prevNode.loose; | 
						|
  var isPrevNodePrettierIgnore = isPrettierIgnore(prevNode) === "next"; | 
						|
  var isBlockHtmlWithoutBlankLineBetweenPrevHtml = nodeType === "html" && prevNodeType === "html" && prevNode.position.end.line + 1 === node.position.start.line; | 
						|
  var isJsxInlineSibling = prevNodeType === "jsx" && isInlineNode(node) || nodeType === "jsx" && isInlineNode(prevNode); | 
						|
  return isPrevNodeLooseListItem || !(isSiblingNode || isInTightListItem || isPrevNodePrettierIgnore || isBlockHtmlWithoutBlankLineBetweenPrevHtml || isJsxInlineSibling); | 
						|
} | 
						|
 | 
						|
function shouldPrePrintTripleHardline(node, data) { | 
						|
  var isPrevNodeList = data.prevNode && data.prevNode.type === "list"; | 
						|
  var isIndentedCode = node.type === "code" && node.isIndented; | 
						|
  return isPrevNodeList && isIndentedCode; | 
						|
} | 
						|
 | 
						|
function shouldRemainTheSameContent(path) { | 
						|
  var ancestorNode = getAncestorNode$2(path, ["linkReference", "imageReference"]); | 
						|
  return ancestorNode && (ancestorNode.type !== "linkReference" || ancestorNode.referenceType !== "full"); | 
						|
} | 
						|
 | 
						|
function normalizeDoc(doc) { | 
						|
  return mapDoc$6(doc, function (currentDoc) { | 
						|
    if (!currentDoc.parts) { | 
						|
      return currentDoc; | 
						|
    } | 
						|
 | 
						|
    if (currentDoc.type === "concat" && currentDoc.parts.length === 1) { | 
						|
      return currentDoc.parts[0]; | 
						|
    } | 
						|
 | 
						|
    var parts = []; | 
						|
    currentDoc.parts.forEach(function (part) { | 
						|
      if (part.type === "concat") { | 
						|
        parts.push.apply(parts, part.parts); | 
						|
      } else if (part !== "") { | 
						|
        parts.push(part); | 
						|
      } | 
						|
    }); | 
						|
    return Object.assign({}, currentDoc, { | 
						|
      parts: normalizeParts(parts) | 
						|
    }); | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function printUrl(url, dangerousCharOrChars) { | 
						|
  var dangerousChars = [" "].concat(dangerousCharOrChars || []); | 
						|
  return new RegExp(dangerousChars.map(function (x) { | 
						|
    return `\\${x}`; | 
						|
  }).join("|")).test(url) ? `<${url}>` : url; | 
						|
} | 
						|
 | 
						|
function printTitle(title, options, printSpace) { | 
						|
  if (printSpace == null) { | 
						|
    printSpace = true; | 
						|
  } | 
						|
 | 
						|
  if (!title) { | 
						|
    return ""; | 
						|
  } | 
						|
 | 
						|
  if (printSpace) { | 
						|
    return " " + printTitle(title, options, false); | 
						|
  } | 
						|
 | 
						|
  if (title.includes('"') && title.includes("'") && !title.includes(")")) { | 
						|
    return `(${title})`; // avoid escaped quotes | 
						|
  } // faster than using RegExps: https://jsperf.com/performance-of-match-vs-split | 
						|
 | 
						|
 | 
						|
  var singleCount = title.split("'").length - 1; | 
						|
  var doubleCount = title.split('"').length - 1; | 
						|
  var quote = singleCount > doubleCount ? '"' : doubleCount > singleCount ? "'" : options.singleQuote ? "'" : '"'; | 
						|
  title = title.replace(new RegExp(`(${quote})`, "g"), "\\$1"); | 
						|
  return `${quote}${title}${quote}`; | 
						|
} | 
						|
 | 
						|
function normalizeParts(parts) { | 
						|
  return parts.reduce(function (current, part) { | 
						|
    var lastPart = util.getLast(current); | 
						|
 | 
						|
    if (typeof lastPart === "string" && typeof part === "string") { | 
						|
      current.splice(-1, 1, lastPart + part); | 
						|
    } else { | 
						|
      current.push(part); | 
						|
    } | 
						|
 | 
						|
    return current; | 
						|
  }, []); | 
						|
} | 
						|
 | 
						|
function clamp(value, min, max) { | 
						|
  return value < min ? min : value > max ? max : value; | 
						|
} | 
						|
 | 
						|
function clean$5(ast, newObj, parent) { | 
						|
  delete newObj.position; | 
						|
  delete newObj.raw; // front-matter | 
						|
  // for codeblock | 
						|
 | 
						|
  if (ast.type === "code" || ast.type === "yaml" || ast.type === "import" || ast.type === "export" || ast.type === "jsx") { | 
						|
    delete newObj.value; | 
						|
  } | 
						|
 | 
						|
  if (ast.type === "list") { | 
						|
    delete newObj.isAligned; | 
						|
  } // texts can be splitted or merged | 
						|
 | 
						|
 | 
						|
  if (ast.type === "text") { | 
						|
    return null; | 
						|
  } | 
						|
 | 
						|
  if (ast.type === "inlineCode") { | 
						|
    newObj.value = ast.value.replace(/[ \t\n]+/g, " "); | 
						|
  } // for insert pragma | 
						|
 | 
						|
 | 
						|
  if (parent && parent.type === "root" && parent.children.length > 0 && (parent.children[0] === ast || (parent.children[0].type === "yaml" || parent.children[0].type === "toml") && parent.children[1] === ast) && ast.type === "html" && pragma$3.startWithPragma(ast.value)) { | 
						|
    return null; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function hasPrettierIgnore$2(path) { | 
						|
  var index = +path.getName(); | 
						|
 | 
						|
  if (index === 0) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  var prevNode = path.getParentNode().children[index - 1]; | 
						|
  return isPrettierIgnore(prevNode) === "next"; | 
						|
} | 
						|
 | 
						|
var printerMarkdown = { | 
						|
  preprocess: preprocess_1$1, | 
						|
  print: genericPrint$4, | 
						|
  embed: embed_1$2, | 
						|
  massageAstNode: clean$5, | 
						|
  hasPrettierIgnore: hasPrettierIgnore$2, | 
						|
  insertPragma: pragma$3.insertPragma | 
						|
}; | 
						|
 | 
						|
var options$5 = { | 
						|
  proseWrap: commonOptions.proseWrap, | 
						|
  singleQuote: commonOptions.singleQuote | 
						|
}; | 
						|
 | 
						|
var name$f = "Markdown"; | 
						|
var type$d = "prose"; | 
						|
var aliases$4 = [ | 
						|
	"pandoc" | 
						|
]; | 
						|
var aceMode$d = "markdown"; | 
						|
var codemirrorMode$a = "gfm"; | 
						|
var codemirrorMimeType$a = "text/x-gfm"; | 
						|
var wrap = true; | 
						|
var extensions$d = [ | 
						|
	".md", | 
						|
	".markdown", | 
						|
	".mdown", | 
						|
	".mdwn", | 
						|
	".mdx", | 
						|
	".mkd", | 
						|
	".mkdn", | 
						|
	".mkdown", | 
						|
	".ronn", | 
						|
	".workbook" | 
						|
]; | 
						|
var filenames$3 = [ | 
						|
	"contents.lr" | 
						|
]; | 
						|
var tmScope$d = "source.gfm"; | 
						|
var languageId$d = 222; | 
						|
var Markdown = { | 
						|
	name: name$f, | 
						|
	type: type$d, | 
						|
	aliases: aliases$4, | 
						|
	aceMode: aceMode$d, | 
						|
	codemirrorMode: codemirrorMode$a, | 
						|
	codemirrorMimeType: codemirrorMimeType$a, | 
						|
	wrap: wrap, | 
						|
	extensions: extensions$d, | 
						|
	filenames: filenames$3, | 
						|
	tmScope: tmScope$d, | 
						|
	languageId: languageId$d | 
						|
}; | 
						|
 | 
						|
var Markdown$1 = /*#__PURE__*/Object.freeze({ | 
						|
  __proto__: null, | 
						|
  name: name$f, | 
						|
  type: type$d, | 
						|
  aliases: aliases$4, | 
						|
  aceMode: aceMode$d, | 
						|
  codemirrorMode: codemirrorMode$a, | 
						|
  codemirrorMimeType: codemirrorMimeType$a, | 
						|
  wrap: wrap, | 
						|
  extensions: extensions$d, | 
						|
  filenames: filenames$3, | 
						|
  tmScope: tmScope$d, | 
						|
  languageId: languageId$d, | 
						|
  'default': Markdown | 
						|
}); | 
						|
 | 
						|
var require$$0$5 = getCjsExportFromNamespace(Markdown$1); | 
						|
 | 
						|
var languages$4 = [createLanguage(require$$0$5, function (data) { | 
						|
  return Object.assign(data, { | 
						|
    since: "1.8.0", | 
						|
    parsers: ["remark"], | 
						|
    vscodeLanguageIds: ["markdown"], | 
						|
    filenames: data.filenames.concat(["README"]), | 
						|
    extensions: data.extensions.filter(function (extension) { | 
						|
      return extension !== ".mdx"; | 
						|
    }) | 
						|
  }); | 
						|
}), createLanguage(require$$0$5, function (data) { | 
						|
  return Object.assign(data, { | 
						|
    name: "MDX", | 
						|
    since: "1.15.0", | 
						|
    parsers: ["mdx"], | 
						|
    vscodeLanguageIds: ["mdx"], | 
						|
    filenames: [], | 
						|
    extensions: [".mdx"] | 
						|
  }); | 
						|
})]; | 
						|
var printers$4 = { | 
						|
  mdast: printerMarkdown | 
						|
}; | 
						|
var languageMarkdown = { | 
						|
  languages: languages$4, | 
						|
  options: options$5, | 
						|
  printers: printers$4 | 
						|
}; | 
						|
 | 
						|
var clean$6 = function clean(ast, newNode) { | 
						|
  delete newNode.sourceSpan; | 
						|
  delete newNode.startSourceSpan; | 
						|
  delete newNode.endSourceSpan; | 
						|
  delete newNode.nameSpan; | 
						|
  delete newNode.valueSpan; | 
						|
 | 
						|
  if (ast.type === "text" || ast.type === "comment") { | 
						|
    return null; | 
						|
  } // may be formatted by multiparser | 
						|
 | 
						|
 | 
						|
  if (ast.type === "yaml" || ast.type === "toml") { | 
						|
    return null; | 
						|
  } | 
						|
 | 
						|
  if (ast.type === "attribute") { | 
						|
    delete newNode.value; | 
						|
  } | 
						|
 | 
						|
  if (ast.type === "docType") { | 
						|
    delete newNode.value; | 
						|
  } | 
						|
}; | 
						|
 | 
						|
var json$1 = { | 
						|
  "CSS_DISPLAY_TAGS": { | 
						|
    "area": "none", | 
						|
    "base": "none", | 
						|
    "basefont": "none", | 
						|
    "datalist": "none", | 
						|
    "head": "none", | 
						|
    "link": "none", | 
						|
    "meta": "none", | 
						|
    "noembed": "none", | 
						|
    "noframes": "none", | 
						|
    "param": "none", | 
						|
    "rp": "none", | 
						|
    "script": "block", | 
						|
    "source": "block", | 
						|
    "style": "none", | 
						|
    "template": "inline", | 
						|
    "track": "block", | 
						|
    "title": "none", | 
						|
    "html": "block", | 
						|
    "body": "block", | 
						|
    "address": "block", | 
						|
    "blockquote": "block", | 
						|
    "center": "block", | 
						|
    "div": "block", | 
						|
    "figure": "block", | 
						|
    "figcaption": "block", | 
						|
    "footer": "block", | 
						|
    "form": "block", | 
						|
    "header": "block", | 
						|
    "hr": "block", | 
						|
    "legend": "block", | 
						|
    "listing": "block", | 
						|
    "main": "block", | 
						|
    "p": "block", | 
						|
    "plaintext": "block", | 
						|
    "pre": "block", | 
						|
    "xmp": "block", | 
						|
    "slot": "contents", | 
						|
    "ruby": "ruby", | 
						|
    "rt": "ruby-text", | 
						|
    "article": "block", | 
						|
    "aside": "block", | 
						|
    "h1": "block", | 
						|
    "h2": "block", | 
						|
    "h3": "block", | 
						|
    "h4": "block", | 
						|
    "h5": "block", | 
						|
    "h6": "block", | 
						|
    "hgroup": "block", | 
						|
    "nav": "block", | 
						|
    "section": "block", | 
						|
    "dir": "block", | 
						|
    "dd": "block", | 
						|
    "dl": "block", | 
						|
    "dt": "block", | 
						|
    "ol": "block", | 
						|
    "ul": "block", | 
						|
    "li": "list-item", | 
						|
    "table": "table", | 
						|
    "caption": "table-caption", | 
						|
    "colgroup": "table-column-group", | 
						|
    "col": "table-column", | 
						|
    "thead": "table-header-group", | 
						|
    "tbody": "table-row-group", | 
						|
    "tfoot": "table-footer-group", | 
						|
    "tr": "table-row", | 
						|
    "td": "table-cell", | 
						|
    "th": "table-cell", | 
						|
    "fieldset": "block", | 
						|
    "button": "inline-block", | 
						|
    "video": "inline-block", | 
						|
    "audio": "inline-block" | 
						|
  }, | 
						|
  "CSS_DISPLAY_DEFAULT": "inline", | 
						|
  "CSS_WHITE_SPACE_TAGS": { | 
						|
    "listing": "pre", | 
						|
    "plaintext": "pre", | 
						|
    "pre": "pre", | 
						|
    "xmp": "pre", | 
						|
    "nobr": "nowrap", | 
						|
    "table": "initial", | 
						|
    "textarea": "pre-wrap" | 
						|
  }, | 
						|
  "CSS_WHITE_SPACE_DEFAULT": "normal" | 
						|
}; | 
						|
 | 
						|
var a = [ | 
						|
	"accesskey", | 
						|
	"charset", | 
						|
	"coords", | 
						|
	"download", | 
						|
	"href", | 
						|
	"hreflang", | 
						|
	"name", | 
						|
	"ping", | 
						|
	"referrerpolicy", | 
						|
	"rel", | 
						|
	"rev", | 
						|
	"shape", | 
						|
	"tabindex", | 
						|
	"target", | 
						|
	"type" | 
						|
]; | 
						|
var abbr = [ | 
						|
	"title" | 
						|
]; | 
						|
var applet = [ | 
						|
	"align", | 
						|
	"alt", | 
						|
	"archive", | 
						|
	"code", | 
						|
	"codebase", | 
						|
	"height", | 
						|
	"hspace", | 
						|
	"name", | 
						|
	"object", | 
						|
	"vspace", | 
						|
	"width" | 
						|
]; | 
						|
var area = [ | 
						|
	"accesskey", | 
						|
	"alt", | 
						|
	"coords", | 
						|
	"download", | 
						|
	"href", | 
						|
	"hreflang", | 
						|
	"nohref", | 
						|
	"ping", | 
						|
	"referrerpolicy", | 
						|
	"rel", | 
						|
	"shape", | 
						|
	"tabindex", | 
						|
	"target", | 
						|
	"type" | 
						|
]; | 
						|
var audio = [ | 
						|
	"autoplay", | 
						|
	"controls", | 
						|
	"crossorigin", | 
						|
	"loop", | 
						|
	"muted", | 
						|
	"preload", | 
						|
	"src" | 
						|
]; | 
						|
var base = [ | 
						|
	"href", | 
						|
	"target" | 
						|
]; | 
						|
var basefont = [ | 
						|
	"color", | 
						|
	"face", | 
						|
	"size" | 
						|
]; | 
						|
var bdo = [ | 
						|
	"dir" | 
						|
]; | 
						|
var blockquote = [ | 
						|
	"cite" | 
						|
]; | 
						|
var body = [ | 
						|
	"alink", | 
						|
	"background", | 
						|
	"bgcolor", | 
						|
	"link", | 
						|
	"text", | 
						|
	"vlink" | 
						|
]; | 
						|
var br = [ | 
						|
	"clear" | 
						|
]; | 
						|
var button = [ | 
						|
	"accesskey", | 
						|
	"autofocus", | 
						|
	"disabled", | 
						|
	"form", | 
						|
	"formaction", | 
						|
	"formenctype", | 
						|
	"formmethod", | 
						|
	"formnovalidate", | 
						|
	"formtarget", | 
						|
	"name", | 
						|
	"tabindex", | 
						|
	"type", | 
						|
	"value" | 
						|
]; | 
						|
var canvas = [ | 
						|
	"height", | 
						|
	"width" | 
						|
]; | 
						|
var caption = [ | 
						|
	"align" | 
						|
]; | 
						|
var col = [ | 
						|
	"align", | 
						|
	"char", | 
						|
	"charoff", | 
						|
	"span", | 
						|
	"valign", | 
						|
	"width" | 
						|
]; | 
						|
var colgroup = [ | 
						|
	"align", | 
						|
	"char", | 
						|
	"charoff", | 
						|
	"span", | 
						|
	"valign", | 
						|
	"width" | 
						|
]; | 
						|
var data$1 = [ | 
						|
	"value" | 
						|
]; | 
						|
var del$1 = [ | 
						|
	"cite", | 
						|
	"datetime" | 
						|
]; | 
						|
var details = [ | 
						|
	"open" | 
						|
]; | 
						|
var dfn = [ | 
						|
	"title" | 
						|
]; | 
						|
var dialog = [ | 
						|
	"open" | 
						|
]; | 
						|
var dir = [ | 
						|
	"compact" | 
						|
]; | 
						|
var div = [ | 
						|
	"align" | 
						|
]; | 
						|
var dl = [ | 
						|
	"compact" | 
						|
]; | 
						|
var embed$3 = [ | 
						|
	"height", | 
						|
	"src", | 
						|
	"type", | 
						|
	"width" | 
						|
]; | 
						|
var fieldset = [ | 
						|
	"disabled", | 
						|
	"form", | 
						|
	"name" | 
						|
]; | 
						|
var font = [ | 
						|
	"color", | 
						|
	"face", | 
						|
	"size" | 
						|
]; | 
						|
var form = [ | 
						|
	"accept", | 
						|
	"accept-charset", | 
						|
	"action", | 
						|
	"autocomplete", | 
						|
	"enctype", | 
						|
	"method", | 
						|
	"name", | 
						|
	"novalidate", | 
						|
	"target" | 
						|
]; | 
						|
var frame = [ | 
						|
	"frameborder", | 
						|
	"longdesc", | 
						|
	"marginheight", | 
						|
	"marginwidth", | 
						|
	"name", | 
						|
	"noresize", | 
						|
	"scrolling", | 
						|
	"src" | 
						|
]; | 
						|
var frameset = [ | 
						|
	"cols", | 
						|
	"rows" | 
						|
]; | 
						|
var h1 = [ | 
						|
	"align" | 
						|
]; | 
						|
var h2 = [ | 
						|
	"align" | 
						|
]; | 
						|
var h3 = [ | 
						|
	"align" | 
						|
]; | 
						|
var h4 = [ | 
						|
	"align" | 
						|
]; | 
						|
var h5 = [ | 
						|
	"align" | 
						|
]; | 
						|
var h6 = [ | 
						|
	"align" | 
						|
]; | 
						|
var head = [ | 
						|
	"profile" | 
						|
]; | 
						|
var hr = [ | 
						|
	"align", | 
						|
	"noshade", | 
						|
	"size", | 
						|
	"width" | 
						|
]; | 
						|
var html = [ | 
						|
	"manifest", | 
						|
	"version" | 
						|
]; | 
						|
var iframe = [ | 
						|
	"align", | 
						|
	"allow", | 
						|
	"allowfullscreen", | 
						|
	"allowpaymentrequest", | 
						|
	"allowusermedia", | 
						|
	"frameborder", | 
						|
	"height", | 
						|
	"longdesc", | 
						|
	"marginheight", | 
						|
	"marginwidth", | 
						|
	"name", | 
						|
	"referrerpolicy", | 
						|
	"sandbox", | 
						|
	"scrolling", | 
						|
	"src", | 
						|
	"srcdoc", | 
						|
	"width" | 
						|
]; | 
						|
var img = [ | 
						|
	"align", | 
						|
	"alt", | 
						|
	"border", | 
						|
	"crossorigin", | 
						|
	"decoding", | 
						|
	"height", | 
						|
	"hspace", | 
						|
	"ismap", | 
						|
	"longdesc", | 
						|
	"name", | 
						|
	"referrerpolicy", | 
						|
	"sizes", | 
						|
	"src", | 
						|
	"srcset", | 
						|
	"usemap", | 
						|
	"vspace", | 
						|
	"width" | 
						|
]; | 
						|
var input = [ | 
						|
	"accept", | 
						|
	"accesskey", | 
						|
	"align", | 
						|
	"alt", | 
						|
	"autocomplete", | 
						|
	"autofocus", | 
						|
	"checked", | 
						|
	"dirname", | 
						|
	"disabled", | 
						|
	"form", | 
						|
	"formaction", | 
						|
	"formenctype", | 
						|
	"formmethod", | 
						|
	"formnovalidate", | 
						|
	"formtarget", | 
						|
	"height", | 
						|
	"ismap", | 
						|
	"list", | 
						|
	"max", | 
						|
	"maxlength", | 
						|
	"min", | 
						|
	"minlength", | 
						|
	"multiple", | 
						|
	"name", | 
						|
	"pattern", | 
						|
	"placeholder", | 
						|
	"readonly", | 
						|
	"required", | 
						|
	"size", | 
						|
	"src", | 
						|
	"step", | 
						|
	"tabindex", | 
						|
	"title", | 
						|
	"type", | 
						|
	"usemap", | 
						|
	"value", | 
						|
	"width" | 
						|
]; | 
						|
var ins = [ | 
						|
	"cite", | 
						|
	"datetime" | 
						|
]; | 
						|
var isindex = [ | 
						|
	"prompt" | 
						|
]; | 
						|
var label = [ | 
						|
	"accesskey", | 
						|
	"for", | 
						|
	"form" | 
						|
]; | 
						|
var legend = [ | 
						|
	"accesskey", | 
						|
	"align" | 
						|
]; | 
						|
var li = [ | 
						|
	"type", | 
						|
	"value" | 
						|
]; | 
						|
var link$1 = [ | 
						|
	"as", | 
						|
	"charset", | 
						|
	"color", | 
						|
	"crossorigin", | 
						|
	"href", | 
						|
	"hreflang", | 
						|
	"imagesizes", | 
						|
	"imagesrcset", | 
						|
	"integrity", | 
						|
	"media", | 
						|
	"nonce", | 
						|
	"referrerpolicy", | 
						|
	"rel", | 
						|
	"rev", | 
						|
	"sizes", | 
						|
	"target", | 
						|
	"title", | 
						|
	"type" | 
						|
]; | 
						|
var map$1 = [ | 
						|
	"name" | 
						|
]; | 
						|
var menu = [ | 
						|
	"compact" | 
						|
]; | 
						|
var meta = [ | 
						|
	"charset", | 
						|
	"content", | 
						|
	"http-equiv", | 
						|
	"name", | 
						|
	"scheme" | 
						|
]; | 
						|
var meter = [ | 
						|
	"high", | 
						|
	"low", | 
						|
	"max", | 
						|
	"min", | 
						|
	"optimum", | 
						|
	"value" | 
						|
]; | 
						|
var object = [ | 
						|
	"align", | 
						|
	"archive", | 
						|
	"border", | 
						|
	"classid", | 
						|
	"codebase", | 
						|
	"codetype", | 
						|
	"data", | 
						|
	"declare", | 
						|
	"form", | 
						|
	"height", | 
						|
	"hspace", | 
						|
	"name", | 
						|
	"standby", | 
						|
	"tabindex", | 
						|
	"type", | 
						|
	"typemustmatch", | 
						|
	"usemap", | 
						|
	"vspace", | 
						|
	"width" | 
						|
]; | 
						|
var ol = [ | 
						|
	"compact", | 
						|
	"reversed", | 
						|
	"start", | 
						|
	"type" | 
						|
]; | 
						|
var optgroup = [ | 
						|
	"disabled", | 
						|
	"label" | 
						|
]; | 
						|
var option = [ | 
						|
	"disabled", | 
						|
	"label", | 
						|
	"selected", | 
						|
	"value" | 
						|
]; | 
						|
var output = [ | 
						|
	"for", | 
						|
	"form", | 
						|
	"name" | 
						|
]; | 
						|
var p = [ | 
						|
	"align" | 
						|
]; | 
						|
var param = [ | 
						|
	"name", | 
						|
	"type", | 
						|
	"value", | 
						|
	"valuetype" | 
						|
]; | 
						|
var pre = [ | 
						|
	"width" | 
						|
]; | 
						|
var progress = [ | 
						|
	"max", | 
						|
	"value" | 
						|
]; | 
						|
var q = [ | 
						|
	"cite" | 
						|
]; | 
						|
var script = [ | 
						|
	"async", | 
						|
	"charset", | 
						|
	"crossorigin", | 
						|
	"defer", | 
						|
	"integrity", | 
						|
	"language", | 
						|
	"nomodule", | 
						|
	"nonce", | 
						|
	"referrerpolicy", | 
						|
	"src", | 
						|
	"type" | 
						|
]; | 
						|
var select = [ | 
						|
	"autocomplete", | 
						|
	"autofocus", | 
						|
	"disabled", | 
						|
	"form", | 
						|
	"multiple", | 
						|
	"name", | 
						|
	"required", | 
						|
	"size", | 
						|
	"tabindex" | 
						|
]; | 
						|
var slot = [ | 
						|
	"name" | 
						|
]; | 
						|
var source = [ | 
						|
	"media", | 
						|
	"sizes", | 
						|
	"src", | 
						|
	"srcset", | 
						|
	"type" | 
						|
]; | 
						|
var style = [ | 
						|
	"media", | 
						|
	"nonce", | 
						|
	"title", | 
						|
	"type" | 
						|
]; | 
						|
var table = [ | 
						|
	"align", | 
						|
	"bgcolor", | 
						|
	"border", | 
						|
	"cellpadding", | 
						|
	"cellspacing", | 
						|
	"frame", | 
						|
	"rules", | 
						|
	"summary", | 
						|
	"width" | 
						|
]; | 
						|
var tbody = [ | 
						|
	"align", | 
						|
	"char", | 
						|
	"charoff", | 
						|
	"valign" | 
						|
]; | 
						|
var td = [ | 
						|
	"abbr", | 
						|
	"align", | 
						|
	"axis", | 
						|
	"bgcolor", | 
						|
	"char", | 
						|
	"charoff", | 
						|
	"colspan", | 
						|
	"headers", | 
						|
	"height", | 
						|
	"nowrap", | 
						|
	"rowspan", | 
						|
	"scope", | 
						|
	"valign", | 
						|
	"width" | 
						|
]; | 
						|
var textarea = [ | 
						|
	"accesskey", | 
						|
	"autocomplete", | 
						|
	"autofocus", | 
						|
	"cols", | 
						|
	"dirname", | 
						|
	"disabled", | 
						|
	"form", | 
						|
	"maxlength", | 
						|
	"minlength", | 
						|
	"name", | 
						|
	"placeholder", | 
						|
	"readonly", | 
						|
	"required", | 
						|
	"rows", | 
						|
	"tabindex", | 
						|
	"wrap" | 
						|
]; | 
						|
var tfoot = [ | 
						|
	"align", | 
						|
	"char", | 
						|
	"charoff", | 
						|
	"valign" | 
						|
]; | 
						|
var th = [ | 
						|
	"abbr", | 
						|
	"align", | 
						|
	"axis", | 
						|
	"bgcolor", | 
						|
	"char", | 
						|
	"charoff", | 
						|
	"colspan", | 
						|
	"headers", | 
						|
	"height", | 
						|
	"nowrap", | 
						|
	"rowspan", | 
						|
	"scope", | 
						|
	"valign", | 
						|
	"width" | 
						|
]; | 
						|
var thead = [ | 
						|
	"align", | 
						|
	"char", | 
						|
	"charoff", | 
						|
	"valign" | 
						|
]; | 
						|
var time = [ | 
						|
	"datetime" | 
						|
]; | 
						|
var tr = [ | 
						|
	"align", | 
						|
	"bgcolor", | 
						|
	"char", | 
						|
	"charoff", | 
						|
	"valign" | 
						|
]; | 
						|
var track = [ | 
						|
	"default", | 
						|
	"kind", | 
						|
	"label", | 
						|
	"src", | 
						|
	"srclang" | 
						|
]; | 
						|
var ul = [ | 
						|
	"compact", | 
						|
	"type" | 
						|
]; | 
						|
var video = [ | 
						|
	"autoplay", | 
						|
	"controls", | 
						|
	"crossorigin", | 
						|
	"height", | 
						|
	"loop", | 
						|
	"muted", | 
						|
	"playsinline", | 
						|
	"poster", | 
						|
	"preload", | 
						|
	"src", | 
						|
	"width" | 
						|
]; | 
						|
var index$1 = { | 
						|
	"*": [ | 
						|
	"accesskey", | 
						|
	"autocapitalize", | 
						|
	"autofocus", | 
						|
	"class", | 
						|
	"contenteditable", | 
						|
	"dir", | 
						|
	"draggable", | 
						|
	"enterkeyhint", | 
						|
	"hidden", | 
						|
	"id", | 
						|
	"inputmode", | 
						|
	"is", | 
						|
	"itemid", | 
						|
	"itemprop", | 
						|
	"itemref", | 
						|
	"itemscope", | 
						|
	"itemtype", | 
						|
	"lang", | 
						|
	"nonce", | 
						|
	"slot", | 
						|
	"spellcheck", | 
						|
	"style", | 
						|
	"tabindex", | 
						|
	"title", | 
						|
	"translate" | 
						|
], | 
						|
	a: a, | 
						|
	abbr: abbr, | 
						|
	applet: applet, | 
						|
	area: area, | 
						|
	audio: audio, | 
						|
	base: base, | 
						|
	basefont: basefont, | 
						|
	bdo: bdo, | 
						|
	blockquote: blockquote, | 
						|
	body: body, | 
						|
	br: br, | 
						|
	button: button, | 
						|
	canvas: canvas, | 
						|
	caption: caption, | 
						|
	col: col, | 
						|
	colgroup: colgroup, | 
						|
	data: data$1, | 
						|
	del: del$1, | 
						|
	details: details, | 
						|
	dfn: dfn, | 
						|
	dialog: dialog, | 
						|
	dir: dir, | 
						|
	div: div, | 
						|
	dl: dl, | 
						|
	embed: embed$3, | 
						|
	fieldset: fieldset, | 
						|
	font: font, | 
						|
	form: form, | 
						|
	frame: frame, | 
						|
	frameset: frameset, | 
						|
	h1: h1, | 
						|
	h2: h2, | 
						|
	h3: h3, | 
						|
	h4: h4, | 
						|
	h5: h5, | 
						|
	h6: h6, | 
						|
	head: head, | 
						|
	hr: hr, | 
						|
	html: html, | 
						|
	iframe: iframe, | 
						|
	img: img, | 
						|
	input: input, | 
						|
	ins: ins, | 
						|
	isindex: isindex, | 
						|
	label: label, | 
						|
	legend: legend, | 
						|
	li: li, | 
						|
	link: link$1, | 
						|
	map: map$1, | 
						|
	menu: menu, | 
						|
	meta: meta, | 
						|
	meter: meter, | 
						|
	object: object, | 
						|
	ol: ol, | 
						|
	optgroup: optgroup, | 
						|
	option: option, | 
						|
	output: output, | 
						|
	p: p, | 
						|
	param: param, | 
						|
	pre: pre, | 
						|
	progress: progress, | 
						|
	q: q, | 
						|
	script: script, | 
						|
	select: select, | 
						|
	slot: slot, | 
						|
	source: source, | 
						|
	style: style, | 
						|
	table: table, | 
						|
	tbody: tbody, | 
						|
	td: td, | 
						|
	textarea: textarea, | 
						|
	tfoot: tfoot, | 
						|
	th: th, | 
						|
	thead: thead, | 
						|
	time: time, | 
						|
	tr: tr, | 
						|
	track: track, | 
						|
	ul: ul, | 
						|
	video: video | 
						|
}; | 
						|
 | 
						|
var htmlElementAttributes = /*#__PURE__*/Object.freeze({ | 
						|
  __proto__: null, | 
						|
  a: a, | 
						|
  abbr: abbr, | 
						|
  applet: applet, | 
						|
  area: area, | 
						|
  audio: audio, | 
						|
  base: base, | 
						|
  basefont: basefont, | 
						|
  bdo: bdo, | 
						|
  blockquote: blockquote, | 
						|
  body: body, | 
						|
  br: br, | 
						|
  button: button, | 
						|
  canvas: canvas, | 
						|
  caption: caption, | 
						|
  col: col, | 
						|
  colgroup: colgroup, | 
						|
  data: data$1, | 
						|
  del: del$1, | 
						|
  details: details, | 
						|
  dfn: dfn, | 
						|
  dialog: dialog, | 
						|
  dir: dir, | 
						|
  div: div, | 
						|
  dl: dl, | 
						|
  embed: embed$3, | 
						|
  fieldset: fieldset, | 
						|
  font: font, | 
						|
  form: form, | 
						|
  frame: frame, | 
						|
  frameset: frameset, | 
						|
  h1: h1, | 
						|
  h2: h2, | 
						|
  h3: h3, | 
						|
  h4: h4, | 
						|
  h5: h5, | 
						|
  h6: h6, | 
						|
  head: head, | 
						|
  hr: hr, | 
						|
  html: html, | 
						|
  iframe: iframe, | 
						|
  img: img, | 
						|
  input: input, | 
						|
  ins: ins, | 
						|
  isindex: isindex, | 
						|
  label: label, | 
						|
  legend: legend, | 
						|
  li: li, | 
						|
  link: link$1, | 
						|
  map: map$1, | 
						|
  menu: menu, | 
						|
  meta: meta, | 
						|
  meter: meter, | 
						|
  object: object, | 
						|
  ol: ol, | 
						|
  optgroup: optgroup, | 
						|
  option: option, | 
						|
  output: output, | 
						|
  p: p, | 
						|
  param: param, | 
						|
  pre: pre, | 
						|
  progress: progress, | 
						|
  q: q, | 
						|
  script: script, | 
						|
  select: select, | 
						|
  slot: slot, | 
						|
  source: source, | 
						|
  style: style, | 
						|
  table: table, | 
						|
  tbody: tbody, | 
						|
  td: td, | 
						|
  textarea: textarea, | 
						|
  tfoot: tfoot, | 
						|
  th: th, | 
						|
  thead: thead, | 
						|
  time: time, | 
						|
  tr: tr, | 
						|
  track: track, | 
						|
  ul: ul, | 
						|
  video: video, | 
						|
  'default': index$1 | 
						|
}); | 
						|
 | 
						|
var htmlElementAttributes$1 = getCjsExportFromNamespace(htmlElementAttributes); | 
						|
 | 
						|
var CSS_DISPLAY_TAGS = json$1.CSS_DISPLAY_TAGS, | 
						|
    CSS_DISPLAY_DEFAULT = json$1.CSS_DISPLAY_DEFAULT, | 
						|
    CSS_WHITE_SPACE_TAGS = json$1.CSS_WHITE_SPACE_TAGS, | 
						|
    CSS_WHITE_SPACE_DEFAULT = json$1.CSS_WHITE_SPACE_DEFAULT; | 
						|
var HTML_TAGS = arrayToMap(htmlTagNames$1); | 
						|
var HTML_ELEMENT_ATTRIBUTES = mapObject(htmlElementAttributes$1, arrayToMap); | 
						|
 | 
						|
function arrayToMap(array) { | 
						|
  var map = Object.create(null); | 
						|
  var _iteratorNormalCompletion = true; | 
						|
  var _didIteratorError = false; | 
						|
  var _iteratorError = undefined; | 
						|
 | 
						|
  try { | 
						|
    for (var _iterator = array[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | 
						|
      var value = _step.value; | 
						|
      map[value] = true; | 
						|
    } | 
						|
  } catch (err) { | 
						|
    _didIteratorError = true; | 
						|
    _iteratorError = err; | 
						|
  } finally { | 
						|
    try { | 
						|
      if (!_iteratorNormalCompletion && _iterator.return != null) { | 
						|
        _iterator.return(); | 
						|
      } | 
						|
    } finally { | 
						|
      if (_didIteratorError) { | 
						|
        throw _iteratorError; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return map; | 
						|
} | 
						|
 | 
						|
function mapObject(object, fn) { | 
						|
  var newObject = Object.create(null); | 
						|
 | 
						|
  for (var _i = 0, _Object$keys = Object.keys(object); _i < _Object$keys.length; _i++) { | 
						|
    var key = _Object$keys[_i]; | 
						|
    newObject[key] = fn(object[key], key); | 
						|
  } | 
						|
 | 
						|
  return newObject; | 
						|
} | 
						|
 | 
						|
function shouldPreserveContent(node, options) { | 
						|
  if (node.type === "element" && node.fullName === "template" && node.attrMap.lang && node.attrMap.lang !== "html") { | 
						|
    return true; | 
						|
  } // unterminated node in ie conditional comment | 
						|
  // e.g. <!--[if lt IE 9]><html><![endif]--> | 
						|
 | 
						|
 | 
						|
  if (node.type === "ieConditionalComment" && node.lastChild && !node.lastChild.isSelfClosing && !node.lastChild.endSourceSpan) { | 
						|
    return true; | 
						|
  } // incomplete html in ie conditional comment | 
						|
  // e.g. <!--[if lt IE 9]></div><![endif]--> | 
						|
 | 
						|
 | 
						|
  if (node.type === "ieConditionalComment" && !node.complete) { | 
						|
    return true; | 
						|
  } // top-level elements (excluding <template>, <style> and <script>) in Vue SFC are considered custom block | 
						|
  // custom blocks can be written in other languages so we should preserve them to not break the code | 
						|
 | 
						|
 | 
						|
  if (options.parser === "vue" && node.type === "element" && node.parent.type === "root" && ["template", "style", "script", // vue parser can be used for vue dom template as well, so we should still format top-level <html> | 
						|
  "html"].indexOf(node.fullName) === -1) { | 
						|
    return true; | 
						|
  } // TODO: handle non-text children in <pre> | 
						|
 | 
						|
 | 
						|
  if (isPreLikeNode(node) && node.children.some(function (child) { | 
						|
    return child.type !== "text" && child.type !== "interpolation"; | 
						|
  })) { | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function hasPrettierIgnore$3(node) { | 
						|
  if (node.type === "attribute" || isTextLikeNode(node)) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  if (!node.parent) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  if (typeof node.index !== "number" || node.index === 0) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  var prevNode = node.parent.children[node.index - 1]; | 
						|
  return isPrettierIgnore$1(prevNode); | 
						|
} | 
						|
 | 
						|
function isPrettierIgnore$1(node) { | 
						|
  return node.type === "comment" && node.value.trim() === "prettier-ignore"; | 
						|
} | 
						|
 | 
						|
function getPrettierIgnoreAttributeCommentData(value) { | 
						|
  var match = value.trim().match(/^prettier-ignore-attribute(?:\s+([^]+))?$/); | 
						|
 | 
						|
  if (!match) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  if (!match[1]) { | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  return match[1].split(/\s+/); | 
						|
} | 
						|
/** there's no opening/closing tag or it's considered not breakable */ | 
						|
 | 
						|
 | 
						|
function isTextLikeNode(node) { | 
						|
  return node.type === "text" || node.type === "comment"; | 
						|
} | 
						|
 | 
						|
function isScriptLikeTag(node) { | 
						|
  return node.type === "element" && (node.fullName === "script" || node.fullName === "style" || node.fullName === "svg:style"); | 
						|
} | 
						|
 | 
						|
function isFrontMatterNode(node) { | 
						|
  return node.type === "yaml" || node.type === "toml"; | 
						|
} | 
						|
 | 
						|
function canHaveInterpolation(node) { | 
						|
  return node.children && !isScriptLikeTag(node); | 
						|
} | 
						|
 | 
						|
function isWhitespaceSensitiveNode(node) { | 
						|
  return isScriptLikeTag(node) || node.type === "interpolation" || isIndentationSensitiveNode(node); | 
						|
} | 
						|
 | 
						|
function isIndentationSensitiveNode(node) { | 
						|
  return getNodeCssStyleWhiteSpace(node).startsWith("pre"); | 
						|
} | 
						|
 | 
						|
function isLeadingSpaceSensitiveNode(node) { | 
						|
  var isLeadingSpaceSensitive = _isLeadingSpaceSensitiveNode(); | 
						|
 | 
						|
  if (isLeadingSpaceSensitive && !node.prev && node.parent && node.parent.tagDefinition && node.parent.tagDefinition.ignoreFirstLf) { | 
						|
    return node.type === "interpolation"; | 
						|
  } | 
						|
 | 
						|
  return isLeadingSpaceSensitive; | 
						|
 | 
						|
  function _isLeadingSpaceSensitiveNode() { | 
						|
    if (isFrontMatterNode(node)) { | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    if ((node.type === "text" || node.type === "interpolation") && node.prev && (node.prev.type === "text" || node.prev.type === "interpolation")) { | 
						|
      return true; | 
						|
    } | 
						|
 | 
						|
    if (!node.parent || node.parent.cssDisplay === "none") { | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    if (isPreLikeNode(node.parent)) { | 
						|
      return true; | 
						|
    } | 
						|
 | 
						|
    if (!node.prev && (node.parent.type === "root" || isScriptLikeTag(node.parent) || !isFirstChildLeadingSpaceSensitiveCssDisplay(node.parent.cssDisplay))) { | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    if (node.prev && !isNextLeadingSpaceSensitiveCssDisplay(node.prev.cssDisplay)) { | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    return true; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function isTrailingSpaceSensitiveNode(node) { | 
						|
  if (isFrontMatterNode(node)) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  if ((node.type === "text" || node.type === "interpolation") && node.next && (node.next.type === "text" || node.next.type === "interpolation")) { | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  if (!node.parent || node.parent.cssDisplay === "none") { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  if (isPreLikeNode(node.parent)) { | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  if (!node.next && (node.parent.type === "root" || isScriptLikeTag(node.parent) || !isLastChildTrailingSpaceSensitiveCssDisplay(node.parent.cssDisplay))) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  if (node.next && !isPrevTrailingSpaceSensitiveCssDisplay(node.next.cssDisplay)) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  return true; | 
						|
} | 
						|
 | 
						|
function isDanglingSpaceSensitiveNode(node) { | 
						|
  return isDanglingSpaceSensitiveCssDisplay(node.cssDisplay) && !isScriptLikeTag(node); | 
						|
} | 
						|
 | 
						|
function forceNextEmptyLine(node) { | 
						|
  return isFrontMatterNode(node) || node.next && node.sourceSpan.end.line + 1 < node.next.sourceSpan.start.line; | 
						|
} | 
						|
/** firstChild leadingSpaces and lastChild trailingSpaces */ | 
						|
 | 
						|
 | 
						|
function forceBreakContent(node) { | 
						|
  return forceBreakChildren(node) || node.type === "element" && node.children.length !== 0 && (["body", "script", "style"].indexOf(node.name) !== -1 || node.children.some(function (child) { | 
						|
    return hasNonTextChild(child); | 
						|
  })) || node.firstChild && node.firstChild === node.lastChild && hasLeadingLineBreak(node.firstChild) && (!node.lastChild.isTrailingSpaceSensitive || hasTrailingLineBreak(node.lastChild)); | 
						|
} | 
						|
/** spaces between children */ | 
						|
 | 
						|
 | 
						|
function forceBreakChildren(node) { | 
						|
  return node.type === "element" && node.children.length !== 0 && (["html", "head", "ul", "ol", "select"].indexOf(node.name) !== -1 || node.cssDisplay.startsWith("table") && node.cssDisplay !== "table-cell"); | 
						|
} | 
						|
 | 
						|
function preferHardlineAsLeadingSpaces(node) { | 
						|
  return preferHardlineAsSurroundingSpaces(node) || node.prev && preferHardlineAsTrailingSpaces(node.prev) || hasSurroundingLineBreak(node); | 
						|
} | 
						|
 | 
						|
function preferHardlineAsTrailingSpaces(node) { | 
						|
  return preferHardlineAsSurroundingSpaces(node) || node.type === "element" && node.fullName === "br" || hasSurroundingLineBreak(node); | 
						|
} | 
						|
 | 
						|
function hasSurroundingLineBreak(node) { | 
						|
  return hasLeadingLineBreak(node) && hasTrailingLineBreak(node); | 
						|
} | 
						|
 | 
						|
function hasLeadingLineBreak(node) { | 
						|
  return node.hasLeadingSpaces && (node.prev ? node.prev.sourceSpan.end.line < node.sourceSpan.start.line : node.parent.type === "root" || node.parent.startSourceSpan.end.line < node.sourceSpan.start.line); | 
						|
} | 
						|
 | 
						|
function hasTrailingLineBreak(node) { | 
						|
  return node.hasTrailingSpaces && (node.next ? node.next.sourceSpan.start.line > node.sourceSpan.end.line : node.parent.type === "root" || node.parent.endSourceSpan.start.line > node.sourceSpan.end.line); | 
						|
} | 
						|
 | 
						|
function preferHardlineAsSurroundingSpaces(node) { | 
						|
  switch (node.type) { | 
						|
    case "ieConditionalComment": | 
						|
    case "comment": | 
						|
    case "directive": | 
						|
      return true; | 
						|
 | 
						|
    case "element": | 
						|
      return ["script", "select"].indexOf(node.name) !== -1; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function getLastDescendant(node) { | 
						|
  return node.lastChild ? getLastDescendant(node.lastChild) : node; | 
						|
} | 
						|
 | 
						|
function hasNonTextChild(node) { | 
						|
  return node.children && node.children.some(function (child) { | 
						|
    return child.type !== "text"; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function inferScriptParser(node) { | 
						|
  if (node.name === "script" && !node.attrMap.src) { | 
						|
    if (!node.attrMap.lang && !node.attrMap.type || node.attrMap.type === "module" || node.attrMap.type === "text/javascript" || node.attrMap.type === "text/babel" || node.attrMap.type === "application/javascript") { | 
						|
      return "babel"; | 
						|
    } | 
						|
 | 
						|
    if (node.attrMap.type === "application/x-typescript" || node.attrMap.lang === "ts" || node.attrMap.lang === "tsx") { | 
						|
      return "typescript"; | 
						|
    } | 
						|
 | 
						|
    if (node.attrMap.type === "text/markdown") { | 
						|
      return "markdown"; | 
						|
    } | 
						|
 | 
						|
    if (node.attrMap.type.endsWith("json") || node.attrMap.type.endsWith("importmap")) { | 
						|
      return "json"; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  if (node.name === "style") { | 
						|
    if (!node.attrMap.lang || node.attrMap.lang === "postcss" || node.attrMap.lang === "css") { | 
						|
      return "css"; | 
						|
    } | 
						|
 | 
						|
    if (node.attrMap.lang === "scss") { | 
						|
      return "scss"; | 
						|
    } | 
						|
 | 
						|
    if (node.attrMap.lang === "less") { | 
						|
      return "less"; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return null; | 
						|
} | 
						|
 | 
						|
function isBlockLikeCssDisplay(cssDisplay) { | 
						|
  return cssDisplay === "block" || cssDisplay === "list-item" || cssDisplay.startsWith("table"); | 
						|
} | 
						|
 | 
						|
function isFirstChildLeadingSpaceSensitiveCssDisplay(cssDisplay) { | 
						|
  return !isBlockLikeCssDisplay(cssDisplay) && cssDisplay !== "inline-block"; | 
						|
} | 
						|
 | 
						|
function isLastChildTrailingSpaceSensitiveCssDisplay(cssDisplay) { | 
						|
  return !isBlockLikeCssDisplay(cssDisplay) && cssDisplay !== "inline-block"; | 
						|
} | 
						|
 | 
						|
function isPrevTrailingSpaceSensitiveCssDisplay(cssDisplay) { | 
						|
  return !isBlockLikeCssDisplay(cssDisplay); | 
						|
} | 
						|
 | 
						|
function isNextLeadingSpaceSensitiveCssDisplay(cssDisplay) { | 
						|
  return !isBlockLikeCssDisplay(cssDisplay); | 
						|
} | 
						|
 | 
						|
function isDanglingSpaceSensitiveCssDisplay(cssDisplay) { | 
						|
  return !isBlockLikeCssDisplay(cssDisplay) && cssDisplay !== "inline-block"; | 
						|
} | 
						|
 | 
						|
function isPreLikeNode(node) { | 
						|
  return getNodeCssStyleWhiteSpace(node).startsWith("pre"); | 
						|
} | 
						|
 | 
						|
function countParents(path) { | 
						|
  var predicate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () { | 
						|
    return true; | 
						|
  }; | 
						|
  var counter = 0; | 
						|
 | 
						|
  for (var i = path.stack.length - 1; i >= 0; i--) { | 
						|
    var value = path.stack[i]; | 
						|
 | 
						|
    if (value && typeof value === "object" && !Array.isArray(value) && predicate(value)) { | 
						|
      counter++; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return counter; | 
						|
} | 
						|
 | 
						|
function hasParent(node, fn) { | 
						|
  var current = node; | 
						|
 | 
						|
  while (current) { | 
						|
    if (fn(current)) { | 
						|
      return true; | 
						|
    } | 
						|
 | 
						|
    current = current.parent; | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function getNodeCssStyleDisplay(node, options) { | 
						|
  if (node.prev && node.prev.type === "comment") { | 
						|
    // <!-- display: block --> | 
						|
    var match = node.prev.value.match(/^\s*display:\s*([a-z]+)\s*$/); | 
						|
 | 
						|
    if (match) { | 
						|
      return match[1]; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  var isInSvgForeignObject = false; | 
						|
 | 
						|
  if (node.type === "element" && node.namespace === "svg") { | 
						|
    if (hasParent(node, function (parent) { | 
						|
      return parent.fullName === "svg:foreignObject"; | 
						|
    })) { | 
						|
      isInSvgForeignObject = true; | 
						|
    } else { | 
						|
      return node.name === "svg" ? "inline-block" : "block"; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  switch (options.htmlWhitespaceSensitivity) { | 
						|
    case "strict": | 
						|
      return "inline"; | 
						|
 | 
						|
    case "ignore": | 
						|
      return "block"; | 
						|
 | 
						|
    default: | 
						|
      return node.type === "element" && (!node.namespace || isInSvgForeignObject) && CSS_DISPLAY_TAGS[node.name] || CSS_DISPLAY_DEFAULT; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function getNodeCssStyleWhiteSpace(node) { | 
						|
  return node.type === "element" && !node.namespace && CSS_WHITE_SPACE_TAGS[node.name] || CSS_WHITE_SPACE_DEFAULT; | 
						|
} | 
						|
 | 
						|
function getMinIndentation(text) { | 
						|
  var minIndentation = Infinity; | 
						|
  var _iteratorNormalCompletion2 = true; | 
						|
  var _didIteratorError2 = false; | 
						|
  var _iteratorError2 = undefined; | 
						|
 | 
						|
  try { | 
						|
    for (var _iterator2 = text.split("\n")[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { | 
						|
      var lineText = _step2.value; | 
						|
 | 
						|
      if (lineText.length === 0) { | 
						|
        continue; | 
						|
      } | 
						|
 | 
						|
      if (/\S/.test(lineText[0])) { | 
						|
        return 0; | 
						|
      } | 
						|
 | 
						|
      var indentation = lineText.match(/^\s*/)[0].length; | 
						|
 | 
						|
      if (lineText.length === indentation) { | 
						|
        continue; | 
						|
      } | 
						|
 | 
						|
      if (indentation < minIndentation) { | 
						|
        minIndentation = indentation; | 
						|
      } | 
						|
    } | 
						|
  } catch (err) { | 
						|
    _didIteratorError2 = true; | 
						|
    _iteratorError2 = err; | 
						|
  } finally { | 
						|
    try { | 
						|
      if (!_iteratorNormalCompletion2 && _iterator2.return != null) { | 
						|
        _iterator2.return(); | 
						|
      } | 
						|
    } finally { | 
						|
      if (_didIteratorError2) { | 
						|
        throw _iteratorError2; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return minIndentation === Infinity ? 0 : minIndentation; | 
						|
} | 
						|
 | 
						|
function dedentString(text) { | 
						|
  var minIndent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getMinIndentation(text); | 
						|
  return minIndent === 0 ? text : text.split("\n").map(function (lineText) { | 
						|
    return lineText.slice(minIndent); | 
						|
  }).join("\n"); | 
						|
} | 
						|
 | 
						|
function normalizeParts$1(parts) { | 
						|
  var newParts = []; | 
						|
  var restParts = parts.slice(); | 
						|
 | 
						|
  while (restParts.length !== 0) { | 
						|
    var part = restParts.shift(); | 
						|
 | 
						|
    if (!part) { | 
						|
      continue; | 
						|
    } | 
						|
 | 
						|
    if (part.type === "concat") { | 
						|
      Array.prototype.unshift.apply(restParts, part.parts); | 
						|
      continue; | 
						|
    } | 
						|
 | 
						|
    if (newParts.length !== 0 && typeof newParts[newParts.length - 1] === "string" && typeof part === "string") { | 
						|
      newParts.push(newParts.pop() + part); | 
						|
      continue; | 
						|
    } | 
						|
 | 
						|
    newParts.push(part); | 
						|
  } | 
						|
 | 
						|
  return newParts; | 
						|
} | 
						|
 | 
						|
function identity$2(x) { | 
						|
  return x; | 
						|
} | 
						|
 | 
						|
function shouldNotPrintClosingTag(node, options) { | 
						|
  return !node.isSelfClosing && !node.endSourceSpan && (hasPrettierIgnore$3(node) || shouldPreserveContent(node.parent, options)); | 
						|
} | 
						|
 | 
						|
function countChars(text, char) { | 
						|
  var counter = 0; | 
						|
 | 
						|
  for (var i = 0; i < text.length; i++) { | 
						|
    if (text[i] === char) { | 
						|
      counter++; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return counter; | 
						|
} | 
						|
 | 
						|
function unescapeQuoteEntities(text) { | 
						|
  return text.replace(/'/g, "'").replace(/"/g, '"'); | 
						|
} | 
						|
 | 
						|
var utils$5 = { | 
						|
  HTML_ELEMENT_ATTRIBUTES, | 
						|
  HTML_TAGS, | 
						|
  canHaveInterpolation, | 
						|
  countChars, | 
						|
  countParents, | 
						|
  dedentString, | 
						|
  forceBreakChildren, | 
						|
  forceBreakContent, | 
						|
  forceNextEmptyLine, | 
						|
  getLastDescendant, | 
						|
  getNodeCssStyleDisplay, | 
						|
  getNodeCssStyleWhiteSpace, | 
						|
  getPrettierIgnoreAttributeCommentData, | 
						|
  hasPrettierIgnore: hasPrettierIgnore$3, | 
						|
  identity: identity$2, | 
						|
  inferScriptParser, | 
						|
  isDanglingSpaceSensitiveNode, | 
						|
  isFrontMatterNode, | 
						|
  isIndentationSensitiveNode, | 
						|
  isLeadingSpaceSensitiveNode, | 
						|
  isPreLikeNode, | 
						|
  isScriptLikeTag, | 
						|
  isTextLikeNode, | 
						|
  isTrailingSpaceSensitiveNode, | 
						|
  isWhitespaceSensitiveNode, | 
						|
  normalizeParts: normalizeParts$1, | 
						|
  preferHardlineAsLeadingSpaces, | 
						|
  preferHardlineAsTrailingSpaces, | 
						|
  shouldNotPrintClosingTag, | 
						|
  shouldPreserveContent, | 
						|
  unescapeQuoteEntities | 
						|
}; | 
						|
 | 
						|
var canHaveInterpolation$1 = utils$5.canHaveInterpolation, | 
						|
    getNodeCssStyleDisplay$1 = utils$5.getNodeCssStyleDisplay, | 
						|
    isDanglingSpaceSensitiveNode$1 = utils$5.isDanglingSpaceSensitiveNode, | 
						|
    isIndentationSensitiveNode$1 = utils$5.isIndentationSensitiveNode, | 
						|
    isLeadingSpaceSensitiveNode$1 = utils$5.isLeadingSpaceSensitiveNode, | 
						|
    isTrailingSpaceSensitiveNode$1 = utils$5.isTrailingSpaceSensitiveNode, | 
						|
    isWhitespaceSensitiveNode$1 = utils$5.isWhitespaceSensitiveNode; | 
						|
var PREPROCESS_PIPELINE = [removeIgnorableFirstLf, mergeIeConditonalStartEndCommentIntoElementOpeningTag, mergeCdataIntoText, extractInterpolation, extractWhitespaces, addCssDisplay, addIsSelfClosing, addHasHtmComponentClosingTag, addIsSpaceSensitive, mergeSimpleElementIntoText]; | 
						|
 | 
						|
function preprocess$2(ast, options) { | 
						|
  var _iteratorNormalCompletion = true; | 
						|
  var _didIteratorError = false; | 
						|
  var _iteratorError = undefined; | 
						|
 | 
						|
  try { | 
						|
    for (var _iterator = PREPROCESS_PIPELINE[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | 
						|
      var fn = _step.value; | 
						|
      ast = fn(ast, options); | 
						|
    } | 
						|
  } catch (err) { | 
						|
    _didIteratorError = true; | 
						|
    _iteratorError = err; | 
						|
  } finally { | 
						|
    try { | 
						|
      if (!_iteratorNormalCompletion && _iterator.return != null) { | 
						|
        _iterator.return(); | 
						|
      } | 
						|
    } finally { | 
						|
      if (_didIteratorError) { | 
						|
        throw _iteratorError; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return ast; | 
						|
} | 
						|
 | 
						|
function removeIgnorableFirstLf(ast | 
						|
/*, options */ | 
						|
) { | 
						|
  return ast.map(function (node) { | 
						|
    if (node.type === "element" && node.tagDefinition.ignoreFirstLf && node.children.length !== 0 && node.children[0].type === "text" && node.children[0].value[0] === "\n") { | 
						|
      var text = node.children[0]; | 
						|
      return node.clone({ | 
						|
        children: text.value.length === 1 ? node.children.slice(1) : [].concat(text.clone({ | 
						|
          value: text.value.slice(1) | 
						|
        }), node.children.slice(1)) | 
						|
      }); | 
						|
    } | 
						|
 | 
						|
    return node; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function mergeIeConditonalStartEndCommentIntoElementOpeningTag(ast | 
						|
/*, options */ | 
						|
) { | 
						|
  /** | 
						|
   *     <!--[if ...]><!--><target><!--<![endif]--> | 
						|
   */ | 
						|
  var isTarget = function isTarget(node) { | 
						|
    return node.type === "element" && node.prev && node.prev.type === "ieConditionalStartComment" && node.prev.sourceSpan.end.offset === node.startSourceSpan.start.offset && node.firstChild && node.firstChild.type === "ieConditionalEndComment" && node.firstChild.sourceSpan.start.offset === node.startSourceSpan.end.offset; | 
						|
  }; | 
						|
 | 
						|
  return ast.map(function (node) { | 
						|
    if (node.children) { | 
						|
      var isTargetResults = node.children.map(isTarget); | 
						|
 | 
						|
      if (isTargetResults.some(Boolean)) { | 
						|
        var newChildren = []; | 
						|
 | 
						|
        for (var i = 0; i < node.children.length; i++) { | 
						|
          var child = node.children[i]; | 
						|
 | 
						|
          if (isTargetResults[i + 1]) { | 
						|
            // ieConditionalStartComment | 
						|
            continue; | 
						|
          } | 
						|
 | 
						|
          if (isTargetResults[i]) { | 
						|
            var ieConditionalStartComment = child.prev; | 
						|
            var ieConditionalEndComment = child.firstChild; | 
						|
            var ParseSourceSpan = child.sourceSpan.constructor; | 
						|
            var startSourceSpan = new ParseSourceSpan(ieConditionalStartComment.sourceSpan.start, ieConditionalEndComment.sourceSpan.end); | 
						|
            var sourceSpan = new ParseSourceSpan(startSourceSpan.start, child.sourceSpan.end); | 
						|
            newChildren.push(child.clone({ | 
						|
              condition: ieConditionalStartComment.condition, | 
						|
              sourceSpan, | 
						|
              startSourceSpan, | 
						|
              children: child.children.slice(1) | 
						|
            })); | 
						|
            continue; | 
						|
          } | 
						|
 | 
						|
          newChildren.push(child); | 
						|
        } | 
						|
 | 
						|
        return node.clone({ | 
						|
          children: newChildren | 
						|
        }); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return node; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function mergeNodeIntoText(ast, shouldMerge, getValue) { | 
						|
  return ast.map(function (node) { | 
						|
    if (node.children) { | 
						|
      var shouldMergeResults = node.children.map(shouldMerge); | 
						|
 | 
						|
      if (shouldMergeResults.some(Boolean)) { | 
						|
        var newChildren = []; | 
						|
 | 
						|
        for (var i = 0; i < node.children.length; i++) { | 
						|
          var child = node.children[i]; | 
						|
 | 
						|
          if (child.type !== "text" && !shouldMergeResults[i]) { | 
						|
            newChildren.push(child); | 
						|
            continue; | 
						|
          } | 
						|
 | 
						|
          var newChild = child.type === "text" ? child : child.clone({ | 
						|
            type: "text", | 
						|
            value: getValue(child) | 
						|
          }); | 
						|
 | 
						|
          if (newChildren.length === 0 || newChildren[newChildren.length - 1].type !== "text") { | 
						|
            newChildren.push(newChild); | 
						|
            continue; | 
						|
          } | 
						|
 | 
						|
          var lastChild = newChildren.pop(); | 
						|
          var ParseSourceSpan = lastChild.sourceSpan.constructor; | 
						|
          newChildren.push(lastChild.clone({ | 
						|
            value: lastChild.value + newChild.value, | 
						|
            sourceSpan: new ParseSourceSpan(lastChild.sourceSpan.start, newChild.sourceSpan.end) | 
						|
          })); | 
						|
        } | 
						|
 | 
						|
        return node.clone({ | 
						|
          children: newChildren | 
						|
        }); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return node; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function mergeCdataIntoText(ast | 
						|
/*, options */ | 
						|
) { | 
						|
  return mergeNodeIntoText(ast, function (node) { | 
						|
    return node.type === "cdata"; | 
						|
  }, function (node) { | 
						|
    return `<![CDATA[${node.value}]]>`; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function mergeSimpleElementIntoText(ast | 
						|
/*, options */ | 
						|
) { | 
						|
  var isSimpleElement = function isSimpleElement(node) { | 
						|
    return node.type === "element" && node.attrs.length === 0 && node.children.length === 1 && node.firstChild.type === "text" && // \xA0: non-breaking whitespace | 
						|
    !/[^\S\xA0]/.test(node.children[0].value) && !node.firstChild.hasLeadingSpaces && !node.firstChild.hasTrailingSpaces && node.isLeadingSpaceSensitive && !node.hasLeadingSpaces && node.isTrailingSpaceSensitive && !node.hasTrailingSpaces && node.prev && node.prev.type === "text" && node.next && node.next.type === "text"; | 
						|
  }; | 
						|
 | 
						|
  return ast.map(function (node) { | 
						|
    if (node.children) { | 
						|
      var isSimpleElementResults = node.children.map(isSimpleElement); | 
						|
 | 
						|
      if (isSimpleElementResults.some(Boolean)) { | 
						|
        var newChildren = []; | 
						|
 | 
						|
        for (var i = 0; i < node.children.length; i++) { | 
						|
          var child = node.children[i]; | 
						|
 | 
						|
          if (isSimpleElementResults[i]) { | 
						|
            var lastChild = newChildren.pop(); | 
						|
            var nextChild = node.children[++i]; | 
						|
            var ParseSourceSpan = node.sourceSpan.constructor; | 
						|
            var isTrailingSpaceSensitive = nextChild.isTrailingSpaceSensitive, | 
						|
                hasTrailingSpaces = nextChild.hasTrailingSpaces; | 
						|
            newChildren.push(lastChild.clone({ | 
						|
              value: lastChild.value + `<${child.rawName}>` + child.firstChild.value + `</${child.rawName}>` + nextChild.value, | 
						|
              sourceSpan: new ParseSourceSpan(lastChild.sourceSpan.start, nextChild.sourceSpan.end), | 
						|
              isTrailingSpaceSensitive, | 
						|
              hasTrailingSpaces | 
						|
            })); | 
						|
          } else { | 
						|
            newChildren.push(child); | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        return node.clone({ | 
						|
          children: newChildren | 
						|
        }); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return node; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function extractInterpolation(ast, options) { | 
						|
  if (options.parser === "html") { | 
						|
    return ast; | 
						|
  } | 
						|
 | 
						|
  var interpolationRegex = /\{\{([\s\S]+?)\}\}/g; | 
						|
  return ast.map(function (node) { | 
						|
    if (!canHaveInterpolation$1(node)) { | 
						|
      return node; | 
						|
    } | 
						|
 | 
						|
    var newChildren = []; | 
						|
    var _iteratorNormalCompletion2 = true; | 
						|
    var _didIteratorError2 = false; | 
						|
    var _iteratorError2 = undefined; | 
						|
 | 
						|
    try { | 
						|
      for (var _iterator2 = node.children[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { | 
						|
        var child = _step2.value; | 
						|
 | 
						|
        if (child.type !== "text") { | 
						|
          newChildren.push(child); | 
						|
          continue; | 
						|
        } | 
						|
 | 
						|
        var ParseSourceSpan = child.sourceSpan.constructor; | 
						|
        var startSourceSpan = child.sourceSpan.start; | 
						|
        var endSourceSpan = null; | 
						|
        var components = child.value.split(interpolationRegex); | 
						|
 | 
						|
        for (var i = 0; i < components.length; i++, startSourceSpan = endSourceSpan) { | 
						|
          var value = components[i]; | 
						|
 | 
						|
          if (i % 2 === 0) { | 
						|
            endSourceSpan = startSourceSpan.moveBy(value.length); | 
						|
 | 
						|
            if (value.length !== 0) { | 
						|
              newChildren.push({ | 
						|
                type: "text", | 
						|
                value, | 
						|
                sourceSpan: new ParseSourceSpan(startSourceSpan, endSourceSpan) | 
						|
              }); | 
						|
            } | 
						|
 | 
						|
            continue; | 
						|
          } | 
						|
 | 
						|
          endSourceSpan = startSourceSpan.moveBy(value.length + 4); // `{{` + `}}` | 
						|
 | 
						|
          newChildren.push({ | 
						|
            type: "interpolation", | 
						|
            sourceSpan: new ParseSourceSpan(startSourceSpan, endSourceSpan), | 
						|
            children: value.length === 0 ? [] : [{ | 
						|
              type: "text", | 
						|
              value, | 
						|
              sourceSpan: new ParseSourceSpan(startSourceSpan.moveBy(2), endSourceSpan.moveBy(-2)) | 
						|
            }] | 
						|
          }); | 
						|
        } | 
						|
      } | 
						|
    } catch (err) { | 
						|
      _didIteratorError2 = true; | 
						|
      _iteratorError2 = err; | 
						|
    } finally { | 
						|
      try { | 
						|
        if (!_iteratorNormalCompletion2 && _iterator2.return != null) { | 
						|
          _iterator2.return(); | 
						|
        } | 
						|
      } finally { | 
						|
        if (_didIteratorError2) { | 
						|
          throw _iteratorError2; | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return node.clone({ | 
						|
      children: newChildren | 
						|
    }); | 
						|
  }); | 
						|
} | 
						|
/** | 
						|
 * - add `hasLeadingSpaces` field | 
						|
 * - add `hasTrailingSpaces` field | 
						|
 * - add `hasDanglingSpaces` field for parent nodes | 
						|
 * - add `isWhitespaceSensitive`, `isIndentationSensitive` field for text nodes | 
						|
 * - remove insensitive whitespaces | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function extractWhitespaces(ast | 
						|
/*, options*/ | 
						|
) { | 
						|
  var TYPE_WHITESPACE = "whitespace"; | 
						|
  return ast.map(function (node) { | 
						|
    if (!node.children) { | 
						|
      return node; | 
						|
    } | 
						|
 | 
						|
    if (node.children.length === 0 || node.children.length === 1 && node.children[0].type === "text" && node.children[0].value.trim().length === 0) { | 
						|
      return node.clone({ | 
						|
        children: [], | 
						|
        hasDanglingSpaces: node.children.length !== 0 | 
						|
      }); | 
						|
    } | 
						|
 | 
						|
    var isWhitespaceSensitive = isWhitespaceSensitiveNode$1(node); | 
						|
    var isIndentationSensitive = isIndentationSensitiveNode$1(node); | 
						|
    return node.clone({ | 
						|
      isWhitespaceSensitive, | 
						|
      isIndentationSensitive, | 
						|
      children: node.children // extract whitespace nodes | 
						|
      .reduce(function (newChildren, child) { | 
						|
        if (child.type !== "text" || isWhitespaceSensitive) { | 
						|
          return newChildren.concat(child); | 
						|
        } | 
						|
 | 
						|
        var localChildren = []; | 
						|
 | 
						|
        var _child$value$match = child.value.match(/^(\s*)([\s\S]*?)(\s*)$/), | 
						|
            _child$value$match2 = _slicedToArray(_child$value$match, 4), | 
						|
            leadingSpaces = _child$value$match2[1], | 
						|
            text = _child$value$match2[2], | 
						|
            trailingSpaces = _child$value$match2[3]; | 
						|
 | 
						|
        if (leadingSpaces) { | 
						|
          localChildren.push({ | 
						|
            type: TYPE_WHITESPACE | 
						|
          }); | 
						|
        } | 
						|
 | 
						|
        var ParseSourceSpan = child.sourceSpan.constructor; | 
						|
 | 
						|
        if (text) { | 
						|
          localChildren.push({ | 
						|
            type: "text", | 
						|
            value: text, | 
						|
            sourceSpan: new ParseSourceSpan(child.sourceSpan.start.moveBy(leadingSpaces.length), child.sourceSpan.end.moveBy(-trailingSpaces.length)) | 
						|
          }); | 
						|
        } | 
						|
 | 
						|
        if (trailingSpaces) { | 
						|
          localChildren.push({ | 
						|
            type: TYPE_WHITESPACE | 
						|
          }); | 
						|
        } | 
						|
 | 
						|
        return newChildren.concat(localChildren); | 
						|
      }, []) // set hasLeadingSpaces/hasTrailingSpaces and filter whitespace nodes | 
						|
      .reduce(function (newChildren, child, i, children) { | 
						|
        if (child.type === TYPE_WHITESPACE) { | 
						|
          return newChildren; | 
						|
        } | 
						|
 | 
						|
        var hasLeadingSpaces = i !== 0 && children[i - 1].type === TYPE_WHITESPACE; | 
						|
        var hasTrailingSpaces = i !== children.length - 1 && children[i + 1].type === TYPE_WHITESPACE; | 
						|
        return newChildren.concat(Object.assign({}, child, { | 
						|
          hasLeadingSpaces, | 
						|
          hasTrailingSpaces | 
						|
        })); | 
						|
      }, []) | 
						|
    }); | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function addIsSelfClosing(ast | 
						|
/*, options */ | 
						|
) { | 
						|
  return ast.map(function (node) { | 
						|
    return Object.assign(node, { | 
						|
      isSelfClosing: !node.children || node.type === "element" && (node.tagDefinition.isVoid || // self-closing | 
						|
      node.startSourceSpan === node.endSourceSpan) | 
						|
    }); | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function addHasHtmComponentClosingTag(ast, options) { | 
						|
  return ast.map(function (node) { | 
						|
    return node.type !== "element" ? node : Object.assign(node, { | 
						|
      hasHtmComponentClosingTag: node.endSourceSpan && /^<\s*\/\s*\/\s*>$/.test(options.originalText.slice(node.endSourceSpan.start.offset, node.endSourceSpan.end.offset)) | 
						|
    }); | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function addCssDisplay(ast, options) { | 
						|
  return ast.map(function (node) { | 
						|
    return Object.assign(node, { | 
						|
      cssDisplay: getNodeCssStyleDisplay$1(node, options) | 
						|
    }); | 
						|
  }); | 
						|
} | 
						|
/** | 
						|
 * - add `isLeadingSpaceSensitive` field | 
						|
 * - add `isTrailingSpaceSensitive` field | 
						|
 * - add `isDanglingSpaceSensitive` field for parent nodes | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function addIsSpaceSensitive(ast | 
						|
/*, options */ | 
						|
) { | 
						|
  return ast.map(function (node) { | 
						|
    if (!node.children) { | 
						|
      return node; | 
						|
    } | 
						|
 | 
						|
    if (node.children.length === 0) { | 
						|
      return node.clone({ | 
						|
        isDanglingSpaceSensitive: isDanglingSpaceSensitiveNode$1(node) | 
						|
      }); | 
						|
    } | 
						|
 | 
						|
    return node.clone({ | 
						|
      children: node.children.map(function (child) { | 
						|
        return Object.assign({}, child, { | 
						|
          isLeadingSpaceSensitive: isLeadingSpaceSensitiveNode$1(child), | 
						|
          isTrailingSpaceSensitive: isTrailingSpaceSensitiveNode$1(child) | 
						|
        }); | 
						|
      }).map(function (child, index, children) { | 
						|
        return Object.assign({}, child, { | 
						|
          isLeadingSpaceSensitive: index === 0 ? child.isLeadingSpaceSensitive : children[index - 1].isTrailingSpaceSensitive && child.isLeadingSpaceSensitive, | 
						|
          isTrailingSpaceSensitive: index === children.length - 1 ? child.isTrailingSpaceSensitive : children[index + 1].isLeadingSpaceSensitive && child.isTrailingSpaceSensitive | 
						|
        }); | 
						|
      }) | 
						|
    }); | 
						|
  }); | 
						|
} | 
						|
 | 
						|
var preprocess_1$2 = preprocess$2; | 
						|
 | 
						|
function hasPragma$3(text) { | 
						|
  return /^\s*<!--\s*@(format|prettier)\s*-->/.test(text); | 
						|
} | 
						|
 | 
						|
function insertPragma$6(text) { | 
						|
  return "<!-- @format -->\n\n" + text.replace(/^\s*\n/, ""); | 
						|
} | 
						|
 | 
						|
var pragma$4 = { | 
						|
  hasPragma: hasPragma$3, | 
						|
  insertPragma: insertPragma$6 | 
						|
}; | 
						|
 | 
						|
var _require$$0$builders$8 = doc.builders, | 
						|
    concat$e = _require$$0$builders$8.concat, | 
						|
    group$e = _require$$0$builders$8.group; | 
						|
/** | 
						|
 *     v-for="... in ..." | 
						|
 *     v-for="... of ..." | 
						|
 *     v-for="(..., ...) in ..." | 
						|
 *     v-for="(..., ...) of ..." | 
						|
 */ | 
						|
 | 
						|
function printVueFor(value, textToDoc) { | 
						|
  var _parseVueFor = parseVueFor(value), | 
						|
      left = _parseVueFor.left, | 
						|
      operator = _parseVueFor.operator, | 
						|
      right = _parseVueFor.right; | 
						|
 | 
						|
  return concat$e([group$e(textToDoc(`function _(${left}) {}`, { | 
						|
    parser: "babel", | 
						|
    __isVueForBindingLeft: true | 
						|
  })), " ", operator, " ", textToDoc(right, { | 
						|
    parser: "__js_expression" | 
						|
  })]); | 
						|
} // modified from https://github.com/vuejs/vue/blob/v2.5.17/src/compiler/parser/index.js#L370-L387 | 
						|
 | 
						|
 | 
						|
function parseVueFor(value) { | 
						|
  var forAliasRE = /([^]*?)\s+(in|of)\s+([^]*)/; | 
						|
  var forIteratorRE = /,([^,}\]]*)(?:,([^,}\]]*))?$/; | 
						|
  var stripParensRE = /^\(|\)$/g; | 
						|
  var inMatch = value.match(forAliasRE); | 
						|
 | 
						|
  if (!inMatch) { | 
						|
    return; | 
						|
  } | 
						|
 | 
						|
  var res = {}; | 
						|
  res.for = inMatch[3].trim(); | 
						|
  var alias = inMatch[1].trim().replace(stripParensRE, ""); | 
						|
  var iteratorMatch = alias.match(forIteratorRE); | 
						|
 | 
						|
  if (iteratorMatch) { | 
						|
    res.alias = alias.replace(forIteratorRE, ""); | 
						|
    res.iterator1 = iteratorMatch[1].trim(); | 
						|
 | 
						|
    if (iteratorMatch[2]) { | 
						|
      res.iterator2 = iteratorMatch[2].trim(); | 
						|
    } | 
						|
  } else { | 
						|
    res.alias = alias; | 
						|
  } | 
						|
 | 
						|
  return { | 
						|
    left: `${[res.alias, res.iterator1, res.iterator2].filter(Boolean).join(",")}`, | 
						|
    operator: inMatch[2], | 
						|
    right: res.for | 
						|
  }; | 
						|
} | 
						|
 | 
						|
function printVueSlotScope(value, textToDoc) { | 
						|
  return textToDoc(`function _(${value}) {}`, { | 
						|
    parser: "babel", | 
						|
    __isVueSlotScope: true | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function isVueEventBindingExpression$2(eventBindingValue) { | 
						|
  // https://github.com/vuejs/vue/blob/v2.5.17/src/compiler/codegen/events.js#L3-L4 | 
						|
  // arrow function or anonymous function | 
						|
  var fnExpRE = /^([\w$_]+|\([^)]*?\))\s*=>|^function\s*\(/; // simple member expression chain (a, a.b, a['b'], a["b"], a[0], a[b]) | 
						|
 | 
						|
  var simplePathRE = /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/; // https://github.com/vuejs/vue/blob/v2.5.17/src/compiler/helpers.js#L104 | 
						|
 | 
						|
  var value = eventBindingValue.trim(); | 
						|
  return fnExpRE.test(value) || simplePathRE.test(value); | 
						|
} | 
						|
 | 
						|
var syntaxVue = { | 
						|
  isVueEventBindingExpression: isVueEventBindingExpression$2, | 
						|
  printVueFor, | 
						|
  printVueSlotScope | 
						|
}; | 
						|
 | 
						|
var parseSrcset = createCommonjsModule(function (module) { | 
						|
  /** | 
						|
   * Srcset Parser | 
						|
   * | 
						|
   * By Alex Bell |  MIT License | 
						|
   * | 
						|
   * JS Parser for the string value that appears in markup <img srcset="here"> | 
						|
   * | 
						|
   * @returns Array [{url: _, d: _, w: _, h:_}, ...] | 
						|
   * | 
						|
   * Based super duper closely on the reference algorithm at: | 
						|
   * https://html.spec.whatwg.org/multipage/embedded-content.html#parse-a-srcset-attribute | 
						|
   * | 
						|
   * Most comments are copied in directly from the spec | 
						|
   * (except for comments in parens). | 
						|
   */ | 
						|
  (function (root, factory) { | 
						|
    if ( module.exports) { | 
						|
      // Node. Does not work with strict CommonJS, but | 
						|
      // only CommonJS-like environments that support module.exports, | 
						|
      // like Node. | 
						|
      module.exports = factory(); | 
						|
    } else { | 
						|
      // Browser globals (root is window) | 
						|
      root.parseSrcset = factory(); | 
						|
    } | 
						|
  })(this, function () { | 
						|
    // 1. Let input be the value passed to this algorithm. | 
						|
    return function (input, options) { | 
						|
      var logger = options && options.logger || console; // UTILITY FUNCTIONS | 
						|
      // Manual is faster than RegEx | 
						|
      // http://bjorn.tipling.com/state-and-regular-expressions-in-javascript | 
						|
      // http://jsperf.com/whitespace-character/5 | 
						|
 | 
						|
      function isSpace(c) { | 
						|
        return c === "\u0020" || // space | 
						|
        c === "\u0009" || // horizontal tab | 
						|
        c === "\u000A" || // new line | 
						|
        c === "\u000C" || // form feed | 
						|
        c === "\u000D"; // carriage return | 
						|
      } | 
						|
 | 
						|
      function collectCharacters(regEx) { | 
						|
        var chars, | 
						|
            match = regEx.exec(input.substring(pos)); | 
						|
 | 
						|
        if (match) { | 
						|
          chars = match[0]; | 
						|
          pos += chars.length; | 
						|
          return chars; | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      var inputLength = input.length, | 
						|
          // (Don't use \s, to avoid matching non-breaking space) | 
						|
      regexLeadingSpaces = /^[ \t\n\r\u000c]+/, | 
						|
          regexLeadingCommasOrSpaces = /^[, \t\n\r\u000c]+/, | 
						|
          regexLeadingNotSpaces = /^[^ \t\n\r\u000c]+/, | 
						|
          regexTrailingCommas = /[,]+$/, | 
						|
          regexNonNegativeInteger = /^\d+$/, | 
						|
          // ( Positive or negative or unsigned integers or decimals, without or without exponents. | 
						|
      // Must include at least one digit. | 
						|
      // According to spec tests any decimal point must be followed by a digit. | 
						|
      // No leading plus sign is allowed.) | 
						|
      // https://html.spec.whatwg.org/multipage/infrastructure.html#valid-floating-point-number | 
						|
      regexFloatingPoint = /^-?(?:[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?$/, | 
						|
          url, | 
						|
          descriptors, | 
						|
          currentDescriptor, | 
						|
          state, | 
						|
          c, | 
						|
          // 2. Let position be a pointer into input, initially pointing at the start | 
						|
      //    of the string. | 
						|
      pos = 0, | 
						|
          // 3. Let candidates be an initially empty source set. | 
						|
      candidates = []; // 4. Splitting loop: Collect a sequence of characters that are space | 
						|
      //    characters or U+002C COMMA characters. If any U+002C COMMA characters | 
						|
      //    were collected, that is a parse error. | 
						|
 | 
						|
      while (true) { | 
						|
        collectCharacters(regexLeadingCommasOrSpaces); // 5. If position is past the end of input, return candidates and abort these steps. | 
						|
 | 
						|
        if (pos >= inputLength) { | 
						|
          return candidates; // (we're done, this is the sole return path) | 
						|
        } // 6. Collect a sequence of characters that are not space characters, | 
						|
        //    and let that be url. | 
						|
 | 
						|
 | 
						|
        url = collectCharacters(regexLeadingNotSpaces); // 7. Let descriptors be a new empty list. | 
						|
 | 
						|
        descriptors = []; // 8. If url ends with a U+002C COMMA character (,), follow these substeps: | 
						|
        //		(1). Remove all trailing U+002C COMMA characters from url. If this removed | 
						|
        //         more than one character, that is a parse error. | 
						|
 | 
						|
        if (url.slice(-1) === ",") { | 
						|
          url = url.replace(regexTrailingCommas, ""); // (Jump ahead to step 9 to skip tokenization and just push the candidate). | 
						|
 | 
						|
          parseDescriptors(); //	Otherwise, follow these substeps: | 
						|
        } else { | 
						|
          tokenize(); | 
						|
        } // (close else of step 8) | 
						|
        // 16. Return to the step labeled splitting loop. | 
						|
 | 
						|
      } // (Close of big while loop.) | 
						|
 | 
						|
      /** | 
						|
       * Tokenizes descriptor properties prior to parsing | 
						|
       * Returns undefined. | 
						|
       */ | 
						|
 | 
						|
 | 
						|
      function tokenize() { | 
						|
        // 8.1. Descriptor tokeniser: Skip whitespace | 
						|
        collectCharacters(regexLeadingSpaces); // 8.2. Let current descriptor be the empty string. | 
						|
 | 
						|
        currentDescriptor = ""; // 8.3. Let state be in descriptor. | 
						|
 | 
						|
        state = "in descriptor"; | 
						|
 | 
						|
        while (true) { | 
						|
          // 8.4. Let c be the character at position. | 
						|
          c = input.charAt(pos); //  Do the following depending on the value of state. | 
						|
          //  For the purpose of this step, "EOF" is a special character representing | 
						|
          //  that position is past the end of input. | 
						|
          // In descriptor | 
						|
 | 
						|
          if (state === "in descriptor") { | 
						|
            // Do the following, depending on the value of c: | 
						|
            // Space character | 
						|
            // If current descriptor is not empty, append current descriptor to | 
						|
            // descriptors and let current descriptor be the empty string. | 
						|
            // Set state to after descriptor. | 
						|
            if (isSpace(c)) { | 
						|
              if (currentDescriptor) { | 
						|
                descriptors.push(currentDescriptor); | 
						|
                currentDescriptor = ""; | 
						|
                state = "after descriptor"; | 
						|
              } // U+002C COMMA (,) | 
						|
              // Advance position to the next character in input. If current descriptor | 
						|
              // is not empty, append current descriptor to descriptors. Jump to the step | 
						|
              // labeled descriptor parser. | 
						|
 | 
						|
            } else if (c === ",") { | 
						|
              pos += 1; | 
						|
 | 
						|
              if (currentDescriptor) { | 
						|
                descriptors.push(currentDescriptor); | 
						|
              } | 
						|
 | 
						|
              parseDescriptors(); | 
						|
              return; // U+0028 LEFT PARENTHESIS (() | 
						|
              // Append c to current descriptor. Set state to in parens. | 
						|
            } else if (c === "\u0028") { | 
						|
              currentDescriptor = currentDescriptor + c; | 
						|
              state = "in parens"; // EOF | 
						|
              // If current descriptor is not empty, append current descriptor to | 
						|
              // descriptors. Jump to the step labeled descriptor parser. | 
						|
            } else if (c === "") { | 
						|
              if (currentDescriptor) { | 
						|
                descriptors.push(currentDescriptor); | 
						|
              } | 
						|
 | 
						|
              parseDescriptors(); | 
						|
              return; // Anything else | 
						|
              // Append c to current descriptor. | 
						|
            } else { | 
						|
              currentDescriptor = currentDescriptor + c; | 
						|
            } // (end "in descriptor" | 
						|
            // In parens | 
						|
 | 
						|
          } else if (state === "in parens") { | 
						|
            // U+0029 RIGHT PARENTHESIS ()) | 
						|
            // Append c to current descriptor. Set state to in descriptor. | 
						|
            if (c === ")") { | 
						|
              currentDescriptor = currentDescriptor + c; | 
						|
              state = "in descriptor"; // EOF | 
						|
              // Append current descriptor to descriptors. Jump to the step labeled | 
						|
              // descriptor parser. | 
						|
            } else if (c === "") { | 
						|
              descriptors.push(currentDescriptor); | 
						|
              parseDescriptors(); | 
						|
              return; // Anything else | 
						|
              // Append c to current descriptor. | 
						|
            } else { | 
						|
              currentDescriptor = currentDescriptor + c; | 
						|
            } // After descriptor | 
						|
 | 
						|
          } else if (state === "after descriptor") { | 
						|
            // Do the following, depending on the value of c: | 
						|
            // Space character: Stay in this state. | 
						|
            if (isSpace(c)) ; else if (c === "") { | 
						|
              parseDescriptors(); | 
						|
              return; // Anything else | 
						|
              // Set state to in descriptor. Set position to the previous character in input. | 
						|
            } else { | 
						|
              state = "in descriptor"; | 
						|
              pos -= 1; | 
						|
            } | 
						|
          } // Advance position to the next character in input. | 
						|
 | 
						|
 | 
						|
          pos += 1; // Repeat this step. | 
						|
        } // (close while true loop) | 
						|
 | 
						|
      } | 
						|
      /** | 
						|
       * Adds descriptor properties to a candidate, pushes to the candidates array | 
						|
       * @return undefined | 
						|
       */ | 
						|
      // Declared outside of the while loop so that it's only created once. | 
						|
 | 
						|
 | 
						|
      function parseDescriptors() { | 
						|
        // 9. Descriptor parser: Let error be no. | 
						|
        var pError = false, | 
						|
            // 10. Let width be absent. | 
						|
        // 11. Let density be absent. | 
						|
        // 12. Let future-compat-h be absent. (We're implementing it now as h) | 
						|
        w, | 
						|
            d, | 
						|
            h, | 
						|
            i, | 
						|
            candidate = {}, | 
						|
            desc, | 
						|
            lastChar, | 
						|
            value, | 
						|
            intVal, | 
						|
            floatVal; // 13. For each descriptor in descriptors, run the appropriate set of steps | 
						|
        // from the following list: | 
						|
 | 
						|
        for (i = 0; i < descriptors.length; i++) { | 
						|
          desc = descriptors[i]; | 
						|
          lastChar = desc[desc.length - 1]; | 
						|
          value = desc.substring(0, desc.length - 1); | 
						|
          intVal = parseInt(value, 10); | 
						|
          floatVal = parseFloat(value); // If the descriptor consists of a valid non-negative integer followed by | 
						|
          // a U+0077 LATIN SMALL LETTER W character | 
						|
 | 
						|
          if (regexNonNegativeInteger.test(value) && lastChar === "w") { | 
						|
            // If width and density are not both absent, then let error be yes. | 
						|
            if (w || d) { | 
						|
              pError = true; | 
						|
            } // Apply the rules for parsing non-negative integers to the descriptor. | 
						|
            // If the result is zero, let error be yes. | 
						|
            // Otherwise, let width be the result. | 
						|
 | 
						|
 | 
						|
            if (intVal === 0) { | 
						|
              pError = true; | 
						|
            } else { | 
						|
              w = intVal; | 
						|
            } // If the descriptor consists of a valid floating-point number followed by | 
						|
            // a U+0078 LATIN SMALL LETTER X character | 
						|
 | 
						|
          } else if (regexFloatingPoint.test(value) && lastChar === "x") { | 
						|
            // If width, density and future-compat-h are not all absent, then let error | 
						|
            // be yes. | 
						|
            if (w || d || h) { | 
						|
              pError = true; | 
						|
            } // Apply the rules for parsing floating-point number values to the descriptor. | 
						|
            // If the result is less than zero, let error be yes. Otherwise, let density | 
						|
            // be the result. | 
						|
 | 
						|
 | 
						|
            if (floatVal < 0) { | 
						|
              pError = true; | 
						|
            } else { | 
						|
              d = floatVal; | 
						|
            } // If the descriptor consists of a valid non-negative integer followed by | 
						|
            // a U+0068 LATIN SMALL LETTER H character | 
						|
 | 
						|
          } else if (regexNonNegativeInteger.test(value) && lastChar === "h") { | 
						|
            // If height and density are not both absent, then let error be yes. | 
						|
            if (h || d) { | 
						|
              pError = true; | 
						|
            } // Apply the rules for parsing non-negative integers to the descriptor. | 
						|
            // If the result is zero, let error be yes. Otherwise, let future-compat-h | 
						|
            // be the result. | 
						|
 | 
						|
 | 
						|
            if (intVal === 0) { | 
						|
              pError = true; | 
						|
            } else { | 
						|
              h = intVal; | 
						|
            } // Anything else, Let error be yes. | 
						|
 | 
						|
          } else { | 
						|
            pError = true; | 
						|
          } | 
						|
        } // (close step 13 for loop) | 
						|
        // 15. If error is still no, then append a new image source to candidates whose | 
						|
        // URL is url, associated with a width width if not absent and a pixel | 
						|
        // density density if not absent. Otherwise, there is a parse error. | 
						|
 | 
						|
 | 
						|
        if (!pError) { | 
						|
          candidate.url = url; | 
						|
 | 
						|
          if (w) { | 
						|
            candidate.w = w; | 
						|
          } | 
						|
 | 
						|
          if (d) { | 
						|
            candidate.d = d; | 
						|
          } | 
						|
 | 
						|
          if (h) { | 
						|
            candidate.h = h; | 
						|
          } | 
						|
 | 
						|
          candidates.push(candidate); | 
						|
        } else if (logger && logger.error) { | 
						|
          logger.error("Invalid srcset descriptor found in '" + input + "' at '" + desc + "'."); | 
						|
        } | 
						|
      } // (close parseDescriptors fn) | 
						|
 | 
						|
    }; | 
						|
  }); | 
						|
}); | 
						|
 | 
						|
var _require$$0$builders$9 = doc.builders, | 
						|
    concat$f = _require$$0$builders$9.concat, | 
						|
    ifBreak$6 = _require$$0$builders$9.ifBreak, | 
						|
    join$a = _require$$0$builders$9.join, | 
						|
    line$7 = _require$$0$builders$9.line; | 
						|
 | 
						|
function printImgSrcset(value) { | 
						|
  var srcset = parseSrcset(value, { | 
						|
    logger: { | 
						|
      error(message) { | 
						|
        throw new Error(message); | 
						|
      } | 
						|
 | 
						|
    } | 
						|
  }); | 
						|
  var hasW = srcset.some(function (src) { | 
						|
    return src.w; | 
						|
  }); | 
						|
  var hasH = srcset.some(function (src) { | 
						|
    return src.h; | 
						|
  }); | 
						|
  var hasX = srcset.some(function (src) { | 
						|
    return src.d; | 
						|
  }); | 
						|
 | 
						|
  if (hasW + hasH + hasX !== 1) { | 
						|
    throw new Error(`Mixed descriptor in srcset is not supported`); | 
						|
  } | 
						|
 | 
						|
  var key = hasW ? "w" : hasH ? "h" : "d"; | 
						|
  var unit = hasW ? "w" : hasH ? "h" : "x"; | 
						|
 | 
						|
  var getMax = function getMax(values) { | 
						|
    return Math.max.apply(Math, values); | 
						|
  }; | 
						|
 | 
						|
  var urls = srcset.map(function (src) { | 
						|
    return src.url; | 
						|
  }); | 
						|
  var maxUrlLength = getMax(urls.map(function (url) { | 
						|
    return url.length; | 
						|
  })); | 
						|
  var descriptors = srcset.map(function (src) { | 
						|
    return src[key]; | 
						|
  }).map(function (descriptor) { | 
						|
    return descriptor ? descriptor.toString() : ""; | 
						|
  }); | 
						|
  var descriptorLeftLengths = descriptors.map(function (descriptor) { | 
						|
    var index = descriptor.indexOf("."); | 
						|
    return index === -1 ? descriptor.length : index; | 
						|
  }); | 
						|
  var maxDescriptorLeftLength = getMax(descriptorLeftLengths); | 
						|
  return join$a(concat$f([",", line$7]), urls.map(function (url, index) { | 
						|
    var parts = [url]; | 
						|
    var descriptor = descriptors[index]; | 
						|
 | 
						|
    if (descriptor) { | 
						|
      var urlPadding = maxUrlLength - url.length + 1; | 
						|
      var descriptorPadding = maxDescriptorLeftLength - descriptorLeftLengths[index]; | 
						|
      var alignment = " ".repeat(urlPadding + descriptorPadding); | 
						|
      parts.push(ifBreak$6(alignment, " "), descriptor + unit); | 
						|
    } | 
						|
 | 
						|
    return concat$f(parts); | 
						|
  })); | 
						|
} | 
						|
 | 
						|
var syntaxAttribute = { | 
						|
  printImgSrcset | 
						|
}; | 
						|
 | 
						|
var builders = doc.builders, | 
						|
    _require$$0$utils = doc.utils, | 
						|
    stripTrailingHardline$2 = _require$$0$utils.stripTrailingHardline, | 
						|
    mapDoc$7 = _require$$0$utils.mapDoc; | 
						|
var breakParent$4 = builders.breakParent, | 
						|
    dedentToRoot$2 = builders.dedentToRoot, | 
						|
    fill$5 = builders.fill, | 
						|
    group$f = builders.group, | 
						|
    hardline$c = builders.hardline, | 
						|
    ifBreak$7 = builders.ifBreak, | 
						|
    indent$9 = builders.indent, | 
						|
    join$b = builders.join, | 
						|
    line$8 = builders.line, | 
						|
    literalline$6 = builders.literalline, | 
						|
    markAsRoot$4 = builders.markAsRoot, | 
						|
    softline$7 = builders.softline; | 
						|
var countChars$1 = utils$5.countChars, | 
						|
    countParents$1 = utils$5.countParents, | 
						|
    dedentString$1 = utils$5.dedentString, | 
						|
    forceBreakChildren$1 = utils$5.forceBreakChildren, | 
						|
    forceBreakContent$1 = utils$5.forceBreakContent, | 
						|
    forceNextEmptyLine$1 = utils$5.forceNextEmptyLine, | 
						|
    getLastDescendant$1 = utils$5.getLastDescendant, | 
						|
    getPrettierIgnoreAttributeCommentData$1 = utils$5.getPrettierIgnoreAttributeCommentData, | 
						|
    hasPrettierIgnore$4 = utils$5.hasPrettierIgnore, | 
						|
    inferScriptParser$1 = utils$5.inferScriptParser, | 
						|
    isScriptLikeTag$1 = utils$5.isScriptLikeTag, | 
						|
    isTextLikeNode$1 = utils$5.isTextLikeNode, | 
						|
    normalizeParts$2 = utils$5.normalizeParts, | 
						|
    preferHardlineAsLeadingSpaces$1 = utils$5.preferHardlineAsLeadingSpaces, | 
						|
    shouldNotPrintClosingTag$1 = utils$5.shouldNotPrintClosingTag, | 
						|
    shouldPreserveContent$1 = utils$5.shouldPreserveContent, | 
						|
    unescapeQuoteEntities$1 = utils$5.unescapeQuoteEntities; | 
						|
var replaceEndOfLineWith$2 = util.replaceEndOfLineWith; | 
						|
var insertPragma$7 = pragma$4.insertPragma; | 
						|
var printVueFor$1 = syntaxVue.printVueFor, | 
						|
    printVueSlotScope$1 = syntaxVue.printVueSlotScope, | 
						|
    isVueEventBindingExpression$3 = syntaxVue.isVueEventBindingExpression; | 
						|
var printImgSrcset$1 = syntaxAttribute.printImgSrcset; | 
						|
 | 
						|
function concat$g(parts) { | 
						|
  var newParts = normalizeParts$2(parts); | 
						|
  return newParts.length === 0 ? "" : newParts.length === 1 ? newParts[0] : builders.concat(newParts); | 
						|
} | 
						|
 | 
						|
function embed$4(path, print, textToDoc, options) { | 
						|
  var node = path.getValue(); | 
						|
 | 
						|
  switch (node.type) { | 
						|
    case "text": | 
						|
      { | 
						|
        if (isScriptLikeTag$1(node.parent)) { | 
						|
          var parser = inferScriptParser$1(node.parent); | 
						|
 | 
						|
          if (parser) { | 
						|
            var value = parser === "markdown" ? dedentString$1(node.value.replace(/^[^\S\n]*?\n/, "")) : node.value; | 
						|
            return builders.concat([concat$g([breakParent$4, printOpeningTagPrefix(node, options), stripTrailingHardline$2(textToDoc(value, { | 
						|
              parser | 
						|
            })), printClosingTagSuffix(node, options)])]); | 
						|
          } | 
						|
        } else if (node.parent.type === "interpolation") { | 
						|
          return concat$g([indent$9(concat$g([line$8, textToDoc(node.value, Object.assign({ | 
						|
            __isInHtmlInterpolation: true // to avoid unexpected `}}` | 
						|
 | 
						|
          }, options.parser === "angular" ? { | 
						|
            parser: "__ng_interpolation", | 
						|
            trailingComma: "none" | 
						|
          } : options.parser === "vue" ? { | 
						|
            parser: "__vue_expression" | 
						|
          } : { | 
						|
            parser: "__js_expression" | 
						|
          }))])), node.parent.next && needsToBorrowPrevClosingTagEndMarker(node.parent.next) ? " " : line$8]); | 
						|
        } | 
						|
 | 
						|
        break; | 
						|
      } | 
						|
 | 
						|
    case "attribute": | 
						|
      { | 
						|
        if (!node.value) { | 
						|
          break; | 
						|
        } // lit-html: html`<my-element obj=${obj}></my-element>` | 
						|
 | 
						|
 | 
						|
        if (/^PRETTIER_HTML_PLACEHOLDER_\d+_\d+_IN_JS$/.test(options.originalText.slice(node.valueSpan.start.offset, node.valueSpan.end.offset))) { | 
						|
          return concat$g([node.rawName, "=", node.value]); | 
						|
        } // lwc: html`<my-element data-for={value}></my-element>` | 
						|
 | 
						|
 | 
						|
        if (options.parser === "lwc") { | 
						|
          var interpolationRegex = /^\{[\s\S]*\}$/; | 
						|
 | 
						|
          if (interpolationRegex.test(options.originalText.slice(node.valueSpan.start.offset, node.valueSpan.end.offset))) { | 
						|
            return concat$g([node.rawName, "=", node.value]); | 
						|
          } | 
						|
        } | 
						|
 | 
						|
        var embeddedAttributeValueDoc = printEmbeddedAttributeValue(node, function (code, opts) { | 
						|
          return (// strictly prefer single quote to avoid unnecessary html entity escape | 
						|
            textToDoc(code, Object.assign({ | 
						|
              __isInHtmlAttribute: true | 
						|
            }, opts)) | 
						|
          ); | 
						|
        }, options); | 
						|
 | 
						|
        if (embeddedAttributeValueDoc) { | 
						|
          return concat$g([node.rawName, '="', group$f(mapDoc$7(embeddedAttributeValueDoc, function (doc) { | 
						|
            return typeof doc === "string" ? doc.replace(/"/g, """) : doc; | 
						|
          })), '"']); | 
						|
        } | 
						|
 | 
						|
        break; | 
						|
      } | 
						|
 | 
						|
    case "yaml": | 
						|
      return markAsRoot$4(concat$g(["---", hardline$c, node.value.trim().length === 0 ? "" : textToDoc(node.value, { | 
						|
        parser: "yaml" | 
						|
      }), "---"])); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function genericPrint$5(path, options, print) { | 
						|
  var node = path.getValue(); | 
						|
 | 
						|
  switch (node.type) { | 
						|
    case "root": | 
						|
      // use original concat to not break stripTrailingHardline | 
						|
      return builders.concat([group$f(printChildren$2(path, options, print)), hardline$c]); | 
						|
 | 
						|
    case "element": | 
						|
    case "ieConditionalComment": | 
						|
      { | 
						|
        /** | 
						|
         * do not break: | 
						|
         * | 
						|
         *     <div>{{ | 
						|
         *         ~ | 
						|
         *       interpolation | 
						|
         *     }}</div> | 
						|
         *            ~ | 
						|
         * | 
						|
         * exception: break if the opening tag breaks | 
						|
         * | 
						|
         *     <div | 
						|
         *       long | 
						|
         *           ~ | 
						|
         *       >{{ | 
						|
         *         interpolation | 
						|
         *       }}</div | 
						|
         *              ~ | 
						|
         *     > | 
						|
         */ | 
						|
        var shouldHugContent = node.children.length === 1 && node.firstChild.type === "interpolation" && node.firstChild.isLeadingSpaceSensitive && !node.firstChild.hasLeadingSpaces && node.lastChild.isTrailingSpaceSensitive && !node.lastChild.hasTrailingSpaces; | 
						|
        var attrGroupId = Symbol("element-attr-group-id"); | 
						|
        return concat$g([group$f(concat$g([group$f(printOpeningTag(path, options, print), { | 
						|
          id: attrGroupId | 
						|
        }), node.children.length === 0 ? node.hasDanglingSpaces && node.isDanglingSpaceSensitive ? line$8 : "" : concat$g([forceBreakContent$1(node) ? breakParent$4 : "", function (childrenDoc) { | 
						|
          return shouldHugContent ? ifBreak$7(indent$9(childrenDoc), childrenDoc, { | 
						|
            groupId: attrGroupId | 
						|
          }) : isScriptLikeTag$1(node) && node.parent.type === "root" && options.parser === "vue" && !options.vueIndentScriptAndStyle ? childrenDoc : indent$9(childrenDoc); | 
						|
        }(concat$g([shouldHugContent ? ifBreak$7(softline$7, "", { | 
						|
          groupId: attrGroupId | 
						|
        }) : node.firstChild.hasLeadingSpaces && node.firstChild.isLeadingSpaceSensitive ? line$8 : node.firstChild.type === "text" && node.isWhitespaceSensitive && node.isIndentationSensitive ? dedentToRoot$2(softline$7) : softline$7, printChildren$2(path, options, print)])), (node.next ? needsToBorrowPrevClosingTagEndMarker(node.next) : needsToBorrowLastChildClosingTagEndMarker(node.parent)) ? node.lastChild.hasTrailingSpaces && node.lastChild.isTrailingSpaceSensitive ? " " : "" : shouldHugContent ? ifBreak$7(softline$7, "", { | 
						|
          groupId: attrGroupId | 
						|
        }) : node.lastChild.hasTrailingSpaces && node.lastChild.isTrailingSpaceSensitive ? line$8 : (node.lastChild.type === "comment" || node.lastChild.type === "text" && node.isWhitespaceSensitive && node.isIndentationSensitive) && new RegExp(`\\n\\s{${options.tabWidth * countParents$1(path, function (n) { | 
						|
          return n.parent && n.parent.type !== "root"; | 
						|
        })}}$`).test(node.lastChild.value) ? | 
						|
        /** | 
						|
         *     <div> | 
						|
         *       <pre> | 
						|
         *         something | 
						|
         *       </pre> | 
						|
         *            ~ | 
						|
         *     </div> | 
						|
         */ | 
						|
        "" : softline$7])])), printClosingTag(node, options)]); | 
						|
      } | 
						|
 | 
						|
    case "ieConditionalStartComment": | 
						|
    case "ieConditionalEndComment": | 
						|
      return concat$g([printOpeningTagStart(node), printClosingTagEnd(node)]); | 
						|
 | 
						|
    case "interpolation": | 
						|
      return concat$g([printOpeningTagStart(node, options), concat$g(path.map(print, "children")), printClosingTagEnd(node, options)]); | 
						|
 | 
						|
    case "text": | 
						|
      { | 
						|
        if (node.parent.type === "interpolation") { | 
						|
          // replace the trailing literalline with hardline for better readability | 
						|
          var trailingNewlineRegex = /\n[^\S\n]*?$/; | 
						|
          var hasTrailingNewline = trailingNewlineRegex.test(node.value); | 
						|
          var value = hasTrailingNewline ? node.value.replace(trailingNewlineRegex, "") : node.value; | 
						|
          return concat$g([concat$g(replaceEndOfLineWith$2(value, literalline$6)), hasTrailingNewline ? hardline$c : ""]); | 
						|
        } | 
						|
 | 
						|
        return fill$5(normalizeParts$2([].concat(printOpeningTagPrefix(node, options), getTextValueParts(node), printClosingTagSuffix(node, options)))); | 
						|
      } | 
						|
 | 
						|
    case "docType": | 
						|
      return concat$g([group$f(concat$g([printOpeningTagStart(node, options), " ", node.value.replace(/^html\b/i, "html").replace(/\s+/g, " ")])), printClosingTagEnd(node, options)]); | 
						|
 | 
						|
    case "comment": | 
						|
      { | 
						|
        return concat$g([printOpeningTagPrefix(node, options), concat$g(replaceEndOfLineWith$2(options.originalText.slice(options.locStart(node), options.locEnd(node)), literalline$6)), printClosingTagSuffix(node, options)]); | 
						|
      } | 
						|
 | 
						|
    case "attribute": | 
						|
      { | 
						|
        if (node.value === null) { | 
						|
          return node.rawName; | 
						|
        } | 
						|
 | 
						|
        var _value = unescapeQuoteEntities$1(node.value); | 
						|
 | 
						|
        var singleQuoteCount = countChars$1(_value, "'"); | 
						|
        var doubleQuoteCount = countChars$1(_value, '"'); | 
						|
        var quote = singleQuoteCount < doubleQuoteCount ? "'" : '"'; | 
						|
        return concat$g([node.rawName, concat$g(["=", quote, concat$g(replaceEndOfLineWith$2(quote === '"' ? _value.replace(/"/g, """) : _value.replace(/'/g, "'"), literalline$6)), quote])]); | 
						|
      } | 
						|
 | 
						|
    case "yaml": | 
						|
    case "toml": | 
						|
      return concat$g(replaceEndOfLineWith$2(node.raw, literalline$6)); | 
						|
 | 
						|
    default: | 
						|
      throw new Error(`Unexpected node type ${node.type}`); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function printChildren$2(path, options, print) { | 
						|
  var node = path.getValue(); | 
						|
 | 
						|
  if (forceBreakChildren$1(node)) { | 
						|
    return concat$g([breakParent$4, concat$g(path.map(function (childPath) { | 
						|
      var childNode = childPath.getValue(); | 
						|
      var prevBetweenLine = !childNode.prev ? "" : printBetweenLine(childNode.prev, childNode); | 
						|
      return concat$g([!prevBetweenLine ? "" : concat$g([prevBetweenLine, forceNextEmptyLine$1(childNode.prev) ? hardline$c : ""]), printChild(childPath)]); | 
						|
    }, "children"))]); | 
						|
  } | 
						|
 | 
						|
  var groupIds = node.children.map(function () { | 
						|
    return Symbol(""); | 
						|
  }); | 
						|
  return concat$g(path.map(function (childPath, childIndex) { | 
						|
    var childNode = childPath.getValue(); | 
						|
 | 
						|
    if (isTextLikeNode$1(childNode)) { | 
						|
      if (childNode.prev && isTextLikeNode$1(childNode.prev)) { | 
						|
        var _prevBetweenLine = printBetweenLine(childNode.prev, childNode); | 
						|
 | 
						|
        if (_prevBetweenLine) { | 
						|
          if (forceNextEmptyLine$1(childNode.prev)) { | 
						|
            return concat$g([hardline$c, hardline$c, printChild(childPath)]); | 
						|
          } | 
						|
 | 
						|
          return concat$g([_prevBetweenLine, printChild(childPath)]); | 
						|
        } | 
						|
      } | 
						|
 | 
						|
      return printChild(childPath); | 
						|
    } | 
						|
 | 
						|
    var prevParts = []; | 
						|
    var leadingParts = []; | 
						|
    var trailingParts = []; | 
						|
    var nextParts = []; | 
						|
    var prevBetweenLine = childNode.prev ? printBetweenLine(childNode.prev, childNode) : ""; | 
						|
    var nextBetweenLine = childNode.next ? printBetweenLine(childNode, childNode.next) : ""; | 
						|
 | 
						|
    if (prevBetweenLine) { | 
						|
      if (forceNextEmptyLine$1(childNode.prev)) { | 
						|
        prevParts.push(hardline$c, hardline$c); | 
						|
      } else if (prevBetweenLine === hardline$c) { | 
						|
        prevParts.push(hardline$c); | 
						|
      } else { | 
						|
        if (isTextLikeNode$1(childNode.prev)) { | 
						|
          leadingParts.push(prevBetweenLine); | 
						|
        } else { | 
						|
          leadingParts.push(ifBreak$7("", softline$7, { | 
						|
            groupId: groupIds[childIndex - 1] | 
						|
          })); | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    if (nextBetweenLine) { | 
						|
      if (forceNextEmptyLine$1(childNode)) { | 
						|
        if (isTextLikeNode$1(childNode.next)) { | 
						|
          nextParts.push(hardline$c, hardline$c); | 
						|
        } | 
						|
      } else if (nextBetweenLine === hardline$c) { | 
						|
        if (isTextLikeNode$1(childNode.next)) { | 
						|
          nextParts.push(hardline$c); | 
						|
        } | 
						|
      } else { | 
						|
        trailingParts.push(nextBetweenLine); | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return concat$g([].concat(prevParts, group$f(concat$g([concat$g(leadingParts), group$f(concat$g([printChild(childPath), concat$g(trailingParts)]), { | 
						|
      id: groupIds[childIndex] | 
						|
    })])), nextParts)); | 
						|
  }, "children")); | 
						|
 | 
						|
  function printChild(childPath) { | 
						|
    var child = childPath.getValue(); | 
						|
 | 
						|
    if (hasPrettierIgnore$4(child)) { | 
						|
      return concat$g([].concat(printOpeningTagPrefix(child, options), replaceEndOfLineWith$2(options.originalText.slice(options.locStart(child) + (child.prev && needsToBorrowNextOpeningTagStartMarker(child.prev) ? printOpeningTagStartMarker(child).length : 0), options.locEnd(child) - (child.next && needsToBorrowPrevClosingTagEndMarker(child.next) ? printClosingTagEndMarker(child, options).length : 0)), literalline$6), printClosingTagSuffix(child, options))); | 
						|
    } | 
						|
 | 
						|
    if (shouldPreserveContent$1(child, options)) { | 
						|
      return concat$g([].concat(printOpeningTagPrefix(child, options), group$f(printOpeningTag(childPath, options, print)), replaceEndOfLineWith$2(options.originalText.slice(child.startSourceSpan.end.offset + (child.firstChild && needsToBorrowParentOpeningTagEndMarker(child.firstChild) ? -printOpeningTagEndMarker(child).length : 0), child.endSourceSpan.start.offset + (child.lastChild && needsToBorrowParentClosingTagStartMarker(child.lastChild) ? printClosingTagStartMarker(child, options).length : needsToBorrowLastChildClosingTagEndMarker(child) ? -printClosingTagEndMarker(child.lastChild, options).length : 0)), literalline$6), printClosingTag(child, options), printClosingTagSuffix(child, options))); | 
						|
    } | 
						|
 | 
						|
    return print(childPath); | 
						|
  } | 
						|
 | 
						|
  function printBetweenLine(prevNode, nextNode) { | 
						|
    return isTextLikeNode$1(prevNode) && isTextLikeNode$1(nextNode) ? prevNode.isTrailingSpaceSensitive ? prevNode.hasTrailingSpaces ? preferHardlineAsLeadingSpaces$1(nextNode) ? hardline$c : line$8 : "" : preferHardlineAsLeadingSpaces$1(nextNode) ? hardline$c : softline$7 : needsToBorrowNextOpeningTagStartMarker(prevNode) && ( | 
						|
    /** | 
						|
     *     123<a | 
						|
     *          ~ | 
						|
     *       ><b> | 
						|
     */ | 
						|
    nextNode.firstChild || | 
						|
    /** | 
						|
     *     123<!-- | 
						|
     *            ~ | 
						|
     *     --> | 
						|
     */ | 
						|
    nextNode.isSelfClosing || | 
						|
    /** | 
						|
     *     123<span | 
						|
     *             ~ | 
						|
     *       attr | 
						|
     */ | 
						|
    nextNode.type === "element" && nextNode.attrs.length !== 0) || | 
						|
    /** | 
						|
     *     <img | 
						|
     *       src="long" | 
						|
     *                 ~ | 
						|
     *     />123 | 
						|
     */ | 
						|
    prevNode.type === "element" && prevNode.isSelfClosing && needsToBorrowPrevClosingTagEndMarker(nextNode) ? "" : !nextNode.isLeadingSpaceSensitive || preferHardlineAsLeadingSpaces$1(nextNode) || | 
						|
    /** | 
						|
     *       Want to write us a letter? Use our<a | 
						|
     *         ><b><a>mailing address</a></b></a | 
						|
     *                                          ~ | 
						|
     *       >. | 
						|
     */ | 
						|
    needsToBorrowPrevClosingTagEndMarker(nextNode) && prevNode.lastChild && needsToBorrowParentClosingTagStartMarker(prevNode.lastChild) && prevNode.lastChild.lastChild && needsToBorrowParentClosingTagStartMarker(prevNode.lastChild.lastChild) ? hardline$c : nextNode.hasLeadingSpaces ? line$8 : softline$7; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function printOpeningTag(path, options, print) { | 
						|
  var node = path.getValue(); | 
						|
  var forceNotToBreakAttrContent = node.type === "element" && node.fullName === "script" && node.attrs.length === 1 && node.attrs[0].fullName === "src" && node.children.length === 0; | 
						|
  return concat$g([printOpeningTagStart(node, options), !node.attrs || node.attrs.length === 0 ? node.isSelfClosing ? | 
						|
  /** | 
						|
   *     <br /> | 
						|
   *        ^ | 
						|
   */ | 
						|
  " " : "" : concat$g([indent$9(concat$g([forceNotToBreakAttrContent ? " " : line$8, join$b(line$8, function (ignoreAttributeData) { | 
						|
    var hasPrettierIgnoreAttribute = typeof ignoreAttributeData === "boolean" ? function () { | 
						|
      return ignoreAttributeData; | 
						|
    } : Array.isArray(ignoreAttributeData) ? function (attr) { | 
						|
      return ignoreAttributeData.indexOf(attr.rawName) !== -1; | 
						|
    } : function () { | 
						|
      return false; | 
						|
    }; | 
						|
    return path.map(function (attrPath) { | 
						|
      var attr = attrPath.getValue(); | 
						|
      return hasPrettierIgnoreAttribute(attr) ? concat$g(replaceEndOfLineWith$2(options.originalText.slice(options.locStart(attr), options.locEnd(attr)), literalline$6)) : print(attrPath); | 
						|
    }, "attrs"); | 
						|
  }(node.prev && node.prev.type === "comment" && getPrettierIgnoreAttributeCommentData$1(node.prev.value)))])), | 
						|
  /** | 
						|
   *     123<a | 
						|
   *       attr | 
						|
   *           ~ | 
						|
   *       >456 | 
						|
   */ | 
						|
  node.firstChild && needsToBorrowParentOpeningTagEndMarker(node.firstChild) || | 
						|
  /** | 
						|
   *     <span | 
						|
   *       >123<meta | 
						|
   *                ~ | 
						|
   *     /></span> | 
						|
   */ | 
						|
  node.isSelfClosing && needsToBorrowLastChildClosingTagEndMarker(node.parent) ? "" : node.isSelfClosing ? forceNotToBreakAttrContent ? " " : line$8 : forceNotToBreakAttrContent ? "" : softline$7]), node.isSelfClosing ? "" : printOpeningTagEnd(node)]); | 
						|
} | 
						|
 | 
						|
function printOpeningTagStart(node, options) { | 
						|
  return node.prev && needsToBorrowNextOpeningTagStartMarker(node.prev) ? "" : concat$g([printOpeningTagPrefix(node, options), printOpeningTagStartMarker(node)]); | 
						|
} | 
						|
 | 
						|
function printOpeningTagEnd(node) { | 
						|
  return node.firstChild && needsToBorrowParentOpeningTagEndMarker(node.firstChild) ? "" : printOpeningTagEndMarker(node); | 
						|
} | 
						|
 | 
						|
function printClosingTag(node, options) { | 
						|
  return concat$g([node.isSelfClosing ? "" : printClosingTagStart(node, options), printClosingTagEnd(node, options)]); | 
						|
} | 
						|
 | 
						|
function printClosingTagStart(node, options) { | 
						|
  return node.lastChild && needsToBorrowParentClosingTagStartMarker(node.lastChild) ? "" : concat$g([printClosingTagPrefix(node, options), printClosingTagStartMarker(node, options)]); | 
						|
} | 
						|
 | 
						|
function printClosingTagEnd(node, options) { | 
						|
  return (node.next ? needsToBorrowPrevClosingTagEndMarker(node.next) : needsToBorrowLastChildClosingTagEndMarker(node.parent)) ? "" : concat$g([printClosingTagEndMarker(node, options), printClosingTagSuffix(node, options)]); | 
						|
} | 
						|
 | 
						|
function needsToBorrowNextOpeningTagStartMarker(node) { | 
						|
  /** | 
						|
   *     123<p | 
						|
   *        ^^ | 
						|
   *     > | 
						|
   */ | 
						|
  return node.next && !isTextLikeNode$1(node.next) && isTextLikeNode$1(node) && node.isTrailingSpaceSensitive && !node.hasTrailingSpaces; | 
						|
} | 
						|
 | 
						|
function needsToBorrowParentOpeningTagEndMarker(node) { | 
						|
  /** | 
						|
   *     <p | 
						|
   *       >123 | 
						|
   *       ^ | 
						|
   * | 
						|
   *     <p | 
						|
   *       ><a | 
						|
   *       ^ | 
						|
   */ | 
						|
  return !node.prev && node.isLeadingSpaceSensitive && !node.hasLeadingSpaces; | 
						|
} | 
						|
 | 
						|
function needsToBorrowPrevClosingTagEndMarker(node) { | 
						|
  /** | 
						|
   *     <p></p | 
						|
   *     >123 | 
						|
   *     ^ | 
						|
   * | 
						|
   *     <p></p | 
						|
   *     ><a | 
						|
   *     ^ | 
						|
   */ | 
						|
  return node.prev && !isTextLikeNode$1(node.prev) && node.isLeadingSpaceSensitive && !node.hasLeadingSpaces; | 
						|
} | 
						|
 | 
						|
function needsToBorrowLastChildClosingTagEndMarker(node) { | 
						|
  /** | 
						|
   *     <p | 
						|
   *       ><a></a | 
						|
   *       ></p | 
						|
   *       ^ | 
						|
   *     > | 
						|
   */ | 
						|
  return node.lastChild && node.lastChild.isTrailingSpaceSensitive && !node.lastChild.hasTrailingSpaces && !isTextLikeNode$1(getLastDescendant$1(node.lastChild)); | 
						|
} | 
						|
 | 
						|
function needsToBorrowParentClosingTagStartMarker(node) { | 
						|
  /** | 
						|
   *     <p> | 
						|
   *       123</p | 
						|
   *          ^^^ | 
						|
   *     > | 
						|
   * | 
						|
   *         123</b | 
						|
   *       ></a | 
						|
   *        ^^^ | 
						|
   *     > | 
						|
   */ | 
						|
  return !node.next && !node.hasTrailingSpaces && node.isTrailingSpaceSensitive && isTextLikeNode$1(getLastDescendant$1(node)); | 
						|
} | 
						|
 | 
						|
function printOpeningTagPrefix(node, options) { | 
						|
  return needsToBorrowParentOpeningTagEndMarker(node) ? printOpeningTagEndMarker(node.parent) : needsToBorrowPrevClosingTagEndMarker(node) ? printClosingTagEndMarker(node.prev, options) : ""; | 
						|
} | 
						|
 | 
						|
function printClosingTagPrefix(node, options) { | 
						|
  return needsToBorrowLastChildClosingTagEndMarker(node) ? printClosingTagEndMarker(node.lastChild, options) : ""; | 
						|
} | 
						|
 | 
						|
function printClosingTagSuffix(node, options) { | 
						|
  return needsToBorrowParentClosingTagStartMarker(node) ? printClosingTagStartMarker(node.parent, options) : needsToBorrowNextOpeningTagStartMarker(node) ? printOpeningTagStartMarker(node.next) : ""; | 
						|
} | 
						|
 | 
						|
function printOpeningTagStartMarker(node) { | 
						|
  switch (node.type) { | 
						|
    case "ieConditionalComment": | 
						|
    case "ieConditionalStartComment": | 
						|
      return `<!--[if ${node.condition}`; | 
						|
 | 
						|
    case "ieConditionalEndComment": | 
						|
      return `<!--<!`; | 
						|
 | 
						|
    case "interpolation": | 
						|
      return "{{"; | 
						|
 | 
						|
    case "docType": | 
						|
      return "<!DOCTYPE"; | 
						|
 | 
						|
    case "element": | 
						|
      if (node.condition) { | 
						|
        return `<!--[if ${node.condition}]><!--><${node.rawName}`; | 
						|
      } | 
						|
 | 
						|
    // fall through | 
						|
 | 
						|
    default: | 
						|
      return `<${node.rawName}`; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function printOpeningTagEndMarker(node) { | 
						|
  assert$1(!node.isSelfClosing); | 
						|
 | 
						|
  switch (node.type) { | 
						|
    case "ieConditionalComment": | 
						|
      return "]>"; | 
						|
 | 
						|
    case "element": | 
						|
      if (node.condition) { | 
						|
        return `><!--<![endif]-->`; | 
						|
      } | 
						|
 | 
						|
    // fall through | 
						|
 | 
						|
    default: | 
						|
      return `>`; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function printClosingTagStartMarker(node, options) { | 
						|
  assert$1(!node.isSelfClosing); | 
						|
 | 
						|
  if (shouldNotPrintClosingTag$1(node, options)) { | 
						|
    return ""; | 
						|
  } | 
						|
 | 
						|
  switch (node.type) { | 
						|
    case "ieConditionalComment": | 
						|
      return "<!"; | 
						|
 | 
						|
    case "element": | 
						|
      if (node.hasHtmComponentClosingTag) { | 
						|
        return "<//"; | 
						|
      } | 
						|
 | 
						|
    // fall through | 
						|
 | 
						|
    default: | 
						|
      return `</${node.rawName}`; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function printClosingTagEndMarker(node, options) { | 
						|
  if (shouldNotPrintClosingTag$1(node, options)) { | 
						|
    return ""; | 
						|
  } | 
						|
 | 
						|
  switch (node.type) { | 
						|
    case "ieConditionalComment": | 
						|
    case "ieConditionalEndComment": | 
						|
      return `[endif]-->`; | 
						|
 | 
						|
    case "ieConditionalStartComment": | 
						|
      return `]><!-->`; | 
						|
 | 
						|
    case "interpolation": | 
						|
      return "}}"; | 
						|
 | 
						|
    case "element": | 
						|
      if (node.isSelfClosing) { | 
						|
        return "/>"; | 
						|
      } | 
						|
 | 
						|
    // fall through | 
						|
 | 
						|
    default: | 
						|
      return ">"; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function getTextValueParts(node) { | 
						|
  var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : node.value; | 
						|
  return node.parent.isWhitespaceSensitive ? node.parent.isIndentationSensitive ? replaceEndOfLineWith$2(value, literalline$6) : replaceEndOfLineWith$2(dedentString$1(value.replace(/^\s*?\n|\n\s*?$/g, "")), hardline$c) : // https://infra.spec.whatwg.org/#ascii-whitespace | 
						|
  join$b(line$8, value.split(/[\t\n\f\r ]+/)).parts; | 
						|
} | 
						|
 | 
						|
function printEmbeddedAttributeValue(node, originalTextToDoc, options) { | 
						|
  var isKeyMatched = function isKeyMatched(patterns) { | 
						|
    return new RegExp(patterns.join("|")).test(node.fullName); | 
						|
  }; | 
						|
 | 
						|
  var getValue = function getValue() { | 
						|
    return unescapeQuoteEntities$1(node.value); | 
						|
  }; | 
						|
 | 
						|
  var shouldHug = false; | 
						|
 | 
						|
  var __onHtmlBindingRoot = function __onHtmlBindingRoot(root) { | 
						|
    var rootNode = root.type === "NGRoot" ? root.node.type === "NGMicrosyntax" && root.node.body.length === 1 && root.node.body[0].type === "NGMicrosyntaxExpression" ? root.node.body[0].expression : root.node : root.type === "JsExpressionRoot" ? root.node : root; | 
						|
 | 
						|
    if (rootNode && (rootNode.type === "ObjectExpression" || rootNode.type === "ArrayExpression")) { | 
						|
      shouldHug = true; | 
						|
    } | 
						|
  }; | 
						|
 | 
						|
  var printHug = function printHug(doc) { | 
						|
    return group$f(doc); | 
						|
  }; | 
						|
 | 
						|
  var printExpand = function printExpand(doc) { | 
						|
    return group$f(concat$g([indent$9(concat$g([softline$7, doc])), softline$7])); | 
						|
  }; | 
						|
 | 
						|
  var printMaybeHug = function printMaybeHug(doc) { | 
						|
    return shouldHug ? printHug(doc) : printExpand(doc); | 
						|
  }; | 
						|
 | 
						|
  var textToDoc = function textToDoc(code, opts) { | 
						|
    return originalTextToDoc(code, Object.assign({ | 
						|
      __onHtmlBindingRoot | 
						|
    }, opts)); | 
						|
  }; | 
						|
 | 
						|
  if (node.fullName === "srcset" && (node.parent.fullName === "img" || node.parent.fullName === "source")) { | 
						|
    return printExpand(printImgSrcset$1(getValue())); | 
						|
  } | 
						|
 | 
						|
  if (options.parser === "vue") { | 
						|
    if (node.fullName === "v-for") { | 
						|
      return printVueFor$1(getValue(), textToDoc); | 
						|
    } | 
						|
 | 
						|
    if (node.fullName === "slot-scope") { | 
						|
      return printVueSlotScope$1(getValue(), textToDoc); | 
						|
    } | 
						|
    /** | 
						|
     *     @click="jsStatement" | 
						|
     *     @click="jsExpression" | 
						|
     *     v-on:click="jsStatement" | 
						|
     *     v-on:click="jsExpression" | 
						|
     */ | 
						|
 | 
						|
 | 
						|
    var vueEventBindingPatterns = ["^@", "^v-on:"]; | 
						|
    /** | 
						|
     *     :class="vueExpression" | 
						|
     *     v-bind:id="vueExpression" | 
						|
     */ | 
						|
 | 
						|
    var vueExpressionBindingPatterns = ["^:", "^v-bind:"]; | 
						|
    /** | 
						|
     *     v-if="jsExpression" | 
						|
     */ | 
						|
 | 
						|
    var jsExpressionBindingPatterns = ["^v-"]; | 
						|
 | 
						|
    if (isKeyMatched(vueEventBindingPatterns)) { | 
						|
      var value = getValue(); | 
						|
      return printMaybeHug(isVueEventBindingExpression$3(value) ? textToDoc(value, { | 
						|
        parser: "__js_expression" | 
						|
      }) : stripTrailingHardline$2(textToDoc(value, { | 
						|
        parser: "__vue_event_binding" | 
						|
      }))); | 
						|
    } | 
						|
 | 
						|
    if (isKeyMatched(vueExpressionBindingPatterns)) { | 
						|
      return printMaybeHug(textToDoc(getValue(), { | 
						|
        parser: "__vue_expression" | 
						|
      })); | 
						|
    } | 
						|
 | 
						|
    if (isKeyMatched(jsExpressionBindingPatterns)) { | 
						|
      return printMaybeHug(textToDoc(getValue(), { | 
						|
        parser: "__js_expression" | 
						|
      })); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  if (options.parser === "angular") { | 
						|
    var ngTextToDoc = function ngTextToDoc(code, opts) { | 
						|
      return (// angular does not allow trailing comma | 
						|
        textToDoc(code, Object.assign({ | 
						|
          trailingComma: "none" | 
						|
        }, opts)) | 
						|
      ); | 
						|
    }; | 
						|
    /** | 
						|
     *     *directive="angularDirective" | 
						|
     */ | 
						|
 | 
						|
 | 
						|
    var ngDirectiveBindingPatterns = ["^\\*"]; | 
						|
    /** | 
						|
     *     (click)="angularStatement" | 
						|
     *     on-click="angularStatement" | 
						|
     */ | 
						|
 | 
						|
    var ngStatementBindingPatterns = ["^\\(.+\\)$", "^on-"]; | 
						|
    /** | 
						|
     *     [target]="angularExpression" | 
						|
     *     bind-target="angularExpression" | 
						|
     *     [(target)]="angularExpression" | 
						|
     *     bindon-target="angularExpression" | 
						|
     */ | 
						|
 | 
						|
    var ngExpressionBindingPatterns = ["^\\[.+\\]$", "^bind(on)?-"]; | 
						|
    /** | 
						|
     *     i18n="longDescription" | 
						|
     *     i18n-attr="longDescription" | 
						|
     */ | 
						|
 | 
						|
    var ngI18nPatterns = ["^i18n(-.+)?$"]; | 
						|
 | 
						|
    if (isKeyMatched(ngStatementBindingPatterns)) { | 
						|
      return printMaybeHug(ngTextToDoc(getValue(), { | 
						|
        parser: "__ng_action" | 
						|
      })); | 
						|
    } | 
						|
 | 
						|
    if (isKeyMatched(ngExpressionBindingPatterns)) { | 
						|
      return printMaybeHug(ngTextToDoc(getValue(), { | 
						|
        parser: "__ng_binding" | 
						|
      })); | 
						|
    } | 
						|
 | 
						|
    if (isKeyMatched(ngI18nPatterns)) { | 
						|
      return printExpand(fill$5(getTextValueParts(node, getValue()))); | 
						|
    } | 
						|
 | 
						|
    if (isKeyMatched(ngDirectiveBindingPatterns)) { | 
						|
      return printMaybeHug(ngTextToDoc(getValue(), { | 
						|
        parser: "__ng_directive" | 
						|
      })); | 
						|
    } | 
						|
 | 
						|
    var interpolationRegex = /\{\{([\s\S]+?)\}\}/g; | 
						|
 | 
						|
    var _value2 = getValue(); | 
						|
 | 
						|
    if (interpolationRegex.test(_value2)) { | 
						|
      var parts = []; | 
						|
 | 
						|
      _value2.split(interpolationRegex).forEach(function (part, index) { | 
						|
        if (index % 2 === 0) { | 
						|
          parts.push(concat$g(replaceEndOfLineWith$2(part, literalline$6))); | 
						|
        } else { | 
						|
          try { | 
						|
            parts.push(group$f(concat$g(["{{", indent$9(concat$g([line$8, ngTextToDoc(part, { | 
						|
              parser: "__ng_interpolation", | 
						|
              __isInHtmlInterpolation: true // to avoid unexpected `}}` | 
						|
 | 
						|
            })])), line$8, "}}"]))); | 
						|
          } catch (e) { | 
						|
            parts.push("{{", concat$g(replaceEndOfLineWith$2(part, literalline$6)), "}}"); | 
						|
          } | 
						|
        } | 
						|
      }); | 
						|
 | 
						|
      return group$f(concat$g(parts)); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return null; | 
						|
} | 
						|
 | 
						|
var printerHtml = { | 
						|
  preprocess: preprocess_1$2, | 
						|
  print: genericPrint$5, | 
						|
  insertPragma: insertPragma$7, | 
						|
  massageAstNode: clean$6, | 
						|
  embed: embed$4 | 
						|
}; | 
						|
 | 
						|
var CATEGORY_HTML = "HTML"; // format based on https://github.com/prettier/prettier/blob/master/src/main/core-options.js | 
						|
 | 
						|
var options$6 = { | 
						|
  htmlWhitespaceSensitivity: { | 
						|
    since: "1.15.0", | 
						|
    category: CATEGORY_HTML, | 
						|
    type: "choice", | 
						|
    default: "css", | 
						|
    description: "How to handle whitespaces in HTML.", | 
						|
    choices: [{ | 
						|
      value: "css", | 
						|
      description: "Respect the default value of CSS display property." | 
						|
    }, { | 
						|
      value: "strict", | 
						|
      description: "Whitespaces are considered sensitive." | 
						|
    }, { | 
						|
      value: "ignore", | 
						|
      description: "Whitespaces are considered insensitive." | 
						|
    }] | 
						|
  }, | 
						|
  vueIndentScriptAndStyle: { | 
						|
    since: "1.19.0", | 
						|
    category: CATEGORY_HTML, | 
						|
    type: "boolean", | 
						|
    default: false, | 
						|
    description: "Indent script and style tags in Vue files." | 
						|
  } | 
						|
}; | 
						|
 | 
						|
var name$g = "HTML"; | 
						|
var type$e = "markup"; | 
						|
var tmScope$e = "text.html.basic"; | 
						|
var aceMode$e = "html"; | 
						|
var codemirrorMode$b = "htmlmixed"; | 
						|
var codemirrorMimeType$b = "text/html"; | 
						|
var color$3 = "#e34c26"; | 
						|
var aliases$5 = [ | 
						|
	"xhtml" | 
						|
]; | 
						|
var extensions$e = [ | 
						|
	".html", | 
						|
	".htm", | 
						|
	".html.hl", | 
						|
	".inc", | 
						|
	".st", | 
						|
	".xht", | 
						|
	".xhtml" | 
						|
]; | 
						|
var languageId$e = 146; | 
						|
var HTML = { | 
						|
	name: name$g, | 
						|
	type: type$e, | 
						|
	tmScope: tmScope$e, | 
						|
	aceMode: aceMode$e, | 
						|
	codemirrorMode: codemirrorMode$b, | 
						|
	codemirrorMimeType: codemirrorMimeType$b, | 
						|
	color: color$3, | 
						|
	aliases: aliases$5, | 
						|
	extensions: extensions$e, | 
						|
	languageId: languageId$e | 
						|
}; | 
						|
 | 
						|
var HTML$1 = /*#__PURE__*/Object.freeze({ | 
						|
  __proto__: null, | 
						|
  name: name$g, | 
						|
  type: type$e, | 
						|
  tmScope: tmScope$e, | 
						|
  aceMode: aceMode$e, | 
						|
  codemirrorMode: codemirrorMode$b, | 
						|
  codemirrorMimeType: codemirrorMimeType$b, | 
						|
  color: color$3, | 
						|
  aliases: aliases$5, | 
						|
  extensions: extensions$e, | 
						|
  languageId: languageId$e, | 
						|
  'default': HTML | 
						|
}); | 
						|
 | 
						|
var name$h = "Vue"; | 
						|
var type$f = "markup"; | 
						|
var color$4 = "#2c3e50"; | 
						|
var extensions$f = [ | 
						|
	".vue" | 
						|
]; | 
						|
var tmScope$f = "text.html.vue"; | 
						|
var aceMode$f = "html"; | 
						|
var languageId$f = 391; | 
						|
var Vue = { | 
						|
	name: name$h, | 
						|
	type: type$f, | 
						|
	color: color$4, | 
						|
	extensions: extensions$f, | 
						|
	tmScope: tmScope$f, | 
						|
	aceMode: aceMode$f, | 
						|
	languageId: languageId$f | 
						|
}; | 
						|
 | 
						|
var Vue$1 = /*#__PURE__*/Object.freeze({ | 
						|
  __proto__: null, | 
						|
  name: name$h, | 
						|
  type: type$f, | 
						|
  color: color$4, | 
						|
  extensions: extensions$f, | 
						|
  tmScope: tmScope$f, | 
						|
  aceMode: aceMode$f, | 
						|
  languageId: languageId$f, | 
						|
  'default': Vue | 
						|
}); | 
						|
 | 
						|
var require$$0$6 = getCjsExportFromNamespace(HTML$1); | 
						|
 | 
						|
var require$$1$2 = getCjsExportFromNamespace(Vue$1); | 
						|
 | 
						|
var languages$5 = [createLanguage(require$$0$6, function (data) { | 
						|
  return Object.assign(data, { | 
						|
    name: "Angular", | 
						|
    since: "1.15.0", | 
						|
    parsers: ["angular"], | 
						|
    vscodeLanguageIds: ["html"], | 
						|
    extensions: [".component.html"], | 
						|
    filenames: [] | 
						|
  }); | 
						|
}), createLanguage(require$$0$6, function (data) { | 
						|
  return Object.assign(data, { | 
						|
    since: "1.15.0", | 
						|
    parsers: ["html"], | 
						|
    vscodeLanguageIds: ["html"], | 
						|
    extensions: data.extensions.concat([".mjml" // MJML is considered XML in Linguist but it should be formatted as HTML | 
						|
    ]) | 
						|
  }); | 
						|
}), createLanguage(require$$0$6, function (data) { | 
						|
  return Object.assign(data, { | 
						|
    name: "Lightning Web Components", | 
						|
    since: "1.17.0", | 
						|
    parsers: ["lwc"], | 
						|
    vscodeLanguageIds: ["html"], | 
						|
    extensions: [], | 
						|
    filenames: [] | 
						|
  }); | 
						|
}), createLanguage(require$$1$2, function (data) { | 
						|
  return Object.assign(data, { | 
						|
    since: "1.10.0", | 
						|
    parsers: ["vue"], | 
						|
    vscodeLanguageIds: ["vue"] | 
						|
  }); | 
						|
})]; | 
						|
var printers$5 = { | 
						|
  html: printerHtml | 
						|
}; | 
						|
var languageHtml = { | 
						|
  languages: languages$5, | 
						|
  printers: printers$5, | 
						|
  options: options$6 | 
						|
}; | 
						|
 | 
						|
function isPragma(text) { | 
						|
  return /^\s*@(prettier|format)\s*$/.test(text); | 
						|
} | 
						|
 | 
						|
function hasPragma$4(text) { | 
						|
  return /^\s*#[^\n\S]*@(prettier|format)\s*?(\n|$)/.test(text); | 
						|
} | 
						|
 | 
						|
function insertPragma$8(text) { | 
						|
  return `# @format\n\n${text}`; | 
						|
} | 
						|
 | 
						|
var pragma$5 = { | 
						|
  isPragma, | 
						|
  hasPragma: hasPragma$4, | 
						|
  insertPragma: insertPragma$8 | 
						|
}; | 
						|
 | 
						|
var getLast$4 = util.getLast; | 
						|
 | 
						|
function getAncestorCount(path, filter) { | 
						|
  var counter = 0; | 
						|
  var pathStackLength = path.stack.length - 1; | 
						|
 | 
						|
  for (var i = 0; i < pathStackLength; i++) { | 
						|
    var value = path.stack[i]; | 
						|
 | 
						|
    if (isNode$1(value) && filter(value)) { | 
						|
      counter++; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return counter; | 
						|
} | 
						|
/** | 
						|
 * @param {any} value | 
						|
 * @param {string[]=} types | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function isNode$1(value, types) { | 
						|
  return value && typeof value.type === "string" && (!types || types.indexOf(value.type) !== -1); | 
						|
} | 
						|
 | 
						|
function mapNode(node, callback, parent) { | 
						|
  return callback("children" in node ? Object.assign({}, node, { | 
						|
    children: node.children.map(function (childNode) { | 
						|
      return mapNode(childNode, callback, node); | 
						|
    }) | 
						|
  }) : node, parent); | 
						|
} | 
						|
 | 
						|
function defineShortcut(x, key, getter) { | 
						|
  Object.defineProperty(x, key, { | 
						|
    get: getter, | 
						|
    enumerable: false | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function isNextLineEmpty$5(node, text) { | 
						|
  var newlineCount = 0; | 
						|
  var textLength = text.length; | 
						|
 | 
						|
  for (var i = node.position.end.offset - 1; i < textLength; i++) { | 
						|
    var char = text[i]; | 
						|
 | 
						|
    if (char === "\n") { | 
						|
      newlineCount++; | 
						|
    } | 
						|
 | 
						|
    if (newlineCount === 1 && /\S/.test(char)) { | 
						|
      return false; | 
						|
    } | 
						|
 | 
						|
    if (newlineCount === 2) { | 
						|
      return true; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return false; | 
						|
} | 
						|
 | 
						|
function isLastDescendantNode(path) { | 
						|
  var node = path.getValue(); | 
						|
 | 
						|
  switch (node.type) { | 
						|
    case "tag": | 
						|
    case "anchor": | 
						|
    case "comment": | 
						|
      return false; | 
						|
  } | 
						|
 | 
						|
  var pathStackLength = path.stack.length; | 
						|
 | 
						|
  for (var i = 1; i < pathStackLength; i++) { | 
						|
    var item = path.stack[i]; | 
						|
    var parentItem = path.stack[i - 1]; | 
						|
 | 
						|
    if (Array.isArray(parentItem) && typeof item === "number" && item !== parentItem.length - 1) { | 
						|
      return false; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return true; | 
						|
} | 
						|
 | 
						|
function getLastDescendantNode$1(node) { | 
						|
  return "children" in node && node.children.length !== 0 ? getLastDescendantNode$1(getLast$4(node.children)) : node; | 
						|
} | 
						|
 | 
						|
function isPrettierIgnore$2(comment) { | 
						|
  return comment.value.trim() === "prettier-ignore"; | 
						|
} | 
						|
 | 
						|
function hasPrettierIgnore$5(path) { | 
						|
  var node = path.getValue(); | 
						|
 | 
						|
  if (node.type === "documentBody") { | 
						|
    var document = path.getParentNode(); | 
						|
    return hasEndComments(document.head) && isPrettierIgnore$2(getLast$4(document.head.endComments)); | 
						|
  } | 
						|
 | 
						|
  return hasLeadingComments(node) && isPrettierIgnore$2(getLast$4(node.leadingComments)); | 
						|
} | 
						|
 | 
						|
function isEmptyNode(node) { | 
						|
  return (!node.children || node.children.length === 0) && !hasComments(node); | 
						|
} | 
						|
 | 
						|
function hasComments(node) { | 
						|
  return hasLeadingComments(node) || hasMiddleComments(node) || hasIndicatorComment(node) || hasTrailingComment$2(node) || hasEndComments(node); | 
						|
} | 
						|
 | 
						|
function hasLeadingComments(node) { | 
						|
  return node && node.leadingComments && node.leadingComments.length !== 0; | 
						|
} | 
						|
 | 
						|
function hasMiddleComments(node) { | 
						|
  return node && node.middleComments && node.middleComments.length !== 0; | 
						|
} | 
						|
 | 
						|
function hasIndicatorComment(node) { | 
						|
  return node && node.indicatorComment; | 
						|
} | 
						|
 | 
						|
function hasTrailingComment$2(node) { | 
						|
  return node && node.trailingComment; | 
						|
} | 
						|
 | 
						|
function hasEndComments(node) { | 
						|
  return node && node.endComments && node.endComments.length !== 0; | 
						|
} | 
						|
/** | 
						|
 * " a   b c   d e   f " -> [" a   b", "c   d", "e   f "] | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function splitWithSingleSpace(text) { | 
						|
  var parts = []; | 
						|
  var lastPart = undefined; | 
						|
  var _iteratorNormalCompletion = true; | 
						|
  var _didIteratorError = false; | 
						|
  var _iteratorError = undefined; | 
						|
 | 
						|
  try { | 
						|
    for (var _iterator = text.split(/( +)/g)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | 
						|
      var part = _step.value; | 
						|
 | 
						|
      if (part !== " ") { | 
						|
        if (lastPart === " ") { | 
						|
          parts.push(part); | 
						|
        } else { | 
						|
          parts.push((parts.pop() || "") + part); | 
						|
        } | 
						|
      } else if (lastPart === undefined) { | 
						|
        parts.unshift(""); | 
						|
      } | 
						|
 | 
						|
      lastPart = part; | 
						|
    } | 
						|
  } catch (err) { | 
						|
    _didIteratorError = true; | 
						|
    _iteratorError = err; | 
						|
  } finally { | 
						|
    try { | 
						|
      if (!_iteratorNormalCompletion && _iterator.return != null) { | 
						|
        _iterator.return(); | 
						|
      } | 
						|
    } finally { | 
						|
      if (_didIteratorError) { | 
						|
        throw _iteratorError; | 
						|
      } | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  if (lastPart === " ") { | 
						|
    parts.push((parts.pop() || "") + " "); | 
						|
  } | 
						|
 | 
						|
  if (parts[0] === "") { | 
						|
    parts.shift(); | 
						|
    parts.unshift(" " + (parts.shift() || "")); | 
						|
  } | 
						|
 | 
						|
  return parts; | 
						|
} | 
						|
 | 
						|
function getFlowScalarLineContents(nodeType, content, options) { | 
						|
  var rawLineContents = content.split("\n").map(function (lineContent, index, lineContents) { | 
						|
    return index === 0 && index === lineContents.length - 1 ? lineContent : index !== 0 && index !== lineContents.length - 1 ? lineContent.trim() : index === 0 ? lineContent.trimRight() : lineContent.trimLeft(); | 
						|
  }); | 
						|
 | 
						|
  if (options.proseWrap === "preserve") { | 
						|
    return rawLineContents.map(function (lineContent) { | 
						|
      return lineContent.length === 0 ? [] : [lineContent]; | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  return rawLineContents.map(function (lineContent) { | 
						|
    return lineContent.length === 0 ? [] : splitWithSingleSpace(lineContent); | 
						|
  }).reduce(function (reduced, lineContentWords, index) { | 
						|
    return index !== 0 && rawLineContents[index - 1].length !== 0 && lineContentWords.length !== 0 && !( // trailing backslash in quoteDouble should be preserved | 
						|
    nodeType === "quoteDouble" && getLast$4(getLast$4(reduced)).endsWith("\\")) ? reduced.concat([reduced.pop().concat(lineContentWords)]) : reduced.concat([lineContentWords]); | 
						|
  }, []).map(function (lineContentWords) { | 
						|
    return options.proseWrap === "never" ? [lineContentWords.join(" ")] : lineContentWords; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
function getBlockValueLineContents(node, _ref) { | 
						|
  var parentIndent = _ref.parentIndent, | 
						|
      isLastDescendant = _ref.isLastDescendant, | 
						|
      options = _ref.options; | 
						|
  var content = node.position.start.line === node.position.end.line ? "" : options.originalText.slice(node.position.start.offset, node.position.end.offset) // exclude open line `>` or `|` | 
						|
  .match(/^[^\n]*?\n([\s\S]*)$/)[1]; | 
						|
  var leadingSpaceCount = node.indent === null ? function (match) { | 
						|
    return match ? match[1].length : Infinity; | 
						|
  }(content.match(/^( *)\S/m)) : node.indent - 1 + parentIndent; | 
						|
  var rawLineContents = content.split("\n").map(function (lineContent) { | 
						|
    return lineContent.slice(leadingSpaceCount); | 
						|
  }); | 
						|
 | 
						|
  if (options.proseWrap === "preserve" || node.type === "blockLiteral") { | 
						|
    return removeUnnecessaryTrailingNewlines(rawLineContents.map(function (lineContent) { | 
						|
      return lineContent.length === 0 ? [] : [lineContent]; | 
						|
    })); | 
						|
  } | 
						|
 | 
						|
  return removeUnnecessaryTrailingNewlines(rawLineContents.map(function (lineContent) { | 
						|
    return lineContent.length === 0 ? [] : splitWithSingleSpace(lineContent); | 
						|
  }).reduce(function (reduced, lineContentWords, index) { | 
						|
    return index !== 0 && rawLineContents[index - 1].length !== 0 && lineContentWords.length !== 0 && !/^\s/.test(lineContentWords[0]) && !/^\s|\s$/.test(getLast$4(reduced)) ? reduced.concat([reduced.pop().concat(lineContentWords)]) : reduced.concat([lineContentWords]); | 
						|
  }, []).map(function (lineContentWords) { | 
						|
    return lineContentWords.reduce(function (reduced, word) { | 
						|
      return (// disallow trailing spaces | 
						|
        reduced.length !== 0 && /\s$/.test(getLast$4(reduced)) ? reduced.concat(reduced.pop() + " " + word) : reduced.concat(word) | 
						|
      ); | 
						|
    }, []); | 
						|
  }).map(function (lineContentWords) { | 
						|
    return options.proseWrap === "never" ? [lineContentWords.join(" ")] : lineContentWords; | 
						|
  })); | 
						|
 | 
						|
  function removeUnnecessaryTrailingNewlines(lineContents) { | 
						|
    if (node.chomping === "keep") { | 
						|
      return getLast$4(lineContents).length === 0 ? lineContents.slice(0, -1) : lineContents; | 
						|
    } | 
						|
 | 
						|
    var trailingNewlineCount = 0; | 
						|
 | 
						|
    for (var i = lineContents.length - 1; i >= 0; i--) { | 
						|
      if (lineContents[i].length === 0) { | 
						|
        trailingNewlineCount++; | 
						|
      } else { | 
						|
        break; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    return trailingNewlineCount === 0 ? lineContents : trailingNewlineCount >= 2 && !isLastDescendant ? // next empty line | 
						|
    lineContents.slice(0, -(trailingNewlineCount - 1)) : lineContents.slice(0, -trailingNewlineCount); | 
						|
  } | 
						|
} | 
						|
 | 
						|
var utils$6 = { | 
						|
  getLast: getLast$4, | 
						|
  getAncestorCount, | 
						|
  isNode: isNode$1, | 
						|
  isEmptyNode, | 
						|
  mapNode, | 
						|
  defineShortcut, | 
						|
  isNextLineEmpty: isNextLineEmpty$5, | 
						|
  isLastDescendantNode, | 
						|
  getBlockValueLineContents, | 
						|
  getFlowScalarLineContents, | 
						|
  getLastDescendantNode: getLastDescendantNode$1, | 
						|
  hasPrettierIgnore: hasPrettierIgnore$5, | 
						|
  hasLeadingComments, | 
						|
  hasMiddleComments, | 
						|
  hasIndicatorComment, | 
						|
  hasTrailingComment: hasTrailingComment$2, | 
						|
  hasEndComments | 
						|
}; | 
						|
 | 
						|
var insertPragma$9 = pragma$5.insertPragma, | 
						|
    isPragma$1 = pragma$5.isPragma; | 
						|
var getAncestorCount$1 = utils$6.getAncestorCount, | 
						|
    getBlockValueLineContents$1 = utils$6.getBlockValueLineContents, | 
						|
    getFlowScalarLineContents$1 = utils$6.getFlowScalarLineContents, | 
						|
    getLast$5 = utils$6.getLast, | 
						|
    getLastDescendantNode$2 = utils$6.getLastDescendantNode, | 
						|
    hasLeadingComments$1 = utils$6.hasLeadingComments, | 
						|
    hasMiddleComments$1 = utils$6.hasMiddleComments, | 
						|
    hasIndicatorComment$1 = utils$6.hasIndicatorComment, | 
						|
    hasTrailingComment$3 = utils$6.hasTrailingComment, | 
						|
    hasEndComments$1 = utils$6.hasEndComments, | 
						|
    hasPrettierIgnore$6 = utils$6.hasPrettierIgnore, | 
						|
    isLastDescendantNode$1 = utils$6.isLastDescendantNode, | 
						|
    isNextLineEmpty$6 = utils$6.isNextLineEmpty, | 
						|
    isNode$2 = utils$6.isNode, | 
						|
    isEmptyNode$1 = utils$6.isEmptyNode, | 
						|
    defineShortcut$1 = utils$6.defineShortcut, | 
						|
    mapNode$1 = utils$6.mapNode; | 
						|
var docBuilders$2 = doc.builders; | 
						|
var conditionalGroup$2 = docBuilders$2.conditionalGroup, | 
						|
    breakParent$5 = docBuilders$2.breakParent, | 
						|
    concat$h = docBuilders$2.concat, | 
						|
    dedent$3 = docBuilders$2.dedent, | 
						|
    dedentToRoot$3 = docBuilders$2.dedentToRoot, | 
						|
    fill$6 = docBuilders$2.fill, | 
						|
    group$g = docBuilders$2.group, | 
						|
    hardline$d = docBuilders$2.hardline, | 
						|
    ifBreak$8 = docBuilders$2.ifBreak, | 
						|
    join$c = docBuilders$2.join, | 
						|
    line$9 = docBuilders$2.line, | 
						|
    lineSuffix$2 = docBuilders$2.lineSuffix, | 
						|
    literalline$7 = docBuilders$2.literalline, | 
						|
    markAsRoot$5 = docBuilders$2.markAsRoot, | 
						|
    softline$8 = docBuilders$2.softline; | 
						|
var replaceEndOfLineWith$3 = util.replaceEndOfLineWith; | 
						|
 | 
						|
function preprocess$3(ast) { | 
						|
  return mapNode$1(ast, defineShortcuts); | 
						|
} | 
						|
 | 
						|
function defineShortcuts(node) { | 
						|
  switch (node.type) { | 
						|
    case "document": | 
						|
      defineShortcut$1(node, "head", function () { | 
						|
        return node.children[0]; | 
						|
      }); | 
						|
      defineShortcut$1(node, "body", function () { | 
						|
        return node.children[1]; | 
						|
      }); | 
						|
      break; | 
						|
 | 
						|
    case "documentBody": | 
						|
    case "sequenceItem": | 
						|
    case "flowSequenceItem": | 
						|
    case "mappingKey": | 
						|
    case "mappingValue": | 
						|
      defineShortcut$1(node, "content", function () { | 
						|
        return node.children[0]; | 
						|
      }); | 
						|
      break; | 
						|
 | 
						|
    case "mappingItem": | 
						|
    case "flowMappingItem": | 
						|
      defineShortcut$1(node, "key", function () { | 
						|
        return node.children[0]; | 
						|
      }); | 
						|
      defineShortcut$1(node, "value", function () { | 
						|
        return node.children[1]; | 
						|
      }); | 
						|
      break; | 
						|
  } | 
						|
 | 
						|
  return node; | 
						|
} | 
						|
 | 
						|
function genericPrint$6(path, options, print) { | 
						|
  var node = path.getValue(); | 
						|
  var parentNode = path.getParentNode(); | 
						|
  var tag = !node.tag ? "" : path.call(print, "tag"); | 
						|
  var anchor = !node.anchor ? "" : path.call(print, "anchor"); | 
						|
  var nextEmptyLine = isNode$2(node, ["mapping", "sequence", "comment", "directive", "mappingItem", "sequenceItem"]) && !isLastDescendantNode$1(path) ? printNextEmptyLine(path, options.originalText) : ""; | 
						|
  return concat$h([node.type !== "mappingValue" && hasLeadingComments$1(node) ? concat$h([join$c(hardline$d, path.map(print, "leadingComments")), hardline$d]) : "", tag, tag && anchor ? " " : "", anchor, tag || anchor ? isNode$2(node, ["sequence", "mapping"]) && !hasMiddleComments$1(node) ? hardline$d : " " : "", hasMiddleComments$1(node) ? concat$h([node.middleComments.length === 1 ? "" : hardline$d, join$c(hardline$d, path.map(print, "middleComments")), hardline$d]) : "", hasPrettierIgnore$6(path) ? concat$h(replaceEndOfLineWith$3(options.originalText.slice(node.position.start.offset, node.position.end.offset), literalline$7)) : group$g(_print(node, parentNode, path, options, print)), hasTrailingComment$3(node) && !isNode$2(node, ["document", "documentHead"]) ? lineSuffix$2(concat$h([node.type === "mappingValue" && !node.content ? "" : " ", parentNode.type === "mappingKey" && path.getParentNode(2).type === "mapping" && isInlineNode$1(node) ? "" : breakParent$5, path.call(print, "trailingComment")])) : "", nextEmptyLine, hasEndComments$1(node) && !isNode$2(node, ["documentHead", "documentBody"]) ? align$3(node.type === "sequenceItem" ? 2 : 0, concat$h([hardline$d, join$c(hardline$d, path.map(print, "endComments"))])) : ""]); | 
						|
} | 
						|
 | 
						|
function _print(node, parentNode, path, options, print) { | 
						|
  switch (node.type) { | 
						|
    case "root": | 
						|
      return concat$h([join$c(hardline$d, path.map(function (childPath, index) { | 
						|
        var document = node.children[index]; | 
						|
        var nextDocument = node.children[index + 1]; | 
						|
        return concat$h([print(childPath), shouldPrintDocumentEndMarker(document, nextDocument) ? concat$h([hardline$d, "...", hasTrailingComment$3(document) ? concat$h([" ", path.call(print, "trailingComment")]) : ""]) : !nextDocument || hasTrailingComment$3(nextDocument.head) ? "" : concat$h([hardline$d, "---"])]); | 
						|
      }, "children")), node.children.length === 0 || function (lastDescendantNode) { | 
						|
        return isNode$2(lastDescendantNode, ["blockLiteral", "blockFolded"]) && lastDescendantNode.chomping === "keep"; | 
						|
      }(getLastDescendantNode$2(node)) ? "" : hardline$d]); | 
						|
 | 
						|
    case "document": | 
						|
      { | 
						|
        var nextDocument = parentNode.children[path.getName() + 1]; | 
						|
        return join$c(hardline$d, [shouldPrintDocumentHeadEndMarker(node, nextDocument, parentNode, options) === "head" ? join$c(hardline$d, [node.head.children.length === 0 && node.head.endComments.length === 0 ? "" : path.call(print, "head"), concat$h(["---", hasTrailingComment$3(node.head) ? concat$h([" ", path.call(print, "head", "trailingComment")]) : ""])].filter(Boolean)) : "", shouldPrintDocumentBody(node) ? path.call(print, "body") : ""].filter(Boolean)); | 
						|
      } | 
						|
 | 
						|
    case "documentHead": | 
						|
      return join$c(hardline$d, [].concat(path.map(print, "children"), path.map(print, "endComments"))); | 
						|
 | 
						|
    case "documentBody": | 
						|
      { | 
						|
        var children = join$c(hardline$d, path.map(print, "children")).parts; | 
						|
        var endComments = join$c(hardline$d, path.map(print, "endComments")).parts; | 
						|
        var separator = children.length === 0 || endComments.length === 0 ? "" : function (lastDescendantNode) { | 
						|
          return isNode$2(lastDescendantNode, ["blockFolded", "blockLiteral"]) ? lastDescendantNode.chomping === "keep" ? // there's already a newline printed at the end of blockValue (chomping=keep, lastDescendant=true) | 
						|
          "" : // an extra newline for better readability | 
						|
          concat$h([hardline$d, hardline$d]) : hardline$d; | 
						|
        }(getLastDescendantNode$2(node)); | 
						|
        return concat$h([].concat(children, separator, endComments)); | 
						|
      } | 
						|
 | 
						|
    case "directive": | 
						|
      return concat$h(["%", join$c(" ", [node.name].concat(node.parameters))]); | 
						|
 | 
						|
    case "comment": | 
						|
      return concat$h(["#", node.value]); | 
						|
 | 
						|
    case "alias": | 
						|
      return concat$h(["*", node.value]); | 
						|
 | 
						|
    case "tag": | 
						|
      return options.originalText.slice(node.position.start.offset, node.position.end.offset); | 
						|
 | 
						|
    case "anchor": | 
						|
      return concat$h(["&", node.value]); | 
						|
 | 
						|
    case "plain": | 
						|
      return printFlowScalarContent(node.type, options.originalText.slice(node.position.start.offset, node.position.end.offset), options); | 
						|
 | 
						|
    case "quoteDouble": | 
						|
    case "quoteSingle": | 
						|
      { | 
						|
        var singleQuote = "'"; | 
						|
        var doubleQuote = '"'; | 
						|
        var raw = options.originalText.slice(node.position.start.offset + 1, node.position.end.offset - 1); | 
						|
 | 
						|
        if (node.type === "quoteSingle" && raw.includes("\\") || node.type === "quoteDouble" && /\\[^"]/.test(raw)) { | 
						|
          // only quoteDouble can use escape chars | 
						|
          // and quoteSingle do not need to escape backslashes | 
						|
          var originalQuote = node.type === "quoteDouble" ? doubleQuote : singleQuote; | 
						|
          return concat$h([originalQuote, printFlowScalarContent(node.type, raw, options), originalQuote]); | 
						|
        } else if (raw.includes(doubleQuote)) { | 
						|
          return concat$h([singleQuote, printFlowScalarContent(node.type, node.type === "quoteDouble" ? raw // double quote needs to be escaped by backslash in quoteDouble | 
						|
          .replace(/\\"/g, doubleQuote).replace(/'/g, singleQuote.repeat(2)) : raw, options), singleQuote]); | 
						|
        } | 
						|
 | 
						|
        if (raw.includes(singleQuote)) { | 
						|
          return concat$h([doubleQuote, printFlowScalarContent(node.type, node.type === "quoteSingle" ? // single quote needs to be escaped by 2 single quotes in quoteSingle | 
						|
          raw.replace(/''/g, singleQuote) : raw, options), doubleQuote]); | 
						|
        } | 
						|
 | 
						|
        var quote = options.singleQuote ? singleQuote : doubleQuote; | 
						|
        return concat$h([quote, printFlowScalarContent(node.type, raw, options), quote]); | 
						|
      } | 
						|
 | 
						|
    case "blockFolded": | 
						|
    case "blockLiteral": | 
						|
      { | 
						|
        var parentIndent = getAncestorCount$1(path, function (ancestorNode) { | 
						|
          return isNode$2(ancestorNode, ["sequence", "mapping"]); | 
						|
        }); | 
						|
        var isLastDescendant = isLastDescendantNode$1(path); | 
						|
        return concat$h([node.type === "blockFolded" ? ">" : "|", node.indent === null ? "" : node.indent.toString(), node.chomping === "clip" ? "" : node.chomping === "keep" ? "+" : "-", hasIndicatorComment$1(node) ? concat$h([" ", path.call(print, "indicatorComment")]) : "", (node.indent === null ? dedent$3 : dedentToRoot$3)(align$3(node.indent === null ? options.tabWidth : node.indent - 1 + parentIndent, concat$h(getBlockValueLineContents$1(node, { | 
						|
          parentIndent, | 
						|
          isLastDescendant, | 
						|
          options | 
						|
        }).reduce(function (reduced, lineWords, index, lineContents) { | 
						|
          return reduced.concat(index === 0 ? hardline$d : "", fill$6(join$c(line$9, lineWords).parts), index !== lineContents.length - 1 ? lineWords.length === 0 ? hardline$d : markAsRoot$5(literalline$7) : node.chomping === "keep" && isLastDescendant ? lineWords.length === 0 ? dedentToRoot$3(hardline$d) : dedentToRoot$3(literalline$7) : ""); | 
						|
        }, []))))]); | 
						|
      } | 
						|
 | 
						|
    case "sequence": | 
						|
      return join$c(hardline$d, path.map(print, "children")); | 
						|
 | 
						|
    case "sequenceItem": | 
						|
      return concat$h(["- ", align$3(2, !node.content ? "" : path.call(print, "content"))]); | 
						|
 | 
						|
    case "mappingKey": | 
						|
      return !node.content ? "" : path.call(print, "content"); | 
						|
 | 
						|
    case "mappingValue": | 
						|
      return !node.content ? "" : path.call(print, "content"); | 
						|
 | 
						|
    case "mapping": | 
						|
      return join$c(hardline$d, path.map(print, "children")); | 
						|
 | 
						|
    case "mappingItem": | 
						|
    case "flowMappingItem": | 
						|
      { | 
						|
        var isEmptyMappingKey = isEmptyNode$1(node.key); | 
						|
        var isEmptyMappingValue = isEmptyNode$1(node.value); | 
						|
 | 
						|
        if (isEmptyMappingKey && isEmptyMappingValue) { | 
						|
          return concat$h([": "]); | 
						|
        } | 
						|
 | 
						|
        var key = path.call(print, "key"); | 
						|
        var value = path.call(print, "value"); | 
						|
 | 
						|
        if (isEmptyMappingValue) { | 
						|
          return node.type === "flowMappingItem" && parentNode.type === "flowMapping" ? key : node.type === "mappingItem" && isAbsolutelyPrintedAsSingleLineNode(node.key.content, options) && !hasTrailingComment$3(node.key.content) && (!parentNode.tag || parentNode.tag.value !== "tag:yaml.org,2002:set") ? concat$h([key, needsSpaceInFrontOfMappingValue(node) ? " " : "", ":"]) : concat$h(["? ", align$3(2, key)]); | 
						|
        } | 
						|
 | 
						|
        if (isEmptyMappingKey) { | 
						|
          return concat$h([": ", align$3(2, value)]); | 
						|
        } | 
						|
 | 
						|
        var groupId = Symbol("mappingKey"); | 
						|
        var forceExplicitKey = hasLeadingComments$1(node.value) || !isInlineNode$1(node.key.content); | 
						|
        return forceExplicitKey ? concat$h(["? ", align$3(2, key), hardline$d, join$c("", path.map(print, "value", "leadingComments").map(function (comment) { | 
						|
          return concat$h([comment, hardline$d]); | 
						|
        })), ": ", align$3(2, value)]) : // force singleline | 
						|
        isSingleLineNode(node.key.content) && !hasLeadingComments$1(node.key.content) && !hasMiddleComments$1(node.key.content) && !hasTrailingComment$3(node.key.content) && !hasEndComments$1(node.key) && !hasLeadingComments$1(node.value.content) && !hasMiddleComments$1(node.value.content) && !hasEndComments$1(node.value) && isAbsolutelyPrintedAsSingleLineNode(node.value.content, options) ? concat$h([key, needsSpaceInFrontOfMappingValue(node) ? " " : "", ": ", value]) : conditionalGroup$2([concat$h([group$g(concat$h([ifBreak$8("? "), group$g(align$3(2, key), { | 
						|
          id: groupId | 
						|
        })])), ifBreak$8(concat$h([hardline$d, ": ", align$3(2, value)]), indent(concat$h([needsSpaceInFrontOfMappingValue(node) ? " " : "", ":", hasLeadingComments$1(node.value.content) || hasEndComments$1(node.value) && node.value.content && !isNode$2(node.value.content, ["mapping", "sequence"]) || parentNode.type === "mapping" && hasTrailingComment$3(node.key.content) && isInlineNode$1(node.value.content) || isNode$2(node.value.content, ["mapping", "sequence"]) && node.value.content.tag === null && node.value.content.anchor === null ? hardline$d : !node.value.content ? "" : line$9, value])), { | 
						|
          groupId | 
						|
        })])]); | 
						|
      } | 
						|
 | 
						|
    case "flowMapping": | 
						|
    case "flowSequence": | 
						|
      { | 
						|
        var openMarker = node.type === "flowMapping" ? "{" : "["; | 
						|
        var closeMarker = node.type === "flowMapping" ? "}" : "]"; | 
						|
        var bracketSpacing = node.type === "flowMapping" && node.children.length !== 0 && options.bracketSpacing ? line$9 : softline$8; | 
						|
 | 
						|
        var isLastItemEmptyMappingItem = node.children.length !== 0 && function (lastItem) { | 
						|
          return lastItem.type === "flowMappingItem" && isEmptyNode$1(lastItem.key) && isEmptyNode$1(lastItem.value); | 
						|
        }(getLast$5(node.children)); | 
						|
 | 
						|
        return concat$h([openMarker, indent(concat$h([bracketSpacing, concat$h(path.map(function (childPath, index) { | 
						|
          return concat$h([print(childPath), index === node.children.length - 1 ? "" : concat$h([",", line$9, node.children[index].position.start.line !== node.children[index + 1].position.start.line ? printNextEmptyLine(childPath, options.originalText) : ""])]); | 
						|
        }, "children")), ifBreak$8(",", "")])), isLastItemEmptyMappingItem ? "" : bracketSpacing, closeMarker]); | 
						|
      } | 
						|
 | 
						|
    case "flowSequenceItem": | 
						|
      return path.call(print, "content"); | 
						|
    // istanbul ignore next | 
						|
 | 
						|
    default: | 
						|
      throw new Error(`Unexpected node type ${node.type}`); | 
						|
  } | 
						|
 | 
						|
  function indent(doc) { | 
						|
    return docBuilders$2.align(" ".repeat(options.tabWidth), doc); | 
						|
  } | 
						|
} | 
						|
 | 
						|
function align$3(n, doc) { | 
						|
  return typeof n === "number" && n > 0 ? docBuilders$2.align(" ".repeat(n), doc) : docBuilders$2.align(n, doc); | 
						|
} | 
						|
 | 
						|
function isInlineNode$1(node) { | 
						|
  if (!node) { | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  switch (node.type) { | 
						|
    case "plain": | 
						|
    case "quoteDouble": | 
						|
    case "quoteSingle": | 
						|
    case "alias": | 
						|
    case "flowMapping": | 
						|
    case "flowSequence": | 
						|
      return true; | 
						|
 | 
						|
    default: | 
						|
      return false; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function isSingleLineNode(node) { | 
						|
  if (!node) { | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  switch (node.type) { | 
						|
    case "plain": | 
						|
    case "quoteDouble": | 
						|
    case "quoteSingle": | 
						|
      return node.position.start.line === node.position.end.line; | 
						|
 | 
						|
    case "alias": | 
						|
      return true; | 
						|
 | 
						|
    default: | 
						|
      return false; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function shouldPrintDocumentBody(document) { | 
						|
  return document.body.children.length !== 0 || hasEndComments$1(document.body); | 
						|
} | 
						|
 | 
						|
function shouldPrintDocumentEndMarker(document, nextDocument) { | 
						|
  return ( | 
						|
    /** | 
						|
     *... # trailingComment | 
						|
     */ | 
						|
    hasTrailingComment$3(document) || nextDocument && ( | 
						|
    /** | 
						|
     * ... | 
						|
     * %DIRECTIVE | 
						|
     * --- | 
						|
     */ | 
						|
    nextDocument.head.children.length !== 0 || | 
						|
    /** | 
						|
     * ... | 
						|
     * # endComment | 
						|
     * --- | 
						|
     */ | 
						|
    hasEndComments$1(nextDocument.head)) | 
						|
  ); | 
						|
} | 
						|
 | 
						|
function shouldPrintDocumentHeadEndMarker(document, nextDocument, root, options) { | 
						|
  if ( | 
						|
  /** | 
						|
   * --- | 
						|
   * preserve the first document head end marker | 
						|
   */ | 
						|
  root.children[0] === document && /---(\s|$)/.test(options.originalText.slice(options.locStart(document), options.locStart(document) + 4)) || | 
						|
  /** | 
						|
   * %DIRECTIVE | 
						|
   * --- | 
						|
   */ | 
						|
  document.head.children.length !== 0 || | 
						|
  /** | 
						|
   * # end comment | 
						|
   * --- | 
						|
   */ | 
						|
  hasEndComments$1(document.head) || | 
						|
  /** | 
						|
   * --- # trailing comment | 
						|
   */ | 
						|
  hasTrailingComment$3(document.head)) { | 
						|
    return "head"; | 
						|
  } | 
						|
 | 
						|
  if (shouldPrintDocumentEndMarker(document, nextDocument)) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  return nextDocument ? "root" : false; | 
						|
} | 
						|
 | 
						|
function isAbsolutelyPrintedAsSingleLineNode(node, options) { | 
						|
  if (!node) { | 
						|
    return true; | 
						|
  } | 
						|
 | 
						|
  switch (node.type) { | 
						|
    case "plain": | 
						|
    case "quoteSingle": | 
						|
    case "quoteDouble": | 
						|
      break; | 
						|
 | 
						|
    case "alias": | 
						|
      return true; | 
						|
 | 
						|
    default: | 
						|
      return false; | 
						|
  } | 
						|
 | 
						|
  if (options.proseWrap === "preserve") { | 
						|
    return node.position.start.line === node.position.end.line; | 
						|
  } | 
						|
 | 
						|
  if ( // backslash-newline | 
						|
  /\\$/m.test(options.originalText.slice(node.position.start.offset, node.position.end.offset))) { | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  switch (options.proseWrap) { | 
						|
    case "never": | 
						|
      return node.value.indexOf("\n") === -1; | 
						|
 | 
						|
    case "always": | 
						|
      return !/[\n ]/.test(node.value); | 
						|
    // istanbul ignore next | 
						|
 | 
						|
    default: | 
						|
      return false; | 
						|
  } | 
						|
} | 
						|
 | 
						|
function needsSpaceInFrontOfMappingValue(node) { | 
						|
  return node.key.content && node.key.content.type === "alias"; | 
						|
} | 
						|
 | 
						|
function printNextEmptyLine(path, originalText) { | 
						|
  var node = path.getValue(); | 
						|
  var root = path.stack[0]; | 
						|
  root.isNextEmptyLinePrintedChecklist = root.isNextEmptyLinePrintedChecklist || []; | 
						|
 | 
						|
  if (!root.isNextEmptyLinePrintedChecklist[node.position.end.line]) { | 
						|
    if (isNextLineEmpty$6(node, originalText)) { | 
						|
      root.isNextEmptyLinePrintedChecklist[node.position.end.line] = true; | 
						|
      return softline$8; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  return ""; | 
						|
} | 
						|
 | 
						|
function printFlowScalarContent(nodeType, content, options) { | 
						|
  var lineContents = getFlowScalarLineContents$1(nodeType, content, options); | 
						|
  return join$c(hardline$d, lineContents.map(function (lineContentWords) { | 
						|
    return fill$6(join$c(line$9, lineContentWords).parts); | 
						|
  })); | 
						|
} | 
						|
 | 
						|
function clean$7(node, newNode | 
						|
/*, parent */ | 
						|
) { | 
						|
  if (isNode$2(newNode)) { | 
						|
    delete newNode.position; | 
						|
 | 
						|
    switch (newNode.type) { | 
						|
      case "comment": | 
						|
        // insert pragma | 
						|
        if (isPragma$1(newNode.value)) { | 
						|
          return null; | 
						|
        } | 
						|
 | 
						|
        break; | 
						|
 | 
						|
      case "quoteDouble": | 
						|
      case "quoteSingle": | 
						|
        newNode.type = "quote"; | 
						|
        break; | 
						|
    } | 
						|
  } | 
						|
} | 
						|
 | 
						|
var printerYaml = { | 
						|
  preprocess: preprocess$3, | 
						|
  print: genericPrint$6, | 
						|
  massageAstNode: clean$7, | 
						|
  insertPragma: insertPragma$9 | 
						|
}; | 
						|
 | 
						|
var options$7 = { | 
						|
  bracketSpacing: commonOptions.bracketSpacing, | 
						|
  singleQuote: commonOptions.singleQuote, | 
						|
  proseWrap: commonOptions.proseWrap | 
						|
}; | 
						|
 | 
						|
var name$i = "YAML"; | 
						|
var type$g = "data"; | 
						|
var tmScope$g = "source.yaml"; | 
						|
var aliases$6 = [ | 
						|
	"yml" | 
						|
]; | 
						|
var extensions$g = [ | 
						|
	".yml", | 
						|
	".mir", | 
						|
	".reek", | 
						|
	".rviz", | 
						|
	".sublime-syntax", | 
						|
	".syntax", | 
						|
	".yaml", | 
						|
	".yaml-tmlanguage", | 
						|
	".yml.mysql" | 
						|
]; | 
						|
var filenames$4 = [ | 
						|
	".clang-format", | 
						|
	".clang-tidy", | 
						|
	".gemrc", | 
						|
	"glide.lock" | 
						|
]; | 
						|
var aceMode$g = "yaml"; | 
						|
var codemirrorMode$c = "yaml"; | 
						|
var codemirrorMimeType$c = "text/x-yaml"; | 
						|
var languageId$g = 407; | 
						|
var YAML = { | 
						|
	name: name$i, | 
						|
	type: type$g, | 
						|
	tmScope: tmScope$g, | 
						|
	aliases: aliases$6, | 
						|
	extensions: extensions$g, | 
						|
	filenames: filenames$4, | 
						|
	aceMode: aceMode$g, | 
						|
	codemirrorMode: codemirrorMode$c, | 
						|
	codemirrorMimeType: codemirrorMimeType$c, | 
						|
	languageId: languageId$g | 
						|
}; | 
						|
 | 
						|
var YAML$1 = /*#__PURE__*/Object.freeze({ | 
						|
  __proto__: null, | 
						|
  name: name$i, | 
						|
  type: type$g, | 
						|
  tmScope: tmScope$g, | 
						|
  aliases: aliases$6, | 
						|
  extensions: extensions$g, | 
						|
  filenames: filenames$4, | 
						|
  aceMode: aceMode$g, | 
						|
  codemirrorMode: codemirrorMode$c, | 
						|
  codemirrorMimeType: codemirrorMimeType$c, | 
						|
  languageId: languageId$g, | 
						|
  'default': YAML | 
						|
}); | 
						|
 | 
						|
var require$$0$7 = getCjsExportFromNamespace(YAML$1); | 
						|
 | 
						|
var languages$6 = [createLanguage(require$$0$7, function (data) { | 
						|
  return Object.assign(data, { | 
						|
    since: "1.14.0", | 
						|
    parsers: ["yaml"], | 
						|
    vscodeLanguageIds: ["yaml"] | 
						|
  }); | 
						|
})]; | 
						|
var languageYaml = { | 
						|
  languages: languages$6, | 
						|
  printers: { | 
						|
    yaml: printerYaml | 
						|
  }, | 
						|
  options: options$7 | 
						|
}; | 
						|
 | 
						|
// plugin will look for `eval("require")()` and transform to `require()` in the bundle, | 
						|
// and rewrite the paths to require from the top-level. | 
						|
// We need to list the parsers and getters so we can load them only when necessary. | 
						|
 | 
						|
 | 
						|
var internalPlugins = [// JS | 
						|
languageJs, { | 
						|
  parsers: { | 
						|
    // JS - Babel | 
						|
    get babel() { | 
						|
      return require("./parser-babylon").parsers.babel; | 
						|
    }, | 
						|
 | 
						|
    get "babel-flow"() { | 
						|
      return require("./parser-babylon").parsers["babel-flow"]; | 
						|
    }, | 
						|
 | 
						|
    get babylon() { | 
						|
      return require("./parser-babylon").parsers.babel; | 
						|
    }, | 
						|
 | 
						|
    get json() { | 
						|
      return require("./parser-babylon").parsers.json; | 
						|
    }, | 
						|
 | 
						|
    get json5() { | 
						|
      return require("./parser-babylon").parsers.json5; | 
						|
    }, | 
						|
 | 
						|
    get "json-stringify"() { | 
						|
      return require("./parser-babylon").parsers["json-stringify"]; | 
						|
    }, | 
						|
 | 
						|
    get __js_expression() { | 
						|
      return require("./parser-babylon").parsers.__js_expression; | 
						|
    }, | 
						|
 | 
						|
    get __vue_expression() { | 
						|
      return require("./parser-babylon").parsers.__vue_expression; | 
						|
    }, | 
						|
 | 
						|
    get __vue_event_binding() { | 
						|
      return require("./parser-babylon").parsers.__vue_event_binding; | 
						|
    }, | 
						|
 | 
						|
    // JS - Flow | 
						|
    get flow() { | 
						|
      return require("./parser-flow").parsers.flow; | 
						|
    }, | 
						|
 | 
						|
    // JS - TypeScript | 
						|
    get typescript() { | 
						|
      return require("./parser-typescript").parsers.typescript; | 
						|
    }, | 
						|
 | 
						|
    /** | 
						|
     * TODO: Remove this old alias in a major version | 
						|
     */ | 
						|
    get "typescript-eslint"() { | 
						|
      return require("./parser-typescript").parsers.typescript; | 
						|
    }, | 
						|
 | 
						|
    // JS - Angular Action | 
						|
    get __ng_action() { | 
						|
      return require("./parser-angular").parsers.__ng_action; | 
						|
    }, | 
						|
 | 
						|
    // JS - Angular Binding | 
						|
    get __ng_binding() { | 
						|
      return require("./parser-angular").parsers.__ng_binding; | 
						|
    }, | 
						|
 | 
						|
    // JS - Angular Interpolation | 
						|
    get __ng_interpolation() { | 
						|
      return require("./parser-angular").parsers.__ng_interpolation; | 
						|
    }, | 
						|
 | 
						|
    // JS - Angular Directive | 
						|
    get __ng_directive() { | 
						|
      return require("./parser-angular").parsers.__ng_directive; | 
						|
    } | 
						|
 | 
						|
  } | 
						|
}, // CSS | 
						|
languageCss, { | 
						|
  parsers: { | 
						|
    // TODO: switch these to just `postcss` and use `language` instead. | 
						|
    get css() { | 
						|
      return require("./parser-postcss").parsers.css; | 
						|
    }, | 
						|
 | 
						|
    get less() { | 
						|
      return require("./parser-postcss").parsers.css; | 
						|
    }, | 
						|
 | 
						|
    get scss() { | 
						|
      return require("./parser-postcss").parsers.css; | 
						|
    } | 
						|
 | 
						|
  } | 
						|
}, // Handlebars | 
						|
languageHandlebars, { | 
						|
  parsers: { | 
						|
    get glimmer() { | 
						|
      return require("./parser-glimmer").parsers.glimmer; | 
						|
    } | 
						|
 | 
						|
  } | 
						|
}, // GraphQL | 
						|
languageGraphql, { | 
						|
  parsers: { | 
						|
    get graphql() { | 
						|
      return require("./parser-graphql").parsers.graphql; | 
						|
    } | 
						|
 | 
						|
  } | 
						|
}, // Markdown | 
						|
languageMarkdown, { | 
						|
  parsers: { | 
						|
    get remark() { | 
						|
      return require("./parser-markdown").parsers.remark; | 
						|
    }, | 
						|
 | 
						|
    // TODO: Delete this in 2.0 | 
						|
    get markdown() { | 
						|
      return require("./parser-markdown").parsers.remark; | 
						|
    }, | 
						|
 | 
						|
    get mdx() { | 
						|
      return require("./parser-markdown").parsers.mdx; | 
						|
    } | 
						|
 | 
						|
  } | 
						|
}, languageHtml, { | 
						|
  parsers: { | 
						|
    // HTML | 
						|
    get html() { | 
						|
      return require("./parser-html").parsers.html; | 
						|
    }, | 
						|
 | 
						|
    // Vue | 
						|
    get vue() { | 
						|
      return require("./parser-html").parsers.vue; | 
						|
    }, | 
						|
 | 
						|
    // Angular | 
						|
    get angular() { | 
						|
      return require("./parser-html").parsers.angular; | 
						|
    }, | 
						|
 | 
						|
    // Lightning Web Components | 
						|
    get lwc() { | 
						|
      return require("./parser-html").parsers.lwc; | 
						|
    } | 
						|
 | 
						|
  } | 
						|
}, // YAML | 
						|
languageYaml, { | 
						|
  parsers: { | 
						|
    get yaml() { | 
						|
      return require("./parser-yaml").parsers.yaml; | 
						|
    } | 
						|
 | 
						|
  } | 
						|
}]; | 
						|
 | 
						|
var partition = function partition(array, fn) { | 
						|
  var a = []; | 
						|
  var b = []; | 
						|
  array.forEach(function (item) { | 
						|
    if (fn(item)) { | 
						|
      a.push(item); | 
						|
    } else { | 
						|
      b.push(item); | 
						|
    } | 
						|
  }); | 
						|
  return [a, b]; | 
						|
}; | 
						|
 | 
						|
function loadPlugins(plugins, pluginSearchDirs) { | 
						|
  if (!plugins) { | 
						|
    plugins = []; | 
						|
  } | 
						|
 | 
						|
  if (!pluginSearchDirs) { | 
						|
    pluginSearchDirs = []; | 
						|
  } // unless pluginSearchDirs are provided, auto-load plugins from node_modules that are parent to Prettier | 
						|
 | 
						|
 | 
						|
  if (!pluginSearchDirs.length) { | 
						|
    var autoLoadDir = thirdParty.findParentDir(__dirname, "node_modules"); | 
						|
 | 
						|
    if (autoLoadDir) { | 
						|
      pluginSearchDirs = [autoLoadDir]; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  var _partition = partition(plugins, function (plugin) { | 
						|
    return typeof plugin === "string"; | 
						|
  }), | 
						|
      _partition2 = _slicedToArray(_partition, 2), | 
						|
      externalPluginNames = _partition2[0], | 
						|
      externalPluginInstances = _partition2[1]; | 
						|
 | 
						|
  var externalManualLoadPluginInfos = externalPluginNames.map(function (pluginName) { | 
						|
    var requirePath; | 
						|
 | 
						|
    try { | 
						|
      // try local files | 
						|
      requirePath = resolve.sync(path$2.resolve(process.cwd(), pluginName)); | 
						|
    } catch (e) { | 
						|
      // try node modules | 
						|
      requirePath = resolve.sync(pluginName, { | 
						|
        basedir: process.cwd() | 
						|
      }); | 
						|
    } | 
						|
 | 
						|
    return { | 
						|
      name: pluginName, | 
						|
      requirePath | 
						|
    }; | 
						|
  }); | 
						|
  var externalAutoLoadPluginInfos = pluginSearchDirs.map(function (pluginSearchDir) { | 
						|
    var resolvedPluginSearchDir = path$2.resolve(process.cwd(), pluginSearchDir); | 
						|
    var nodeModulesDir = path$2.resolve(resolvedPluginSearchDir, "node_modules"); // In some fringe cases (ex: files "mounted" as virtual directories), the | 
						|
    // isDirectory(resolvedPluginSearchDir) check might be false even though | 
						|
    // the node_modules actually exists. | 
						|
 | 
						|
    if (!isDirectory(nodeModulesDir) && !isDirectory(resolvedPluginSearchDir)) { | 
						|
      throw new Error(`${pluginSearchDir} does not exist or is not a directory`); | 
						|
    } | 
						|
 | 
						|
    return findPluginsInNodeModules(nodeModulesDir).map(function (pluginName) { | 
						|
      return { | 
						|
        name: pluginName, | 
						|
        requirePath: resolve.sync(pluginName, { | 
						|
          basedir: resolvedPluginSearchDir | 
						|
        }) | 
						|
      }; | 
						|
    }); | 
						|
  }).reduce(function (a, b) { | 
						|
    return a.concat(b); | 
						|
  }, []); | 
						|
  var externalPlugins = lodash_uniqby(externalManualLoadPluginInfos.concat(externalAutoLoadPluginInfos), "requirePath").map(function (externalPluginInfo) { | 
						|
    return Object.assign({ | 
						|
      name: externalPluginInfo.name | 
						|
    }, require(externalPluginInfo.requirePath)); | 
						|
  }).concat(externalPluginInstances); | 
						|
  return internalPlugins.concat(externalPlugins); | 
						|
} | 
						|
 | 
						|
function findPluginsInNodeModules(nodeModulesDir) { | 
						|
  var pluginPackageJsonPaths = globby.sync(["prettier-plugin-*/package.json", "@*/prettier-plugin-*/package.json", "@prettier/plugin-*/package.json"], { | 
						|
    cwd: nodeModulesDir | 
						|
  }); | 
						|
  return pluginPackageJsonPaths.map(path$2.dirname); | 
						|
} | 
						|
 | 
						|
function isDirectory(dir) { | 
						|
  try { | 
						|
    return fs$1.statSync(dir).isDirectory(); | 
						|
  } catch (e) { | 
						|
    return false; | 
						|
  } | 
						|
} | 
						|
 | 
						|
var loadPlugins_1 = loadPlugins; | 
						|
 | 
						|
var version$3 = require$$0.version; | 
						|
var getSupportInfo$2 = support.getSupportInfo; // Luckily `opts` is always the 2nd argument | 
						|
 | 
						|
function _withPlugins(fn) { | 
						|
  return function () { | 
						|
    var args = Array.from(arguments); | 
						|
    var opts = args[1] || {}; | 
						|
    args[1] = Object.assign({}, opts, { | 
						|
      plugins: loadPlugins_1(opts.plugins, opts.pluginSearchDirs) | 
						|
    }); | 
						|
    return fn.apply(null, args); | 
						|
  }; | 
						|
} | 
						|
 | 
						|
function withPlugins(fn) { | 
						|
  var resultingFn = _withPlugins(fn); | 
						|
 | 
						|
  if (fn.sync) { | 
						|
    resultingFn.sync = _withPlugins(fn.sync); | 
						|
  } | 
						|
 | 
						|
  return resultingFn; | 
						|
} | 
						|
 | 
						|
var formatWithCursor = withPlugins(core.formatWithCursor); | 
						|
var src$1 = { | 
						|
  formatWithCursor, | 
						|
 | 
						|
  format(text, opts) { | 
						|
    return formatWithCursor(text, opts).formatted; | 
						|
  }, | 
						|
 | 
						|
  check: function check(text, opts) { | 
						|
    var formatted = formatWithCursor(text, opts).formatted; | 
						|
    return formatted === text; | 
						|
  }, | 
						|
  doc, | 
						|
  resolveConfig: resolveConfig_1.resolveConfig, | 
						|
  resolveConfigFile: resolveConfig_1.resolveConfigFile, | 
						|
  clearConfigCache: resolveConfig_1.clearCache, | 
						|
  getFileInfo: withPlugins(getFileInfo_1), | 
						|
  getSupportInfo: withPlugins(getSupportInfo$2), | 
						|
  version: version$3, | 
						|
  util: utilShared, | 
						|
 | 
						|
  /* istanbul ignore next */ | 
						|
  __debug: { | 
						|
    parse: withPlugins(core.parse), | 
						|
    formatAST: withPlugins(core.formatAST), | 
						|
    formatDoc: withPlugins(core.formatDoc), | 
						|
    printToDoc: withPlugins(core.printToDoc), | 
						|
    printDocToString: withPlugins(core.printDocToString) | 
						|
  } | 
						|
}; | 
						|
 | 
						|
var prettier = src$1; | 
						|
 | 
						|
module.exports = prettier;
 |